Sync with 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_ADDRESS_INFO_S *));
89
90         msg_struct_s *pTmp = NULL;
91
92         for (int i = 0; i < MAX_TO_ADDRESS_CNT; i++) {
93                 addr_list->msg_struct_info[i] = (msg_struct_t)new msg_struct_s;
94                 pTmp = (msg_struct_s *)addr_list->msg_struct_info[i];
95                 pTmp->type = MSG_STRUCT_ADDRESS_INFO;
96                 pTmp->data = new MSG_ADDRESS_INFO_S;
97                 memset(pTmp->data, 0x00, sizeof(MSG_ADDRESS_INFO_S));
98         }
99
100         msg->addr_list = addr_list;
101
102         msg->addressList = NULL;
103
104         msg_struct->data = (int *)msg;
105 }
106
107 int msg_message_release(msg_struct_s **msg_struct)
108 {
109         MSG_MESSAGE_HIDDEN_S *msg = (MSG_MESSAGE_HIDDEN_S *)(*msg_struct)->data;
110
111         if (msg->pData) {
112                 delete [] static_cast<char*>(msg->pData);
113                 msg->pData = NULL;
114         }
115
116         if (msg->pMmsData) {
117                 delete [] static_cast<char*>(msg->pMmsData);
118                 msg->pMmsData = NULL;
119                 msg->mmsDataSize = 0;
120         }
121
122         // Memory Free
123         if (msg->addr_list != NULL)
124         {
125                 for(int i=0; i<MAX_TO_ADDRESS_CNT; i++) {
126                         msg_struct_s * addrInfo = (msg_struct_s *)msg->addr_list->msg_struct_info[i];
127                         delete (MSG_ADDRESS_INFO_S *)addrInfo->data;
128                         addrInfo->data = NULL;
129                         delete (msg_struct_s *)msg->addr_list->msg_struct_info[i];
130                         msg->addr_list->msg_struct_info[i] = NULL;
131                 }
132
133                 g_free(msg->addr_list->msg_struct_info);
134
135                 delete msg->addr_list;
136                 msg->addr_list = NULL;
137         }
138
139         // Free GList *addressList
140         if (msg->addressList) {
141                 g_list_free_full(msg->addressList, __msg_message_release_address_struct);
142                 msg->addressList = NULL;
143         }
144
145         delete msg;
146         (*msg_struct)->data = NULL;
147
148         delete (msg_struct_s *)*msg_struct;
149         *msg_struct = NULL;
150
151         return MSG_SUCCESS;
152 }
153
154 int msg_message_get_int_value(void *data, int field, int *value)
155 {
156         if (!data)
157                 return MSG_ERR_NULL_POINTER;
158
159         int ret = MSG_SUCCESS;
160
161         MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
162
163         switch (field)
164         {
165         case MSG_MESSAGE_ID_INT :
166                 *value = msg_data->msgId;
167                 break;
168         case MSG_MESSAGE_THREAD_ID_INT :
169                 *value = msg_data->threadId;
170                 break;
171         case MSG_MESSAGE_FOLDER_ID_INT :
172                 *value = msg_data->folderId;
173                 break;
174         case MSG_MESSAGE_TYPE_INT :
175         {
176         if (msg_data->mainType == MSG_SMS_TYPE)
177         {
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_OPERATOR_DEFINED :
220                                         *value = MSG_TYPE_SMS_CMAS_OPERATOR_DEFINED;
221                                         break;
222                                 default :
223                                         *value = MSG_TYPE_SMS;
224                         }
225                 }
226                 else if (msg_data->mainType == MSG_MMS_TYPE)
227                 {
228                         if (msg_data->subType == MSG_NOTIFICATIONIND_MMS)
229                                 *value = MSG_TYPE_MMS_NOTI;
230                         else if (msg_data->subType == MSG_SENDREQ_JAVA_MMS)
231                                 *value = MSG_TYPE_MMS_JAVA;
232                         else
233                                 *value = MSG_TYPE_MMS;
234                 }
235                 else
236                         *value = MSG_TYPE_INVALID;
237
238                 break;
239         }
240         case MSG_MESSAGE_CLASS_TYPE_INT :
241                 *value = msg_data->classType;
242                 break;
243         case MSG_MESSAGE_STORAGE_ID_INT :
244                 *value = msg_data->storageId;
245                 break;
246         case MSG_MESSAGE_DISPLAY_TIME_INT :
247                 *value = msg_data->displayTime;
248                 break;
249         case MSG_MESSAGE_NETWORK_STATUS_INT :
250                 *value = msg_data->networkStatus;
251                 break;
252         case MSG_MESSAGE_ENCODE_TYPE_INT :
253                 *value = msg_data->encodeType;
254                 break;
255         case MSG_MESSAGE_PRIORITY_INT :
256                 *value = msg_data->priority;
257                 break;
258         case MSG_MESSAGE_DIRECTION_INT :
259                 *value = msg_data->direction;
260                 break;
261         case MSG_MESSAGE_DEST_PORT_INT :
262                 *value = msg_data->dstPort;
263                 break;
264         case MSG_MESSAGE_SRC_PORT_INT :
265                 *value = msg_data->srcPort;
266                 break;
267         case MSG_MESSAGE_ATTACH_COUNT_INT :
268                 *value = msg_data->attachCount;
269                 break;
270         case MSG_MESSAGE_DATA_SIZE_INT :
271                 *value = msg_data->dataSize;
272                 break;
273         case MSG_MESSAGE_SIM_INDEX_INT :
274                 *value = msg_data->simIndex;
275                 break;
276         default :
277                 ret = MSG_ERR_INVALID_PARAMETER;
278                 break;
279         }
280
281         return ret;
282 }
283
284 int msg_message_get_bool_value(void *data, int field, bool *value)
285 {
286         if (!data)
287                 return MSG_ERR_NULL_POINTER;
288
289         int ret = MSG_SUCCESS;
290
291         MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
292
293         switch (field) {
294         case MSG_MESSAGE_READ_BOOL :
295                 *value = msg_data->bRead;
296                 break;
297         case MSG_MESSAGE_PROTECTED_BOOL :
298                 *value = msg_data->bProtected;
299                 break;
300         case MSG_MESSAGE_BACKUP_BOOL :
301                 *value = msg_data->bBackup;
302                 break;
303         case MSG_MESSAGE_PORT_VALID_BOOL :
304                 *value = msg_data->bPortValid;
305                 break;
306         case MSG_MESSAGE_REPLACE_BOOL :
307         {
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         default :
315                 ret = MSG_ERR_INVALID_PARAMETER;
316                 break;
317         }
318
319         return ret;
320 }
321
322 int msg_message_get_str_value(void *data, int field, char *value, int size)
323 {
324         if (!data || !value)
325                 return MSG_ERR_NULL_POINTER;
326
327         int ret = MSG_SUCCESS;
328
329         MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
330
331         switch (field) {
332         case MSG_MESSAGE_REPLY_ADDR_STR :
333                 strncpy(value, msg_data->replyAddress, size);
334                 break;
335         case MSG_MESSAGE_SUBJECT_STR :
336                 strncpy(value, msg_data->subject, size);
337                 break;
338         case MSG_MESSAGE_THUMBNAIL_PATH_STR :
339                 strncpy(value, msg_data->thumbPath, 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         {
416         case MSG_MESSAGE_ID_INT :
417                 msg_data->msgId = value;
418                 break;
419         case MSG_MESSAGE_THREAD_ID_INT :
420                 msg_data->threadId = value;
421                 break;
422         case MSG_MESSAGE_FOLDER_ID_INT :
423                 msg_data->folderId = value;
424                 break;
425         case MSG_MESSAGE_TYPE_INT :
426         {
427                 if (value == MSG_TYPE_SMS) {
428                         msg_data->mainType = MSG_SMS_TYPE;
429                         msg_data->subType = MSG_NORMAL_SMS;
430                 }
431                 else if (value == MSG_TYPE_MMS) {
432                         msg_data->mainType = MSG_MMS_TYPE;
433                         msg_data->subType = MSG_SENDREQ_MMS;
434                 }
435                 else if (value == MSG_TYPE_MMS_JAVA) {
436                         msg_data->mainType = MSG_MMS_TYPE;
437                         msg_data->subType = MSG_SENDREQ_JAVA_MMS;
438                 }
439                 else if (value == MSG_TYPE_SMS_SYNCML) {
440                         msg_data->mainType = MSG_SMS_TYPE;
441                         msg_data->subType = MSG_SYNCML_CP;
442                 }
443                 else if (value == MSG_TYPE_SMS_REJECT) {
444                         msg_data->mainType = MSG_SMS_TYPE;
445                         msg_data->subType = MSG_REJECT_SMS;
446                 }
447                 else if (value == MSG_TYPE_SMS_ETWS_PRIMARY) {
448                         msg_data->mainType = MSG_SMS_TYPE;
449                         msg_data->subType = MSG_ETWS_SMS;
450                 }
451         break;
452         }
453         case MSG_MESSAGE_CLASS_TYPE_INT :
454                 msg_data->classType = value;
455                 break;
456         case MSG_MESSAGE_STORAGE_ID_INT :
457                 msg_data->storageId = value;
458                 break;
459         case MSG_MESSAGE_DISPLAY_TIME_INT :
460                 msg_data->displayTime = value;
461                 break;
462         case MSG_MESSAGE_NETWORK_STATUS_INT :
463                 msg_data->networkStatus = value;
464                 break;
465         case MSG_MESSAGE_ENCODE_TYPE_INT :
466                 msg_data->encodeType = value;
467                 break;
468         case MSG_MESSAGE_PRIORITY_INT :
469                 msg_data->priority = value;
470                 break;
471         case MSG_MESSAGE_DIRECTION_INT :
472                 msg_data->direction = value;
473                 break;
474         case MSG_MESSAGE_DEST_PORT_INT :
475                 msg_data->dstPort = value;
476                 break;
477         case MSG_MESSAGE_SRC_PORT_INT :
478                 msg_data->srcPort = value;
479                 break;
480         case MSG_MESSAGE_ATTACH_COUNT_INT :
481                  msg_data->attachCount = value;
482                 break;
483         case MSG_MESSAGE_DATA_SIZE_INT :
484                 msg_data->dataSize = value;
485                 break;
486         case MSG_MESSAGE_SIM_INDEX_INT :
487                 msg_data->simIndex = value;
488                 break;
489         default :
490                 ret = MSG_ERR_INVALID_PARAMETER;
491                 break;
492         }
493
494         return ret;
495 }
496
497 int msg_message_set_bool_value(void *data, int field, bool value)
498 {
499         if (!data)
500                 return MSG_ERR_NULL_POINTER;
501
502         int ret = MSG_SUCCESS;
503
504         MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
505
506         switch (field) {
507         case MSG_MESSAGE_READ_BOOL :
508                 msg_data->bRead = value;
509                 break;
510         case MSG_MESSAGE_PROTECTED_BOOL :
511                 msg_data->bProtected = value;
512                 break;
513         case MSG_MESSAGE_BACKUP_BOOL :
514                 msg_data->bBackup = value;
515                 break;
516         case MSG_MESSAGE_PORT_VALID_BOOL :
517                 msg_data->bPortValid = value;
518                 break;
519         default :
520                 ret = MSG_ERR_INVALID_PARAMETER;
521                 break;
522         }
523
524         return ret;
525 }
526
527 int msg_message_set_str_value(void *data, int field, char *value, int size)
528 {
529         if (!data || !value)
530                 return MSG_ERR_NULL_POINTER;
531
532         int ret = MSG_SUCCESS;
533
534         MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
535
536         switch (field) {
537         case MSG_MESSAGE_REPLY_ADDR_STR :
538                 snprintf(msg_data->replyAddress, sizeof(msg_data->replyAddress), "%s", value);
539                 break;
540         case MSG_MESSAGE_SUBJECT_STR :
541                 snprintf(msg_data->subject, sizeof(msg_data->subject), "%s",value);
542                 break;
543         case MSG_MESSAGE_THUMBNAIL_PATH_STR :
544                 snprintf(msg_data->thumbPath, sizeof(msg_data->thumbPath), "%s",value);
545                 break;
546         case MSG_MESSAGE_SMS_DATA_STR :
547         {
548                 if (msg_data->pData)
549                         delete [] static_cast<char*>(msg_data->pData);
550
551                 msg_data->dataSize = size;
552                 msg_data->pData = (void*)new char[msg_data->dataSize+1];
553                 memcpy((char *)msg_data->pData, value, msg_data->dataSize);
554                 ((char*) msg_data->pData)[msg_data->dataSize] = '\0';
555         }
556                 break;
557         default :
558                 ret = MSG_ERR_INVALID_PARAMETER;
559                 break;
560         }
561
562         return ret;
563 }
564
565 int msg_message_set_struct_hnd(void *data, int field, void *value)
566 {
567         if (!data)
568                 return MSG_ERR_NULL_POINTER;
569
570         int ret = MSG_SUCCESS;
571
572         switch (field) {
573         default :
574                 ret = MSG_ERR_INVALID_PARAMETER;
575                 break;
576         }
577
578         return ret;
579 }
580
581 void msg_message_copy_message(MSG_MESSAGE_HIDDEN_S *pSrc, MSG_MESSAGE_HIDDEN_S *pDst)
582 {
583
584         pDst->msgId = pSrc->msgId;
585         pDst->threadId = pSrc->msgId;
586         pDst->folderId = pSrc->folderId;
587         pDst->mainType = pSrc->mainType;
588         pDst->subType = pSrc->subType;
589         pDst->classType = pSrc->classType;
590         pDst->storageId = pSrc->storageId;
591         pDst->displayTime = pSrc->displayTime;
592         pDst->networkStatus = pSrc->networkStatus;
593         pDst->encodeType = pSrc->encodeType;
594         pDst->bRead = pSrc->bRead;
595         pDst->bProtected = pSrc->bProtected;
596         pDst->bBackup = pSrc->bBackup;
597         pDst->priority = pSrc->priority;
598         pDst->direction = pSrc->direction;
599         pDst->bPortValid = pSrc->bPortValid;
600         pDst->dataSize = pSrc->dataSize;
601         pDst->mmsDataSize = pSrc->mmsDataSize;
602         pDst->simIndex = pSrc->simIndex;
603         memcpy(pDst->subject, pSrc->subject, sizeof(pDst->subject));
604
605         if(pSrc->pMmsData && pSrc->mmsDataSize)
606         {
607                 pDst->pMmsData = new char[pSrc->mmsDataSize];
608                 memcpy(pDst->pMmsData, pSrc->pMmsData, pSrc->mmsDataSize);
609         }
610
611         if(pSrc->dataSize && pSrc->pData)
612         {
613                 int data_len = strlen((const char *)pSrc->pData);
614                 pDst->pData = new char[data_len + 1];
615                 memset(pDst->pData, 0x00, data_len + 1);
616                 strncpy((char *)pDst->pData, (const char *)pSrc->pData, data_len);
617         }
618
619         msg_struct_list_s *src_addrlist = pSrc->addr_list;
620         msg_struct_list_s *dst_addrlist = pDst->addr_list;
621         dst_addrlist->nCount = src_addrlist->nCount;
622
623         for(int i=0; i < MAX_TO_ADDRESS_CNT; ++i)
624         {
625                 msg_struct_s *src_addr = (msg_struct_s *)src_addrlist->msg_struct_info[i];
626                 msg_struct_s *dst_addr = (msg_struct_s *)dst_addrlist->msg_struct_info[i];
627                 memcpy(dst_addr->data, src_addr->data, sizeof(MSG_ADDRESS_INFO_S));
628         }
629
630         if (strlen(pSrc->thumbPath) > 0) {
631                 memset(pDst->thumbPath, 0x00, sizeof(pDst->thumbPath));
632                 memcpy(pDst->thumbPath, pSrc->thumbPath, sizeof(pDst->thumbPath));
633         }
634
635         for (unsigned int i=0; i < g_list_length(pSrc->addressList); i++) {
636                 msg_struct_s *addr_struct = __msg_message_create_address_struct();
637                 MSG_ADDRESS_INFO_S *addrInfo = (MSG_ADDRESS_INFO_S *)addr_struct->data;
638
639                 msg_struct_s *addr_info = (msg_struct_s *)g_list_nth_data(pSrc->addressList,(guint)i);
640                 MSG_ADDRESS_INFO_S *address = (MSG_ADDRESS_INFO_S *)addr_info->data;
641
642                 addrInfo->addressType = address->addressType;
643                 addrInfo->recipientType = address->recipientType;
644                 addrInfo->contactId = address->contactId;
645                 strncpy(addrInfo->addressVal, address->addressVal, MAX_ADDRESS_VAL_LEN);
646                 strncpy(addrInfo->displayName, address->displayName, MAX_DISPLAY_NAME_LEN);
647                 addrInfo->displayName[MAX_DISPLAY_NAME_LEN] = '\0';
648
649                 pDst->addressList = g_list_append(pDst->addressList, addr_struct);
650         }
651 }
652
653 int msg_cb_message_get_int_value(void *data, int field, int *value)
654 {
655         if (!data)
656                 return MSG_ERR_NULL_POINTER;
657
658         int ret = MSG_SUCCESS;
659
660         MSG_CB_MSG_S *cb_msg = (MSG_CB_MSG_S *)data;
661
662         *value = 0;
663
664         switch (field)
665         {
666                 case MSG_CB_MSG_TYPE_INT :
667                         {
668                                 switch (cb_msg->type) {
669                                         case MSG_ETWS_SMS :
670                                                 *value = MSG_TYPE_SMS_ETWS_PRIMARY;
671                                                 break;
672                                         case MSG_CB_SMS:
673                                                 *value = ((cb_msg->messageId & 0xFFF8) == 0x1100 ) ? MSG_TYPE_SMS_ETWS_SECONDARY : MSG_TYPE_SMS_CB;
674                                                 break;
675                                         case MSG_CMAS_PRESIDENTIAL :
676                                                 *value = MSG_TYPE_SMS_CMAS_PRESIDENTIAL;
677                                                 break;
678                                         case MSG_CMAS_EXTREME :
679                                                 *value = MSG_TYPE_SMS_CMAS_EXTREME;
680                                                 break;
681                                         case MSG_CMAS_SEVERE :
682                                                 *value = MSG_TYPE_SMS_CMAS_SEVERE;
683                                                 break;
684                                         case MSG_CMAS_AMBER :
685                                                 *value = MSG_TYPE_SMS_CMAS_AMBER;
686                                                 break;
687                                         case MSG_CMAS_TEST :
688                                                 *value = MSG_TYPE_SMS_CMAS_TEST;
689                                                 break;
690                                         case MSG_CMAS_OPERATOR_DEFINED :
691                                                 *value = MSG_TYPE_SMS_CMAS_OPERATOR_DEFINED;
692                                                 break;
693                                         default :
694                                                 ret = MSG_ERR_UNKNOWN;
695                                 }
696                         }
697                         break;
698                 case MSG_CB_MSG_RECV_TIME_INT :
699                         *value = cb_msg->receivedTime;
700                         break;
701                 case MSG_CB_MSG_SERIAL_NUM_INT :
702                         *value = cb_msg->serialNum;
703                         break;
704                 case MSG_CB_MSG_MSG_ID_INT :
705                         *value = cb_msg->messageId;
706                         break;
707                 case MSG_CB_MSG_DCS_INT :
708                         *value = (int)cb_msg->dcs;
709                         break;
710                 case MSG_CB_MSG_CB_TEXT_LEN_INT :
711                         *value = cb_msg->cbTextLen;
712                         break;
713                 case MSG_CB_MSG_ETWS_WARNING_TYPE_INT :
714                         *value = cb_msg->etwsWarningType;
715                         break;
716                 default :
717                         ret = MSG_ERR_INVALID_PARAMETER;
718                         break;
719         }
720
721         return ret;
722 }
723
724 int msg_cb_message_get_str_value(void *data, int field, char *value, int size)
725 {
726         if (!data || !value)
727                 return MSG_ERR_NULL_POINTER;
728
729         int ret = MSG_SUCCESS;
730
731         MSG_CB_MSG_S *cb_msg = (MSG_CB_MSG_S *)data;
732
733         switch (field) {
734                 case MSG_CB_MSG_CB_TEXT_STR:
735                         {
736                                 int     copylen = 0;
737                                 copylen = (size > cb_msg->cbTextLen) ? cb_msg->cbTextLen : size - 1;
738                                 memcpy (value, cb_msg->cbText, copylen);
739                                 value[copylen] = '\0';
740                         }
741                         break;
742                 case MSG_CB_MSG_LANGUAGE_TYPE_STR:
743                         {
744                                 int     copylen = 0;
745                                 copylen = ((size_t)size > strlen((const char*)cb_msg->language_type)) ? strlen((const char*)cb_msg->language_type) : size - 1;
746                                 memcpy (value, cb_msg->language_type, copylen);
747                                 value[copylen] = '\0';
748                         }
749                         break;
750                 case MSG_CB_MSG_ETWS_WARNING_SECU_INFO_STR:
751                         {
752                                 if ((size_t)size < sizeof(cb_msg->etwsWarningSecurityInfo))
753                                         ret = MSG_ERR_INVALID_PARAMETER;
754                                 else
755                                         memcpy (value, cb_msg->etwsWarningSecurityInfo, sizeof(cb_msg->etwsWarningSecurityInfo));
756                         }
757                         break;
758
759                 default :
760                         ret = MSG_ERR_INVALID_PARAMETER;
761                         break;
762         }
763
764         return ret;
765 }
766
767
768
769 EXPORT_API int msg_get_mms_struct(msg_struct_t msg_struct_handle, msg_struct_t mms_struct_handle)
770 {
771         CHECK_MSG_SUPPORTED(MSG_TELEPHONY_MMS_FEATURE);
772         //TODO :: check message type is MMS
773         int ret = MSG_SUCCESS;
774         msg_struct_s *msg_struct = (msg_struct_s *)msg_struct_handle;
775         msg_struct_s *mms_struct = (msg_struct_s *)mms_struct_handle;
776
777         if (msg_struct == NULL || mms_struct == NULL) {
778                 return MSG_ERR_INVALID_PARAMETER;
779         }
780
781         if (msg_struct->data == NULL || mms_struct->data == NULL) {
782                 return MSG_ERR_INVALID_PARAMETER;
783         }
784
785         if (msg_struct->type != MSG_STRUCT_MESSAGE_INFO || mms_struct->type != MSG_STRUCT_MMS) {
786                 return MSG_ERR_INVALID_PARAMETER;
787         }
788
789         MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)msg_struct->data;
790
791         if (msg_data->pMmsData == NULL) {
792                 return MSG_ERR_INVALID_PARAMETER;
793         }
794
795         MMS_DATA_S *mms_data = NULL;
796
797         MsgDeserializeMmsData((char*)msg_data->pMmsData, msg_data->mmsDataSize, &mms_data);
798
799         if (mms_data) {
800                 convert_to_hidden_mmsdata(mms_data, mms_struct);
801
802                 MsgMmsRelease(&mms_data);
803         } else {
804                 return MSG_ERR_INVALID_PARAMETER;
805         }
806
807         return ret;
808 }
809
810 EXPORT_API int msg_set_mms_struct(msg_struct_t msg_struct_handle, msg_struct_t mms_struct_handle)
811 {
812         CHECK_MSG_SUPPORTED(MSG_TELEPHONY_MMS_FEATURE);
813         //TODO :: check message type is MMS
814         int ret = MSG_SUCCESS;
815         msg_struct_s *msg_struct = (msg_struct_s *)msg_struct_handle;
816         msg_struct_s *mms_struct = (msg_struct_s *)mms_struct_handle;
817
818         if (msg_struct == NULL || mms_struct == NULL) {
819                 return MSG_ERR_INVALID_PARAMETER;
820         }
821
822         if (msg_struct->data == NULL || mms_struct->data == NULL) {
823                 return MSG_ERR_INVALID_PARAMETER;
824         }
825
826         if (msg_struct->type != MSG_STRUCT_MESSAGE_INFO || mms_struct->type != MSG_STRUCT_MMS) {
827                 return MSG_ERR_INVALID_PARAMETER;
828         }
829
830         MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)msg_struct->data;
831
832         MMS_DATA_S *mms_data = MsgMmsCreate();
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