2 * Copyright 2012 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://www.tizenopensource.org/license
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;
54 /* Allocate memory for address list of message */
55 msg_struct_list_s *addr_list = (msg_struct_list_s *)new msg_struct_list_s;
57 addr_list->nCount = 0;
58 addr_list->msg_struct_info = (msg_struct_t *)new char[sizeof(MSG_ADDRESS_INFO_S *)*MAX_TO_ADDRESS_CNT];
60 msg_struct_s *pTmp = NULL;
62 for (int i = 0; i < MAX_TO_ADDRESS_CNT; i++) {
63 addr_list->msg_struct_info[i] = (msg_struct_t)new char[sizeof(msg_struct_s)];
64 pTmp = (msg_struct_s *)addr_list->msg_struct_info[i];
65 pTmp->type = MSG_STRUCT_ADDRESS_INFO;
66 pTmp->data = new MSG_ADDRESS_INFO_S;
67 memset(pTmp->data, 0x00, sizeof(MSG_ADDRESS_INFO_S));
69 addr_list->msg_struct_info[i] = (msg_struct_t)pTmp;
72 msg->addr_list = addr_list;
74 msg_struct->data = (int *)msg;
77 int msg_message_release(msg_struct_s **msg_struct)
79 MSG_MESSAGE_HIDDEN_S *msg = (MSG_MESSAGE_HIDDEN_S *)(*msg_struct)->data;
82 delete [] static_cast<char*>(msg->pData);
87 delete [] static_cast<char*>(msg->pMmsData);
92 if (msg->addr_list!= NULL)
94 for(int i=0; i<MAX_TO_ADDRESS_CNT; i++) {
95 msg_struct_s * addrInfo = (msg_struct_s *)msg->addr_list->msg_struct_info[i];
96 delete (MSG_ADDRESS_INFO_S *)addrInfo->data;
97 addrInfo->data = NULL;
98 delete (msg_struct_s *)msg->addr_list->msg_struct_info[i];
99 msg->addr_list->msg_struct_info[i] = NULL;
102 delete [] msg->addr_list->msg_struct_info;
104 delete msg->addr_list;
105 msg->addr_list = NULL;
109 (*msg_struct)->data = NULL;
111 delete (msg_struct_s *)*msg_struct;
117 int msg_message_get_int_value(void *data, int field, int *value)
120 return MSG_ERR_NULL_POINTER;
122 int ret = MSG_SUCCESS;
124 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
128 case MSG_MESSAGE_ID_INT :
129 *value = msg_data->msgId;
131 case MSG_MESSAGE_THREAD_ID_INT :
132 *value = msg_data->threadId;
134 case MSG_MESSAGE_FOLDER_ID_INT :
135 *value = msg_data->folderId;
137 case MSG_MESSAGE_TYPE_INT :
139 if (msg_data->mainType == MSG_SMS_TYPE)
141 if (msg_data->subType == MSG_CB_SMS)
142 *value = MSG_TYPE_SMS_CB;
143 else if (msg_data->subType == MSG_JAVACB_SMS)
144 *value = MSG_TYPE_SMS_JAVACB;
145 else if (msg_data->subType == MSG_WAP_SI_SMS || msg_data->subType == MSG_WAP_SL_SMS)
146 *value = MSG_TYPE_SMS_WAPPUSH;
147 else if (msg_data->subType == MSG_MWI_VOICE_SMS || msg_data->subType == MSG_MWI_FAX_SMS
148 || msg_data->subType == MSG_MWI_EMAIL_SMS || msg_data->subType == MSG_MWI_OTHER_SMS)
149 *value = MSG_TYPE_SMS_MWI;
150 else if (msg_data->subType == MSG_SYNCML_CP)
151 *value = MSG_TYPE_SMS_SYNCML;
152 else if (msg_data->subType == MSG_REJECT_SMS)
153 *value = MSG_TYPE_SMS_REJECT;
154 else if (msg_data->subType == MSG_ETWS_SMS)
155 *value = MSG_TYPE_SMS_ETWS_PRIMARY;
157 *value = MSG_TYPE_SMS;
159 else if (msg_data->mainType == MSG_MMS_TYPE)
161 if (msg_data->subType == MSG_NOTIFICATIONIND_MMS)
162 *value = MSG_TYPE_MMS_NOTI;
163 else if (msg_data->subType == MSG_SENDREQ_JAVA_MMS)
164 *value = MSG_TYPE_MMS_JAVA;
166 *value = MSG_TYPE_MMS;
169 *value = MSG_TYPE_INVALID;
173 case MSG_MESSAGE_CLASS_TYPE_INT :
174 *value = msg_data->classType;
176 case MSG_MESSAGE_STORAGE_ID_INT :
177 *value = msg_data->storageId;
179 case MSG_MESSAGE_DISPLAY_TIME_INT :
180 *value = msg_data->displayTime;
182 case MSG_MESSAGE_NETWORK_STATUS_INT :
183 *value = msg_data->networkStatus;
185 case MSG_MESSAGE_ENCODE_TYPE_INT :
186 *value = msg_data->encodeType;
188 case MSG_MESSAGE_PRIORITY_INT :
189 *value = msg_data->priority;
191 case MSG_MESSAGE_DIRECTION_INT :
192 *value = msg_data->direction;
194 case MSG_MESSAGE_DEST_PORT_INT :
195 *value = msg_data->dstPort;
197 case MSG_MESSAGE_SRC_PORT_INT :
198 *value = msg_data->srcPort;
200 case MSG_MESSAGE_ATTACH_COUNT_INT :
201 *value = msg_data->attachCount;
203 case MSG_MESSAGE_DATA_SIZE_INT :
204 *value = msg_data->dataSize;
207 ret = MSG_ERR_INVALID_PARAMETER;
214 int msg_message_get_bool_value(void *data, int field, bool *value)
217 return MSG_ERR_NULL_POINTER;
219 int ret = MSG_SUCCESS;
221 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
224 case MSG_MESSAGE_READ_BOOL :
225 *value = msg_data->bRead;
227 case MSG_MESSAGE_PROTECTED_BOOL :
228 *value = msg_data->bProtected;
230 case MSG_MESSAGE_BACKUP_BOOL :
231 *value = msg_data->bBackup;
233 case MSG_MESSAGE_PORT_VALID_BOOL :
234 *value = msg_data->bPortValid;
237 ret = MSG_ERR_INVALID_PARAMETER;
244 int msg_message_get_str_value(void *data, int field, char *value, int size)
247 return MSG_ERR_NULL_POINTER;
249 int ret = MSG_SUCCESS;
251 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
254 case MSG_MESSAGE_REPLY_ADDR_STR :
255 strncpy(value, msg_data->replyAddress, size);
257 case MSG_MESSAGE_SUBJECT_STR :
258 strncpy(value, msg_data->subject, size);
260 case MSG_MESSAGE_THUMBNAIL_PATH_STR :
261 strncpy(value, msg_data->thumbPath, size);
263 case MSG_MESSAGE_SMS_DATA_STR :
264 case MSG_MESSAGE_MMS_TEXT_STR :
268 (size >= msg_data->dataSize)? (data_len = msg_data->dataSize) : data_len = size;
269 memset(value, 0, size);
270 memcpy(value, msg_data->pData, data_len);
274 ret = MSG_ERR_INVALID_PARAMETER;
281 int msg_message_get_struct_hnd(void *data, int field, void **value)
284 return MSG_ERR_NULL_POINTER;
286 int ret = MSG_SUCCESS;
288 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
292 ret = MSG_ERR_INVALID_PARAMETER;
299 int msg_message_get_list_hnd(void *data, int field, void **value)
302 return MSG_ERR_NULL_POINTER;
304 int ret = MSG_SUCCESS;
306 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
309 case MSG_MESSAGE_ADDR_LIST_STRUCT :
310 *value = (void *)msg_data->addr_list;
313 ret = MSG_ERR_INVALID_PARAMETER;
320 int msg_message_set_int_value(void *data, int field, int value)
323 return MSG_ERR_NULL_POINTER;
325 int ret = MSG_SUCCESS;
327 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
331 case MSG_MESSAGE_ID_INT :
332 msg_data->msgId = value;
334 case MSG_MESSAGE_THREAD_ID_INT :
335 msg_data->threadId = value;
337 case MSG_MESSAGE_FOLDER_ID_INT :
338 msg_data->folderId = value;
340 case MSG_MESSAGE_TYPE_INT :
342 if (value == MSG_TYPE_SMS) {
343 msg_data->mainType = MSG_SMS_TYPE;
344 msg_data->subType = MSG_NORMAL_SMS;
345 } else if (value == MSG_TYPE_MMS) {
346 msg_data->mainType = MSG_MMS_TYPE;
347 msg_data->subType = MSG_SENDREQ_MMS;
348 } else if (value == MSG_TYPE_MMS_JAVA) {
349 msg_data->mainType = MSG_MMS_TYPE;
350 msg_data->subType = MSG_SENDREQ_JAVA_MMS;
351 } else if (value == MSG_TYPE_SMS_SYNCML) {
352 msg_data->mainType = MSG_SMS_TYPE;
353 msg_data->subType = MSG_SYNCML_CP;
354 } else if (value == MSG_TYPE_SMS_REJECT) {
355 msg_data->mainType = MSG_SMS_TYPE;
356 msg_data->subType = MSG_REJECT_SMS;
360 case MSG_MESSAGE_CLASS_TYPE_INT :
361 msg_data->classType = value;
363 case MSG_MESSAGE_STORAGE_ID_INT :
364 msg_data->storageId = value;
366 case MSG_MESSAGE_DISPLAY_TIME_INT :
367 msg_data->displayTime = value;
369 case MSG_MESSAGE_NETWORK_STATUS_INT :
370 msg_data->networkStatus = value;
372 case MSG_MESSAGE_ENCODE_TYPE_INT :
373 msg_data->encodeType = value;
375 case MSG_MESSAGE_PRIORITY_INT :
376 msg_data->priority = value;
378 case MSG_MESSAGE_DIRECTION_INT :
379 msg_data->direction = value;
381 case MSG_MESSAGE_DEST_PORT_INT :
382 msg_data->dstPort = value;
384 case MSG_MESSAGE_SRC_PORT_INT :
385 msg_data->srcPort = value;
387 case MSG_MESSAGE_ATTACH_COUNT_INT :
388 msg_data->attachCount = value;
390 case MSG_MESSAGE_DATA_SIZE_INT :
391 msg_data->dataSize = value;
394 ret = MSG_ERR_INVALID_PARAMETER;
401 int msg_message_set_bool_value(void *data, int field, bool value)
404 return MSG_ERR_NULL_POINTER;
406 int ret = MSG_SUCCESS;
408 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
411 case MSG_MESSAGE_READ_BOOL :
412 msg_data->bRead = value;
414 case MSG_MESSAGE_PROTECTED_BOOL :
415 msg_data->bProtected = value;
417 case MSG_MESSAGE_BACKUP_BOOL :
418 msg_data->bBackup = value;
420 case MSG_MESSAGE_PORT_VALID_BOOL :
421 msg_data->bPortValid = value;
424 ret = MSG_ERR_INVALID_PARAMETER;
431 int msg_message_set_str_value(void *data, int field, char *value, int size)
434 return MSG_ERR_NULL_POINTER;
436 int ret = MSG_SUCCESS;
438 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
441 case MSG_MESSAGE_REPLY_ADDR_STR :
442 snprintf(msg_data->replyAddress, sizeof(msg_data->replyAddress), "%s", value);
444 case MSG_MESSAGE_SUBJECT_STR :
445 snprintf(msg_data->subject, sizeof(msg_data->subject), "%s",value);
447 case MSG_MESSAGE_THUMBNAIL_PATH_STR :
448 snprintf(msg_data->thumbPath, sizeof(msg_data->thumbPath), "%s",value);
450 case MSG_MESSAGE_SMS_DATA_STR :
453 delete [] static_cast<char*>(msg_data->pData);
455 msg_data->dataSize = size;
456 msg_data->pData = (void*)new char[msg_data->dataSize+1];
457 memcpy((char *)msg_data->pData, value, msg_data->dataSize);
458 ((char*) msg_data->pData)[msg_data->dataSize] = '\0';
462 ret = MSG_ERR_INVALID_PARAMETER;
469 int msg_message_set_struct_hnd(void *data, int field, void *value)
472 return MSG_ERR_NULL_POINTER;
474 int ret = MSG_SUCCESS;
476 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)data;
480 ret = MSG_ERR_INVALID_PARAMETER;
487 void msg_message_copy_message(MSG_MESSAGE_HIDDEN_S *pSrc, MSG_MESSAGE_HIDDEN_S *pDst)
490 pDst->msgId = pSrc->msgId;
491 pDst->threadId = pSrc->msgId;
492 pDst->folderId = pSrc->folderId;
493 pDst->mainType = pSrc->mainType;
494 pDst->subType = pSrc->subType;
495 pDst->classType = pSrc->classType;
496 pDst->storageId = pSrc->storageId;
497 pDst->displayTime = pSrc->displayTime;
498 pDst->networkStatus = pSrc->networkStatus;
499 pDst->encodeType = pSrc->encodeType;
500 pDst->bRead = pSrc->bRead;
501 pDst->bProtected = pSrc->bProtected;
502 pDst->bBackup = pSrc->bBackup;
503 pDst->priority = pSrc->priority;
504 pDst->direction = pSrc->direction;
505 pDst->bPortValid = pSrc->bPortValid;
506 pDst->dataSize = pSrc->dataSize;
507 memcpy(pDst->subject, pSrc->subject, sizeof(pDst->subject));
512 pDst->pMmsData = new char[pSrc->dataSize + 1];
513 memcpy(pDst->pMmsData, pSrc->pMmsData, pSrc->dataSize);
517 int data_len = strlen((const char *)pSrc->pData);
518 pDst->pData = new char[data_len + 1];
519 memset(pDst->pData, 0x00, data_len + 1);
520 strncpy((char *)pDst->pData, (const char *)pSrc->pData, data_len);
523 msg_struct_list_s *src_addrlist = pSrc->addr_list;
524 msg_struct_list_s *dst_addrlist = pDst->addr_list;
525 dst_addrlist->nCount = src_addrlist->nCount;
527 for(int i=0; i < MAX_TO_ADDRESS_CNT; ++i)
529 msg_struct_s *src_addr = (msg_struct_s *)src_addrlist->msg_struct_info[i];
530 msg_struct_s *dst_addr = (msg_struct_s *)dst_addrlist->msg_struct_info[i];
531 memcpy(dst_addr->data, src_addr->data, sizeof(MSG_ADDRESS_INFO_S));
535 int msg_cb_message_get_int_value(void *data, int field, int *value)
538 return MSG_ERR_NULL_POINTER;
540 int ret = MSG_SUCCESS;
542 MSG_CB_MSG_S *cb_msg = (MSG_CB_MSG_S *)data;
548 case MSG_CB_MSG_TYPE_INT :
550 if ( cb_msg->type == MSG_ETWS_SMS )
551 *value = MSG_TYPE_SMS_ETWS_PRIMARY;
552 else if ( cb_msg->type == MSG_CB_SMS )
553 *value = ((cb_msg->messageId & 0xFFF8) == 0x1100 ) ? MSG_TYPE_SMS_ETWS_SECONDARY : MSG_TYPE_SMS_CB;
555 ret = MSG_ERR_UNKNOWN;
558 case MSG_CB_MSG_RECV_TIME_INT :
559 *value = cb_msg->receivedTime;
561 case MSG_CB_MSG_SERIAL_NUM_INT :
562 *value = cb_msg->serialNum;
564 case MSG_CB_MSG_MSG_ID_INT :
565 *value = cb_msg->messageId;
567 case MSG_CB_MSG_DCS_INT :
568 *value = (int)cb_msg->dcs;
570 case MSG_CB_MSG_CB_TEXT_LEN_INT :
571 *value = cb_msg->cbTextLen;
573 case MSG_CB_MSG_ETWS_WARNING_TYPE_INT :
574 *value = cb_msg->etwsWarningType;
576 ret = MSG_ERR_INVALID_PARAMETER;
583 int msg_cb_message_get_str_value(void *data, int field, char *value, int size)
586 return MSG_ERR_NULL_POINTER;
588 int ret = MSG_SUCCESS;
590 MSG_CB_MSG_S *cb_msg = (MSG_CB_MSG_S *)data;
593 case MSG_CB_MSG_CB_TEXT_STR:
596 copylen = (size > cb_msg->cbTextLen) ? cb_msg->cbTextLen : size - 1;
597 memcpy (value, cb_msg->cbText, copylen);
598 value[copylen] = '\0';
601 case MSG_CB_MSG_ETWS_WARNING_SECU_INFO_STR:
603 if (size < sizeof(cb_msg->etwsWarningSecurityInfo))
604 ret = MSG_ERR_INVALID_PARAMETER;
606 memcpy (value, cb_msg->etwsWarningSecurityInfo, sizeof(cb_msg->etwsWarningSecurityInfo));
611 ret = MSG_ERR_INVALID_PARAMETER;
620 EXPORT_API int msg_get_mms_struct(msg_struct_t msg_struct_handle, msg_struct_t mms_struct_handle)
622 //TODO :: check message type is MMS
623 int ret = MSG_SUCCESS;
624 msg_struct_s *msg_struct = (msg_struct_s *)msg_struct_handle;
625 msg_struct_s *mms_struct = (msg_struct_s *)mms_struct_handle;
627 if (msg_struct == NULL || mms_struct == NULL) {
628 return MSG_ERR_INVALID_PARAMETER;
631 if (msg_struct->data == NULL || mms_struct->data == NULL) {
632 return MSG_ERR_INVALID_PARAMETER;
635 if (msg_struct->type != MSG_STRUCT_MESSAGE_INFO || mms_struct->type != MSG_STRUCT_MMS) {
636 return MSG_ERR_INVALID_PARAMETER;
639 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)msg_struct->data;
641 MMS_MESSAGE_DATA_S *tmp_mms_data = (MMS_MESSAGE_DATA_S *)calloc(1, sizeof(MMS_MESSAGE_DATA_S));
643 _MsgMmsDeserializeMessageData(tmp_mms_data, (char*)msg_data->pMmsData);
645 convert_from_mmsdata(tmp_mms_data, mms_struct);
647 _MsgMmsReleasePageList(tmp_mms_data);
648 _MsgMmsReleaseRegionList(tmp_mms_data);
649 _MsgMmsReleaseAttachList(tmp_mms_data);
650 _MsgMmsReleaseTransitionList(tmp_mms_data);
651 _MsgMmsReleaseMetaList(tmp_mms_data);
657 EXPORT_API int msg_set_mms_struct(msg_struct_t msg_struct_handle, msg_struct_t mms_struct_handle)
659 //TODO :: check message type is MMS
660 int ret = MSG_SUCCESS;
661 msg_struct_s *msg_struct = (msg_struct_s *)msg_struct_handle;
662 msg_struct_s *mms_struct = (msg_struct_s *)mms_struct_handle;
664 if (msg_struct == NULL || mms_struct == NULL) {
665 return MSG_ERR_INVALID_PARAMETER;
668 if (msg_struct->data == NULL || mms_struct->data == NULL) {
669 return MSG_ERR_INVALID_PARAMETER;
672 if (msg_struct->type != MSG_STRUCT_MESSAGE_INFO || mms_struct->type != MSG_STRUCT_MMS) {
673 return MSG_ERR_INVALID_PARAMETER;
676 MSG_MESSAGE_HIDDEN_S *msg_data = (MSG_MESSAGE_HIDDEN_S *)msg_struct->data;
678 MMS_MESSAGE_DATA_S *tmp_mms_data = (MMS_MESSAGE_DATA_S *)calloc(1,sizeof(MMS_MESSAGE_DATA_S));
680 convert_to_mmsdata(mms_struct, tmp_mms_data);
682 msg_data->pMmsData = _MsgMmsSerializeMessageData(tmp_mms_data, &(msg_data->dataSize));
684 _MsgMmsReleasePageList(tmp_mms_data);
685 _MsgMmsReleaseRegionList(tmp_mms_data);
686 _MsgMmsReleaseAttachList(tmp_mms_data);
687 _MsgMmsReleaseTransitionList(tmp_mms_data);
688 _MsgMmsReleaseMetaList(tmp_mms_data);