4 * Copyright (c) 2000 - 2014 Samsung Electronics Co., Ltd. All rights reserved
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
23 #include "MsgStorageTypes.h"
24 #include "MsgInternalTypes.h"
25 #include "MsgMmsMessage.h"
28 #include "msg_private.h"
30 void msg_message_create_struct(msg_struct_s *msg_struct)
32 MSG_MESSAGE_HIDDEN_S *msg = (MSG_MESSAGE_HIDDEN_S *)new MSG_MESSAGE_HIDDEN_S;
33 memset(msg, 0x00, sizeof(MSG_MESSAGE_HIDDEN_S));
35 /* set default value to message*/
38 msg->folderId = MSG_DRAFT_ID;
39 msg->mainType= MSG_SMS_TYPE;
40 msg->subType = MSG_NORMAL_SMS;
41 msg->classType = MSG_CLASS_NONE;
42 msg->storageId = MSG_STORAGE_PHONE;
43 time_t curTime = time(NULL);
44 msg->displayTime = curTime;
45 msg->networkStatus = MSG_NETWORK_NOT_SEND;
46 msg->encodeType = MSG_ENCODE_AUTO;
48 msg->bProtected = false;
50 msg->priority = MSG_MESSAGE_PRIORITY_NORMAL;
51 msg->direction = MSG_DIRECTION_TYPE_MO;
52 msg->bPortValid = false;
57 /* Allocate memory for address list of message */
58 msg_struct_list_s *addr_list = (msg_struct_list_s *)new msg_struct_list_s;
60 addr_list->nCount = 0;
61 addr_list->msg_struct_info = (msg_struct_t *)new char[sizeof(MSG_ADDRESS_INFO_S *)*MAX_TO_ADDRESS_CNT];
63 msg_struct_s *pTmp = NULL;
65 for (int i = 0; i < MAX_TO_ADDRESS_CNT; i++) {
66 addr_list->msg_struct_info[i] = (msg_struct_t)new char[sizeof(msg_struct_s)];
67 pTmp = (msg_struct_s *)addr_list->msg_struct_info[i];
68 pTmp->type = MSG_STRUCT_ADDRESS_INFO;
69 pTmp->data = new MSG_ADDRESS_INFO_S;
70 memset(pTmp->data, 0x00, sizeof(MSG_ADDRESS_INFO_S));
72 addr_list->msg_struct_info[i] = (msg_struct_t)pTmp;
75 msg->addr_list = addr_list;
77 msg_struct->data = (int *)msg;
80 int msg_message_release(msg_struct_s **msg_struct)
82 MSG_MESSAGE_HIDDEN_S *msg = (MSG_MESSAGE_HIDDEN_S *)(*msg_struct)->data;
85 delete [] static_cast<char*>(msg->pData);
90 delete [] static_cast<char*>(msg->pMmsData);
96 if (msg->addr_list!= NULL)
98 for(int i=0; i<MAX_TO_ADDRESS_CNT; i++) {
99 msg_struct_s * addrInfo = (msg_struct_s *)msg->addr_list->msg_struct_info[i];
100 delete (MSG_ADDRESS_INFO_S *)addrInfo->data;
101 addrInfo->data = NULL;
102 delete (msg_struct_s *)msg->addr_list->msg_struct_info[i];
103 msg->addr_list->msg_struct_info[i] = NULL;
106 delete [] msg->addr_list->msg_struct_info;
108 delete msg->addr_list;
109 msg->addr_list = NULL;
113 (*msg_struct)->data = NULL;
115 delete (msg_struct_s *)*msg_struct;
121 int msg_message_get_int_value(void *data, int field, int *value)
124 return MSG_ERR_NULL_POINTER;
126 int ret = MSG_SUCCESS;
128 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
132 case MSG_MESSAGE_ID_INT :
133 *value = msg_data->msgId;
135 case MSG_MESSAGE_THREAD_ID_INT :
136 *value = msg_data->threadId;
138 case MSG_MESSAGE_FOLDER_ID_INT :
139 *value = msg_data->folderId;
141 case MSG_MESSAGE_TYPE_INT :
143 if (msg_data->mainType == MSG_SMS_TYPE)
145 if (msg_data->subType == MSG_CB_SMS)
146 *value = MSG_TYPE_SMS_CB;
147 else if (msg_data->subType == MSG_JAVACB_SMS)
148 *value = MSG_TYPE_SMS_JAVACB;
149 else if (msg_data->subType == MSG_WAP_SI_SMS || msg_data->subType == MSG_WAP_SL_SMS)
150 *value = MSG_TYPE_SMS_WAPPUSH;
151 else if (msg_data->subType == MSG_MWI_VOICE_SMS || msg_data->subType == MSG_MWI_FAX_SMS
152 || msg_data->subType == MSG_MWI_EMAIL_SMS || msg_data->subType == MSG_MWI_OTHER_SMS)
153 *value = MSG_TYPE_SMS_MWI;
154 else if (msg_data->subType == MSG_SYNCML_CP)
155 *value = MSG_TYPE_SMS_SYNCML;
156 else if (msg_data->subType == MSG_REJECT_SMS)
157 *value = MSG_TYPE_SMS_REJECT;
158 else if (msg_data->subType == MSG_ETWS_SMS)
159 *value = MSG_TYPE_SMS_ETWS_PRIMARY;
161 *value = MSG_TYPE_SMS;
163 else if (msg_data->mainType == MSG_MMS_TYPE)
165 if (msg_data->subType == MSG_NOTIFICATIONIND_MMS)
166 *value = MSG_TYPE_MMS_NOTI;
167 else if (msg_data->subType == MSG_SENDREQ_JAVA_MMS)
168 *value = MSG_TYPE_MMS_JAVA;
170 *value = MSG_TYPE_MMS;
173 *value = MSG_TYPE_INVALID;
177 case MSG_MESSAGE_CLASS_TYPE_INT :
178 *value = msg_data->classType;
180 case MSG_MESSAGE_STORAGE_ID_INT :
181 *value = msg_data->storageId;
183 case MSG_MESSAGE_DISPLAY_TIME_INT :
184 *value = msg_data->displayTime;
186 case MSG_MESSAGE_NETWORK_STATUS_INT :
187 *value = msg_data->networkStatus;
189 case MSG_MESSAGE_ENCODE_TYPE_INT :
190 *value = msg_data->encodeType;
192 case MSG_MESSAGE_PRIORITY_INT :
193 *value = msg_data->priority;
195 case MSG_MESSAGE_DIRECTION_INT :
196 *value = msg_data->direction;
198 case MSG_MESSAGE_DEST_PORT_INT :
199 *value = msg_data->dstPort;
201 case MSG_MESSAGE_SRC_PORT_INT :
202 *value = msg_data->srcPort;
204 case MSG_MESSAGE_ATTACH_COUNT_INT :
205 *value = msg_data->attachCount;
207 case MSG_MESSAGE_DATA_SIZE_INT :
208 *value = msg_data->dataSize;
211 ret = MSG_ERR_INVALID_PARAMETER;
218 int msg_message_get_bool_value(void *data, int field, bool *value)
221 return MSG_ERR_NULL_POINTER;
223 int ret = MSG_SUCCESS;
225 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
228 case MSG_MESSAGE_READ_BOOL :
229 *value = msg_data->bRead;
231 case MSG_MESSAGE_PROTECTED_BOOL :
232 *value = msg_data->bProtected;
234 case MSG_MESSAGE_BACKUP_BOOL :
235 *value = msg_data->bBackup;
237 case MSG_MESSAGE_PORT_VALID_BOOL :
238 *value = msg_data->bPortValid;
241 ret = MSG_ERR_INVALID_PARAMETER;
248 int msg_message_get_str_value(void *data, int field, char *value, int size)
251 return MSG_ERR_NULL_POINTER;
253 int ret = MSG_SUCCESS;
255 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
258 case MSG_MESSAGE_REPLY_ADDR_STR :
259 strncpy(value, msg_data->replyAddress, size);
261 case MSG_MESSAGE_SUBJECT_STR :
262 strncpy(value, msg_data->subject, size);
264 case MSG_MESSAGE_THUMBNAIL_PATH_STR :
265 strncpy(value, msg_data->thumbPath, size);
267 case MSG_MESSAGE_SMS_DATA_STR :
268 case MSG_MESSAGE_MMS_TEXT_STR :
271 if (msg_data->mainType == MSG_SMS_TYPE) {
273 ((size_t)size >= msg_data->dataSize)? (data_len = msg_data->dataSize) : data_len = size;
274 memset(value, 0, size);
275 memcpy(value, msg_data->pData, data_len);
276 } else if (msg_data->mainType == MSG_MMS_TYPE) {
277 memset(value, 0, size);
278 strncpy(value, (char *)msg_data->pData, size);
284 ret = MSG_ERR_INVALID_PARAMETER;
291 int msg_message_get_struct_hnd(void *data, int field, void **value)
294 return MSG_ERR_NULL_POINTER;
296 int ret = MSG_SUCCESS;
300 ret = MSG_ERR_INVALID_PARAMETER;
307 int msg_message_get_list_hnd(void *data, int field, void **value)
310 return MSG_ERR_NULL_POINTER;
312 int ret = MSG_SUCCESS;
314 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
317 case MSG_MESSAGE_ADDR_LIST_STRUCT :
318 *value = (void *)msg_data->addr_list;
321 ret = MSG_ERR_INVALID_PARAMETER;
328 int msg_message_set_int_value(void *data, int field, int value)
331 return MSG_ERR_NULL_POINTER;
333 int ret = MSG_SUCCESS;
335 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
339 case MSG_MESSAGE_ID_INT :
340 msg_data->msgId = value;
342 case MSG_MESSAGE_THREAD_ID_INT :
343 msg_data->threadId = value;
345 case MSG_MESSAGE_FOLDER_ID_INT :
346 msg_data->folderId = value;
348 case MSG_MESSAGE_TYPE_INT :
350 if (value == MSG_TYPE_SMS) {
351 msg_data->mainType = MSG_SMS_TYPE;
352 msg_data->subType = MSG_NORMAL_SMS;
354 else if (value == MSG_TYPE_MMS) {
355 msg_data->mainType = MSG_MMS_TYPE;
356 msg_data->subType = MSG_SENDREQ_MMS;
358 else if (value == MSG_TYPE_MMS_JAVA) {
359 msg_data->mainType = MSG_MMS_TYPE;
360 msg_data->subType = MSG_SENDREQ_JAVA_MMS;
362 else if (value == MSG_TYPE_SMS_SYNCML) {
363 msg_data->mainType = MSG_SMS_TYPE;
364 msg_data->subType = MSG_SYNCML_CP;
366 else if (value == MSG_TYPE_SMS_REJECT) {
367 msg_data->mainType = MSG_SMS_TYPE;
368 msg_data->subType = MSG_REJECT_SMS;
370 else if (value == MSG_TYPE_SMS_ETWS_PRIMARY) {
371 msg_data->mainType = MSG_SMS_TYPE;
372 msg_data->subType = MSG_ETWS_SMS;
376 case MSG_MESSAGE_CLASS_TYPE_INT :
377 msg_data->classType = value;
379 case MSG_MESSAGE_STORAGE_ID_INT :
380 msg_data->storageId = value;
382 case MSG_MESSAGE_DISPLAY_TIME_INT :
383 msg_data->displayTime = value;
385 case MSG_MESSAGE_NETWORK_STATUS_INT :
386 msg_data->networkStatus = value;
388 case MSG_MESSAGE_ENCODE_TYPE_INT :
389 msg_data->encodeType = value;
391 case MSG_MESSAGE_PRIORITY_INT :
392 msg_data->priority = value;
394 case MSG_MESSAGE_DIRECTION_INT :
395 msg_data->direction = value;
397 case MSG_MESSAGE_DEST_PORT_INT :
398 msg_data->dstPort = value;
400 case MSG_MESSAGE_SRC_PORT_INT :
401 msg_data->srcPort = value;
403 case MSG_MESSAGE_ATTACH_COUNT_INT :
404 msg_data->attachCount = value;
406 case MSG_MESSAGE_DATA_SIZE_INT :
407 msg_data->dataSize = value;
410 ret = MSG_ERR_INVALID_PARAMETER;
417 int msg_message_set_bool_value(void *data, int field, bool value)
420 return MSG_ERR_NULL_POINTER;
422 int ret = MSG_SUCCESS;
424 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
427 case MSG_MESSAGE_READ_BOOL :
428 msg_data->bRead = value;
430 case MSG_MESSAGE_PROTECTED_BOOL :
431 msg_data->bProtected = value;
433 case MSG_MESSAGE_BACKUP_BOOL :
434 msg_data->bBackup = value;
436 case MSG_MESSAGE_PORT_VALID_BOOL :
437 msg_data->bPortValid = value;
440 ret = MSG_ERR_INVALID_PARAMETER;
447 int msg_message_set_str_value(void *data, int field, char *value, int size)
450 return MSG_ERR_NULL_POINTER;
452 int ret = MSG_SUCCESS;
454 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
457 case MSG_MESSAGE_REPLY_ADDR_STR :
458 snprintf(msg_data->replyAddress, sizeof(msg_data->replyAddress), "%s", value);
460 case MSG_MESSAGE_SUBJECT_STR :
461 snprintf(msg_data->subject, sizeof(msg_data->subject), "%s",value);
463 case MSG_MESSAGE_THUMBNAIL_PATH_STR :
464 snprintf(msg_data->thumbPath, sizeof(msg_data->thumbPath), "%s",value);
466 case MSG_MESSAGE_SMS_DATA_STR :
469 delete [] static_cast<char*>(msg_data->pData);
471 msg_data->dataSize = size;
472 msg_data->pData = (void*)new char[msg_data->dataSize+1];
473 memcpy((char *)msg_data->pData, value, msg_data->dataSize);
474 ((char*) msg_data->pData)[msg_data->dataSize] = '\0';
478 ret = MSG_ERR_INVALID_PARAMETER;
485 int msg_message_set_struct_hnd(void *data, int field, void *value)
488 return MSG_ERR_NULL_POINTER;
490 int ret = MSG_SUCCESS;
494 ret = MSG_ERR_INVALID_PARAMETER;
501 void msg_message_copy_message(MSG_MESSAGE_HIDDEN_S *pSrc, MSG_MESSAGE_HIDDEN_S *pDst)
504 pDst->msgId = pSrc->msgId;
505 pDst->threadId = pSrc->msgId;
506 pDst->folderId = pSrc->folderId;
507 pDst->mainType = pSrc->mainType;
508 pDst->subType = pSrc->subType;
509 pDst->classType = pSrc->classType;
510 pDst->storageId = pSrc->storageId;
511 pDst->displayTime = pSrc->displayTime;
512 pDst->networkStatus = pSrc->networkStatus;
513 pDst->encodeType = pSrc->encodeType;
514 pDst->bRead = pSrc->bRead;
515 pDst->bProtected = pSrc->bProtected;
516 pDst->bBackup = pSrc->bBackup;
517 pDst->priority = pSrc->priority;
518 pDst->direction = pSrc->direction;
519 pDst->bPortValid = pSrc->bPortValid;
520 pDst->dataSize = pSrc->dataSize;
521 pDst->mmsDataSize = pSrc->mmsDataSize;
522 memcpy(pDst->subject, pSrc->subject, sizeof(pDst->subject));
524 if(pSrc->pMmsData && pSrc->mmsDataSize)
526 pDst->pMmsData = new char[pSrc->mmsDataSize];
527 memcpy(pDst->pMmsData, pSrc->pMmsData, pSrc->mmsDataSize);
530 if(pSrc->dataSize && pSrc->pData)
532 int data_len = strlen((const char *)pSrc->pData);
533 pDst->pData = new char[data_len + 1];
534 memset(pDst->pData, 0x00, data_len + 1);
535 strncpy((char *)pDst->pData, (const char *)pSrc->pData, data_len);
538 msg_struct_list_s *src_addrlist = pSrc->addr_list;
539 msg_struct_list_s *dst_addrlist = pDst->addr_list;
540 dst_addrlist->nCount = src_addrlist->nCount;
542 for(int i=0; i < MAX_TO_ADDRESS_CNT; ++i)
544 msg_struct_s *src_addr = (msg_struct_s *)src_addrlist->msg_struct_info[i];
545 msg_struct_s *dst_addr = (msg_struct_s *)dst_addrlist->msg_struct_info[i];
546 memcpy(dst_addr->data, src_addr->data, sizeof(MSG_ADDRESS_INFO_S));
549 if (strlen(pSrc->thumbPath) > 0) {
550 memset(pDst->thumbPath, 0x00, sizeof(pDst->thumbPath));
551 memcpy(pDst->thumbPath, pSrc->thumbPath, sizeof(pDst->thumbPath));
556 int msg_cb_message_get_int_value(void *data, int field, int *value)
559 return MSG_ERR_NULL_POINTER;
561 int ret = MSG_SUCCESS;
563 MSG_CB_MSG_S *cb_msg = (MSG_CB_MSG_S *)data;
569 case MSG_CB_MSG_TYPE_INT :
571 if ( cb_msg->type == MSG_ETWS_SMS )
572 *value = MSG_TYPE_SMS_ETWS_PRIMARY;
573 else if ( cb_msg->type == MSG_CB_SMS )
574 *value = ((cb_msg->messageId & 0xFFF8) == 0x1100 ) ? MSG_TYPE_SMS_ETWS_SECONDARY : MSG_TYPE_SMS_CB;
576 ret = MSG_ERR_UNKNOWN;
579 case MSG_CB_MSG_RECV_TIME_INT :
580 *value = cb_msg->receivedTime;
582 case MSG_CB_MSG_SERIAL_NUM_INT :
583 *value = cb_msg->serialNum;
585 case MSG_CB_MSG_MSG_ID_INT :
586 *value = cb_msg->messageId;
588 case MSG_CB_MSG_DCS_INT :
589 *value = (int)cb_msg->dcs;
591 case MSG_CB_MSG_CB_TEXT_LEN_INT :
592 *value = cb_msg->cbTextLen;
594 case MSG_CB_MSG_ETWS_WARNING_TYPE_INT :
595 *value = cb_msg->etwsWarningType;
598 ret = MSG_ERR_INVALID_PARAMETER;
605 int msg_cb_message_get_str_value(void *data, int field, char *value, int size)
608 return MSG_ERR_NULL_POINTER;
610 int ret = MSG_SUCCESS;
612 MSG_CB_MSG_S *cb_msg = (MSG_CB_MSG_S *)data;
615 case MSG_CB_MSG_CB_TEXT_STR:
618 copylen = (size > cb_msg->cbTextLen) ? cb_msg->cbTextLen : size - 1;
619 memcpy (value, cb_msg->cbText, copylen);
620 value[copylen] = '\0';
623 case MSG_CB_MSG_LANGUAGE_TYPE_STR:
626 copylen = ((size_t)size > strlen((const char*)cb_msg->language_type)) ? strlen((const char*)cb_msg->language_type) : size - 1;
627 memcpy (value, cb_msg->language_type, copylen);
628 value[copylen] = '\0';
631 case MSG_CB_MSG_ETWS_WARNING_SECU_INFO_STR:
633 if ((size_t)size < sizeof(cb_msg->etwsWarningSecurityInfo))
634 ret = MSG_ERR_INVALID_PARAMETER;
636 memcpy (value, cb_msg->etwsWarningSecurityInfo, sizeof(cb_msg->etwsWarningSecurityInfo));
641 ret = MSG_ERR_INVALID_PARAMETER;
650 EXPORT_API int msg_get_mms_struct(msg_struct_t msg_struct_handle, msg_struct_t mms_struct_handle)
652 //TODO :: check message type is MMS
653 int ret = MSG_SUCCESS;
654 msg_struct_s *msg_struct = (msg_struct_s *)msg_struct_handle;
655 msg_struct_s *mms_struct = (msg_struct_s *)mms_struct_handle;
657 if (msg_struct == NULL || mms_struct == NULL) {
658 return MSG_ERR_INVALID_PARAMETER;
661 if (msg_struct->data == NULL || mms_struct->data == NULL) {
662 return MSG_ERR_INVALID_PARAMETER;
665 if (msg_struct->type != MSG_STRUCT_MESSAGE_INFO || mms_struct->type != MSG_STRUCT_MMS) {
666 return MSG_ERR_INVALID_PARAMETER;
669 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)msg_struct->data;
671 MMS_MESSAGE_DATA_S *tmp_mms_data = (MMS_MESSAGE_DATA_S *)calloc(1, sizeof(MMS_MESSAGE_DATA_S));
673 _MsgMmsDeserializeMessageData(tmp_mms_data, (char*)msg_data->pMmsData);
675 convert_from_mmsdata(tmp_mms_data, mms_struct);
677 MsgMmsReleaseMmsLists(tmp_mms_data);
684 EXPORT_API int msg_set_mms_struct(msg_struct_t msg_struct_handle, msg_struct_t mms_struct_handle)
686 //TODO :: check message type is MMS
687 int ret = MSG_SUCCESS;
688 msg_struct_s *msg_struct = (msg_struct_s *)msg_struct_handle;
689 msg_struct_s *mms_struct = (msg_struct_s *)mms_struct_handle;
691 if (msg_struct == NULL || mms_struct == NULL) {
692 return MSG_ERR_INVALID_PARAMETER;
695 if (msg_struct->data == NULL || mms_struct->data == NULL) {
696 return MSG_ERR_INVALID_PARAMETER;
699 if (msg_struct->type != MSG_STRUCT_MESSAGE_INFO || mms_struct->type != MSG_STRUCT_MMS) {
700 return MSG_ERR_INVALID_PARAMETER;
703 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)msg_struct->data;
705 MMS_MESSAGE_DATA_S *tmp_mms_data = (MMS_MESSAGE_DATA_S *)calloc(1,sizeof(MMS_MESSAGE_DATA_S));
707 convert_to_mmsdata(mms_struct, tmp_mms_data);
709 msg_data->pMmsData = _MsgMmsSerializeMessageData(tmp_mms_data, &(msg_data->mmsDataSize));
711 MsgMmsReleaseMmsLists(tmp_mms_data);