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;
475 if (pTpdu[offset] & 0x04)
476 pDeliver->bMoreMsg = false;
478 pDeliver->bMoreMsg = true;
481 if (pTpdu[offset] & 0x20)
482 pDeliver->bStatusReport = true;
484 pDeliver->bStatusReport = false;
487 if (pTpdu[offset] & 0x40)
488 pDeliver->bHeaderInd = true;
490 pDeliver->bHeaderInd = false;
493 if (pTpdu[offset] & 0x80)
494 pDeliver->bReplyPath = true;
496 pDeliver->bReplyPath = false;
501 offset += SmsPluginParamCodec::decodeAddress(&pTpdu[offset], &(pDeliver->originAddress));
504 pDeliver->pid = pTpdu[offset++];
507 offset += SmsPluginParamCodec::decodeDCS(&pTpdu[offset], &(pDeliver->dcs));
510 offset += SmsPluginParamCodec::decodeTime(&pTpdu[offset], &(pDeliver->timeStamp));
513 udLen = SmsPluginUDCodec::decodeUserData(&pTpdu[offset], TpduLen, pDeliver->bHeaderInd, pDeliver->dcs.codingScheme, &(pDeliver->userData), &(pDeliver->udData));
519 int SmsPluginTpduCodec::decodeStatusReport(const unsigned char *pTpdu, int TpduLen, SMS_STATUS_REPORT_S *pStatusRep)
521 int offset = 0, udLen = 0;
523 char* address = NULL;
524 AutoPtr<char> addressBuf(&address);
527 AutoPtr<char> sctsBuf(&scts);
530 AutoPtr<char> dtBuf(&dt);
533 if (pTpdu[offset] & 0x04)
534 pStatusRep->bMoreMsg = false;
536 pStatusRep->bMoreMsg = true;
539 if (pTpdu[offset] & 0x20)
540 pStatusRep->bStatusReport = true;
542 pStatusRep->bStatusReport = false;
545 if (pTpdu[offset] & 0x40)
546 pStatusRep->bHeaderInd = true;
548 pStatusRep->bHeaderInd = false;
553 pStatusRep->msgRef = pTpdu[offset++];
556 offset += SmsPluginParamCodec::decodeAddress(&pTpdu[offset], &(pStatusRep->recipAddress));
560 offset += SmsPluginParamCodec::decodeTime(&pTpdu[offset], &(pStatusRep->timeStamp));
564 offset += SmsPluginParamCodec::decodeTime(&pTpdu[offset], &(pStatusRep->dischargeTime));
567 pStatusRep->status = pTpdu[offset++];
570 pStatusRep->paramInd = pTpdu[offset++];
573 if (pStatusRep->paramInd == 0)
575 pStatusRep->pid = SMS_PID_NORMAL;
577 pStatusRep->dcs.bCompressed = false;
578 pStatusRep->dcs.bMWI = false;
579 pStatusRep->dcs.bIndActive = false;
581 pStatusRep->dcs.msgClass = MSG_CLASS_NONE;
582 pStatusRep->dcs.codingScheme = SMS_CHARSET_7BIT;
583 pStatusRep->dcs.codingGroup = SMS_GROUP_GENERAL;
584 pStatusRep->dcs.indType = SMS_OTHER_INDICATOR;
586 pStatusRep->userData.headerCnt = 0;
587 pStatusRep->userData.length = 0;
588 memset(pStatusRep->userData.data, 0x00, MAX_USER_DATA_LEN+1);
592 if (pStatusRep->paramInd & 0x01)
593 pStatusRep->pid = pTpdu[offset++];
596 if (pStatusRep->paramInd & 0x02)
598 offset += SmsPluginParamCodec::decodeDCS(&pTpdu[offset], &(pStatusRep->dcs));
602 if (pStatusRep->paramInd & 0x04)
605 udLen = SmsPluginUDCodec::decodeUserData(&pTpdu[offset], TpduLen, pStatusRep->bHeaderInd, pStatusRep->dcs.codingScheme, &(pStatusRep->userData));