2 * Copyright 2012 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.tizenopensource.org/license
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include "MsgCppTypes.h"
19 #include "MsgException.h"
20 #include "MsgGconfWrapper.h"
21 #include "SmsPluginParamCodec.h"
22 #include "SmsPluginUDCodec.h"
23 #include "SmsPluginSetting.h"
24 #include "SmsPluginTransport.h"
25 #include "SmsPluginCallback.h"
26 #include "SmsPluginEventHandler.h"
27 #include "SmsPluginSatHandler.h"
31 #include <tapi_common.h>
33 #include <TapiUtility.h>
34 #include <ITapiNetText.h>
38 extern struct tapi_handle *pTapiHandle;
39 /*==================================================================================================
40 IMPLEMENTATION OF SmsPluginCbMsgHandler - Member Functions
41 ==================================================================================================*/
42 SmsPluginSatHandler* SmsPluginSatHandler::pInstance = NULL;
45 SmsPluginSatHandler::SmsPluginSatHandler()
56 SmsPluginSatHandler::~SmsPluginSatHandler()
62 SmsPluginSatHandler* SmsPluginSatHandler::instance()
65 pInstance = new SmsPluginSatHandler();
71 void SmsPluginSatHandler::refreshSms(void *pData)
74 TelSatRefreshInd_t* pRefreshData = (TelSatRefreshInd_t*)pData;
76 if (pRefreshData->appType != TAPI_SAT_REFRESH_MSG)
78 MSG_DEBUG("App Type is wrong. [%d]", pRefreshData->appType);
82 commandId = pRefreshData->commandId;
84 switch (pRefreshData->refreshMode)
86 case TAPI_SAT_REFRESH_SIM_INIT_AND_FULL_FCN :
87 case TAPI_SAT_REFRESH_SIM_INIT_AND_FCN :
89 for (int i = 0; i < pRefreshData->fileCount; i++)
91 if ((SMS_SIM_EFILE_NAME_T)pRefreshData->fileId[i].FileName == SMS_SIM_EFILE_USIM_SMSP ||
92 (SMS_SIM_EFILE_NAME_T)pRefreshData->fileId[i].FileName == SMS_SIM_EFILE_SMSP)
96 else if ((SMS_SIM_EFILE_NAME_T)pRefreshData->fileId[i].FileName == SMS_SIM_EFILE_USIM_CBMI ||
97 (SMS_SIM_EFILE_NAME_T)pRefreshData->fileId[i].FileName == SMS_SIM_EFILE_CBMI)
107 case TAPI_SAT_REFRESH_FCN :
109 for (int i = 0; i < pRefreshData->fileCount; i++)
111 if ((SMS_SIM_EFILE_NAME_T)pRefreshData->fileId[i].FileName == SMS_SIM_EFILE_USIM_SMSP ||
112 (SMS_SIM_EFILE_NAME_T)pRefreshData->fileId[i].FileName == SMS_SIM_EFILE_SMSP)
116 else if ((SMS_SIM_EFILE_NAME_T)pRefreshData->fileId[i].FileName == SMS_SIM_EFILE_USIM_CBMI ||
117 (SMS_SIM_EFILE_NAME_T)pRefreshData->fileId[i].FileName == SMS_SIM_EFILE_CBMI)
125 case TAPI_SAT_REFRESH_SIM_INIT :
138 void SmsPluginSatHandler::sendSms(void *pData)
140 TelSatSendSmsIndSmsData_t* pSmsData = (TelSatSendSmsIndSmsData_t*)pData;
144 commandId = pSmsData->commandId;
146 MSG_DEBUG("commandId [%d]", commandId);
148 // The TPDU Maximum Length at SAT side is 175
149 // This is because Sat can send 160 bytes unpacked and header
150 unsigned char tpdu[MAX_SAT_TPDU_LEN+1];
153 memset(tpdu, 0x00, sizeof(tpdu));
154 memcpy(tpdu, pSmsData->smsTpdu.data, pSmsData->smsTpdu.dataLen);
156 // Modify Parameters, Pack User Data
157 tpduLen = handleSatTpdu(tpdu, pSmsData->smsTpdu.dataLen, pSmsData->bIsPackingRequired);
159 if (tpduLen <= 0 || tpduLen > MAX_TPDU_DATA_LEN)
161 sendResult(SMS_SAT_CMD_SEND_SMS, TAPI_SAT_R_BEYOND_ME_CAPABILITIES);
165 // Make Telephony Structure
166 TelSmsDatapackageInfo_t pkgInfo;
169 memset((void*)pkgInfo.szData, 0x00, sizeof(pkgInfo.szData));
170 memcpy((void*)pkgInfo.szData, tpdu, tpduLen);
172 pkgInfo.szData[tpduLen] = '\0';
173 pkgInfo.MsgLength = tpduLen;
178 if (pSmsData->address.diallingNumberLen > 0)
180 smsc.ton = pSmsData->address.ton;
181 smsc.npi = pSmsData->address.npi;
182 memcpy(smsc.address, pSmsData->address.diallingNumber, pSmsData->address.diallingNumberLen);
183 smsc.address[pSmsData->address.diallingNumberLen] = '\0';
185 MSG_DEBUG("SCA TON[%d], NPI[%d], LEN[%d], ADDR[%s]", smsc.ton, smsc.npi, strlen(smsc.address), smsc.address);
190 SmsPluginTransport::instance()->setSmscOptions(&smsc);
193 unsigned char smscAddr[MAX_SMSC_LEN];
194 memset(smscAddr, 0x00, sizeof(smscAddr));
196 int smscLen = SmsPluginParamCodec::encodeSMSC(&smsc, smscAddr);
198 if (smscLen <= 0) return;
201 memset(pkgInfo.Sca, 0x00, sizeof(pkgInfo.Sca));
202 memcpy((void*)pkgInfo.Sca, smscAddr, smscLen);
203 pkgInfo.Sca[smscLen] = '\0';
205 int tapiRet = TAPI_API_SUCCESS;
208 tapiRet = tel_send_sms(pTapiHandle, &pkgInfo, 0, TapiEventSentStatus, NULL);
210 if (tapiRet == TAPI_API_SUCCESS)
212 MSG_DEBUG("######## TelTapiSmsSend Success !!! return : %d #######", tapiRet);
216 MSG_DEBUG("######## TelTapiSmsSend Fail !!! return : %d #######", tapiRet);
217 sendResult(SMS_SAT_CMD_SEND_SMS, TAPI_SAT_R_BEYOND_ME_CAPABILITIES);
222 void SmsPluginSatHandler::ctrlSms(void *pData)
224 TelSatMoSmCtrlIndData_t* pCtrlData = (TelSatMoSmCtrlIndData_t*)pData;
226 if (bSendSms == true) // Send SMS By SAT
228 if (pCtrlData->moSmsCtrlResult == TAPI_SAT_CALL_CTRL_R_NOT_ALLOWED)
230 MSG_DEBUG("SIM does not allow to send SMS");
232 sendResult(SMS_SAT_CMD_SEND_SMS, TAPI_SAT_R_INTRCTN_WITH_CC_OR_SMS_CTRL_PRMNT_PRBLM);
234 else if (pCtrlData->moSmsCtrlResult == TAPI_SAT_CALL_CTRL_R_ALLOWED_WITH_MOD)
236 MSG_DEBUG("SIM allows to send SMS with modification");
238 sendResult(SMS_SAT_CMD_SEND_SMS, TAPI_SAT_R_SUCCESS);
241 else // Send SMS By APP
243 msg_network_status_t netStatus = MSG_NETWORK_NOT_SEND;
245 if (pCtrlData->moSmsCtrlResult == TAPI_SAT_CALL_CTRL_R_NOT_ALLOWED)
247 MSG_DEBUG("SIM does not allow to send SMS");
249 netStatus = MSG_NETWORK_SEND_FAIL;
251 else if (pCtrlData->moSmsCtrlResult == TAPI_SAT_CALL_CTRL_R_ALLOWED_WITH_MOD)
253 MSG_DEBUG("SIM allows to send SMS with modification");
255 netStatus = MSG_NETWORK_SEND_SUCCESS;
258 // Call Event Handler
259 SmsPluginEventHandler::instance()->handleSentStatus(netStatus);
264 void SmsPluginSatHandler::ctrlSms(msg_network_status_t netStatus)
266 if (bSendSms == true) // Send SMS By SAT
268 if (netStatus == MSG_NETWORK_SEND_SUCCESS)
270 MSG_DEBUG("Sending SMS by SAT is OK");
272 sendResult(SMS_SAT_CMD_SEND_SMS, TAPI_SAT_R_SUCCESS);
274 else if (netStatus == MSG_NETWORK_SEND_FAIL)
276 MSG_DEBUG("Sending SMS by SAT is failed");
278 sendResult(SMS_SAT_CMD_SEND_SMS, TAPI_SAT_R_SMS_RP_ERROR);
284 void SmsPluginSatHandler::finishSimMsgInit(msg_error_t Err)
286 // SAT Handler is initializing SIM now
287 if (bInitSim == true)
289 // Init SMSC List and CB ID Info
292 if (bSMSPChanged == true) initSMSCList();
294 catch (MsgException& e)
296 // Send Result to TAPI
297 sendResult(SMS_SAT_CMD_REFRESH, TAPI_SAT_R_ME_UNABLE_TO_PROCESS_COMMAND);
299 MSG_FATAL("%s", e.what());
305 if (bCBMIChanged == true) initCBConfig();
307 catch (MsgException& e)
309 // Send Result to TAPI
310 sendResult(SMS_SAT_CMD_REFRESH, TAPI_SAT_R_ME_UNABLE_TO_PROCESS_COMMAND);
312 MSG_FATAL("%s", e.what());
316 // Send Result to TAPI
317 sendResult(SMS_SAT_CMD_REFRESH, TAPI_SAT_R_SUCCESS);
322 void SmsPluginSatHandler::initSim()
327 if (SmsPluginEventHandler::instance()->callbackInitSimBySat() != MSG_SUCCESS)
329 MSG_DEBUG("Init Sim Error");
331 // Send Result to TAPI
332 sendResult(SMS_SAT_CMD_REFRESH, TAPI_SAT_R_ME_UNABLE_TO_PROCESS_COMMAND);
337 void SmsPluginSatHandler::initSMSCList()
339 MSG_SETTING_S settingData;
341 settingData.type = MSG_SMSC_LIST;
344 SmsPluginSetting::instance()->getConfigData(&settingData);
346 MSG_DEBUG("total_count[%d]", settingData.option.smscList.totalCnt);
347 MSG_DEBUG("selected[%d]", settingData.option.smscList.selected);
349 for (int i = 0; i < settingData.option.smscList.totalCnt; i++)
351 MSG_DEBUG("pid[%d]", settingData.option.smscList.smscData[i].pid);
352 // MSG_DEBUG("dcs[%d]", settingData.option.smscList.smscData[i].dcs);
353 MSG_DEBUG("val_period[%d]", settingData.option.smscList.smscData[i].valPeriod);
354 MSG_DEBUG("name[%s]", settingData.option.smscList.smscData[i].name);
356 MSG_DEBUG("ton[%d]", settingData.option.smscList.smscData[i].smscAddr.ton);
357 MSG_DEBUG("npi[%d]", settingData.option.smscList.smscData[i].smscAddr.npi);
358 MSG_DEBUG("address[%s]", settingData.option.smscList.smscData[i].smscAddr.address);
361 if (MsgSettingSetInt(SMSC_SELECTED, settingData.option.smscList.selected) != MSG_SUCCESS)
363 THROW(MsgException::SMS_PLG_ERROR, "Error to set config data [%s]", SMSC_SELECTED);
367 if (MsgSettingSetInt(SMSC_TOTAL_COUNT, settingData.option.smscList.totalCnt) != MSG_SUCCESS)
369 THROW(MsgException::SMS_PLG_ERROR, "Error to set config data [%s]", SMSC_TOTAL_COUNT);
374 msg_error_t err = MSG_SUCCESS;
376 for (int i = 0; i < settingData.option.smscList.totalCnt; i++)
378 memset(keyName, 0x00, sizeof(keyName));
379 sprintf(keyName, "%s/%d", SMSC_PID, i);
381 if ((err = MsgSettingSetInt(keyName, (int)settingData.option.smscList.smscData[i].pid)) != MSG_SUCCESS)
385 memset(keyName, 0x00, sizeof(keyName));
386 sprintf(keyName, "%s/%d", SMSC_DCS, i);
388 if ((err = MsgSettingSetInt(keyName, (int)settingData.option.smscList.smscData[i].dcs)) != MSG_SUCCESS)
392 memset(keyName, 0x00, sizeof(keyName));
393 sprintf(keyName, "%s/%d", SMSC_VAL_PERIOD, i);
395 if ((err = MsgSettingSetInt(keyName, (int)settingData.option.smscList.smscData[i].valPeriod)) != MSG_SUCCESS)
398 memset(keyName, 0x00, sizeof(keyName));
399 sprintf(keyName, "%s/%d", SMSC_NAME, i);
401 if ((err = MsgSettingSetString(keyName, settingData.option.smscList.smscData[i].name)) != MSG_SUCCESS)
404 memset(keyName, 0x00, sizeof(keyName));
405 sprintf(keyName, "%s/%d", SMSC_TON, i);
407 if ((err = MsgSettingSetInt(keyName, (int)settingData.option.smscList.smscData[i].smscAddr.ton)) != MSG_SUCCESS)
410 memset(keyName, 0x00, sizeof(keyName));
411 sprintf(keyName, "%s/%d", SMSC_NPI, i);
413 if ((err = MsgSettingSetInt(keyName, (int)settingData.option.smscList.smscData[i].smscAddr.npi)) != MSG_SUCCESS)
416 memset(keyName, 0x00, sizeof(keyName));
417 sprintf(keyName, "%s/%d", SMSC_ADDRESS, i);
419 if ((err = MsgSettingSetString(keyName, settingData.option.smscList.smscData[i].smscAddr.address)) != MSG_SUCCESS)
423 if (err != MSG_SUCCESS)
425 THROW(MsgException::SMS_PLG_ERROR, "Error to set config data [%s]", keyName);
430 void SmsPluginSatHandler::initCBConfig()
432 MSG_SETTING_S settingData;
434 settingData.type = MSG_CBMSG_OPT;
437 SmsPluginSetting::instance()->getConfigData(&settingData);
439 if (MsgSettingSetBool(CB_RECEIVE, settingData.option.cbMsgOpt.bReceive) != MSG_SUCCESS)
441 THROW(MsgException::SMS_PLG_ERROR, "Error to set config data [%s]", CB_RECEIVE);
445 if (MsgSettingSetInt(CB_MAX_SIM_COUNT, settingData.option.cbMsgOpt.maxSimCnt) != MSG_SUCCESS)
447 THROW(MsgException::SMS_PLG_ERROR, "Error to set config data [%s]", CB_MAX_SIM_COUNT);
451 if (MsgSettingSetInt(CB_CHANNEL_COUNT, settingData.option.cbMsgOpt.channelData.channelCnt) != MSG_SUCCESS)
453 THROW(MsgException::SMS_PLG_ERROR, "Error to set config data [%s]", CB_CHANNEL_COUNT);
458 msg_error_t err = MSG_SUCCESS;
460 for (int i = 0; i < settingData.option.cbMsgOpt.channelData.channelCnt; i++)
462 memset(keyName, 0x00, sizeof(keyName));
463 sprintf(keyName, "%s/%d", CB_CHANNEL_ACTIVATE, i);
465 if ((err = MsgSettingSetBool(keyName, settingData.option.cbMsgOpt.channelData.channelInfo[i].bActivate)) != MSG_SUCCESS)
468 memset(keyName, 0x00, sizeof(keyName));
469 sprintf(keyName, "%s/%d", CB_CHANNEL_ID_FROM, i);
471 if ((err = MsgSettingSetInt(keyName, settingData.option.cbMsgOpt.channelData.channelInfo[i].from)) != MSG_SUCCESS)
474 memset(keyName, 0x00, sizeof(keyName));
475 sprintf(keyName, "%s/%d", CB_CHANNEL_ID_TO, i);
477 if ((err = MsgSettingSetInt(keyName, settingData.option.cbMsgOpt.channelData.channelInfo[i].to)) != MSG_SUCCESS)
480 memset(keyName, 0x00, sizeof(keyName));
481 sprintf(keyName, "%s/%d", CB_CHANNEL_NAME, i);
483 if ((err = MsgSettingSetString(keyName, settingData.option.cbMsgOpt.channelData.channelInfo[i].name)) != MSG_SUCCESS)
487 if (err != MSG_SUCCESS)
489 THROW(MsgException::SMS_PLG_ERROR, "Error to set config data [%s]", keyName);
494 int SmsPluginSatHandler::handleSatTpdu(unsigned char *pTpdu, unsigned char TpduLen, int bIsPackingRequired)
497 THROW(MsgException::SMS_PLG_ERROR, "SAT TPDU is NULL");
501 // TP-MTI, TP-RD, TP-VPF, TP-RP, TP-UDHI, TP-SRR
503 SMS_VPF_T vpf = (SMS_VPF_T)(pTpdu[pos++] & 0x18) >> 3;
506 unsigned char tmpRef = pTpdu[pos];
508 MSG_DEBUG("current Msg Ref : %d", tmpRef);
510 pTpdu[pos] = tmpRef + 1;
512 MSG_DEBUG("new Msg Ref : %d", pTpdu[pos]);
516 // pTpdu[pos++] = SmsPluginTransport::instance()->getMsgRef();
520 SMS_ADDRESS_S destAddr = {0};
521 int addrLen = SmsPluginParamCodec::decodeAddress(&pTpdu[pos], &destAddr);
531 int dcsLen = SmsPluginParamCodec::decodeDCS(&pTpdu[pos], &dcs);
533 if (bIsPackingRequired == true)
535 dcs.codingScheme = SMS_CHARSET_7BIT;
538 AutoPtr<char> dcsBuf(&pDcs);
540 SmsPluginParamCodec::encodeDCS(&dcs, &pDcs);
542 memcpy(&(pTpdu[pos]), pDcs, dcsLen);
548 if (vpf == SMS_VPF_RELATIVE)
550 pos += MAX_REL_TIME_PARAM_LEN;
552 else if (vpf == SMS_VPF_ABSOLUTE)
554 pos += MAX_ABS_TIME_PARAM_LEN;
558 int udl = pTpdu[pos];
561 if (bIsPackingRequired == true)
563 SMS_USERDATA_S userData = {0};
565 userData.headerCnt = 0;
566 userData.length = udl;
567 memcpy(userData.data, &pTpdu[pos+1], udl);
568 userData.data[udl] = '\0';
570 MSG_DEBUG("user data : [%s]", userData.data);
572 int encodeSize = SmsPluginUDCodec::encodeUserData(&userData, dcs.codingScheme, (char*)&pTpdu[pos]);
574 retLen = pos + encodeSize;
585 void SmsPluginSatHandler::sendResult(SMS_SAT_CMD_TYPE_T CmdType, int ResultType)
587 TelSatAppsRetInfo_t satRetInfo;
589 satRetInfo.commandId = commandId;
591 MSG_DEBUG("satRetInfo.commandId [%d]", satRetInfo.commandId);
593 if (CmdType == SMS_SAT_CMD_REFRESH)
595 satRetInfo.commandType = TAPI_SAT_CMD_TYPE_REFRESH;
597 satRetInfo.appsRet.refresh.appType = TAPI_SAT_REFRESH_MSG;
598 satRetInfo.appsRet.refresh.resp = (TelSatResultType_t)ResultType;
600 else if (CmdType == SMS_SAT_CMD_SEND_SMS)
602 satRetInfo.commandType = TAPI_SAT_CMD_TYPE_SEND_SMS;
604 satRetInfo.appsRet.sendSms.resp = (TelSatResultType_t)ResultType;
607 int tapiRet = TAPI_API_SUCCESS;
609 tapiRet = tel_send_sat_app_exec_result(pTapiHandle, &satRetInfo);
611 if (tapiRet == TAPI_API_SUCCESS)
613 MSG_DEBUG("TelTapiSatSendAppExecutionResult() SUCCESS");
617 MSG_DEBUG("TelTapiSatSendAppExecutionResult() FAIL [%d]", tapiRet);
622 bSMSPChanged = false;
623 bCBMIChanged = false;