2 * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 #include "MsgJsonParser.h"
18 #include "MsgSerialize.h"
19 #include "MsgMmsTypes.h"
21 #include "MsgMmsMessage.h"
24 #ifdef MSG_MMS_USE_JSON_DATA
26 #include <glib-object.h>
27 #include <json-glib/json-glib.h>
28 #include <json-glib/json-gobject.h>
35 } mms_json_data_type_e;
37 typedef struct _mms_json_item {
50 MULTIPART_CONTENT_TYPE,
55 MULTIPART_CONTENT_LOCATION,
57 HEADER_CONTENT_LOCATION,
59 HEADER_CONTENT_TYPE_INT,
61 HEADER_DELIVERY_REPORT,
77 static mms_json_item_s mms_json_table[] = {
78 {"header", MMS_HEADER, TYPE_INT},
79 {"multipart_list", MMS_MULTIPART_LIST, TYPE_ARRAY},
80 {"smil", MMS_SMIL_MULTIPART, TYPE_OBJECT},
82 {"mp_type", MULTIPART_TYPE, TYPE_INT},
83 {"mp_ct", MULTIPART_CONTENT_TYPE, TYPE_STR},
84 {"mp_name", MULTIPART_NAME, TYPE_STR},
85 {"mp_path", MULTIPART_FILEPATH, TYPE_STR},
86 {"mp_data", MULTIPART_FILEDATA, TYPE_STR},
88 {"mp_cid", MULTIPART_CONTENT_ID, TYPE_STR},
89 {"mp_cl", MULTIPART_CONTENT_LOCATION, TYPE_STR},
91 {"h_cl", HEADER_CONTENT_LOCATION, TYPE_STR},
92 {"h_ct", HEADER_CONTENT_TYPE, TYPE_STR},
93 {"h_ct_int", HEADER_CONTENT_TYPE_INT, TYPE_INT},
94 {"h_date", HEADER_DATE, TYPE_INT},
95 {"h_d_rpt", HEADER_DELIVERY_REPORT, TYPE_INT},
96 {"h_d_time", HEADER_DELIVERY_TIME, TYPE_INT},
97 {"h_exp", HEADER_EXPIRY_TIME, TYPE_INT},
98 {"h_mclass", HEADER_MESSAGE_CLASS, TYPE_INT},
99 {"h_mid", HEADER_MID, TYPE_STR},
100 {"h_mtype", HEADER_MESSAGE_TYPE, TYPE_INT},
101 {"h_v", HEADER_VERSION, TYPE_INT},
102 {"h_prioriy", HEADER_PRIORITY, TYPE_INT},
103 {"h_r_rpt", HEADER_READ_REPORT, TYPE_INT},
104 {"h_hide_addr", HEADER_HIDE_ADDRESS, TYPE_INT},
105 {"h_tid", HEADER_TRID, TYPE_STR},
106 {"h_cclass", HEADER_CONTENT_CLASS, TYPE_INT},
107 {"backup_type", MMS_BACKUP_TYPE, TYPE_INT},
110 mms_json_enum_e get_mms_key_type(const char * key)
114 int table_count = sizeof(mms_json_table)/sizeof(mms_json_item_s);
116 for (i = 0; i < table_count; i++) {
117 if (g_strcmp0(mms_json_table[i].key, key) == 0)
118 return (mms_json_enum_e)mms_json_table[i].e_val;
125 const char *get_mms_key(mms_json_enum_e e)
129 int table_count = sizeof(mms_json_table)/sizeof(mms_json_item_s);
131 for (i = 0; i < table_count; i++) {
132 if (mms_json_table[i].e_val == e)
133 return mms_json_table[i].key;
139 int MsgSerializeHeader(const MMS_HEADER_DATA_S *pheader, JsonObject **headerObject)
141 JsonObject *header_object = json_object_new();
143 MSG_JSON_OBJ_SET_STR(header_object, get_mms_key(HEADER_CONTENT_LOCATION), pheader->contentLocation);
145 MSG_JSON_OBJ_SET_STR(header_object, get_mms_key(HEADER_CONTENT_TYPE), pheader->szContentType);
147 MSG_JSON_OBJ_SET_INT(header_object, get_mms_key(HEADER_CONTENT_TYPE_INT), pheader->contentType);
149 MSG_JSON_OBJ_SET_INT(header_object, get_mms_key(HEADER_DATE), pheader->date);
151 MSG_JSON_OBJ_SET_INT(header_object, get_mms_key(HEADER_DELIVERY_REPORT), pheader->bDeliveryReport);
153 MSG_JSON_OBJ_SET_INT(header_object, get_mms_key(HEADER_DELIVERY_TIME), pheader->delivery.time);
155 MSG_JSON_OBJ_SET_INT(header_object, get_mms_key(HEADER_EXPIRY_TIME), pheader->expiry.time);
157 MSG_JSON_OBJ_SET_INT(header_object, get_mms_key(HEADER_MESSAGE_CLASS), pheader->messageClass);
159 MSG_JSON_OBJ_SET_STR(header_object, get_mms_key(HEADER_MID), pheader->messageID);
161 MSG_JSON_OBJ_SET_INT(header_object, get_mms_key(HEADER_MESSAGE_TYPE), pheader->messageType);
163 MSG_JSON_OBJ_SET_INT(header_object, get_mms_key(HEADER_VERSION), pheader->mmsVersion);
165 MSG_JSON_OBJ_SET_INT(header_object, get_mms_key(HEADER_PRIORITY), pheader->mmsPriority);
167 MSG_JSON_OBJ_SET_INT(header_object, get_mms_key(HEADER_READ_REPORT), pheader->bReadReport);
169 MSG_JSON_OBJ_SET_INT(header_object, get_mms_key(HEADER_HIDE_ADDRESS), pheader->bHideAddress);
171 MSG_JSON_OBJ_SET_STR(header_object, get_mms_key(HEADER_TRID), pheader->trID);
173 MSG_JSON_OBJ_SET_INT(header_object, get_mms_key(HEADER_CONTENT_CLASS), pheader->contentClass);
175 *headerObject = header_object;
180 int MsgParseHeader(msg_json_parser_object *parse_obj, MMS_HEADER_DATA_S *pheader)
185 mms_json_enum_e type;
186 msg_json_parser_object child = {};
188 if (parse_obj == NULL)
191 while (msg_json_parser_get_next_child(parse_obj, &child, index_child)) {
192 MSG_PRINT_PARSER_OBJECT(index_child, child);
193 type = get_mms_key_type(child.key);
196 case HEADER_CONTENT_LOCATION:
197 snprintf(pheader->contentLocation, sizeof(pheader->contentLocation), "%s", (char *)child.value);
199 case HEADER_CONTENT_TYPE:
200 snprintf(pheader->szContentType, sizeof(pheader->szContentType), "%s", (char *)child.value);
202 case HEADER_CONTENT_TYPE_INT:
203 pheader->contentType = (int)child.number_value;
206 pheader->date = (unsigned long int)child.number_value;
208 case HEADER_DELIVERY_REPORT:
209 pheader->bDeliveryReport = (bool)child.number_value;
211 case HEADER_DELIVERY_TIME:
212 if ((unsigned int)child.number_value > 0) {
213 pheader->delivery.type = MMS_TIMETYPE_RELATIVE;
214 pheader->delivery.time = (unsigned int)child.number_value;
217 case HEADER_EXPIRY_TIME:
218 if ((unsigned int)child.number_value > 0) {
219 pheader->expiry.type = MMS_TIMETYPE_RELATIVE;
220 pheader->expiry.time = (unsigned int)child.number_value;
223 case HEADER_MESSAGE_CLASS:
224 pheader->messageClass = (int)child.number_value;
227 snprintf(pheader->messageID, sizeof(pheader->messageID), "%s", (char *)child.value);
229 case HEADER_MESSAGE_TYPE:
230 pheader->messageType = (int)child.number_value;
233 pheader->mmsVersion = (int)child.number_value;
235 case HEADER_PRIORITY:
236 pheader->mmsPriority = (int)child.number_value;
238 case HEADER_READ_REPORT:
239 pheader->bReadReport = (bool)child.number_value;
241 case HEADER_HIDE_ADDRESS:
242 pheader->bHideAddress = (bool)child.number_value;
245 snprintf(pheader->trID, sizeof(pheader->trID), "%s", (char *)child.value);
247 case HEADER_CONTENT_CLASS:
248 pheader->contentClass = (int)child.number_value;
251 MSG_DEBUG("Not Support key = [%s], type = [%d]", child.key, type);
262 int MsgSerializeMultipart(const MMS_MULTIPART_DATA_S *pMultipart, JsonObject **multipartObject)
264 JsonObject *object = json_object_new();
266 MSG_JSON_OBJ_SET_INT(object, get_mms_key(MULTIPART_TYPE), pMultipart->type);
268 MSG_JSON_OBJ_SET_STR(object, get_mms_key(MULTIPART_CONTENT_TYPE), pMultipart->szContentType);
269 MSG_JSON_OBJ_SET_STR(object, get_mms_key(MULTIPART_NAME), pMultipart->szFileName);
270 MSG_JSON_OBJ_SET_STR(object, get_mms_key(MULTIPART_FILEPATH), pMultipart->szFilePath);
272 if (pMultipart->pMultipartData) {
273 char* base64data = g_base64_encode((const guchar*)pMultipart->pMultipartData, pMultipart->nMultipartDataLen);
274 MSG_JSON_OBJ_SET_STR(object, get_mms_key(MULTIPART_FILEDATA), base64data);
278 MSG_JSON_OBJ_SET_STR(object, get_mms_key(MULTIPART_CONTENT_ID), pMultipart->szContentID);
279 MSG_JSON_OBJ_SET_STR(object, get_mms_key(MULTIPART_CONTENT_LOCATION), pMultipart->szContentLocation);
281 *multipartObject = object;
286 int MsgParseMultipartData(msg_json_parser_object *parse_obj, MMS_MULTIPART_DATA_S *pMultipart)
291 mms_json_enum_e type;
292 msg_json_parser_object child = {};
294 if (parse_obj == NULL)
297 while (msg_json_parser_get_next_child(parse_obj, &child, index_child)) {
298 MSG_PRINT_PARSER_OBJECT(index_child, child);
300 type = get_mms_key_type(child.key);
304 pMultipart->type = (MimeType)child.number_value;
306 case MULTIPART_CONTENT_TYPE:
307 snprintf(pMultipart->szContentType, sizeof(pMultipart->szContentType), "%s", (char *)child.value);
310 snprintf(pMultipart->szFileName, sizeof(pMultipart->szFileName), "%s", (char *)child.value);
312 case MULTIPART_FILEPATH:
313 snprintf(pMultipart->szFilePath, sizeof(pMultipart->szFilePath), "%s", (char *)child.value);
315 case MULTIPART_FILEDATA:
316 pMultipart->pMultipartData = (char*)g_base64_decode((char *)child.value, &pMultipart->nMultipartDataLen);
318 case MULTIPART_CONTENT_ID:
319 snprintf(pMultipart->szContentID, sizeof(pMultipart->szContentID), "%s", (char *)child.value);
321 case MULTIPART_CONTENT_LOCATION:
322 snprintf(pMultipart->szContentLocation, sizeof(pMultipart->szContentLocation), "%s", (char *)child.value);
325 MSG_DEBUG("Not Support key = [%s], type = [%d]", child.key, type);
336 int MsgParseMultipartListData(msg_json_parser_object *parse_obj, MMS_DATA_S *pMsgData)
342 msg_json_parser_object child = {};
344 if (parse_obj == NULL)
347 while (msg_json_parser_get_next_child(parse_obj, &child, index_child)) {
348 if (child.value != NULL && child.type != MSG_JSON_PARSER_NULL) {
349 MSG_PRINT_PARSER_OBJECT(index_child, child);
351 MMS_MULTIPART_DATA_S *pMultipart = MsgMmsCreateMultipart();
354 if (MsgParseMultipartData(&child, pMultipart) == 0) {
355 pMsgData->multipartlist = g_list_append(pMsgData->multipartlist, pMultipart);
362 MSG_DEBUG("Get child : idx = %d, key = %s, type = %d, value = %p", index_child, child.key, child.type, child.value);
372 int MsgParseMmsData(msg_json_parser_object *parse_obj, MMS_DATA_S *pMsgData)
377 mms_json_enum_e type;
378 msg_json_parser_object child = {};
380 if (parse_obj == NULL)
383 while (msg_json_parser_get_next_child(parse_obj, &child, index_child)) {
384 if (child.key != NULL) {
385 MSG_PRINT_PARSER_OBJECT(index_child, child);
387 type = get_mms_key_type(child.key);
390 case MMS_MULTIPART_LIST:
391 MsgParseMultipartListData(&child, pMsgData);
394 if (pMsgData->header == NULL) {
395 pMsgData->header = MsgMmsCreateHeader();
397 if (pMsgData->header)
398 MsgParseHeader(&child, pMsgData->header);
400 case MMS_SMIL_MULTIPART: {
401 MMS_MULTIPART_DATA_S *pMultipart = MsgMmsCreateMultipart();
403 if (MsgParseMultipartData(&child, pMultipart) == 0) {
404 pMsgData->smil = pMultipart;
412 case MMS_BACKUP_TYPE:
413 pMsgData->backup_type = (int)child.number_value;
416 MSG_DEBUG("Not Support key = [%s], type = [%d]", child.key, type);
421 MSG_PRINT_PARSER_OBJECT(index_child, child);
432 int MsgSerializeMmsJsonData(const MMS_DATA_S *pMsgData, char **pValue)
436 if (pMsgData == NULL)
437 return MSG_ERR_NULL_POINTER;
439 JsonGenerator *generator;
442 JsonObject *object_main, *object_header;
443 JsonArray *array_multipart;
447 generator = json_generator_new();
449 root = json_node_new(JSON_NODE_OBJECT);
451 object_main = json_object_new();
453 MSG_JSON_OBJ_SET_INT(object_main, get_mms_key(MMS_BACKUP_TYPE), pMsgData->backup_type);
456 if (pMsgData->smil) {
457 JsonObject *smil_object = NULL;
459 MsgSerializeMultipart(pMsgData->smil, &smil_object);
460 MSG_JSON_OBJ_SET_OBJ(object_main, get_mms_key(MMS_SMIL_MULTIPART), smil_object);
463 if (pMsgData->multipartlist) {
465 array_multipart = json_array_new();
467 int list_count = g_list_length(pMsgData->multipartlist);
469 MSG_DEBUG("Page Count is [%d]", list_count);
471 for (int i = 0; i < list_count; i++) {
472 MMS_MULTIPART_DATA_S *multipart = (MMS_MULTIPART_DATA_S *)g_list_nth_data(pMsgData->multipartlist, i);
475 JsonObject *multipart_object = NULL;
477 MsgSerializeMultipart(multipart, &multipart_object);
479 MSG_JSON_ARRAY_ADD_OBJECT(array_multipart, multipart_object);
482 MSG_DEBUG("Not Exist Multipart Data in [%d]th", i);
486 MSG_JSON_OBJ_SET_ARRAY(object_main, get_mms_key(MMS_MULTIPART_LIST), array_multipart);
490 if (pMsgData->header) {
491 MsgSerializeHeader(pMsgData->header, &object_header);
493 MSG_JSON_OBJ_SET_OBJ(object_main, get_mms_key(MMS_HEADER), object_header);
496 json_node_take_object(root, object_main);
498 json_generator_set_root(generator, root);
500 *pValue = json_generator_to_data(generator, &len);
502 MSG_DEBUG("Serialized Data : %s", *pValue);
504 json_node_free(root);
506 g_object_unref(generator);
514 int MsgDeserializeMmsJsonData(char* value, int value_len, MMS_DATA_S **ppMmsData)
520 msg_json_parser_handle parser_handle = NULL;
521 msg_json_parser_object root = {};
522 MMS_DATA_S *pMmsData = NULL;
524 pMmsData = MsgMmsCreate();
526 parser_handle = msg_json_parser_handle_create();
528 msg_json_parser_parse_buffer(parser_handle, value, value_len, &root);
530 MSG_DEBUG("Deserialized : %s", value);
532 MSG_DEBUG("root : key = %s, type = %d, value = %p", root.key, root.type, root.value);
534 ret = MsgParseMmsData(&root, pMmsData);
536 MSG_DEBUG("Fail to MsgParseMessageData, ret = %d", ret);
537 MsgMmsRelease(&pMmsData);
539 *ppMmsData = pMmsData;
542 msg_json_parser_handle_destory(&parser_handle);
551 int MsgSerializeMms(const MMS_DATA_S *pMsgData, char **pValue)
555 if (pMsgData == NULL)
556 return MSG_ERR_NULL_POINTER;
560 int isExistHeader = 0, isExistSmil = 0, isExistMultipart = 0;
561 int multipart_cnt = 0;
565 bufsize += sizeof(int); /* back-up type */
571 bufsize += sizeof(int); /* check header data */
573 if (pMsgData->header) {
576 bufsize += sizeof(MMS_HEADER_DATA_S); /* header */
578 to_cnt = g_list_length(pMsgData->header->to);
579 cc_cnt = g_list_length(pMsgData->header->cc);
580 bcc_cnt = g_list_length(pMsgData->header->bcc);
582 bufsize += (3 * sizeof(int));
584 MSG_DEBUG("Address \"to\" count = [%d]", to_cnt);
586 for (i = 0; i < to_cnt; i++) {
587 MMS_ADDRESS_DATA_S *addr_data = (MMS_ADDRESS_DATA_S *)g_list_nth_data(pMsgData->header->to, i);
588 if (addr_data && addr_data->address_val) {
589 bufsize += (sizeof(int) + sizeof(int) + strlen(addr_data->address_val)); /* type, length, address */
592 for (i = 0; i < cc_cnt; i++) {
593 MMS_ADDRESS_DATA_S *addr_data = (MMS_ADDRESS_DATA_S *)g_list_nth_data(pMsgData->header->cc, i);
594 if (addr_data && addr_data->address_val) {
595 bufsize += (sizeof(int) + sizeof(int) + strlen(addr_data->address_val)); /* type, length, address */
598 for (i = 0; i < bcc_cnt; i++) {
599 MMS_ADDRESS_DATA_S *addr_data = (MMS_ADDRESS_DATA_S *)g_list_nth_data(pMsgData->header->bcc, i);
600 if (addr_data && addr_data->address_val) {
601 bufsize += (sizeof(int) + sizeof(int) + strlen(addr_data->address_val)); /* type, length, address */
606 bufsize += sizeof(int); /* check smil data */
608 if (pMsgData->smil) {
610 bufsize += (sizeof(MMS_MULTIPART_DATA_S) + (sizeof(char)*pMsgData->smil->nMultipartDataLen)); /* smil data */
613 bufsize += sizeof(int); /* check multipart list data */
615 if (pMsgData->multipartlist) {
616 isExistMultipart = 1;
617 multipart_cnt = g_list_length(pMsgData->multipartlist);
619 bufsize += sizeof(int); /* multipart count */
621 for (i = 0; i < multipart_cnt; i++) {
622 MMS_MULTIPART_DATA_S *multipart_data = (MMS_MULTIPART_DATA_S *)g_list_nth_data(pMsgData->multipartlist, i);
623 bufsize += sizeof(MMS_MULTIPART_DATA_S) + (sizeof(char)*multipart_data->nMultipartDataLen);
627 MSG_DEBUG("Serialize bufsize = %d", bufsize);
629 buf = new char[bufsize];
633 memset(buf, 0x00, bufsize);
635 int serial_index = 0;
639 memcpy(buf, &pMsgData->backup_type, sizeof(int));
640 MSG_DEBUG("[#%2d][%5d] backup type = %d", serial_index++, offset, pMsgData->backup_type);
641 offset += sizeof(int);
644 memcpy(buf + offset, &isExistHeader, sizeof(int));
645 offset += sizeof(int);
647 if (pMsgData->header) {
648 memcpy(buf + offset, pMsgData->header, sizeof(MMS_HEADER_DATA_S));
649 offset += sizeof(MMS_HEADER_DATA_S);
652 memcpy(buf + offset, &to_cnt, sizeof(int));
653 MSG_DEBUG("[#%2d][%5d] TO Count = %d", serial_index++, offset, to_cnt);
654 offset += sizeof(int);
656 for (i = 0; i < to_cnt; i++) {
657 MMS_ADDRESS_DATA_S *to_addr = (MMS_ADDRESS_DATA_S *)g_list_nth_data(pMsgData->header->to, i);
658 if (to_addr && to_addr->address_val) {
659 memcpy(buf + offset, &to_addr->address_type, sizeof(int));
660 MSG_DEBUG("[#%2d][%5d] address type = %d", serial_index++, offset, to_addr->address_type);
661 offset += sizeof(int);
662 memcpy(buf + offset, to_addr->address_val, sizeof(char)*MAX_ADDRESS_VAL_LEN);
663 MSG_SEC_DEBUG("[#%2d][%5d] address val = %s", serial_index++, offset, to_addr->address_val);
664 offset += sizeof(char)*MAX_ADDRESS_VAL_LEN;
669 memcpy(buf + offset, &cc_cnt, sizeof(int));
670 MSG_DEBUG("[#%2d][%5d] CC Count = %d", serial_index++, offset, cc_cnt);
671 offset += sizeof(int);
673 for (i = 0; i < cc_cnt; i++) {
674 MMS_ADDRESS_DATA_S *cc_addr = (MMS_ADDRESS_DATA_S *)g_list_nth_data(pMsgData->header->cc, i);
675 if (cc_addr && cc_addr->address_val) {
676 memcpy(buf + offset, &cc_addr->address_type, sizeof(int));
677 MSG_DEBUG("[#%2d][%5d] address type = %d", serial_index++, offset, cc_addr->address_type);
678 offset += sizeof(int);
679 memcpy(buf + offset, cc_addr->address_val, sizeof(char)*MAX_ADDRESS_VAL_LEN);
680 MSG_SEC_DEBUG("[#%2d][%5d] address val = %s", serial_index++, offset, cc_addr->address_val);
681 offset += sizeof(char)*MAX_ADDRESS_VAL_LEN;
686 memcpy(buf + offset, &bcc_cnt, sizeof(int));
687 MSG_DEBUG("[#%2d][%5d] BCC Count = %d", serial_index++, offset, bcc_cnt);
688 offset += sizeof(int);
690 for (i = 0; i < bcc_cnt; i++) {
691 MMS_ADDRESS_DATA_S *bcc_addr = (MMS_ADDRESS_DATA_S *)g_list_nth_data(pMsgData->header->bcc, i);
692 if (bcc_addr && bcc_addr->address_val) {
693 memcpy(buf + offset, &bcc_addr->address_type, sizeof(int));
694 MSG_DEBUG("[#%2d][%5d] address type = %d", serial_index++, offset, bcc_addr->address_type);
695 offset += sizeof(int);
696 memcpy(buf + offset, bcc_addr->address_val, sizeof(char)*MAX_ADDRESS_VAL_LEN);
697 MSG_SEC_DEBUG("[#%2d][%5d] address val = %s", serial_index++, offset, bcc_addr->address_val);
698 offset += sizeof(char)*MAX_ADDRESS_VAL_LEN;
704 memcpy(buf + offset, &isExistSmil, sizeof(int));
705 offset += sizeof(int);
707 if (pMsgData->smil) {
708 memcpy(buf + offset, pMsgData->smil, sizeof(MMS_MULTIPART_DATA_S));
709 offset += sizeof(MMS_MULTIPART_DATA_S);
711 MSG_DEBUG("SMIL file path = [%s]", pMsgData->smil->szFilePath);
712 MSG_DEBUG("SMIL nMultipartDataLen = [%zu]", pMsgData->smil->nMultipartDataLen);
714 if (pMsgData->smil->pMultipartData) {
715 memcpy(buf + offset, pMsgData->smil->pMultipartData, sizeof(char)*pMsgData->smil->nMultipartDataLen);
716 MSG_SEC_DEBUG("[#%2d][%5d] smil data = %s", serial_index++, offset, pMsgData->smil->pMultipartData);
717 offset += sizeof(char)*pMsgData->smil->nMultipartDataLen;
721 /* 4. Multipart list data */
722 memcpy(buf + offset, &isExistMultipart, sizeof(int));
723 offset += sizeof(int);
725 if (pMsgData->multipartlist) {
726 MSG_DEBUG("Multipart list count = [ %d]", multipart_cnt);
727 memcpy(buf + offset, &multipart_cnt, sizeof(int));
728 offset += sizeof(int);
730 for (i = 0; i < multipart_cnt; i++) {
731 MMS_MULTIPART_DATA_S *multipart_data = (MMS_MULTIPART_DATA_S *)g_list_nth_data(pMsgData->multipartlist, i);
732 MSG_DEBUG("multipart_data = [%p]", multipart_data);
733 if (multipart_data) {
734 memcpy(buf + offset, multipart_data, sizeof(MMS_MULTIPART_DATA_S));
735 offset += sizeof(MMS_MULTIPART_DATA_S);
737 MSG_SEC_DEBUG("Multipart file path = [%s]", multipart_data->szFilePath);
739 if (multipart_data->pMultipartData) {
740 memcpy(buf + offset, multipart_data->pMultipartData, sizeof(char)*multipart_data->nMultipartDataLen);
741 MSG_DEBUG("[#%2d][%5d] multipart data ptr = %p", serial_index++, offset, multipart_data->pMultipartData);
742 offset += sizeof(char)*multipart_data->nMultipartDataLen;
750 MSG_DEBUG("Expect Buffer Size: %d, Final offset : %d", bufsize, offset);
758 int MsgDeserializeMmsData(char* value, int value_len, MMS_DATA_S **ppMmsData)
763 MSG_DEBUG("Serialized data is NULL");
767 MMS_DATA_S *pMmsData = NULL;
769 int isExistHeader = 0, isExistSmil = 0, isExistMultipart = 0;
771 int multipart_cnt = 0;
773 int deserial_index = 0;
777 pMmsData = MsgMmsCreate();
778 *ppMmsData = pMmsData;
779 if (pMmsData == NULL)
784 memcpy(&(pMmsData->backup_type), value, sizeof(int));
785 MSG_DEBUG("[#%2d][%5d] backup type = %d", deserial_index++, offset, pMmsData->backup_type);
786 offset += sizeof(int);
789 memcpy(&isExistHeader, value + offset, sizeof(int));
790 offset += sizeof(int);
793 pMmsData->header = (MMS_HEADER_DATA_S *)calloc(1, sizeof(MMS_HEADER_DATA_S));
794 if (pMmsData->header == NULL)
797 memcpy(pMmsData->header, value + offset, sizeof(MMS_HEADER_DATA_S));
798 offset += sizeof(MMS_HEADER_DATA_S);
800 memcpy(&addr_cnt, value + offset, sizeof(int));
801 offset += sizeof(int);
803 pMmsData->header->to = NULL;
805 for (i = 0; i < addr_cnt; i++) {
806 MMS_ADDRESS_DATA_S* to_addr = (MMS_ADDRESS_DATA_S*)calloc(1, sizeof(MMS_ADDRESS_DATA_S));
810 memcpy(&(to_addr->address_type), value + offset, sizeof(int));
811 MSG_DEBUG("[#%2d][%5d] address type = %d", deserial_index++, offset, to_addr->address_type);
812 offset += sizeof(int);
814 memcpy(to_addr->address_val, value + offset, sizeof(char)*MAX_ADDRESS_VAL_LEN);
815 MSG_SEC_DEBUG("[#%2d][%5d] address val = %s", deserial_index++, offset, to_addr->address_val);
816 offset += sizeof(char)*MAX_ADDRESS_VAL_LEN;
818 pMmsData->header->to = g_list_append(pMmsData->header->to, (void *)to_addr);
821 memcpy(&addr_cnt, value + offset, sizeof(int));
822 offset += sizeof(int);
824 pMmsData->header->cc = NULL;
826 for (i = 0; i < addr_cnt; i++) {
827 MMS_ADDRESS_DATA_S* cc_addr = (MMS_ADDRESS_DATA_S*)calloc(1, sizeof(MMS_ADDRESS_DATA_S));
831 memcpy(&(cc_addr->address_type), value + offset, sizeof(int));
832 MSG_DEBUG("[#%2d][%5d] address type = %d", deserial_index++, offset, cc_addr->address_type);
833 offset += sizeof(int);
835 memcpy(cc_addr->address_val, value + offset, sizeof(char)*MAX_ADDRESS_VAL_LEN);
836 MSG_SEC_DEBUG("[#%2d][%5d] address val = %s", deserial_index++, offset, cc_addr->address_val);
837 offset += sizeof(char)*MAX_ADDRESS_VAL_LEN;
839 pMmsData->header->cc = g_list_append(pMmsData->header->cc, (void *)cc_addr);
842 memcpy(&addr_cnt, value + offset, sizeof(int));
843 offset += sizeof(int);
845 pMmsData->header->bcc = NULL;
847 for (i = 0; i < addr_cnt; i++) {
848 MMS_ADDRESS_DATA_S* bcc_addr = (MMS_ADDRESS_DATA_S*)calloc(1, sizeof(MMS_ADDRESS_DATA_S));
849 if (bcc_addr == NULL)
852 memcpy(&(bcc_addr->address_type), value + offset, sizeof(int));
853 MSG_DEBUG("[#%2d][%5d] address type = %d", deserial_index++, offset, bcc_addr->address_type);
854 offset += sizeof(int);
856 memcpy(bcc_addr->address_val, value + offset, sizeof(char)*MAX_ADDRESS_VAL_LEN);
857 MSG_SEC_DEBUG("[#%2d][%5d] address val = %s", deserial_index++, offset, bcc_addr->address_val);
858 offset += sizeof(char)*MAX_ADDRESS_VAL_LEN;
860 pMmsData->header->bcc = g_list_append(pMmsData->header->bcc, (void *)bcc_addr);
865 memcpy(&isExistSmil, value + offset, sizeof(int));
866 offset += sizeof(int);
869 pMmsData->smil = (MMS_MULTIPART_DATA_S *)calloc(1, sizeof(MMS_MULTIPART_DATA_S));
870 if (pMmsData->smil == NULL)
873 memcpy(pMmsData->smil, value + offset, sizeof(MMS_MULTIPART_DATA_S));
874 offset += sizeof(MMS_MULTIPART_DATA_S);
876 MSG_SEC_DEBUG("SMIL file path = [%s]", pMmsData->smil->szFilePath);
877 MSG_DEBUG("SMIL nMultipartDataLen = [%zu]", pMmsData->smil->nMultipartDataLen);
879 if (pMmsData->smil->nMultipartDataLen > 0) {
880 pMmsData->smil->pMultipartData = (char *)calloc(1, sizeof(char)*pMmsData->smil->nMultipartDataLen);
881 if (pMmsData->smil->pMultipartData == NULL)
884 memcpy(pMmsData->smil->pMultipartData, value + offset, sizeof(char)*pMmsData->smil->nMultipartDataLen);
885 MSG_DEBUG("[#%2d][%5d] smil data ptr = %p", deserial_index++, offset, pMmsData->smil->pMultipartData);
886 offset += sizeof(char)*pMmsData->smil->nMultipartDataLen;
888 pMmsData->smil->pMultipartData = NULL;
892 /* 4. Multipart list data */
893 memcpy(&isExistMultipart, value + offset, sizeof(int));
894 offset += sizeof(int);
896 if (isExistMultipart) {
897 memcpy(&multipart_cnt, value + offset, sizeof(int));
898 offset += sizeof(int);
900 MSG_DEBUG("Multipart list count = [ %d]", multipart_cnt);
902 pMmsData->multipartlist = NULL;
904 for (i = 0; i < multipart_cnt; i++) {
905 MMS_MULTIPART_DATA_S *multipart_data = (MMS_MULTIPART_DATA_S *)calloc(1, sizeof(MMS_MULTIPART_DATA_S));
906 if (multipart_data == NULL)
909 memcpy(multipart_data, value + offset, sizeof(MMS_MULTIPART_DATA_S));
910 offset += sizeof(MMS_MULTIPART_DATA_S);
912 MSG_SEC_DEBUG("Multipart file path = [%s]", multipart_data->szFilePath);
914 if (multipart_data->nMultipartDataLen > 0) {
915 multipart_data->pMultipartData = (char *)calloc(1, sizeof(char)*multipart_data->nMultipartDataLen);
916 if (multipart_data->pMultipartData == NULL) {
917 free(multipart_data);
921 memcpy(multipart_data->pMultipartData, value + offset, sizeof(char)*multipart_data->nMultipartDataLen);
922 MSG_DEBUG("[#%2d][%5d] multipart_data ptr = %p", deserial_index++, offset, multipart_data->pMultipartData);
923 offset += sizeof(char)*multipart_data->nMultipartDataLen;
925 multipart_data->pMultipartData = NULL;
927 pMmsData->multipartlist = g_list_append(pMmsData->multipartlist, (void *)multipart_data);
931 MSG_DEBUG("Final offset : %d", offset);