2 * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved
4 * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
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.
19 #include "MsgCppTypes.h"
20 #include "MsgException.h"
21 #include "MsgGconfWrapper.h"
22 #include "MsgNotificationWrapper.h"
23 #include "MsgUtilStorage.h"
24 #include "SmsPluginParamCodec.h"
25 #include "SmsPluginUDCodec.h"
26 #include "SmsPluginTpduCodec.h"
27 #include "SmsPluginSetting.h"
28 #include "SmsPluginTransport.h"
29 #include "SmsPluginCallback.h"
30 #include "SmsPluginEventHandler.h"
31 #include "SmsPluginSatHandler.h"
32 #include "SmsPluginDSHandler.h"
35 #include <tapi_common.h>
37 #include <TapiUtility.h>
38 #include <ITapiNetText.h>
42 /*==================================================================================================
43 IMPLEMENTATION OF SmsPluginCbMsgHandler - Member Functions
44 ==================================================================================================*/
45 SmsPluginSatHandler* SmsPluginSatHandler::pInstance = NULL;
48 SmsPluginSatHandler::SmsPluginSatHandler()
58 SmsPluginSatHandler::~SmsPluginSatHandler()
63 SmsPluginSatHandler* SmsPluginSatHandler::instance()
66 pInstance = new SmsPluginSatHandler();
72 void SmsPluginSatHandler::refreshSms(TapiHandle *handle, void *pData)
75 TelSatRefreshInd_t* pRefreshData = (TelSatRefreshInd_t*)pData;
77 if (pRefreshData->appType != TAPI_SAT_REFRESH_MSG)
79 MSG_DEBUG("App Type is wrong. [%d]", pRefreshData->appType);
83 commandId = pRefreshData->commandId;
85 switch (pRefreshData->refreshMode)
87 case TAPI_SAT_REFRESH_SIM_INIT_AND_FULL_FCN :
88 case TAPI_SAT_REFRESH_SIM_INIT_AND_FCN :
90 for (int i = 0; i < pRefreshData->fileCount; i++)
92 if ((SMS_SIM_EFILE_NAME_T)pRefreshData->fileId[i].FileName == SMS_SIM_EFILE_USIM_SMSP ||
93 (SMS_SIM_EFILE_NAME_T)pRefreshData->fileId[i].FileName == SMS_SIM_EFILE_SMSP)
97 else if ((SMS_SIM_EFILE_NAME_T)pRefreshData->fileId[i].FileName == SMS_SIM_EFILE_USIM_CBMI ||
98 (SMS_SIM_EFILE_NAME_T)pRefreshData->fileId[i].FileName == SMS_SIM_EFILE_CBMI)
108 case TAPI_SAT_REFRESH_FCN :
110 for (int i = 0; i < pRefreshData->fileCount; i++)
112 if ((SMS_SIM_EFILE_NAME_T)pRefreshData->fileId[i].FileName == SMS_SIM_EFILE_USIM_SMSP ||
113 (SMS_SIM_EFILE_NAME_T)pRefreshData->fileId[i].FileName == SMS_SIM_EFILE_SMSP)
117 else if ((SMS_SIM_EFILE_NAME_T)pRefreshData->fileId[i].FileName == SMS_SIM_EFILE_USIM_CBMI ||
118 (SMS_SIM_EFILE_NAME_T)pRefreshData->fileId[i].FileName == SMS_SIM_EFILE_CBMI)
126 case TAPI_SAT_REFRESH_SIM_INIT :
139 void SmsPluginSatHandler::sendSms(TapiHandle *handle, void *pData)
141 TelSatSendSmsIndSmsData_t* pSmsData = (TelSatSendSmsIndSmsData_t*)pData;
143 commandId = pSmsData->commandId;
145 MSG_DEBUG("commandId [%d]", commandId);
147 /* The TPDU Maximum Length at SAT side is 175
148 This is because Sat can send 160 bytes unpacked and header */
149 unsigned char tpdu[MAX_SAT_TPDU_LEN+1];
152 memset(tpdu, 0x00, sizeof(tpdu));
153 memcpy(tpdu, pSmsData->smsTpdu.data, pSmsData->smsTpdu.dataLen);
155 /* Modify Parameters, Pack User Data */
156 tpduLen = handleSatTpdu(tpdu, pSmsData->smsTpdu.dataLen, pSmsData->bIsPackingRequired);
159 sendResult(handle, SMS_SAT_CMD_SEND_SMS, TAPI_SAT_R_SUCCESS);
161 } else if (tpduLen > MAX_SAT_TPDU_LEN) {
162 sendResult(handle, SMS_SAT_CMD_SEND_SMS, TAPI_SAT_R_BEYOND_ME_CAPABILITIES);
166 /* Make Telephony Structure */
167 TelSmsDatapackageInfo_t pkgInfo;
170 memset((void*)pkgInfo.szData, 0x00, sizeof(pkgInfo.szData));
171 memcpy((void*)pkgInfo.szData, tpdu, tpduLen);
173 pkgInfo.szData[tpduLen] = '\0';
174 pkgInfo.MsgLength = tpduLen;
175 pkgInfo.format = TAPI_NETTEXT_NETTYPE_3GPP;
177 /* Set SMSC Address */
178 SMS_ADDRESS_S smsc = {0, };
179 int simIndex = SmsPluginDSHandler::instance()->getSimIndex(handle);
181 if (pSmsData->address.diallingNumberLen > 0) {
182 smsc.ton = pSmsData->address.ton;
183 smsc.npi = pSmsData->address.npi;
184 snprintf(smsc.address, sizeof(smsc.address), "%s", pSmsData->address.diallingNumber);
186 MSG_SEC_DEBUG("SCA TON[%d], NPI[%d], LEN[%d], ADDR[%s]", smsc.ton, smsc.npi, strlen(smsc.address), smsc.address);
188 /* Set SMSC Options */
189 SmsPluginTransport::instance()->setSmscOptions(simIndex, &smsc);
192 unsigned char smscAddr[MAX_SMSC_LEN];
195 memset(smscAddr, 0x00, sizeof(smscAddr));
196 smscLen = SmsPluginParamCodec::encodeSMSC(&smsc, smscAddr);
201 /* Set SMSC Address */
202 memset(pkgInfo.Sca, 0x00, sizeof(pkgInfo.Sca));
203 memcpy((void*)pkgInfo.Sca, smscAddr, smscLen);
204 pkgInfo.Sca[smscLen] = '\0';
206 int tapiRet = TAPI_API_SUCCESS;
209 tapiRet = tel_send_sms(handle, &pkgInfo, 0, TapiEventSatSmsSentStatus, NULL);
211 if (tapiRet == TAPI_API_SUCCESS) {
212 MSG_DEBUG("######## TelTapiSmsSend Success !!! return : %d #######", tapiRet);
215 MSG_DEBUG("######## TelTapiSmsSend Fail !!! return : %d #######", tapiRet);
216 sendResult(handle, SMS_SAT_CMD_SEND_SMS, TAPI_SAT_R_BEYOND_ME_CAPABILITIES);
221 void SmsPluginSatHandler::ctrlSms(TapiHandle *handle, void *pData)
224 MSG_DEBUG("pData is NULL");
228 TelSatMoSmCtrlIndData_t* pCtrlData = (TelSatMoSmCtrlIndData_t*)pData;
231 if (bSendSmsbySat == true) {
232 /* Send SMS By SAT */
233 MSG_DEBUG("Event Noti for sending message by SAT : result = [%d]", pCtrlData->moSmsCtrlResult);
235 /* Send SMS By APP */
236 SmsPluginTransport::instance()->setMoCtrlStatus(pCtrlData);
239 if (pCtrlData->moSmsCtrlResult == TAPI_SAT_CALL_CTRL_R_NOT_ALLOWED) {
240 MsgInsertTicker("Sending message failed : blocked by call control", NULL, true, 0);
247 if (bSendSms == true) { /* Send SMS By SAT */
248 if (pCtrlData->moSmsCtrlResult == TAPI_SAT_CALL_CTRL_R_NOT_ALLOWED) {
249 MSG_DEBUG("SIM does not allow to send SMS");
251 sendResult(SMS_SAT_CMD_SEND_SMS, TAPI_SAT_R_INTRCTN_WITH_CC_OR_SMS_CTRL_PRMNT_PRBLM);
252 } else if (pCtrlData->moSmsCtrlResult == TAPI_SAT_CALL_CTRL_R_ALLOWED_WITH_MOD) {
253 MSG_DEBUG("SIM allows to send SMS with modification");
255 sendResult(SMS_SAT_CMD_SEND_SMS, TAPI_SAT_R_SUCCESS);
257 } else { /* Send SMS By APP */
258 msg_network_status_t netStatus = MSG_NETWORK_NOT_SEND;
260 if (pCtrlData->moSmsCtrlResult == TAPI_SAT_CALL_CTRL_R_NOT_ALLOWED) {
261 MSG_DEBUG("SIM does not allow to send SMS");
263 netStatus = MSG_NETWORK_SEND_FAIL;
264 } else if (pCtrlData->moSmsCtrlResult == TAPI_SAT_CALL_CTRL_R_ALLOWED_WITH_MOD) {
265 MSG_DEBUG("SIM allows to send SMS with modification");
267 netStatus = MSG_NETWORK_SEND_SUCCESS;
270 /* Call Event Handler */
271 SmsPluginEventHandler::instance()->handleSentStatus(netStatus);
277 void SmsPluginSatHandler::ctrlSms(TapiHandle *handle, SMS_NETWORK_STATUS_T smsStatus)
279 MSG_DEBUG("SMS network status = [%d]", smsStatus);
281 if (smsStatus == SMS_NETWORK_SEND_SUCCESS) {
282 MSG_DEBUG("Sending SMS by SAT is OK");
283 sendResult(handle, SMS_SAT_CMD_SEND_SMS, TAPI_SAT_R_SUCCESS);
284 } else if (smsStatus == SMS_NETWORK_SEND_FAIL) {
285 MSG_ERR("Sending SMS by SAT is failed");
286 sendResult(handle, SMS_SAT_CMD_SEND_SMS, TAPI_SAT_R_SMS_RP_ERROR);
287 } else if (smsStatus == SMS_NETWORK_SEND_FAIL_MANDATORY_INFO_MISSING) {
288 MSG_ERR("Sending SMS by SAT is failed, but result is 'success'");
289 /* sendResult(SMS_SAT_CMD_SEND_SMS, TAPI_SAT_R_ERROR_REQUIRED_VALUES_ARE_MISSING); */
290 sendResult(handle, SMS_SAT_CMD_SEND_SMS, TAPI_SAT_R_SUCCESS);
291 } else if (smsStatus == SMS_NETWORK_SEND_FAIL_BY_MO_CONTROL_NOT_ALLOWED) {
292 MSG_ERR("Sending SMS is failed by MO control");
293 sendResult(handle, SMS_SAT_CMD_SEND_SMS, TAPI_SAT_R_INTRCTN_WITH_CC_OR_SMS_CTRL_PRMNT_PRBLM);
294 } else if (smsStatus == SMS_NETWORK_SEND_FAIL_NO_ROUTING) {
295 MSG_ERR("Sending SMS is failed by no routing");
296 sendResult(handle, SMS_SAT_CMD_SEND_SMS, TAPI_SAT_R_NETWORK_UNABLE_TO_PROCESS_COMMAND);
299 MSG_ERR("Sending SMS by SAT is failed");
300 sendResult(handle, SMS_SAT_CMD_SEND_SMS, TAPI_SAT_R_SMS_RP_ERROR);
303 #if 0 /* no ticker and sound for sending SAT sms failure case. */
304 if (smsStatus != SMS_NETWORK_SEND_SUCCESS) {
305 MsgInsertTicker("Sending SMS is failed", SMS_MESSAGE_SENDING_FAIL, true, 0);
311 void SmsPluginSatHandler::finishSimMsgInit(msg_error_t Err)
313 /* SAT Handler is initializing SIM now */
314 if (bInitSim == true) {
315 /* Init SMSC List and CB ID Info */
317 if (bSMSPChanged == true) initSMSCList();
318 } catch (MsgException& e) {
319 /* Send Result to TAPI */
320 sendResult(SMS_SAT_CMD_REFRESH, TAPI_SAT_R_ME_UNABLE_TO_PROCESS_COMMAND);
322 MSG_FATAL("%s", e.what());
327 if (bCBMIChanged == true) initCBConfig();
328 } catch (MsgException& e) {
329 /* Send Result to TAPI */
330 sendResult(SMS_SAT_CMD_REFRESH, TAPI_SAT_R_ME_UNABLE_TO_PROCESS_COMMAND);
332 MSG_FATAL("%s", e.what());
336 /* Send Result to TAPI */
337 sendResult(SMS_SAT_CMD_REFRESH, TAPI_SAT_R_SUCCESS);
342 void SmsPluginSatHandler::initSim()
346 /* Init SIM Message */
347 if (SmsPluginEventHandler::instance()->callbackInitSimBySat() != MSG_SUCCESS) {
348 MSG_DEBUG("Init Sim Error");
350 /* Send Result to TAPI */
351 sendResult(SMS_SAT_CMD_REFRESH, TAPI_SAT_R_ME_UNABLE_TO_PROCESS_COMMAND);
356 void SmsPluginSatHandler::initSMSCList()
358 MSG_SETTING_S settingData;
360 settingData.type = MSG_SMSC_LIST;
362 /* Get Data From SIM */
363 SmsPluginSetting::instance()->getConfigData(&settingData);
365 MSG_DEBUG("total_count[%d]", settingData.option.smscList.totalCnt);
366 MSG_DEBUG("selected[%d]", settingData.option.smscList.selected);
368 for (int i = 0; i < settingData.option.smscList.totalCnt; i++) {
369 MSG_DEBUG("pid[%d]", settingData.option.smscList.smscData[i].pid);
370 MSG_DEBUG("val_period[%d]", settingData.option.smscList.smscData[i].valPeriod);
371 MSG_SEC_DEBUG("name[%s]", settingData.option.smscList.smscData[i].name);
373 MSG_DEBUG("ton[%d]", settingData.option.smscList.smscData[i].smscAddr.ton);
374 MSG_DEBUG("npi[%d]", settingData.option.smscList.smscData[i].smscAddr.npi);
375 MSG_SEC_DEBUG("address[%s]", settingData.option.smscList.smscData[i].smscAddr.address);
378 if (MsgSettingSetInt(SMSC_SELECTED, settingData.option.smscList.selected) != MSG_SUCCESS) {
379 THROW(MsgException::SMS_PLG_ERROR, "Error to set config data [%s]", SMSC_SELECTED);
383 if (MsgSettingSetInt(SMSC_TOTAL_COUNT, settingData.option.smscList.totalCnt) != MSG_SUCCESS) {
384 THROW(MsgException::SMS_PLG_ERROR, "Error to set config data [%s]", SMSC_TOTAL_COUNT);
388 char keyName[MAX_VCONFKEY_NAME_LEN];
389 msg_error_t err = MSG_SUCCESS;
391 for (int i = 0; i < settingData.option.smscList.totalCnt; i++) {
392 memset(keyName, 0x00, sizeof(keyName));
393 snprintf(keyName, sizeof(keyName), "%s/%d", SMSC_PID, i);
395 if ((err = MsgSettingSetInt(keyName, (int)settingData.option.smscList.smscData[i].pid)) != MSG_SUCCESS)
399 memset(keyName, 0x00, sizeof(keyName));
400 snprintf(keyName, sizeof(keyName), "%s/%d", SMSC_DCS, i);
402 if ((err = MsgSettingSetInt(keyName, (int)settingData.option.smscList.smscData[i].dcs)) != MSG_SUCCESS)
406 memset(keyName, 0x00, sizeof(keyName));
407 snprintf(keyName, sizeof(keyName), "%s/%d", SMSC_VAL_PERIOD, i);
409 if ((err = MsgSettingSetInt(keyName, (int)settingData.option.smscList.smscData[i].valPeriod)) != MSG_SUCCESS)
412 memset(keyName, 0x00, sizeof(keyName));
413 snprintf(keyName, sizeof(keyName), "%s/%d", SMSC_NAME, i);
415 if ((err = MsgSettingSetString(keyName, settingData.option.smscList.smscData[i].name)) != MSG_SUCCESS)
418 memset(keyName, 0x00, sizeof(keyName));
419 snprintf(keyName, sizeof(keyName), "%s/%d", SMSC_TON, i);
421 if ((err = MsgSettingSetInt(keyName, (int)settingData.option.smscList.smscData[i].smscAddr.ton)) != MSG_SUCCESS)
424 memset(keyName, 0x00, sizeof(keyName));
425 snprintf(keyName, sizeof(keyName), "%s/%d", SMSC_NPI, i);
427 if ((err = MsgSettingSetInt(keyName, (int)settingData.option.smscList.smscData[i].smscAddr.npi)) != MSG_SUCCESS)
430 memset(keyName, 0x00, sizeof(keyName));
431 snprintf(keyName, sizeof(keyName), "%s/%d", SMSC_ADDRESS, i);
433 if ((err = MsgSettingSetString(keyName, settingData.option.smscList.smscData[i].smscAddr.address)) != MSG_SUCCESS)
437 if (err != MSG_SUCCESS) {
438 THROW(MsgException::SMS_PLG_ERROR, "Error to set config data [%s]", keyName);
443 void SmsPluginSatHandler::initCBConfig()
445 MSG_SETTING_S settingData;
447 msg_error_t err = MSG_SUCCESS;
448 MsgDbHandler *dbHandle = getDbHandle();
450 settingData.type = MSG_CBMSG_OPT;
452 /* Get Data From SIM */
453 SmsPluginSetting::instance()->getConfigData(&settingData);
455 if (MsgSettingSetBool(CB_RECEIVE, settingData.option.cbMsgOpt.bReceive) != MSG_SUCCESS) {
456 THROW(MsgException::SMS_PLG_ERROR, "Error to set config data [%s]", CB_RECEIVE);
460 if (MsgSettingSetInt(CB_MAX_SIM_COUNT, settingData.option.cbMsgOpt.maxSimCnt) != MSG_SUCCESS) {
461 THROW(MsgException::SMS_PLG_ERROR, "Error to set config data [%s]", CB_MAX_SIM_COUNT);
465 err = MsgStoAddCBChannelInfo(dbHandle, &(settingData.option.cbMsgOpt.channelData), settingData.option.cbMsgOpt.simIndex);
466 MSG_DEBUG("MsgStoAddCBChannelInfo : err=[%d]", err);
468 if (err != MSG_SUCCESS) {
469 THROW(MsgException::SMS_PLG_ERROR, "Error to set config data");
474 int SmsPluginSatHandler::handleSatTpdu(unsigned char *pTpdu, unsigned char TpduLen, int bIsPackingRequired)
477 THROW(MsgException::SMS_PLG_ERROR, "SAT TPDU is NULL");
481 /* TP-MTI, TP-RD, TP-VPF, TP-RP, TP-UDHI, TP-SRR */
483 SMS_VPF_T vpf = (SMS_VPF_T)(pTpdu[pos++] & 0x18) >> 3;
486 unsigned char tmpRef = pTpdu[pos];
488 MSG_DEBUG("current Msg Ref : %d", tmpRef);
490 pTpdu[pos] = tmpRef + 1;
492 MSG_DEBUG("new Msg Ref : %d", pTpdu[pos]);
496 /*pTpdu[pos++] = SmsPluginTransport::instance()->getMsgRef(); */
500 SMS_ADDRESS_S destAddr = {0};
501 int addrLen = SmsPluginParamCodec::decodeAddress(&pTpdu[pos], &destAddr);
511 int dcsLen = SmsPluginParamCodec::decodeDCS(&pTpdu[pos], &dcs);
513 if (bIsPackingRequired == true) {
514 dcs.codingScheme = SMS_CHARSET_7BIT;
517 unique_ptr<char*, void(*)(char**)> dcsBuf(&pDcs, unique_ptr_deleter);
519 SmsPluginParamCodec::encodeDCS(&dcs, &pDcs);
521 memcpy(&(pTpdu[pos]), pDcs, dcsLen);
527 if (vpf == SMS_VPF_RELATIVE)
528 pos += MAX_REL_TIME_PARAM_LEN;
529 else if (vpf == SMS_VPF_ABSOLUTE)
530 pos += MAX_ABS_TIME_PARAM_LEN;
533 int udl = pTpdu[pos];
536 if (bIsPackingRequired == true) {
537 SMS_USERDATA_S userData = {0};
539 userData.headerCnt = 0;
540 userData.length = udl;
541 memcpy(userData.data, &pTpdu[pos+1], udl);
542 userData.data[udl] = '\0';
544 MSG_DEBUG("user data : [%s]", userData.data);
546 /* check for user data whether it is 7-bit packed or not. */
547 bool is7bitPacked = false;
549 for (int i = 0; i < userData.length; i++) {
550 bitValue = userData.data[i] & (1 << 7);
553 MSG_DEBUG("user data is already 7-bit packed !!");
559 MSG_DEBUG("packing 8-bit user data to 7-bit charset !!");
560 int encodeSize = SmsPluginUDCodec::encodeUserData(&userData, dcs.codingScheme, (char*)&pTpdu[pos]);
561 retLen = pos + encodeSize;
573 void SmsPluginSatHandler::sendResult(TapiHandle *handle, SMS_SAT_CMD_TYPE_T CmdType, int ResultType)
575 TelSatAppsRetInfo_t satRetInfo;
576 memset(&satRetInfo, 0, sizeof(TelSatAppsRetInfo_t));
578 satRetInfo.commandId = commandId;
580 MSG_INFO("satRetInfo.commandId [%d]", satRetInfo.commandId);
582 if (CmdType == SMS_SAT_CMD_REFRESH) {
583 satRetInfo.commandType = TAPI_SAT_CMD_TYPE_REFRESH;
585 satRetInfo.appsRet.refresh.appType = TAPI_SAT_REFRESH_MSG;
586 satRetInfo.appsRet.refresh.resp = (TelSatResultType_t)ResultType;
587 } else if (CmdType == SMS_SAT_CMD_SEND_SMS) {
588 satRetInfo.commandType = TAPI_SAT_CMD_TYPE_SEND_SMS;
590 satRetInfo.appsRet.sendSms.resp = (TelSatResultType_t)ResultType;
593 int tapiRet = TAPI_API_SUCCESS;
595 tapiRet = tel_send_sat_app_exec_result(handle, &satRetInfo);
597 if (tapiRet == TAPI_API_SUCCESS)
598 MSG_DEBUG("TelTapiSatSendAppExecutionResult() SUCCESS");
600 MSG_ERR("TelTapiSatSendAppExecutionResult() FAIL [%d]", tapiRet);
603 bSMSPChanged = false;
604 bCBMIChanged = false;