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.
39 #include "MsgMmsTypes.h"
40 #include "MsgMmsMessage.h"
42 #include "MsgUtilFile.h"
43 #include "MsgStorageTypes.h"
44 #include "MsgInternalTypes.h"
47 MMS_SMIL_ROOTLAYOUT rootlayout;
49 static void __release_glist_element(gpointer data, gpointer user_data);
50 static void __release_page_element(gpointer data, gpointer user_data);
52 int msg_verify_number(const char *raw, char *trimmed)
54 if (!(raw && trimmed)) {
55 MSG_DEBUG("Phone Number is NULL");
56 return MSG_ERR_NULL_POINTER;
59 for (int i = 0, j = 0; raw[i]; i++) {
60 if ((raw[i] >= '0' && raw[i] <= '9') || (raw[i] == ',') || raw[i] == ' ' || raw[i] == '+') {
61 trimmed[j++] = raw[i];
62 } else if (raw[i] == '-') {
65 MSG_DEBUG("Unacceptable character in telephone number: [%c]", raw[i]);
66 return MSG_ERR_INVALID_PARAMETER;
70 MSG_DEBUG("Trimming [%s]->[%s]", raw, trimmed);
74 int msg_verify_email(const char *raw)
80 MSG_DEBUG("Email is NULL");
81 return MSG_ERR_NULL_POINTER;
84 for (int i = 0; raw[i]; i++) {
89 if (atExist == false) {
93 MSG_DEBUG("Character [@] is included more than twice in email address.");
94 return MSG_ERR_INVALID_PARAMETER;
98 if ((raw[i] >= '0' && raw[i] <= '9') || raw[i] == ' ' || raw[i] == '+') {
100 } else if ((raw[i] >= 'a' && raw[i] <= 'z') ||(raw[i] >= 'A' && raw[i] <= 'Z') ||(raw[i] == '.') || raw[i] == '_' || raw[i] == '-') {
103 } else if (raw[i] == ',') {
104 if (onlyNum == false && atExist == false) {
105 MSG_DEBUG("Unacceptable type in address.");
106 return MSG_ERR_INVALID_PARAMETER;
112 MSG_DEBUG("Unacceptable character in address : [%c]", raw[i]);
113 return MSG_ERR_INVALID_PARAMETER;
120 static void __release_glist_element(gpointer data, gpointer user_data)
127 static void __release_page_element(gpointer data, gpointer user_data)
130 MMS_PAGE_S *page = (MMS_PAGE_S *)data;
132 if (page->medialist) {
133 MMS_MEDIA_S *media = NULL;
134 int mediaCnt = g_list_length(page->medialist);
136 for (int i = 0; i < mediaCnt; i++) {
137 media = (MMS_MEDIA_S *)g_list_nth_data(page->medialist, i);
142 g_list_free(page->medialist);
143 page->medialist = NULL;
151 MSG_ERROR_T _MsgMmsReleasePageList(MMS_MESSAGE_DATA_S *pMsgData)
153 if (pMsgData == NULL) {
154 MSG_DEBUG("pMsgData is NULL");
155 return MSG_ERR_INVALID_PARAMETER;
158 if (pMsgData->pagelist) {
159 g_list_foreach(pMsgData->pagelist, __release_page_element, NULL);
160 g_list_free(pMsgData->pagelist);
161 pMsgData->pagelist = NULL;
164 pMsgData->pageCnt = 0;
169 MSG_ERROR_T _MsgMmsReleaseRegionList(MMS_MESSAGE_DATA_S *pMsgData)
171 if (pMsgData == NULL) {
172 MSG_DEBUG("pMsgData is NULL");
173 return MSG_ERR_INVALID_PARAMETER;
176 if (pMsgData->regionlist) {
177 g_list_foreach(pMsgData->regionlist, __release_glist_element, NULL);
178 g_list_free(pMsgData->regionlist);
179 pMsgData->regionlist = NULL;
182 pMsgData->regionCnt = 0;
187 MSG_ERROR_T _MsgMmsReleaseAttachList(MMS_MESSAGE_DATA_S *pMsgData)
189 if (pMsgData == NULL) {
190 MSG_DEBUG("pMsgData is NULL");
191 return MSG_ERR_INVALID_PARAMETER;
194 if (pMsgData->attachlist) {
195 g_list_foreach(pMsgData->attachlist, __release_glist_element, NULL);
196 g_list_free(pMsgData->attachlist);
197 pMsgData->attachlist = NULL;
200 pMsgData->attachCnt = 0;
205 MSG_ERROR_T _MsgMmsReleaseTransitionList(MMS_MESSAGE_DATA_S *pMsgData)
207 if (pMsgData == NULL) {
208 MSG_DEBUG("pMsgData is NULL");
209 return MSG_ERR_INVALID_PARAMETER;
212 if (pMsgData->transitionlist) {
213 g_list_foreach(pMsgData->transitionlist, __release_glist_element, NULL);
214 g_list_free(pMsgData->transitionlist);
215 pMsgData->transitionlist = NULL;
218 pMsgData->transitionCnt = 0;
223 MSG_ERROR_T _MsgMmsReleaseMetaList(MMS_MESSAGE_DATA_S *pMsgData)
225 if (pMsgData == NULL) {
226 MSG_DEBUG("pMsgData is NULL");
227 return MSG_ERR_INVALID_PARAMETER;
230 if (pMsgData->metalist) {
231 g_list_foreach(pMsgData->metalist, __release_glist_element, NULL);
232 g_list_free(pMsgData->metalist);
233 pMsgData->metalist = NULL;
236 pMsgData->metaCnt = 0;
241 MSG_ERROR_T _MsgMmsAddRegion(MMS_MESSAGE_DATA_S *pMsgData, MMS_SMIL_REGION* pRegion)
243 if(pMsgData == NULL || pRegion == NULL)
244 return MSG_ERR_INVALID_PARAMETER;
246 pMsgData->regionlist = g_list_append(pMsgData->regionlist, pRegion);
247 pMsgData->regionCnt++;
252 MSG_ERROR_T _MsgMmsAddPage(MMS_MESSAGE_DATA_S *pMsgData, MMS_PAGE_S *pPage)
254 if(pMsgData == NULL || pPage == NULL)
255 return MSG_ERR_INVALID_PARAMETER;
257 pMsgData->pagelist = g_list_append(pMsgData->pagelist, pPage);
263 MSG_ERROR_T _MsgMmsAddMedia(MMS_PAGE_S* pPage, MMS_MEDIA_S *pMedia)
265 if(pPage == NULL || pMedia == NULL)
266 return MSG_ERR_INVALID_PARAMETER;
268 pPage->medialist = g_list_append(pPage->medialist, pMedia);
270 MSG_DEBUG("media's mediatype: %d", pMedia->mediatype);
271 MSG_DEBUG("media's filename: %s", pMedia->szFileName);
272 MSG_DEBUG("media's filepath: %s", pMedia->szFilePath);
273 MSG_DEBUG("media's contentId: %s", pMedia->szContentID);
274 MSG_DEBUG("page's media count: %d", pPage->mediaCnt);
279 MSG_ERROR_T _MsgMmsAddTransition(MMS_MESSAGE_DATA_S *pMsgData, MMS_SMIL_TRANSITION* pTransition)
281 if(pMsgData == NULL || pTransition == NULL)
282 return MSG_ERR_INVALID_PARAMETER;
284 pMsgData->transitionlist = g_list_append(pMsgData->transitionlist, pTransition);
285 pMsgData->transitionCnt++;
290 MSG_ERROR_T _MsgMmsAddMeta(MMS_MESSAGE_DATA_S *pMsgData, MMS_SMIL_META* pMeta)
292 if(pMsgData == NULL || pMeta == NULL)
293 return MSG_ERR_INVALID_PARAMETER;
295 pMsgData->metalist = g_list_append(pMsgData->metalist, pMeta);
301 MSG_ERROR_T _MsgMmsAddAttachment(MMS_MESSAGE_DATA_S *pMsgData, MMS_ATTACH_S *pAttach)
303 if(pMsgData == NULL || pAttach == NULL)
304 return MSG_ERR_INVALID_PARAMETER;
306 pMsgData->attachlist = g_list_append(pMsgData->attachlist, pAttach);
307 pMsgData->attachCnt++;
312 bool _MsgMmsFindMatchedMedia(MMS_MESSAGE_DATA_S *pMsgData, char *pszFilePath)
314 if (pMsgData == NULL || pszFilePath == NULL)
317 if (pMsgData->pagelist) {
318 for (int pageIdx = 0; pageIdx < pMsgData->pageCnt; pageIdx++) {
319 MMS_PAGE_S *page = (MMS_PAGE_S *)g_list_nth_data(pMsgData->pagelist, pageIdx);
321 if (page && page->medialist) {
322 for (int mediaIdx = 0; mediaIdx < page->mediaCnt; mediaIdx++) {
323 MMS_MEDIA_S *media = (MMS_MEDIA_S *)g_list_nth_data(page->medialist, mediaIdx);
325 if (strcmp(pszFilePath, media->szFilePath) == 0)
336 MSG_ERROR_T _MsgMmsAddSmilDoc(char* pSmil, MMS_MESSAGE_DATA_S* pMsgData)
338 MSG_DEBUG("MsgMmsAddSmilDoc");
340 if(pSmil == NULL || pMsgData == NULL)
341 return MSG_ERR_INVALID_PARAMETER;
343 char fullpath[MSG_FILEPATH_LEN_MAX] = {0,};
344 char smilFileName[MSG_FILENAME_LEN_MAX+1] = {0,};
347 //Create smilFileName
349 snprintf(smilFileName, MSG_FILENAME_LEN_MAX+1, "%lu", RawTime);
350 snprintf(fullpath, MSG_FILEPATH_LEN_MAX, "%s%s", MSG_SMIL_FILE_PATH, smilFileName);
352 if (MsgWriteSmilFile(fullpath, pSmil, strlen(pSmil)) == false) {
353 MSG_DEBUG("MsgWriteSmilFile error");
354 return MSG_ERR_MMS_ERROR;
356 strncpy(pMsgData->szSmilFilePath, smilFileName, MSG_FILEPATH_LEN_MAX-1);
362 char* _MsgMmsSerializeMessageData(const MMS_MESSAGE_DATA_S* pMsgData, unsigned int *pSize)
364 MSG_DEBUG("MsgMmsSerializeMessageData");
366 if (pMsgData == NULL)
374 pageCnt = pMsgData->pageCnt;
378 if (pMsgData->pagelist) {
379 for (int pageIdx = 0; pageIdx < pageCnt; pageIdx++) {
380 bufsize += sizeof(int); // Media cnt
382 MMS_PAGE_S *page = (MMS_PAGE_S *)g_list_nth_data(pMsgData->pagelist, pageIdx);
383 mediaCnt = page->mediaCnt;
385 if (page->medialist) {
386 for (int i = 0; i < mediaCnt; i++) {
387 MMS_MEDIA_S *media = (MMS_MEDIA_S *)g_list_nth_data(page->medialist, i);
389 if (media->mediatype == MMS_SMIL_MEDIA_TEXT) {
390 bufsize += (sizeof(MmsSmilMediaType) + MSG_FILENAME_LEN_MAX + 2 * MSG_FILEPATH_LEN_MAX + MSG_MSG_ID_LEN + 1
391 + MAX_SMIL_ALT_LEN + MAX_SMIL_REGION_ID
392 #ifdef __SUPPORT_DRM__
393 + sizeof(MsgDrmType) + MSG_FILEPATH_LEN_MAX
395 + MAX_SMIL_TRANSIN_ID + MAX_SMIL_TRANSOUT_ID +
396 7 * sizeof(int) + 3* sizeof(bool) + sizeof(MmsTextDirection) + sizeof(MmsSmilFontType));
398 bufsize += (sizeof(MmsSmilMediaType) + MSG_FILENAME_LEN_MAX + 2 * MSG_FILEPATH_LEN_MAX + MSG_MSG_ID_LEN + 1
399 + MAX_SMIL_ALT_LEN + MAX_SMIL_REGION_ID
400 #ifdef __SUPPORT_DRM__
401 + sizeof(MsgDrmType) + MSG_FILEPATH_LEN_MAX
403 + MAX_SMIL_TRANSIN_ID + MAX_SMIL_TRANSOUT_ID + 5 * sizeof(int)
409 bufsize += sizeof(int) * 6;
413 bufsize += sizeof(int); // region count;
414 if (pMsgData->regionlist) {
415 int elementSize = g_list_length(pMsgData->regionlist);
416 bufsize += elementSize * (MAX_SMIL_REGION_ID + 4 * sizeof(MMS_LENGTH) + sizeof(int) + sizeof(REGION_FIT_TYPE_T));
419 bufsize += sizeof(int); // attachment count;
420 if (pMsgData->attachlist) {
421 int elementSize = g_list_length(pMsgData->attachlist);
422 bufsize += elementSize * (sizeof(MimeType) + MSG_FILENAME_LEN_MAX + MSG_FILEPATH_LEN_MAX + sizeof(int)
423 #ifdef __SUPPORT_DRM__
424 + sizeof(MsgDrmType) + MSG_FILEPATH_LEN_MAX
429 bufsize += sizeof(int); // transition count;
430 if (pMsgData->transitionlist) {
431 int elementSize = g_list_length(pMsgData->transitionlist);
432 bufsize += elementSize * (MAX_SMIL_TRANSITION_ID + sizeof(MmsSmilTransType) + sizeof(MmsSmilTransSubType) + sizeof(int));
435 bufsize += sizeof(int); // meta count;
436 if (pMsgData->metalist) {
437 int elementSize = g_list_length(pMsgData->metalist);
438 bufsize += elementSize * (MAX_SMIL_META_ID + MAX_SMIL_META_NAME + MAX_SMIL_META_CONTENT);
441 bufsize += sizeof(MMS_SMIL_ROOTLAYOUT);
443 #ifdef FEATURE_JAVA_MMS
444 bufsize += sizeof(MMS_APPID_INFO_S);
447 int filePathLen = strlen(pMsgData->szSmilFilePath);
449 bufsize += sizeof(int) + filePathLen + sizeof(int);
451 MSG_DEBUG("MsgMmsSerializeMessageData: bufsize = %d", bufsize);
453 buf = (char *)calloc(bufsize, 1);
455 // copy file path length
456 MSG_DEBUG("MsgMmsSerializeMessageData: smilFilePath Length = %d", filePathLen);
458 memcpy(buf, &filePathLen, sizeof(int));
460 offset += sizeof(int);
463 MSG_DEBUG("MsgMmsSerializeMessageData: smilFilePath = %s", pMsgData->szSmilFilePath);
465 if (filePathLen > 0) {
466 memcpy(buf + offset, pMsgData->szSmilFilePath, filePathLen);
468 offset += filePathLen;
472 MSG_DEBUG("MsgMmsSerializeMessageData: pageCnt = %d", pMsgData->pageCnt);
474 memcpy(buf + offset, &(pMsgData->pageCnt), sizeof(int));
476 offset += sizeof(int);
478 if (pMsgData->pagelist) {
479 for (int pageIdx = 0; pageIdx < pageCnt; pageIdx++)
481 MMS_PAGE_S *page = (MMS_PAGE_S *)g_list_nth_data(pMsgData->pagelist, pageIdx);
482 mediaCnt = page->mediaCnt;
484 memcpy(buf + offset, &mediaCnt, sizeof(int));
485 offset += sizeof(int);
487 MSG_DEBUG("MsgMmsSerializeMessageData: mediaCnt = %d", mediaCnt);
488 if (page->medialist) {
489 for (int i = 0; i < mediaCnt; ++ i) {
490 MMS_MEDIA_S *media = (MMS_MEDIA_S *)g_list_nth_data(page->medialist, i);
492 memcpy(buf + offset, &(media->mediatype), sizeof(MmsSmilMediaType));
493 offset += sizeof(MmsSmilMediaType);
494 MSG_DEBUG("%d media's mediatype = %d", i, media->mediatype);
496 memcpy(buf + offset, media->szSrc, MSG_FILEPATH_LEN_MAX);
497 offset += MSG_FILEPATH_LEN_MAX;
499 memcpy(buf + offset, media->szFileName, MSG_FILENAME_LEN_MAX);
500 offset += MSG_FILENAME_LEN_MAX;
501 MSG_DEBUG("%d media's filename = %s", i, media->szFileName);
503 memcpy(buf + offset, media->szFilePath, MSG_FILEPATH_LEN_MAX);
504 offset += MSG_FILEPATH_LEN_MAX;
505 MSG_DEBUG("%d media's filepath = %s", i, media->szFilePath);
507 memcpy(buf + offset, media->szContentID, MSG_MSG_ID_LEN + 1);
508 offset += MSG_MSG_ID_LEN + 1;
509 MSG_DEBUG("%d media's contentID = %s", i, media->szContentID);
511 memcpy(buf + offset, media->regionId, MAX_SMIL_REGION_ID);
512 offset += MAX_SMIL_REGION_ID;
513 MSG_DEBUG("%d media's regionId = %s", i, media->regionId);
515 memcpy(buf + offset, media->szAlt, MAX_SMIL_ALT_LEN);
516 offset += MAX_SMIL_ALT_LEN;
518 #ifdef __SUPPORT_DRM__
519 memcpy(buf + offset, &(media->drmType), sizeof(MsgDrmType));
520 offset += sizeof(MsgDrmType);
521 memcpy(buf + offset, media->szDrm2FullPath, MSG_FILEPATH_LEN_MAX);
522 offset += MSG_FILEPATH_LEN_MAX;
525 if (media->mediatype == MMS_SMIL_MEDIA_TEXT) {
526 MSG_DEBUG("##### Media = TEXT #####");
527 memcpy(buf + offset, media->sMedia.sText.szTransInId, MAX_SMIL_TRANSIN_ID);
528 offset += MAX_SMIL_TRANSIN_ID;
530 memcpy(buf + offset, media->sMedia.sText.szTransOutId, MAX_SMIL_TRANSOUT_ID);
531 offset += MAX_SMIL_TRANSOUT_ID;
533 memcpy(buf + offset, &(media->sMedia.sText.nRepeat), sizeof(int));
534 offset += sizeof(int);
536 memcpy(buf + offset, &(media->sMedia.sText.nBegin), sizeof(int));
537 offset += sizeof(int);
539 memcpy(buf + offset, &(media->sMedia.sText.nEnd), sizeof(int));
540 offset += sizeof(int);
542 memcpy(buf + offset, &(media->sMedia.sText.nDurTime), sizeof(int));
543 offset += sizeof(int);
545 memcpy(buf + offset, &(media->sMedia.sText.nBgColor), sizeof(int));
546 offset += sizeof(int);
548 memcpy(buf + offset, &(media->sMedia.sText.bBold), sizeof(bool));
549 offset += sizeof(bool);
551 memcpy(buf + offset, &(media->sMedia.sText.bUnderLine), sizeof(bool));
552 offset += sizeof(bool);
554 memcpy(buf + offset, &(media->sMedia.sText.bItalic), sizeof(bool));
555 offset += sizeof(bool);
557 memcpy(buf + offset, &(media->sMedia.sText.bReverse), sizeof(bool));
558 offset += sizeof(bool);
560 memcpy(buf + offset, &(media->sMedia.sText.nDirection), sizeof(MmsTextDirection));
561 offset += sizeof(MmsTextDirection);
563 //memcpy(buf + offset, &(media->sMedia.sText.nFont), sizeof(MmsSmilFontType));
564 //offset += sizeof(MmsSmilFontType);
566 memcpy(buf + offset, &(media->sMedia.sText.nSize), sizeof(int));
567 offset += sizeof(int);
569 memcpy(buf + offset, &(media->sMedia.sText.nColor), sizeof(int));
570 offset += sizeof(int);
572 MSG_DEBUG("##### Media = IMAGE, AUDIO, VIDEO #####");
573 memcpy(buf + offset, media->sMedia.sAVI.szTransInId, MAX_SMIL_TRANSIN_ID);
574 offset += MAX_SMIL_TRANSIN_ID;
576 memcpy(buf + offset, media->sMedia.sAVI.szTransOutId, MAX_SMIL_TRANSOUT_ID);
577 offset += MAX_SMIL_TRANSOUT_ID;
579 memcpy(buf + offset, &(media->sMedia.sAVI.nRepeat), sizeof(int));
580 offset += sizeof(int);
582 memcpy(buf + offset, &(media->sMedia.sAVI.nBegin), sizeof(int));
583 offset += sizeof(int);
585 memcpy(buf + offset, &(media->sMedia.sAVI.nEnd), sizeof(int));
586 offset += sizeof(int);
588 memcpy(buf + offset, &(media->sMedia.sAVI.nDurTime), sizeof(int));
589 offset += sizeof(int);
591 memcpy(buf + offset, &(media->sMedia.sAVI.nBgColor), sizeof(int));
592 offset += sizeof(int);
597 memcpy(buf + offset, &page->nDur, sizeof(int));
598 offset += sizeof(int);
599 memcpy(buf + offset, &page->nBegin, sizeof(int));
600 offset += sizeof(int);
601 memcpy(buf + offset, &page->nEnd, sizeof(int));
602 offset += sizeof(int);
603 memcpy(buf + offset, &page->nMin, sizeof(int));
604 offset += sizeof(int);
605 memcpy(buf + offset, &page->nMax, sizeof(int));
606 offset += sizeof(int);
607 memcpy(buf + offset, &page->nRepeat, sizeof(int));
608 offset += sizeof(int);
612 memcpy(buf + offset, &pMsgData->regionCnt, sizeof(int));
613 offset += sizeof(int);
614 MSG_DEBUG("pMsgData->regionCnt: %d", pMsgData->regionCnt);
616 if (pMsgData->regionlist) {
617 for (int i = 0; i < pMsgData->regionCnt; ++ i) {
618 MMS_SMIL_REGION *region = (MMS_SMIL_REGION *)g_list_nth_data(pMsgData->regionlist, i);
620 memcpy(buf + offset, region->szID, MAX_SMIL_REGION_ID);
621 offset += MAX_SMIL_REGION_ID;
622 MSG_DEBUG("%d region's ID = %s", i, region->szID);
623 memcpy(buf + offset, ®ion->nLeft, sizeof(MMS_LENGTH));
624 offset += sizeof(MMS_LENGTH);
625 memcpy(buf + offset, ®ion->nTop, sizeof(MMS_LENGTH));
626 offset += sizeof(MMS_LENGTH);
627 memcpy(buf + offset, ®ion->width, sizeof(MMS_LENGTH));
628 offset += sizeof(MMS_LENGTH);
629 memcpy(buf + offset, ®ion->height, sizeof(MMS_LENGTH));
630 offset += sizeof(MMS_LENGTH);
631 memcpy(buf + offset, ®ion->bgColor, sizeof(int));
632 offset += sizeof(int);
633 memcpy(buf + offset, ®ion->fit, sizeof(REGION_FIT_TYPE_T));
634 offset += sizeof(REGION_FIT_TYPE_T);
638 memcpy(buf + offset, &pMsgData->attachCnt, sizeof(int));
639 offset += sizeof(int);
640 MSG_DEBUG("pMsgData->attachCnt: %d", pMsgData->attachCnt);
642 if (pMsgData->attachlist) {
643 for (int i = 0; i < pMsgData->attachCnt; ++ i) {
644 MMS_ATTACH_S *attach = (MMS_ATTACH_S *)g_list_nth_data(pMsgData->attachlist, i);
646 memcpy(buf + offset, &(attach->mediatype), sizeof(MimeType));
647 offset += sizeof(MimeType);
648 MSG_DEBUG("%d attachment's mediatype = %d", i, attach->mediatype);
650 memcpy(buf + offset, attach->szFileName, MSG_FILENAME_LEN_MAX);
651 offset += MSG_FILENAME_LEN_MAX;
652 MSG_DEBUG("%d attachment's filename = %s", i, attach->szFileName);
654 memcpy(buf + offset, attach->szFilePath, MSG_FILEPATH_LEN_MAX);
655 offset += MSG_FILEPATH_LEN_MAX;
656 MSG_DEBUG("%d attachment's filepath = %s", i, attach->szFilePath);
658 memcpy(buf + offset, &(attach->fileSize), sizeof(int));
659 offset += sizeof(int);
660 MSG_DEBUG("%d attachment's file size = %d", i, attach->fileSize);
662 #ifdef __SUPPORT_DRM__
663 memcpy(buf + offset, &(attach->drmType), sizeof(MsgDrmType));
664 offset += sizeof(MsgDrmType);
665 memcpy(buf + offset, attach->szDrm2FullPath, MSG_FILEPATH_LEN_MAX);
666 offset += MSG_FILEPATH_LEN_MAX;
671 memcpy(buf + offset, &pMsgData->transitionCnt, sizeof(int));
672 offset += sizeof(int);
673 MSG_DEBUG("pMsgData->transitionCnt: %d", pMsgData->transitionCnt);
675 if (pMsgData->transitionlist) {
676 for (int i = 0; i < pMsgData->transitionCnt; ++ i) {
677 MMS_SMIL_TRANSITION *transition = (MMS_SMIL_TRANSITION *)g_list_nth_data(pMsgData->transitionlist, i);
679 memcpy(buf + offset, transition->szID, MAX_SMIL_TRANSITION_ID);
680 offset += MAX_SMIL_TRANSITION_ID;
681 MSG_DEBUG("%d transition's ID = %s", i, transition->szID);
683 memcpy(buf + offset, &transition->nType, sizeof(MmsSmilTransType));
684 offset += sizeof(MmsSmilTransType);
685 memcpy(buf + offset, &transition->nSubType, sizeof(MmsSmilTransSubType));
686 offset += sizeof(MmsSmilTransSubType);
687 memcpy(buf + offset, &transition->nDur, sizeof(int));
688 offset += sizeof(int);
692 memcpy(buf + offset, &pMsgData->metaCnt, sizeof(int));
693 offset += sizeof(int);
694 MSG_DEBUG("pMsgData->metaCnt: %d", pMsgData->metaCnt);
696 if (pMsgData->metalist) {
697 for (int i = 0; i < pMsgData->metaCnt; ++ i) {
698 MMS_SMIL_META *meta = (MMS_SMIL_META *)g_list_nth_data(pMsgData->metalist, i);
700 memcpy(buf + offset, meta->szID, MAX_SMIL_META_ID);
701 offset += MAX_SMIL_META_ID;
702 MSG_DEBUG("%d meta's ID = %s", i, meta->szID);
704 memcpy(buf + offset, meta->szName, MAX_SMIL_META_NAME);
705 offset += MAX_SMIL_META_NAME;
706 MSG_DEBUG("%d meta's ID = %s", i, meta->szID);
708 memcpy(buf + offset, meta->szContent, MAX_SMIL_META_CONTENT);
709 offset += MAX_SMIL_META_CONTENT;
710 MSG_DEBUG("%d meta's ID = %s", i, meta->szID);
714 memcpy(buf + offset, &pMsgData->rootlayout, sizeof(MMS_SMIL_ROOTLAYOUT));
715 offset += sizeof(MMS_SMIL_ROOTLAYOUT);
717 #ifdef FEATURE_JAVA_MMS
718 memcpy(buf + offset, &pMsgData->msgAppId, sizeof(MMS_APPID_INFO_S));
719 offset += sizeof(MMS_APPID_INFO_S);
727 int _MsgMmsGetPageCount(MMS_MESSAGE_DATA_S *pMsgData)
729 if (pMsgData == NULL) {
730 MSG_DEBUG("pMsgData is NULL");
736 if (pMsgData->pagelist)
737 count = g_list_length(pMsgData->pagelist);
739 MSG_DEBUG("Page Count: %d", count);
743 MMS_PAGE_S *_MsgMmsGetPage(MMS_MESSAGE_DATA_S *pMsgData, int pageIdx)
745 if (pMsgData == NULL) {
746 MSG_DEBUG("pMsgData is NULL");
750 MMS_PAGE_S *page = NULL;
752 if (pMsgData->pagelist)
753 page = (MMS_PAGE_S *)g_list_nth_data(pMsgData->pagelist, pageIdx);
758 int _MsgMmsGetAttachCount(MMS_MESSAGE_DATA_S *pMsgData)
760 if (pMsgData == NULL) {
761 MSG_DEBUG("pMsgData is NULL");
767 if (pMsgData->attachlist)
768 count = g_list_length(pMsgData->attachlist);
770 MSG_DEBUG("Attachment Count: %d", count);
774 MMS_ATTACH_S *_MsgMmsGetAttachment(MMS_MESSAGE_DATA_S *pMsgData, int attachIdx)
776 if (pMsgData == NULL) {
777 MSG_DEBUG("pMsgData is NULL");
781 MMS_ATTACH_S *attach = NULL;
782 if (pMsgData->attachlist)
783 attach = (MMS_ATTACH_S *)g_list_nth_data(pMsgData->attachlist, attachIdx);
788 MMS_SMIL_REGION *_MsgMmsGetSmilRegion(MMS_MESSAGE_DATA_S *pMsgData, int regionIdx)
790 if (pMsgData == NULL) {
791 MSG_DEBUG("pMsgData is NULL");
795 MMS_SMIL_REGION *region = NULL;
797 if (pMsgData->regionlist)
798 region = (MMS_SMIL_REGION *)g_list_nth_data(pMsgData->regionlist, regionIdx);
803 MMS_MEDIA_S *_MsgMmsGetMedia(MMS_PAGE_S *pPage, int mediaIdx)
806 MSG_FATAL("pPage is NULL");
810 if (mediaIdx > pPage->mediaCnt || mediaIdx < 0) {
811 MSG_FATAL("Invalid media index = %d", mediaIdx);
815 MMS_MEDIA_S *media = NULL;
816 if (pPage->medialist)
817 media = (MMS_MEDIA_S *)g_list_nth_data(pPage->medialist, mediaIdx);
823 int _MsgMmsGetTransitionCount(MMS_MESSAGE_DATA_S *pMsgData)
825 if (pMsgData == NULL) {
826 MSG_DEBUG("pMsgData is NULL");
832 if (pMsgData->transitionlist)
833 count = g_list_length(pMsgData->transitionlist);
835 MSG_DEBUG("Transition Count: %d", count);
839 MMS_SMIL_TRANSITION *_MsgMmsGetTransition(MMS_MESSAGE_DATA_S *pMsgData, int transitionIdx)
841 if (pMsgData == NULL) {
842 MSG_DEBUG("pMsgData is NULL");
846 MMS_SMIL_TRANSITION *transition = NULL;
847 if (pMsgData->transitionlist)
848 transition = (MMS_SMIL_TRANSITION *)g_list_nth_data(pMsgData->transitionlist, transitionIdx);
853 MMS_SMIL_META *_MsgMmsGetMeta(MMS_MESSAGE_DATA_S *pMsgData, int metaIdx)
855 if (pMsgData == NULL) {
856 MSG_DEBUG("pMsgData is NULL");
860 MMS_SMIL_META *meta = NULL;
862 if (pMsgData->metalist)
863 meta = (MMS_SMIL_META *)g_list_nth_data(pMsgData->metalist, metaIdx);
868 int _MsgMmsGetMetaCount(MMS_MESSAGE_DATA_S *pMsgData)
870 if (pMsgData == NULL) {
871 MSG_DEBUG("pMsgData is NULL");
877 if (pMsgData->metalist)
878 count = g_list_length(pMsgData->metalist);
880 MSG_DEBUG("Meta Count: %d", count);
885 bool _MsgMmsDeserializeMessageData(MMS_MESSAGE_DATA_S* pBody, char* pData)
887 MSG_DEBUG("MmsGetMsgBodyfromFile");
889 if (pBody == NULL || pData == NULL) {
890 MSG_DEBUG("param is NULL. pBody = %x, pData = %x", pBody, pData);
898 MMS_PAGE_S *pPage = NULL;
899 MMS_MEDIA_S *pMedia = NULL;
900 MMS_SMIL_REGION *pRegion = NULL;
901 MMS_ATTACH_S *pAttach = NULL;
902 MMS_SMIL_TRANSITION *pTransition = NULL;
903 MMS_SMIL_META *pMeta = NULL;
905 memcpy(&filePathLen, pData, sizeof(int));
907 offset += sizeof(int);
909 MSG_DEBUG("Smil File Path Length : %d", filePathLen);
911 if (filePathLen > MSG_FILEPATH_LEN_MAX) {
912 MSG_DEBUG("Smil File Path Length is abnormal.");
916 memset(pBody->szSmilFilePath, 0x00, MSG_FILEPATH_LEN_MAX);
918 if (filePathLen > 0) {
919 memcpy(pBody->szSmilFilePath, pData + offset, filePathLen);
921 offset += filePathLen;
924 memcpy(&(pBody->pageCnt), pData + offset, sizeof(int));
926 offset += sizeof(int);
928 pageCnt = pBody->pageCnt;
930 MSG_DEBUG("MMS PAGE COUNT: %d", pageCnt);
932 for (int j = 0; j < pageCnt; ++j) {
933 pPage = (MMS_PAGE_S *)calloc(sizeof(MMS_PAGE_S), 1);
935 memcpy(&pPage->mediaCnt, pData + offset, sizeof(int));
936 offset += sizeof(int);
937 MSG_DEBUG("MMS MEDIA COUNT: %d", pPage->mediaCnt);
939 for (int i = 0; i < pPage->mediaCnt; ++i) {
940 pMedia = (MMS_MEDIA_S *)calloc(sizeof(MMS_MEDIA_S), 1);
942 memcpy(&pMedia->mediatype, pData + offset, sizeof(int));
943 offset += sizeof(int);
945 memcpy(pMedia->szSrc, pData + offset, MSG_FILEPATH_LEN_MAX);
946 offset += MSG_FILEPATH_LEN_MAX;
948 memcpy(pMedia->szFileName, pData + offset, MSG_FILENAME_LEN_MAX);
949 offset += MSG_FILENAME_LEN_MAX;
951 memcpy(pMedia->szFilePath, pData + offset, MSG_FILEPATH_LEN_MAX);
952 offset += MSG_FILEPATH_LEN_MAX;
954 memcpy(pMedia->szContentID, pData + offset, MSG_MSG_ID_LEN+1);
955 offset += MSG_MSG_ID_LEN + 1;
957 memcpy(pMedia->regionId, pData + offset, MAX_SMIL_REGION_ID);
958 offset += MAX_SMIL_REGION_ID;
960 memcpy(pMedia->szAlt, pData + offset, MAX_SMIL_ALT_LEN);
961 offset += MAX_SMIL_ALT_LEN;
963 #ifdef __SUPPORT_DRM__
964 memcpy(&pMedia->drmType, pData + offset, sizeof(MsgDrmType));
965 offset += sizeof(MsgDrmType);
967 memcpy(pMedia->szDrm2FullPath, pData + offset, MSG_FILEPATH_LEN_MAX);
968 offset += MSG_FILEPATH_LEN_MAX;
971 if (pMedia->mediatype == MMS_SMIL_MEDIA_TEXT) {
972 MSG_DEBUG("##### MEDIA TYPE = TEXT #####");
973 memcpy(pMedia->sMedia.sText.szTransInId, pData + offset, MAX_SMIL_TRANSIN_ID);
974 offset += MAX_SMIL_TRANSIN_ID;
976 memcpy(pMedia->sMedia.sText.szTransOutId, pData + offset, MAX_SMIL_TRANSOUT_ID);
977 offset += MAX_SMIL_TRANSOUT_ID;
979 memcpy(&pMedia->sMedia.sText.nRepeat, pData + offset, sizeof(int));
980 offset += sizeof(int);
982 memcpy(&pMedia->sMedia.sText.nBegin, pData + offset, sizeof(int));
983 offset += sizeof(int);
985 memcpy(&pMedia->sMedia.sText.nEnd, pData + offset, sizeof(int));
986 offset += sizeof(int);
988 memcpy(&pMedia->sMedia.sText.nDurTime, pData + offset, sizeof(int));
989 offset += sizeof(int);
991 memcpy(&pMedia->sMedia.sText.nBgColor, pData + offset, sizeof(int));
992 offset += sizeof(int);
994 memcpy(&pMedia->sMedia.sText.bBold, pData + offset, sizeof(bool));
995 offset += sizeof(bool);
997 memcpy(&pMedia->sMedia.sText.bUnderLine, pData + offset, sizeof(bool));
998 offset += sizeof(bool);
1000 memcpy(&pMedia->sMedia.sText.bItalic, pData + offset, sizeof(bool));
1001 offset += sizeof(bool);
1003 memcpy(&pMedia->sMedia.sText.bReverse, pData + offset, sizeof(bool));
1004 offset += sizeof(bool);
1006 memcpy(&pMedia->sMedia.sText.nDirection, pData + offset, sizeof(MmsTextDirection));
1007 offset += sizeof(MmsTextDirection);
1009 //memcpy(&pMedia->sMedia.sText.nFont, pData + offset, sizeof(MmsSmilFontType));
1010 //offset += sizeof(MmsSmilFontType);
1012 memcpy(&pMedia->sMedia.sText.nSize, pData + offset, sizeof(int));
1013 offset += sizeof(int);
1015 memcpy(&pMedia->sMedia.sText.nColor, pData + offset, sizeof(int));
1016 offset += sizeof(int);
1018 MSG_DEBUG("##### MEDIA TYPE = IMAGE, AUDIO, VIDEO #####");
1019 memcpy(pMedia->sMedia.sAVI.szTransInId, pData + offset, MAX_SMIL_TRANSIN_ID);
1020 offset += MAX_SMIL_TRANSIN_ID;
1022 memcpy(pMedia->sMedia.sAVI.szTransOutId, pData + offset, MAX_SMIL_TRANSOUT_ID);
1023 offset += MAX_SMIL_TRANSOUT_ID;
1025 memcpy(&pMedia->sMedia.sAVI.nRepeat, pData + offset, sizeof(int));
1026 offset += sizeof(int);
1028 memcpy(&pMedia->sMedia.sAVI.nBegin, pData + offset, sizeof(int));
1029 offset += sizeof(int);
1031 memcpy(&pMedia->sMedia.sAVI.nEnd, pData + offset, sizeof(int));
1032 offset += sizeof(int);
1034 memcpy(&pMedia->sMedia.sAVI.nDurTime, pData + offset, sizeof(int));
1035 offset += sizeof(int);
1037 memcpy(&pMedia->sMedia.sAVI.nBgColor, pData + offset, sizeof(int));
1038 offset += sizeof(int);
1040 pPage->medialist = g_list_append(pPage->medialist, pMedia);
1043 memcpy(&pPage->nDur , pData + offset, sizeof(int));
1044 offset += sizeof(int);
1045 memcpy(&pPage->nBegin , pData + offset, sizeof(int));
1046 offset += sizeof(int);
1047 memcpy(&pPage->nEnd , pData + offset, sizeof(int));
1048 offset += sizeof(int);
1049 memcpy(&pPage->nMin , pData + offset, sizeof(int));
1050 offset += sizeof(int);
1051 memcpy(&pPage->nMax , pData + offset, sizeof(int));
1052 offset += sizeof(int);
1053 memcpy(&pPage->nRepeat , pData + offset, sizeof(int));
1054 offset += sizeof(int);
1056 pBody->pagelist = g_list_append(pBody->pagelist, pPage);
1059 //Processing Region List
1060 memcpy(&pBody->regionCnt, pData + offset, sizeof(int));
1061 offset += sizeof(int);
1063 MSG_DEBUG(" pBody->regionCnt: %d", pBody->regionCnt);
1065 for (int i = 0; i < pBody->regionCnt; ++i) {
1066 pRegion = (MMS_SMIL_REGION *)calloc(sizeof(MMS_SMIL_REGION), 1);
1068 memcpy(pRegion->szID, pData + offset, MAX_SMIL_REGION_ID);
1069 offset += MAX_SMIL_REGION_ID;
1070 memcpy(&pRegion->nLeft, pData + offset, sizeof(MMS_LENGTH));
1071 offset += sizeof(MMS_LENGTH);
1072 memcpy(&pRegion->nTop, pData + offset, sizeof(MMS_LENGTH));
1073 offset += sizeof(MMS_LENGTH);
1074 memcpy(&pRegion->width, pData + offset, sizeof(MMS_LENGTH));
1075 offset += sizeof(MMS_LENGTH);
1076 memcpy(&pRegion->height, pData + offset, sizeof(MMS_LENGTH));
1077 offset += sizeof(MMS_LENGTH);
1078 memcpy(&pRegion->bgColor, pData + offset, sizeof(int));
1079 offset += sizeof(int);
1080 memcpy(&pRegion->fit, pData + offset, sizeof(REGION_FIT_TYPE_T));
1081 offset += sizeof(REGION_FIT_TYPE_T);
1083 pBody->regionlist = g_list_append(pBody->regionlist, pRegion);
1086 //Processing Attachment List
1087 memcpy(&pBody->attachCnt, pData + offset, sizeof(int));
1088 offset += sizeof(int);
1090 MSG_DEBUG(" pBody->attachCnt: %d", pBody->attachCnt);
1092 for (int i = 0; i < pBody->attachCnt; ++i) {
1093 pAttach = (MMS_ATTACH_S *)calloc(sizeof(MMS_ATTACH_S), 1);
1095 memcpy(&pAttach->mediatype, pData + offset, sizeof(MimeType));
1096 offset += sizeof(MimeType);
1098 memcpy(pAttach->szFileName, pData + offset, MSG_FILENAME_LEN_MAX);
1099 offset += MSG_FILENAME_LEN_MAX;
1101 memcpy(pAttach->szFilePath, pData + offset, MSG_FILEPATH_LEN_MAX);
1102 offset += MSG_FILEPATH_LEN_MAX;
1104 memcpy(&pAttach->fileSize, pData + offset, sizeof(int));
1105 offset += sizeof(int);
1107 #ifdef __SUPPORT_DRM__
1108 memcpy(&pAttach->drmType, pData + offset, sizeof(MsgDrmType));
1109 offset += sizeof(MsgDrmType);
1111 memcpy(pAttach->szDrm2FullPath, pData + offset, MSG_FILEPATH_LEN_MAX);
1112 offset += MSG_FILEPATH_LEN_MAX;
1115 pBody->attachlist = g_list_append(pBody->attachlist, pAttach);
1118 //Processing Transition List
1119 memcpy(&pBody->transitionCnt, pData + offset, sizeof(int));
1120 offset += sizeof(int);
1122 MSG_DEBUG(" pBody->transitionCnt: %d", pBody->transitionCnt);
1124 for (int i = 0; i < pBody->transitionCnt; ++i) {
1125 pTransition = (MMS_SMIL_TRANSITION *)calloc(sizeof(MMS_SMIL_TRANSITION), 1);
1127 memcpy(pTransition->szID, pData + offset, MAX_SMIL_TRANSITION_ID);
1128 offset += MAX_SMIL_TRANSITION_ID;
1130 memcpy(&pTransition->nType, pData + offset, sizeof(MmsSmilTransType));
1131 offset += sizeof(MmsSmilTransType);
1132 memcpy(&pTransition->nSubType, pData + offset, sizeof(MmsSmilTransSubType));
1133 offset += sizeof(MmsSmilTransSubType);
1134 memcpy(&pTransition->nDur, pData + offset, sizeof(int));
1135 offset += sizeof(int);
1137 pBody->transitionlist = g_list_append(pBody->transitionlist, pTransition);
1140 //Processing Meta List
1141 memcpy(&pBody->metaCnt, pData + offset, sizeof(int));
1142 offset += sizeof(int);
1144 MSG_DEBUG(" pBody->metaCnt: %d", pBody->metaCnt);
1146 for (int i = 0; i < pBody->metaCnt; ++i) {
1147 pMeta = (MMS_SMIL_META *)calloc(sizeof(MMS_SMIL_META), 1);
1149 memcpy(pMeta->szID, pData + offset, MAX_SMIL_META_ID);
1150 offset += MAX_SMIL_META_ID;
1152 memcpy(pMeta->szName, pData + offset, MAX_SMIL_META_NAME);
1153 offset += MAX_SMIL_META_NAME;
1155 memcpy(pMeta->szContent, pData + offset, MAX_SMIL_META_CONTENT);
1156 offset += MAX_SMIL_META_CONTENT;
1158 pBody->metalist = g_list_append(pBody->metalist, pMeta);
1161 memcpy(&pBody->rootlayout, pData + offset, sizeof(MMS_SMIL_ROOTLAYOUT));
1162 offset += sizeof(MMS_SMIL_ROOTLAYOUT);
1164 #ifdef FEATURE_JAVA_MMS
1165 memcpy(&pBody->msgAppId, pData + offset, sizeof(MMS_APPID_INFO_S));
1166 offset += sizeof(MMS_APPID_INFO_S);
1167 MSG_DEBUG("java_app_id valid:%d, appId:%s repleToAppId:%s", pBody->msgAppId.valid, pBody->msgAppId.appId, pBody->msgAppId.replyToAppId);
1174 bool _MsgMmsSetRootLayout(MMS_MESSAGE_DATA_S* pMmsMsg, MMS_SMIL_ROOTLAYOUT* pRootlayout)
1176 memcpy(&pMmsMsg->rootlayout, pRootlayout, sizeof(MMS_SMIL_ROOTLAYOUT));