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 int wrn = snprintf(str, 17, "%04d%02d%02dT%02d%02d%02dZ",
472 MSG_DEBUG("snprintf was failed ");
477 bool _convert_vdata_str_to_tm(const char* szText, struct tm * tm)
479 if (szText == NULL) return false;
480 if (strlen(szText) < 15) return false;
481 if (szText[8] != 'T') return false;
484 memset(tm, 0, sizeof(struct tm));
486 /* year, month, day */
487 memcpy(szBuff, &(szText[0]), 4);
489 tm->tm_year = atol(szBuff) - 1900;
490 if ((tm->tm_year > 137) || (tm->tm_year < 0))
493 memcpy(szBuff, &(szText[4]), 2);
495 tm->tm_mon = atol(szBuff)-1;
496 if ((tm->tm_mon > 11) || (tm->tm_mon < 0))
499 memcpy(szBuff, &(szText[6]), 2);
501 tm->tm_mday = atol(szBuff);
502 if ((tm->tm_mday > 31) || (tm->tm_mday < 1))
505 /* hour, minute, second */
506 memcpy(szBuff, &(szText[9]), 2);
508 tm->tm_hour = atol(szBuff);
509 if ((tm->tm_hour > 23) || (tm->tm_hour < 0))
512 memcpy(szBuff, &(szText[11]), 2);
514 tm->tm_min = atol(szBuff);
515 if ((tm->tm_min > 59) || (tm->tm_min < 0))
518 memcpy(szBuff, &(szText[13]), 2);
520 tm->tm_sec = atol(szBuff);
521 if ((tm->tm_sec > 59) || (tm->tm_sec < 0))
527 int msgsvc_check_utf8(char c)
529 if ((c & 0xff) < (128 & 0xff))
531 else if ((c & (char)0xe0) == (char)0xc0)
533 else if ((c & (char)0xf0) == (char)0xe0)
535 else if ((c & (char)0xf8) == (char)0xf0)
537 else if ((c & (char)0xfc) == (char)0xf8)
539 else if ((c & (char)0xfe) == (char)0xfc)
542 return MSG_ERR_INVALID_PARAMETER;
545 char* __msgsvc_vmsg_convert_tm_to_vdata_str(struct tm * tm)
547 char str[22] = {0, };
549 char month[15] = {0, };
552 mon = tm->tm_mon + 1;
555 if (tm->tm_hour >= 12)
556 strncpy(APM, "PM", 3);
558 strncpy(APM, "AM", 3);
560 if (tm->tm_hour > 12)
561 hour = tm->tm_hour - 12;
567 strncpy(month, "Jan", 4);
570 strncpy(month, "Feb", 4);
573 strncpy(month, "Mar", 4);
576 strncpy(month, "Apr", 4);
579 strncpy(month, "May", 4);
582 strncpy(month, "Jun", 4);
585 strncpy(month, "Jul", 4);
588 strncpy(month, "Aug", 4);
591 strncpy(month, "Sep", 4);
594 strncpy(month, "Oct", 4);
597 strncpy(month, "Nov", 4);
600 strncpy(month, "Dec", 4);
603 MSG_DEBUG("invalid month number");
607 wrn = snprintf(str, 22, "%d:%02d%s, %04d %s %d",
615 MSG_DEBUG("snprintf was failed ");
619 static inline int __msgsvc_vmsg_add_folding(char **buf, int *buf_size, int buf_len)
622 char *buf_copy = NULL;
626 bool content_start = false;
627 bool encode_64 = false;
629 buf_copy = (char *)calloc(1, *buf_size);
631 if (buf_copy == NULL)
636 len = result_len = 0;
639 if (*buf_size < result_len + 5) {
641 *buf_size = *buf_size + 1000;
642 if (NULL == (tmp = (char *)realloc(buf_copy, *buf_size))) {
647 r = (buf_copy + result_len);
651 if (false == content_start) {
653 content_start = true;
654 else if (0 == strncmp(s, "ENCODING=BASE64", strlen("ENCODING=BASE64")))
660 } else if ('\n' == *s) {
663 content_start = false;
668 if (false == encode_64)
669 char_len = msgsvc_check_utf8(*s);
671 if (MSGSVC_VMSG_FOLDING_LIMIT <= len + char_len) {
698 static inline int __msgsvc_vmsg_append_start_vmsg_1_1(char **buf, int *buf_size, int len)
700 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[BEGIN_VMSG]);
701 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
702 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VERSION_VMSG]);
703 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
707 static inline int __msgsvc_vmsg_append_end_vmsg(char **buf, int *buf_size, int len)
709 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[END_VMSG]);
710 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
714 static inline int __msgsvc_vmsg_append_read_status(MSG_MESSAGE_INFO_S *pMsg, char **buf, int *buf_size, int len)
716 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_INDICATION_READ_STATUS]);
717 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_DATA_SEPARATOR]);
719 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_INDICATION_READ_STATUS_READ]);
720 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
722 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_INDICATION_READ_STATUS_UNREAD]);
723 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
727 static inline int __msgsvc_vmsg_append_box_type(MSG_MESSAGE_INFO_S *pMsg, char **buf, int *buf_size, int len)
729 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_INDICATION_MSG_BOX]);
730 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_DATA_SEPARATOR]);
731 switch(pMsg->folderId) {
733 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_INDICATION_MSG_BOX_INBOX]);
737 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_INDICATION_MSG_BOX_SENT]);
741 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_INDICATION_MSG_BOX_DRAFT]);
744 /* Discard User Defined, outbox or Spam folder's messages. */
745 MSG_DEBUG("Invalid or unhandled msg box");
747 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
751 static inline int __msgsvc_vmsg_append_msg_type(MSG_MESSAGE_INFO_S *pMsg, char **buf, int *buf_size, int len)
753 /* TO DO check with msg text contains Only PrintableAscii if true then else handle INET_TYPE */
754 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_INDICATION_MESSAGE_TYPE]);
755 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_DATA_SEPARATOR]);
756 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_INDICATION_MESSAGE_TYPE_MSG]);
757 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
761 static inline int __msgsvc_vmsg_append_origin_address_vcard(MSG_MESSAGE_INFO_S *pMsg, char **buf, int *buf_size, int len)
763 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[BEGIN_VCARD]);
764 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
765 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VERSION_VCARD]);
766 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
767 char originAddress[MAX_ADDRESS_VAL_LEN + 1] = {0, };
768 bool isDisplayName = false;
770 signed char folderId = (signed char)pMsg->folderId;
771 if (folderId == (signed char)MSG_INBOX_ID) {
772 snprintf(originAddress, sizeof(originAddress), "%s", pMsg->addressList[0].addressVal);
775 needCharset = true; /* as per android */
777 if (strlen(originAddress) > 0) {
778 MSG_CONTACT_INFO_S contactInfo;
779 memset(&contactInfo, 0x00, sizeof(MSG_CONTACT_INFO_S));
781 if (MsgGetContactInfo(&(pMsg->addressList[0]), &contactInfo) != MSG_SUCCESS) {
782 MSG_WARN("MsgGetContactInfo() fail.");
784 snprintf(pMsg->addressList[0].displayName, sizeof(pMsg->addressList[0].displayName), "%s", contactInfo.firstName);
785 if (pMsg->addressList[0].displayName[0] != '\0')
786 isDisplayName = true;
787 if (needCharset && isDisplayName) {
788 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[FNAME_UTF8_VCARD]);
789 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, pMsg->addressList->displayName);
790 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
791 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[NAME_UTF8_VCARD]);
792 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, pMsg->addressList->displayName);
793 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
795 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[FNAME_VCARD]);
796 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, pMsg->addressList->displayName);
797 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
798 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[NAME_VCARD]);
799 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, pMsg->addressList->displayName);
800 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
802 if (MsgIsNumber(originAddress)) {
803 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[TEL_VCARD]);
804 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[TEL_VCARD_CELL]);
805 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, originAddress);
806 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
809 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[FNAME_VCARD]);
810 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
811 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[NAME_VCARD]);
812 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
816 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[END_VCARD]);
817 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
821 static inline int __msgsvc_vmsg_append_recipient_address_vcard(MSG_MESSAGE_INFO_S *pMsg, char **buf, int *buf_size, int len)
823 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[BEGIN_VCARD]);
824 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
825 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VERSION_VCARD]);
826 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
828 needCharset = true; /* as per android */
829 signed char folderId;
831 for (int i = 0; i < pMsg->nAddressCnt; ++i) {
832 char originAddress[MAX_ADDRESS_VAL_LEN + 1] = {0, };
833 bool isDisplayName = false;
835 folderId = (signed char)pMsg->folderId;
836 if (folderId == MSG_SENTBOX_ID) {
837 snprintf(originAddress, sizeof(originAddress), "%s", pMsg->addressList[0].addressVal);
840 if (strlen(originAddress) > 0) {
841 MSG_CONTACT_INFO_S contactInfo;
842 memset(&contactInfo, 0x00, sizeof(MSG_CONTACT_INFO_S));
844 if (MsgGetContactInfo(&(pMsg->addressList[i]), &contactInfo) != MSG_SUCCESS) {
845 MSG_WARN("MsgGetContactInfo() fail.");
847 snprintf(pMsg->addressList[i].displayName, sizeof(pMsg->addressList[i].displayName), "%s", contactInfo.firstName);
848 if (pMsg->addressList[i].displayName[0] != '\0')
849 isDisplayName = true;
850 if (needCharset && isDisplayName) {
851 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[FNAME_UTF8_VCARD]);
852 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, pMsg->addressList[i].displayName);
853 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
854 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[NAME_UTF8_VCARD]);
855 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, pMsg->addressList[i].displayName);
856 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
858 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[FNAME_VCARD]);
859 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, pMsg->addressList[i].displayName);
860 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
861 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[NAME_VCARD]);
862 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, pMsg->addressList[i].displayName);
863 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
865 if (MsgIsNumber(originAddress)) {
866 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[TEL_VCARD]);
867 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[TEL_VCARD_CELL]);
868 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, originAddress);
869 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
872 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[FNAME_VCARD]);
873 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
874 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[NAME_VCARD]);
875 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
879 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[END_VCARD]);
880 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
885 static inline int __msgsvc_vmsg_append_msg_body(MSG_MESSAGE_INFO_S *pMsg, char **buf, int *buf_size, int len)
887 struct tm display_time;
889 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[BEGIN_VENV]);
890 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
892 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[BEGIN_VBODY]);
893 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
896 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_BODY_PROPERTY_DATE]);
897 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_DATA_SEPARATOR]);
899 localtime_r(&(pMsg->displayTime), &display_time);
900 char *msgDate = __msgsvc_vmsg_convert_tm_to_vdata_str(&display_time);
901 if (msgDate !=NULL) {
902 MSGSVC_VMSG_APPEND_STR_FREE(buf, buf_size, len, msgDate);
904 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
908 if (pMsg->subject[0] != '\0') {
909 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_BODY_PROPERTY_SUBJECT]);
910 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_DATA_SEPARATOR]);
911 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, pMsg->subject);
912 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
916 if(pMsg->msgType.mainType == MSG_SMS_TYPE) {
917 if(pMsg->msgType.subType == MSG_NORMAL_SMS) {
918 if (pMsg->bTextSms == false) {
919 char* pFileData = NULL;
920 unique_ptr<char*, void(*)(char**)> buff(&pFileData, unique_ptr_deleter);
923 char* msgText = NULL;
925 if (MsgOpenAndReadFile(pMsg->msgData, &pFileData, &fileSize) == false)
928 msgText = (char *)calloc(1, fileSize);
929 memcpy(msgText, pFileData, fileSize);
930 MSGSVC_VMSG_APPEND_STR_FREE(buf, buf_size, len, msgText);
933 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, pMsg->msgText);
938 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
940 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[END_VBODY]);
941 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
943 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[END_VENV]);
944 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
948 static inline int __msgsvc_vmsg_append_msg_envelope(MSG_MESSAGE_INFO_S *pMsg, char **buf, int *buf_size, int len)
950 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[BEGIN_VENV]);
951 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
953 len = __msgsvc_vmsg_append_recipient_address_vcard(pMsg, buf, buf_size, len);
954 MSG_ERR_RET_VM(len < 0, len, "Invalid length : vcard");
956 len = __msgsvc_vmsg_append_msg_body(pMsg, buf, buf_size, len);
957 MSG_ERR_RET_VM(len < 0, len, "Invalid length : body");
959 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[END_VENV]);
960 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
964 static inline int __msgsvc_vmsg_append_msg(MSG_MESSAGE_INFO_S *pMsg, char **buf, int *buf_size, int len)
966 len = __msgsvc_vmsg_append_read_status(pMsg, buf, buf_size, len);
967 MSG_ERR_RET_VM(len < 0, len, "Invalid length : read status");
969 len = __msgsvc_vmsg_append_box_type(pMsg, buf, buf_size, len);
970 MSG_ERR_RET_VM(len < 0, len, "Invalid length : box type");
972 len = __msgsvc_vmsg_append_msg_type(pMsg, buf, buf_size, len);
973 MSG_ERR_RET_VM(len < 0, len, "Invalid length : msg type");
975 len = __msgsvc_vmsg_append_origin_address_vcard(pMsg, buf, buf_size, len);
976 MSG_ERR_RET_VM(len < 0, len, "Invalid length : origin address");
978 len = __msgsvc_vmsg_append_msg_envelope(pMsg, buf, buf_size, len);
979 MSG_ERR_RET_VM(len < 0, len, "Invalid length : envelop");
984 char *MsgVMessageEncode(MSG_MESSAGE_INFO_S *pMsg)
988 VObject* pObject = NULL;
989 VParam* param = NULL;
990 VTree * pBody = NULL;
991 VTree * pCard = NULL;
992 VTree * pCurrent = NULL;
993 struct tm display_time;
994 char* encoded_data = NULL;
996 VTree* pMessage = NULL;
999 if (pMsg->msgType.mainType == MSG_SMS_TYPE && pMsg->msgType.subType == MSG_NORMAL_SMS) {
1000 return MsgVMessageEncodeSMS(pMsg);
1004 if (pMessage == NULL) {
1005 pMessage = (VTree *)malloc(sizeof(VTree));
1009 pMessage->treeType = VMESSAGE;
1010 pMessage->pTop = NULL;
1011 pMessage->pCur = NULL;
1012 pMessage->pNext = NULL;
1014 pCurrent = pMessage;
1016 /* Insert VObject (X-MESSAGE-TYPE) to VMessage tree */
1019 pObject->property = VMSG_TYPE_MSGTYPE;
1021 if (pMsg->msgType.mainType == MSG_MMS_TYPE && (pMsg->msgType.subType == MSG_SENDREQ_MMS || pMsg->msgType.subType == MSG_SENDCONF_MMS))
1022 pObject->pszValue[0] = strdup("MMS SEND");
1024 else if (pMsg->msgType.mainType == MSG_MMS_TYPE && pMsg->msgType.subType == MSG_NOTIFICATIONIND_MMS)
1025 pObject->pszValue[0] = strdup("MMS NOTIFICATION");
1028 else if (pMsg->msgType.mainType == MSG_MMS_TYPE && (pMsg->msgType.subType == MSG_RETRIEVE_AUTOCONF_MMS || pMsg->msgType.subType == MSG_RETRIEVE_MANUALCONF_MMS))
1029 pObject->pszValue[0] = strdup("MMS RETRIEVED");
1032 goto __CATCH_FAIL__;
1034 pObject->valueCount = 1;
1037 /* Insert VObject (X-IRMC-BOX) to VMessate tree */
1040 pObject->property = VMSG_TYPE_MSGBOX;
1042 switch(pMsg->folderId) {
1044 pObject->pszValue[0] = strdup("INBOX");
1047 pObject->pszValue[0] = strdup("OUTBOX");
1049 case MSG_SENTBOX_ID:
1050 pObject->pszValue[0] = strdup("SENTBOX");
1053 pObject->pszValue[0] = strdup("DRAFTBOX");
1056 /* Discard User Defined or Spam folder's messages. */
1057 goto __CATCH_FAIL__;
1059 pObject->valueCount = 1;
1062 /* Insert VObject (X-SS-DT) to VMessage tree */
1065 pObject->property = VMSG_TYPE_DATE;
1067 localtime_r(&(pMsg->displayTime), &display_time);
1068 pObject->pszValue[0] = _convert_tm_to_vdata_str(&display_time);
1069 pObject->valueCount = 1;
1072 /* Insert Vobject read status to VMessage tree */
1075 pObject->property = VMSG_TYPE_STATUS;
1078 pObject->pszValue[0] = strdup("READ");
1080 pObject->pszValue[0] = strdup("UNREAD");
1082 pObject->valueCount = 1;
1085 /* Insert VBody tree for message body; */
1086 pBody = (VTree*)calloc(1, sizeof(VTree));
1088 goto __CATCH_FAIL__;
1089 pBody->treeType = VBODY;
1092 pBody->pNext = NULL;
1093 pCurrent->pNext = pBody;
1096 if (strlen(pMsg->subject) > 0) {
1097 /* Insert Subject object */
1099 pObject->property = VMSG_TYPE_SUBJECT;
1100 pObject->pszValue[0] = strdup(pMsg->subject);
1101 pObject->valueCount = 1;
1103 /* Insert VBody object */
1105 pObject->property = VMSG_TYPE_BODY;
1107 if (pMsg->msgType.mainType == MSG_MMS_TYPE) {
1108 /* Insert VBody for mms raw data; */
1109 char* pFileData = NULL;
1110 unique_ptr<char*, void(*)(char**)> buf(&pFileData, unique_ptr_deleter);
1111 MMS_DATA_S *pMmsData = NULL;
1113 char* msgText = NULL;
1115 char filePath[MSG_FILEPATH_LEN_MAX] = {0, };
1116 if(pMsg->msgType.subType == MSG_NOTIFICATIONIND_MMS) {
1117 pFileData = MsgOpenAndReadMmsFile(pMsg->msgData, 0, -1, &fileSize);
1119 err = MsgStoGetMmsRawFilePath(pDbHandle, pMsg->msgId, filePath);
1121 if (err != MSG_SUCCESS)
1122 goto __CATCH_FAIL__;
1124 pFileData = MsgOpenAndReadMmsFile(filePath, 0, -1, &fileSize);
1128 if (pMsg->bTextSms == false) {
1129 if (MsgOpenAndReadFile(pMsg->msgData, &pFileData, &fileSize) == false) {
1130 goto __CATCH_FAIL__;
1133 fileSize = strlen(pMsg->msgData);
1134 pFileData = new char[fileSize+1];
1136 goto __CATCH_FAIL__;
1137 memset(pFileData, 0x00, fileSize+1);
1138 snprintf(pFileData, fileSize, "%s", pMsg->msgData);
1141 if (MsgDeserializeMmsData(pFileData, fileSize, &pMmsData) != 0) {
1142 MSG_DEBUG("Fail to Deserialize Message Data");
1143 MsgMmsRelease(&pMmsData);
1144 goto __CATCH_FAIL__;
1147 int serializedDataSize = 0;
1150 MsgMmsSetMultipartListData(pMmsData); /* app file -> data */
1151 serializedDataSize = MsgSerializeMms(pMmsData, &pFileData);
1155 fileSize = serializedDataSize;
1158 MsgMmsRelease(&pMmsData);
1161 MSG_DEBUG("FILE SIZE IS %d, %s", fileSize, pFileData);
1163 msgText = (char *)calloc(1, fileSize);
1164 if(pFileData && msgText)
1165 memcpy(msgText, pFileData, fileSize);
1167 pObject->numOfBiData = fileSize;
1168 pObject->pszValue[0] = msgText;
1169 pObject->valueCount = 1;
1172 delete [] pFileData;
1177 /* Insert parameter for base64 encoding */
1178 MSG_DEBUG("before to start INSERT_PARAM");
1180 pObject->pParam = param;
1181 param->parameter = VMSG_PARAM_ENCODING;
1182 param->paramValue = VMSG_ENC_PARAM_BASE64;
1184 /* Add VCard tree for recipient address information. */
1185 for (int i = 0; i < pMsg->nAddressCnt; ++i) {
1186 pCard = (VTree*)calloc(1, sizeof(VTree));
1188 goto __CATCH_FAIL__;
1190 pCard->treeType = VCARD;
1193 pCard->pNext = NULL;
1194 pCurrent->pNext = pCard;
1198 pObject->property = VCARD_TYPE_TEL;
1199 pObject->pszValue[0] = strdup(pMsg->addressList[i].addressVal);
1200 pObject->valueCount = 1;
1202 MSG_DEBUG("before to start vmsg_encode");
1203 encoded_data = vmsg_encode(pMessage);
1205 vmsg_free_vtree_memory(pMessage);
1207 return encoded_data;
1210 vmsg_free_vtree_memory(pMessage);
1215 char *MsgVMessageEncodeSMS(MSG_MESSAGE_INFO_S *pMsg)
1220 int buf_size = VMSG_INIT_LENGTH;
1223 __msgsvc_vmsg_initial();
1225 buf = (char *)calloc(1, buf_size);
1227 len = __msgsvc_vmsg_append_start_vmsg_1_1(&buf, &buf_size, len);
1233 len = __msgsvc_vmsg_append_msg(pMsg, &buf, &buf_size, len);
1239 len = __msgsvc_vmsg_append_end_vmsg(&buf, &buf_size, len);
1245 len = __msgsvc_vmsg_add_folding(&buf, &buf_size, len);
1254 bool __msgsvc_vmsg_convert_vdata_to_tm_str(const char* szText, struct tm * tm)
1259 char delims[] = ",";
1260 gchar **token = NULL;
1263 token = g_strsplit_set(szText, delims, -1);
1264 if (token && token[0]) {
1265 g_strstrip(token[0]);
1266 strptime(token[0], "%I:%M%p", tm);
1272 if (token && token[1]) {
1273 g_strstrip(token[1]);
1274 strptime(token[1], "%Y %b %e", &tmTemp);
1280 tm->tm_year = tmTemp.tm_year;
1281 tm->tm_mon = tmTemp.tm_mon;
1282 tm->tm_mday = tmTemp.tm_mday;
1290 static inline char* __msgsvc_vmsg_remove_empty_line(char *src)
1293 if ('\n' != *src && '\r' != *src)
1300 static char* __msgsvc_vmsg_check_word(char *src, const char *word)
1304 MSG_ERR_RET_VM(NULL == src, NULL, "The src is NULL.");
1306 src = __msgsvc_vmsg_remove_empty_line(src);
1322 while (*src == *word) {
1326 if ('\0' == *src || '\0' == *word)
1336 static inline int __msgsvc_vmsg_check_quoted(char *src, int max, int *quoted)
1339 if (TRUE == *quoted)
1342 while (*src && max) {
1344 ret = strncmp(src, "QUOTED-PRINTABLE", sizeof("QUOTED-PRINTABLE") - 1);
1349 } else if (':' == *src) {
1358 static inline int __msgsvc_vmsg_remove_folding(char *folded_src)
1360 char *result = folded_src;
1362 MSG_ERR_RET_VM(NULL == folded_src, MSG_ERR_INVALID_PARAMETER, " Invalid Parameter : __msgsvc_vmsg_remove_folding");
1364 while (*folded_src) {
1365 if ('\r' == *folded_src && '\n' == *(folded_src+1) && ' ' == *(folded_src+2))
1367 else if ('\n' == *folded_src && ' ' == *(folded_src+1))
1370 if ('\0' == *folded_src)
1373 *result = *folded_src;
1381 static inline int __msgsvc_vmsg_hex_to_dec(char hex)
1387 return hex - 'a' + 10;
1389 return hex - 'A' + 10;
1394 static inline int __msgsvc_vmsg_decode_quoted_val(char *val)
1399 src = strchr(val, ':');
1406 pre = __msgsvc_vmsg_hex_to_dec(*(src+1));
1408 *dest = (char)((pre << 4) + __msgsvc_vmsg_hex_to_dec(*(src+2)));
1412 if ('\r' == *(src+1) && '\n' == *(src+2))
1426 static inline char* __msgsvc_vmsg_translate_charset(char *src, int len)
1433 ret = strncmp(val, "CHARSET", sizeof("CHARSET") - 1);
1435 val += sizeof("CHARSET");
1438 } else if (':' == *val) {
1447 UErrorCode err = U_ZERO_ERROR;
1451 char enc[32] = {0}, *dest;
1453 while (';' != *val && ':' != *val && ',' != *val) {
1457 if (0 == strcasecmp("UTF-8", enc))
1463 src_len = len - (val - src);
1465 temp_size = (src_len+1) * sizeof(UChar);
1466 temp = (UChar *)malloc(temp_size);
1468 MSG_DEBUG("malloc() failed");
1471 conv = ucnv_open(enc, &err);
1472 MSG_WARN_M(U_FAILURE(err), "ucnv_open() Failed(%d), enc=%s", err, enc);
1473 ucnv_toUChars(conv, temp, temp_size, val, src_len, &err);
1474 MSG_WARN_M(U_FAILURE(err), "ucnv_toUChars() Failed(%d), enc=%s", err, enc);
1477 dest_size = temp_size*2;
1478 dest = (char *)malloc(dest_size);
1480 MSG_DEBUG("malloc() failed");
1483 conv = ucnv_open("UTF-8", &err);
1484 MSG_WARN_M(U_FAILURE(err), "ucnv_open() Failed(%d), enc=%s", err, enc);
1485 ucnv_fromUChars(conv, dest, dest_size, temp, u_strlen(temp), &err);
1486 MSG_WARN_M(U_FAILURE(err), "ucnv_fromUChars() Failed(%d), enc=%s", err, enc);
1495 static void __msgsvc_vmsg_get_prefix(char **prefix, char *src)
1497 char *temp = strchr(src, ':');
1499 long len = (long)temp - (long)src;
1500 *prefix = (char *)calloc(len+1, sizeof(char));
1502 snprintf(*prefix, len+1, "%s", src);
1511 static void __msgsvc_vmsg_remove_spec_out(char **prefix)
1525 static char* __msgsvc_vmsg_get_val(int ver, char *src, char **prefix, char **dest)
1531 MSG_ERR_RET_VM(NULL == src, NULL, "Invalid parameter : The src is NULL.");
1532 MSG_ERR_RET_VM(NULL == dest, NULL, "sInvalid parameter : The dest is NULL.");
1551 if (MSGSVC_VMSG_VER_1_1 == ver) {
1553 if ('=' == *cursor && __msgsvc_vmsg_check_quoted(src, cursor - src, "ed)) {
1554 if ('\r' == *(cursor+1) && '\n' == *(cursor+2))
1557 if ('\r' == *cursor && '\n' == *(cursor+1) && ' ' != *(cursor+2))
1559 if ('\n' == *cursor && ' ' != *(cursor+1))
1567 if ('\r' == *cursor && '\n' == *(cursor+1) && ' ' != *(cursor+2))
1570 if ('\n' == *cursor && ' ' != *(cursor+1))
1577 if (src == cursor) {
1582 char temp = *cursor;
1586 __msgsvc_vmsg_get_prefix(prefix, src);
1588 __msgsvc_vmsg_remove_spec_out(prefix);
1591 *dest = strdup(src);
1592 if (MSGSVC_VMSG_VER_1_1 != ver)
1593 __msgsvc_vmsg_remove_folding(*dest);
1595 if (__msgsvc_vmsg_check_quoted(*dest, -1, "ed))
1596 len = __msgsvc_vmsg_decode_quoted_val(*dest);
1598 len = strlen(*dest);
1599 new_dest = __msgsvc_vmsg_translate_charset(*dest, len);
1605 return (cursor + 1);
1609 static int __msgsvc_vmsg_check_content_type(char **vcard)
1613 for (i = VMSG_VALUE_NONE+1; i < VMSG_MAXIMUM_VALUE; i++) {
1614 new_start = __msgsvc_vmsg_check_word(*vcard, content_name[i]);
1615 if (new_start && (':' == *new_start || ';' == *new_start))
1619 if (VMSG_MAXIMUM_VALUE == i) {
1620 return VMSG_VALUE_NONE;
1627 static inline bool __msgsvc_vmsg_check_base64_encoded(char *src)
1634 ret = strncmp(tmp, "BASE64", sizeof("BASE64") - 1);
1637 } else if (':' == *tmp || '\r' == *tmp) {
1645 static char* __msgsvc_vmsg_decode_base64_val(char *val)
1648 guchar *decoded_str;
1652 src = strchr(val, ':');
1658 decoded_str = g_base64_decode(src, &size);
1660 dest = (char *)calloc((src-val)+size+1, sizeof(char));
1662 g_free(decoded_str);
1665 snprintf(dest, (src-val)+1, "%s", val);
1666 snprintf(dest+(src-val), size+1, "%s", decoded_str);
1667 g_free(decoded_str);
1672 static inline char* __msgsvc_vmsg_pass_unsupported(char *vmsg)
1683 static inline char* __msgsvc_vmsg_get_content_value(char *val)
1687 temp = strchr(val, ':');
1693 MSG_ERR_RET_VM('\0' == *(temp) || '\r' == *(temp) || '\n' == *(temp),
1694 NULL, "Invalid vcard content");
1699 static char* __msgsvc_vmsg_remove_escape_char(char *str)
1701 const char *s = SAFE_STR(str);
1702 char *r = (char *)s;
1704 if (*s == '\\' && *(s+1)) {
1705 char *n = (char*)(s+1);
1706 switch ((unsigned int)*n) {
1721 case 0xA1: /* en/em backslash */
1722 if (*(n+1) && 0xAC == *(n+1)) {
1729 case 0x81: /* en/em backslash */
1730 if (*(n+1) && 0x5F == *(n+1)) {
1753 static inline msg_error_t __msgsvc_vmsg_get_read_status(MSG_MESSAGE_INFO_S *pMsg, char *val)
1757 temp = __msgsvc_vmsg_get_content_value(val);
1758 MSG_ERR_RET_VM(NULL == temp, MSG_ERR_INVALID_PARAMETER, "Invalid parameter : read status");
1760 temp = __msgsvc_vmsg_remove_escape_char(temp);
1762 if (strcmp(temp, content_name[VMSG_INDICATION_READ_STATUS_READ]) == 0)
1764 else if (strcmp(temp, content_name[VMSG_INDICATION_READ_STATUS_UNREAD]) == 0)
1765 pMsg->bRead = false;
1767 return MSG_ERR_INVALID_PARAMETER;
1769 MSG_DEBUG("pMsg->bRead = %d", pMsg->bRead);
1773 static inline msg_error_t __msgsvc_vmsg_get_msg_box(MSG_MESSAGE_INFO_S *pMsg, char *val)
1777 temp = __msgsvc_vmsg_get_content_value(val);
1778 MSG_ERR_RET_VM(NULL == temp, MSG_ERR_INVALID_PARAMETER, "Invalid parameter : msg box");
1780 temp = __msgsvc_vmsg_remove_escape_char(temp);
1782 if (strcmp(temp, content_name[VMSG_INDICATION_MSG_BOX_DRAFT]) == 0) {
1783 pMsg->folderId = MSG_DRAFT_ID;
1784 pMsg->direction = MSG_DIRECTION_TYPE_MO;
1785 pMsg->networkStatus = MSG_NETWORK_NOT_SEND;
1786 } else if (strcmp(temp, content_name[VMSG_INDICATION_MSG_BOX_INBOX]) == 0) {
1787 pMsg->folderId = MSG_INBOX_ID;
1788 pMsg->direction = MSG_DIRECTION_TYPE_MT;
1789 pMsg->networkStatus = MSG_NETWORK_RECEIVED;
1790 } else if (strcmp(temp, content_name[VMSG_INDICATION_MSG_BOX_SENT]) == 0) {
1791 pMsg->folderId = MSG_SENTBOX_ID;
1792 pMsg->direction = MSG_DIRECTION_TYPE_MO;
1793 pMsg->networkStatus = MSG_NETWORK_SEND_SUCCESS;
1795 return MSG_ERR_INVALID_PARAMETER;
1798 MSG_DEBUG("pMsg->folderId = %d", pMsg->folderId);
1802 static inline msg_error_t __msgsvc_vmsg_get_msg_type(MSG_MESSAGE_INFO_S *pMsg, char *val)
1806 temp = __msgsvc_vmsg_get_content_value(val);
1807 MSG_ERR_RET_VM(NULL == temp, MSG_ERR_INVALID_PARAMETER, "Invalid parameter : msg type");
1809 temp = __msgsvc_vmsg_remove_escape_char(temp);
1811 if (strcmp(temp, content_name[VMSG_INDICATION_MESSAGE_TYPE_MSG]) == 0) {
1812 pMsg->msgType.mainType = MSG_SMS_TYPE;
1813 pMsg->msgType.subType = MSG_NORMAL_SMS;
1814 pMsg->msgType.classType = MSG_CLASS_NONE;
1815 } else if (strcmp(temp, content_name[VMSG_INDICATION_MESSAGE_TYPE_INET]) == 0) {
1818 return MSG_ERR_INVALID_PARAMETER;
1821 MSG_DEBUG("pMsg->msgType.subType = %d", pMsg->msgType.subType);
1825 static inline msg_error_t __msgsvc_vmsg_get_address(MSG_MESSAGE_INFO_S *pMsg, char *prefix, char *val, int* vCardCnt)
1828 MSG_DEBUG("vCardCnt is : %d", *vCardCnt);
1829 if ((pMsg->folderId == MSG_SENTBOX_ID || pMsg->folderId == MSG_DRAFT_ID) && *vCardCnt == 1)
1832 if (pMsg->folderId == MSG_INBOX_ID && *vCardCnt > 1)
1835 temp = __msgsvc_vmsg_get_content_value(val);
1836 MSG_ERR_RET_VM(NULL == temp, MSG_ERR_INVALID_PARAMETER, "Invalid parameter : address");
1838 temp = __msgsvc_vmsg_remove_escape_char(temp);
1839 MSG_ADDRESS_INFO_S * addrInfo = NULL;
1841 pMsg->nAddressCnt++;
1842 MSG_DEBUG("Address is : %s", temp);
1843 MSG_DEBUG("Address Cnt : %d", pMsg->nAddressCnt);
1846 if (pMsg->addressList == NULL) {
1847 addrInfo = (MSG_ADDRESS_INFO_S *)calloc(1, sizeof(MSG_ADDRESS_INFO_S));
1849 addrInfo = (MSG_ADDRESS_INFO_S *)realloc(pMsg->addressList, pMsg->nAddressCnt * sizeof(MSG_ADDRESS_INFO_S));
1852 if (addrInfo == NULL) {
1853 return MSG_ERR_INVALID_PARAMETER;
1855 pMsg->addressList = addrInfo;
1857 pMsg->addressList[pMsg->nAddressCnt-1].addressType = MSG_ADDRESS_TYPE_PLMN;
1858 pMsg->addressList[pMsg->nAddressCnt-1].recipientType = MSG_RECIPIENTS_TYPE_TO;
1859 strncpy(pMsg->addressList[pMsg->nAddressCnt-1].addressVal, temp, MAX_ADDRESS_VAL_LEN);
1860 MSG_DEBUG("pMsg->addressList[pMsg->nAddressCnt-1].addressVal = %s", pMsg->addressList[pMsg->nAddressCnt-1].addressVal);
1864 static inline msg_error_t __msgsvc_vmsg_get_msg_date(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 : date");
1871 temp = __msgsvc_vmsg_remove_escape_char(temp);
1872 MSG_DEBUG("pMsg->displayTime = %s", temp);
1873 struct tm displayTime;
1874 if ( __msgsvc_vmsg_convert_vdata_to_tm_str(temp, &displayTime))
1875 pMsg->displayTime = mktime(&displayTime);
1877 pMsg->displayTime = time(NULL);
1881 static inline msg_error_t __msgsvc_vmsg_get_msg_subject(MSG_MESSAGE_INFO_S *pMsg, char *val)
1885 temp = __msgsvc_vmsg_get_content_value(val);
1886 MSG_ERR_RET_VM(NULL == temp, MSG_ERR_INVALID_PARAMETER, "Invalid parameter : subject");
1888 temp = __msgsvc_vmsg_remove_escape_char(temp);
1890 if (temp && temp[0] != '\0')
1891 strncpy(pMsg->subject, temp, MAX_SUBJECT_LEN);
1892 MSG_DEBUG("pMsg->subject = %s", pMsg->subject);
1896 static inline bool __msgsvc_vmsg_get_msg_begin(MSG_MESSAGE_INFO_S *pMsg, char *val, int *vCardCnt)
1898 pMsg->encodeType = MSG_ENCODE_AUTO;
1902 temp = __msgsvc_vmsg_get_content_value(val);
1903 MSG_ERR_RET_VM(NULL == temp, MSG_ERR_INVALID_PARAMETER, "Invalid parameter : body");
1905 temp = __msgsvc_vmsg_remove_escape_char(temp);
1907 if (temp && temp[0] != '\0' && strcmp(temp, "VCARD") == 0) {
1914 static inline bool __msgsvc_vmsg_get_msg_end(MSG_MESSAGE_INFO_S *pMsg, char *val)
1916 pMsg->encodeType = MSG_ENCODE_AUTO;
1920 temp = __msgsvc_vmsg_get_content_value(val);
1921 MSG_ERR_RET_VM(NULL == temp, MSG_ERR_INVALID_PARAMETER, "Invalid parameter : body");
1923 temp = __msgsvc_vmsg_remove_escape_char(temp);
1925 if (temp && temp[0] != '\0' && strcmp(temp, "VMSG") == 0) {
1926 MSG_DEBUG("VMessage decoding completed");
1928 } else if (temp && temp[0] != '\0' && strcmp(temp, "VCARD") == 0) {
1929 MSG_DEBUG("VMessage decoding completed");
1935 static inline msg_error_t __msgsvc_vmsg_get_msg(int ver, char *vmsg, MSG_MESSAGE_INFO_S *record)
1938 char *cursor, *new_start, *val, *prefix;
1940 MSG_MESSAGE_INFO_S *pMsg = record;
1942 bool isDateAvailable = false;
1951 bool base64_encoded = false;
1952 char *bodyStart = cursor;
1953 type = __msgsvc_vmsg_check_content_type(&cursor);
1955 if (VMSG_VALUE_NONE == type) {
1956 if (isDateAvailable == true) {
1957 isDateAvailable = false;
1959 MSG_DEBUG("Decoding body :");
1960 bodyStart = __msgsvc_vmsg_pass_unsupported(bodyStart);
1962 char tempMsgText[MAX_MSG_TEXT_LEN + 1] = {0, };
1964 if (i >= MAX_MSG_TEXT_LEN)
1966 if (*bodyStart == 'E' && *(bodyStart+1) == 'N' && *(bodyStart+2) == 'D' && *(bodyStart+3) == ':') {
1970 tempMsgText[i] = *bodyStart;
1974 tempMsgText[i] = '\0';
1975 char * temp = __msgsvc_vmsg_remove_escape_char(tempMsgText);
1976 snprintf(pMsg->msgText, sizeof(pMsg->msgText), "%s", temp);
1977 MSG_DEBUG("pMsg->msgText : %s", pMsg->msgText);
1978 pMsg->dataSize = strlen(pMsg->msgText);
1979 pMsg->bTextSms = true;
1980 base64_encoded = __msgsvc_vmsg_check_base64_encoded(pMsg->msgText);
1982 if (base64_encoded) {
1983 char * decodedText = NULL;
1984 decodedText = __msgsvc_vmsg_decode_base64_val(pMsg->msgText);
1986 strncpy(pMsg->msgText, decodedText, MAX_MSG_TEXT_LEN);
1987 pMsg->dataSize = strlen(pMsg->msgText);
1990 pMsg->msgText[0] = '\0';
1998 new_start = __msgsvc_vmsg_pass_unsupported(cursor);
2008 base64_encoded = __msgsvc_vmsg_check_base64_encoded(cursor);
2010 new_start = __msgsvc_vmsg_get_val(ver, cursor, &prefix, &val);
2012 if (NULL == new_start) {
2025 if (base64_encoded) {
2026 char *temp = __msgsvc_vmsg_decode_base64_val(val);
2031 case VMSG_INDICATION_READ_STATUS:
2032 __msgsvc_vmsg_get_read_status(pMsg, val);
2034 case VMSG_INDICATION_MSG_BOX:
2035 __msgsvc_vmsg_get_msg_box(pMsg, val);
2037 case VMSG_INDICATION_MESSAGE_TYPE:
2038 __msgsvc_vmsg_get_msg_type(pMsg, val);
2040 case VMSG_VCARD_TEL:
2041 __msgsvc_vmsg_get_address(pMsg, prefix, val, &vCardCnt);
2043 case VMSG_BODY_PROPERTY_DATE:
2044 isDateAvailable = true;
2045 __msgsvc_vmsg_get_msg_date(pMsg, val);
2047 case VMSG_BODY_PROPERTY_SUBJECT:
2048 __msgsvc_vmsg_get_msg_subject(pMsg, val);
2050 case VMSG_MSG_BEGIN:
2051 end = __msgsvc_vmsg_get_msg_begin(pMsg, val, &vCardCnt);
2054 end = __msgsvc_vmsg_get_msg_end(pMsg, val);
2063 MSG_ERR("Invalid parameter : __msgsvc_vmsg_check_content_type() Failed(%d)", type);
2066 return MSG_ERR_INVALID_PARAMETER;
2073 MSG_ERR("Invalid vmsg");
2074 return MSG_ERR_INVALID_PARAMETER;
2077 msg_error_t MsgVMessageDecodeSMS(const char *vmsg_stream, MSG_MESSAGE_INFO_S *pMsg)
2083 char *vmsg = (char *)vmsg_stream;
2085 char *MMSsend, *MMSretrieve, *MMSnoti;
2087 MSG_ERR_RET_VM(NULL == vmsg_stream, MSG_ERR_INVALID_PARAMETER, "Invalid Parameter : vmsg");
2089 vmsg = __msgsvc_vmsg_check_word(vmsg, "BEGIN:VMSG");
2090 MSG_ERR_RET_VM(NULL == vmsg, MSG_ERR_INVALID_PARAMETER, "Invalid parameter : The vmsg is invalid.");
2092 /* check for mms() */
2097 MMSsend = __msgsvc_vmsg_check_word(MMSsend, "X-MESSAGE-TYPE:MMS SEND");
2098 MSG_ERR_RET_VM(NULL != MMSsend, MSG_ERR_INVALID_MESSAGE, "Invalid parameter : The vmsg format is invalid.");
2100 MMSretrieve = __msgsvc_vmsg_check_word(MMSretrieve, "X-MESSAGE-TYPE:MMS RETRIEVE");
2101 MSG_ERR_RET_VM(NULL != MMSretrieve, MSG_ERR_INVALID_MESSAGE, "Invalid parameter : The vmsg format is invalid.");
2103 MMSnoti = __msgsvc_vmsg_check_word(MMSnoti, "X-MESSAGE-TYPE:MMS NOTIFICATION");
2104 MSG_ERR_RET_VM(NULL != MMSnoti, MSG_ERR_INVALID_MESSAGE, "Invalid parameter : The vmsg format is invalid.");
2107 __msgsvc_vmsg_initial();
2109 vmsg = __msgsvc_vmsg_check_word(vmsg, "VERSION:1.1");
2110 MSG_ERR_RET_VM(NULL == vmsg, MSG_ERR_INVALID_PARAMETER, "Invalid parameter : The vmsg format is invalid.");
2112 ver = MSGSVC_VMSG_VER_1_1;
2114 ret = __msgsvc_vmsg_get_msg(ver, vmsg, pMsg);
2115 if (MSG_SUCCESS!= ret) {