modify msg-service to support dpm feature
[platform/core/messaging/msg-service.git] / mapi / msg_message.cpp
1 /*
2  * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15 */
16
17 #include <string.h>
18
19 #include "MsgTypes.h"
20 #include "MsgStorageTypes.h"
21 #include "MsgInternalTypes.h"
22 #include "MsgMmsMessage.h"
23 #include "MsgSerialize.h"
24 #include "msg.h"
25 #include "msg_private.h"
26
27 msg_struct_s *__msg_message_create_address_struct()
28 {
29         msg_struct_s *msg_struct = new msg_struct_s;
30         bzero(msg_struct, sizeof(msg_struct_s));
31
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));
35
36         return msg_struct;
37 }
38
39 void __msg_message_release_address_struct(gpointer data)
40 {
41         if (data == NULL)
42                 return;
43
44         msg_struct_s *addr_struct = (msg_struct_s *)data;
45         MSG_ADDRESS_INFO_S *addrInfo = (MSG_ADDRESS_INFO_S *)addr_struct->data;
46
47         delete (MSG_ADDRESS_INFO_S *)addrInfo;
48
49         addr_struct->data = NULL;
50
51         delete addr_struct;
52 }
53
54
55 void msg_message_create_struct(msg_struct_s *msg_struct)
56 {
57         MSG_MESSAGE_HIDDEN_S *msg = (MSG_MESSAGE_HIDDEN_S *)new MSG_MESSAGE_HIDDEN_S;
58         memset(msg, 0x00, sizeof(MSG_MESSAGE_HIDDEN_S));
59
60         /* set default value to message*/
61         msg->msgId = 0;
62         msg->threadId = 0;
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;
72         msg->bRead = false;
73         msg->bProtected = false;
74         msg->bBackup = false;
75         msg->priority = MSG_MESSAGE_PRIORITY_NORMAL;
76         msg->direction = MSG_DIRECTION_TYPE_MO;
77         msg->bPortValid = false;
78         msg->dataSize = 0;
79         msg->pData = NULL;
80         msg->pMmsData = NULL;
81         msg->mmsDataSize = 0;
82         msg->simIndex = MSG_SIM_SLOT_ID_1;
83
84         /* Allocate memory for address list of message */
85         msg_struct_list_s *addr_list = (msg_struct_list_s *)new msg_struct_list_s;
86
87         addr_list->nCount = 0;
88         addr_list->msg_struct_info = (msg_struct_t *)calloc(MAX_TO_ADDRESS_CNT, sizeof(msg_struct_s *));
89
90         if (addr_list->msg_struct_info != NULL) {
91                 msg_struct_s *pTmp = NULL;
92
93                 for (int i = 0; i < MAX_TO_ADDRESS_CNT; i++) {
94                         addr_list->msg_struct_info[i] = (msg_struct_t)new msg_struct_s;
95                         pTmp = (msg_struct_s *)addr_list->msg_struct_info[i];
96                         memset(pTmp, 0x00, sizeof(msg_struct_s));
97                         pTmp->type = MSG_STRUCT_ADDRESS_INFO;
98                         pTmp->data = new MSG_ADDRESS_INFO_S;
99                         memset(pTmp->data, 0x00, sizeof(MSG_ADDRESS_INFO_S));
100                 }
101         }
102
103         msg->addr_list = addr_list;
104
105         msg->addressList = NULL;
106
107         msg_struct->data = (int *)msg;
108 }
109
110 int msg_message_release(msg_struct_s **msg_struct)
111 {
112         MSG_MESSAGE_HIDDEN_S *msg = (MSG_MESSAGE_HIDDEN_S *)(*msg_struct)->data;
113
114         if (msg->pData) {
115                 delete [] static_cast<char*>(msg->pData);
116                 msg->pData = NULL;
117         }
118
119         if (msg->pMmsData) {
120                 delete [] static_cast<char*>(msg->pMmsData);
121                 msg->pMmsData = NULL;
122                 msg->mmsDataSize = 0;
123         }
124
125         /* Memory Free */
126         if (msg->addr_list != NULL) {
127                 for (int i = 0; i < MAX_TO_ADDRESS_CNT; i++) {
128                         msg_struct_s * addrInfo = (msg_struct_s *)msg->addr_list->msg_struct_info[i];
129                         delete (MSG_ADDRESS_INFO_S *)addrInfo->data;
130                         addrInfo->data = NULL;
131                         delete (msg_struct_s *)msg->addr_list->msg_struct_info[i];
132                         msg->addr_list->msg_struct_info[i] = NULL;
133                 }
134
135                 g_free(msg->addr_list->msg_struct_info);
136
137                 delete msg->addr_list;
138                 msg->addr_list = NULL;
139         }
140
141         /* Free GList *addressList */
142         if (msg->addressList) {
143                 g_list_free_full(msg->addressList, __msg_message_release_address_struct);
144                 msg->addressList = NULL;
145         }
146
147         delete msg;
148         (*msg_struct)->data = NULL;
149
150         delete (msg_struct_s *)*msg_struct;
151         *msg_struct = NULL;
152
153         return MSG_SUCCESS;
154 }
155
156 int msg_message_get_int_value(void *data, int field, int *value)
157 {
158         if (!data)
159                 return MSG_ERR_NULL_POINTER;
160
161         int ret = MSG_SUCCESS;
162
163         MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
164
165         switch (field) {
166         case MSG_MESSAGE_ID_INT:
167                 *value = msg_data->msgId;
168                 break;
169         case MSG_MESSAGE_THREAD_ID_INT:
170                 *value = msg_data->threadId;
171                 break;
172         case MSG_MESSAGE_FOLDER_ID_INT:
173                 *value = msg_data->folderId;
174                 break;
175         case MSG_MESSAGE_TYPE_INT: {
176                 if (msg_data->mainType == MSG_SMS_TYPE) {
177                         switch (msg_data->subType) {
178                                 case MSG_CB_SMS:
179                                         *value = MSG_TYPE_SMS_CB;
180                                         break;
181                                 case MSG_JAVACB_SMS:
182                                         *value = MSG_TYPE_SMS_JAVACB;
183                                         break;
184                                 case MSG_WAP_SI_SMS:
185                                 case MSG_WAP_SL_SMS:
186                                         *value = MSG_TYPE_SMS_WAPPUSH;
187                                         break;
188                                 case MSG_MWI_VOICE_SMS:
189                                 case MSG_MWI_FAX_SMS:
190                                 case MSG_MWI_EMAIL_SMS:
191                                 case MSG_MWI_OTHER_SMS:
192                                         *value = MSG_TYPE_SMS_MWI;
193                                         break;
194                                 case MSG_SYNCML_CP:
195                                         *value = MSG_TYPE_SMS_SYNCML;
196                                         break;
197                                 case MSG_REJECT_SMS:
198                                         *value = MSG_TYPE_SMS_REJECT;
199                                         break;
200                                 case MSG_ETWS_SMS:
201                                         *value = MSG_TYPE_SMS_ETWS_PRIMARY;
202                                         break;
203                                 case MSG_CMAS_PRESIDENTIAL:
204                                         *value = MSG_TYPE_SMS_CMAS_PRESIDENTIAL;
205                                         break;
206                                 case MSG_CMAS_EXTREME:
207                                         *value = MSG_TYPE_SMS_CMAS_EXTREME;
208                                         break;
209                                 case MSG_CMAS_SEVERE:
210                                         *value = MSG_TYPE_SMS_CMAS_SEVERE;
211                                         break;
212                                 case MSG_CMAS_AMBER:
213                                         *value = MSG_TYPE_SMS_CMAS_AMBER;
214                                         break;
215                                 case MSG_CMAS_TEST:
216                                         *value = MSG_TYPE_SMS_CMAS_TEST;
217                                         break;
218                                 case MSG_CMAS_EXERCISE:
219                                         *value = MSG_TYPE_SMS_CMAS_EXERCISE;
220                                         break;
221                                 case MSG_CMAS_OPERATOR_DEFINED:
222                                         *value = MSG_TYPE_SMS_CMAS_OPERATOR_DEFINED;
223                                         break;
224                                 default:
225                                         *value = MSG_TYPE_SMS;
226                                         break;
227                         }
228                 } else if (msg_data->mainType == MSG_MMS_TYPE) {
229                         if (msg_data->subType == MSG_NOTIFICATIONIND_MMS)
230                                 *value = MSG_TYPE_MMS_NOTI;
231                         else if (msg_data->subType == MSG_SENDREQ_JAVA_MMS)
232                                 *value = MSG_TYPE_MMS_JAVA;
233                         else
234                                 *value = MSG_TYPE_MMS;
235                 } else {
236                         *value = MSG_TYPE_INVALID;
237                 }
238
239                 break;
240         }
241         case MSG_MESSAGE_CLASS_TYPE_INT:
242                 *value = msg_data->classType;
243                 break;
244         case MSG_MESSAGE_STORAGE_ID_INT:
245                 *value = msg_data->storageId;
246                 break;
247         case MSG_MESSAGE_DISPLAY_TIME_INT:
248                 *value = msg_data->displayTime;
249                 break;
250         case MSG_MESSAGE_NETWORK_STATUS_INT:
251                 *value = msg_data->networkStatus;
252                 break;
253         case MSG_MESSAGE_ENCODE_TYPE_INT:
254                 *value = msg_data->encodeType;
255                 break;
256         case MSG_MESSAGE_PRIORITY_INT:
257                 *value = msg_data->priority;
258                 break;
259         case MSG_MESSAGE_DIRECTION_INT:
260                 *value = msg_data->direction;
261                 break;
262         case MSG_MESSAGE_DEST_PORT_INT:
263                 *value = msg_data->dstPort;
264                 break;
265         case MSG_MESSAGE_SRC_PORT_INT:
266                 *value = msg_data->srcPort;
267                 break;
268         case MSG_MESSAGE_ATTACH_COUNT_INT:
269                 *value = msg_data->attachCount;
270                 break;
271         case MSG_MESSAGE_DATA_SIZE_INT:
272                 *value = msg_data->dataSize;
273                 break;
274         case MSG_MESSAGE_SIM_INDEX_INT:
275                 *value = msg_data->simIndex;
276                 break;
277         default:
278                 ret = MSG_ERR_INVALID_PARAMETER;
279                 break;
280         }
281
282         return ret;
283 }
284
285 int msg_message_get_bool_value(void *data, int field, bool *value)
286 {
287         if (!data)
288                 return MSG_ERR_NULL_POINTER;
289
290         int ret = MSG_SUCCESS;
291
292         MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
293
294         switch (field) {
295         case MSG_MESSAGE_READ_BOOL:
296                 *value = msg_data->bRead;
297                 break;
298         case MSG_MESSAGE_PROTECTED_BOOL:
299                 *value = msg_data->bProtected;
300                 break;
301         case MSG_MESSAGE_BACKUP_BOOL:
302                 *value = msg_data->bBackup;
303                 break;
304         case MSG_MESSAGE_PORT_VALID_BOOL:
305                 *value = msg_data->bPortValid;
306                 break;
307         case MSG_MESSAGE_REPLACE_BOOL: {
308                 if (msg_data->subType >= MSG_REPLACE_TYPE1_SMS && msg_data->subType <= MSG_REPLACE_TYPE7_SMS)
309                         *value = true;
310                 else
311                         *value = false;
312                 break;
313         }
314         case MSG_MESSAGE_DPM_RESTRICTED_BOOL:
315                 *value = msg_data->bRestricted;
316                 break;
317         default:
318                 ret = MSG_ERR_INVALID_PARAMETER;
319                 break;
320         }
321
322         return ret;
323 }
324
325 int msg_message_get_str_value(void *data, int field, char *value, int size)
326 {
327         if (!data || !value)
328                 return MSG_ERR_NULL_POINTER;
329
330         int ret = MSG_SUCCESS;
331
332         MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
333
334         switch (field) {
335         case MSG_MESSAGE_REPLY_ADDR_STR:
336                 strncpy(value, msg_data->replyAddress, size);
337                 break;
338         case MSG_MESSAGE_SUBJECT_STR:
339                 strncpy(value, msg_data->subject, size);
340                 break;
341         case MSG_MESSAGE_SMS_DATA_STR:
342         case MSG_MESSAGE_MMS_TEXT_STR:
343                 if (msg_data->pData) {
344                         if (msg_data->mainType == MSG_SMS_TYPE) {
345                                 int data_len = 0;
346                                 ((size_t)size >= msg_data->dataSize)? (data_len = msg_data->dataSize) : data_len = size;
347                                 memset(value, 0, size);
348                                 memcpy(value, msg_data->pData, data_len);
349                         } else if (msg_data->mainType == MSG_MMS_TYPE) {
350                                 memset(value, 0, size);
351                                 strncpy(value, (char *)msg_data->pData, size);
352                         }
353                 }
354                 break;
355
356         default:
357                 ret = MSG_ERR_INVALID_PARAMETER;
358                 break;
359         }
360
361         return ret;
362 }
363
364 int msg_message_get_struct_hnd(void *data, int field, void **value)
365 {
366         if (!data)
367                 return MSG_ERR_NULL_POINTER;
368
369         int ret = MSG_SUCCESS;
370
371         switch (field) {
372         default:
373                 ret = MSG_ERR_INVALID_PARAMETER;
374                 break;
375         }
376
377         return ret;
378 }
379
380 int msg_message_get_list_hnd(void *data, int field, void **value)
381 {
382         if (!data)
383                 return MSG_ERR_NULL_POINTER;
384
385         int ret = MSG_SUCCESS;
386
387         MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
388
389         switch (field) {
390         case MSG_MESSAGE_ADDR_LIST_STRUCT:
391                 *value = (void *)msg_data->addr_list;
392                 break;
393         case MSG_MESSAGE_ADDR_LIST_HND:
394                 *value = (msg_list_handle_t)msg_data->addressList;
395                 break;
396         default:
397                 ret = MSG_ERR_INVALID_PARAMETER;
398                 break;
399         }
400
401         return ret;
402 }
403
404 int msg_message_set_int_value(void *data, int field, int value)
405 {
406         if (!data)
407                 return MSG_ERR_NULL_POINTER;
408
409         int ret = MSG_SUCCESS;
410
411         MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
412
413         switch (field) {
414         case MSG_MESSAGE_ID_INT:
415                 msg_data->msgId = value;
416                 break;
417         case MSG_MESSAGE_THREAD_ID_INT:
418                 msg_data->threadId = value;
419                 break;
420         case MSG_MESSAGE_FOLDER_ID_INT:
421                 msg_data->folderId = value;
422                 break;
423         case MSG_MESSAGE_TYPE_INT: {
424                 if (value == MSG_TYPE_SMS) {
425                         msg_data->mainType = MSG_SMS_TYPE;
426                         msg_data->subType = MSG_NORMAL_SMS;
427                 } else if (value == MSG_TYPE_MMS) {
428                         msg_data->mainType = MSG_MMS_TYPE;
429                         msg_data->subType = MSG_SENDREQ_MMS;
430                 } else if (value == MSG_TYPE_MMS_JAVA) {
431                         msg_data->mainType = MSG_MMS_TYPE;
432                         msg_data->subType = MSG_SENDREQ_JAVA_MMS;
433                 } else if (value == MSG_TYPE_SMS_SYNCML) {
434                         msg_data->mainType = MSG_SMS_TYPE;
435                         msg_data->subType = MSG_SYNCML_CP;
436                 } else if (value == MSG_TYPE_SMS_REJECT) {
437                         msg_data->mainType = MSG_SMS_TYPE;
438                         msg_data->subType = MSG_REJECT_SMS;
439                 } else if (value == MSG_TYPE_SMS_ETWS_PRIMARY) {
440                         msg_data->mainType = MSG_SMS_TYPE;
441                         msg_data->subType = MSG_ETWS_SMS;
442                 } else {
443                         ret = MSG_ERR_INVALID_PARAMETER;
444                 }
445                 break;
446         }
447         case MSG_MESSAGE_CLASS_TYPE_INT:
448                 msg_data->classType = value;
449                 break;
450         case MSG_MESSAGE_STORAGE_ID_INT:
451                 msg_data->storageId = value;
452                 break;
453         case MSG_MESSAGE_DISPLAY_TIME_INT:
454                 msg_data->displayTime = value;
455                 break;
456         case MSG_MESSAGE_NETWORK_STATUS_INT:
457                 msg_data->networkStatus = value;
458                 break;
459         case MSG_MESSAGE_ENCODE_TYPE_INT:
460                 msg_data->encodeType = value;
461                 break;
462         case MSG_MESSAGE_PRIORITY_INT:
463                 msg_data->priority = value;
464                 break;
465         case MSG_MESSAGE_DIRECTION_INT:
466                 msg_data->direction = value;
467                 break;
468         case MSG_MESSAGE_DEST_PORT_INT:
469                 msg_data->dstPort = value;
470                 break;
471         case MSG_MESSAGE_SRC_PORT_INT:
472                 msg_data->srcPort = value;
473                 break;
474         case MSG_MESSAGE_ATTACH_COUNT_INT:
475                  msg_data->attachCount = value;
476                 break;
477         case MSG_MESSAGE_DATA_SIZE_INT:
478                 msg_data->dataSize = value;
479                 break;
480         case MSG_MESSAGE_SIM_INDEX_INT:
481                 msg_data->simIndex = value;
482                 break;
483         default:
484                 ret = MSG_ERR_INVALID_PARAMETER;
485                 break;
486         }
487
488         return ret;
489 }
490
491 int msg_message_set_bool_value(void *data, int field, bool value)
492 {
493         if (!data)
494                 return MSG_ERR_NULL_POINTER;
495
496         int ret = MSG_SUCCESS;
497
498         MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
499
500         switch (field) {
501         case MSG_MESSAGE_READ_BOOL:
502                 msg_data->bRead = value;
503                 break;
504         case MSG_MESSAGE_PROTECTED_BOOL:
505                 msg_data->bProtected = value;
506                 break;
507         case MSG_MESSAGE_BACKUP_BOOL:
508                 msg_data->bBackup = value;
509                 break;
510         case MSG_MESSAGE_PORT_VALID_BOOL:
511                 msg_data->bPortValid = value;
512                 break;
513         default:
514                 ret = MSG_ERR_INVALID_PARAMETER;
515                 break;
516         }
517
518         return ret;
519 }
520
521 int msg_message_set_str_value(void *data, int field, const char *value, int size)
522 {
523         if (!data || !value)
524                 return MSG_ERR_NULL_POINTER;
525
526         int ret = MSG_SUCCESS;
527
528         MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
529
530         switch (field) {
531         case MSG_MESSAGE_REPLY_ADDR_STR:
532                 snprintf(msg_data->replyAddress, sizeof(msg_data->replyAddress), "%s", value);
533                 break;
534         case MSG_MESSAGE_SUBJECT_STR:
535                 snprintf(msg_data->subject, sizeof(msg_data->subject), "%s", value);
536                 break;
537         case MSG_MESSAGE_SMS_DATA_STR: {
538                 if (msg_data->pData)
539                         delete [] static_cast<char*>(msg_data->pData);
540
541                 msg_data->dataSize = size;
542                 msg_data->pData = (void*)new char[msg_data->dataSize+1];
543                 memcpy((char *)msg_data->pData, value, msg_data->dataSize);
544                 ((char*) msg_data->pData)[msg_data->dataSize] = '\0';
545         }
546                 break;
547         default:
548                 ret = MSG_ERR_INVALID_PARAMETER;
549                 break;
550         }
551
552         return ret;
553 }
554
555 int msg_message_set_struct_hnd(void *data, int field, void *value)
556 {
557         if (!data)
558                 return MSG_ERR_NULL_POINTER;
559
560         int ret = MSG_SUCCESS;
561
562         switch (field) {
563         default:
564                 ret = MSG_ERR_INVALID_PARAMETER;
565                 break;
566         }
567
568         return ret;
569 }
570
571 void msg_message_copy_message(MSG_MESSAGE_HIDDEN_S *pSrc, MSG_MESSAGE_HIDDEN_S *pDst)
572 {
573         pDst->msgId = pSrc->msgId;
574         pDst->threadId = pSrc->msgId;
575         pDst->folderId = pSrc->folderId;
576         pDst->mainType = pSrc->mainType;
577         pDst->subType = pSrc->subType;
578         pDst->classType = pSrc->classType;
579         pDst->storageId = pSrc->storageId;
580         pDst->displayTime = pSrc->displayTime;
581         pDst->networkStatus = pSrc->networkStatus;
582         pDst->encodeType = pSrc->encodeType;
583         pDst->bRead = pSrc->bRead;
584         pDst->bProtected = pSrc->bProtected;
585         pDst->bBackup = pSrc->bBackup;
586         pDst->priority = pSrc->priority;
587         pDst->direction = pSrc->direction;
588         pDst->bPortValid = pSrc->bPortValid;
589         pDst->dataSize = pSrc->dataSize;
590         pDst->mmsDataSize = pSrc->mmsDataSize;
591         pDst->simIndex = pSrc->simIndex;
592         memcpy(pDst->subject, pSrc->subject, sizeof(pDst->subject));
593
594         if (pSrc->pMmsData && pSrc->mmsDataSize) {
595                 pDst->pMmsData = new char[pSrc->mmsDataSize];
596                 memcpy(pDst->pMmsData, pSrc->pMmsData, pSrc->mmsDataSize);
597         }
598
599         if (pSrc->dataSize && pSrc->pData) {
600                 int data_len = strlen((const char *)pSrc->pData);
601                 pDst->pData = new char[data_len + 1];
602                 memset(pDst->pData, 0x00, data_len + 1);
603                 strncpy((char *)pDst->pData, (const char *)pSrc->pData, data_len);
604         }
605
606         msg_struct_list_s *src_addrlist = pSrc->addr_list;
607         msg_struct_list_s *dst_addrlist = pDst->addr_list;
608         dst_addrlist->nCount = src_addrlist->nCount;
609
610         for (int i = 0; i < MAX_TO_ADDRESS_CNT; ++i) {
611                 msg_struct_s *src_addr = (msg_struct_s *)src_addrlist->msg_struct_info[i];
612                 msg_struct_s *dst_addr = (msg_struct_s *)dst_addrlist->msg_struct_info[i];
613                 memcpy(dst_addr->data, src_addr->data, sizeof(MSG_ADDRESS_INFO_S));
614         }
615
616         if (strlen(pSrc->thumbPath) > 0) {
617                 memset(pDst->thumbPath, 0x00, sizeof(pDst->thumbPath));
618                 memcpy(pDst->thumbPath, pSrc->thumbPath, sizeof(pDst->thumbPath));
619         }
620
621         for (unsigned int i = 0; i < g_list_length(pSrc->addressList); i++) {
622                 msg_struct_s *addr_struct = __msg_message_create_address_struct();
623                 MSG_ADDRESS_INFO_S *addrInfo = (MSG_ADDRESS_INFO_S *)addr_struct->data;
624
625                 msg_struct_s *addr_info = (msg_struct_s *)g_list_nth_data(pSrc->addressList, (guint)i);
626                 MSG_ADDRESS_INFO_S *address = (MSG_ADDRESS_INFO_S *)addr_info->data;
627
628                 addrInfo->addressType = address->addressType;
629                 addrInfo->recipientType = address->recipientType;
630                 addrInfo->contactId = address->contactId;
631                 strncpy(addrInfo->addressVal, address->addressVal, MAX_ADDRESS_VAL_LEN);
632                 strncpy(addrInfo->displayName, address->displayName, MAX_DISPLAY_NAME_LEN);
633                 addrInfo->displayName[MAX_DISPLAY_NAME_LEN] = '\0';
634
635                 pDst->addressList = g_list_append(pDst->addressList, addr_struct);
636         }
637 }
638
639 //LCOV_EXCL_START
640 int msg_cb_message_get_int_value(void *data, int field, int *value)
641 {
642         if (!data)
643                 return MSG_ERR_NULL_POINTER;
644
645         int ret = MSG_SUCCESS;
646
647         MSG_CB_MSG_S *cb_msg = (MSG_CB_MSG_S *)data;
648
649         *value = 0;
650
651         switch (field) {
652         case MSG_CB_MSG_TYPE_INT: {
653                         switch (cb_msg->type) {
654                         case MSG_ETWS_SMS:
655                                 *value = MSG_TYPE_SMS_ETWS_PRIMARY;
656                                 break;
657                         case MSG_CB_SMS:
658                                 *value = ((cb_msg->messageId & 0xFFF8) == 0x1100) ? MSG_TYPE_SMS_ETWS_SECONDARY : MSG_TYPE_SMS_CB;
659                                 break;
660                         case MSG_CMAS_PRESIDENTIAL:
661                                 *value = MSG_TYPE_SMS_CMAS_PRESIDENTIAL;
662                                 break;
663                         case MSG_CMAS_EXTREME:
664                                 *value = MSG_TYPE_SMS_CMAS_EXTREME;
665                                 break;
666                         case MSG_CMAS_SEVERE:
667                                 *value = MSG_TYPE_SMS_CMAS_SEVERE;
668                                 break;
669                         case MSG_CMAS_AMBER:
670                                 *value = MSG_TYPE_SMS_CMAS_AMBER;
671                                 break;
672                         case MSG_CMAS_TEST:
673                                 *value = MSG_TYPE_SMS_CMAS_TEST;
674                                 break;
675                         case MSG_CMAS_EXERCISE:
676                                 *value = MSG_TYPE_SMS_CMAS_EXERCISE;
677                                 break;
678                         case MSG_CMAS_OPERATOR_DEFINED:
679                                 *value = MSG_TYPE_SMS_CMAS_OPERATOR_DEFINED;
680                                 break;
681                         default:
682                                 ret = MSG_ERR_UNKNOWN;
683                         }
684                 }
685                 break;
686         case MSG_CB_MSG_RECV_TIME_INT:
687                 *value = cb_msg->receivedTime;
688                 break;
689         case MSG_CB_MSG_SERIAL_NUM_INT:
690                 *value = cb_msg->serialNum;
691                 break;
692         case MSG_CB_MSG_MSG_ID_INT:
693                 *value = cb_msg->messageId;
694                 break;
695         case MSG_CB_MSG_DCS_INT:
696                 *value = (int)cb_msg->dcs;
697                 break;
698         case MSG_CB_MSG_CB_TEXT_LEN_INT:
699                 *value = cb_msg->cbTextLen;
700                 break;
701         case MSG_CB_MSG_ETWS_WARNING_TYPE_INT:
702                 *value = cb_msg->etwsWarningType;
703                 break;
704         default:
705                 ret = MSG_ERR_INVALID_PARAMETER;
706                 break;
707         }
708
709         return ret;
710 }
711
712 int msg_cb_message_get_str_value(void *data, int field, char *value, int size)
713 {
714         if (!data || !value)
715                 return MSG_ERR_NULL_POINTER;
716
717         int ret = MSG_SUCCESS;
718
719         MSG_CB_MSG_S *cb_msg = (MSG_CB_MSG_S *)data;
720
721         switch (field) {
722         case MSG_CB_MSG_CB_TEXT_STR: {
723                 int     copylen = 0;
724                 copylen = (size > cb_msg->cbTextLen) ? cb_msg->cbTextLen : size - 1;
725                 memcpy(value, cb_msg->cbText, copylen);
726                 value[copylen] = '\0';
727         }
728         break;
729         case MSG_CB_MSG_LANGUAGE_TYPE_STR: {
730                 int     copylen = 0;
731                 copylen = ((size_t)size > strlen((const char*)cb_msg->language_type)) ? strlen((const char*)cb_msg->language_type) : size - 1;
732                 memcpy(value, cb_msg->language_type, copylen);
733                 value[copylen] = '\0';
734         }
735         break;
736         case MSG_CB_MSG_ETWS_WARNING_SECU_INFO_STR: {
737                 if ((size_t)size < sizeof(cb_msg->etwsWarningSecurityInfo))
738                         ret = MSG_ERR_INVALID_PARAMETER;
739                 else
740                         memcpy (value, cb_msg->etwsWarningSecurityInfo, sizeof(cb_msg->etwsWarningSecurityInfo));
741         }
742         break;
743
744         default:
745                 ret = MSG_ERR_INVALID_PARAMETER;
746                 break;
747         }
748
749         return ret;
750 }
751 //LCOV_EXCL_STOP
752
753
754 EXPORT_API int msg_get_mms_struct(msg_struct_t msg_struct_handle, msg_struct_t mms_struct_handle)
755 {
756         CHECK_MSG_SUPPORTED(MSG_TELEPHONY_MMS_FEATURE);
757         /* TODO :: check message type is MMS */
758         int ret = MSG_SUCCESS;
759
760         if (msg_struct_handle == NULL || mms_struct_handle == NULL)
761                 return MSG_ERR_INVALID_PARAMETER;
762
763         msg_struct_s *msg_struct = (msg_struct_s *)msg_struct_handle;
764         msg_struct_s *mms_struct = (msg_struct_s *)mms_struct_handle;
765
766         MSG_TYPE_CHECK(msg_struct->type, MSG_STRUCT_MESSAGE_INFO);
767         MSG_TYPE_CHECK(mms_struct->type, MSG_STRUCT_MMS);
768
769         if (msg_struct->data == NULL || mms_struct->data == NULL)
770                 return MSG_ERR_INVALID_PARAMETER;
771
772         MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)msg_struct->data;
773
774         if (msg_data->pMmsData == NULL)
775                 return MSG_ERR_INVALID_PARAMETER;
776
777         MMS_DATA_S *mms_data = NULL;
778
779         MsgDeserializeMmsData((char*)msg_data->pMmsData, msg_data->mmsDataSize, &mms_data);
780
781         if (mms_data) {
782                 convert_to_hidden_mmsdata(mms_data, mms_struct);
783
784                 MsgMmsRelease(&mms_data);
785         } else {
786                 return MSG_ERR_INVALID_PARAMETER;
787         }
788
789         return ret;
790 }
791
792 EXPORT_API int msg_set_mms_struct(msg_struct_t msg_struct_handle, msg_struct_t mms_struct_handle)
793 {
794         CHECK_MSG_SUPPORTED(MSG_TELEPHONY_MMS_FEATURE);
795         /* TODO :: check message type is MMS */
796         int ret = MSG_SUCCESS;
797
798         if (msg_struct_handle == NULL || mms_struct_handle == NULL)
799                 return MSG_ERR_INVALID_PARAMETER;
800
801         msg_struct_s *msg_struct = (msg_struct_s *)msg_struct_handle;
802         msg_struct_s *mms_struct = (msg_struct_s *)mms_struct_handle;
803
804         MSG_TYPE_CHECK(msg_struct->type, MSG_STRUCT_MESSAGE_INFO);
805         MSG_TYPE_CHECK(mms_struct->type, MSG_STRUCT_MMS);
806
807         if (msg_struct->data == NULL || mms_struct->data == NULL)
808                 return MSG_ERR_INVALID_PARAMETER;
809
810         MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)msg_struct->data;
811
812         MMS_DATA_S *mms_data = MsgMmsCreate();
813         if (mms_data == NULL)
814                 return MSG_ERR_MEMORY_ERROR;
815
816         convert_from_hidden_mmsdata(mms_struct, mms_data);
817
818         int mmsDataSize = MsgSerializeMms(mms_data, (char **)&msg_data->pMmsData);
819
820         if (mmsDataSize > 0)
821                 msg_data->mmsDataSize = mmsDataSize;
822
823         /* TODO:: set subtype */
824
825         MsgMmsRelease(&mms_data);
826
827         return ret;
828 }
829
830
831 int msg_message_list_append(msg_struct_t msg_struct_handle, int field, msg_struct_t *item)
832 {
833         msg_error_t err = MSG_SUCCESS;
834         msg_struct_s *msg_struct = (msg_struct_s *)msg_struct_handle;
835         MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)msg_struct->data;
836
837         msg_struct_s *msg_struct_item = NULL;
838         switch (field) {
839         case MSG_MESSAGE_ADDR_LIST_HND: {
840                 msg_struct_item = __msg_message_create_address_struct();
841                 msg_data->addressList = g_list_append(msg_data->addressList, msg_struct_item);
842                 *item = (msg_struct_t)msg_struct_item;
843         }
844         break;
845         default:
846                 err = MSG_ERR_INVALID_PARAMETER;
847                 break;
848         }
849
850         return err;
851 }
852
853
854 int msg_message_list_clear(msg_struct_t msg_struct_handle, int field)
855 {
856         msg_error_t err = MSG_SUCCESS;
857         msg_struct_s *msg_struct = (msg_struct_s *)msg_struct_handle;
858         MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)msg_struct->data;
859
860         switch (field) {
861         case MSG_MESSAGE_ADDR_LIST_HND: {
862                 /* Free GList *addressList */
863                 if (msg_data->addressList) {
864                         g_list_free_full(msg_data->addressList, __msg_message_release_address_struct);
865                         msg_data->addressList = NULL;
866                 }
867         }
868         break;
869         default:
870                 err = MSG_ERR_INVALID_PARAMETER;
871                 break;
872         }
873
874         return err;
875 }
876
877 int msg_conversation_get_list_hnd(void *data, int field, void **value)
878 {
879         if (!data)
880                 return MSG_ERR_NULL_POINTER;
881
882         int ret = MSG_SUCCESS;
883
884         MSG_CONVERSATION_VIEW_S *msg_data = (MSG_CONVERSATION_VIEW_S *)data;
885
886         switch (field) {
887         case MSG_CONV_MSG_MULTIPART_HND:
888                 *value = (void *)msg_data->multipart_list;
889                 break;
890         default:
891                 ret = MSG_ERR_INVALID_PARAMETER;
892                 break;
893         }
894
895         return ret;
896 }
897