3 * Copyright (c) 2000-2012 Samsung Electronics Co., Ltd. All Rights Reserved.
5 * This file is part of msg-service.
7 * Contact: Jaeyun Jeong <jyjeong@samsung.com>
8 * Sangkoo Kim <sangkoo.kim@samsung.com>
9 * Seunghwan Lee <sh.cat.lee@samsung.com>
10 * SoonMin Jung <sm0415.jung@samsung.com>
11 * Jae-Young Lee <jy4710.lee@samsung.com>
12 * KeeBum Kim <keebum.kim@samsung.com>
14 * PROPRIETARY/CONFIDENTIAL
16 * This software is the confidential and proprietary information of
17 * SAMSUNG ELECTRONICS ("Confidential Information"). You shall not
18 * disclose such Confidential Information and shall use it only in
19 * accordance with the terms of the license agreement you entered
20 * into with SAMSUNG ELECTRONICS.
22 * SAMSUNG make no representations or warranties about the suitability
23 * of the software, either express or implied, including but not limited
24 * to the implied warranties of merchantability, fitness for a particular
25 * purpose, or non-infringement. SAMSUNG shall not be liable for any
26 * damages suffered by licensee as a result of using, modifying or
27 * distributing this software or its derivatives.
35 #include "MsgCppTypes.h"
36 #include "MsgException.h"
37 #include "MsgGconfWrapper.h"
38 #include "MsgUtilFile.h"
40 #include "SmsPluginTpduCodec.h"
41 #include "SmsPluginParamCodec.h"
42 #include "SmsPluginUDCodec.h"
45 /*==================================================================================================
46 IMPLEMENTATION OF SmsPluginTpduCodec - Member Functions
47 ==================================================================================================*/
48 SmsPluginTpduCodec::SmsPluginTpduCodec()
55 SmsPluginTpduCodec::~SmsPluginTpduCodec()
62 int SmsPluginTpduCodec::encodeTpdu(const SMS_TPDU_S *pSmsTpdu, char *pTpdu)
66 switch (pSmsTpdu->tpduType)
69 tpduLen = encodeSubmit(&(pSmsTpdu->data.submit), pTpdu);
72 case SMS_TPDU_DELIVER:
73 tpduLen = encodeDeliver(&(pSmsTpdu->data.deliver), pTpdu);
76 case SMS_TPDU_DELIVER_REP:
77 tpduLen = encodeDeliverReport(&(pSmsTpdu->data.deliverRep), pTpdu);
80 case SMS_TPDU_STATUS_REP:
81 tpduLen = encodeStatusReport(&(pSmsTpdu->data.statusRep), pTpdu);
89 int SmsPluginTpduCodec::decodeTpdu(const unsigned char *pTpdu, int TpduLen, SMS_TPDU_S *pSmsTpdu)
93 char mti = pTpdu[0] & 0x03;
98 pSmsTpdu->tpduType = SMS_TPDU_DELIVER;
99 decodeLen = decodeDeliver(pTpdu, TpduLen, &(pSmsTpdu->data.deliver));
103 pSmsTpdu->tpduType = SMS_TPDU_SUBMIT;
104 decodeLen = decodeSubmit(pTpdu, TpduLen, &(pSmsTpdu->data.submit));
108 pSmsTpdu->tpduType = SMS_TPDU_STATUS_REP;
109 decodeLen = decodeStatusReport(pTpdu, TpduLen, &(pSmsTpdu->data.statusRep));
117 int SmsPluginTpduCodec::encodeSubmit(const SMS_SUBMIT_S *pSubmit, char *pTpdu)
119 int offset = 0, length = 0, encodeSize = 0;
121 char* address = NULL;
122 AutoPtr<char> addressBuf(&address);
125 AutoPtr<char> dcsBuf(&dcs);
128 AutoPtr<char> vpBuf(&vpTime);
131 pTpdu[offset] = 0x01;
134 if(pSubmit->bRejectDup == false)
135 pTpdu[offset] |= 0x04;
138 switch (pSubmit->vpf)
140 case SMS_VPF_NOT_PRESENT:
142 case SMS_VPF_ENHANCED:
143 pTpdu[offset] |= 0x08;
145 case SMS_VPF_RELATIVE:
146 pTpdu[offset] |= 0x10;
148 case SMS_VPF_ABSOLUTE:
149 pTpdu[offset] |= 0x18;
156 if (pSubmit->bStatusReport == true)
157 pTpdu[offset] |= 0x20;
159 MSG_DEBUG("TP-SRR pSubmit->bStatusReport : %d.", pSubmit->bStatusReport);
162 if (pSubmit->bHeaderInd == true)
163 pTpdu[offset] |= 0x40;
166 if (pSubmit->bReplyPath == true)
167 pTpdu[offset] |= 0x80;
172 pTpdu[offset++] = pSubmit->msgRef;
174 MSG_DEBUG("TP-MR pSubmit->msgRef : %d.", pSubmit->msgRef);
177 length = SmsPluginParamCodec::encodeAddress(&pSubmit->destAddress, &address);
178 memcpy(&(pTpdu[offset]), address, length);
181 MSG_DEBUG("TP-DA length : %d.", length);
184 pTpdu[offset++] = pSubmit->pid;
186 MSG_DEBUG("TP-PID pSubmit->pid : %d.", pSubmit->pid);
189 length = SmsPluginParamCodec::encodeDCS(&pSubmit->dcs, &dcs);
190 memcpy(&(pTpdu[offset]), dcs, length);
193 MSG_DEBUG("TP-DCS length : %d.", length);
196 if (pSubmit->vpf != SMS_VPF_NOT_PRESENT)
198 length = SmsPluginParamCodec::encodeTime(&pSubmit->validityPeriod, &vpTime);
202 memcpy(&(pTpdu[offset]), vpTime, length);
207 encodeSize = SmsPluginUDCodec::encodeUserData(&(pSubmit->userData), pSubmit->dcs.codingScheme, &(pTpdu[offset]));
209 MSG_DEBUG("encodeSize : %d", encodeSize);
211 offset += encodeSize;
217 int SmsPluginTpduCodec::encodeDeliver(const SMS_DELIVER_S *pDeliver, char *pTpdu)
219 int offset = 0, length = 0, encodeSize = 0;
221 char* address = NULL;
222 AutoPtr<char> addressBuf(&address);
225 AutoPtr<char> dcsBuf(&dcs);
228 AutoPtr<char> timeBuf(&scts);
231 pTpdu[offset] = 0x00;
234 if (pDeliver->bMoreMsg == false)
235 pTpdu[offset] |= 0x04;
238 if (pDeliver->bStatusReport == true)
239 pTpdu[offset] |= 0x20;
242 if (pDeliver->bHeaderInd == true)
243 pTpdu[offset] |= 0x40;
246 if (pDeliver->bReplyPath == true)
247 pTpdu[offset] |= 0x80;
252 length = SmsPluginParamCodec::encodeAddress(&pDeliver->originAddress, &address);
253 memcpy(&(pTpdu[offset]), address, length);
257 pTpdu[offset++] = pDeliver->pid;
260 length = SmsPluginParamCodec::encodeDCS(&pDeliver->dcs, &dcs);
261 memcpy(&(pTpdu[offset]), dcs, length);
265 length = SmsPluginParamCodec::encodeTime(&pDeliver->timeStamp, &scts);
266 memcpy(&(pTpdu[offset]), scts, length);
270 encodeSize = SmsPluginUDCodec::encodeUserData(&(pDeliver->userData), pDeliver->dcs.codingScheme, &(pTpdu[offset]));
272 MSG_DEBUG("encodeSize : %d", encodeSize);
274 offset += encodeSize;
280 int SmsPluginTpduCodec::encodeDeliverReport(const SMS_DELIVER_REPORT_S *pDeliverRep, char *pTpdu)
285 pTpdu[offset] = 0x00;
288 if (pDeliverRep->bHeaderInd == true)
289 pTpdu[offset] |= 0x40;
294 if (pDeliverRep->reportType == SMS_REPORT_NEGATIVE)
295 pTpdu[offset++] = pDeliverRep->failCause;
298 pTpdu[offset++] = pDeliverRep->paramInd;
301 if (pDeliverRep->paramInd & 0x01)
302 pTpdu[offset++] = pDeliverRep->pid;
305 if (pDeliverRep->paramInd & 0x02)
310 AutoPtr<char> dcsBuf(&dcs);
312 length = SmsPluginParamCodec::encodeDCS(&pDeliverRep->dcs, &dcs);
313 memcpy(&(pTpdu[offset]), dcs, length);
319 if (pDeliverRep->paramInd & 0x04)
323 encodeSize = SmsPluginUDCodec::encodeUserData(&(pDeliverRep->userData), pDeliverRep->dcs.codingScheme, &(pTpdu[offset]));
325 MSG_DEBUG("encodeSize : %d", encodeSize);
327 offset += encodeSize;
330 pTpdu[offset] = '\0';
336 int SmsPluginTpduCodec::encodeStatusReport(const SMS_STATUS_REPORT_S *pStatusRep, char *pTpdu)
338 int offset = 0, length = 0;
340 char* address = NULL;
341 AutoPtr<char> addressBuf(&address);
344 AutoPtr<char> sctsBuf(&scts);
347 AutoPtr<char> dtBuf(&dt);
350 pTpdu[offset] = 0x02;
353 if (pStatusRep->bMoreMsg == true)
354 pTpdu[offset] |= 0x04;
357 if (pStatusRep->bStatusReport == true)
358 pTpdu[offset] |= 0x20;
361 if (pStatusRep->bHeaderInd == true)
362 pTpdu[offset] |= 0x40;
367 pTpdu[offset++] = pStatusRep->msgRef;
370 length = SmsPluginParamCodec::encodeAddress(&pStatusRep->recipAddress, &address);
371 memcpy(&(pTpdu[offset]), address, length);
375 length = SmsPluginParamCodec::encodeTime(&pStatusRep->timeStamp, &scts);
376 memcpy(&(pTpdu[offset]), scts, length);
380 length = SmsPluginParamCodec::encodeTime(&pStatusRep->dischargeTime, &dt);
381 memcpy(&(pTpdu[offset]), dt, length);
385 pTpdu[offset++] = pStatusRep->status;
388 pTpdu[offset++] = pStatusRep->paramInd;
391 if (pStatusRep->paramInd & 0x01)
392 pTpdu[offset++] = pStatusRep->pid;
395 if (pStatusRep->paramInd & 0x02)
400 AutoPtr<char> dcsBuf(&dcs);
402 length = SmsPluginParamCodec::encodeDCS(&pStatusRep->dcs, &dcs);
403 memcpy(&(pTpdu[offset]), dcs, length);
409 if (pStatusRep->paramInd & 0x04)
413 encodeSize = SmsPluginUDCodec::encodeUserData(&(pStatusRep->userData), pStatusRep->dcs.codingScheme, &(pTpdu[offset]));
415 MSG_DEBUG("encodeSize : %d", encodeSize);
417 offset += encodeSize;
420 pTpdu[offset] = '\0';
426 int SmsPluginTpduCodec::decodeSubmit(const unsigned char *pTpdu, int TpduLen, SMS_SUBMIT_S *pSubmit)
428 int offset = 0, udLen = 0;
431 if (pTpdu[offset] & 0x04)
432 pSubmit->bRejectDup = false;
434 pSubmit->bRejectDup = true;
437 pSubmit->vpf = (SMS_VPF_T)(pTpdu[offset] & 0x18);
440 if (pTpdu[offset] & 0x20)
441 pSubmit->bStatusReport = true;
443 pSubmit->bStatusReport = false;
446 if (pTpdu[offset] & 0x40)
447 pSubmit->bHeaderInd = true;
449 pSubmit->bHeaderInd = false;
452 if (pTpdu[offset] & 0x80)
453 pSubmit->bReplyPath = true;
455 pSubmit->bReplyPath = false;
460 pSubmit->msgRef = pTpdu[offset++];
463 offset += SmsPluginParamCodec::decodeAddress(pTpdu+offset, &(pSubmit->destAddress));
466 pSubmit->pid = pTpdu[offset++];
469 offset += SmsPluginParamCodec::decodeDCS(pTpdu+offset, &(pSubmit->dcs));
472 if (pSubmit->vpf != SMS_VPF_NOT_PRESENT)
478 udLen = SmsPluginUDCodec::decodeUserData(pTpdu+offset, TpduLen, pSubmit->bHeaderInd, pSubmit->dcs.codingScheme, &(pSubmit->userData));
484 int SmsPluginTpduCodec::decodeDeliver(const unsigned char *pTpdu, int TpduLen, SMS_DELIVER_S *pDeliver)
486 int offset = 0, udLen = 0;
489 if (pTpdu[offset] & 0x04)
490 pDeliver->bMoreMsg = false;
492 pDeliver->bMoreMsg = true;
495 if (pTpdu[offset] & 0x20)
496 pDeliver->bStatusReport = true;
498 pDeliver->bStatusReport = false;
501 if (pTpdu[offset] & 0x40)
502 pDeliver->bHeaderInd = true;
504 pDeliver->bHeaderInd = false;
507 if (pTpdu[offset] & 0x80)
508 pDeliver->bReplyPath = true;
510 pDeliver->bReplyPath = false;
515 offset += SmsPluginParamCodec::decodeAddress(&pTpdu[offset], &(pDeliver->originAddress));
518 pDeliver->pid = pTpdu[offset++];
521 offset += SmsPluginParamCodec::decodeDCS(&pTpdu[offset], &(pDeliver->dcs));
524 offset += SmsPluginParamCodec::decodeTime(&pTpdu[offset], &(pDeliver->timeStamp));
527 udLen = SmsPluginUDCodec::decodeUserData(&pTpdu[offset], TpduLen, pDeliver->bHeaderInd, pDeliver->dcs.codingScheme, &(pDeliver->userData), &(pDeliver->udData));
533 int SmsPluginTpduCodec::decodeStatusReport(const unsigned char *pTpdu, int TpduLen, SMS_STATUS_REPORT_S *pStatusRep)
535 int offset = 0, udLen = 0;
537 char* address = NULL;
538 AutoPtr<char> addressBuf(&address);
541 AutoPtr<char> sctsBuf(&scts);
544 AutoPtr<char> dtBuf(&dt);
547 if (pTpdu[offset] & 0x04)
548 pStatusRep->bMoreMsg = false;
550 pStatusRep->bMoreMsg = true;
553 if (pTpdu[offset] & 0x20)
554 pStatusRep->bStatusReport = true;
556 pStatusRep->bStatusReport = false;
559 if (pTpdu[offset] & 0x40)
560 pStatusRep->bHeaderInd = true;
562 pStatusRep->bHeaderInd = false;
567 pStatusRep->msgRef = pTpdu[offset++];
570 offset += SmsPluginParamCodec::decodeAddress(&pTpdu[offset], &(pStatusRep->recipAddress));
574 offset += SmsPluginParamCodec::decodeTime(&pTpdu[offset], &(pStatusRep->timeStamp));
578 offset += SmsPluginParamCodec::decodeTime(&pTpdu[offset], &(pStatusRep->dischargeTime));
581 pStatusRep->status = pTpdu[offset++];
584 pStatusRep->paramInd = pTpdu[offset++];
587 if (pStatusRep->paramInd == 0)
589 pStatusRep->pid = SMS_PID_NORMAL;
591 pStatusRep->dcs.bCompressed = false;
592 pStatusRep->dcs.bMWI = false;
593 pStatusRep->dcs.bIndActive = false;
595 pStatusRep->dcs.msgClass = MSG_CLASS_NONE;
596 pStatusRep->dcs.codingScheme = SMS_CHARSET_7BIT;
597 pStatusRep->dcs.codingGroup = SMS_GROUP_GENERAL;
598 pStatusRep->dcs.indType = SMS_OTHER_INDICATOR;
600 pStatusRep->userData.headerCnt = 0;
601 pStatusRep->userData.length = 0;
602 memset(pStatusRep->userData.data, 0x00, MAX_USER_DATA_LEN+1);
606 if (pStatusRep->paramInd & 0x01)
607 pStatusRep->pid = pTpdu[offset++];
610 if (pStatusRep->paramInd & 0x02)
612 offset += SmsPluginParamCodec::decodeDCS(&pTpdu[offset], &(pStatusRep->dcs));
616 if (pStatusRep->paramInd & 0x04)
619 udLen = SmsPluginUDCodec::decodeUserData(&pTpdu[offset], TpduLen, pStatusRep->bHeaderInd, pStatusRep->dcs.codingScheme, &(pStatusRep->userData));