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.
21 #include "MsgCppTypes.h"
22 #include "MsgException.h"
23 #include "MsgGconfWrapper.h"
24 #include "MsgUtilFile.h"
26 #include "SmsPluginTpduCodec.h"
27 #include "SmsPluginParamCodec.h"
28 #include "SmsPluginUDCodec.h"
31 /*==================================================================================================
32 IMPLEMENTATION OF SmsPluginTpduCodec - Member Functions
33 ==================================================================================================*/
34 SmsPluginTpduCodec::SmsPluginTpduCodec()
41 SmsPluginTpduCodec::~SmsPluginTpduCodec()
48 int SmsPluginTpduCodec::encodeTpdu(const SMS_TPDU_S *pSmsTpdu, char *pTpdu)
52 switch (pSmsTpdu->tpduType)
55 tpduLen = encodeSubmit(&(pSmsTpdu->data.submit), pTpdu);
58 case SMS_TPDU_DELIVER:
59 tpduLen = encodeDeliver(&(pSmsTpdu->data.deliver), pTpdu);
62 case SMS_TPDU_DELIVER_REP:
63 tpduLen = encodeDeliverReport(&(pSmsTpdu->data.deliverRep), pTpdu);
66 case SMS_TPDU_STATUS_REP:
67 tpduLen = encodeStatusReport(&(pSmsTpdu->data.statusRep), pTpdu);
75 int SmsPluginTpduCodec::decodeTpdu(const unsigned char *pTpdu, int TpduLen, SMS_TPDU_S *pSmsTpdu)
79 char mti = pTpdu[0] & 0x03;
84 pSmsTpdu->tpduType = SMS_TPDU_DELIVER;
85 decodeLen = decodeDeliver(pTpdu, TpduLen, &(pSmsTpdu->data.deliver));
89 pSmsTpdu->tpduType = SMS_TPDU_SUBMIT;
90 decodeLen = decodeSubmit(pTpdu, TpduLen, &(pSmsTpdu->data.submit));
94 pSmsTpdu->tpduType = SMS_TPDU_STATUS_REP;
95 decodeLen = decodeStatusReport(pTpdu, TpduLen, &(pSmsTpdu->data.statusRep));
103 int SmsPluginTpduCodec::encodeSubmit(const SMS_SUBMIT_S *pSubmit, char *pTpdu)
105 int offset = 0, length = 0, encodeSize = 0;
107 char* address = NULL;
108 AutoPtr<char> addressBuf(&address);
111 AutoPtr<char> dcsBuf(&dcs);
114 AutoPtr<char> vpBuf(&vpTime);
117 pTpdu[offset] = 0x01;
120 if(pSubmit->bRejectDup == false)
121 pTpdu[offset] |= 0x04;
124 switch (pSubmit->vpf)
126 case SMS_VPF_NOT_PRESENT:
128 case SMS_VPF_ENHANCED:
129 pTpdu[offset] |= 0x08;
131 case SMS_VPF_RELATIVE:
132 pTpdu[offset] |= 0x10;
134 case SMS_VPF_ABSOLUTE:
135 pTpdu[offset] |= 0x18;
142 if (pSubmit->bStatusReport == true)
143 pTpdu[offset] |= 0x20;
145 MSG_DEBUG("TP-SRR pSubmit->bStatusReport : %d.", pSubmit->bStatusReport);
148 if (pSubmit->bHeaderInd == true)
149 pTpdu[offset] |= 0x40;
152 if (pSubmit->bReplyPath == true)
153 pTpdu[offset] |= 0x80;
158 pTpdu[offset++] = pSubmit->msgRef;
160 MSG_DEBUG("TP-MR pSubmit->msgRef : %d.", pSubmit->msgRef);
163 length = SmsPluginParamCodec::encodeAddress(&pSubmit->destAddress, &address);
164 memcpy(&(pTpdu[offset]), address, length);
167 MSG_DEBUG("TP-DA length : %d.", length);
170 pTpdu[offset++] = pSubmit->pid;
172 MSG_DEBUG("TP-PID pSubmit->pid : %d.", pSubmit->pid);
175 length = SmsPluginParamCodec::encodeDCS(&pSubmit->dcs, &dcs);
176 memcpy(&(pTpdu[offset]), dcs, length);
179 MSG_DEBUG("TP-DCS length : %d.", length);
182 if (pSubmit->vpf != SMS_VPF_NOT_PRESENT)
184 length = SmsPluginParamCodec::encodeTime(&pSubmit->validityPeriod, &vpTime);
188 memcpy(&(pTpdu[offset]), vpTime, length);
193 encodeSize = SmsPluginUDCodec::encodeUserData(&(pSubmit->userData), pSubmit->dcs.codingScheme, &(pTpdu[offset]));
195 MSG_DEBUG("encodeSize : %d", encodeSize);
197 offset += encodeSize;
203 int SmsPluginTpduCodec::encodeDeliver(const SMS_DELIVER_S *pDeliver, char *pTpdu)
205 int offset = 0, length = 0, encodeSize = 0;
207 char* address = NULL;
208 AutoPtr<char> addressBuf(&address);
211 AutoPtr<char> dcsBuf(&dcs);
214 AutoPtr<char> timeBuf(&scts);
217 pTpdu[offset] = 0x00;
220 if (pDeliver->bMoreMsg == false)
221 pTpdu[offset] |= 0x04;
224 if (pDeliver->bStatusReport == true)
225 pTpdu[offset] |= 0x20;
228 if (pDeliver->bHeaderInd == true)
229 pTpdu[offset] |= 0x40;
232 if (pDeliver->bReplyPath == true)
233 pTpdu[offset] |= 0x80;
238 length = SmsPluginParamCodec::encodeAddress(&pDeliver->originAddress, &address);
239 memcpy(&(pTpdu[offset]), address, length);
243 pTpdu[offset++] = pDeliver->pid;
246 length = SmsPluginParamCodec::encodeDCS(&pDeliver->dcs, &dcs);
247 memcpy(&(pTpdu[offset]), dcs, length);
251 length = SmsPluginParamCodec::encodeTime(&pDeliver->timeStamp, &scts);
252 memcpy(&(pTpdu[offset]), scts, length);
256 encodeSize = SmsPluginUDCodec::encodeUserData(&(pDeliver->userData), pDeliver->dcs.codingScheme, &(pTpdu[offset]));
258 MSG_DEBUG("encodeSize : %d", encodeSize);
260 offset += encodeSize;
266 int SmsPluginTpduCodec::encodeDeliverReport(const SMS_DELIVER_REPORT_S *pDeliverRep, char *pTpdu)
271 pTpdu[offset] = 0x00;
274 if (pDeliverRep->bHeaderInd == true)
275 pTpdu[offset] |= 0x40;
280 if (pDeliverRep->reportType == SMS_REPORT_NEGATIVE)
281 pTpdu[offset++] = pDeliverRep->failCause;
284 pTpdu[offset++] = pDeliverRep->paramInd;
287 if (pDeliverRep->paramInd & 0x01)
288 pTpdu[offset++] = pDeliverRep->pid;
291 if (pDeliverRep->paramInd & 0x02)
296 AutoPtr<char> dcsBuf(&dcs);
298 length = SmsPluginParamCodec::encodeDCS(&pDeliverRep->dcs, &dcs);
299 memcpy(&(pTpdu[offset]), dcs, length);
305 if (pDeliverRep->paramInd & 0x04)
309 encodeSize = SmsPluginUDCodec::encodeUserData(&(pDeliverRep->userData), pDeliverRep->dcs.codingScheme, &(pTpdu[offset]));
311 MSG_DEBUG("encodeSize : %d", encodeSize);
313 offset += encodeSize;
316 pTpdu[offset] = '\0';
322 int SmsPluginTpduCodec::encodeStatusReport(const SMS_STATUS_REPORT_S *pStatusRep, char *pTpdu)
324 int offset = 0, length = 0;
326 char* address = NULL;
327 AutoPtr<char> addressBuf(&address);
330 AutoPtr<char> sctsBuf(&scts);
333 AutoPtr<char> dtBuf(&dt);
336 pTpdu[offset] = 0x02;
339 if (pStatusRep->bMoreMsg == true)
340 pTpdu[offset] |= 0x04;
343 if (pStatusRep->bStatusReport == true)
344 pTpdu[offset] |= 0x20;
347 if (pStatusRep->bHeaderInd == true)
348 pTpdu[offset] |= 0x40;
353 pTpdu[offset++] = pStatusRep->msgRef;
356 length = SmsPluginParamCodec::encodeAddress(&pStatusRep->recipAddress, &address);
357 memcpy(&(pTpdu[offset]), address, length);
361 length = SmsPluginParamCodec::encodeTime(&pStatusRep->timeStamp, &scts);
362 memcpy(&(pTpdu[offset]), scts, length);
366 length = SmsPluginParamCodec::encodeTime(&pStatusRep->dischargeTime, &dt);
367 memcpy(&(pTpdu[offset]), dt, length);
371 pTpdu[offset++] = pStatusRep->status;
374 pTpdu[offset++] = pStatusRep->paramInd;
377 if (pStatusRep->paramInd & 0x01)
378 pTpdu[offset++] = pStatusRep->pid;
381 if (pStatusRep->paramInd & 0x02)
386 AutoPtr<char> dcsBuf(&dcs);
388 length = SmsPluginParamCodec::encodeDCS(&pStatusRep->dcs, &dcs);
389 memcpy(&(pTpdu[offset]), dcs, length);
395 if (pStatusRep->paramInd & 0x04)
399 encodeSize = SmsPluginUDCodec::encodeUserData(&(pStatusRep->userData), pStatusRep->dcs.codingScheme, &(pTpdu[offset]));
401 MSG_DEBUG("encodeSize : %d", encodeSize);
403 offset += encodeSize;
406 pTpdu[offset] = '\0';
412 int SmsPluginTpduCodec::decodeSubmit(const unsigned char *pTpdu, int TpduLen, SMS_SUBMIT_S *pSubmit)
414 int offset = 0, udLen = 0;
417 if (pTpdu[offset] & 0x04)
418 pSubmit->bRejectDup = false;
420 pSubmit->bRejectDup = true;
423 pSubmit->vpf = (SMS_VPF_T)(pTpdu[offset] & 0x18);
426 if (pTpdu[offset] & 0x20)
427 pSubmit->bStatusReport = true;
429 pSubmit->bStatusReport = false;
432 if (pTpdu[offset] & 0x40)
433 pSubmit->bHeaderInd = true;
435 pSubmit->bHeaderInd = false;
438 if (pTpdu[offset] & 0x80)
439 pSubmit->bReplyPath = true;
441 pSubmit->bReplyPath = false;
446 pSubmit->msgRef = pTpdu[offset++];
449 offset += SmsPluginParamCodec::decodeAddress(pTpdu+offset, &(pSubmit->destAddress));
452 pSubmit->pid = pTpdu[offset++];
455 offset += SmsPluginParamCodec::decodeDCS(pTpdu+offset, &(pSubmit->dcs));
458 if (pSubmit->vpf != SMS_VPF_NOT_PRESENT)
464 udLen = SmsPluginUDCodec::decodeUserData(pTpdu+offset, TpduLen, pSubmit->bHeaderInd, pSubmit->dcs.codingScheme, &(pSubmit->userData));
470 int SmsPluginTpduCodec::decodeDeliver(const unsigned char *pTpdu, int TpduLen, SMS_DELIVER_S *pDeliver)
472 int offset = 0, udLen = 0;
477 memset(temp, 0x00, sizeof(temp));
478 memset(tempcat, 0x00, sizeof(tempcat));
483 sprintf(temp, "[MT] %s", ctime(&rawtime));
485 for (int i = 0; i < TpduLen; i++)
487 sprintf(tempcat, "[%02x]\n", pTpdu[i]);
488 strncat(temp, tempcat, sizeof(temp)-strlen(temp)-1);
489 memset(tempcat, 0x00, sizeof(tempcat));
493 sprintf(tempcat, "\n\n\n");
494 strncat(temp, tempcat, sizeof(temp)-strlen(temp)-1);
496 //MsgOpenCreateAndOverwriteFile(TPDU_LOG_FILE, temp, strlen(temp));
498 pFile = MsgOpenFile(TPDU_LOG_FILE, "a");
499 MsgWriteFile(temp, sizeof(char), strlen(temp), pFile);
505 if (pTpdu[offset] & 0x04)
506 pDeliver->bMoreMsg = false;
508 pDeliver->bMoreMsg = true;
511 if (pTpdu[offset] & 0x20)
512 pDeliver->bStatusReport = true;
514 pDeliver->bStatusReport = false;
517 if (pTpdu[offset] & 0x40)
518 pDeliver->bHeaderInd = true;
520 pDeliver->bHeaderInd = false;
523 if (pTpdu[offset] & 0x80)
524 pDeliver->bReplyPath = true;
526 pDeliver->bReplyPath = false;
531 offset += SmsPluginParamCodec::decodeAddress(&pTpdu[offset], &(pDeliver->originAddress));
534 pDeliver->pid = pTpdu[offset++];
537 offset += SmsPluginParamCodec::decodeDCS(&pTpdu[offset], &(pDeliver->dcs));
540 offset += SmsPluginParamCodec::decodeTime(&pTpdu[offset], &(pDeliver->timeStamp));
543 udLen = SmsPluginUDCodec::decodeUserData(&pTpdu[offset], TpduLen, pDeliver->bHeaderInd, pDeliver->dcs.codingScheme, &(pDeliver->userData), &(pDeliver->udData));
549 int SmsPluginTpduCodec::decodeStatusReport(const unsigned char *pTpdu, int TpduLen, SMS_STATUS_REPORT_S *pStatusRep)
552 printf("\n\n[decodeStatusReport] pTpdu data - Length [%d]\n", TpduLen);
554 for (int i = 0; i < TpduLen; i++)
556 printf(" [%02x]", pTpdu[i]);
561 int offset = 0, udLen = 0;
563 char* address = NULL;
564 AutoPtr<char> addressBuf(&address);
567 AutoPtr<char> sctsBuf(&scts);
570 AutoPtr<char> dtBuf(&dt);
573 if (pTpdu[offset] & 0x04)
574 pStatusRep->bMoreMsg = false;
576 pStatusRep->bMoreMsg = true;
579 if (pTpdu[offset] & 0x20)
580 pStatusRep->bStatusReport = true;
582 pStatusRep->bStatusReport = false;
585 if (pTpdu[offset] & 0x40)
586 pStatusRep->bHeaderInd = true;
588 pStatusRep->bHeaderInd = false;
593 pStatusRep->msgRef = pTpdu[offset++];
596 offset += SmsPluginParamCodec::decodeAddress(&pTpdu[offset], &(pStatusRep->recipAddress));
600 offset += SmsPluginParamCodec::decodeTime(&pTpdu[offset], &(pStatusRep->timeStamp));
604 offset += SmsPluginParamCodec::decodeTime(&pTpdu[offset], &(pStatusRep->dischargeTime));
607 pStatusRep->status = pTpdu[offset++];
610 pStatusRep->paramInd = pTpdu[offset++];
613 if (pStatusRep->paramInd == 0)
615 pStatusRep->pid = SMS_PID_NORMAL;
617 pStatusRep->dcs.bCompressed = false;
618 pStatusRep->dcs.bMWI = false;
619 pStatusRep->dcs.bIndActive = false;
621 pStatusRep->dcs.msgClass = MSG_CLASS_NONE;
622 pStatusRep->dcs.codingScheme = SMS_CHARSET_7BIT;
623 pStatusRep->dcs.codingGroup = SMS_GROUP_GENERAL;
624 pStatusRep->dcs.indType = SMS_OTHER_INDICATOR;
626 pStatusRep->userData.headerCnt = 0;
627 pStatusRep->userData.length = 0;
628 memset(pStatusRep->userData.data, 0x00, MAX_USER_DATA_LEN+1);
632 if (pStatusRep->paramInd & 0x01)
633 pStatusRep->pid = pTpdu[offset++];
636 if (pStatusRep->paramInd & 0x02)
638 offset += SmsPluginParamCodec::decodeDCS(&pTpdu[offset], &(pStatusRep->dcs));
642 if (pStatusRep->paramInd & 0x04)
645 udLen = SmsPluginUDCodec::decodeUserData(&pTpdu[offset], TpduLen, pStatusRep->bHeaderInd, pStatusRep->dcs.codingScheme, &(pStatusRep->userData));