4 * Copyright (c) 2000 - 2014 Samsung Electronics Co., Ltd. All rights reserved
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
23 #include "MsgCppTypes.h"
24 #include "MsgException.h"
25 #include "MsgGconfWrapper.h"
26 #include "MsgUtilFile.h"
27 #include "SmsPluginUDCodec.h"
28 #include "SmsPluginStorage.h"
29 #include "SmsPluginEventHandler.h"
30 #include "SmsPluginCbMsgHandler.h"
33 /*==================================================================================================
34 IMPLEMENTATION OF SmsPluginCbMsgHandler - Member Functions
35 ==================================================================================================*/
36 SmsPluginCbMsgHandler* SmsPluginCbMsgHandler::pInstance = NULL;
39 SmsPluginCbMsgHandler::SmsPluginCbMsgHandler()
45 SmsPluginCbMsgHandler::~SmsPluginCbMsgHandler()
51 SmsPluginCbMsgHandler* SmsPluginCbMsgHandler::instance()
54 pInstance = new SmsPluginCbMsgHandler();
60 void SmsPluginCbMsgHandler::handleCbMsg(TelSmsCbMsg_t *pCbMsg)
64 SMS_CB_NETWORK_TYPE_T type = pCbMsg->CbMsgType;
66 SMS_CBMSG_PAGE_S CbMsgPage = {0};
70 case SMS_CB_NETWORK_TYPE_2G_GSM :
71 Decode2gCbMsg(pCbMsg, &CbMsgPage);
74 case SMS_CB_NETWORK_TYPE_3G_UMTS :
75 Decode3gCbMsg(pCbMsg, &CbMsgPage);
79 // Check CB Msg Options
80 bool bJavaMsg = false;
82 if (!checkCbOpt(CbMsgPage, &bJavaMsg))
84 MSG_DEBUG("The CB Msg is not supported by option.");
90 MSG_DEBUG("JAVA CB Msg.");
91 CbMsgPage.cbMsgType = SMS_CBMSG_TYPE_JAVACBS;
95 unsigned char pageCnt = checkCbPage(CbMsgPage);
97 if (pageCnt == CbMsgPage.pageHeader.totalPages)
99 MSG_DEBUG("RECEIVED LAST MSG : %d", pageCnt);
101 SMS_CBMSG_S cbMsg = {};
102 MSG_MESSAGE_INFO_S msgInfo = {};
104 // Make CB Msg Structure
105 MakeCbMsg(CbMsgPage, &cbMsg);
107 // Convert to MSG_MESSAGE_INFO_S
108 convertCbMsgToMsginfo(&cbMsg, &msgInfo);
110 // Add CB Msg into DB
111 msg_error_t err = MSG_SUCCESS;
113 err = SmsPluginStorage::instance()->addMessage(&msgInfo);
115 if (err == MSG_SUCCESS)
117 MSG_CB_MSG_S cbOutMsg = {0, };
119 cbOutMsg.type = MSG_CB_SMS;
120 cbOutMsg.receivedTime = cbMsg.recvTime;
121 cbOutMsg.serialNum = encodeCbSerialNum (CbMsgPage.pageHeader.serialNum);
122 cbOutMsg.messageId = cbMsg.msgId;
123 cbOutMsg.dcs = CbMsgPage.pageHeader.dcs.rawData;
124 memset (cbOutMsg.cbText, 0x00, sizeof(cbOutMsg.cbText));
126 cbOutMsg.cbTextLen= convertTextToUtf8((unsigned char*)cbOutMsg.cbText, sizeof(cbOutMsg.cbText), &cbMsg);
127 memset(cbOutMsg.language_type, 0x00, sizeof(cbOutMsg.language_type));
128 memcpy(cbOutMsg.language_type, CbMsgPage.pageHeader.dcs.iso639Lang, 3);
129 err = SmsPluginEventHandler::instance()->callbackCBMsgIncoming(&cbOutMsg);
130 if (err != MSG_SUCCESS)
132 MSG_DEBUG("callbackMsgIncoming() Error !! [%d]", err);
137 MSG_DEBUG("addMessage() Error !! [%d]", err);
141 removeFromPageList(CbMsgPage);
147 void SmsPluginCbMsgHandler::handleEtwsMsg(TelSmsEtwsMsg_t *pEtwsMsg)
150 msg_error_t err = MSG_SUCCESS;
151 SMS_ETWS_NETWORK_TYPE_T type = pEtwsMsg->EtwsMsgType;
152 //MSG_MESSAGE_INFO_S msgInfo = {};
153 SMS_ETWS_PRIMARY_S etwsPn = {0, };
154 MSG_CB_MSG_S cbOutMsg = {0, };
156 if(type != TAPI_NETTEXT_ETWS_PRIMARY)
158 MSG_DEBUG("The Etws Msg is not supported");
161 DecodeEtwsMsg(pEtwsMsg, &etwsPn);
162 //convertEtwsMsgToMsginfo(CbMsgPage, &msgInfo);
164 cbOutMsg.type = MSG_ETWS_SMS;
165 cbOutMsg.receivedTime = etwsPn.recvTime;
166 cbOutMsg.serialNum = encodeCbSerialNum (etwsPn.serialNum);
167 cbOutMsg.messageId = etwsPn.msgId;
168 cbOutMsg.etwsWarningType = etwsPn.warningType;
169 memcpy (cbOutMsg.etwsWarningSecurityInfo, etwsPn.warningSecurityInfo, sizeof(cbOutMsg.etwsWarningSecurityInfo));
171 err = SmsPluginEventHandler::instance()->callbackCBMsgIncoming(&cbOutMsg);
172 if (err != MSG_SUCCESS)
174 MSG_DEBUG("callbackMsgIncoming() Error !! [%d]", err);
181 void SmsPluginCbMsgHandler::Decode2gCbMsg(TelSmsCbMsg_t *pCbMsg, SMS_CBMSG_PAGE_S *pCbPage)
183 if (pCbMsg->Length > MAX_CBMSG_PAGE_SIZE)
184 THROW(MsgException::SMS_PLG_ERROR, "CB Msg Size is over MAX [%d]", pCbMsg->Length);
186 unsigned char cbData[pCbMsg->Length+1];
188 memset(cbData, 0x00, sizeof(cbData));
189 memcpy(cbData, pCbMsg->szMsgData, pCbMsg->Length);
190 cbData[pCbMsg->Length] = '\0';
192 pCbPage->cbMsgType = SMS_CBMSG_TYPE_CBS;
195 pCbPage->pageHeader.serialNum.geoScope = (cbData[0] & 0xC0) >> 6;
197 pCbPage->pageHeader.serialNum.msgCode = (cbData[0] & 0x3F) << 4;
198 pCbPage->pageHeader.serialNum.msgCode |= (cbData[1] & 0xF0) >> 4;
200 pCbPage->pageHeader.serialNum.updateNum = cbData[1] & 0x0F;
202 MSG_DEBUG("geoScope : [%d], msgCode : [%d], updateNum : [%d]", pCbPage->pageHeader.serialNum.geoScope, pCbPage->pageHeader.serialNum.msgCode, pCbPage->pageHeader.serialNum.updateNum);
204 pCbPage->pageHeader.msgId = (cbData[2] << 8) | cbData[3];
206 MSG_DEBUG("MSG ID : [%d]", pCbPage->pageHeader.msgId);
209 decodeCbMsgDCS(cbData[4], (unsigned char*)cbData[6], &(pCbPage->pageHeader.dcs));
212 pCbPage->pageHeader.totalPages = cbData[5] & 0x0F;
213 pCbPage->pageHeader.page = (cbData[5] & 0xF0) >> 4;
215 if (pCbPage->pageHeader.totalPages > MAX_CBMSG_PAGE_NUM)
216 THROW(MsgException::SMS_PLG_ERROR, "CB Page Count is over MAX[%d]", pCbPage->pageHeader.totalPages);
218 MSG_DEBUG("Total Page : [%d], Page : [%d]", pCbPage->pageHeader.totalPages, pCbPage->pageHeader.page);
220 // Convert Language Type
221 convertLangType(pCbPage->pageHeader.dcs.langType, &(pCbPage->pageHeader.langType));
223 MSG_DEBUG("In Language Type : [%d], Out Language Type : [%d]", pCbPage->pageHeader.dcs.langType, pCbPage->pageHeader.langType);
224 MSG_DEBUG("iso639Lang : [%s]", pCbPage->pageHeader.dcs.iso639Lang);
226 pCbPage->pageHeader.recvTime = getRecvTime();
229 int dataLen = pCbMsg->Length - 6;
231 switch (pCbPage->pageHeader.dcs.codingScheme)
233 case SMS_CHARSET_7BIT :
235 MSG_DEBUG("GSM 7 BIT");
237 dataLen = (dataLen*8) / 7;
239 SmsPluginUDCodec udCodec;
240 char pageData[MAX_CBMSG_PAGE_SIZE+1];
241 int unpackLen = udCodec.unpack7bitChar(&cbData[6], dataLen, 0, pageData);
243 if(pCbPage->pageHeader.dcs.iso639Lang[0])
245 unpackLen = unpackLen - 3;
246 memcpy(pCbPage->pageData, &pageData[3], unpackLen);
248 memcpy(pCbPage->pageData, &pageData, unpackLen);
251 MSG_DEBUG("unpackLen : [%d]", unpackLen);
253 pCbPage->pageLength = unpackLen;
254 pCbPage->pageData[unpackLen] = '\0';
258 case SMS_CHARSET_8BIT :
259 case SMS_CHARSET_UCS2 :
263 if(pCbPage->pageHeader.dcs.iso639Lang[0])
265 memcpy(pCbPage->pageData, &cbData[8], dataLen - 2);
266 pCbPage->pageLength = dataLen - 2;
268 memcpy(pCbPage->pageData, &cbData[6], dataLen);
269 pCbPage->pageLength = dataLen;
275 MSG_DEBUG("Page Length : [%d], Page Data : [%s]", pCbPage->pageLength, pCbPage->pageData);
279 void SmsPluginCbMsgHandler::DecodeEtwsMsg(TelSmsEtwsMsg_t *pEtwsMsg, SMS_ETWS_PRIMARY_S *pEtwsPn)
281 if ( !pEtwsMsg || !pEtwsPn )
284 if (pEtwsMsg->Length > MAX_ETWS_SIZE)
285 THROW(MsgException::SMS_PLG_ERROR, "ETWS Msg Size is over MAX [%d]", pEtwsMsg->Length);
287 unsigned char EtwsData[pEtwsMsg->Length+1];
289 memset(EtwsData, 0x00, sizeof(EtwsData));
290 memcpy(EtwsData, pEtwsMsg->szMsgData, pEtwsMsg->Length);
291 EtwsData[pEtwsMsg->Length] = '\0';
294 pEtwsPn->recvTime = getRecvTime();
297 pEtwsPn->serialNum.geoScope = (EtwsData[0] & 0xC0) >> 6;
298 pEtwsPn->serialNum.msgCode = (EtwsData[0] & 0x3F) << 4;
299 pEtwsPn->serialNum.msgCode |= (EtwsData[1] & 0xF0) >> 4;
300 pEtwsPn->serialNum.updateNum = EtwsData[1] & 0x0F;
302 MSG_DEBUG("geoScope : [%d], msgCode : [%d], updateNum : [%d]", pEtwsPn->serialNum.geoScope, pEtwsPn->serialNum.msgCode, pEtwsPn->serialNum.updateNum);
304 // Message Identifier
305 pEtwsPn->msgId = (EtwsData[2] << 8) | EtwsData[3];
306 MSG_DEBUG("MSG ID : [%d]", pEtwsPn->msgId);
309 pEtwsPn->warningType = (EtwsData[4] << 8) | EtwsData[5];
310 MSG_DEBUG("warningType : [0x%04x]", pEtwsPn->msgId);
312 // warning security information
313 memcpy(pEtwsPn->warningSecurityInfo, &EtwsData[6], sizeof(pEtwsPn->warningSecurityInfo)); // 50bytes
314 for (unsigned int i = 0; i < sizeof(pEtwsPn->warningSecurityInfo); i++)
316 MSG_DEBUG("warning secu info [%02x]", pEtwsPn->warningSecurityInfo[i] );
320 void SmsPluginCbMsgHandler::Decode3gCbMsg(TelSmsCbMsg_t *pCbMsg, SMS_CBMSG_PAGE_S *pCbPage)
322 if (pCbMsg->Length > (MAX_CBMSG_PAGE_SIZE*MAX_CBMSG_PAGE_NUM))
323 THROW(MsgException::SMS_PLG_ERROR, "CB Msg Size is over MAX [%d]", pCbMsg->Length);
325 char cbData[(MAX_CBMSG_PAGE_SIZE*MAX_CBMSG_PAGE_NUM)+1];
327 memset(cbData, 0x00, sizeof(cbData));
328 memcpy(cbData, pCbMsg->szMsgData, sizeof(pCbMsg->szMsgData));
329 cbData[pCbMsg->Length] = '\0';
331 pCbPage->cbMsgType = (SMS_CBMSG_TYPE_T)cbData[0];
333 pCbPage->pageHeader.msgId = (cbData[1] << 8) | cbData[2];
335 MSG_DEBUG("MSG ID : [%d]", pCbPage->pageHeader.msgId);
338 pCbPage->pageHeader.serialNum.geoScope = (cbData[3] & 0xC0) >> 6;
340 pCbPage->pageHeader.serialNum.msgCode = (cbData[3] & 0x3F) << 4;
341 pCbPage->pageHeader.serialNum.msgCode |= (cbData[4] & 0xF0) >> 4;
343 pCbPage->pageHeader.serialNum.updateNum = cbData[4] & 0x0F;
345 MSG_DEBUG("geoScope : [%d], msgCode : [%d], updateNum : [%d]", pCbPage->pageHeader.serialNum.geoScope, pCbPage->pageHeader.serialNum.msgCode, pCbPage->pageHeader.serialNum.updateNum);
348 decodeCbMsgDCS(cbData[5], (unsigned char*)cbData[6], &(pCbPage->pageHeader.dcs));
350 // Convert Language Type
351 convertLangType(pCbPage->pageHeader.dcs.langType, &(pCbPage->pageHeader.langType));
353 MSG_DEBUG("In Language Type : [%d], Out Language Type : [%d]", pCbPage->pageHeader.dcs.langType, pCbPage->pageHeader.langType);
356 pCbPage->pageHeader.recvTime = getRecvTime();
360 int dataLen = pCbMsg->Length - 6;
362 switch (pCbPage->pageHeader.dcs.codingScheme)
364 case SMS_CHARSET_7BIT :
366 dataLen = (dataLen*8) / 7;
368 if (pCbPage->pageLength > MAX_CBMSG_PAGE_SIZE)
369 THROW(MsgException::SMS_PLG_ERROR, "CB Msg Size is over MAX [%d]", pCbPage->pageLength);
371 SmsPluginUDCodec udCodec;
372 int unpackLen = udCodec.unpack7bitChar(&cbData[6], dataLen, 0, pCbPage->pageData);
373 pCbPage->pageData[unpackLen] = '\0';
375 pCbPage->pageLength = unpackLen;
379 case SMS_CHARSET_8BIT :
380 case SMS_CHARSET_UCS2 :
382 pCbPage->pageLength = dataLen;
384 memcpy(pCbPage->pageData, &cbData[6], pCbPage->pageLength);
385 pCbPage->pageData[pCbPage->pageLength] = '\0';
390 MSG_DEBUG("Page Length : [%d], Page Data : [%s]", pCbPage->pageLength, pCbPage->pageData);
394 unsigned short SmsPluginCbMsgHandler::encodeCbSerialNum ( SMS_CBMSG_SERIAL_NUM_S snFields )
396 unsigned short serialNum = 0;
398 serialNum = ((snFields.geoScope & 0x03) << 14) | ((snFields.msgCode&0x03FF) << 4) | (snFields.updateNum&0x0F);
399 MSG_DEBUG ("serialNum (%x), geo(%x), mc(%x), un(%x)\n", serialNum, snFields.geoScope, snFields.msgCode, snFields.updateNum);
404 bool SmsPluginCbMsgHandler::checkCbOpt(SMS_CBMSG_PAGE_S CbPage, bool *pJavaMsg)
406 bool bReceive = false;
407 MsgSettingGetBool(CB_RECEIVE, &bReceive);
409 // Receive CB Msg = FALSE
412 MSG_DEBUG("RECEIVE CB = FALSE");
419 memset(keyName, 0x00, sizeof(keyName));
420 sprintf(keyName, "%s/%d", CB_LANGUAGE, MSG_CBLANG_TYPE_ALL);
422 bool bAllLang = false;
423 MsgSettingGetBool(keyName, &bAllLang);
427 MSG_DEBUG("ALL LANGUAGE = FALSE");
429 memset(keyName, 0x00, sizeof(keyName));
430 sprintf(keyName, "%s/%d", CB_LANGUAGE, CbPage.pageHeader.langType);
434 MsgSettingGetBool(keyName, &bLang);
436 if (!bLang || CbPage.pageHeader.langType == MSG_CBLANG_TYPE_MAX)
438 MSG_DEBUG("LANGUAGE [%d] = FALSE", CbPage.pageHeader.langType);
443 int MsgIdCnt = MsgSettingGetInt(CB_CHANNEL_COUNT);
445 bool bActivate = false;
446 int MsgId_from = 0, MsgId_to = 0;
448 for (int i = 0; i < MsgIdCnt; i++)
450 memset(keyName, 0x00, sizeof(keyName));
451 sprintf(keyName, "%s/%d", CB_CHANNEL_ACTIVATE, i);
453 MsgSettingGetBool(keyName, &bActivate);
455 memset(keyName, 0x00, sizeof(keyName));
456 sprintf(keyName, "%s/%d", CB_CHANNEL_ID_FROM, i);
458 MsgId_from = MsgSettingGetInt(keyName);
460 memset(keyName, 0x00, sizeof(keyName));
461 sprintf(keyName, "%s/%d", CB_CHANNEL_ID_TO, i);
463 MsgId_to = MsgSettingGetInt(keyName);
465 if (bActivate == true && CbPage.pageHeader.msgId >= MsgId_from && CbPage.pageHeader.msgId <= MsgId_to)
467 MSG_DEBUG("FIND CHANNEL = [%d]", CbPage.pageHeader.msgId);
476 unsigned char SmsPluginCbMsgHandler::checkCbPage(SMS_CBMSG_PAGE_S CbPage)
478 unsigned char currPageCnt = 0;
482 if (CbPage.pageHeader.totalPages > 1)
484 for (unsigned int i = 0; i < pageList.size(); i++)
486 if (pageList[i].geoScope == CbPage.pageHeader.serialNum.geoScope && pageList[i].msgCode == CbPage.pageHeader.serialNum.msgCode)
488 MSG_DEBUG("geoScope [%d], msgCode [%d]", pageList[i].geoScope, pageList[i].msgCode);
490 if (pageList[i].msgId == CbPage.pageHeader.msgId)
492 int updateNum = CbPage.pageHeader.serialNum.updateNum - pageList[i].updateNum;
494 if (updateNum > 0) // New Message Content
498 else if (updateNum == 0) // Same Message Content
500 if (pageList[i].data.count(CbPage.pageHeader.page) != 0)
502 MSG_DEBUG("The Page Number already exists [%d]", CbPage.pageHeader.page);
506 pair<unsigned char, string> newData(CbPage.pageHeader.page, CbPage.pageData);
507 pageList[i].data.insert(newData);
509 MSG_DEBUG("PAGE DATA : %s", CbPage.pageData);
510 MSG_DEBUG("PAIR DATA [%d] : %s", newData.first, newData.second.c_str());
512 pageList[i].pageCnt++;
513 pageList[i].totalSize += CbPage.pageLength;
515 currPageCnt = pageList[i].pageCnt;
521 else // Old Message Content
530 if (bFind == false || CbPage.pageHeader.totalPages == 1)
532 addToPageLiat(CbPage);
540 void SmsPluginCbMsgHandler::MakeCbMsg(SMS_CBMSG_PAGE_S CbPage, SMS_CBMSG_S *pCbMsg)
542 pCbMsg->cbMsgType = CbPage.cbMsgType;
543 pCbMsg->msgId = CbPage.pageHeader.msgId;
544 pCbMsg->classType = CbPage.pageHeader.dcs.classType;
545 pCbMsg->codingScheme = CbPage.pageHeader.dcs.codingScheme;
546 pCbMsg->recvTime = CbPage.pageHeader.recvTime;
548 cbPageMap::iterator it;
551 for (unsigned int i = 0; i < pageList.size(); i++)
553 if (pageList[i].geoScope == CbPage.pageHeader.serialNum.geoScope && pageList[i].msgCode == CbPage.pageHeader.serialNum.msgCode)
555 MSG_DEBUG("geoScope [%d], msgCode [%d]", pageList[i].geoScope, pageList[i].msgCode);
557 if (pageList[i].msgId == CbPage.pageHeader.msgId)
559 for (it = pageList[i].data.begin(); it != pageList[i].data.end(); it++)
561 tmpStr += it->second;
567 pCbMsg->msgLength = tmpStr.size();
569 memcpy(pCbMsg->msgData, tmpStr.c_str(), tmpStr.size());
570 pCbMsg->msgData[tmpStr.size()] = '\0';
572 MSG_DEBUG("SIZE : [%d] TOTAL MSG : %s", tmpStr.size(), tmpStr.c_str());
576 void SmsPluginCbMsgHandler::convertCbMsgToMsginfo(SMS_CBMSG_S *pCbMsg, MSG_MESSAGE_INFO_S *pMsgInfo)
578 pMsgInfo->msgId = (msg_message_id_t)pCbMsg->msgId;
580 pMsgInfo->folderId = MSG_CBMSGBOX_ID;
582 // Convert Type values
583 pMsgInfo->msgType.mainType = MSG_SMS_TYPE;
585 if (pCbMsg->cbMsgType == SMS_CBMSG_TYPE_CBS)
586 pMsgInfo->msgType.subType = MSG_CB_SMS;
587 else if (pCbMsg->cbMsgType == SMS_CBMSG_TYPE_JAVACBS)
588 pMsgInfo->msgType.subType = MSG_JAVACB_SMS;
590 switch(pCbMsg->classType)
592 case SMS_MSG_CLASS_0:
593 pMsgInfo->msgType.classType = MSG_CLASS_0;
595 case SMS_MSG_CLASS_1:
596 pMsgInfo->msgType.classType = MSG_CLASS_1;
598 case SMS_MSG_CLASS_2:
599 pMsgInfo->msgType.classType = MSG_CLASS_2;
601 case SMS_MSG_CLASS_3:
602 pMsgInfo->msgType.classType = MSG_CLASS_3;
605 pMsgInfo->msgType.classType = MSG_CLASS_NONE;
609 pMsgInfo->storageId = MSG_STORAGE_PHONE;
610 pMsgInfo->networkStatus = MSG_NETWORK_RECEIVED;
611 pMsgInfo->bRead = false;
612 pMsgInfo->bProtected = false;
613 pMsgInfo->priority = MSG_MESSAGE_PRIORITY_NORMAL;
614 pMsgInfo->direction = MSG_DIRECTION_TYPE_MT;
617 pMsgInfo->nAddressCnt = 1;
619 pMsgInfo->addressList[0].addressType = MSG_ADDRESS_TYPE_UNKNOWN;
620 pMsgInfo->addressList[0].recipientType = MSG_RECIPIENTS_TYPE_UNKNOWN;
622 getDisplayName(pCbMsg->msgId, pMsgInfo->addressList[0].addressVal);
623 MSG_DEBUG("%s", pMsgInfo->addressList[0].addressVal);
625 pMsgInfo->msgPort.valid = false;
626 pMsgInfo->msgPort.dstPort = 0;
627 pMsgInfo->msgPort.srcPort = 0;
629 pMsgInfo->displayTime = pCbMsg->recvTime;
630 MSG_DEBUG("recvTime is %s", ctime(&pMsgInfo->displayTime));
632 int bufSize = pCbMsg->msgLength*2;
634 char tmpBuf[bufSize];
635 memset(tmpBuf, 0x00, sizeof(tmpBuf));
637 MSG_DEBUG("LENGTH %d CB MSG %s", pCbMsg->msgLength, pCbMsg->msgData);
639 // Convert Data values
640 pMsgInfo->dataSize = convertTextToUtf8((unsigned char*)tmpBuf, bufSize, pCbMsg);
642 if (pMsgInfo->dataSize > MAX_MSG_TEXT_LEN)
644 pMsgInfo->bTextSms = false;
646 // Save Message Data into File
647 char fileName[MSG_FILENAME_LEN_MAX+1];
648 memset(fileName, 0x00, sizeof(fileName));
650 if (MsgCreateFileName(fileName) == false)
651 THROW(MsgException::FILE_ERROR, "MsgCreateFileName error");
653 MSG_DEBUG("Save Message Data into file : size[%d] name[%s]\n", pMsgInfo->dataSize, fileName);
654 if (MsgWriteIpcFile(fileName, tmpBuf, pMsgInfo->dataSize) == false)
655 THROW(MsgException::FILE_ERROR, "MsgWriteIpcFile error");
657 strncpy(pMsgInfo->msgData, fileName, MAX_MSG_DATA_LEN);
661 pMsgInfo->bTextSms = true;
663 memset(pMsgInfo->msgText, 0x00, sizeof(pMsgInfo->msgText));
664 memcpy(pMsgInfo->msgText, tmpBuf, pMsgInfo->dataSize);
669 void SmsPluginCbMsgHandler::convertEtwsMsgToMsginfo(SMS_CBMSG_PAGE_S EtwsMsg, MSG_MESSAGE_INFO_S *pMsgInfo)
671 pMsgInfo->msgId = (msg_message_id_t)EtwsMsg.pageHeader.msgId;
673 pMsgInfo->folderId = MSG_CBMSGBOX_ID;
675 // Convert Type values
676 pMsgInfo->msgType.mainType = MSG_SMS_TYPE;
678 if (EtwsMsg.cbMsgType == SMS_CBMSG_TYPE_ETWS)
679 pMsgInfo->msgType.subType = MSG_ETWS_SMS;
681 pMsgInfo->storageId = MSG_STORAGE_PHONE;
682 pMsgInfo->networkStatus = MSG_NETWORK_RECEIVED;
683 pMsgInfo->bRead = false;
684 pMsgInfo->bProtected = false;
685 pMsgInfo->priority = MSG_MESSAGE_PRIORITY_NORMAL;
686 pMsgInfo->direction = MSG_DIRECTION_TYPE_MT;
689 pMsgInfo->nAddressCnt = 1;
691 pMsgInfo->addressList[0].addressType = MSG_ADDRESS_TYPE_UNKNOWN;
692 pMsgInfo->addressList[0].recipientType = MSG_RECIPIENTS_TYPE_UNKNOWN;
694 getDisplayName(EtwsMsg.pageHeader.msgId, pMsgInfo->addressList[0].addressVal);
695 MSG_DEBUG("%s", pMsgInfo->addressList[0].addressVal);
697 pMsgInfo->msgPort.valid = false;
698 pMsgInfo->msgPort.dstPort = 0;
699 pMsgInfo->msgPort.srcPort = 0;
701 pMsgInfo->displayTime = EtwsMsg.pageHeader.recvTime;
702 MSG_DEBUG("recvTime is %s", ctime(&pMsgInfo->displayTime));
703 MSG_DEBUG("LENGTH %d", EtwsMsg.pageLength);
704 pMsgInfo->bTextSms = true;
705 pMsgInfo->dataSize = EtwsMsg.pageLength;
706 memset(pMsgInfo->msgData, 0x00, sizeof(pMsgInfo->msgData));
707 memcpy(pMsgInfo->msgData, EtwsMsg.pageData, pMsgInfo->dataSize);
710 int SmsPluginCbMsgHandler::convertTextToUtf8 (unsigned char* outBuf, int outBufSize, SMS_CBMSG_S* pCbMsg)
712 int convertedTextSize = 0;
713 MSG_LANG_INFO_S langInfo = {0,};
715 if (!outBuf || !pCbMsg)
717 MSG_DEBUG ("invalid param.\n");
721 langInfo.bSingleShift = false;
722 langInfo.bLockingShift = false;
725 // Convert Data values
726 if (pCbMsg->codingScheme == SMS_CHARSET_7BIT)
727 convertedTextSize = textCvt.convertGSM7bitToUTF8(outBuf, outBufSize, (unsigned char*)pCbMsg->msgData, pCbMsg->msgLength, &langInfo);
728 else if (pCbMsg->codingScheme == SMS_CHARSET_UCS2)
729 convertedTextSize = textCvt.convertUCS2ToUTF8(outBuf, outBufSize, (unsigned char*)pCbMsg->msgData, pCbMsg->msgLength);
731 return convertedTextSize;
734 void SmsPluginCbMsgHandler::addToPageLiat(SMS_CBMSG_PAGE_S CbPage)
736 CB_PAGE_INFO_S tmpInfo;
738 tmpInfo.geoScope = CbPage.pageHeader.serialNum.geoScope;
739 tmpInfo.msgCode = CbPage.pageHeader.serialNum.msgCode;
740 tmpInfo.updateNum = CbPage.pageHeader.serialNum.updateNum;
741 tmpInfo.msgId = CbPage.pageHeader.msgId;
742 tmpInfo.totalPages = CbPage.pageHeader.totalPages;
745 tmpInfo.totalSize = CbPage.pageLength;
747 pair<unsigned char, string> newData(CbPage.pageHeader.page, CbPage.pageData);
748 tmpInfo.data.insert(newData);
750 MSG_DEBUG("MSG DATA : %s", CbPage.pageData);
751 MSG_DEBUG("PAIR DATA [%d] : %s", newData.first, newData.second.c_str());
753 pageList.push_back(tmpInfo);
757 void SmsPluginCbMsgHandler::removeFromPageList(SMS_CBMSG_PAGE_S CbPage)
761 for (index = 0; index < pageList.size(); index++)
763 if (pageList[index].geoScope == CbPage.pageHeader.serialNum.geoScope && pageList[index].msgCode == CbPage.pageHeader.serialNum.msgCode)
765 MSG_DEBUG("geoScope [%d], msgCode [%d]", pageList[index].geoScope, pageList[index].msgCode);
767 if (pageList[index].msgId == CbPage.pageHeader.msgId) break;
771 MSG_DEBUG("remove index [%d]", index);
773 pageList.erase(pageList.begin()+index);
777 void SmsPluginCbMsgHandler::decodeCbMsgDCS(unsigned char dcsData, const unsigned char *pMsgData, SMS_CBMSG_DCS_S* pDcs)
779 pDcs->codingGroup = SMS_CBMSG_CODGRP_GENERAL_DCS;
780 pDcs->classType = SMS_MSG_CLASS_NONE;
781 pDcs->bCompressed = false;
782 pDcs->codingScheme = SMS_CHARSET_7BIT;
783 pDcs->langType = SMS_CBMSG_LANG_UNSPECIFIED;
784 memset(pDcs->iso639Lang, 0x00, sizeof(pDcs->iso639Lang));
786 pDcs->rawData = dcsData;
788 unsigned char codingGrp = (dcsData & 0xF0) >> 4;
796 pDcs->codingGroup = SMS_CBMSG_CODGRP_GENERAL_DCS;
797 pDcs->langType = (SMS_CBMSG_LANG_TYPE_T)dcsData;
803 if (dcsData == 0x10 || dcsData == 0x11)
805 pDcs->codingGroup = SMS_CBMSG_CODGRP_GENERAL_DCS;
806 pDcs->codingScheme = (dcsData & 0x01) ? SMS_CHARSET_UCS2 : SMS_CHARSET_7BIT;
807 pDcs->langType = SMS_CBMSG_LANG_ISO639;
809 if (pMsgData != NULL)
811 pDcs->iso639Lang[0] = pMsgData[0] & 0x7F;
812 pDcs->iso639Lang[1] = (pMsgData[0] & 0x80) >> 7;
813 pDcs->iso639Lang[1] |= (pMsgData[1] & 0x3F) << 1;
814 pDcs->iso639Lang[2] = 0x13; /* CR char in GSM 7-bit Alphabet */
818 /* Default it to English if pMsgData is NULL */
819 pDcs->iso639Lang[0] = 0x45; /* E */
820 pDcs->iso639Lang[1] = 0x4E; /* N */
821 pDcs->iso639Lang[2] = 0x13; /* CR */
832 pDcs->codingGroup = SMS_CBMSG_CODGRP_GENERAL_DCS;
834 pDcs->bCompressed = (dcsData & 0x20) ? true : false;
837 pDcs->classType = (SMS_MSG_CLASS_T)(dcsData & 0x03);
839 pDcs->codingScheme = (SMS_CODING_SCHEME_T)(dcsData & 0x0C);
851 pDcs->codingGroup = SMS_CBMSG_CODGRP_WAP;
857 pDcs->codingGroup = SMS_CBMSG_CODGRP_CLASS_CODING;
858 pDcs->codingScheme = (dcsData & 0x04) ? SMS_CHARSET_UCS2 : SMS_CHARSET_7BIT;
859 pDcs->classType = (MSG_CLASS_TYPE_T)(dcsData & 0x03);
866 void SmsPluginCbMsgHandler::convertLangType(SMS_CBMSG_LANG_TYPE_T InType , MSG_CB_LANGUAGE_TYPE_T *pOutType)
870 case SMS_CBMSG_LANG_GERMAN :
871 *pOutType = MSG_CBLANG_TYPE_GER;
874 case SMS_CBMSG_LANG_ENGLISH :
875 *pOutType = MSG_CBLANG_TYPE_ENG;
878 case SMS_CBMSG_LANG_ITALIAN :
879 *pOutType = MSG_CBLANG_TYPE_ITA;
882 case SMS_CBMSG_LANG_FRENCH :
883 *pOutType = MSG_CBLANG_TYPE_FRE;
886 case SMS_CBMSG_LANG_SPANISH :
887 *pOutType = MSG_CBLANG_TYPE_SPA;
890 case SMS_CBMSG_LANG_DUTCH :
891 *pOutType = MSG_CBLANG_TYPE_NED;
894 case SMS_CBMSG_LANG_SWEDISH :
895 *pOutType = MSG_CBLANG_TYPE_SWE;
898 case SMS_CBMSG_LANG_PORTUGUESE :
899 *pOutType = MSG_CBLANG_TYPE_POR;
902 case SMS_CBMSG_LANG_TURKISH :
903 *pOutType = MSG_CBLANG_TYPE_TUR;
907 *pOutType = MSG_CBLANG_TYPE_MAX;
913 unsigned long SmsPluginCbMsgHandler::getRecvTime()
917 recvTime = time(NULL);
919 return (unsigned long)recvTime;
923 void SmsPluginCbMsgHandler::getDisplayName(unsigned short MsgId, char *pDisplayName)
925 int MsgIdCnt = MsgSettingGetInt(CB_CHANNEL_COUNT);
930 for (int i = 0; i < MsgIdCnt; i++)
932 memset(from, 0x00, sizeof(from));
933 sprintf(from, "%s/%d", CB_CHANNEL_ID_FROM, i);
935 memset(to, 0x00, sizeof(to));
936 sprintf(to, "%s/%d", CB_CHANNEL_ID_TO, i);
938 if (MsgId >= MsgSettingGetInt(from) && MsgId <= MsgSettingGetInt(to))
940 MSG_DEBUG("FIND MSG ID = [%d]", MsgId);
942 memset(keyName, 0x00, sizeof(keyName));
943 sprintf(keyName, "%s/%d", CB_CHANNEL_NAME, i);
945 memset(strTmp, 0x00, sizeof(strTmp));
947 channelName = MsgSettingGetString(keyName);
949 strncpy(strTmp, channelName, CB_CHANNEL_NAME_MAX);
956 if (strlen(strTmp) > 0)
957 sprintf(pDisplayName, "[%s]", strTmp);
959 sprintf(pDisplayName, "[%d]", MsgId);
961 sprintf(pDisplayName, "[%d]", MsgId);
968 sprintf(pDisplayName, "[%d]", MsgId);