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);
259 if (*(s+1) && '\n' == *(s+1)) {
273 if (*buf_size < str_len+len+1) {
274 *buf_size = *buf_size * 2;
275 if (NULL == (tmp = (char *)realloc(*buf, *buf_size)))
278 int pos_temp = r-(*buf+len);
280 r = (char *)(*buf+len+pos_temp);
294 if (*buf_size < str_len+len+1) {
295 *buf_size = *buf_size * 2;
296 if (NULL == (tmp = (char *)realloc(*buf, *buf_size)))
299 int pos_temp = r-(*buf+len);
301 r = (char *)(*buf+len+pos_temp);
307 if (*(s+1) && 0xAC == *(s+1)) { /* en/em backslash */
311 if (*buf_size < str_len+len+1) {
312 *buf_size = *buf_size * 2;
313 if (NULL == (tmp = (char *)realloc(*buf, *buf_size)))
316 int pos_temp = r-(*buf+len);
318 r = (char *)(*buf+len+pos_temp);
325 if (*buf_size < str_len+len+1) {
326 *buf_size = *buf_size * 2;
327 if (NULL == (tmp = (char *)realloc(*buf, *buf_size)))
330 int pos_temp = r-(*buf+len);
332 r = (char *)(*buf+len+pos_temp);
342 if (*(s+1) && 0x5F == *(s+1)) { /* en/em backslash */
346 if (*buf_size < str_len+len+1) {
347 *buf_size = *buf_size * 2;
348 if (NULL == (tmp = (char *)realloc(*buf, *buf_size)))
351 int pos_temp = r-(*buf+len);
353 r = (char *)(*buf+len+pos_temp);
360 if (*buf_size < str_len+len+1) {
361 *buf_size = *buf_size * 2;
362 if (NULL == (tmp = (char *)realloc(*buf, *buf_size)))
365 int pos_temp = r-(*buf+len);
367 r = (char *)(*buf+len+pos_temp);
386 len_temp = snprintf(*buf+len, *buf_size-len+1, "%s", safe_str);
393 /*==================================================================================================
395 ==================================================================================================*/
396 #define INSERT_VMSG_OBJ pObject = (VObject*)calloc(1, sizeof(VObject)); \
399 vmsg_free_vtree_memory(pMessage);\
402 if (pMessage->pTop == NULL)\
404 pMessage->pTop = pObject;\
408 pMessage->pCur->pSibling = pObject;\
410 pMessage->pCur = pObject;
413 #define INSERT_VBODY_OBJ pObject = (VObject*)calloc(1, sizeof(VObject)); \
416 vmsg_free_vtree_memory(pMessage);\
419 if (pBody->pTop == NULL)\
421 pBody->pTop = pObject;\
425 pBody->pCur->pSibling = pObject;\
427 pBody->pCur = pObject;
430 #define INSERT_VCARD_OBJ pObject = (VObject*)calloc(1, sizeof(VObject)); \
433 vmsg_free_vtree_memory(pMessage);\
436 if (pCard->pTop == NULL)\
438 pCard->pTop = pObject;\
442 pCard->pCur->pSibling = pObject;\
444 pCard->pCur = pObject;
447 #define INSERT_PARAM param = (VParam*)calloc(1, sizeof(VParam));\
450 vmsg_free_vtree_memory(pMessage);\
451 if (pObject != NULL)\
460 /*==================================================================================================
461 FUNCTION IMPLEMENTATION
462 ==================================================================================================*/
464 char* _convert_tm_to_vdata_str(const struct tm * tm)
466 char str[17] = {0, };
468 snprintf(str, 17, "%04d%02d%02dT%02d%02d%02dZ",
479 bool _convert_vdata_str_to_tm(const char* szText, struct tm * tm)
481 if (szText == NULL) return false;
482 if (strlen(szText) < 15) return false;
483 if (szText[8] != 'T') return false;
486 memset(tm, 0, sizeof(struct tm));
488 /* year, month, day */
489 memcpy(szBuff, &(szText[0]), 4);
491 tm->tm_year = atol(szBuff) - 1900;
492 if ((tm->tm_year > 137) || (tm->tm_year < 0))
495 memcpy(szBuff, &(szText[4]), 2);
497 tm->tm_mon = atol(szBuff)-1;
498 if ((tm->tm_mon > 11) || (tm->tm_mon < 0))
501 memcpy(szBuff, &(szText[6]), 2);
503 tm->tm_mday = atol(szBuff);
504 if ((tm->tm_mday > 31) || (tm->tm_mday < 1))
507 /* hour, minute, second */
508 memcpy(szBuff, &(szText[9]), 2);
510 tm->tm_hour = atol(szBuff);
511 if ((tm->tm_hour > 23) || (tm->tm_hour < 0))
514 memcpy(szBuff, &(szText[11]), 2);
516 tm->tm_min = atol(szBuff);
517 if ((tm->tm_min > 59) || (tm->tm_min < 0))
520 memcpy(szBuff, &(szText[13]), 2);
522 tm->tm_sec = atol(szBuff);
523 if ((tm->tm_sec > 59) || (tm->tm_sec < 0))
529 int msgsvc_check_utf8(char c)
531 if ((c & 0xff) < (128 & 0xff))
533 else if ((c & (char)0xe0) == (char)0xc0)
535 else if ((c & (char)0xf0) == (char)0xe0)
537 else if ((c & (char)0xf8) == (char)0xf0)
539 else if ((c & (char)0xfc) == (char)0xf8)
541 else if ((c & (char)0xfe) == (char)0xfc)
544 return MSG_ERR_INVALID_PARAMETER;
547 char* __msgsvc_vmsg_convert_tm_to_vdata_str(struct tm * tm)
549 char str[22] = {0, };
551 char month[15] = {0, };
554 mon = tm->tm_mon + 1;
556 if (tm->tm_hour >= 12)
561 if (tm->tm_hour > 12)
562 hour = tm->tm_hour - 12;
568 strcpy(month, "Jan");
571 strcpy(month, "Feb");
574 strcpy(month, "Mar");
577 strcpy(month, "Apr");
580 strcpy(month, "May");
583 strcpy(month, "Jun");
586 strcpy(month, "Jul");
589 strcpy(month, "Aug");
592 strcpy(month, "Sep");
595 strcpy(month, "Oct");
598 strcpy(month, "Nov");
601 strcpy(month, "Dec");
604 MSG_DEBUG("invalid month number");
608 snprintf(str, 22, "%d:%02d%s, %04d %s %d",
618 static inline int __msgsvc_vmsg_add_folding(char **buf, int *buf_size, int buf_len)
621 char *buf_copy = NULL;
625 bool content_start = false;
626 bool encode_64 = false;
628 buf_copy = (char *)calloc(1, *buf_size);
632 len = result_len = 0;
635 if (*buf_size < result_len + 5) {
637 *buf_size = *buf_size + 1000;
638 if (NULL == (tmp = (char *)realloc(buf_copy, *buf_size))) {
644 r = (buf_copy + result_len);
648 if (false == content_start) {
650 content_start = true;
651 else if (0 == strncmp(s, "ENCODING=BASE64", strlen("ENCODING=BASE64")))
657 else if ('\n' == *s) {
660 content_start = false;
665 if (false == encode_64)
666 char_len = msgsvc_check_utf8(*s);
668 if (MSGSVC_VMSG_FOLDING_LIMIT <= len + char_len) {
695 static inline int __msgsvc_vmsg_append_start_vmsg_1_1(char **buf, int *buf_size, int len)
697 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[BEGIN_VMSG]);
698 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
699 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VERSION_VMSG]);
700 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
704 static inline int __msgsvc_vmsg_append_end_vmsg(char **buf, int *buf_size, int len)
706 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[END_VMSG]);
707 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
711 static inline int __msgsvc_vmsg_append_read_status(MSG_MESSAGE_INFO_S *pMsg, char **buf, int *buf_size, int len)
713 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_INDICATION_READ_STATUS]);
714 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_DATA_SEPARATOR]);
716 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_INDICATION_READ_STATUS_READ]);
717 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
719 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_INDICATION_READ_STATUS_UNREAD]);
720 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
724 static inline int __msgsvc_vmsg_append_box_type(MSG_MESSAGE_INFO_S *pMsg, char **buf, int *buf_size, int len)
726 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_INDICATION_MSG_BOX]);
727 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_DATA_SEPARATOR]);
728 switch(pMsg->folderId) {
730 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_INDICATION_MSG_BOX_INBOX]);
734 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_INDICATION_MSG_BOX_SENT]);
738 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_INDICATION_MSG_BOX_DRAFT]);
741 /* Discard User Defined, outbox or Spam folder's messages. */
742 MSG_DEBUG("Invalid or unhandled msg box");
744 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
748 static inline int __msgsvc_vmsg_append_msg_type(MSG_MESSAGE_INFO_S *pMsg, char **buf, int *buf_size, int len)
750 /* TO DO check with msg text contains Only PrintableAscii if true then else handle INET_TYPE */
751 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_INDICATION_MESSAGE_TYPE]);
752 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_DATA_SEPARATOR]);
753 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_INDICATION_MESSAGE_TYPE_MSG]);
754 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
758 static inline int __msgsvc_vmsg_append_origin_address_vcard(MSG_MESSAGE_INFO_S *pMsg, char **buf, int *buf_size, int len)
760 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[BEGIN_VCARD]);
761 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
762 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VERSION_VCARD]);
763 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
764 char originAddress[MAX_ADDRESS_VAL_LEN + 1] = {0, };
765 bool isDisplayName = false;
767 if (pMsg->folderId == MSG_INBOX_ID) {
768 strcpy(originAddress, pMsg->addressList[0].addressVal);
771 needCharset = true; /* as per android */
773 if (strlen(originAddress) > 0) {
774 MSG_CONTACT_INFO_S contactInfo;
775 memset(&contactInfo, 0x00, sizeof(MSG_CONTACT_INFO_S));
777 if (MsgGetContactInfo(&(pMsg->addressList[0]), &contactInfo) != MSG_SUCCESS) {
778 MSG_WARN("MsgGetContactInfo() fail.");
780 snprintf(pMsg->addressList[0].displayName, sizeof(pMsg->addressList[0].displayName), "%s", contactInfo.firstName);
781 if (pMsg->addressList[0].displayName[0] != '\0')
782 isDisplayName = true;
783 if (needCharset && isDisplayName) {
784 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[FNAME_UTF8_VCARD]);
785 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, pMsg->addressList->displayName);
786 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
787 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[NAME_UTF8_VCARD]);
788 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, pMsg->addressList->displayName);
789 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
791 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[FNAME_VCARD]);
792 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, pMsg->addressList->displayName);
793 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
794 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[NAME_VCARD]);
795 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, pMsg->addressList->displayName);
796 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
798 if (MsgIsNumber(originAddress)) {
799 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[TEL_VCARD]);
800 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[TEL_VCARD_CELL]);
801 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, originAddress);
802 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
805 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[FNAME_VCARD]);
806 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
807 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[NAME_VCARD]);
808 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
812 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[END_VCARD]);
813 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
817 static inline int __msgsvc_vmsg_append_recipient_address_vcard(MSG_MESSAGE_INFO_S *pMsg, char **buf, int *buf_size, int len)
819 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[BEGIN_VCARD]);
820 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
821 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VERSION_VCARD]);
822 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
824 needCharset = true; /* as per android */
826 for (int i = 0; i < pMsg->nAddressCnt; ++i) {
827 char originAddress[MAX_ADDRESS_VAL_LEN + 1] = {0, };
828 bool isDisplayName = false;
830 if (pMsg->folderId == MSG_SENTBOX_ID) {
831 strcpy(originAddress, pMsg->addressList[0].addressVal);
834 if (strlen(originAddress) > 0) {
835 MSG_CONTACT_INFO_S contactInfo;
836 memset(&contactInfo, 0x00, sizeof(MSG_CONTACT_INFO_S));
838 if (MsgGetContactInfo(&(pMsg->addressList[i]), &contactInfo) != MSG_SUCCESS) {
839 MSG_WARN("MsgGetContactInfo() fail.");
841 snprintf(pMsg->addressList[i].displayName, sizeof(pMsg->addressList[i].displayName), "%s", contactInfo.firstName);
842 if (pMsg->addressList[i].displayName[0] != '\0')
843 isDisplayName = true;
844 if (needCharset && isDisplayName) {
845 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[FNAME_UTF8_VCARD]);
846 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, pMsg->addressList[i].displayName);
847 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
848 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[NAME_UTF8_VCARD]);
849 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, pMsg->addressList[i].displayName);
850 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
852 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[FNAME_VCARD]);
853 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, pMsg->addressList[i].displayName);
854 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
855 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[NAME_VCARD]);
856 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, pMsg->addressList[i].displayName);
857 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
859 if (MsgIsNumber(originAddress)) {
860 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[TEL_VCARD]);
861 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[TEL_VCARD_CELL]);
862 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, originAddress);
863 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
866 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[FNAME_VCARD]);
867 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
868 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[NAME_VCARD]);
869 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
873 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[END_VCARD]);
874 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
879 static inline int __msgsvc_vmsg_append_msg_body(MSG_MESSAGE_INFO_S *pMsg, char **buf, int *buf_size, int len)
881 struct tm display_time;
883 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[BEGIN_VENV]);
884 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
886 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[BEGIN_VBODY]);
887 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
891 localtime_r(&(pMsg->displayTime), &display_time);
892 char *msgDate = __msgsvc_vmsg_convert_tm_to_vdata_str(&display_time);
894 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_BODY_PROPERTY_DATE]);
895 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_DATA_SEPARATOR]);
896 if (msgDate !=NULL) {
897 MSGSVC_VMSG_APPEND_STR_FREE(buf, buf_size, len, msgDate);
898 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
903 if (pMsg->subject[0] != '\0') {
904 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_BODY_PROPERTY_SUBJECT]);
905 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[VMSG_DATA_SEPARATOR]);
906 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, pMsg->subject);
907 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
911 if(pMsg->msgType.mainType == MSG_SMS_TYPE) {
912 if(pMsg->msgType.subType == MSG_NORMAL_SMS) {
913 if (pMsg->bTextSms == false) {
914 char* pFileData = NULL;
915 unique_ptr<char*, void(*)(char**)> buff(&pFileData, unique_ptr_deleter);
918 char* msgText = NULL;
920 if (MsgOpenAndReadFile(pMsg->msgData, &pFileData, &fileSize) == false)
923 msgText = (char *)calloc(1, fileSize);
924 memcpy(msgText, pFileData, fileSize);
925 MSGSVC_VMSG_APPEND_STR_FREE(buf, buf_size, len, msgText);
928 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, pMsg->msgText);
933 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
935 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[END_VBODY]);
936 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
938 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[END_VENV]);
939 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
943 static inline int __msgsvc_vmsg_append_msg_envelope(MSG_MESSAGE_INFO_S *pMsg, char **buf, int *buf_size, int len)
945 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[BEGIN_VENV]);
946 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
948 len = __msgsvc_vmsg_append_recipient_address_vcard(pMsg, buf, buf_size, len);
949 MSG_ERR_RET_VM(len < 0, len, "Invalid length : vcard");
951 len = __msgsvc_vmsg_append_msg_body(pMsg, buf, buf_size, len);
952 MSG_ERR_RET_VM(len < 0, len, "Invalid length : body");
954 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, content_name[END_VENV]);
955 MSGSVC_VMSG_APPEND_STR(buf, buf_size, len, MSGSVC_CRLF);
959 static inline int __msgsvc_vmsg_append_msg(MSG_MESSAGE_INFO_S *pMsg, char **buf, int *buf_size, int len)
961 len = __msgsvc_vmsg_append_read_status(pMsg, buf, buf_size, len);
962 MSG_ERR_RET_VM(len < 0, len, "Invalid length : read status");
964 len = __msgsvc_vmsg_append_box_type(pMsg, buf, buf_size, len);
965 MSG_ERR_RET_VM(len < 0, len, "Invalid length : box type");
967 len = __msgsvc_vmsg_append_msg_type(pMsg, buf, buf_size, len);
968 MSG_ERR_RET_VM(len < 0, len, "Invalid length : msg type");
970 len = __msgsvc_vmsg_append_origin_address_vcard(pMsg, buf, buf_size, len);
971 MSG_ERR_RET_VM(len < 0, len, "Invalid length : origin address");
973 len = __msgsvc_vmsg_append_msg_envelope(pMsg, buf, buf_size, len);
974 MSG_ERR_RET_VM(len < 0, len, "Invalid length : envelop");
979 char *MsgVMessageEncode(MSG_MESSAGE_INFO_S *pMsg)
983 VObject* pObject = NULL;
984 VParam* param = NULL;
985 VTree * pBody = NULL;
986 VTree * pCard = NULL;
987 VTree * pCurrent = NULL;
988 struct tm display_time;
989 char* encoded_data = NULL;
991 VTree* pMessage = NULL;
994 if (pMsg->msgType.mainType == MSG_SMS_TYPE && pMsg->msgType.subType == MSG_NORMAL_SMS) {
995 return MsgVMessageEncodeSMS(pMsg);
999 if (pMessage == NULL) {
1000 pMessage = (VTree *)malloc(sizeof(VTree));
1004 pMessage->treeType = VMESSAGE;
1005 pMessage->pTop = NULL;
1006 pMessage->pCur = NULL;
1007 pMessage->pNext = NULL;
1009 pCurrent = pMessage;
1011 /* Insert VObject (X-MESSAGE-TYPE) to VMessage tree */
1014 pObject->property = VMSG_TYPE_MSGTYPE;
1016 if (pMsg->msgType.mainType == MSG_MMS_TYPE && (pMsg->msgType.subType == MSG_SENDREQ_MMS || pMsg->msgType.subType == MSG_SENDCONF_MMS))
1017 pObject->pszValue[0] = strdup("MMS SEND");
1019 else if (pMsg->msgType.mainType == MSG_MMS_TYPE && pMsg->msgType.subType == MSG_NOTIFICATIONIND_MMS)
1020 pObject->pszValue[0] = strdup("MMS NOTIFICATION");
1023 else if (pMsg->msgType.mainType == MSG_MMS_TYPE && (pMsg->msgType.subType == MSG_RETRIEVE_AUTOCONF_MMS || pMsg->msgType.subType == MSG_RETRIEVE_MANUALCONF_MMS))
1024 pObject->pszValue[0] = strdup("MMS RETRIEVED");
1027 goto __CATCH_FAIL__;
1029 pObject->valueCount = 1;
1032 /* Insert VObject (X-IRMC-BOX) to VMessate tree */
1035 pObject->property = VMSG_TYPE_MSGBOX;
1037 switch(pMsg->folderId) {
1039 pObject->pszValue[0] = strdup("INBOX");
1042 pObject->pszValue[0] = strdup("OUTBOX");
1044 case MSG_SENTBOX_ID:
1045 pObject->pszValue[0] = strdup("SENTBOX");
1048 pObject->pszValue[0] = strdup("DRAFTBOX");
1051 /* Discard User Defined or Spam folder's messages. */
1052 goto __CATCH_FAIL__;
1054 pObject->valueCount = 1;
1057 /* Insert VObject (X-SS-DT) to VMessage tree */
1060 pObject->property = VMSG_TYPE_DATE;
1062 localtime_r(&(pMsg->displayTime), &display_time);
1063 pObject->pszValue[0] = _convert_tm_to_vdata_str(&display_time);
1064 pObject->valueCount = 1;
1067 /* Insert Vobject read status to VMessage tree */
1070 pObject->property = VMSG_TYPE_STATUS;
1073 pObject->pszValue[0] = strdup("READ");
1075 pObject->pszValue[0] = strdup("UNREAD");
1077 pObject->valueCount = 1;
1080 /* Insert VBody tree for message body; */
1081 pBody = (VTree*)calloc(1, sizeof(VTree));
1083 goto __CATCH_FAIL__;
1084 pBody->treeType = VBODY;
1087 pBody->pNext = NULL;
1088 pCurrent->pNext = pBody;
1091 if (strlen(pMsg->subject) > 0) {
1092 /* Insert Subject object */
1094 pObject->property = VMSG_TYPE_SUBJECT;
1095 pObject->pszValue[0] = strdup(pMsg->subject);
1096 pObject->valueCount = 1;
1098 /* Insert VBody object */
1100 pObject->property = VMSG_TYPE_BODY;
1102 if (pMsg->msgType.mainType == MSG_MMS_TYPE) {
1103 /* Insert VBody for mms raw data; */
1104 char* pFileData = NULL;
1105 unique_ptr<char*, void(*)(char**)> buf(&pFileData, unique_ptr_deleter);
1106 MMS_DATA_S *pMmsData = NULL;
1108 char* msgText = NULL;
1110 char filePath[MSG_FILEPATH_LEN_MAX] = {0, };
1111 if(pMsg->msgType.subType == MSG_NOTIFICATIONIND_MMS)
1112 pFileData = MsgOpenAndReadMmsFile(pMsg->msgData, 0, -1, &fileSize);
1114 err = MsgStoGetMmsRawFilePath(pDbHandle, pMsg->msgId, filePath);
1116 if (err != MSG_SUCCESS)
1117 goto __CATCH_FAIL__;
1119 pFileData = MsgOpenAndReadMmsFile(filePath, 0, -1, &fileSize);
1123 if (pMsg->bTextSms == false) {
1124 if (MsgOpenAndReadFile(pMsg->msgData, &pFileData, &fileSize) == false) {
1125 goto __CATCH_FAIL__;
1128 fileSize = strlen(pMsg->msgData);
1129 pFileData = (char *)calloc(1, fileSize+1);
1131 goto __CATCH_FAIL__;
1132 snprintf(pFileData, fileSize, "%s", pMsg->msgData);
1135 if (MsgDeserializeMmsData(pFileData, fileSize, &pMmsData) != 0) {
1136 MSG_DEBUG("Fail to Deserialize Message Data");
1137 MsgMmsRelease(&pMmsData);
1138 goto __CATCH_FAIL__;
1141 int serializedDataSize = 0;
1144 MsgMmsSetMultipartListData(pMmsData); /* app file -> data */
1145 serializedDataSize = MsgSerializeMms(pMmsData, &pFileData);
1149 fileSize = serializedDataSize;
1152 MsgMmsRelease(&pMmsData);
1155 MSG_DEBUG("FILE SIZE IS %d, %s", fileSize, pFileData);
1156 msgText = (char *)calloc(1, fileSize);
1157 if(pFileData && msgText)
1158 memcpy(msgText, pFileData, fileSize);
1160 pObject->numOfBiData = fileSize;
1161 pObject->pszValue[0] = msgText;
1162 pObject->valueCount = 1;
1170 /* Insert parameter for base64 encoding */
1171 MSG_DEBUG("before to start INSERT_PARAM");
1173 pObject->pParam = param;
1174 param->parameter = VMSG_PARAM_ENCODING;
1175 param->paramValue = VMSG_ENC_PARAM_BASE64;
1177 /* Add VCard tree for recipient address information. */
1178 for (int i = 0; i < pMsg->nAddressCnt; ++i) {
1179 pCard = (VTree*)calloc(1, sizeof(VTree));
1181 goto __CATCH_FAIL__;
1183 pCard->treeType = VCARD;
1186 pCard->pNext = NULL;
1187 pCurrent->pNext = pCard;
1191 pObject->property = VCARD_TYPE_TEL;
1192 pObject->pszValue[0] = strdup(pMsg->addressList[i].addressVal);
1193 pObject->valueCount = 1;
1195 MSG_DEBUG("before to start vmsg_encode");
1196 encoded_data = vmsg_encode(pMessage);
1198 vmsg_free_vtree_memory(pMessage);
1200 return encoded_data;
1203 vmsg_free_vtree_memory(pMessage);
1208 char *MsgVMessageEncodeSMS(MSG_MESSAGE_INFO_S *pMsg)
1213 int buf_size = VMSG_INIT_LENGTH;
1216 __msgsvc_vmsg_initial();
1218 buf = (char *)calloc(1, buf_size);
1220 len = __msgsvc_vmsg_append_start_vmsg_1_1(&buf, &buf_size, len);
1226 len = __msgsvc_vmsg_append_msg(pMsg, &buf, &buf_size, len);
1232 len = __msgsvc_vmsg_append_end_vmsg(&buf, &buf_size, len);
1238 len = __msgsvc_vmsg_add_folding(&buf, &buf_size, len);
1247 bool __msgsvc_vmsg_convert_vdata_to_tm_str(const char* szText, struct tm * tm)
1252 char delims[] = ",";
1253 gchar **token = NULL;
1256 token = g_strsplit_set(szText, delims, -1);
1257 if (token && token[0]) {
1258 g_strstrip(token[0]);
1259 strptime(token[0], "%I:%M%p", tm);
1265 if (token && token[1]) {
1266 g_strstrip(token[1]);
1267 strptime(token[1], "%Y %b %e", &tmTemp);
1273 tm->tm_year = tmTemp.tm_year;
1274 tm->tm_mon = tmTemp.tm_mon;
1275 tm->tm_mday = tmTemp.tm_mday;
1283 static inline char* __msgsvc_vmsg_remove_empty_line(char *src)
1286 if ('\n' != *src && '\r' != *src)
1293 static char* __msgsvc_vmsg_check_word(char *src, const char *word)
1297 MSG_ERR_RET_VM(NULL == src, NULL, "The src is NULL.");
1299 src = __msgsvc_vmsg_remove_empty_line(src);
1315 while (*src == *word) {
1319 if ('\0' == *src || '\0' == *word)
1329 static inline int __msgsvc_vmsg_check_quoted(char *src, int max, int *quoted)
1332 if (TRUE == *quoted)
1335 while (*src && max) {
1337 ret = strncmp(src, "QUOTED-PRINTABLE", sizeof("QUOTED-PRINTABLE") - 1);
1342 } else if (':' == *src) {
1351 static inline int __msgsvc_vmsg_remove_folding(char *folded_src)
1353 char *result = folded_src;
1355 MSG_ERR_RET_VM(NULL == folded_src, MSG_ERR_INVALID_PARAMETER, " Invalid Parameter : __msgsvc_vmsg_remove_folding");
1357 while (*folded_src) {
1358 if ('\r' == *folded_src && '\n' == *(folded_src+1) && ' ' == *(folded_src+2))
1360 else if ('\n' == *folded_src && ' ' == *(folded_src+1))
1363 if ('\0' == *folded_src)
1366 *result = *folded_src;
1374 static inline int __msgsvc_vmsg_hex_to_dec(char hex)
1380 return hex - 'a' + 10;
1382 return hex - 'A' + 10;
1387 static inline int __msgsvc_vmsg_decode_quoted_val(char *val)
1392 src = strchr(val, ':');
1399 pre = __msgsvc_vmsg_hex_to_dec(*(src+1));
1401 *dest = (char)((pre << 4) + __msgsvc_vmsg_hex_to_dec(*(src+2)));
1405 if ('\r' == *(src+1) && '\n' == *(src+2))
1419 static inline char* __msgsvc_vmsg_translate_charset(char *src, int len)
1426 ret = strncmp(val, "CHARSET", sizeof("CHARSET") - 1);
1428 val += sizeof("CHARSET");
1432 else if (':' == *val) {
1441 UErrorCode err = U_ZERO_ERROR;
1445 char enc[32] = {0}, *dest;
1447 while (';' != *val && ':' != *val && ',' != *val) {
1451 if (0 == strcasecmp("UTF-8", enc))
1457 src_len = len - (val - src);
1459 temp_size = (src_len+1) * sizeof(UChar);
1460 temp = (UChar *)malloc(temp_size);
1461 conv = ucnv_open(enc, &err);
1462 MSG_WARN_M(U_FAILURE(err), "ucnv_open() Failed(%d), enc=%s", err, enc);
1463 ucnv_toUChars(conv, temp, temp_size, val, src_len, &err);
1464 MSG_WARN_M(U_FAILURE(err), "ucnv_toUChars() Failed(%d), enc=%s", err, enc);
1467 dest_size = temp_size*2;
1468 dest = (char *)malloc(dest_size);
1469 conv = ucnv_open("UTF-8", &err);
1470 MSG_WARN_M(U_FAILURE(err), "ucnv_open() Failed(%d), enc=%s", err, enc);
1471 ucnv_fromUChars(conv, dest, dest_size, temp, u_strlen(temp), &err);
1472 MSG_WARN_M(U_FAILURE(err), "ucnv_fromUChars() Failed(%d), enc=%s", err, enc);
1481 static void __msgsvc_vmsg_get_prefix(char **prefix, char *src)
1483 char *temp = strchr(src, ':');
1485 long len = (long)temp - (long)src;
1486 *prefix = (char *)calloc(len+1, sizeof(char));
1487 snprintf(*prefix, len+1, "%s", src);
1494 static void __msgsvc_vmsg_remove_spec_out(char **prefix)
1508 static char* __msgsvc_vmsg_get_val(int ver, char *src, char **prefix, char **dest)
1514 MSG_ERR_RET_VM(NULL == src, NULL, "Invalid parameter : The src is NULL.");
1515 MSG_ERR_RET_VM(NULL == dest, NULL, "sInvalid parameter : The dest is NULL.");
1534 if (MSGSVC_VMSG_VER_1_1 == ver) {
1536 if ('=' == *cursor && __msgsvc_vmsg_check_quoted(src, cursor - src, "ed)) {
1537 if ('\r' == *(cursor+1) && '\n' == *(cursor+2))
1540 if ('\r' == *cursor && '\n' == *(cursor+1) && ' ' != *(cursor+2))
1542 if ('\n' == *cursor && ' ' != *(cursor+1))
1551 if ('\r' == *cursor && '\n' == *(cursor+1) && ' ' != *(cursor+2))
1554 if ('\n' == *cursor && ' ' != *(cursor+1))
1561 if (src == cursor) {
1567 char temp = *cursor;
1571 __msgsvc_vmsg_get_prefix(prefix, src);
1573 __msgsvc_vmsg_remove_spec_out(prefix);
1576 *dest = strdup(src);
1577 if (MSGSVC_VMSG_VER_1_1 != ver)
1578 __msgsvc_vmsg_remove_folding(*dest);
1580 if (__msgsvc_vmsg_check_quoted(*dest, -1, "ed))
1581 len = __msgsvc_vmsg_decode_quoted_val(*dest);
1583 len = strlen(*dest);
1584 new_dest = __msgsvc_vmsg_translate_charset(*dest, len);
1590 return (cursor + 1);
1594 static int __msgsvc_vmsg_check_content_type(char **vcard)
1598 for (i = VMSG_VALUE_NONE+1; i < VMSG_MAXIMUM_VALUE; i++) {
1599 new_start = __msgsvc_vmsg_check_word(*vcard, content_name[i]);
1600 if (new_start && (':' == *new_start || ';' == *new_start))
1604 if (VMSG_MAXIMUM_VALUE == i)
1605 return VMSG_VALUE_NONE;
1612 static inline bool __msgsvc_vmsg_check_base64_encoded(char *src)
1619 ret = strncmp(tmp, "BASE64", sizeof("BASE64") - 1);
1622 } else if (':' == *tmp || '\r' == *tmp) {
1630 static char* __msgsvc_vmsg_decode_base64_val(char *val)
1633 guchar *decoded_str;
1637 src = strchr(val, ':');
1643 decoded_str = g_base64_decode(src, &size);
1645 dest = (char *)calloc((src-val)+size+1, sizeof(char));
1646 snprintf(dest, (src-val)+1, "%s", val);
1647 snprintf(dest+(src-val), size+1, "%s", decoded_str);
1648 g_free(decoded_str);
1653 static inline char* __msgsvc_vmsg_pass_unsupported(char *vmsg)
1664 static inline char* __msgsvc_vmsg_get_content_value(char *val)
1668 temp = strchr(val, ':');
1674 MSG_ERR_RET_VM('\0' == *(temp) || '\r' == *(temp) || '\n' == *(temp),
1675 NULL, "Invalid vcard content");
1680 static char* __msgsvc_vmsg_remove_escape_char(char *str)
1682 const char *s = SAFE_STR(str);
1683 char *r = (char *)s;
1685 if (*s == '\\' && *(s+1)) {
1686 char *n = (char*)(s+1);
1702 case 0xA1: /* en/em backslash */
1703 if (*(n+1) && 0xAC == *(n+1)) {
1710 case 0x81: /* en/em backslash */
1711 if (*(n+1) && 0x5F == *(n+1)) {
1734 static inline msg_error_t __msgsvc_vmsg_get_read_status(MSG_MESSAGE_INFO_S *pMsg, char *val)
1738 temp = __msgsvc_vmsg_get_content_value(val);
1739 MSG_ERR_RET_VM(NULL == temp, MSG_ERR_INVALID_PARAMETER, "Invalid parameter : read status");
1741 temp = __msgsvc_vmsg_remove_escape_char(temp);
1743 if (strcmp(temp, content_name[VMSG_INDICATION_READ_STATUS_READ]) == 0)
1745 else if (strcmp(temp, content_name[VMSG_INDICATION_READ_STATUS_UNREAD]) == 0)
1746 pMsg->bRead = false;
1748 return MSG_ERR_INVALID_PARAMETER;
1750 MSG_DEBUG("pMsg->bRead = %d", pMsg->bRead);
1754 static inline msg_error_t __msgsvc_vmsg_get_msg_box(MSG_MESSAGE_INFO_S *pMsg, char *val)
1758 temp = __msgsvc_vmsg_get_content_value(val);
1759 MSG_ERR_RET_VM(NULL == temp, MSG_ERR_INVALID_PARAMETER, "Invalid parameter : msg box");
1761 temp = __msgsvc_vmsg_remove_escape_char(temp);
1763 if (strcmp(temp, content_name[VMSG_INDICATION_MSG_BOX_DRAFT]) == 0) {
1764 pMsg->folderId = MSG_DRAFT_ID;
1765 pMsg->direction = MSG_DIRECTION_TYPE_MO;
1766 pMsg->networkStatus = MSG_NETWORK_NOT_SEND;
1768 else if (strcmp(temp, content_name[VMSG_INDICATION_MSG_BOX_INBOX]) == 0) {
1769 pMsg->folderId = MSG_INBOX_ID;
1770 pMsg->direction = MSG_DIRECTION_TYPE_MT;
1771 pMsg->networkStatus = MSG_NETWORK_RECEIVED;
1772 } else if (strcmp(temp, content_name[VMSG_INDICATION_MSG_BOX_SENT]) == 0) {
1773 pMsg->folderId = MSG_SENTBOX_ID;
1774 pMsg->direction = MSG_DIRECTION_TYPE_MO;
1775 pMsg->networkStatus = MSG_NETWORK_SEND_SUCCESS;
1777 return MSG_ERR_INVALID_PARAMETER;
1779 MSG_DEBUG("pMsg->folderId = %d", pMsg->folderId);
1783 static inline msg_error_t __msgsvc_vmsg_get_msg_type(MSG_MESSAGE_INFO_S *pMsg, char *val)
1787 temp = __msgsvc_vmsg_get_content_value(val);
1788 MSG_ERR_RET_VM(NULL == temp, MSG_ERR_INVALID_PARAMETER, "Invalid parameter : msg type");
1790 temp = __msgsvc_vmsg_remove_escape_char(temp);
1792 if (strcmp(temp, content_name[VMSG_INDICATION_MESSAGE_TYPE_MSG]) == 0) {
1793 pMsg->msgType.mainType = MSG_SMS_TYPE;
1794 pMsg->msgType.subType = MSG_NORMAL_SMS;
1795 pMsg->msgType.classType = MSG_CLASS_NONE;
1797 else if (strcmp(temp, content_name[VMSG_INDICATION_MESSAGE_TYPE_INET]) == 0) {
1801 return MSG_ERR_INVALID_PARAMETER;
1803 MSG_DEBUG("pMsg->msgType.subType = %d", pMsg->msgType.subType);
1807 static inline msg_error_t __msgsvc_vmsg_get_address(MSG_MESSAGE_INFO_S *pMsg, char *prefix, char *val, int* vCardCnt)
1810 MSG_DEBUG("vCardCnt is : %d", *vCardCnt);
1811 if ((pMsg->folderId == MSG_SENTBOX_ID || pMsg->folderId == MSG_DRAFT_ID) && *vCardCnt == 1)
1814 if (pMsg->folderId == MSG_INBOX_ID && *vCardCnt > 1)
1817 temp = __msgsvc_vmsg_get_content_value(val);
1818 MSG_ERR_RET_VM(NULL == temp, MSG_ERR_INVALID_PARAMETER, "Invalid parameter : address");
1820 temp = __msgsvc_vmsg_remove_escape_char(temp);
1821 MSG_ADDRESS_INFO_S * addrInfo = NULL;
1823 pMsg->nAddressCnt++;
1824 MSG_DEBUG("Address is : %s", temp);
1825 MSG_DEBUG("Address Cnt : %d", pMsg->nAddressCnt);
1828 if (pMsg->addressList == NULL) {
1829 addrInfo = (MSG_ADDRESS_INFO_S *)calloc(1, sizeof(MSG_ADDRESS_INFO_S));
1831 addrInfo = (MSG_ADDRESS_INFO_S *)realloc(pMsg->addressList, pMsg->nAddressCnt * sizeof(MSG_ADDRESS_INFO_S));
1834 if (addrInfo == NULL) {
1835 return MSG_ERR_INVALID_PARAMETER;
1837 pMsg->addressList = addrInfo;
1839 pMsg->addressList[pMsg->nAddressCnt-1].addressType = MSG_ADDRESS_TYPE_PLMN;
1840 pMsg->addressList[pMsg->nAddressCnt-1].recipientType = MSG_RECIPIENTS_TYPE_TO;
1841 strncpy(pMsg->addressList[pMsg->nAddressCnt-1].addressVal, temp, MAX_ADDRESS_VAL_LEN);
1842 MSG_DEBUG("pMsg->addressList[pMsg->nAddressCnt-1].addressVal = %s", pMsg->addressList[pMsg->nAddressCnt-1].addressVal);
1846 static inline msg_error_t __msgsvc_vmsg_get_msg_date(MSG_MESSAGE_INFO_S *pMsg, char *val)
1850 temp = __msgsvc_vmsg_get_content_value(val);
1851 MSG_ERR_RET_VM(NULL == temp, MSG_ERR_INVALID_PARAMETER, "Invalid parameter : date");
1853 temp = __msgsvc_vmsg_remove_escape_char(temp);
1854 MSG_DEBUG("pMsg->displayTime = %s", temp);
1855 struct tm displayTime;
1856 if ( __msgsvc_vmsg_convert_vdata_to_tm_str(temp, &displayTime))
1857 pMsg->displayTime = mktime(&displayTime);
1859 pMsg->displayTime = time(NULL);
1863 static inline msg_error_t __msgsvc_vmsg_get_msg_subject(MSG_MESSAGE_INFO_S *pMsg, char *val)
1867 temp = __msgsvc_vmsg_get_content_value(val);
1868 MSG_ERR_RET_VM(NULL == temp, MSG_ERR_INVALID_PARAMETER, "Invalid parameter : subject");
1870 temp = __msgsvc_vmsg_remove_escape_char(temp);
1872 if (temp && temp[0] != '\0')
1873 strncpy(pMsg->subject, temp, MAX_SUBJECT_LEN);
1874 MSG_DEBUG("pMsg->subject = %s", pMsg->subject);
1878 static inline bool __msgsvc_vmsg_get_msg_begin(MSG_MESSAGE_INFO_S *pMsg, char *val, int *vCardCnt)
1880 pMsg->encodeType = MSG_ENCODE_AUTO;
1884 temp = __msgsvc_vmsg_get_content_value(val);
1885 MSG_ERR_RET_VM(NULL == temp, MSG_ERR_INVALID_PARAMETER, "Invalid parameter : body");
1887 temp = __msgsvc_vmsg_remove_escape_char(temp);
1889 if (temp && temp[0] != '\0' && strcmp(temp, "VCARD") == 0) {
1896 static inline bool __msgsvc_vmsg_get_msg_end(MSG_MESSAGE_INFO_S *pMsg, char *val)
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, "VMSG") == 0) {
1908 MSG_DEBUG("VMessage decoding completed");
1910 } else if (temp && temp[0] != '\0' && strcmp(temp, "VCARD") == 0) {
1911 MSG_DEBUG("VMessage decoding completed");
1917 static inline msg_error_t __msgsvc_vmsg_get_msg(int ver, char *vmsg, MSG_MESSAGE_INFO_S *record)
1920 char *cursor, *new_start, *val, *prefix;
1922 MSG_MESSAGE_INFO_S *pMsg = record;
1924 bool isDateAvailable = false;
1933 bool base64_encoded = false;
1934 char *bodyStart = cursor;
1935 type = __msgsvc_vmsg_check_content_type(&cursor);
1937 if (VMSG_VALUE_NONE == type) {
1938 if (isDateAvailable == true) {
1939 isDateAvailable = false;
1941 MSG_DEBUG("Decoding body :");
1942 bodyStart = __msgsvc_vmsg_pass_unsupported(bodyStart);
1944 char tempMsgText[MAX_MSG_TEXT_LEN + 1] = {0, };
1946 if (i >= MAX_MSG_TEXT_LEN)
1948 if (*bodyStart == 'E' && *(bodyStart+1) == 'N' && *(bodyStart+2) == 'D' && *(bodyStart+3) == ':') {
1952 tempMsgText[i] = *bodyStart;
1956 tempMsgText[i] = '\0';
1957 char * temp = __msgsvc_vmsg_remove_escape_char(tempMsgText);
1958 strcpy(pMsg->msgText, temp);
1959 MSG_DEBUG("pMsg->msgText : %s", pMsg->msgText);
1960 pMsg->dataSize = strlen(pMsg->msgText);
1961 pMsg->bTextSms = true;
1962 base64_encoded = __msgsvc_vmsg_check_base64_encoded(pMsg->msgText);
1964 if (base64_encoded) {
1965 char * decodedText = NULL;
1966 decodedText = __msgsvc_vmsg_decode_base64_val(pMsg->msgText);
1968 strncpy(pMsg->msgText, decodedText, MAX_MSG_TEXT_LEN);
1969 pMsg->dataSize = strlen(pMsg->msgText);
1972 strcpy(pMsg->msgText, "");
1980 new_start = __msgsvc_vmsg_pass_unsupported(cursor);
1990 base64_encoded = __msgsvc_vmsg_check_base64_encoded(cursor);
1992 new_start = __msgsvc_vmsg_get_val(ver, cursor, &prefix, &val);
1994 if (NULL == new_start) {
2007 if (base64_encoded) {
2008 char *temp = __msgsvc_vmsg_decode_base64_val(val);
2013 case VMSG_INDICATION_READ_STATUS:
2014 __msgsvc_vmsg_get_read_status(pMsg, val);
2016 case VMSG_INDICATION_MSG_BOX:
2017 __msgsvc_vmsg_get_msg_box(pMsg, val);
2019 case VMSG_INDICATION_MESSAGE_TYPE:
2020 __msgsvc_vmsg_get_msg_type(pMsg, val);
2022 case VMSG_VCARD_TEL:
2023 __msgsvc_vmsg_get_address(pMsg, prefix, val, &vCardCnt);
2025 case VMSG_BODY_PROPERTY_DATE:
2026 isDateAvailable = true;
2027 __msgsvc_vmsg_get_msg_date(pMsg, val);
2029 case VMSG_BODY_PROPERTY_SUBJECT:
2030 __msgsvc_vmsg_get_msg_subject(pMsg, val);
2032 case VMSG_MSG_BEGIN:
2033 end = __msgsvc_vmsg_get_msg_begin(pMsg, val, &vCardCnt);
2035 end = __msgsvc_vmsg_get_msg_end(pMsg, val);
2043 MSG_ERR("Invalid parameter : __msgsvc_vmsg_check_content_type() Failed(%d)", type);
2046 return MSG_ERR_INVALID_PARAMETER;
2053 MSG_ERR("Invalid vmsg");
2054 return MSG_ERR_INVALID_PARAMETER;
2057 msg_error_t MsgVMessageDecodeSMS(const char *vmsg_stream, MSG_MESSAGE_INFO_S *pMsg)
2063 char *vmsg = (char *)vmsg_stream;
2065 char *MMSsend, *MMSretrieve, *MMSnoti;
2067 MSG_ERR_RET_VM(NULL == vmsg_stream, MSG_ERR_INVALID_PARAMETER, "Invalid Parameter : vmsg");
2069 vmsg = __msgsvc_vmsg_check_word(vmsg, "BEGIN:VMSG");
2070 MSG_ERR_RET_VM(NULL == vmsg, MSG_ERR_INVALID_PARAMETER, "Invalid parameter : The vmsg is invalid.");
2072 /* check for mms() */
2077 MMSsend = __msgsvc_vmsg_check_word(MMSsend, "X-MESSAGE-TYPE:MMS SEND");
2078 MSG_ERR_RET_VM(NULL != MMSsend, MSG_ERR_INVALID_MESSAGE, "Invalid parameter : The vmsg format is invalid.");
2080 MMSretrieve = __msgsvc_vmsg_check_word(MMSretrieve, "X-MESSAGE-TYPE:MMS RETRIEVE");
2081 MSG_ERR_RET_VM(NULL != MMSretrieve, MSG_ERR_INVALID_MESSAGE, "Invalid parameter : The vmsg format is invalid.");
2083 MMSnoti = __msgsvc_vmsg_check_word(MMSnoti, "X-MESSAGE-TYPE:MMS NOTIFICATION");
2084 MSG_ERR_RET_VM(NULL != MMSnoti, MSG_ERR_INVALID_MESSAGE, "Invalid parameter : The vmsg format is invalid.");
2087 __msgsvc_vmsg_initial();
2089 vmsg = __msgsvc_vmsg_check_word(vmsg, "VERSION:1.1");
2090 MSG_ERR_RET_VM(NULL == vmsg, MSG_ERR_INVALID_PARAMETER, "Invalid parameter : The vmsg format is invalid.");
2092 ver = MSGSVC_VMSG_VER_1_1;
2094 ret = __msgsvc_vmsg_get_msg(ver, vmsg, pMsg);
2095 if (MSG_SUCCESS!= ret) {