7847359c5f80d457b53b594252c4e131f957f2ed
[platform/core/messaging/msg-service.git] / plugin / sms_plugin / SmsPluginCbMsgHandler.cpp
1 /*
2  * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15 */
16
17 #include <time.h>
18
19 #include "MsgDebug.h"
20 #include "MsgCppTypes.h"
21 #include "MsgException.h"
22 #include "MsgGconfWrapper.h"
23 #include "MsgUtilFile.h"
24 #include "MsgUtilStorage.h"
25 #include "SmsPluginUDCodec.h"
26 #include "SmsPluginStorage.h"
27 #include "SmsPluginEventHandler.h"
28 #include "SmsPluginCbMsgHandler.h"
29 #include "SmsPluginDSHandler.h"
30
31 /*==================================================================================================
32                   IMPLEMENTATION OF SmsPluginCbMsgHandler - Member Functions
33 ==================================================================================================*/
34 SmsPluginCbMsgHandler* SmsPluginCbMsgHandler::pInstance = NULL;
35
36
37 SmsPluginCbMsgHandler::SmsPluginCbMsgHandler()
38 {
39         pageList.clear();
40 }
41
42
43 SmsPluginCbMsgHandler::~SmsPluginCbMsgHandler()
44 {
45 }
46
47
48 SmsPluginCbMsgHandler* SmsPluginCbMsgHandler::instance()
49 {
50         if (!pInstance)
51                 pInstance = new SmsPluginCbMsgHandler();
52
53         return pInstance;
54 }
55
56
57 void SmsPluginCbMsgHandler::handleCbMsg(TapiHandle *handle, TelSmsCbMsg_t *pCbMsg)
58 {
59         MSG_BEGIN();
60
61 #if 0
62         char temp[1000]= {0x01, 0xa4, 0x1f, 0x51, 0x10, 0x11, 0x02, 0xea, 0x30, 0x30, 0xa8, 0x30, 0xea, 0x30, 0xa2, 0x30, 0xe1, 0x30, 0xfc, 0x30, 0xeb, 0x91, 0x4d, 0x4f, 0xe1, 0x30, 0xc6, 0x30, 0xb9, 0x30, 0xc8, 0x00, 0x0d, 0x00, 0x0a, 0x30, 0x53, 0x30, 0x8c, 0x30, 0x6f, 0x8a, 0x66, 0x9a, 0x13, 0x75, 0x28, 0x30, 0x6e, 0x30, 0xe1, 0x30, 0xc3, 0x30, 0xbb, 0x30, 0xfc, 0x30, 0xb8, 0x30, 0x67, 0x30, 0x59, 0x30, 0x02, 0x00, 0x0d, 0x00, 0x0a, 0xff, 0x08, 0x00, 0x32, 0x00, 0x30, 0x00, 0x31, 0x00, 0x33, 0x00, 0x2f, 0x00, 0x31, 0x00, 0x31, 0x00, 0x2f, 0x00, 0x32, 0x52, 0xea, 0x30, 0x00, 0x37, 0x00, 0x20, 0x00, 0x31, 0x00, 0x35, 0x00, 0x3a, 0x00, 0x34, 0x00, 0x34, 0xff, 0x09, 0x00, 0x0d, 0x00, 0x0a, 0xff, 0x08, 0x30, 0xa8, 0x30, 0xea, 0x30, 0xa2, 0x5e, 0x02, 0xff, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22};
63         TelSmsEtwsMsg_t *pCbMsg = (TelSmsEtwsMsg_t *)calloc(1, sizeof(TelSmsEtwsMsg_t));
64         pCbMsg->Length = 173;
65         pCbMsg->EtwsMsgType = (TelSmsEtwsMsgType_t)2;
66         memcpy(pCbMsg->szMsgData, temp, pCbMsg->Length);
67
68         SMS_CB_NETWORK_TYPE_T type = pCbMsg->EtwsMsgType;
69         SMS_CBMSG_PAGE_S CbMsgPage = {0};
70
71         switch (type) {
72         case SMS_CB_NETWORK_TYPE_2G_GSM :
73                 Decode2gCbMsg((TelSmsCbMsg_t *)pCbMsg, &CbMsgPage);
74                 break;
75
76         case SMS_CB_NETWORK_TYPE_3G_UMTS :
77                 Decode3gCbMsg((TelSmsCbMsg_t *)pCbMsg, &CbMsgPage);
78                 break;
79         }
80 #else
81         SMS_CB_NETWORK_TYPE_T type = pCbMsg->CbMsgType;
82         SMS_CBMSG_PAGE_S CbMsgPage = {0};
83
84         switch (type) {
85         case SMS_CB_NETWORK_TYPE_2G_GSM :
86                 Decode2gCbMsg(pCbMsg, &CbMsgPage);
87                 break;
88
89         case SMS_CB_NETWORK_TYPE_3G_UMTS :
90                 Decode3gCbMsg(pCbMsg, &CbMsgPage);
91                 break;
92         }
93 #endif
94         /* Check CB Msg Options */
95         bool bJavaMsg = false;
96
97         int simIndex = SmsPluginDSHandler::instance()->getSimIndex(handle);
98
99         if (!checkCbOpt(&CbMsgPage, &bJavaMsg, simIndex)) {
100                 MSG_DEBUG("The CB Msg is not supported by option.");
101                 return;
102         }
103
104         if (bJavaMsg == true) {
105                 MSG_DEBUG("JAVA CB Msg.");
106                 CbMsgPage.cbMsgType = SMS_CBMSG_TYPE_JAVACBS;
107         }
108
109
110         /* Check CB Pages */
111         unsigned char pageCnt = checkCbPage(&CbMsgPage);
112
113         if (pageCnt == CbMsgPage.pageHeader.totalPages) {
114                 MSG_DEBUG("RECEIVED LAST MSG : %d", pageCnt);
115
116                 SMS_CBMSG_S *cbMsg = NULL;
117                 unique_ptr<SMS_CBMSG_S*, void(*)(SMS_CBMSG_S**)> buf(&cbMsg, unique_ptr_deleter);
118                 cbMsg = (SMS_CBMSG_S *)new char[sizeof(SMS_CBMSG_S)];
119                 memset(cbMsg, 0x00, sizeof(SMS_CBMSG_S));
120
121                 MSG_MESSAGE_INFO_S msgInfo;
122
123                 /** initialize msgInfo */
124                 memset(&msgInfo, 0x00, sizeof(MSG_MESSAGE_INFO_S));
125
126                 msgInfo.addressList = NULL;
127                 unique_ptr<MSG_ADDRESS_INFO_S*, void(*)(MSG_ADDRESS_INFO_S**)> addressListBuf(&msgInfo.addressList, unique_ptr_deleter);
128
129                 /* Make CB Msg Structure */
130                 MakeCbMsg(&CbMsgPage, cbMsg);
131
132                 /* Convert to MSG_MESSAGE_INFO_S */
133                 convertCbMsgToMsginfo(cbMsg, &msgInfo, simIndex);
134
135                 /* Add CB Msg into DB */
136                 msg_error_t err = MSG_SUCCESS;
137
138                 err = SmsPluginStorage::instance()->checkMessage(&msgInfo);
139
140                 if (err == MSG_SUCCESS) {
141                         MSG_CB_MSG_S cbOutMsg = {0, };
142
143                         /*cbOutMsg.type = MSG_CB_SMS; */
144                         cbOutMsg.type = msgInfo.msgType.subType;
145                         cbOutMsg.receivedTime = cbMsg->recvTime;
146                         cbOutMsg.serialNum = encodeCbSerialNum(CbMsgPage.pageHeader.serialNum);
147                         cbOutMsg.messageId = cbMsg->msgId;
148                         cbOutMsg.dcs = CbMsgPage.pageHeader.dcs.rawData;
149                         memset (cbOutMsg.cbText, 0x00, sizeof(cbOutMsg.cbText));
150
151                         cbOutMsg.cbTextLen = convertTextToUtf8((unsigned char*)cbOutMsg.cbText, sizeof(cbOutMsg.cbText), cbMsg);
152                         memset(cbOutMsg.language_type, 0x00, sizeof(cbOutMsg.language_type));
153                         memcpy(cbOutMsg.language_type, CbMsgPage.pageHeader.dcs.iso639Lang, 3);
154                         err = SmsPluginEventHandler::instance()->callbackCBMsgIncoming(&cbOutMsg, &msgInfo);
155                         if (err != MSG_SUCCESS)
156                                 MSG_WARN("callbackMsgIncoming() Error !! [%d]", err);
157                 } else {
158                         MSG_WARN("checkMessage() Error !! [%d]", err);
159                 }
160
161 #if 0
162                 /* insert message-id to internal CB message table */
163                 SmsPluginStorage *storageHandler = SmsPluginStorage::instance();
164                 err = storageHandler->insertReceivedCBMessage(CbMsgPage);
165                 if (err != MSG_SUCCESS) {
166                         MSG_DEBUG("insertReceivedCBMessage() Error !! [%d]", err);
167                 }
168 #endif
169                 /* Remove From List */
170                 removeFromPageList(&CbMsgPage);
171         }
172         MSG_END();
173 }
174
175
176 void SmsPluginCbMsgHandler::handleEtwsMsg(TapiHandle *handle, TelSmsEtwsMsg_t *pEtwsMsg)
177 {
178         MSG_BEGIN();
179         msg_error_t err = MSG_SUCCESS;
180         TelSmsEtwsMsgType_t type = pEtwsMsg->EtwsMsgType;
181         SMS_ETWS_PRIMARY_S              etwsPn = {0, };
182         MSG_CB_MSG_S                    cbOutMsg = {0, };
183
184         if (type != TAPI_NETTEXT_ETWS_PRIMARY) {
185                 MSG_DEBUG("The Etws secondary Message");
186                 handleCbMsg(handle, (TelSmsCbMsg_t *)pEtwsMsg);
187                 return;
188         }
189         DecodeEtwsMsg(pEtwsMsg, &etwsPn);
190
191         cbOutMsg.type = MSG_ETWS_SMS;
192         cbOutMsg.receivedTime = etwsPn.recvTime;
193         cbOutMsg.serialNum = encodeCbSerialNum(etwsPn.serialNum);
194         cbOutMsg.messageId = etwsPn.msgId;
195         cbOutMsg.etwsWarningType = etwsPn.warningType;
196         memcpy (cbOutMsg.etwsWarningSecurityInfo, etwsPn.warningSecurityInfo, sizeof(cbOutMsg.etwsWarningSecurityInfo));
197
198         err = SmsPluginEventHandler::instance()->callbackCBMsgIncoming(&cbOutMsg, NULL);
199         if (err != MSG_SUCCESS)
200                 MSG_DEBUG("callbackMsgIncoming() Error !! [%d]", err);
201
202         MSG_END();
203 }
204
205
206 void SmsPluginCbMsgHandler::Decode2gCbMsg(TelSmsCbMsg_t *pCbMsg, SMS_CBMSG_PAGE_S *pCbPage)
207 {
208         unsigned char cbData[pCbMsg->Length+1];
209
210         memset(cbData, 0x00, sizeof(cbData));
211         memcpy(cbData, pCbMsg->szMsgData, pCbMsg->Length);
212         cbData[pCbMsg->Length] = '\0';
213
214         /* print cb data */
215         MSG_INFO("Received CB length:%d", pCbMsg->Length);
216         char cbDataTmp[(pCbMsg->Length*2)+1];
217         memset(cbDataTmp, 0x00, sizeof(cbDataTmp));
218
219         for (int i = 0; i < pCbMsg->Length; i++) {
220                 snprintf(cbDataTmp+(i*2), sizeof(cbDataTmp)-(i*2), "%02X", cbData[i]);
221         }
222         MSG_INFO("[%s]", cbDataTmp);
223
224         pCbPage->cbMsgType = SMS_CBMSG_TYPE_CBS;
225
226         /* Serial Number */
227         pCbPage->pageHeader.serialNum.geoScope = (cbData[0] & 0xC0) >> 6;
228
229         pCbPage->pageHeader.serialNum.msgCode = (cbData[0] & 0x3F) << 4;
230         pCbPage->pageHeader.serialNum.msgCode |= (cbData[1] & 0xF0) >> 4;
231
232         pCbPage->pageHeader.serialNum.updateNum = cbData[1] & 0x0F;
233
234         MSG_DEBUG("geoScope : [%d], msgCode : [%d], updateNum : [%d]", pCbPage->pageHeader.serialNum.geoScope, pCbPage->pageHeader.serialNum.msgCode, pCbPage->pageHeader.serialNum.updateNum);
235
236         pCbPage->pageHeader.msgId = (cbData[2] << 8) | cbData[3];
237
238         MSG_DEBUG("MSG ID : [%d]", pCbPage->pageHeader.msgId);
239
240         /* DCS */
241         decodeCbMsgDCS(cbData[4], (unsigned char*)cbData + 6, &(pCbPage->pageHeader.dcs));
242
243         /* Page Parameter */
244         pCbPage->pageHeader.totalPages = cbData[5] & 0x0F;
245         pCbPage->pageHeader.page = (cbData[5] & 0xF0) >> 4;
246
247         if (pCbPage->pageHeader.totalPages > MAX_CBMSG_PAGE_NUM)
248                 THROW(MsgException::SMS_PLG_ERROR, "CB Page Count is over MAX[%d]", pCbPage->pageHeader.totalPages);
249
250         MSG_DEBUG("Total Page : [%d], Page : [%d]", pCbPage->pageHeader.totalPages, pCbPage->pageHeader.page);
251
252         /* Convert Language Type */
253         convertLangType(pCbPage->pageHeader.dcs.langType, &(pCbPage->pageHeader.langType));
254
255         MSG_DEBUG("In Language Type : [%d], Out Language Type : [%d]", pCbPage->pageHeader.dcs.langType, pCbPage->pageHeader.langType);
256         MSG_DEBUG("iso639Lang : [%s]", pCbPage->pageHeader.dcs.iso639Lang);
257         /* Get Receive Time */
258         pCbPage->pageHeader.recvTime = getRecvTime();
259
260         /* Decode CB Data */
261         int dataLen = pCbMsg->Length - 6;
262
263         MSG_DEBUG("codingScheme:[%d]", pCbPage->pageHeader.dcs.codingScheme);
264
265         switch (pCbPage->pageHeader.dcs.codingScheme) {
266         case SMS_CHARSET_7BIT: {
267                 MSG_DEBUG("GSM 7 BIT");
268
269                 dataLen = (dataLen*8) / 7;
270
271                 SmsPluginUDCodec udCodec;
272                 char pageData[MAX_CBMSG_PAGE_SIZE+1];
273                 int unpackLen = udCodec.unpack7bitChar(&cbData[6], dataLen, 0, pageData);
274
275                 if (pCbPage->pageHeader.dcs.iso639Lang[0]) {
276                         unpackLen = unpackLen - 3;
277                         if (unpackLen > 0)
278                                 memcpy(pCbPage->pageData, &pageData[3], unpackLen);
279                         else
280                                 unpackLen = 0;
281                 } else {
282                         memcpy(pCbPage->pageData, &pageData, unpackLen);
283                 }
284
285                 MSG_DEBUG("unpackLen : [%d]", unpackLen);
286
287                 pCbPage->pageLength = unpackLen;
288                 pCbPage->pageData[unpackLen] = '\0';
289         }
290         break;
291
292         case SMS_CHARSET_8BIT:
293         case SMS_CHARSET_UCS2: {
294                 MSG_DEBUG("UCS2 or 8BIT");
295
296                 if (pCbPage->pageHeader.dcs.iso639Lang[0]) {
297                         memcpy(pCbPage->pageData, &cbData[8], dataLen - 2);
298                         pCbPage->pageLength = dataLen - 2;
299                 } else {
300                         memcpy(pCbPage->pageData, &cbData[6], dataLen);
301                         pCbPage->pageLength = dataLen;
302                 }
303         }
304         break;
305         }
306
307         MSG_DEBUG("Page Length : [%d], Page Data : [%s]", pCbPage->pageLength, pCbPage->pageData);
308 }
309
310
311 void SmsPluginCbMsgHandler::DecodeEtwsMsg(TelSmsEtwsMsg_t *pEtwsMsg, SMS_ETWS_PRIMARY_S *pEtwsPn)
312 {
313         if ( !pEtwsMsg || !pEtwsPn )
314                 return;
315
316         if (pEtwsMsg->Length > MAX_ETWS_SIZE)
317                 THROW(MsgException::SMS_PLG_ERROR, "ETWS Msg Size is over MAX [%d]", pEtwsMsg->Length);
318
319         unsigned char EtwsData[pEtwsMsg->Length+1];
320
321         memset(EtwsData, 0x00, sizeof(EtwsData));
322         memcpy(EtwsData, pEtwsMsg->szMsgData, pEtwsMsg->Length);
323         EtwsData[pEtwsMsg->Length] = '\0';
324
325         /* print received msg data */
326         MSG_INFO("Received Etws length:%d", pEtwsMsg->Length);
327         char EtwsDataTmp[(pEtwsMsg->Length*2)+1];
328         memset(EtwsDataTmp, 0x00, sizeof(EtwsDataTmp));
329
330         for (int i = 0; i < pEtwsMsg->Length; i++) {
331                 snprintf(EtwsDataTmp+(i*2), sizeof(EtwsDataTmp)-(i*2), "%02X", EtwsData[i]);
332         }
333         MSG_INFO("[%s]", EtwsDataTmp);
334
335         /* received time */
336         pEtwsPn->recvTime = getRecvTime();
337
338         /* Serial Number */
339         pEtwsPn->serialNum.geoScope = (EtwsData[0] & 0xC0) >> 6;
340         pEtwsPn->serialNum.msgCode = (EtwsData[0] & 0x3F) << 4;
341         pEtwsPn->serialNum.msgCode |= (EtwsData[1] & 0xF0) >> 4;
342         pEtwsPn->serialNum.updateNum = EtwsData[1] & 0x0F;
343
344         MSG_DEBUG("geoScope : [%d], msgCode : [%d], updateNum : [%d]", pEtwsPn->serialNum.geoScope, pEtwsPn->serialNum.msgCode, pEtwsPn->serialNum.updateNum);
345
346         /* Message Identifier */
347         pEtwsPn->msgId = (EtwsData[2] << 8) | EtwsData[3];
348         MSG_DEBUG("MSG ID : [%d]", pEtwsPn->msgId);
349
350         /* warning type */
351         pEtwsPn->warningType = (EtwsData[4] << 8) | EtwsData[5];
352         MSG_DEBUG("warningType : [0x%04x]", pEtwsPn->msgId);
353
354         /* warning security information */
355         memcpy(pEtwsPn->warningSecurityInfo, &EtwsData[6], sizeof(pEtwsPn->warningSecurityInfo));       /* 50bytes */
356         for (unsigned int i = 0; i < sizeof(pEtwsPn->warningSecurityInfo); i++) {
357                 MSG_DEBUG("warning secu info [%02x]", pEtwsPn->warningSecurityInfo[i]);
358         }
359 }
360
361 void SmsPluginCbMsgHandler::Decode3gCbMsg(TelSmsCbMsg_t *pCbMsg, SMS_CBMSG_PAGE_S *pCbPage)
362 {
363         unsigned char cbData[(MAX_CBMSG_PAGE_SIZE*MAX_CBMSG_PAGE_NUM)+1];
364
365         memset(cbData, 0x00, sizeof(cbData));
366         memcpy(cbData, pCbMsg->szMsgData, pCbMsg->Length);
367         cbData[pCbMsg->Length] = '\0';
368
369         /* print cb data */
370         MSG_INFO("Received CB length:%d", pCbMsg->Length);
371         char cbDataTmp[(pCbMsg->Length*2)+1];
372         memset(cbDataTmp, 0x00, sizeof(cbDataTmp));
373
374         for (int i = 0; i < pCbMsg->Length; i++) {
375                 snprintf(cbDataTmp+(i*2), sizeof(cbDataTmp)-(i*2), "%02X", cbData[i]);
376         }
377         MSG_INFO("[%s]", cbDataTmp);
378
379         pCbPage->cbMsgType = (SMS_CBMSG_TYPE_T)cbData[0];
380
381         pCbPage->pageHeader.msgId = (cbData[1] << 8) | cbData[2];
382
383         MSG_DEBUG("MSG ID : [%d]", pCbPage->pageHeader.msgId);
384
385         /* Serial Number */
386         pCbPage->pageHeader.serialNum.geoScope = (cbData[3] & 0xC0) >> 6;
387
388         pCbPage->pageHeader.serialNum.msgCode = (cbData[3] & 0x3F) << 4;
389         pCbPage->pageHeader.serialNum.msgCode |= (cbData[4] & 0xF0) >> 4;
390
391         pCbPage->pageHeader.serialNum.updateNum = cbData[4] & 0x0F;
392
393         MSG_DEBUG("geoScope : [%d], msgCode : [%d], updateNum : [%d]", pCbPage->pageHeader.serialNum.geoScope, pCbPage->pageHeader.serialNum.msgCode, pCbPage->pageHeader.serialNum.updateNum);
394
395         /* DCS */
396         decodeCbMsgDCS(cbData[5], (unsigned char*)cbData + 6, &(pCbPage->pageHeader.dcs));
397
398         /* Convert Language Type */
399         convertLangType(pCbPage->pageHeader.dcs.langType, &(pCbPage->pageHeader.langType));
400
401         MSG_DEBUG("In Language Type : [%d], Out Language Type : [%d]", pCbPage->pageHeader.dcs.langType, pCbPage->pageHeader.langType);
402
403         /* Get Receive Time */
404         pCbPage->pageHeader.recvTime = getRecvTime();
405         pCbPage->pageHeader.totalPages = cbData[6];
406
407         /* Decode CB Data */
408         int dataLen = 0;
409         int offset = 0;
410
411         switch (pCbPage->pageHeader.dcs.codingScheme) {
412         case SMS_CHARSET_7BIT: {
413                 for (int i = 0; i < pCbPage->pageHeader.totalPages; ++i) {
414                         char cbMessage[MAX_CBMSG_PAGE_SIZE] = {0, };
415                         dataLen = cbData[7+(i+1)*82 + i];
416                         memcpy(cbMessage, &cbData[7+(i*82)+ i], dataLen);
417
418                         dataLen = (dataLen*8) / 7;
419
420                         if (dataLen > MAX_CBMSG_PAGE_SIZE)
421                                 THROW(MsgException::SMS_PLG_ERROR, "CB Msg Size is over MAX [%d]", dataLen);
422
423                         SmsPluginUDCodec udCodec;
424                         int unpackLen = udCodec.unpack7bitChar((const unsigned char *)cbMessage, dataLen, 0, pCbPage->pageData + offset);
425                         offset += unpackLen;
426                 }
427                 pCbPage->pageLength = offset;
428         }
429         break;
430
431         case SMS_CHARSET_8BIT:
432         case SMS_CHARSET_UCS2: {
433 #if 0
434                 char cbMessage[MAX_CBMSG_PAGE_SIZE]= {0, };
435
436                 for (int i = 0; i < pCbPage->pageHeader.totalPages; ++i) {
437                         dataLen = cbData[7+(i+1)*82 + i];
438                         memcpy(cbMessage + offset, &cbData[7+(i*82)+ i], dataLen);
439                         offset += dataLen;
440                 }
441                 dataLen = offset;
442
443                 if (pCbPage->pageHeader.dcs.iso639Lang[0]) {
444                         int tmpDataLen = (dataLen > 2)?(dataLen - 2):0;
445                         memcpy(pCbPage->pageData, cbMessage + 2, tmpDataLen);
446                         pCbPage->pageLength = tmpDataLen;
447                 } else {
448                         memcpy(pCbPage->pageData, cbMessage, dataLen);
449                         pCbPage->pageLength = dataLen;
450                 }
451 #else
452                 char cbMessage[MAX_CBMSG_PAGE_SIZE] = {0, };
453
454                 for (int i = 0; i < pCbPage->pageHeader.totalPages; ++i) {
455                         if (pCbPage->pageHeader.dcs.iso639Lang[0]) {
456                                 dataLen = cbData[7+(i+1)*82 + i] - 2;
457                                 if (dataLen > 0) {
458                                         memcpy(cbMessage + offset, &cbData[7+(i*82)+ i + 2], dataLen);
459                                         offset += dataLen;
460                                 }
461                         } else {
462                                 dataLen = cbData[7+(i+1)*82 + i];
463                                 if (dataLen > 0) {
464                                         memcpy(cbMessage + offset, &cbData[7+(i*82)+ i], dataLen);
465                                         offset += dataLen;
466                                 }
467                         }
468                 }
469                 dataLen = offset;
470                 memcpy(pCbPage->pageData, cbMessage, dataLen);
471                 pCbPage->pageLength = dataLen;
472 #endif
473         }
474         break;
475         }
476         pCbPage->pageHeader.totalPages = 1;
477
478         MSG_DEBUG("Page Length : [%d], Page Data : [%s]", pCbPage->pageLength, pCbPage->pageData);
479 }
480
481 unsigned short SmsPluginCbMsgHandler::encodeCbSerialNum(SMS_CBMSG_SERIAL_NUM_S snFields)
482 {
483         unsigned short serialNum = 0;
484
485         serialNum = ((snFields.geoScope & 0x03) << 14) | ((snFields.msgCode&0x03FF) << 4) | (snFields.updateNum&0x0F);
486         MSG_DEBUG("serialNum (%x), geo(%x), mc(%x), un(%x)\n", serialNum, snFields.geoScope, snFields.msgCode, snFields.updateNum);
487
488         return serialNum;
489 }
490
491 int SmsPluginCbMsgHandler::CMAS_class(unsigned short message_id)
492 {
493         int ret = 0;
494
495         switch (message_id) {
496         case 4370:
497         case 4383:
498                 ret = MSG_CMAS_PRESIDENTIAL;
499                 break;
500         case 4371:
501         case 4372:
502         case 4384:
503         case 4385:
504                 ret = MSG_CMAS_EXTREME;
505                 break;
506         case 4373:
507         case 4374:
508         case 4375:
509         case 4376:
510         case 4377:
511         case 4378:
512         case 4386:
513         case 4387:
514         case 4388:
515         case 4389:
516         case 4390:
517         case 4391:
518                 ret = MSG_CMAS_SEVERE;
519                 break;
520         case 4379:
521         case 4392:
522                 ret = MSG_CMAS_AMBER;
523                 break;
524         case 4380:
525         case 4393:
526                 ret = MSG_CMAS_TEST;
527                 break;
528         case 4381:
529         case 4394:
530                 ret = MSG_CMAS_EXERCISE;
531                 break;
532         case 4382:
533         case 4395:
534                 ret = MSG_CMAS_OPERATOR_DEFINED;
535                 break;
536         default:
537                 break;
538         }
539
540         return ret;
541 }
542
543 bool SmsPluginCbMsgHandler::checkCbOpt(SMS_CBMSG_PAGE_S *CbPage, bool *pJavaMsg, msg_sim_slot_id_t simIndex)
544 {
545         bool bReceive = false;
546         char keyName[MAX_VCONFKEY_NAME_LEN];
547         memset(keyName, 0x00, sizeof(keyName));
548         snprintf(keyName, sizeof(keyName), "%s/%d", CB_RECEIVE, simIndex);
549         if (MsgSettingGetBool(keyName, &bReceive) != MSG_SUCCESS)
550                 MSG_INFO("MsgSettingGetBool() is failed");
551
552         /* Receive CB Msg = FALSE */
553         if (!bReceive) {
554                 MSG_DEBUG("RECEIVE CB = FALSE");
555                 return false;
556         }
557
558 #if 0
559         char keyname[128];
560         /* check Language */
561         memset(keyName, 0x00, sizeof(keyName));
562         snprintf(keyName, sizeof(keyname), "%s/%d", CB_LANGUAGE, MSG_CBLANG_TYPE_ALL);
563
564         bool bAllLang = false;
565         if (MsgSettingGetBool(keyName, &bAllLang) != MSG_SUCCESS)
566                 MSG_INFO("MsgSettingGetBool() is failed");
567
568         if (!bAllLang) {
569                 MSG_DEBUG("ALL LANGUAGE = FALSE");
570
571                 memset(keyName, 0x00, sizeof(keyName));
572                 snprintf(keyName, sizeof(keyname), "%s/%d", CB_LANGUAGE, CbPage.pageHeader.langType);
573
574                 bool bLang = false;
575
576                 if (MsgSettingGetBool(keyName, &bLang) != MSG_SUCCESS)
577                         MSG_INFO("MsgSettingGetBool() is failed");
578
579                 if (!bLang || CbPage.pageHeader.langType == MSG_CBLANG_TYPE_MAX) {
580                         MSG_DEBUG("LANGUAGE [%d] = FALSE", CbPage.pageHeader.langType);
581                         return false;
582                 }
583         }
584 #endif
585
586         bool bActivate = false;
587         int MsgId_from = 0, MsgId_to = 0;
588         MSG_CB_CHANNEL_S cbChannelInfo = {0, };
589         msg_error_t err = MSG_SUCCESS;
590         MsgDbHandler *dbHandle = getDbHandle();
591
592         err = MsgStoGetCBChannelInfo(dbHandle, &cbChannelInfo, simIndex);
593         if (err != MSG_SUCCESS)
594                 MSG_ERR("Error value of MsgStoGetCBChannelInfo [%d]", err);
595
596         for (int i = 0; i < cbChannelInfo.channelCnt; i++) {
597                 bActivate = cbChannelInfo.channelInfo[i].bActivate;
598                 MsgId_from = cbChannelInfo.channelInfo[i].from;
599                 MsgId_to = cbChannelInfo.channelInfo[i].to;
600
601                 if (bActivate == true && CbPage->pageHeader.msgId >= MsgId_from && CbPage->pageHeader.msgId <= MsgId_to) {
602                         MSG_DEBUG("FIND CHANNEL = [%d]", CbPage->pageHeader.msgId);
603                         return true;
604                 }
605         }
606
607         return false;
608 }
609
610 unsigned char SmsPluginCbMsgHandler::checkCbPage(SMS_CBMSG_PAGE_S *CbPage)
611 {
612         unsigned char currPageCnt = 0;
613
614         bool bFind = false;
615
616 #if 0
617         msg_error_t err = MSG_SUCCESS;
618
619         SmsPluginStorage *storageHandler = SmsPluginStorage::instance();
620         err = storageHandler->isReceivedCBMessage(CbPage);
621
622         /* check existing message with cb internal table; */
623         if (err != MSG_ERR_DB_NORECORD) {
624                 MSG_DEBUG("already received message: [%d]", CbPage.pageHeader.msgId);
625                 return 0;
626         }
627 #endif
628
629         if (CbPage->pageHeader.totalPages > 0) {
630                 for (unsigned int i = 0; i < pageList.size(); i++) {
631                         if (pageList[i].geoScope == CbPage->pageHeader.serialNum.geoScope && pageList[i].msgCode == CbPage->pageHeader.serialNum.msgCode) {
632                                 MSG_DEBUG("geoScope [%d], msgCode [%d]", pageList[i].geoScope, pageList[i].msgCode);
633
634                                 if (pageList[i].msgId == CbPage->pageHeader.msgId) {
635                                         int updateNum = CbPage->pageHeader.serialNum.updateNum - pageList[i].updateNum;
636
637                                         if (updateNum > 0) { /* New Message Content */
638                                                 break;
639                                         } else if (updateNum == 0) { /* Same Message Content */
640                                                 if (pageList[i].data.count(CbPage->pageHeader.page) != 0) {
641                                                         MSG_DEBUG("The Page Number already exists [%d]", CbPage->pageHeader.page);
642                                                         return 0;
643                                                 }
644
645                                                 pair<unsigned char, SMS_CBMSG_PAGE_S> newData(CbPage->pageHeader.page, *CbPage);
646                                                 pageList[i].data.insert(newData);
647
648                                                 MSG_DEBUG("PAGE DATA : %s", CbPage->pageData);
649                                                 MSG_DEBUG("PAIR DATA [%d] : %s", newData.first, newData.second.pageData);
650
651                                                 pageList[i].pageCnt++;
652                                                 pageList[i].totalSize += CbPage->pageLength;
653
654                                                 currPageCnt = pageList[i].pageCnt;
655
656                                                 bFind = true;
657
658                                                 break;
659                                         } else { /* Old Message Content */
660                                                 return 0;
661                                         }
662                                 }
663                         }
664                 }
665         }
666
667         if (bFind == false || CbPage->pageHeader.totalPages == 1) {
668                 addToPageList(CbPage);
669                 return 1;
670         }
671
672         return currPageCnt;
673 }
674
675
676 void SmsPluginCbMsgHandler::MakeCbMsg(SMS_CBMSG_PAGE_S *CbPage, SMS_CBMSG_S *pCbMsg)
677 {
678         pCbMsg->cbMsgType = CbPage->cbMsgType;
679         pCbMsg->msgId = CbPage->pageHeader.msgId;
680         pCbMsg->classType = CbPage->pageHeader.dcs.classType;
681         pCbMsg->codingScheme = CbPage->pageHeader.dcs.codingScheme;
682         pCbMsg->recvTime = CbPage->pageHeader.recvTime;
683
684         cbPageMap::iterator it;
685         int offset = 0;
686
687         for (unsigned int i = 0; i < pageList.size(); i++) {
688                 if (pageList[i].geoScope == CbPage->pageHeader.serialNum.geoScope && pageList[i].msgCode == CbPage->pageHeader.serialNum.msgCode) {
689                         MSG_DEBUG("geoScope [%d], msgCode [%d]", pageList[i].geoScope, pageList[i].msgCode);
690
691                         if (pageList[i].msgId == CbPage->pageHeader.msgId) {
692                                 for (it = pageList[i].data.begin(); it != pageList[i].data.end(); it++) {
693                                         memcpy(pCbMsg->msgData + offset, it->second.pageData, it->second.pageLength);
694                                         pCbMsg->msgLength += it->second.pageLength;
695                                         offset = pCbMsg->msgLength;
696                                 }
697                         }
698                 }
699         }
700
701 #if 0
702         pCbMsg->msgLength = tmpStr.size();
703
704         memcpy(pCbMsg->msgData, tmpStr.c_str(), tmpStr.size());
705         pCbMsg->msgData[tmpStr.size()] = '\0';
706
707         MSG_DEBUG("SIZE : [%d] TOTAL MSG : %s", tmpStr.size(), tmpStr.c_str());
708 #endif
709 }
710
711
712 void SmsPluginCbMsgHandler::convertCbMsgToMsginfo(SMS_CBMSG_S *pCbMsg, MSG_MESSAGE_INFO_S *pMsgInfo, msg_sim_slot_id_t simIndex)
713 {
714         pMsgInfo->msgId = (msg_message_id_t)pCbMsg->msgId;
715
716         pMsgInfo->folderId = MSG_CBMSGBOX_ID;
717
718         /* Convert Type values */
719         pMsgInfo->msgType.mainType = MSG_SMS_TYPE;
720
721         if (pCbMsg->cbMsgType == SMS_CBMSG_TYPE_CBS) {
722                 int cmas_class = CMAS_class(pCbMsg->msgId);
723
724                 if (cmas_class == 0)
725                         pMsgInfo->msgType.subType = MSG_CB_SMS;
726                 else
727                         pMsgInfo->msgType.subType = (MSG_SUB_TYPE_T)cmas_class;
728         } else if (pCbMsg->cbMsgType == SMS_CBMSG_TYPE_JAVACBS) {
729                 pMsgInfo->msgType.subType = MSG_JAVACB_SMS;
730         }
731
732         switch (pCbMsg->classType) {
733         case SMS_MSG_CLASS_0:
734                 pMsgInfo->msgType.classType = MSG_CLASS_0;
735                 break;
736         case SMS_MSG_CLASS_1:
737                 pMsgInfo->msgType.classType = MSG_CLASS_1;
738                 break;
739         case SMS_MSG_CLASS_2:
740                 pMsgInfo->msgType.classType = MSG_CLASS_2;
741                 break;
742         case SMS_MSG_CLASS_3:
743                 pMsgInfo->msgType.classType = MSG_CLASS_3;
744                 break;
745         default:
746                 pMsgInfo->msgType.classType = MSG_CLASS_NONE;
747                 break;
748         }
749
750         pMsgInfo->storageId = MSG_STORAGE_PHONE;
751         pMsgInfo->networkStatus = MSG_NETWORK_RECEIVED;
752         pMsgInfo->bRead = false;
753         pMsgInfo->bProtected = false;
754         pMsgInfo->priority = MSG_MESSAGE_PRIORITY_NORMAL;
755         pMsgInfo->direction = MSG_DIRECTION_TYPE_MT;
756
757         /* Temporary */
758         pMsgInfo->nAddressCnt = 1;
759
760         pMsgInfo->addressList =  (MSG_ADDRESS_INFO_S *)new char[sizeof(MSG_ADDRESS_INFO_S)];
761         memset(pMsgInfo->addressList, 0x00, sizeof(MSG_ADDRESS_INFO_S));
762
763         pMsgInfo->addressList[0].addressType = MSG_ADDRESS_TYPE_UNKNOWN;
764         pMsgInfo->addressList[0].recipientType = MSG_RECIPIENTS_TYPE_UNKNOWN;
765         pMsgInfo->sim_idx = simIndex;
766
767         /*      TODO :: MSG ID should be used to get CB message type */
768         getDisplayName(pCbMsg->msgId, pMsgInfo->addressList[0].addressVal, simIndex);
769         MSG_SEC_DEBUG("%s", pMsgInfo->addressList[0].addressVal);
770
771
772         pMsgInfo->msgPort.valid = false;
773         pMsgInfo->msgPort.dstPort = 0;
774         pMsgInfo->msgPort.srcPort = 0;
775
776         pMsgInfo->displayTime = pCbMsg->recvTime;
777         MSG_DEBUG("recvTime is %d", pMsgInfo->displayTime);
778
779         int bufSize = pCbMsg->msgLength*2;
780
781         char tmpBuf[bufSize];
782         memset(tmpBuf, 0x00, sizeof(tmpBuf));
783
784         while (pCbMsg->msgLength > 0) {
785                 if (pCbMsg->msgData[pCbMsg->msgLength-1] == ' ' ||
786                                 pCbMsg->msgData[pCbMsg->msgLength-1] == '\r' ||
787                                 pCbMsg->msgData[pCbMsg->msgLength-1] == '\n') {
788                         pCbMsg->msgLength--;
789                 } else {
790                         break;
791                 }
792         }
793         pCbMsg->msgData[pCbMsg->msgLength] = '\0';
794
795         MSG_DEBUG("LENGTH %d CB MSG %s", pCbMsg->msgLength, pCbMsg->msgData);
796
797         /* Convert Data values */
798         pMsgInfo->dataSize = convertTextToUtf8((unsigned char*)tmpBuf, bufSize, pCbMsg);
799
800         if (pMsgInfo->dataSize > MAX_MSG_TEXT_LEN) {
801                 pMsgInfo->bTextSms = false;
802
803                 /* Save Message Data into File */
804                 char fileName[MSG_FILENAME_LEN_MAX+1];
805                 memset(fileName, 0x00, sizeof(fileName));
806
807                 if (MsgCreateFileName(fileName) == false)
808                         THROW(MsgException::FILE_ERROR, "MsgCreateFileName error");
809
810                 MSG_SEC_DEBUG("Save Message Data into file : size[%d] name[%s]\n", pMsgInfo->dataSize, fileName);
811                 if (MsgWriteIpcFile(fileName, tmpBuf, pMsgInfo->dataSize) == false)
812                         THROW(MsgException::FILE_ERROR, "MsgWriteIpcFile error");
813
814                 strncpy(pMsgInfo->msgData, fileName, MAX_MSG_DATA_LEN);
815         } else {
816                 pMsgInfo->bTextSms = true;
817
818                 memset(pMsgInfo->msgText, 0x00, sizeof(pMsgInfo->msgText));
819                 memcpy(pMsgInfo->msgText, tmpBuf, pMsgInfo->dataSize);
820                 pMsgInfo->dataSize = strlen(pMsgInfo->msgText);
821                 MSG_SEC_DEBUG("CB MSG %s", pMsgInfo->msgText);
822         }
823 }
824
825
826 void SmsPluginCbMsgHandler::convertEtwsMsgToMsginfo(SMS_CBMSG_PAGE_S *EtwsMsg, MSG_MESSAGE_INFO_S *pMsgInfo, msg_sim_slot_id_t simIndex)
827 {
828         pMsgInfo->msgId = (msg_message_id_t)EtwsMsg->pageHeader.msgId;
829
830         pMsgInfo->folderId = MSG_CBMSGBOX_ID;
831
832         /* Convert Type values */
833         pMsgInfo->msgType.mainType = MSG_SMS_TYPE;
834
835         if (EtwsMsg->cbMsgType == SMS_CBMSG_TYPE_ETWS)
836                 pMsgInfo->msgType.subType = MSG_ETWS_SMS;
837
838         pMsgInfo->storageId = MSG_STORAGE_PHONE;
839         pMsgInfo->networkStatus = MSG_NETWORK_RECEIVED;
840         pMsgInfo->bRead = false;
841         pMsgInfo->bProtected = false;
842         pMsgInfo->priority = MSG_MESSAGE_PRIORITY_NORMAL;
843         pMsgInfo->direction = MSG_DIRECTION_TYPE_MT;
844
845         /* Temporary */
846         pMsgInfo->nAddressCnt = 1;
847
848         pMsgInfo->addressList[0].addressType = MSG_ADDRESS_TYPE_UNKNOWN;
849         pMsgInfo->addressList[0].recipientType = MSG_RECIPIENTS_TYPE_UNKNOWN;
850
851         getDisplayName(EtwsMsg->pageHeader.msgId, pMsgInfo->addressList[0].addressVal, simIndex);
852         MSG_SEC_DEBUG("%s", pMsgInfo->addressList[0].addressVal);
853
854         pMsgInfo->msgPort.valid = false;
855         pMsgInfo->msgPort.dstPort = 0;
856         pMsgInfo->msgPort.srcPort = 0;
857
858         pMsgInfo->displayTime = EtwsMsg->pageHeader.recvTime;
859         MSG_DEBUG("recvTime is %d", pMsgInfo->displayTime);
860         MSG_DEBUG("LENGTH %d", EtwsMsg->pageLength);
861         pMsgInfo->bTextSms = true;
862         pMsgInfo->dataSize = EtwsMsg->pageLength;
863         memset(pMsgInfo->msgData, 0x00, sizeof(pMsgInfo->msgData));
864         memcpy(pMsgInfo->msgData, EtwsMsg->pageData, pMsgInfo->dataSize);
865 }
866
867 int SmsPluginCbMsgHandler::convertTextToUtf8(unsigned char* outBuf, int outBufSize, SMS_CBMSG_S* pCbMsg)
868 {
869         int     convertedTextSize = 0;
870         MSG_LANG_INFO_S langInfo = {0, };
871
872         MsgTextConvert *textCvt = MsgTextConvert::instance();
873
874         if (!outBuf || !pCbMsg) {
875                 MSG_DEBUG("invalid param.\n");
876                 return 0;
877         }
878
879         langInfo.bSingleShift = false;
880         langInfo.bLockingShift = false;
881
882
883         /* Convert Data values */
884         if (pCbMsg->codingScheme == SMS_CHARSET_7BIT)
885                 convertedTextSize = textCvt->convertGSM7bitToUTF8(outBuf, outBufSize, (unsigned char*)pCbMsg->msgData, pCbMsg->msgLength, &langInfo);
886         else if (pCbMsg->codingScheme == SMS_CHARSET_UCS2)
887                 convertedTextSize = textCvt->convertUCS2ToUTF8(outBuf, outBufSize, (unsigned char*)pCbMsg->msgData, pCbMsg->msgLength);
888
889         return convertedTextSize;
890 }
891
892 void SmsPluginCbMsgHandler::addToPageList(SMS_CBMSG_PAGE_S *CbPage)
893 {
894         CB_PAGE_INFO_S tmpInfo;
895
896         tmpInfo.geoScope = CbPage->pageHeader.serialNum.geoScope;
897         tmpInfo.msgCode = CbPage->pageHeader.serialNum.msgCode;
898         tmpInfo.updateNum = CbPage->pageHeader.serialNum.updateNum;
899         tmpInfo.msgId = CbPage->pageHeader.msgId;
900         tmpInfo.totalPages = CbPage->pageHeader.totalPages;
901
902         tmpInfo.pageCnt = 1;
903         tmpInfo.totalSize = CbPage->pageLength;
904
905         pair<unsigned char, SMS_CBMSG_PAGE_S> newData(CbPage->pageHeader.page, *CbPage);
906         tmpInfo.data.insert(newData);
907
908         MSG_DEBUG("MSG DATA : %s", CbPage->pageData);
909         MSG_DEBUG("PAIR DATA [%d] : %s", newData.first, newData.second.pageData);
910
911         pageList.push_back(tmpInfo);
912 }
913
914
915 void SmsPluginCbMsgHandler::removeFromPageList(SMS_CBMSG_PAGE_S *CbPage)
916 {
917         unsigned int index;
918
919         for (index = 0; index < pageList.size(); index++) {
920                 if (pageList[index].geoScope == CbPage->pageHeader.serialNum.geoScope && pageList[index].msgCode == CbPage->pageHeader.serialNum.msgCode) {
921                         MSG_DEBUG("geoScope [%d], msgCode [%d]", pageList[index].geoScope, pageList[index].msgCode);
922
923                         if (pageList[index].msgId == CbPage->pageHeader.msgId)
924                                 break;
925                 }
926         }
927
928         MSG_DEBUG("remove index [%d]", index);
929
930         pageList.erase(pageList.begin()+index);
931 }
932
933
934 void SmsPluginCbMsgHandler::decodeCbMsgDCS(unsigned char dcsData, const unsigned char *pMsgData, SMS_CBMSG_DCS_S* pDcs)
935 {
936         pDcs->codingGroup = SMS_CBMSG_CODGRP_GENERAL_DCS;
937         pDcs->classType = SMS_MSG_CLASS_NONE;
938         pDcs->bCompressed = false;
939         pDcs->codingScheme = SMS_CHARSET_7BIT;
940         pDcs->langType = SMS_CBMSG_LANG_UNSPECIFIED;
941         memset(pDcs->iso639Lang, 0x00, sizeof(pDcs->iso639Lang));
942         pDcs->bUDH = false;
943         pDcs->rawData = dcsData;
944
945         unsigned char codingGrp = (dcsData & 0xF0) >> 4;
946
947         switch (codingGrp) {
948         case 0x00:
949         case 0x02:
950         case 0x03: {
951                 pDcs->codingGroup = SMS_CBMSG_CODGRP_GENERAL_DCS;
952                 pDcs->langType = (SMS_CBMSG_LANG_TYPE_T)dcsData;
953         }
954         break;
955
956         case 0x01: {
957                 if (dcsData == 0x10 || dcsData == 0x11) {
958                         pDcs->codingGroup = SMS_CBMSG_CODGRP_GENERAL_DCS;
959                         pDcs->codingScheme = (dcsData & 0x01) ? SMS_CHARSET_UCS2 : SMS_CHARSET_7BIT;
960                         pDcs->langType = SMS_CBMSG_LANG_ISO639;
961                         MSG_DEBUG("codingScheme: [%d]", pDcs->codingScheme);
962                         if (pMsgData[0] && pMsgData[1]) {
963                                 pDcs->iso639Lang[0] = pMsgData[0] & 0x7F;
964                                 pDcs->iso639Lang[1] = (pMsgData[0] & 0X80) >> 7;
965                                 pDcs->iso639Lang[1] |= (pMsgData[1] & 0X3F) << 1;
966                                 pDcs->iso639Lang[2] = 0x13;  /* CR */
967                         } else {
968                                 /* Default it to English if pMsgData is NULL */
969                                 pDcs->iso639Lang[0] = 0x45;  /* E */
970                                 pDcs->iso639Lang[1] = 0x4E;  /* N */
971                                 pDcs->iso639Lang[2] = 0x13;  /* CR */
972                         }
973                 }
974         }
975         break;
976
977         case 0x04:
978         case 0x05:
979         case 0x06:
980         case 0x07: {
981                 pDcs->codingGroup = SMS_CBMSG_CODGRP_GENERAL_DCS;
982
983                 pDcs->bCompressed = (dcsData & 0x20) ? true : false;
984
985                 if (dcsData & 0x10)
986                         pDcs->classType = (SMS_MSG_CLASS_T)(dcsData & 0x03);
987
988                 unsigned char tmpScheme = (dcsData & 0x0C) >> 2;
989
990                 switch (tmpScheme) {
991                 case 0x00:
992                         pDcs->codingScheme = SMS_CHARSET_7BIT;
993                         break;
994                 case 0x01:
995                         pDcs->codingScheme = SMS_CHARSET_8BIT;
996                         break;
997                 case 0x02:
998                         pDcs->codingScheme = SMS_CHARSET_UCS2;
999                         break;
1000                 default:
1001                         MSG_DEBUG("tmpScheme: [%d]", tmpScheme);
1002                         break;
1003                 }
1004         }
1005         break;
1006
1007         case 0x09: {
1008                 pDcs->bUDH = true;
1009                 pDcs->classType = (MSG_CLASS_TYPE_T)(dcsData & 0x03);
1010                 pDcs->codingScheme = (SMS_CODING_SCHEME_T)((dcsData & 0x0C) >> 2);
1011         }
1012         break;
1013
1014         case 0x0E: {
1015                 pDcs->codingGroup = SMS_CBMSG_CODGRP_WAP;
1016         }
1017         break;
1018
1019         case 0x0F: {
1020                 pDcs->codingGroup = SMS_CBMSG_CODGRP_CLASS_CODING;
1021                 pDcs->codingScheme = (dcsData & 0x04) ? SMS_CHARSET_8BIT : SMS_CHARSET_7BIT;
1022                 pDcs->classType = (MSG_CLASS_TYPE_T)(dcsData & 0x03);
1023         }
1024         break;
1025         default:
1026                 MSG_DEBUG("codingGrp: [0x%x]", codingGrp);
1027                 break;
1028         }
1029 }
1030
1031
1032 void SmsPluginCbMsgHandler::convertLangType(SMS_CBMSG_LANG_TYPE_T InType , MSG_CB_LANGUAGE_TYPE_T *pOutType)
1033 {
1034         switch (InType) {
1035         case SMS_CBMSG_LANG_GERMAN :
1036                 *pOutType = MSG_CBLANG_TYPE_GER;
1037                 break;
1038
1039         case SMS_CBMSG_LANG_ENGLISH :
1040                 *pOutType = MSG_CBLANG_TYPE_ENG;
1041                 break;
1042
1043         case SMS_CBMSG_LANG_ITALIAN :
1044                 *pOutType = MSG_CBLANG_TYPE_ITA;
1045                 break;
1046
1047         case SMS_CBMSG_LANG_FRENCH :
1048                 *pOutType = MSG_CBLANG_TYPE_FRE;
1049                 break;
1050
1051         case SMS_CBMSG_LANG_SPANISH :
1052                 *pOutType = MSG_CBLANG_TYPE_SPA;
1053                 break;
1054
1055         case SMS_CBMSG_LANG_DUTCH :
1056                 *pOutType = MSG_CBLANG_TYPE_NED;
1057                 break;
1058
1059         case SMS_CBMSG_LANG_SWEDISH :
1060                 *pOutType = MSG_CBLANG_TYPE_SWE;
1061                 break;
1062
1063         case SMS_CBMSG_LANG_PORTUGUESE :
1064                 *pOutType = MSG_CBLANG_TYPE_POR;
1065                 break;
1066
1067         case SMS_CBMSG_LANG_TURKISH :
1068                 *pOutType = MSG_CBLANG_TYPE_TUR;
1069                 break;
1070
1071         default :
1072                 *pOutType = MSG_CBLANG_TYPE_MAX;
1073                 break;
1074         }
1075 }
1076
1077
1078 unsigned long SmsPluginCbMsgHandler::getRecvTime()
1079 {
1080         time_t recvTime;
1081
1082         recvTime = time(NULL);
1083
1084         return (unsigned long)recvTime;
1085 }
1086
1087
1088 void SmsPluginCbMsgHandler::getDisplayName(unsigned short       MsgId, char *pDisplayName, msg_sim_slot_id_t simIndex)
1089 {
1090         MSG_CB_CHANNEL_S cbChannelInfo = {0, };
1091         msg_error_t err = MSG_SUCCESS;
1092         MsgDbHandler *dbHandle = getDbHandle();
1093
1094         err = MsgStoGetCBChannelInfo(dbHandle, &cbChannelInfo, simIndex);
1095         MSG_DEBUG("MsgStoGetCBChannelInfo [err = %d]", err);
1096
1097         for (int i = 0; i < cbChannelInfo.channelCnt; i++) {
1098                 if (MsgId >= cbChannelInfo.channelInfo[i].from && MsgId <= cbChannelInfo.channelInfo[i].to) {
1099                         MSG_DEBUG("FIND MSG ID = [%d]", MsgId);
1100 #if 0
1101                         char strTmp[CB_CHANNEL_NAME_MAX + 1];
1102                         memset(strTmp, 0x00, sizeof(strTmp));
1103
1104                         strncpy(strTmp, cbChannelInfo.channelInfo[i].name, CB_CHANNEL_NAME_MAX);
1105
1106                         if (strlen(strTmp) > 0)
1107                                 snprintf(pDisplayName, sizeof(strTmp), "[%s]", strTmp);
1108                         else
1109                                 snprintf(pDisplayName, sizeof(unsigned short), "[%d]", MsgId);
1110 #else
1111
1112 #ifdef MSG_NOTI_INTEGRATION
1113                         snprintf(pDisplayName, MAX_ADDRESS_VAL_LEN + 1, "CB message");
1114 #else
1115                         snprintf(pDisplayName, MAX_ADDRESS_VAL_LEN + 1, "[%d]", MsgId);
1116 #endif
1117
1118 #endif
1119                         return;
1120                 }
1121         }
1122
1123         snprintf(pDisplayName, MAX_ADDRESS_VAL_LEN + 1, "[%d]", MsgId);
1124 }