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.
20 #include "MsgStorageTypes.h"
21 #include "MsgInternalTypes.h"
22 #include "MsgMmsMessage.h"
23 #include "MsgSerialize.h"
25 #include "msg_private.h"
27 msg_struct_s *__msg_message_create_address_struct()
29 msg_struct_s *msg_struct = new msg_struct_s;
30 bzero(msg_struct, sizeof(msg_struct_s));
32 msg_struct->type = MSG_STRUCT_ADDRESS_INFO;
33 msg_struct->data = new MSG_ADDRESS_INFO_S;
34 memset(msg_struct->data, 0x00, sizeof(MSG_ADDRESS_INFO_S));
39 void __msg_message_release_address_struct(gpointer data)
44 msg_struct_s *addr_struct = (msg_struct_s *)data;
45 MSG_ADDRESS_INFO_S *addrInfo = (MSG_ADDRESS_INFO_S *)addr_struct->data;
47 delete (MSG_ADDRESS_INFO_S *)addrInfo;
49 addr_struct->data = NULL;
55 void msg_message_create_struct(msg_struct_s *msg_struct)
57 MSG_MESSAGE_HIDDEN_S *msg = (MSG_MESSAGE_HIDDEN_S *)new MSG_MESSAGE_HIDDEN_S;
58 memset(msg, 0x00, sizeof(MSG_MESSAGE_HIDDEN_S));
60 /* set default value to message*/
63 msg->folderId = MSG_DRAFT_ID;
64 msg->mainType= MSG_SMS_TYPE;
65 msg->subType = MSG_NORMAL_SMS;
66 msg->classType = MSG_CLASS_NONE;
67 msg->storageId = MSG_STORAGE_PHONE;
68 time_t curTime = time(NULL);
69 msg->displayTime = curTime;
70 msg->networkStatus = MSG_NETWORK_NOT_SEND;
71 msg->encodeType = MSG_ENCODE_AUTO;
73 msg->bProtected = false;
75 msg->priority = MSG_MESSAGE_PRIORITY_NORMAL;
76 msg->direction = MSG_DIRECTION_TYPE_MO;
77 msg->bPortValid = false;
82 msg->simIndex = MSG_SIM_SLOT_ID_1;
84 /* Allocate memory for address list of message */
85 msg_struct_list_s *addr_list = (msg_struct_list_s *)new msg_struct_list_s;
87 addr_list->nCount = 0;
88 addr_list->msg_struct_info = (msg_struct_t *)calloc(MAX_TO_ADDRESS_CNT, sizeof(MSG_ADDRESS_INFO_S *));
90 msg_struct_s *pTmp = NULL;
92 for (int i = 0; i < MAX_TO_ADDRESS_CNT; i++) {
93 addr_list->msg_struct_info[i] = (msg_struct_t)new msg_struct_s;
94 pTmp = (msg_struct_s *)addr_list->msg_struct_info[i];
95 pTmp->type = MSG_STRUCT_ADDRESS_INFO;
96 pTmp->data = new MSG_ADDRESS_INFO_S;
97 memset(pTmp->data, 0x00, sizeof(MSG_ADDRESS_INFO_S));
100 msg->addr_list = addr_list;
102 msg->addressList = NULL;
104 msg_struct->data = (int *)msg;
107 int msg_message_release(msg_struct_s **msg_struct)
109 MSG_MESSAGE_HIDDEN_S *msg = (MSG_MESSAGE_HIDDEN_S *)(*msg_struct)->data;
112 delete [] static_cast<char*>(msg->pData);
117 delete [] static_cast<char*>(msg->pMmsData);
118 msg->pMmsData = NULL;
119 msg->mmsDataSize = 0;
123 if (msg->addr_list != NULL)
125 for(int i=0; i<MAX_TO_ADDRESS_CNT; i++) {
126 msg_struct_s * addrInfo = (msg_struct_s *)msg->addr_list->msg_struct_info[i];
127 delete (MSG_ADDRESS_INFO_S *)addrInfo->data;
128 addrInfo->data = NULL;
129 delete (msg_struct_s *)msg->addr_list->msg_struct_info[i];
130 msg->addr_list->msg_struct_info[i] = NULL;
133 g_free(msg->addr_list->msg_struct_info);
135 delete msg->addr_list;
136 msg->addr_list = NULL;
139 // Free GList *addressList
140 if (msg->addressList) {
141 g_list_free_full(msg->addressList, __msg_message_release_address_struct);
142 msg->addressList = NULL;
146 (*msg_struct)->data = NULL;
148 delete (msg_struct_s *)*msg_struct;
154 int msg_message_get_int_value(void *data, int field, int *value)
157 return MSG_ERR_NULL_POINTER;
159 int ret = MSG_SUCCESS;
161 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
165 case MSG_MESSAGE_ID_INT :
166 *value = msg_data->msgId;
168 case MSG_MESSAGE_THREAD_ID_INT :
169 *value = msg_data->threadId;
171 case MSG_MESSAGE_FOLDER_ID_INT :
172 *value = msg_data->folderId;
174 case MSG_MESSAGE_TYPE_INT :
176 if (msg_data->mainType == MSG_SMS_TYPE)
178 switch (msg_data->subType) {
180 *value = MSG_TYPE_SMS_CB;
182 case MSG_JAVACB_SMS :
183 *value = MSG_TYPE_SMS_JAVACB;
185 case MSG_WAP_SI_SMS :
186 case MSG_WAP_SL_SMS :
187 *value = MSG_TYPE_SMS_WAPPUSH;
189 case MSG_MWI_VOICE_SMS :
190 case MSG_MWI_FAX_SMS :
191 case MSG_MWI_EMAIL_SMS :
192 case MSG_MWI_OTHER_SMS :
193 *value = MSG_TYPE_SMS_MWI;
196 *value = MSG_TYPE_SMS_SYNCML;
198 case MSG_REJECT_SMS :
199 *value = MSG_TYPE_SMS_REJECT;
202 *value = MSG_TYPE_SMS_ETWS_PRIMARY;
204 case MSG_CMAS_PRESIDENTIAL :
205 *value = MSG_TYPE_SMS_CMAS_PRESIDENTIAL;
207 case MSG_CMAS_EXTREME :
208 *value = MSG_TYPE_SMS_CMAS_EXTREME;
210 case MSG_CMAS_SEVERE :
211 *value = MSG_TYPE_SMS_CMAS_SEVERE;
213 case MSG_CMAS_AMBER :
214 *value = MSG_TYPE_SMS_CMAS_AMBER;
217 *value = MSG_TYPE_SMS_CMAS_TEST;
219 case MSG_CMAS_OPERATOR_DEFINED :
220 *value = MSG_TYPE_SMS_CMAS_OPERATOR_DEFINED;
223 *value = MSG_TYPE_SMS;
226 else if (msg_data->mainType == MSG_MMS_TYPE)
228 if (msg_data->subType == MSG_NOTIFICATIONIND_MMS)
229 *value = MSG_TYPE_MMS_NOTI;
230 else if (msg_data->subType == MSG_SENDREQ_JAVA_MMS)
231 *value = MSG_TYPE_MMS_JAVA;
233 *value = MSG_TYPE_MMS;
236 *value = MSG_TYPE_INVALID;
240 case MSG_MESSAGE_CLASS_TYPE_INT :
241 *value = msg_data->classType;
243 case MSG_MESSAGE_STORAGE_ID_INT :
244 *value = msg_data->storageId;
246 case MSG_MESSAGE_DISPLAY_TIME_INT :
247 *value = msg_data->displayTime;
249 case MSG_MESSAGE_NETWORK_STATUS_INT :
250 *value = msg_data->networkStatus;
252 case MSG_MESSAGE_ENCODE_TYPE_INT :
253 *value = msg_data->encodeType;
255 case MSG_MESSAGE_PRIORITY_INT :
256 *value = msg_data->priority;
258 case MSG_MESSAGE_DIRECTION_INT :
259 *value = msg_data->direction;
261 case MSG_MESSAGE_DEST_PORT_INT :
262 *value = msg_data->dstPort;
264 case MSG_MESSAGE_SRC_PORT_INT :
265 *value = msg_data->srcPort;
267 case MSG_MESSAGE_ATTACH_COUNT_INT :
268 *value = msg_data->attachCount;
270 case MSG_MESSAGE_DATA_SIZE_INT :
271 *value = msg_data->dataSize;
273 case MSG_MESSAGE_SIM_INDEX_INT :
274 *value = msg_data->simIndex;
277 ret = MSG_ERR_INVALID_PARAMETER;
284 int msg_message_get_bool_value(void *data, int field, bool *value)
287 return MSG_ERR_NULL_POINTER;
289 int ret = MSG_SUCCESS;
291 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
294 case MSG_MESSAGE_READ_BOOL :
295 *value = msg_data->bRead;
297 case MSG_MESSAGE_PROTECTED_BOOL :
298 *value = msg_data->bProtected;
300 case MSG_MESSAGE_BACKUP_BOOL :
301 *value = msg_data->bBackup;
303 case MSG_MESSAGE_PORT_VALID_BOOL :
304 *value = msg_data->bPortValid;
306 case MSG_MESSAGE_REPLACE_BOOL :
308 if (msg_data->subType >= MSG_REPLACE_TYPE1_SMS && msg_data->subType <= MSG_REPLACE_TYPE7_SMS)
315 ret = MSG_ERR_INVALID_PARAMETER;
322 int msg_message_get_str_value(void *data, int field, char *value, int size)
325 return MSG_ERR_NULL_POINTER;
327 int ret = MSG_SUCCESS;
329 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
332 case MSG_MESSAGE_REPLY_ADDR_STR :
333 strncpy(value, msg_data->replyAddress, size);
335 case MSG_MESSAGE_SUBJECT_STR :
336 strncpy(value, msg_data->subject, size);
338 case MSG_MESSAGE_THUMBNAIL_PATH_STR :
339 strncpy(value, msg_data->thumbPath, size);
341 case MSG_MESSAGE_SMS_DATA_STR :
342 case MSG_MESSAGE_MMS_TEXT_STR :
345 if (msg_data->mainType == MSG_SMS_TYPE) {
347 ((size_t)size >= msg_data->dataSize)? (data_len = msg_data->dataSize) : data_len = size;
348 memset(value, 0, size);
349 memcpy(value, msg_data->pData, data_len);
350 } else if (msg_data->mainType == MSG_MMS_TYPE) {
351 memset(value, 0, size);
352 strncpy(value, (char *)msg_data->pData, size);
358 ret = MSG_ERR_INVALID_PARAMETER;
365 int msg_message_get_struct_hnd(void *data, int field, void **value)
368 return MSG_ERR_NULL_POINTER;
370 int ret = MSG_SUCCESS;
374 ret = MSG_ERR_INVALID_PARAMETER;
381 int msg_message_get_list_hnd(void *data, int field, void **value)
384 return MSG_ERR_NULL_POINTER;
386 int ret = MSG_SUCCESS;
388 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
391 case MSG_MESSAGE_ADDR_LIST_STRUCT :
392 *value = (void *)msg_data->addr_list;
394 case MSG_MESSAGE_ADDR_LIST_HND :
395 *value = (msg_list_handle_t)msg_data->addressList;
398 ret = MSG_ERR_INVALID_PARAMETER;
405 int msg_message_set_int_value(void *data, int field, int value)
408 return MSG_ERR_NULL_POINTER;
410 int ret = MSG_SUCCESS;
412 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
416 case MSG_MESSAGE_ID_INT :
417 msg_data->msgId = value;
419 case MSG_MESSAGE_THREAD_ID_INT :
420 msg_data->threadId = value;
422 case MSG_MESSAGE_FOLDER_ID_INT :
423 msg_data->folderId = value;
425 case MSG_MESSAGE_TYPE_INT :
427 if (value == MSG_TYPE_SMS) {
428 msg_data->mainType = MSG_SMS_TYPE;
429 msg_data->subType = MSG_NORMAL_SMS;
431 else if (value == MSG_TYPE_MMS) {
432 msg_data->mainType = MSG_MMS_TYPE;
433 msg_data->subType = MSG_SENDREQ_MMS;
435 else if (value == MSG_TYPE_MMS_JAVA) {
436 msg_data->mainType = MSG_MMS_TYPE;
437 msg_data->subType = MSG_SENDREQ_JAVA_MMS;
439 else if (value == MSG_TYPE_SMS_SYNCML) {
440 msg_data->mainType = MSG_SMS_TYPE;
441 msg_data->subType = MSG_SYNCML_CP;
443 else if (value == MSG_TYPE_SMS_REJECT) {
444 msg_data->mainType = MSG_SMS_TYPE;
445 msg_data->subType = MSG_REJECT_SMS;
447 else if (value == MSG_TYPE_SMS_ETWS_PRIMARY) {
448 msg_data->mainType = MSG_SMS_TYPE;
449 msg_data->subType = MSG_ETWS_SMS;
453 case MSG_MESSAGE_CLASS_TYPE_INT :
454 msg_data->classType = value;
456 case MSG_MESSAGE_STORAGE_ID_INT :
457 msg_data->storageId = value;
459 case MSG_MESSAGE_DISPLAY_TIME_INT :
460 msg_data->displayTime = value;
462 case MSG_MESSAGE_NETWORK_STATUS_INT :
463 msg_data->networkStatus = value;
465 case MSG_MESSAGE_ENCODE_TYPE_INT :
466 msg_data->encodeType = value;
468 case MSG_MESSAGE_PRIORITY_INT :
469 msg_data->priority = value;
471 case MSG_MESSAGE_DIRECTION_INT :
472 msg_data->direction = value;
474 case MSG_MESSAGE_DEST_PORT_INT :
475 msg_data->dstPort = value;
477 case MSG_MESSAGE_SRC_PORT_INT :
478 msg_data->srcPort = value;
480 case MSG_MESSAGE_ATTACH_COUNT_INT :
481 msg_data->attachCount = value;
483 case MSG_MESSAGE_DATA_SIZE_INT :
484 msg_data->dataSize = value;
486 case MSG_MESSAGE_SIM_INDEX_INT :
487 msg_data->simIndex = value;
490 ret = MSG_ERR_INVALID_PARAMETER;
497 int msg_message_set_bool_value(void *data, int field, bool value)
500 return MSG_ERR_NULL_POINTER;
502 int ret = MSG_SUCCESS;
504 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
507 case MSG_MESSAGE_READ_BOOL :
508 msg_data->bRead = value;
510 case MSG_MESSAGE_PROTECTED_BOOL :
511 msg_data->bProtected = value;
513 case MSG_MESSAGE_BACKUP_BOOL :
514 msg_data->bBackup = value;
516 case MSG_MESSAGE_PORT_VALID_BOOL :
517 msg_data->bPortValid = value;
520 ret = MSG_ERR_INVALID_PARAMETER;
527 int msg_message_set_str_value(void *data, int field, char *value, int size)
530 return MSG_ERR_NULL_POINTER;
532 int ret = MSG_SUCCESS;
534 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
537 case MSG_MESSAGE_REPLY_ADDR_STR :
538 snprintf(msg_data->replyAddress, sizeof(msg_data->replyAddress), "%s", value);
540 case MSG_MESSAGE_SUBJECT_STR :
541 snprintf(msg_data->subject, sizeof(msg_data->subject), "%s",value);
543 case MSG_MESSAGE_THUMBNAIL_PATH_STR :
544 snprintf(msg_data->thumbPath, sizeof(msg_data->thumbPath), "%s",value);
546 case MSG_MESSAGE_SMS_DATA_STR :
549 delete [] static_cast<char*>(msg_data->pData);
551 msg_data->dataSize = size;
552 msg_data->pData = (void*)new char[msg_data->dataSize+1];
553 memcpy((char *)msg_data->pData, value, msg_data->dataSize);
554 ((char*) msg_data->pData)[msg_data->dataSize] = '\0';
558 ret = MSG_ERR_INVALID_PARAMETER;
565 int msg_message_set_struct_hnd(void *data, int field, void *value)
568 return MSG_ERR_NULL_POINTER;
570 int ret = MSG_SUCCESS;
574 ret = MSG_ERR_INVALID_PARAMETER;
581 void msg_message_copy_message(MSG_MESSAGE_HIDDEN_S *pSrc, MSG_MESSAGE_HIDDEN_S *pDst)
584 pDst->msgId = pSrc->msgId;
585 pDst->threadId = pSrc->msgId;
586 pDst->folderId = pSrc->folderId;
587 pDst->mainType = pSrc->mainType;
588 pDst->subType = pSrc->subType;
589 pDst->classType = pSrc->classType;
590 pDst->storageId = pSrc->storageId;
591 pDst->displayTime = pSrc->displayTime;
592 pDst->networkStatus = pSrc->networkStatus;
593 pDst->encodeType = pSrc->encodeType;
594 pDst->bRead = pSrc->bRead;
595 pDst->bProtected = pSrc->bProtected;
596 pDst->bBackup = pSrc->bBackup;
597 pDst->priority = pSrc->priority;
598 pDst->direction = pSrc->direction;
599 pDst->bPortValid = pSrc->bPortValid;
600 pDst->dataSize = pSrc->dataSize;
601 pDst->mmsDataSize = pSrc->mmsDataSize;
602 pDst->simIndex = pSrc->simIndex;
603 memcpy(pDst->subject, pSrc->subject, sizeof(pDst->subject));
605 if(pSrc->pMmsData && pSrc->mmsDataSize)
607 pDst->pMmsData = new char[pSrc->mmsDataSize];
608 memcpy(pDst->pMmsData, pSrc->pMmsData, pSrc->mmsDataSize);
611 if(pSrc->dataSize && pSrc->pData)
613 int data_len = strlen((const char *)pSrc->pData);
614 pDst->pData = new char[data_len + 1];
615 memset(pDst->pData, 0x00, data_len + 1);
616 strncpy((char *)pDst->pData, (const char *)pSrc->pData, data_len);
619 msg_struct_list_s *src_addrlist = pSrc->addr_list;
620 msg_struct_list_s *dst_addrlist = pDst->addr_list;
621 dst_addrlist->nCount = src_addrlist->nCount;
623 for(int i=0; i < MAX_TO_ADDRESS_CNT; ++i)
625 msg_struct_s *src_addr = (msg_struct_s *)src_addrlist->msg_struct_info[i];
626 msg_struct_s *dst_addr = (msg_struct_s *)dst_addrlist->msg_struct_info[i];
627 memcpy(dst_addr->data, src_addr->data, sizeof(MSG_ADDRESS_INFO_S));
630 if (strlen(pSrc->thumbPath) > 0) {
631 memset(pDst->thumbPath, 0x00, sizeof(pDst->thumbPath));
632 memcpy(pDst->thumbPath, pSrc->thumbPath, sizeof(pDst->thumbPath));
635 for (unsigned int i=0; i < g_list_length(pSrc->addressList); i++) {
636 msg_struct_s *addr_struct = __msg_message_create_address_struct();
637 MSG_ADDRESS_INFO_S *addrInfo = (MSG_ADDRESS_INFO_S *)addr_struct->data;
639 msg_struct_s *addr_info = (msg_struct_s *)g_list_nth_data(pSrc->addressList,(guint)i);
640 MSG_ADDRESS_INFO_S *address = (MSG_ADDRESS_INFO_S *)addr_info->data;
642 addrInfo->addressType = address->addressType;
643 addrInfo->recipientType = address->recipientType;
644 addrInfo->contactId = address->contactId;
645 strncpy(addrInfo->addressVal, address->addressVal, MAX_ADDRESS_VAL_LEN);
646 strncpy(addrInfo->displayName, address->displayName, MAX_DISPLAY_NAME_LEN);
647 addrInfo->displayName[MAX_DISPLAY_NAME_LEN] = '\0';
649 pDst->addressList = g_list_append(pDst->addressList, addr_struct);
653 int msg_cb_message_get_int_value(void *data, int field, int *value)
656 return MSG_ERR_NULL_POINTER;
658 int ret = MSG_SUCCESS;
660 MSG_CB_MSG_S *cb_msg = (MSG_CB_MSG_S *)data;
666 case MSG_CB_MSG_TYPE_INT :
668 switch (cb_msg->type) {
670 *value = MSG_TYPE_SMS_ETWS_PRIMARY;
673 *value = ((cb_msg->messageId & 0xFFF8) == 0x1100 ) ? MSG_TYPE_SMS_ETWS_SECONDARY : MSG_TYPE_SMS_CB;
675 case MSG_CMAS_PRESIDENTIAL :
676 *value = MSG_TYPE_SMS_CMAS_PRESIDENTIAL;
678 case MSG_CMAS_EXTREME :
679 *value = MSG_TYPE_SMS_CMAS_EXTREME;
681 case MSG_CMAS_SEVERE :
682 *value = MSG_TYPE_SMS_CMAS_SEVERE;
684 case MSG_CMAS_AMBER :
685 *value = MSG_TYPE_SMS_CMAS_AMBER;
688 *value = MSG_TYPE_SMS_CMAS_TEST;
690 case MSG_CMAS_OPERATOR_DEFINED :
691 *value = MSG_TYPE_SMS_CMAS_OPERATOR_DEFINED;
694 ret = MSG_ERR_UNKNOWN;
698 case MSG_CB_MSG_RECV_TIME_INT :
699 *value = cb_msg->receivedTime;
701 case MSG_CB_MSG_SERIAL_NUM_INT :
702 *value = cb_msg->serialNum;
704 case MSG_CB_MSG_MSG_ID_INT :
705 *value = cb_msg->messageId;
707 case MSG_CB_MSG_DCS_INT :
708 *value = (int)cb_msg->dcs;
710 case MSG_CB_MSG_CB_TEXT_LEN_INT :
711 *value = cb_msg->cbTextLen;
713 case MSG_CB_MSG_ETWS_WARNING_TYPE_INT :
714 *value = cb_msg->etwsWarningType;
717 ret = MSG_ERR_INVALID_PARAMETER;
724 int msg_cb_message_get_str_value(void *data, int field, char *value, int size)
727 return MSG_ERR_NULL_POINTER;
729 int ret = MSG_SUCCESS;
731 MSG_CB_MSG_S *cb_msg = (MSG_CB_MSG_S *)data;
734 case MSG_CB_MSG_CB_TEXT_STR:
737 copylen = (size > cb_msg->cbTextLen) ? cb_msg->cbTextLen : size - 1;
738 memcpy (value, cb_msg->cbText, copylen);
739 value[copylen] = '\0';
742 case MSG_CB_MSG_LANGUAGE_TYPE_STR:
745 copylen = ((size_t)size > strlen((const char*)cb_msg->language_type)) ? strlen((const char*)cb_msg->language_type) : size - 1;
746 memcpy (value, cb_msg->language_type, copylen);
747 value[copylen] = '\0';
750 case MSG_CB_MSG_ETWS_WARNING_SECU_INFO_STR:
752 if ((size_t)size < sizeof(cb_msg->etwsWarningSecurityInfo))
753 ret = MSG_ERR_INVALID_PARAMETER;
755 memcpy (value, cb_msg->etwsWarningSecurityInfo, sizeof(cb_msg->etwsWarningSecurityInfo));
760 ret = MSG_ERR_INVALID_PARAMETER;
769 EXPORT_API int msg_get_mms_struct(msg_struct_t msg_struct_handle, msg_struct_t mms_struct_handle)
771 CHECK_MSG_SUPPORTED(MSG_TELEPHONY_MMS_FEATURE);
772 //TODO :: check message type is MMS
773 int ret = MSG_SUCCESS;
774 msg_struct_s *msg_struct = (msg_struct_s *)msg_struct_handle;
775 msg_struct_s *mms_struct = (msg_struct_s *)mms_struct_handle;
777 if (msg_struct == NULL || mms_struct == NULL) {
778 return MSG_ERR_INVALID_PARAMETER;
781 if (msg_struct->data == NULL || mms_struct->data == NULL) {
782 return MSG_ERR_INVALID_PARAMETER;
785 if (msg_struct->type != MSG_STRUCT_MESSAGE_INFO || mms_struct->type != MSG_STRUCT_MMS) {
786 return MSG_ERR_INVALID_PARAMETER;
789 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)msg_struct->data;
791 if (msg_data->pMmsData == NULL) {
792 return MSG_ERR_INVALID_PARAMETER;
795 MMS_DATA_S *mms_data = NULL;
797 MsgDeserializeMmsData((char*)msg_data->pMmsData, msg_data->mmsDataSize, &mms_data);
800 convert_to_hidden_mmsdata(mms_data, mms_struct);
802 MsgMmsRelease(&mms_data);
804 return MSG_ERR_INVALID_PARAMETER;
810 EXPORT_API int msg_set_mms_struct(msg_struct_t msg_struct_handle, msg_struct_t mms_struct_handle)
812 CHECK_MSG_SUPPORTED(MSG_TELEPHONY_MMS_FEATURE);
813 //TODO :: check message type is MMS
814 int ret = MSG_SUCCESS;
815 msg_struct_s *msg_struct = (msg_struct_s *)msg_struct_handle;
816 msg_struct_s *mms_struct = (msg_struct_s *)mms_struct_handle;
818 if (msg_struct == NULL || mms_struct == NULL) {
819 return MSG_ERR_INVALID_PARAMETER;
822 if (msg_struct->data == NULL || mms_struct->data == NULL) {
823 return MSG_ERR_INVALID_PARAMETER;
826 if (msg_struct->type != MSG_STRUCT_MESSAGE_INFO || mms_struct->type != MSG_STRUCT_MMS) {
827 return MSG_ERR_INVALID_PARAMETER;
830 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)msg_struct->data;
832 MMS_DATA_S *mms_data = MsgMmsCreate();
834 convert_from_hidden_mmsdata(mms_struct, mms_data);
836 int mmsDataSize = MsgSerializeMms(mms_data, (char **)&msg_data->pMmsData);
839 msg_data->mmsDataSize = mmsDataSize;
843 MsgMmsRelease(&mms_data);
849 int msg_message_list_append(msg_struct_t msg_struct_handle, int field, msg_struct_t *item)
851 msg_error_t err = MSG_SUCCESS;
852 msg_struct_s *msg_struct = (msg_struct_s *)msg_struct_handle;
853 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)msg_struct->data;
855 msg_struct_s *msg_struct_item = NULL;
857 case MSG_MESSAGE_ADDR_LIST_HND:
859 msg_struct_item = __msg_message_create_address_struct();
860 msg_data->addressList = g_list_append(msg_data->addressList, msg_struct_item);
861 *item = (msg_struct_t)msg_struct_item;
865 err = MSG_ERR_INVALID_PARAMETER;
873 int msg_message_list_clear(msg_struct_t msg_struct_handle, int field)
875 msg_error_t err = MSG_SUCCESS;
876 msg_struct_s *msg_struct = (msg_struct_s *)msg_struct_handle;
877 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)msg_struct->data;
880 case MSG_MESSAGE_ADDR_LIST_HND:
882 // Free GList *addressList
883 if (msg_data->addressList) {
884 g_list_free_full(msg_data->addressList, __msg_message_release_address_struct);
885 msg_data->addressList = NULL;
890 err = MSG_ERR_INVALID_PARAMETER;
897 int msg_conversation_get_list_hnd(void *data, int field, void **value)
900 return MSG_ERR_NULL_POINTER;
902 int ret = MSG_SUCCESS;
904 MSG_CONVERSATION_VIEW_S *msg_data = (MSG_CONVERSATION_VIEW_S *)data;
907 case MSG_CONV_MSG_MULTIPART_HND :
908 *value = (void *)msg_data->multipart_list;
911 ret = MSG_ERR_INVALID_PARAMETER;