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