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