2 * Copyright 2012-2013 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.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
8 * http://floralicense.org
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.
20 #include "MsgStorageTypes.h"
21 #include "MsgInternalTypes.h"
22 #include "MsgMmsMessage.h"
25 #include "msg_private.h"
27 void msg_message_create_struct(msg_struct_s *msg_struct)
29 MSG_MESSAGE_HIDDEN_S *msg = (MSG_MESSAGE_HIDDEN_S *)new MSG_MESSAGE_HIDDEN_S;
30 memset(msg, 0x00, sizeof(MSG_MESSAGE_HIDDEN_S));
32 /* set default value to message*/
35 msg->folderId = MSG_DRAFT_ID;
36 msg->mainType= MSG_SMS_TYPE;
37 msg->subType = MSG_NORMAL_SMS;
38 msg->classType = MSG_CLASS_NONE;
39 msg->storageId = MSG_STORAGE_PHONE;
40 time_t curTime = time(NULL);
41 msg->displayTime = curTime;
42 msg->networkStatus = MSG_NETWORK_NOT_SEND;
43 msg->encodeType = MSG_ENCODE_AUTO;
45 msg->bProtected = false;
47 msg->priority = MSG_MESSAGE_PRIORITY_NORMAL;
48 msg->direction = MSG_DIRECTION_TYPE_MO;
49 msg->bPortValid = false;
55 /* Allocate memory for address list of message */
56 msg_struct_list_s *addr_list = (msg_struct_list_s *)new msg_struct_list_s;
58 addr_list->nCount = 0;
59 addr_list->msg_struct_info = (msg_struct_t *)new char[sizeof(MSG_ADDRESS_INFO_S *)*MAX_TO_ADDRESS_CNT];
61 msg_struct_s *pTmp = NULL;
63 for (int i = 0; i < MAX_TO_ADDRESS_CNT; i++) {
64 addr_list->msg_struct_info[i] = (msg_struct_t)new char[sizeof(msg_struct_s)];
65 pTmp = (msg_struct_s *)addr_list->msg_struct_info[i];
66 pTmp->type = MSG_STRUCT_ADDRESS_INFO;
67 pTmp->data = new MSG_ADDRESS_INFO_S;
68 memset(pTmp->data, 0x00, sizeof(MSG_ADDRESS_INFO_S));
70 addr_list->msg_struct_info[i] = (msg_struct_t)pTmp;
73 msg->addr_list = addr_list;
75 msg_struct->data = (int *)msg;
78 int msg_message_release(msg_struct_s **msg_struct)
80 MSG_MESSAGE_HIDDEN_S *msg = (MSG_MESSAGE_HIDDEN_S *)(*msg_struct)->data;
83 delete [] static_cast<char*>(msg->pData);
88 delete [] static_cast<char*>(msg->pMmsData);
94 if (msg->addr_list!= NULL)
96 for(int i=0; i<MAX_TO_ADDRESS_CNT; i++) {
97 msg_struct_s * addrInfo = (msg_struct_s *)msg->addr_list->msg_struct_info[i];
98 delete (MSG_ADDRESS_INFO_S *)addrInfo->data;
99 addrInfo->data = NULL;
100 delete (msg_struct_s *)msg->addr_list->msg_struct_info[i];
101 msg->addr_list->msg_struct_info[i] = NULL;
104 delete [] msg->addr_list->msg_struct_info;
106 delete msg->addr_list;
107 msg->addr_list = NULL;
111 (*msg_struct)->data = NULL;
113 delete (msg_struct_s *)*msg_struct;
119 int msg_message_get_int_value(void *data, int field, int *value)
122 return MSG_ERR_NULL_POINTER;
124 int ret = MSG_SUCCESS;
126 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
130 case MSG_MESSAGE_ID_INT :
131 *value = msg_data->msgId;
133 case MSG_MESSAGE_THREAD_ID_INT :
134 *value = msg_data->threadId;
136 case MSG_MESSAGE_FOLDER_ID_INT :
137 *value = msg_data->folderId;
139 case MSG_MESSAGE_TYPE_INT :
141 if (msg_data->mainType == MSG_SMS_TYPE)
143 if (msg_data->subType == MSG_CB_SMS)
144 *value = MSG_TYPE_SMS_CB;
145 else if (msg_data->subType == MSG_JAVACB_SMS)
146 *value = MSG_TYPE_SMS_JAVACB;
147 else if (msg_data->subType == MSG_WAP_SI_SMS || msg_data->subType == MSG_WAP_SL_SMS)
148 *value = MSG_TYPE_SMS_WAPPUSH;
149 else if (msg_data->subType == MSG_MWI_VOICE_SMS || msg_data->subType == MSG_MWI_FAX_SMS
150 || msg_data->subType == MSG_MWI_EMAIL_SMS || msg_data->subType == MSG_MWI_OTHER_SMS)
151 *value = MSG_TYPE_SMS_MWI;
152 else if (msg_data->subType == MSG_SYNCML_CP)
153 *value = MSG_TYPE_SMS_SYNCML;
154 else if (msg_data->subType == MSG_REJECT_SMS)
155 *value = MSG_TYPE_SMS_REJECT;
156 else if (msg_data->subType == MSG_ETWS_SMS)
157 *value = MSG_TYPE_SMS_ETWS_PRIMARY;
159 *value = MSG_TYPE_SMS;
161 else if (msg_data->mainType == MSG_MMS_TYPE)
163 if (msg_data->subType == MSG_NOTIFICATIONIND_MMS)
164 *value = MSG_TYPE_MMS_NOTI;
165 else if (msg_data->subType == MSG_SENDREQ_JAVA_MMS)
166 *value = MSG_TYPE_MMS_JAVA;
168 *value = MSG_TYPE_MMS;
171 *value = MSG_TYPE_INVALID;
175 case MSG_MESSAGE_CLASS_TYPE_INT :
176 *value = msg_data->classType;
178 case MSG_MESSAGE_STORAGE_ID_INT :
179 *value = msg_data->storageId;
181 case MSG_MESSAGE_DISPLAY_TIME_INT :
182 *value = msg_data->displayTime;
184 case MSG_MESSAGE_NETWORK_STATUS_INT :
185 *value = msg_data->networkStatus;
187 case MSG_MESSAGE_ENCODE_TYPE_INT :
188 *value = msg_data->encodeType;
190 case MSG_MESSAGE_PRIORITY_INT :
191 *value = msg_data->priority;
193 case MSG_MESSAGE_DIRECTION_INT :
194 *value = msg_data->direction;
196 case MSG_MESSAGE_DEST_PORT_INT :
197 *value = msg_data->dstPort;
199 case MSG_MESSAGE_SRC_PORT_INT :
200 *value = msg_data->srcPort;
202 case MSG_MESSAGE_ATTACH_COUNT_INT :
203 *value = msg_data->attachCount;
205 case MSG_MESSAGE_DATA_SIZE_INT :
206 *value = msg_data->dataSize;
209 ret = MSG_ERR_INVALID_PARAMETER;
216 int msg_message_get_bool_value(void *data, int field, bool *value)
219 return MSG_ERR_NULL_POINTER;
221 int ret = MSG_SUCCESS;
223 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
226 case MSG_MESSAGE_READ_BOOL :
227 *value = msg_data->bRead;
229 case MSG_MESSAGE_PROTECTED_BOOL :
230 *value = msg_data->bProtected;
232 case MSG_MESSAGE_BACKUP_BOOL :
233 *value = msg_data->bBackup;
235 case MSG_MESSAGE_PORT_VALID_BOOL :
236 *value = msg_data->bPortValid;
239 ret = MSG_ERR_INVALID_PARAMETER;
246 int msg_message_get_str_value(void *data, int field, char *value, int size)
249 return MSG_ERR_NULL_POINTER;
251 int ret = MSG_SUCCESS;
253 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
256 case MSG_MESSAGE_REPLY_ADDR_STR :
257 strncpy(value, msg_data->replyAddress, size);
259 case MSG_MESSAGE_SUBJECT_STR :
260 strncpy(value, msg_data->subject, size);
262 case MSG_MESSAGE_THUMBNAIL_PATH_STR :
263 strncpy(value, msg_data->thumbPath, size);
265 case MSG_MESSAGE_SMS_DATA_STR :
266 case MSG_MESSAGE_MMS_TEXT_STR :
269 if (msg_data->mainType == MSG_SMS_TYPE) {
271 ((size_t)size >= msg_data->dataSize)? (data_len = msg_data->dataSize) : data_len = size;
272 memset(value, 0, size);
273 memcpy(value, msg_data->pData, data_len);
274 } else if (msg_data->mainType == MSG_MMS_TYPE) {
275 memset(value, 0, size);
276 strncpy(value, (char *)msg_data->pData, size);
282 ret = MSG_ERR_INVALID_PARAMETER;
289 int msg_message_get_struct_hnd(void *data, int field, void **value)
292 return MSG_ERR_NULL_POINTER;
294 int ret = MSG_SUCCESS;
298 ret = MSG_ERR_INVALID_PARAMETER;
305 int msg_message_get_list_hnd(void *data, int field, void **value)
308 return MSG_ERR_NULL_POINTER;
310 int ret = MSG_SUCCESS;
312 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
315 case MSG_MESSAGE_ADDR_LIST_STRUCT :
316 *value = (void *)msg_data->addr_list;
319 ret = MSG_ERR_INVALID_PARAMETER;
326 int msg_message_set_int_value(void *data, int field, int value)
329 return MSG_ERR_NULL_POINTER;
331 int ret = MSG_SUCCESS;
333 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
337 case MSG_MESSAGE_ID_INT :
338 msg_data->msgId = value;
340 case MSG_MESSAGE_THREAD_ID_INT :
341 msg_data->threadId = value;
343 case MSG_MESSAGE_FOLDER_ID_INT :
344 msg_data->folderId = value;
346 case MSG_MESSAGE_TYPE_INT :
348 if (value == MSG_TYPE_SMS) {
349 msg_data->mainType = MSG_SMS_TYPE;
350 msg_data->subType = MSG_NORMAL_SMS;
352 else if (value == MSG_TYPE_MMS) {
353 msg_data->mainType = MSG_MMS_TYPE;
354 msg_data->subType = MSG_SENDREQ_MMS;
356 else if (value == MSG_TYPE_MMS_JAVA) {
357 msg_data->mainType = MSG_MMS_TYPE;
358 msg_data->subType = MSG_SENDREQ_JAVA_MMS;
360 else if (value == MSG_TYPE_SMS_SYNCML) {
361 msg_data->mainType = MSG_SMS_TYPE;
362 msg_data->subType = MSG_SYNCML_CP;
364 else if (value == MSG_TYPE_SMS_REJECT) {
365 msg_data->mainType = MSG_SMS_TYPE;
366 msg_data->subType = MSG_REJECT_SMS;
368 else if (value == MSG_TYPE_SMS_ETWS_PRIMARY) {
369 msg_data->mainType = MSG_SMS_TYPE;
370 msg_data->subType = MSG_ETWS_SMS;
374 case MSG_MESSAGE_CLASS_TYPE_INT :
375 msg_data->classType = value;
377 case MSG_MESSAGE_STORAGE_ID_INT :
378 msg_data->storageId = value;
380 case MSG_MESSAGE_DISPLAY_TIME_INT :
381 msg_data->displayTime = value;
383 case MSG_MESSAGE_NETWORK_STATUS_INT :
384 msg_data->networkStatus = value;
386 case MSG_MESSAGE_ENCODE_TYPE_INT :
387 msg_data->encodeType = value;
389 case MSG_MESSAGE_PRIORITY_INT :
390 msg_data->priority = value;
392 case MSG_MESSAGE_DIRECTION_INT :
393 msg_data->direction = value;
395 case MSG_MESSAGE_DEST_PORT_INT :
396 msg_data->dstPort = value;
398 case MSG_MESSAGE_SRC_PORT_INT :
399 msg_data->srcPort = value;
401 case MSG_MESSAGE_ATTACH_COUNT_INT :
402 msg_data->attachCount = value;
404 case MSG_MESSAGE_DATA_SIZE_INT :
405 msg_data->dataSize = value;
408 ret = MSG_ERR_INVALID_PARAMETER;
415 int msg_message_set_bool_value(void *data, int field, bool value)
418 return MSG_ERR_NULL_POINTER;
420 int ret = MSG_SUCCESS;
422 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
425 case MSG_MESSAGE_READ_BOOL :
426 msg_data->bRead = value;
428 case MSG_MESSAGE_PROTECTED_BOOL :
429 msg_data->bProtected = value;
431 case MSG_MESSAGE_BACKUP_BOOL :
432 msg_data->bBackup = value;
434 case MSG_MESSAGE_PORT_VALID_BOOL :
435 msg_data->bPortValid = value;
438 ret = MSG_ERR_INVALID_PARAMETER;
445 int msg_message_set_str_value(void *data, int field, char *value, int size)
448 return MSG_ERR_NULL_POINTER;
450 int ret = MSG_SUCCESS;
452 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
455 case MSG_MESSAGE_REPLY_ADDR_STR :
456 snprintf(msg_data->replyAddress, sizeof(msg_data->replyAddress), "%s", value);
458 case MSG_MESSAGE_SUBJECT_STR :
459 snprintf(msg_data->subject, sizeof(msg_data->subject), "%s",value);
461 case MSG_MESSAGE_THUMBNAIL_PATH_STR :
462 snprintf(msg_data->thumbPath, sizeof(msg_data->thumbPath), "%s",value);
464 case MSG_MESSAGE_SMS_DATA_STR :
467 delete [] static_cast<char*>(msg_data->pData);
469 msg_data->dataSize = size;
470 msg_data->pData = (void*)new char[msg_data->dataSize+1];
471 memcpy((char *)msg_data->pData, value, msg_data->dataSize);
472 ((char*) msg_data->pData)[msg_data->dataSize] = '\0';
476 ret = MSG_ERR_INVALID_PARAMETER;
483 int msg_message_set_struct_hnd(void *data, int field, void *value)
486 return MSG_ERR_NULL_POINTER;
488 int ret = MSG_SUCCESS;
492 ret = MSG_ERR_INVALID_PARAMETER;
499 void msg_message_copy_message(MSG_MESSAGE_HIDDEN_S *pSrc, MSG_MESSAGE_HIDDEN_S *pDst)
502 pDst->msgId = pSrc->msgId;
503 pDst->threadId = pSrc->msgId;
504 pDst->folderId = pSrc->folderId;
505 pDst->mainType = pSrc->mainType;
506 pDst->subType = pSrc->subType;
507 pDst->classType = pSrc->classType;
508 pDst->storageId = pSrc->storageId;
509 pDst->displayTime = pSrc->displayTime;
510 pDst->networkStatus = pSrc->networkStatus;
511 pDst->encodeType = pSrc->encodeType;
512 pDst->bRead = pSrc->bRead;
513 pDst->bProtected = pSrc->bProtected;
514 pDst->bBackup = pSrc->bBackup;
515 pDst->priority = pSrc->priority;
516 pDst->direction = pSrc->direction;
517 pDst->bPortValid = pSrc->bPortValid;
518 pDst->dataSize = pSrc->dataSize;
519 pDst->mmsDataSize = pSrc->mmsDataSize;
520 memcpy(pDst->subject, pSrc->subject, sizeof(pDst->subject));
522 if(pSrc->pMmsData && pSrc->mmsDataSize)
524 pDst->pMmsData = new char[pSrc->mmsDataSize];
525 memcpy(pDst->pMmsData, pSrc->pMmsData, pSrc->mmsDataSize);
528 if(pSrc->dataSize && pSrc->pData)
530 int data_len = strlen((const char *)pSrc->pData);
531 pDst->pData = new char[data_len + 1];
532 memset(pDst->pData, 0x00, data_len + 1);
533 strncpy((char *)pDst->pData, (const char *)pSrc->pData, data_len);
536 msg_struct_list_s *src_addrlist = pSrc->addr_list;
537 msg_struct_list_s *dst_addrlist = pDst->addr_list;
538 dst_addrlist->nCount = src_addrlist->nCount;
540 for(int i=0; i < MAX_TO_ADDRESS_CNT; ++i)
542 msg_struct_s *src_addr = (msg_struct_s *)src_addrlist->msg_struct_info[i];
543 msg_struct_s *dst_addr = (msg_struct_s *)dst_addrlist->msg_struct_info[i];
544 memcpy(dst_addr->data, src_addr->data, sizeof(MSG_ADDRESS_INFO_S));
547 if (strlen(pSrc->thumbPath) > 0) {
548 memset(pDst->thumbPath, 0x00, sizeof(pDst->thumbPath));
549 memcpy(pDst->thumbPath, pSrc->thumbPath, sizeof(pDst->thumbPath));
554 int msg_cb_message_get_int_value(void *data, int field, int *value)
557 return MSG_ERR_NULL_POINTER;
559 int ret = MSG_SUCCESS;
561 MSG_CB_MSG_S *cb_msg = (MSG_CB_MSG_S *)data;
567 case MSG_CB_MSG_TYPE_INT :
569 if ( cb_msg->type == MSG_ETWS_SMS )
570 *value = MSG_TYPE_SMS_ETWS_PRIMARY;
571 else if ( cb_msg->type == MSG_CB_SMS )
572 *value = ((cb_msg->messageId & 0xFFF8) == 0x1100 ) ? MSG_TYPE_SMS_ETWS_SECONDARY : MSG_TYPE_SMS_CB;
574 ret = MSG_ERR_UNKNOWN;
577 case MSG_CB_MSG_RECV_TIME_INT :
578 *value = cb_msg->receivedTime;
580 case MSG_CB_MSG_SERIAL_NUM_INT :
581 *value = cb_msg->serialNum;
583 case MSG_CB_MSG_MSG_ID_INT :
584 *value = cb_msg->messageId;
586 case MSG_CB_MSG_DCS_INT :
587 *value = (int)cb_msg->dcs;
589 case MSG_CB_MSG_CB_TEXT_LEN_INT :
590 *value = cb_msg->cbTextLen;
592 case MSG_CB_MSG_ETWS_WARNING_TYPE_INT :
593 *value = cb_msg->etwsWarningType;
596 ret = MSG_ERR_INVALID_PARAMETER;
603 int msg_cb_message_get_str_value(void *data, int field, char *value, int size)
606 return MSG_ERR_NULL_POINTER;
608 int ret = MSG_SUCCESS;
610 MSG_CB_MSG_S *cb_msg = (MSG_CB_MSG_S *)data;
613 case MSG_CB_MSG_CB_TEXT_STR:
616 copylen = (size > cb_msg->cbTextLen) ? cb_msg->cbTextLen : size - 1;
617 memcpy (value, cb_msg->cbText, copylen);
618 value[copylen] = '\0';
621 case MSG_CB_MSG_LANGUAGE_TYPE_STR:
624 copylen = ((size_t)size > strlen((const char*)cb_msg->language_type)) ? strlen((const char*)cb_msg->language_type) : size - 1;
625 memcpy (value, cb_msg->language_type, copylen);
626 value[copylen] = '\0';
629 case MSG_CB_MSG_ETWS_WARNING_SECU_INFO_STR:
631 if ((size_t)size < sizeof(cb_msg->etwsWarningSecurityInfo))
632 ret = MSG_ERR_INVALID_PARAMETER;
634 memcpy (value, cb_msg->etwsWarningSecurityInfo, sizeof(cb_msg->etwsWarningSecurityInfo));
639 ret = MSG_ERR_INVALID_PARAMETER;
648 EXPORT_API int msg_get_mms_struct(msg_struct_t msg_struct_handle, msg_struct_t mms_struct_handle)
650 //TODO :: check message type is MMS
651 int ret = MSG_SUCCESS;
652 msg_struct_s *msg_struct = (msg_struct_s *)msg_struct_handle;
653 msg_struct_s *mms_struct = (msg_struct_s *)mms_struct_handle;
655 if (msg_struct == NULL || mms_struct == NULL) {
656 return MSG_ERR_INVALID_PARAMETER;
659 if (msg_struct->data == NULL || mms_struct->data == NULL) {
660 return MSG_ERR_INVALID_PARAMETER;
663 if (msg_struct->type != MSG_STRUCT_MESSAGE_INFO || mms_struct->type != MSG_STRUCT_MMS) {
664 return MSG_ERR_INVALID_PARAMETER;
667 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)msg_struct->data;
669 MMS_MESSAGE_DATA_S *tmp_mms_data = (MMS_MESSAGE_DATA_S *)calloc(1, sizeof(MMS_MESSAGE_DATA_S));
671 _MsgMmsDeserializeMessageData(tmp_mms_data, (char*)msg_data->pMmsData);
673 convert_from_mmsdata(tmp_mms_data, mms_struct);
675 _MsgMmsReleasePageList(tmp_mms_data);
676 _MsgMmsReleaseRegionList(tmp_mms_data);
677 _MsgMmsReleaseAttachList(tmp_mms_data);
678 _MsgMmsReleaseTransitionList(tmp_mms_data);
679 _MsgMmsReleaseMetaList(tmp_mms_data);
685 EXPORT_API int msg_set_mms_struct(msg_struct_t msg_struct_handle, msg_struct_t mms_struct_handle)
687 //TODO :: check message type is MMS
688 int ret = MSG_SUCCESS;
689 msg_struct_s *msg_struct = (msg_struct_s *)msg_struct_handle;
690 msg_struct_s *mms_struct = (msg_struct_s *)mms_struct_handle;
692 if (msg_struct == NULL || mms_struct == NULL) {
693 return MSG_ERR_INVALID_PARAMETER;
696 if (msg_struct->data == NULL || mms_struct->data == NULL) {
697 return MSG_ERR_INVALID_PARAMETER;
700 if (msg_struct->type != MSG_STRUCT_MESSAGE_INFO || mms_struct->type != MSG_STRUCT_MMS) {
701 return MSG_ERR_INVALID_PARAMETER;
704 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)msg_struct->data;
706 MMS_MESSAGE_DATA_S *tmp_mms_data = (MMS_MESSAGE_DATA_S *)calloc(1,sizeof(MMS_MESSAGE_DATA_S));
708 convert_to_mmsdata(mms_struct, tmp_mms_data);
710 msg_data->pMmsData = _MsgMmsSerializeMessageData(tmp_mms_data, &(msg_data->mmsDataSize));
712 _MsgMmsReleasePageList(tmp_mms_data);
713 _MsgMmsReleaseRegionList(tmp_mms_data);
714 _MsgMmsReleaseAttachList(tmp_mms_data);
715 _MsgMmsReleaseTransitionList(tmp_mms_data);
716 _MsgMmsReleaseMetaList(tmp_mms_data);