2 * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
22 #include <unicode/ucnv.h>
23 #include <unicode/ustring.h>
29 #include "MsgMmsTypes.h"
30 #include "MsgContact.h"
32 #include "MsgUtilFile.h"
33 #include "MsgCppTypes.h"
34 #include "MsgVMessage.h"
35 #include "MsgMmsMessage.h"
36 #include "MsgSerialize.h"
38 #define VMSG_INIT_LENGTH 1024
39 #define VMSG_ITEM_LENGTH 1024
40 #define MSGSVC_VMSG_FOLDING_LIMIT 75
42 #define SMART_STRDUP(src) (src && *src)?strdup(src):NULL
43 #define SAFE_STR(src) (src)?src:""
45 #define MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, str) do { \
46 if ((len = __msgsvc_vmsg_append_str(buf, buf_size, len, str, false)) < 0) { \
47 MSG_ERR("__msgsvc_vmsg_append_str() Failed"); \
48 return MSG_ERR_MEMORY_ERROR; \
52 #define MSGSVC_VMSG_APPEND_STR_FREE(buf, buf_size, len, str) do { \
53 if ((len = __msgsvc_vmsg_append_str(buf, buf_size, len, str, false)) < 0) { \
54 MSG_ERR("__msgsvc_vmsg_append_str() Failed"); \
57 return MSG_ERR_MEMORY_ERROR; \
61 #define MSGSVC_VMSG_APPEND_CONTENT_STR(buf, buf_size, len, content) do { \
62 if ((len = __msgsvc_vmsg_append_str(buf, buf_size, len, content, true)) < 0) { \
63 MSG_ERR("__msgsvc_vmsg_append_str() Failed"); \
64 return MSG_ERR_MEMORY_ERROR; \
69 #define MSGSVC_VMSG_APPEND_CONTENT(buf, buf_size, len, content) do { \
70 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, ";CHARSET=UTF-8"); \
71 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, ":"); \
72 MSGSVC_VMSG_APPEND_CONTENT_STR(buf, buf_size, len, content); \
73 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF); \
112 FNAME_UTF8_VCARD = 17,
113 NAME_UTF8_VCARD = 18,
116 VMSG_ATTR_ENCODING_QP = 19,
117 VMSG_ATTR_ENCODING_BASE64_V21 = 20,
118 VMSG_ATTR_ENCODING_BASE64_V30 = 21,
120 /* Message type indication */
121 VMSG_INDICATION_MESSAGE_TYPE = 22,
122 VMSG_INDICATION_MESSAGE_TYPE_INET = 23,
123 VMSG_INDICATION_MESSAGE_TYPE_MSG = 24,
125 /* Read status indication */
126 VMSG_INDICATION_READ_STATUS = 25,
127 VMSG_INDICATION_READ_STATUS_READ = 26,
128 VMSG_INDICATION_READ_STATUS_UNREAD = 27,
130 /* Mailbox status indication */
131 VMSG_INDICATION_MSG_BOX = 28,
132 VMSG_INDICATION_MSG_BOX_SENT = 29,
133 VMSG_INDICATION_MSG_BOX_INBOX = 30,
134 VMSG_INDICATION_MSG_BOX_DRAFT = 31,
137 VMSG_ATTR_CHARSET_PROPERTY = 32,
140 VMSG_ATTR_LANGUAGE_PROPERTY = 33,
141 VMSG_DATA_SEPARATOR = 34,
143 VMSG_BODY_PROPERTY_DATE = 35,
144 VMSG_BODY_PROPERTY_SUBJECT = 36,
145 VMSG_BODY_PROPERTY_FROM = 37,
146 VMSG_BODY_PROPERTY_TO = 38,
155 VMSG_MAXIMUM_VALUE = 44,
158 static const char *content_name[VMSG_MAXIMUM_VALUE+1] = {0};
159 const char *MSGSVC_CRLF = "\r\n";
160 bool needCharset = false;
162 static void __msgsvc_vmsg_initial(void)
164 if (NULL == *content_name) {
166 content_name[BEGIN_VMSG] = "BEGIN:VMSG";
167 content_name[VERSION_VMSG] = "VERSION:1.1";
168 content_name[BEGIN_VCARD] = "BEGIN:VCARD";
169 content_name[VERSION_VCARD] = "VERSION:2.1";
170 content_name[END_VCARD] = "END:VCARD";
171 content_name[BEGIN_VENV] = "BEGIN:VENV";
172 content_name[BEGIN_VBODY] = "BEGIN:VBODY";
173 content_name[END_VBODY] = "END:VBODY";
174 content_name[END_VENV] = "END:VENV";
175 content_name[END_VMSG] = "END:VMSG";
177 content_name[FNAME_VCARD] = "FN:";
178 content_name[NAME_VCARD] = "N:";
179 content_name[TEL_VCARD] = "TEL;";
180 content_name[TEL_VCARD_CELL] = "CELL:";
182 content_name[DATE_VMSG] = "Date:";
183 content_name[SUBJECT_VMSG] = "Subject:";
185 content_name[FNAME_UTF8_VCARD] = "FN;CHARSET=UTF-8:";
186 content_name[NAME_UTF8_VCARD] = "N;CHARSET=UTF-8:";
189 content_name[VMSG_ATTR_ENCODING_QP] = "ENCODING=QUOTED-PRINTABLE";
190 content_name[VMSG_ATTR_ENCODING_BASE64_V21] = "ENCODING=BASE64";
191 content_name[VMSG_ATTR_ENCODING_BASE64_V30] = "ENCODING=b";
193 /* Message type indication */
194 content_name[VMSG_INDICATION_MESSAGE_TYPE] = "X-IRMC-TYPE";
195 content_name[VMSG_INDICATION_MESSAGE_TYPE_INET] = "INET";
196 content_name[VMSG_INDICATION_MESSAGE_TYPE_MSG] = "MSG";
198 /* Read status indication */
199 content_name[VMSG_INDICATION_READ_STATUS] = "X-IRMC-STATUS";
200 content_name[VMSG_INDICATION_READ_STATUS_READ] = "READ";
201 content_name[VMSG_INDICATION_READ_STATUS_UNREAD] = "UNREAD";
203 /* Mailbox status indication */
204 content_name[VMSG_INDICATION_MSG_BOX] = "X-IRMC-BOX";
205 content_name[VMSG_INDICATION_MSG_BOX_SENT] = "SENT";
206 content_name[VMSG_INDICATION_MSG_BOX_INBOX] = "INBOX";
207 content_name[VMSG_INDICATION_MSG_BOX_DRAFT] = "DRAFT";
210 content_name[VMSG_ATTR_CHARSET_PROPERTY] = "CHARSET";
213 content_name[VMSG_ATTR_LANGUAGE_PROPERTY] = "LANGUAGE";
214 content_name[VMSG_DATA_SEPARATOR] = ":";
216 content_name[VMSG_BODY_PROPERTY_DATE] = "Date";
217 content_name[VMSG_BODY_PROPERTY_SUBJECT] = "Subject";
218 content_name[VMSG_BODY_PROPERTY_FROM] = "From";
219 content_name[VMSG_BODY_PROPERTY_TO] = "To";
221 content_name[KEY_BODY] = "body";
222 content_name[KEY_DATE] = "date";
224 content_name[VMSG_VCARD_TEL] = "TEL";
225 content_name[VMSG_MSG_BEGIN] = "BEGIN";
226 content_name[VMSG_MSG_END] = "END";
227 content_name[VMSG_MAXIMUM_VALUE] = "MAX";
231 static int __msgsvc_vmsg_append_str(char **buf, int *buf_size, int len, const char *str, bool need_conversion)
235 const char *safe_str = SAFE_STR(str);
237 bool need_realloc = false;
239 str_len = strlen(safe_str);
240 while ((*buf_size-len) < (str_len+1)) {
241 *buf_size = *buf_size * 2;
246 if (NULL == (tmp = (char *)realloc(*buf, *buf_size)))
252 if (need_conversion) {
253 const char *s = safe_str;
254 char *r = (char *)(*buf+len);
257 switch ((unsigned int)*s) {
259 if (*(s+1) && '\n' == *(s+1)) {
272 if (*buf_size < str_len+len+1) {
273 *buf_size = *buf_size * 2;
274 if (NULL == (tmp = (char *)realloc(*buf, *buf_size))) {
277 int pos_temp = r-(*buf+len);
279 r = (char *)(*buf+len+pos_temp);
293 if (*buf_size < str_len+len+1) {
294 *buf_size = *buf_size * 2;
295 if (NULL == (tmp = (char *)realloc(*buf, *buf_size))) {
298 int pos_temp = r-(*buf+len);
300 r = (char *)(*buf+len+pos_temp);
306 if (*(s+1) && 0xAC == *(s+1)) { /* en/em backslash */
310 if (*buf_size < str_len+len+1) {
311 *buf_size = *buf_size * 2;
312 if (NULL == (tmp = (char *)realloc(*buf, *buf_size))) {
315 int pos_temp = r-(*buf+len);
317 r = (char *)(*buf+len+pos_temp);
324 if (*buf_size < str_len+len+1) {
325 *buf_size = *buf_size * 2;
326 if (NULL == (tmp = (char *)realloc(*buf, *buf_size))) {
329 int pos_temp = r-(*buf+len);
331 r = (char *)(*buf+len+pos_temp);
340 if (*(s+1) && 0x5F == *(s+1)) { /* en/em backslash */
344 if (*buf_size < str_len+len+1) {
345 *buf_size = *buf_size * 2;
346 if (NULL == (tmp = (char *)realloc(*buf, *buf_size))) {
349 int pos_temp = r-(*buf+len);
351 r = (char *)(*buf+len+pos_temp);
358 if (*buf_size < str_len+len+1) {
359 *buf_size = *buf_size * 2;
360 if (NULL == (tmp = (char *)realloc(*buf, *buf_size))) {
363 int pos_temp = r-(*buf+len);
365 r = (char *)(*buf+len+pos_temp);
382 len_temp = snprintf(*buf+len, *buf_size-len+1, "%s", safe_str);
389 /*==================================================================================================
391 ==================================================================================================*/
392 #define INSERT_VMSG_OBJ pObject = (VObject*)calloc(1, sizeof(VObject)); \
395 vmsg_free_vtree_memory(pMessage);\
398 if (pMessage->pTop == NULL)\
400 pMessage->pTop = pObject;\
404 pMessage->pCur->pSibling = pObject;\
406 pMessage->pCur = pObject;
409 #define INSERT_VBODY_OBJ pObject = (VObject*)calloc(1, sizeof(VObject)); \
412 vmsg_free_vtree_memory(pMessage);\
415 if (pBody->pTop == NULL)\
417 pBody->pTop = pObject;\
421 pBody->pCur->pSibling = pObject;\
423 pBody->pCur = pObject;
426 #define INSERT_VCARD_OBJ pObject = (VObject*)calloc(1, sizeof(VObject)); \
429 vmsg_free_vtree_memory(pMessage);\
432 if (pCard->pTop == NULL)\
434 pCard->pTop = pObject;\
438 pCard->pCur->pSibling = pObject;\
440 pCard->pCur = pObject;
443 #define INSERT_PARAM param = (VParam*)calloc(1, sizeof(VParam));\
446 vmsg_free_vtree_memory(pMessage);\
447 if (pObject != NULL)\
456 /*==================================================================================================
457 FUNCTION IMPLEMENTATION
458 ==================================================================================================*/
460 char* _convert_tm_to_vdata_str(const struct tm * tm)
462 char str[17] = {0, };
464 snprintf(str, 17, "%04d%02d%02dT%02d%02d%02dZ",
475 bool _convert_vdata_str_to_tm(const char* szText, struct tm * tm)
477 if (szText == NULL) return false;
478 if (strlen(szText) < 15) return false;
479 if (szText[8] != 'T') return false;
482 memset(tm, 0, sizeof(struct tm));
484 /* year, month, day */
485 memcpy(szBuff, &(szText[0]), 4);
487 tm->tm_year = atol(szBuff) - 1900;
488 if ((tm->tm_year > 137) || (tm->tm_year < 0))
491 memcpy(szBuff, &(szText[4]), 2);
493 tm->tm_mon = atol(szBuff)-1;
494 if ((tm->tm_mon > 11) || (tm->tm_mon < 0))
497 memcpy(szBuff, &(szText[6]), 2);
499 tm->tm_mday = atol(szBuff);
500 if ((tm->tm_mday > 31) || (tm->tm_mday < 1))
503 /* hour, minute, second */
504 memcpy(szBuff, &(szText[9]), 2);
506 tm->tm_hour = atol(szBuff);
507 if ((tm->tm_hour > 23) || (tm->tm_hour < 0))
510 memcpy(szBuff, &(szText[11]), 2);
512 tm->tm_min = atol(szBuff);
513 if ((tm->tm_min > 59) || (tm->tm_min < 0))
516 memcpy(szBuff, &(szText[13]), 2);
518 tm->tm_sec = atol(szBuff);
519 if ((tm->tm_sec > 59) || (tm->tm_sec < 0))
525 int msgsvc_check_utf8(char c)
527 if ((c & 0xff) < (128 & 0xff))
529 else if ((c & (char)0xe0) == (char)0xc0)
531 else if ((c & (char)0xf0) == (char)0xe0)
533 else if ((c & (char)0xf8) == (char)0xf0)
535 else if ((c & (char)0xfc) == (char)0xf8)
537 else if ((c & (char)0xfe) == (char)0xfc)
540 return MSG_ERR_INVALID_PARAMETER;
543 char* __msgsvc_vmsg_convert_tm_to_vdata_str(struct tm * tm)
545 char str[22] = {0, };
547 char month[15] = {0, };
550 mon = tm->tm_mon + 1;
552 if (tm->tm_hour >= 12)
553 strncpy(APM, "PM", 2);
555 strncpy(APM, "AM", 2);
557 if (tm->tm_hour > 12)
558 hour = tm->tm_hour - 12;
564 strncpy(month, "Jan", 3);
567 strncpy(month, "Feb", 3);
570 strncpy(month, "Mar", 3);
573 strncpy(month, "Apr", 3);
576 strncpy(month, "May", 3);
579 strncpy(month, "Jun", 3);
582 strncpy(month, "Jul", 3);
585 strncpy(month, "Aug", 3);
588 strncpy(month, "Sep", 3);
591 strncpy(month, "Oct", 3);
594 strncpy(month, "Nov", 3);
597 strncpy(month, "Dec", 3);
600 MSG_DEBUG("invalid month number");
604 snprintf(str, 22, "%d:%02d%s, %04d %s %d",
614 static inline int __msgsvc_vmsg_add_folding(char **buf, int *buf_size, int buf_len)
617 char *buf_copy = NULL;
621 bool content_start = false;
622 bool encode_64 = false;
624 buf_copy = (char *)calloc(1, *buf_size);
628 len = result_len = 0;
631 if (*buf_size < result_len + 5) {
633 *buf_size = *buf_size + 1000;
634 if (NULL == (tmp = (char *)realloc(buf_copy, *buf_size))) {
639 r = (buf_copy + result_len);
643 if (false == content_start) {
645 content_start = true;
646 else if (0 == strncmp(s, "ENCODING=BASE64", strlen("ENCODING=BASE64")))
652 } else if ('\n' == *s) {
655 content_start = false;
660 if (false == encode_64)
661 char_len = msgsvc_check_utf8(*s);
663 if (MSGSVC_VMSG_FOLDING_LIMIT <= len + char_len) {
690 static inline int __msgsvc_vmsg_append_start_vmsg_1_1(char **buf, int *buf_size, int len)
692 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[BEGIN_VMSG]);
693 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
694 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VERSION_VMSG]);
695 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
699 static inline int __msgsvc_vmsg_append_end_vmsg(char **buf, int *buf_size, int len)
701 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[END_VMSG]);
702 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
706 static inline int __msgsvc_vmsg_append_read_status(MSG_MESSAGE_INFO_S *pMsg, char **buf, int *buf_size, int len)
708 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_INDICATION_READ_STATUS]);
709 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_DATA_SEPARATOR]);
711 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_INDICATION_READ_STATUS_READ]);
712 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
714 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_INDICATION_READ_STATUS_UNREAD]);
715 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
719 static inline int __msgsvc_vmsg_append_box_type(MSG_MESSAGE_INFO_S *pMsg, char **buf, int *buf_size, int len)
721 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_INDICATION_MSG_BOX]);
722 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_DATA_SEPARATOR]);
723 switch(pMsg->folderId) {
725 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_INDICATION_MSG_BOX_INBOX]);
729 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_INDICATION_MSG_BOX_SENT]);
733 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_INDICATION_MSG_BOX_DRAFT]);
736 /* Discard User Defined, outbox or Spam folder's messages. */
737 MSG_DEBUG("Invalid or unhandled msg box");
739 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
743 static inline int __msgsvc_vmsg_append_msg_type(MSG_MESSAGE_INFO_S *pMsg, char **buf, int *buf_size, int len)
745 /* TO DO check with msg text contains Only PrintableAscii if true then else handle INET_TYPE */
746 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_INDICATION_MESSAGE_TYPE]);
747 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_DATA_SEPARATOR]);
748 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_INDICATION_MESSAGE_TYPE_MSG]);
749 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
753 static inline int __msgsvc_vmsg_append_origin_address_vcard(MSG_MESSAGE_INFO_S *pMsg, char **buf, int *buf_size, int len)
755 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[BEGIN_VCARD]);
756 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
757 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VERSION_VCARD]);
758 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
759 char originAddress[MAX_ADDRESS_VAL_LEN + 1] = {0, };
760 bool isDisplayName = false;
762 signed char folderId = (signed char)pMsg->folderId;
763 if (folderId == (signed char)MSG_INBOX_ID) {
764 snprintf(originAddress, sizeof(originAddress), "%s", pMsg->addressList[0].addressVal);
767 needCharset = true; /* as per android */
769 if (strlen(originAddress) > 0) {
770 MSG_CONTACT_INFO_S contactInfo;
771 memset(&contactInfo, 0x00, sizeof(MSG_CONTACT_INFO_S));
773 if (MsgGetContactInfo(&(pMsg->addressList[0]), &contactInfo) != MSG_SUCCESS) {
774 MSG_WARN("MsgGetContactInfo() fail.");
776 snprintf(pMsg->addressList[0].displayName, sizeof(pMsg->addressList[0].displayName), "%s", contactInfo.firstName);
777 if (pMsg->addressList[0].displayName[0] != '\0')
778 isDisplayName = true;
779 if (needCharset && isDisplayName) {
780 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[FNAME_UTF8_VCARD]);
781 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, pMsg->addressList->displayName);
782 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
783 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[NAME_UTF8_VCARD]);
784 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, pMsg->addressList->displayName);
785 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
787 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[FNAME_VCARD]);
788 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, pMsg->addressList->displayName);
789 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
790 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[NAME_VCARD]);
791 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, pMsg->addressList->displayName);
792 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
794 if (MsgIsNumber(originAddress)) {
795 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[TEL_VCARD]);
796 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[TEL_VCARD_CELL]);
797 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, originAddress);
798 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
801 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[FNAME_VCARD]);
802 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
803 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[NAME_VCARD]);
804 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
808 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[END_VCARD]);
809 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
813 static inline int __msgsvc_vmsg_append_recipient_address_vcard(MSG_MESSAGE_INFO_S *pMsg, char **buf, int *buf_size, int len)
815 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[BEGIN_VCARD]);
816 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
817 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VERSION_VCARD]);
818 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
820 needCharset = true; /* as per android */
821 signed char folderId;
823 for (int i = 0; i < pMsg->nAddressCnt; ++i) {
824 char originAddress[MAX_ADDRESS_VAL_LEN + 1] = {0, };
825 bool isDisplayName = false;
827 folderId = (signed char)pMsg->folderId;
828 if (folderId == MSG_SENTBOX_ID) {
829 snprintf(originAddress, sizeof(originAddress), "%s", pMsg->addressList[0].addressVal);
832 if (strlen(originAddress) > 0) {
833 MSG_CONTACT_INFO_S contactInfo;
834 memset(&contactInfo, 0x00, sizeof(MSG_CONTACT_INFO_S));
836 if (MsgGetContactInfo(&(pMsg->addressList[i]), &contactInfo) != MSG_SUCCESS) {
837 MSG_WARN("MsgGetContactInfo() fail.");
839 snprintf(pMsg->addressList[i].displayName, sizeof(pMsg->addressList[i].displayName), "%s", contactInfo.firstName);
840 if (pMsg->addressList[i].displayName[0] != '\0')
841 isDisplayName = true;
842 if (needCharset && isDisplayName) {
843 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[FNAME_UTF8_VCARD]);
844 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, pMsg->addressList[i].displayName);
845 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
846 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[NAME_UTF8_VCARD]);
847 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, pMsg->addressList[i].displayName);
848 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
850 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[FNAME_VCARD]);
851 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, pMsg->addressList[i].displayName);
852 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
853 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[NAME_VCARD]);
854 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, pMsg->addressList[i].displayName);
855 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
857 if (MsgIsNumber(originAddress)) {
858 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[TEL_VCARD]);
859 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[TEL_VCARD_CELL]);
860 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, originAddress);
861 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
864 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[FNAME_VCARD]);
865 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
866 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[NAME_VCARD]);
867 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
871 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[END_VCARD]);
872 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
877 static inline int __msgsvc_vmsg_append_msg_body(MSG_MESSAGE_INFO_S *pMsg, char **buf, int *buf_size, int len)
879 struct tm display_time;
881 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[BEGIN_VENV]);
882 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
884 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[BEGIN_VBODY]);
885 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
888 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_BODY_PROPERTY_DATE]);
889 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_DATA_SEPARATOR]);
891 localtime_r(&(pMsg->displayTime), &display_time);
892 char *msgDate = __msgsvc_vmsg_convert_tm_to_vdata_str(&display_time);
893 if (msgDate !=NULL) {
894 MSGSVC_VMSG_APPEND_STR_FREE(buf, buf_size, len, msgDate);
896 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
900 if (pMsg->subject[0] != '\0') {
901 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_BODY_PROPERTY_SUBJECT]);
902 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_DATA_SEPARATOR]);
903 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, pMsg->subject);
904 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
908 if(pMsg->msgType.mainType == MSG_SMS_TYPE) {
909 if(pMsg->msgType.subType == MSG_NORMAL_SMS) {
910 if (pMsg->bTextSms == false) {
911 char* pFileData = NULL;
912 unique_ptr<char*, void(*)(char**)> buff(&pFileData, unique_ptr_deleter);
915 char* msgText = NULL;
917 if (MsgOpenAndReadFile(pMsg->msgData, &pFileData, &fileSize) == false)
920 msgText = (char *)calloc(1, fileSize);
921 memcpy(msgText, pFileData, fileSize);
922 MSGSVC_VMSG_APPEND_STR_FREE(buf, buf_size, len, msgText);
925 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, pMsg->msgText);
930 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
932 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[END_VBODY]);
933 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
935 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[END_VENV]);
936 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
940 static inline int __msgsvc_vmsg_append_msg_envelope(MSG_MESSAGE_INFO_S *pMsg, char **buf, int *buf_size, int len)
942 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[BEGIN_VENV]);
943 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
945 len = __msgsvc_vmsg_append_recipient_address_vcard(pMsg, buf, buf_size, len);
946 MSG_ERR_RET_VM(len < 0, len, "Invalid length : vcard");
948 len = __msgsvc_vmsg_append_msg_body(pMsg, buf, buf_size, len);
949 MSG_ERR_RET_VM(len < 0, len, "Invalid length : body");
951 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[END_VENV]);
952 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
956 static inline int __msgsvc_vmsg_append_msg(MSG_MESSAGE_INFO_S *pMsg, char **buf, int *buf_size, int len)
958 len = __msgsvc_vmsg_append_read_status(pMsg, buf, buf_size, len);
959 MSG_ERR_RET_VM(len < 0, len, "Invalid length : read status");
961 len = __msgsvc_vmsg_append_box_type(pMsg, buf, buf_size, len);
962 MSG_ERR_RET_VM(len < 0, len, "Invalid length : box type");
964 len = __msgsvc_vmsg_append_msg_type(pMsg, buf, buf_size, len);
965 MSG_ERR_RET_VM(len < 0, len, "Invalid length : msg type");
967 len = __msgsvc_vmsg_append_origin_address_vcard(pMsg, buf, buf_size, len);
968 MSG_ERR_RET_VM(len < 0, len, "Invalid length : origin address");
970 len = __msgsvc_vmsg_append_msg_envelope(pMsg, buf, buf_size, len);
971 MSG_ERR_RET_VM(len < 0, len, "Invalid length : envelop");
976 char *MsgVMessageEncode(MSG_MESSAGE_INFO_S *pMsg)
980 VObject* pObject = NULL;
981 VParam* param = NULL;
982 VTree * pBody = NULL;
983 VTree * pCard = NULL;
984 VTree * pCurrent = NULL;
985 struct tm display_time;
986 char* encoded_data = NULL;
988 VTree* pMessage = NULL;
991 if (pMsg->msgType.mainType == MSG_SMS_TYPE && pMsg->msgType.subType == MSG_NORMAL_SMS) {
992 return MsgVMessageEncodeSMS(pMsg);
996 if (pMessage == NULL) {
997 pMessage = (VTree *)malloc(sizeof(VTree));
1001 pMessage->treeType = VMESSAGE;
1002 pMessage->pTop = NULL;
1003 pMessage->pCur = NULL;
1004 pMessage->pNext = NULL;
1006 pCurrent = pMessage;
1008 /* Insert VObject (X-MESSAGE-TYPE) to VMessage tree */
1011 pObject->property = VMSG_TYPE_MSGTYPE;
1013 if (pMsg->msgType.mainType == MSG_MMS_TYPE && (pMsg->msgType.subType == MSG_SENDREQ_MMS || pMsg->msgType.subType == MSG_SENDCONF_MMS))
1014 pObject->pszValue[0] = strdup("MMS SEND");
1016 else if (pMsg->msgType.mainType == MSG_MMS_TYPE && pMsg->msgType.subType == MSG_NOTIFICATIONIND_MMS)
1017 pObject->pszValue[0] = strdup("MMS NOTIFICATION");
1020 else if (pMsg->msgType.mainType == MSG_MMS_TYPE && (pMsg->msgType.subType == MSG_RETRIEVE_AUTOCONF_MMS || pMsg->msgType.subType == MSG_RETRIEVE_MANUALCONF_MMS))
1021 pObject->pszValue[0] = strdup("MMS RETRIEVED");
1024 goto __CATCH_FAIL__;
1026 pObject->valueCount = 1;
1029 /* Insert VObject (X-IRMC-BOX) to VMessate tree */
1032 pObject->property = VMSG_TYPE_MSGBOX;
1034 switch(pMsg->folderId) {
1036 pObject->pszValue[0] = strdup("INBOX");
1039 pObject->pszValue[0] = strdup("OUTBOX");
1041 case MSG_SENTBOX_ID:
1042 pObject->pszValue[0] = strdup("SENTBOX");
1045 pObject->pszValue[0] = strdup("DRAFTBOX");
1048 /* Discard User Defined or Spam folder's messages. */
1049 goto __CATCH_FAIL__;
1051 pObject->valueCount = 1;
1054 /* Insert VObject (X-SS-DT) to VMessage tree */
1057 pObject->property = VMSG_TYPE_DATE;
1059 localtime_r(&(pMsg->displayTime), &display_time);
1060 pObject->pszValue[0] = _convert_tm_to_vdata_str(&display_time);
1061 pObject->valueCount = 1;
1064 /* Insert Vobject read status to VMessage tree */
1067 pObject->property = VMSG_TYPE_STATUS;
1070 pObject->pszValue[0] = strdup("READ");
1072 pObject->pszValue[0] = strdup("UNREAD");
1074 pObject->valueCount = 1;
1077 /* Insert VBody tree for message body; */
1078 pBody = (VTree*)calloc(1, sizeof(VTree));
1080 goto __CATCH_FAIL__;
1081 pBody->treeType = VBODY;
1084 pBody->pNext = NULL;
1085 pCurrent->pNext = pBody;
1088 if (strlen(pMsg->subject) > 0) {
1089 /* Insert Subject object */
1091 pObject->property = VMSG_TYPE_SUBJECT;
1092 pObject->pszValue[0] = strdup(pMsg->subject);
1093 pObject->valueCount = 1;
1095 /* Insert VBody object */
1097 pObject->property = VMSG_TYPE_BODY;
1099 if (pMsg->msgType.mainType == MSG_MMS_TYPE) {
1100 /* Insert VBody for mms raw data; */
1101 char* pFileData = NULL;
1102 unique_ptr<char*, void(*)(char**)> buf(&pFileData, unique_ptr_deleter);
1103 MMS_DATA_S *pMmsData = NULL;
1105 char* msgText = NULL;
1107 char filePath[MSG_FILEPATH_LEN_MAX] = {0, };
1108 if(pMsg->msgType.subType == MSG_NOTIFICATIONIND_MMS) {
1109 pFileData = MsgOpenAndReadMmsFile(pMsg->msgData, 0, -1, &fileSize);
1111 err = MsgStoGetMmsRawFilePath(pDbHandle, pMsg->msgId, filePath);
1113 if (err != MSG_SUCCESS)
1114 goto __CATCH_FAIL__;
1116 pFileData = MsgOpenAndReadMmsFile(filePath, 0, -1, &fileSize);
1120 if (pMsg->bTextSms == false) {
1121 if (MsgOpenAndReadFile(pMsg->msgData, &pFileData, &fileSize) == false) {
1122 goto __CATCH_FAIL__;
1125 fileSize = strlen(pMsg->msgData);
1126 pFileData = new char[fileSize+1];
1128 goto __CATCH_FAIL__;
1129 memset(pFileData, 0x00, fileSize+1);
1130 snprintf(pFileData, fileSize, "%s", pMsg->msgData);
1133 if (MsgDeserializeMmsData(pFileData, fileSize, &pMmsData) != 0) {
1134 MSG_DEBUG("Fail to Deserialize Message Data");
1135 MsgMmsRelease(&pMmsData);
1136 goto __CATCH_FAIL__;
1139 int serializedDataSize = 0;
1142 MsgMmsSetMultipartListData(pMmsData); /* app file -> data */
1143 serializedDataSize = MsgSerializeMms(pMmsData, &pFileData);
1147 fileSize = serializedDataSize;
1150 MsgMmsRelease(&pMmsData);
1153 MSG_DEBUG("FILE SIZE IS %d, %s", fileSize, pFileData);
1155 msgText = (char *)calloc(1, fileSize);
1156 if(pFileData && msgText)
1157 memcpy(msgText, pFileData, fileSize);
1159 pObject->numOfBiData = fileSize;
1160 pObject->pszValue[0] = msgText;
1161 pObject->valueCount = 1;
1164 delete [] pFileData;
1169 /* Insert parameter for base64 encoding */
1170 MSG_DEBUG("before to start INSERT_PARAM");
1172 pObject->pParam = param;
1173 param->parameter = VMSG_PARAM_ENCODING;
1174 param->paramValue = VMSG_ENC_PARAM_BASE64;
1176 /* Add VCard tree for recipient address information. */
1177 for (int i = 0; i < pMsg->nAddressCnt; ++i) {
1178 pCard = (VTree*)calloc(1, sizeof(VTree));
1180 goto __CATCH_FAIL__;
1182 pCard->treeType = VCARD;
1185 pCard->pNext = NULL;
1186 pCurrent->pNext = pCard;
1190 pObject->property = VCARD_TYPE_TEL;
1191 pObject->pszValue[0] = strdup(pMsg->addressList[i].addressVal);
1192 pObject->valueCount = 1;
1194 MSG_DEBUG("before to start vmsg_encode");
1195 encoded_data = vmsg_encode(pMessage);
1197 vmsg_free_vtree_memory(pMessage);
1199 return encoded_data;
1202 vmsg_free_vtree_memory(pMessage);
1207 char *MsgVMessageEncodeSMS(MSG_MESSAGE_INFO_S *pMsg)
1212 int buf_size = VMSG_INIT_LENGTH;
1215 __msgsvc_vmsg_initial();
1217 buf = (char *)calloc(1, buf_size);
1219 len = __msgsvc_vmsg_append_start_vmsg_1_1(&buf, &buf_size, len);
1225 len = __msgsvc_vmsg_append_msg(pMsg, &buf, &buf_size, len);
1231 len = __msgsvc_vmsg_append_end_vmsg(&buf, &buf_size, len);
1237 len = __msgsvc_vmsg_add_folding(&buf, &buf_size, len);
1246 bool __msgsvc_vmsg_convert_vdata_to_tm_str(const char* szText, struct tm * tm)
1251 char delims[] = ",";
1252 gchar **token = NULL;
1255 token = g_strsplit_set(szText, delims, -1);
1256 if (token && token[0]) {
1257 g_strstrip(token[0]);
1258 strptime(token[0], "%I:%M%p", tm);
1264 if (token && token[1]) {
1265 g_strstrip(token[1]);
1266 strptime(token[1], "%Y %b %e", &tmTemp);
1272 tm->tm_year = tmTemp.tm_year;
1273 tm->tm_mon = tmTemp.tm_mon;
1274 tm->tm_mday = tmTemp.tm_mday;
1282 static inline char* __msgsvc_vmsg_remove_empty_line(char *src)
1285 if ('\n' != *src && '\r' != *src)
1292 static char* __msgsvc_vmsg_check_word(char *src, const char *word)
1296 MSG_ERR_RET_VM(NULL == src, NULL, "The src is NULL.");
1298 src = __msgsvc_vmsg_remove_empty_line(src);
1314 while (*src == *word) {
1318 if ('\0' == *src || '\0' == *word)
1328 static inline int __msgsvc_vmsg_check_quoted(char *src, int max, int *quoted)
1331 if (TRUE == *quoted)
1334 while (*src && max) {
1336 ret = strncmp(src, "QUOTED-PRINTABLE", sizeof("QUOTED-PRINTABLE") - 1);
1341 } else if (':' == *src) {
1350 static inline int __msgsvc_vmsg_remove_folding(char *folded_src)
1352 char *result = folded_src;
1354 MSG_ERR_RET_VM(NULL == folded_src, MSG_ERR_INVALID_PARAMETER, " Invalid Parameter : __msgsvc_vmsg_remove_folding");
1356 while (*folded_src) {
1357 if ('\r' == *folded_src && '\n' == *(folded_src+1) && ' ' == *(folded_src+2))
1359 else if ('\n' == *folded_src && ' ' == *(folded_src+1))
1362 if ('\0' == *folded_src)
1365 *result = *folded_src;
1373 static inline int __msgsvc_vmsg_hex_to_dec(char hex)
1379 return hex - 'a' + 10;
1381 return hex - 'A' + 10;
1386 static inline int __msgsvc_vmsg_decode_quoted_val(char *val)
1391 src = strchr(val, ':');
1398 pre = __msgsvc_vmsg_hex_to_dec(*(src+1));
1400 *dest = (char)((pre << 4) + __msgsvc_vmsg_hex_to_dec(*(src+2)));
1404 if ('\r' == *(src+1) && '\n' == *(src+2))
1418 static inline char* __msgsvc_vmsg_translate_charset(char *src, int len)
1425 ret = strncmp(val, "CHARSET", sizeof("CHARSET") - 1);
1427 val += sizeof("CHARSET");
1430 } else if (':' == *val) {
1439 UErrorCode err = U_ZERO_ERROR;
1443 char enc[32] = {0}, *dest;
1445 while (';' != *val && ':' != *val && ',' != *val) {
1449 if (0 == strcasecmp("UTF-8", enc))
1455 src_len = len - (val - src);
1457 temp_size = (src_len+1) * sizeof(UChar);
1458 temp = (UChar *)malloc(temp_size);
1459 conv = ucnv_open(enc, &err);
1460 MSG_WARN_M(U_FAILURE(err), "ucnv_open() Failed(%d), enc=%s", err, enc);
1461 ucnv_toUChars(conv, temp, temp_size, val, src_len, &err);
1462 MSG_WARN_M(U_FAILURE(err), "ucnv_toUChars() Failed(%d), enc=%s", err, enc);
1465 dest_size = temp_size*2;
1466 dest = (char *)malloc(dest_size);
1467 conv = ucnv_open("UTF-8", &err);
1468 MSG_WARN_M(U_FAILURE(err), "ucnv_open() Failed(%d), enc=%s", err, enc);
1469 ucnv_fromUChars(conv, dest, dest_size, temp, u_strlen(temp), &err);
1470 MSG_WARN_M(U_FAILURE(err), "ucnv_fromUChars() Failed(%d), enc=%s", err, enc);
1479 static void __msgsvc_vmsg_get_prefix(char **prefix, char *src)
1481 char *temp = strchr(src, ':');
1483 long len = (long)temp - (long)src;
1484 *prefix = (char *)calloc(len+1, sizeof(char));
1486 snprintf(*prefix, len+1, "%s", src);
1495 static void __msgsvc_vmsg_remove_spec_out(char **prefix)
1509 static char* __msgsvc_vmsg_get_val(int ver, char *src, char **prefix, char **dest)
1515 MSG_ERR_RET_VM(NULL == src, NULL, "Invalid parameter : The src is NULL.");
1516 MSG_ERR_RET_VM(NULL == dest, NULL, "sInvalid parameter : The dest is NULL.");
1535 if (MSGSVC_VMSG_VER_1_1 == ver) {
1537 if ('=' == *cursor && __msgsvc_vmsg_check_quoted(src, cursor - src, "ed)) {
1538 if ('\r' == *(cursor+1) && '\n' == *(cursor+2))
1541 if ('\r' == *cursor && '\n' == *(cursor+1) && ' ' != *(cursor+2))
1543 if ('\n' == *cursor && ' ' != *(cursor+1))
1551 if ('\r' == *cursor && '\n' == *(cursor+1) && ' ' != *(cursor+2))
1554 if ('\n' == *cursor && ' ' != *(cursor+1))
1561 if (src == cursor) {
1566 char temp = *cursor;
1570 __msgsvc_vmsg_get_prefix(prefix, src);
1572 __msgsvc_vmsg_remove_spec_out(prefix);
1575 *dest = strdup(src);
1576 if (MSGSVC_VMSG_VER_1_1 != ver)
1577 __msgsvc_vmsg_remove_folding(*dest);
1579 if (__msgsvc_vmsg_check_quoted(*dest, -1, "ed))
1580 len = __msgsvc_vmsg_decode_quoted_val(*dest);
1582 len = strlen(*dest);
1583 new_dest = __msgsvc_vmsg_translate_charset(*dest, len);
1589 return (cursor + 1);
1593 static int __msgsvc_vmsg_check_content_type(char **vcard)
1597 for (i = VMSG_VALUE_NONE+1; i < VMSG_MAXIMUM_VALUE; i++) {
1598 new_start = __msgsvc_vmsg_check_word(*vcard, content_name[i]);
1599 if (new_start && (':' == *new_start || ';' == *new_start))
1603 if (VMSG_MAXIMUM_VALUE == i) {
1604 return VMSG_VALUE_NONE;
1611 static inline bool __msgsvc_vmsg_check_base64_encoded(char *src)
1618 ret = strncmp(tmp, "BASE64", sizeof("BASE64") - 1);
1621 } else if (':' == *tmp || '\r' == *tmp) {
1629 static char* __msgsvc_vmsg_decode_base64_val(char *val)
1632 guchar *decoded_str;
1636 src = strchr(val, ':');
1642 decoded_str = g_base64_decode(src, &size);
1644 dest = (char *)calloc((src-val)+size+1, sizeof(char));
1648 snprintf(dest, (src-val)+1, "%s", val);
1649 snprintf(dest+(src-val), size+1, "%s", decoded_str);
1650 g_free(decoded_str);
1655 static inline char* __msgsvc_vmsg_pass_unsupported(char *vmsg)
1666 static inline char* __msgsvc_vmsg_get_content_value(char *val)
1670 temp = strchr(val, ':');
1676 MSG_ERR_RET_VM('\0' == *(temp) || '\r' == *(temp) || '\n' == *(temp),
1677 NULL, "Invalid vcard content");
1682 static char* __msgsvc_vmsg_remove_escape_char(char *str)
1684 const char *s = SAFE_STR(str);
1685 char *r = (char *)s;
1687 if (*s == '\\' && *(s+1)) {
1688 char *n = (char*)(s+1);
1689 switch ((unsigned int)*n) {
1704 case 0xA1: /* en/em backslash */
1705 if (*(n+1) && 0xAC == *(n+1)) {
1712 case 0x81: /* en/em backslash */
1713 if (*(n+1) && 0x5F == *(n+1)) {
1736 static inline msg_error_t __msgsvc_vmsg_get_read_status(MSG_MESSAGE_INFO_S *pMsg, char *val)
1740 temp = __msgsvc_vmsg_get_content_value(val);
1741 MSG_ERR_RET_VM(NULL == temp, MSG_ERR_INVALID_PARAMETER, "Invalid parameter : read status");
1743 temp = __msgsvc_vmsg_remove_escape_char(temp);
1745 if (strcmp(temp, content_name[VMSG_INDICATION_READ_STATUS_READ]) == 0)
1747 else if (strcmp(temp, content_name[VMSG_INDICATION_READ_STATUS_UNREAD]) == 0)
1748 pMsg->bRead = false;
1750 return MSG_ERR_INVALID_PARAMETER;
1752 MSG_DEBUG("pMsg->bRead = %d", pMsg->bRead);
1756 static inline msg_error_t __msgsvc_vmsg_get_msg_box(MSG_MESSAGE_INFO_S *pMsg, char *val)
1760 temp = __msgsvc_vmsg_get_content_value(val);
1761 MSG_ERR_RET_VM(NULL == temp, MSG_ERR_INVALID_PARAMETER, "Invalid parameter : msg box");
1763 temp = __msgsvc_vmsg_remove_escape_char(temp);
1765 if (strcmp(temp, content_name[VMSG_INDICATION_MSG_BOX_DRAFT]) == 0) {
1766 pMsg->folderId = MSG_DRAFT_ID;
1767 pMsg->direction = MSG_DIRECTION_TYPE_MO;
1768 pMsg->networkStatus = MSG_NETWORK_NOT_SEND;
1769 } else if (strcmp(temp, content_name[VMSG_INDICATION_MSG_BOX_INBOX]) == 0) {
1770 pMsg->folderId = MSG_INBOX_ID;
1771 pMsg->direction = MSG_DIRECTION_TYPE_MT;
1772 pMsg->networkStatus = MSG_NETWORK_RECEIVED;
1773 } else if (strcmp(temp, content_name[VMSG_INDICATION_MSG_BOX_SENT]) == 0) {
1774 pMsg->folderId = MSG_SENTBOX_ID;
1775 pMsg->direction = MSG_DIRECTION_TYPE_MO;
1776 pMsg->networkStatus = MSG_NETWORK_SEND_SUCCESS;
1778 return MSG_ERR_INVALID_PARAMETER;
1781 MSG_DEBUG("pMsg->folderId = %d", pMsg->folderId);
1785 static inline msg_error_t __msgsvc_vmsg_get_msg_type(MSG_MESSAGE_INFO_S *pMsg, char *val)
1789 temp = __msgsvc_vmsg_get_content_value(val);
1790 MSG_ERR_RET_VM(NULL == temp, MSG_ERR_INVALID_PARAMETER, "Invalid parameter : msg type");
1792 temp = __msgsvc_vmsg_remove_escape_char(temp);
1794 if (strcmp(temp, content_name[VMSG_INDICATION_MESSAGE_TYPE_MSG]) == 0) {
1795 pMsg->msgType.mainType = MSG_SMS_TYPE;
1796 pMsg->msgType.subType = MSG_NORMAL_SMS;
1797 pMsg->msgType.classType = MSG_CLASS_NONE;
1798 } else if (strcmp(temp, content_name[VMSG_INDICATION_MESSAGE_TYPE_INET]) == 0) {
1801 return MSG_ERR_INVALID_PARAMETER;
1804 MSG_DEBUG("pMsg->msgType.subType = %d", pMsg->msgType.subType);
1808 static inline msg_error_t __msgsvc_vmsg_get_address(MSG_MESSAGE_INFO_S *pMsg, char *prefix, char *val, int* vCardCnt)
1811 MSG_DEBUG("vCardCnt is : %d", *vCardCnt);
1812 if ((pMsg->folderId == MSG_SENTBOX_ID || pMsg->folderId == MSG_DRAFT_ID) && *vCardCnt == 1)
1815 if (pMsg->folderId == MSG_INBOX_ID && *vCardCnt > 1)
1818 temp = __msgsvc_vmsg_get_content_value(val);
1819 MSG_ERR_RET_VM(NULL == temp, MSG_ERR_INVALID_PARAMETER, "Invalid parameter : address");
1821 temp = __msgsvc_vmsg_remove_escape_char(temp);
1822 MSG_ADDRESS_INFO_S * addrInfo = NULL;
1824 pMsg->nAddressCnt++;
1825 MSG_DEBUG("Address is : %s", temp);
1826 MSG_DEBUG("Address Cnt : %d", pMsg->nAddressCnt);
1829 if (pMsg->addressList == NULL) {
1830 addrInfo = (MSG_ADDRESS_INFO_S *)calloc(1, sizeof(MSG_ADDRESS_INFO_S));
1832 addrInfo = (MSG_ADDRESS_INFO_S *)realloc(pMsg->addressList, pMsg->nAddressCnt * sizeof(MSG_ADDRESS_INFO_S));
1835 if (addrInfo == NULL) {
1836 return MSG_ERR_INVALID_PARAMETER;
1838 pMsg->addressList = addrInfo;
1840 pMsg->addressList[pMsg->nAddressCnt-1].addressType = MSG_ADDRESS_TYPE_PLMN;
1841 pMsg->addressList[pMsg->nAddressCnt-1].recipientType = MSG_RECIPIENTS_TYPE_TO;
1842 strncpy(pMsg->addressList[pMsg->nAddressCnt-1].addressVal, temp, MAX_ADDRESS_VAL_LEN);
1843 MSG_DEBUG("pMsg->addressList[pMsg->nAddressCnt-1].addressVal = %s", pMsg->addressList[pMsg->nAddressCnt-1].addressVal);
1847 static inline msg_error_t __msgsvc_vmsg_get_msg_date(MSG_MESSAGE_INFO_S *pMsg, char *val)
1851 temp = __msgsvc_vmsg_get_content_value(val);
1852 MSG_ERR_RET_VM(NULL == temp, MSG_ERR_INVALID_PARAMETER, "Invalid parameter : date");
1854 temp = __msgsvc_vmsg_remove_escape_char(temp);
1855 MSG_DEBUG("pMsg->displayTime = %s", temp);
1856 struct tm displayTime;
1857 if ( __msgsvc_vmsg_convert_vdata_to_tm_str(temp, &displayTime))
1858 pMsg->displayTime = mktime(&displayTime);
1860 pMsg->displayTime = time(NULL);
1864 static inline msg_error_t __msgsvc_vmsg_get_msg_subject(MSG_MESSAGE_INFO_S *pMsg, char *val)
1868 temp = __msgsvc_vmsg_get_content_value(val);
1869 MSG_ERR_RET_VM(NULL == temp, MSG_ERR_INVALID_PARAMETER, "Invalid parameter : subject");
1871 temp = __msgsvc_vmsg_remove_escape_char(temp);
1873 if (temp && temp[0] != '\0')
1874 strncpy(pMsg->subject, temp, MAX_SUBJECT_LEN);
1875 MSG_DEBUG("pMsg->subject = %s", pMsg->subject);
1879 static inline bool __msgsvc_vmsg_get_msg_begin(MSG_MESSAGE_INFO_S *pMsg, char *val, int *vCardCnt)
1881 pMsg->encodeType = MSG_ENCODE_AUTO;
1885 temp = __msgsvc_vmsg_get_content_value(val);
1886 MSG_ERR_RET_VM(NULL == temp, MSG_ERR_INVALID_PARAMETER, "Invalid parameter : body");
1888 temp = __msgsvc_vmsg_remove_escape_char(temp);
1890 if (temp && temp[0] != '\0' && strcmp(temp, "VCARD") == 0) {
1897 static inline bool __msgsvc_vmsg_get_msg_end(MSG_MESSAGE_INFO_S *pMsg, char *val)
1899 pMsg->encodeType = MSG_ENCODE_AUTO;
1903 temp = __msgsvc_vmsg_get_content_value(val);
1904 MSG_ERR_RET_VM(NULL == temp, MSG_ERR_INVALID_PARAMETER, "Invalid parameter : body");
1906 temp = __msgsvc_vmsg_remove_escape_char(temp);
1908 if (temp && temp[0] != '\0' && strcmp(temp, "VMSG") == 0) {
1909 MSG_DEBUG("VMessage decoding completed");
1911 } else if (temp && temp[0] != '\0' && strcmp(temp, "VCARD") == 0) {
1912 MSG_DEBUG("VMessage decoding completed");
1918 static inline msg_error_t __msgsvc_vmsg_get_msg(int ver, char *vmsg, MSG_MESSAGE_INFO_S *record)
1921 char *cursor, *new_start, *val, *prefix;
1923 MSG_MESSAGE_INFO_S *pMsg = record;
1925 bool isDateAvailable = false;
1934 bool base64_encoded = false;
1935 char *bodyStart = cursor;
1936 type = __msgsvc_vmsg_check_content_type(&cursor);
1938 if (VMSG_VALUE_NONE == type) {
1939 if (isDateAvailable == true) {
1940 isDateAvailable = false;
1942 MSG_DEBUG("Decoding body :");
1943 bodyStart = __msgsvc_vmsg_pass_unsupported(bodyStart);
1945 char tempMsgText[MAX_MSG_TEXT_LEN + 1] = {0, };
1947 if (i >= MAX_MSG_TEXT_LEN)
1949 if (*bodyStart == 'E' && *(bodyStart+1) == 'N' && *(bodyStart+2) == 'D' && *(bodyStart+3) == ':') {
1953 tempMsgText[i] = *bodyStart;
1957 tempMsgText[i] = '\0';
1958 char * temp = __msgsvc_vmsg_remove_escape_char(tempMsgText);
1959 snprintf(pMsg->msgText, sizeof(pMsg->msgText), "%s", temp);
1960 MSG_DEBUG("pMsg->msgText : %s", pMsg->msgText);
1961 pMsg->dataSize = strlen(pMsg->msgText);
1962 pMsg->bTextSms = true;
1963 base64_encoded = __msgsvc_vmsg_check_base64_encoded(pMsg->msgText);
1965 if (base64_encoded) {
1966 char * decodedText = NULL;
1967 decodedText = __msgsvc_vmsg_decode_base64_val(pMsg->msgText);
1969 strncpy(pMsg->msgText, decodedText, MAX_MSG_TEXT_LEN);
1970 pMsg->dataSize = strlen(pMsg->msgText);
1973 pMsg->msgText[0] = '\0';
1981 new_start = __msgsvc_vmsg_pass_unsupported(cursor);
1991 base64_encoded = __msgsvc_vmsg_check_base64_encoded(cursor);
1993 new_start = __msgsvc_vmsg_get_val(ver, cursor, &prefix, &val);
1995 if (NULL == new_start) {
2008 if (base64_encoded) {
2009 char *temp = __msgsvc_vmsg_decode_base64_val(val);
2014 case VMSG_INDICATION_READ_STATUS:
2015 __msgsvc_vmsg_get_read_status(pMsg, val);
2017 case VMSG_INDICATION_MSG_BOX:
2018 __msgsvc_vmsg_get_msg_box(pMsg, val);
2020 case VMSG_INDICATION_MESSAGE_TYPE:
2021 __msgsvc_vmsg_get_msg_type(pMsg, val);
2023 case VMSG_VCARD_TEL:
2024 __msgsvc_vmsg_get_address(pMsg, prefix, val, &vCardCnt);
2026 case VMSG_BODY_PROPERTY_DATE:
2027 isDateAvailable = true;
2028 __msgsvc_vmsg_get_msg_date(pMsg, val);
2030 case VMSG_BODY_PROPERTY_SUBJECT:
2031 __msgsvc_vmsg_get_msg_subject(pMsg, val);
2033 case VMSG_MSG_BEGIN:
2034 end = __msgsvc_vmsg_get_msg_begin(pMsg, val, &vCardCnt);
2037 end = __msgsvc_vmsg_get_msg_end(pMsg, val);
2046 MSG_ERR("Invalid parameter : __msgsvc_vmsg_check_content_type() Failed(%d)", type);
2049 return MSG_ERR_INVALID_PARAMETER;
2056 MSG_ERR("Invalid vmsg");
2057 return MSG_ERR_INVALID_PARAMETER;
2060 msg_error_t MsgVMessageDecodeSMS(const char *vmsg_stream, MSG_MESSAGE_INFO_S *pMsg)
2066 char *vmsg = (char *)vmsg_stream;
2068 char *MMSsend, *MMSretrieve, *MMSnoti;
2070 MSG_ERR_RET_VM(NULL == vmsg_stream, MSG_ERR_INVALID_PARAMETER, "Invalid Parameter : vmsg");
2072 vmsg = __msgsvc_vmsg_check_word(vmsg, "BEGIN:VMSG");
2073 MSG_ERR_RET_VM(NULL == vmsg, MSG_ERR_INVALID_PARAMETER, "Invalid parameter : The vmsg is invalid.");
2075 /* check for mms() */
2080 MMSsend = __msgsvc_vmsg_check_word(MMSsend, "X-MESSAGE-TYPE:MMS SEND");
2081 MSG_ERR_RET_VM(NULL != MMSsend, MSG_ERR_INVALID_MESSAGE, "Invalid parameter : The vmsg format is invalid.");
2083 MMSretrieve = __msgsvc_vmsg_check_word(MMSretrieve, "X-MESSAGE-TYPE:MMS RETRIEVE");
2084 MSG_ERR_RET_VM(NULL != MMSretrieve, MSG_ERR_INVALID_MESSAGE, "Invalid parameter : The vmsg format is invalid.");
2086 MMSnoti = __msgsvc_vmsg_check_word(MMSnoti, "X-MESSAGE-TYPE:MMS NOTIFICATION");
2087 MSG_ERR_RET_VM(NULL != MMSnoti, MSG_ERR_INVALID_MESSAGE, "Invalid parameter : The vmsg format is invalid.");
2090 __msgsvc_vmsg_initial();
2092 vmsg = __msgsvc_vmsg_check_word(vmsg, "VERSION:1.1");
2093 MSG_ERR_RET_VM(NULL == vmsg, MSG_ERR_INVALID_PARAMETER, "Invalid parameter : The vmsg format is invalid.");
2095 ver = MSGSVC_VMSG_VER_1_1;
2097 ret = __msgsvc_vmsg_get_msg(ver, vmsg, pMsg);
2098 if (MSG_SUCCESS!= ret) {