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