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.
27 #include "MsgVMessage.h"
30 #include "MsgUtilFile.h"
31 #include "MsgUtilStorage.h"
32 #include "MsgGconfWrapper.h"
33 #include "MsgSqliteWrapper.h"
34 #include "MsgPluginManager.h"
35 #include "MsgStorageHandler.h"
37 #define MSG_DB_ACCESS_MAX_COUNT 10
38 #define MSG_DB_VERSION 2
40 /*==================================================================================================
42 ==================================================================================================*/
44 /*==================================================================================================
45 FUNCTION IMPLEMENTATION
46 ==================================================================================================*/
47 msg_error_t MsgStoConnectDB()
53 msg_error_t MsgStoDisconnectDB()
55 MsgDbHandler *dbHandle = getDbHandle();
56 if (dbHandle->disconnect() != MSG_SUCCESS) {
57 MSG_DEBUG("DB Disconnect Fail");
58 return MSG_ERR_DB_DISCONNECT;
61 MSG_DEBUG("DB Disconnect Success");
67 void MsgUpdateDBtoVer1()
69 MsgDbHandler *dbHandle = getDbHandle();
70 msg_error_t err = MSG_SUCCESS;
71 char sqlQuery[MAX_QUERY_LEN+1];
73 if (!dbHandle->checkTableExist(MSGFW_MMS_MULTIPART_TABLE_NAME)) {
74 memset(sqlQuery, 0x00, sizeof(sqlQuery));
75 snprintf(sqlQuery, sizeof(sqlQuery),
77 "_ID INTEGER PRIMARY KEY AUTOINCREMENT, "
78 "MSG_ID INTEGER NOT NULL , "
79 "SEQ INTEGER DEFAULT 0, "
84 "CONTENT_LOCATION TEXT, "
87 "TCS_LEVEL INTEGER DEFAULT -1, "
88 "MALWARE_ALLOW INTEGER DEFAULT 0, "
89 "THUMB_FILE_PATH TEXT, "
90 "FOREIGN KEY(MSG_ID) REFERENCES MSG_MESSAGE_TABLE(MSG_ID));",
91 MSGFW_MMS_MULTIPART_TABLE_NAME);
93 err = dbHandle->execQuery(sqlQuery);
95 if (err == MSG_SUCCESS)
96 MSG_SEC_DEBUG("SUCCESS : create %s.", MSGFW_MMS_MULTIPART_TABLE_NAME);
98 MSG_SEC_DEBUG("FAIL : create %s [%d].", MSGFW_MMS_MULTIPART_TABLE_NAME, err);
103 void MsgUpdateDBtoVer2()
105 MsgDbHandler *dbHandle = getDbHandle();
106 msg_error_t err = MSG_SUCCESS;
107 char sqlQuery[MAX_QUERY_LEN+1] = {0};
108 snprintf(sqlQuery, sizeof(sqlQuery),
110 "ADD COLUMN DPM_RESTRICTED INTEGER DEFAULT 0;",
111 MSGFW_MESSAGE_TABLE_NAME);
113 err = dbHandle->execQuery(sqlQuery);
115 if (err == MSG_SUCCESS)
116 MSG_SEC_DEBUG("SUCCESS : alter %s.", MSGFW_MESSAGE_TABLE_NAME);
118 MSG_SEC_DEBUG("FAIL : create %s [%d].", MSGFW_MESSAGE_TABLE_NAME, err);
120 memset(sqlQuery, 0x00, sizeof(sqlQuery));
121 snprintf(sqlQuery, sizeof(sqlQuery),
123 "ADD COLUMN SERIAL_NUM INTEGER NOT NULL;",
124 MSGFW_CB_MSG_TABLE_NAME);
126 err = dbHandle->execQuery(sqlQuery);
128 if (err == MSG_SUCCESS)
129 MSG_SEC_DEBUG("SUCCESS : alter %s.", MSGFW_CB_MSG_TABLE_NAME);
131 MSG_SEC_DEBUG("FAIL : create %s [%d].", MSGFW_CB_MSG_TABLE_NAME, err);
135 void MsgStoUpdateDBVersion()
137 MsgDbHandler *dbHandle = getDbHandle();
138 char sqlQuery[MAX_QUERY_LEN+1];
140 snprintf(sqlQuery, sizeof(sqlQuery), "PRAGMA user_version=%d;", MSG_DB_VERSION);
142 if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
143 MSG_DEBUG("Fail to prepareQuery.");
147 if (dbHandle->stepQuery() == MSG_ERR_DB_STEP) {
148 MSG_DEBUG("Fail to stepQuery.");
149 dbHandle->finalizeQuery();
153 dbHandle->finalizeQuery();
156 msg_error_t MsgStoDBVerCheck()
158 MsgDbHandler *dbHandle = getDbHandle();
159 #if 1 /* TODO: need to improve this code later */
160 int cnt = MSG_DB_ACCESS_MAX_COUNT;
162 if (dbHandle->connect() == MSG_SUCCESS)
166 MSG_ERR("db connect try count over %d", MSG_DB_ACCESS_MAX_COUNT);
167 return MSG_ERR_DB_CONNECT;
170 MSG_DEBUG("waiting for mount /opt/usr/ cnt [%d]", cnt);
176 char sqlQuery[MAX_QUERY_LEN+1];
178 snprintf(sqlQuery, sizeof(sqlQuery), "PRAGMA user_version;");
180 if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
181 MSG_DEBUG("Fail to prepareQuery.");
182 return MSG_ERR_DB_EXEC;
185 if (dbHandle->stepQuery() == MSG_ERR_DB_STEP) {
186 MSG_DEBUG("Fail to stepQuery.");
187 dbHandle->finalizeQuery();
188 return MSG_ERR_DB_EXEC;
191 dbVersion = dbHandle->columnInt(0);
193 dbHandle->finalizeQuery();
195 MSG_DEBUG("dbVersion [%d]", dbVersion);
205 MsgStoUpdateDBVersion();
212 void MsgInitMmapMutex(const char *shm_file_name)
217 MSG_FATAL("EMAIL_ERROR_INVALID_PARAM");
221 int fd = shm_open(shm_file_name, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP); /* note: permission is not working */
224 MSG_FATAL("shm_open errno [%d]", errno);
229 MSG_DEBUG("** Create SHM FILE **");
230 if (ftruncate(fd, sizeof(pthread_mutex_t)) != 0) {
231 MSG_FATAL("ftruncate errno [%d]", errno);
235 pthread_mutex_t *mx = (pthread_mutex_t *)mmap(NULL, sizeof(pthread_mutex_t), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
236 if (mx == MAP_FAILED) {
237 MSG_FATAL("mmap errno [%d]", errno);
241 /* initialize the data on mmap */
242 pthread_mutexattr_t mattr;
243 pthread_mutexattr_init(&mattr);
244 pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED);
245 pthread_mutexattr_setrobust(&mattr, PTHREAD_MUTEX_ROBUST_NP);
246 pthread_mutex_init(mx, &mattr);
247 pthread_mutexattr_destroy(&mattr);
251 if (munmap((void *)mx, sizeof(pthread_mutex_t)) != 0) {
252 MSG_FATAL("munmap() failed! (errno: %d)", errno);
259 msg_error_t MsgStoInitDB(bool bSimChanged)
262 /* MsgDbHandler *dbHandle = getDbHandle(); */
263 msg_error_t err = MSG_SUCCESS;
265 /* Init mmap mutex for DB access */
266 MsgInitMmapMutex(SHM_FILE_FOR_DB_LOCK);
268 /* Check DB version. */
271 /* Delete Msgs in Hidden Folder */
272 MsgStoDeleteAllMessageInFolder(0, true, NULL);
274 /* Reset network status */
275 MsgStoResetNetworkStatus();
278 /* Reset Cb Message */
279 MsgStoResetCBMessage();
282 /*clear abnormal mms message */
283 MsgStoCleanAbnormalMmsData();
285 /* Clear all old Sim data */
286 MsgStoClearSimMessageInDB();
288 /*update sim index to 0 for all messages */
297 msg_error_t MsgAddDefaultFolders()
302 char sqlQuery[MAX_QUERY_LEN+1];
303 MsgDbHandler *dbHandle = getDbHandle();
305 memset(sqlQuery, 0x00, sizeof(sqlQuery));
306 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(*) FROM %s WHERE FOLDER_ID = %d;",
307 MSGFW_FOLDER_TABLE_NAME, MSG_INBOX_ID);
309 if (dbHandle->getTable(sqlQuery, &nRowCnt, NULL) != MSG_SUCCESS) {
310 dbHandle->freeTable();
311 return MSG_ERR_DB_GETTABLE;
314 nResult = dbHandle->getColumnToInt(1);
316 dbHandle->freeTable();
319 memset(sqlQuery, 0x00, sizeof(sqlQuery));
320 snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, 'INBOX', %d);",
321 MSGFW_FOLDER_TABLE_NAME, MSG_INBOX_ID, MSG_FOLDER_TYPE_INBOX);
323 if (dbHandle->execQuery(sqlQuery) != MSG_SUCCESS)
324 return MSG_ERR_DB_EXEC;
328 memset(sqlQuery, 0x00, sizeof(sqlQuery));
329 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(*) FROM %s WHERE FOLDER_ID = %d;",
330 MSGFW_FOLDER_TABLE_NAME, MSG_OUTBOX_ID);
332 if (dbHandle->getTable(sqlQuery, &nRowCnt, NULL) != MSG_SUCCESS) {
333 dbHandle->freeTable();
334 return MSG_ERR_DB_GETTABLE;
337 nResult = dbHandle->getColumnToInt(1);
339 dbHandle->freeTable();
342 memset(sqlQuery, 0x00, sizeof(sqlQuery));
343 snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, 'OUTBOX', %d);",
344 MSGFW_FOLDER_TABLE_NAME, MSG_OUTBOX_ID, MSG_FOLDER_TYPE_OUTBOX);
346 if (dbHandle->execQuery(sqlQuery) != MSG_SUCCESS)
347 return MSG_ERR_DB_EXEC;
351 memset(sqlQuery, 0x00, sizeof(sqlQuery));
352 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(*) FROM %s WHERE FOLDER_ID = %d;",
353 MSGFW_FOLDER_TABLE_NAME, MSG_SENTBOX_ID);
355 if (dbHandle->getTable(sqlQuery, &nRowCnt, NULL) != MSG_SUCCESS) {
356 dbHandle->freeTable();
357 return MSG_ERR_DB_GETTABLE;
360 nResult = dbHandle->getColumnToInt(1);
362 dbHandle->freeTable();
365 memset(sqlQuery, 0x00, sizeof(sqlQuery));
366 snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, 'SENTBOX', %d);",
367 MSGFW_FOLDER_TABLE_NAME, MSG_SENTBOX_ID, MSG_FOLDER_TYPE_OUTBOX);
369 if (dbHandle->execQuery(sqlQuery) != MSG_SUCCESS)
370 return MSG_ERR_DB_EXEC;
374 memset(sqlQuery, 0x00, sizeof(sqlQuery));
375 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(*) FROM %s WHERE FOLDER_ID = %d;",
376 MSGFW_FOLDER_TABLE_NAME, MSG_DRAFT_ID);
378 if (dbHandle->getTable(sqlQuery, &nRowCnt, NULL) != MSG_SUCCESS) {
379 dbHandle->freeTable();
380 return MSG_ERR_DB_GETTABLE;
383 nResult = dbHandle->getColumnToInt(1);
385 dbHandle->freeTable();
388 memset(sqlQuery, 0x00, sizeof(sqlQuery));
389 snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, 'DRAFT', %d);",
390 MSGFW_FOLDER_TABLE_NAME, MSG_DRAFT_ID, MSG_FOLDER_TYPE_DRAFT);
392 if (dbHandle->execQuery(sqlQuery) != MSG_SUCCESS)
393 return MSG_ERR_DB_EXEC;
397 memset(sqlQuery, 0x00, sizeof(sqlQuery));
398 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(*) FROM %s WHERE FOLDER_ID = %d;",
399 MSGFW_FOLDER_TABLE_NAME, MSG_CBMSGBOX_ID);
401 if (dbHandle->getTable(sqlQuery, &nRowCnt, NULL) != MSG_SUCCESS) {
402 dbHandle->freeTable();
403 return MSG_ERR_DB_GETTABLE;
406 nResult = dbHandle->getColumnToInt(1);
408 dbHandle->freeTable();
411 memset(sqlQuery, 0x00, sizeof(sqlQuery));
412 snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, 'CBMSGBOX', %d);",
413 MSGFW_FOLDER_TABLE_NAME, MSG_CBMSGBOX_ID, MSG_FOLDER_TYPE_INBOX);
415 if (dbHandle->execQuery(sqlQuery) != MSG_SUCCESS)
416 return MSG_ERR_DB_EXEC;
420 memset(sqlQuery, 0x00, sizeof(sqlQuery));
421 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(*) FROM %s WHERE FOLDER_ID = %d;",
422 MSGFW_FOLDER_TABLE_NAME, MSG_SPAMBOX_ID);
424 if (dbHandle->getTable(sqlQuery, &nRowCnt, NULL) != MSG_SUCCESS) {
425 dbHandle->freeTable();
426 return MSG_ERR_DB_GETTABLE;
429 nResult = dbHandle->getColumnToInt(1);
431 dbHandle->freeTable();
434 memset(sqlQuery, 0x00, sizeof(sqlQuery));
435 snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, 'SPAMBOX', %d);",
436 MSGFW_FOLDER_TABLE_NAME, MSG_SPAMBOX_ID, MSG_FOLDER_TYPE_SPAMBOX);
438 if (dbHandle->execQuery(sqlQuery) != MSG_SUCCESS)
439 return MSG_ERR_DB_EXEC;
446 msg_error_t MsgAddDefaultAddress()
449 MsgDbHandler *dbHandle = getDbHandle();
450 int nRowCnt = 0, nResult = 0;
452 char sqlQuery[MAX_QUERY_LEN+1];
454 memset(sqlQuery, 0x00, sizeof(sqlQuery));
455 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(*) FROM %s WHERE ADDRESS_ID = 0;",
456 MSGFW_ADDRESS_TABLE_NAME);
458 if (dbHandle->getTable(sqlQuery, &nRowCnt, NULL) != MSG_SUCCESS) {
459 dbHandle->freeTable();
460 return MSG_ERR_DB_GETTABLE;
463 nResult = dbHandle->getColumnToInt(1);
465 dbHandle->freeTable();
468 memset(sqlQuery, 0x00, sizeof(sqlQuery));
469 snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (0, 0, 0, 0, '', 0, 0, '', '', '', '', '', '', 0);",
470 MSGFW_ADDRESS_TABLE_NAME);
472 MSG_DEBUG("%s", sqlQuery);
474 if (dbHandle->execQuery(sqlQuery) != MSG_SUCCESS)
475 return MSG_ERR_DB_EXEC;
484 msg_error_t MsgStoResetDatabase()
486 MsgDbHandler *dbHandle = getDbHandle();
487 msg_error_t err = MSG_SUCCESS;
489 char sqlQuery[MAX_QUERY_LEN+1];
491 const char* tableList[] = {MSGFW_FOLDER_TABLE_NAME, MSGFW_FILTER_TABLE_NAME,
492 MSGFW_PUSH_MSG_TABLE_NAME, MSGFW_CB_MSG_TABLE_NAME,
493 MMS_PLUGIN_MESSAGE_TABLE_NAME, MSGFW_SYNCML_MSG_TABLE_NAME,
494 MSGFW_SMS_SENDOPT_TABLE_NAME};
496 int listCnt = sizeof(tableList)/sizeof(char*);
498 dbHandle->beginTrans();
500 /* Delete Database */
501 for (int i = 0; i < listCnt; i++) {
502 memset(sqlQuery, 0x00, sizeof(sqlQuery));
503 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s;", tableList[i]);
505 if (dbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
506 dbHandle->endTrans(false);
507 return MSG_ERR_DB_EXEC;
511 /* Delete Message Table */
512 memset(sqlQuery, 0x00, sizeof(sqlQuery));
513 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE STORAGE_ID <> %d;",
514 MSGFW_MESSAGE_TABLE_NAME, MSG_STORAGE_SIM);
516 if (dbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
517 dbHandle->endTrans(false);
518 return MSG_ERR_DB_EXEC;
521 /* Delete Conversation Table */
522 err = MsgStoClearConversationTable(dbHandle);
524 if (err != MSG_SUCCESS) {
525 dbHandle->endTrans(false);
529 /* Add Default Folders */
530 if (MsgAddDefaultFolders() != MSG_SUCCESS) {
531 MSG_DEBUG("Add Default Folders Fail");
532 dbHandle->endTrans(false);
533 return MSG_ERR_DB_STORAGE_INIT;
536 /* Add Default Address */
537 if (MsgAddDefaultAddress() != MSG_SUCCESS) {
538 MSG_DEBUG("Add Default Address Fail");
539 dbHandle->endTrans(false);
540 return MSG_ERR_DB_STORAGE_INIT;
543 dbHandle->endTrans(true);
545 /* Delete MMS Files */
546 MsgRmRf((char*)MSG_DATA_PATH);
547 MsgRmRf((char*)MSG_SMIL_FILE_PATH);
549 /* Reset SMS Count */
550 if (MsgSettingSetIndicator(0, 0) != MSG_SUCCESS) {
551 MSG_DEBUG("MsgSettingSetIndicator() FAILED");
552 return MSG_ERR_SET_SETTING;
555 /* Reset MMS Count */
556 if (MsgSettingSetIndicator(0, 0) != MSG_SUCCESS) {
557 MSG_DEBUG("MsgSettingSetIndicator() FAILED");
558 return MSG_ERR_SET_SETTING;
565 msg_error_t MsgStoBackupMessage(msg_message_backup_type_t type, const char *filepath)
567 MsgDbHandler *dbHandle = getDbHandle();
568 msg_error_t err = MSG_SUCCESS;
570 char sqlQuery[MAX_QUERY_LEN+1];
572 MSG_MESSAGE_INFO_S msgInfo = {0, };
573 char* encoded_data = NULL;
575 char fileName[MSG_FILENAME_LEN_MAX+1];
576 memset(fileName, 0x00, sizeof(fileName));
577 strncpy(fileName, filepath, MSG_FILENAME_LEN_MAX);
578 if (remove(fileName) != 0) {
579 MSG_SEC_DEBUG("Fail to delete [%s].", fileName);
582 memset(sqlQuery, 0x00, sizeof(sqlQuery));
584 MSG_SEC_DEBUG("backup type = %d, path = %s", type, filepath);
586 if (type == MSG_BACKUP_TYPE_SMS) {
587 snprintf(sqlQuery, sizeof(sqlQuery),
588 "SELECT MSG_ID FROM %s "
589 "WHERE STORAGE_ID = %d AND MAIN_TYPE = %d;",
590 MSGFW_MESSAGE_TABLE_NAME, MSG_STORAGE_PHONE, MSG_SMS_TYPE);
591 } else if (type == MSG_BACKUP_TYPE_MMS) {
592 snprintf(sqlQuery, sizeof(sqlQuery),
593 "SELECT MSG_ID FROM %s "
594 "WHERE STORAGE_ID = %d AND MAIN_TYPE = %d;",
595 MSGFW_MESSAGE_TABLE_NAME, MSG_STORAGE_PHONE, MSG_MMS_TYPE);
596 } else if (type == MSG_BACKUP_TYPE_ALL) {
597 snprintf(sqlQuery, sizeof(sqlQuery),
598 "SELECT MSG_ID FROM %s "
599 "WHERE STORAGE_ID = %d;",
600 MSGFW_MESSAGE_TABLE_NAME, MSG_STORAGE_PHONE);
603 err = dbHandle->getTable(sqlQuery, &rowCnt, NULL);
605 if (err != MSG_SUCCESS) {
606 dbHandle->freeTable();
610 MSG_DEBUG("backup number = %d", rowCnt);
613 for (int i = 0; i < rowCnt; i++) {
614 msg_id[i] = dbHandle->getColumnToInt(i+1);
616 dbHandle->freeTable();
618 for (int i = 0; i < rowCnt; i++) {
619 msgInfo.addressList = NULL;
620 unique_ptr<MSG_ADDRESS_INFO_S*, void(*)(MSG_ADDRESS_INFO_S**)> addressListBuf(&msgInfo.addressList, unique_ptr_deleter);
622 err = MsgStoGetMessage(msg_id[i], &msgInfo, NULL);
623 if(err != MSG_SUCCESS) {
627 encoded_data = MsgVMessageEncode(&msgInfo);
629 if (msgInfo.bTextSms == false)
630 MsgDeleteFile(msgInfo.msgData); /*ipc */
632 if (encoded_data != NULL) {
633 if (MsgAppendFile(fileName, encoded_data, strlen(encoded_data)) == false) {
635 return MSG_ERR_STORAGE_ERROR;
640 if (chmod(fileName, 0666) == -1) {
641 MSG_FATAL("chmod: %s", g_strerror(errno));
642 return MSG_ERR_UNKNOWN;
646 memset(&msgInfo, 0, sizeof(MSG_MESSAGE_INFO_S));
653 msg_error_t MsgStoUpdateMms(MSG_MESSAGE_INFO_S *pMsg)
655 MsgDbHandler *dbHandle = getDbHandle();
656 msg_error_t err = MSG_SUCCESS;
657 char sqlQuery[MAX_QUERY_LEN+1];
658 unsigned int fileSize = 0;
659 char *pFileData = NULL;
661 if (pMsg->msgType.subType == MSG_SENDCONF_MMS) {
662 memset(sqlQuery, 0x00, sizeof(sqlQuery));
664 dbHandle->beginTrans();
665 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET THUMB_PATH = ?, MSG_TEXT = ? WHERE MSG_ID = %d;",
666 MSGFW_MESSAGE_TABLE_NAME, pMsg->msgId);
668 if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
669 dbHandle->endTrans(false);
670 return MSG_ERR_DB_EXEC;
673 dbHandle->bindText(pMsg->thumbPath, 1);
675 if (pMsg->msgText[0] != '\0' && g_file_get_contents((gchar*)pMsg->msgText, (gchar**)&pFileData, (gsize*)&fileSize, NULL) == true) {
676 dbHandle->bindText(pFileData, 2);
679 MSG_SEC_DEBUG("thumbPath = %s , msgText = %s" , pMsg->thumbPath, pFileData);
681 MSG_DEBUG("%s", sqlQuery);
683 if (dbHandle->stepQuery() != MSG_ERR_DB_DONE) {
684 dbHandle->finalizeQuery();
685 dbHandle->endTrans(false);
691 return MSG_ERR_DB_EXEC;
694 dbHandle->finalizeQuery();
695 dbHandle->endTrans(true);
702 err = MsgStoUpdateMMSMessage(pMsg);
703 if (err != MSG_SUCCESS) {
704 MSG_DEBUG("MsgStoUpdateMMSMessage() error : %d", err);
711 msg_error_t MsgStoRestoreMessage(const char *filepath, msg_id_list_s **result_id_list)
713 if (result_id_list == NULL) {
714 MSG_ERR("result_id_list is NULL");
715 return MSG_ERR_NULL_POINTER;
718 msg_error_t err = MSG_SUCCESS;
719 MSG_MESSAGE_INFO_S msgInfo = {0, };
720 unique_ptr<MSG_ADDRESS_INFO_S*, void(*)(MSG_ADDRESS_INFO_S**)> addressListBuf(&msgInfo.addressList, unique_ptr_deleter);
723 VObject* pObject = NULL;
726 msg_id_list_s *msgIdList = NULL;
727 msgIdList = (msg_id_list_s *)calloc(1, sizeof(msg_id_list_s));
731 char fileName[MSG_FILENAME_LEN_MAX+1];
733 char *pCurrent = NULL;
736 *result_id_list = NULL;
739 char sample[10000] = "BEGIN:VMSG\r\nX-MESSAGE-TYPE:SMS\r\nX-IRMC-BOX:INBOX\r\nX-SS-DT:20100709T155811Z\r\nBEGIN:VBODY\r\nX-BODY-SUBJECT:hekseh\r\nX-BODY-CONTENTS;ENCODING=BASE64:aGVsbG93b3JsZA==\r\nEND:VBODY\r\nBEGIN:VCARD\r\nVERSION:2.1\r\nTEL:01736510664\r\nEND:VCARD\r\nEND:VMSG\r\n";
740 vMsg = vmsg_decode(sample);
742 memset(fileName, 0x00, sizeof(fileName));
743 strncpy(fileName, filepath, MSG_FILENAME_LEN_MAX);
744 pData = MsgOpenAndReadMmsFile(fileName, 0, -1, &dataSize);
747 if (msgIdList->msgIdList)
748 free(msgIdList->msgIdList);
751 return MSG_ERR_STORAGE_ERROR;
756 while ((pTemp = strstr(pCurrent, "END:VMSG")) != NULL) {
758 MSG_DEBUG("Start Position: %s", pCurrent);
760 while (*pCurrent == '\r' || *pCurrent == '\n')
763 MSG_DEBUG("Start Position2: %s", pCurrent);
765 /*decodes if it is sms */
766 err = MsgVMessageDecodeSMS(pCurrent, &msgInfo);
768 /*decode if it is mms */
769 if (err == MSG_ERR_INVALID_MESSAGE) {
770 MSG_DEBUG("Vmsg is not an SMS, decoding for MMS...");
771 vMsg = vmsg_decode(pCurrent);
773 } else if (err != MSG_SUCCESS) {
774 MSG_ERR("Vmsg is an SMS, but format not supported.");
778 if (vMsg == NULL && isMMS) {
779 MSG_ERR("Vmsg is an MMS, but format not supported.");
780 err = MSG_ERR_STORAGE_ERROR;
786 pObject = vMsg->pTop;
787 memset(&msgInfo, 0x00, sizeof(MSG_MESSAGE_INFO_S));
792 MSG_DEBUG("pObject type [%d], pObject Value [%s]", pObject->property, pObject->pszValue[0]);
794 switch (pObject->property) {
795 case VMSG_TYPE_MSGTYPE : {
796 if (!strncmp(pObject->pszValue[0], "MMS RETRIEVED", strlen("MMS RETRIEVED"))) {
797 msgInfo.msgType.mainType = MSG_MMS_TYPE;
798 msgInfo.msgType.subType = MSG_RETRIEVE_AUTOCONF_MMS;
799 } else if (!strncmp(pObject->pszValue[0], "MMS SEND", strlen("MMS SEND"))) {
800 msgInfo.msgType.mainType = MSG_MMS_TYPE;
801 msgInfo.msgType.subType = MSG_SENDCONF_MMS;
802 } else if (!strncmp(pObject->pszValue[0], "MMS NOTIFICATION", strlen("MMS NOTIFICATION"))) {
803 msgInfo.msgType.mainType = MSG_MMS_TYPE;
804 msgInfo.msgType.subType = MSG_NOTIFICATIONIND_MMS;
806 vmsg_free_vtree_memory(vMsg);
807 err = MSG_ERR_STORAGE_ERROR;
813 case VMSG_TYPE_MSGBOX : {
814 if (!strncmp(pObject->pszValue[0], "INBOX", strlen("INBOX"))) {
815 msgInfo.folderId = MSG_INBOX_ID;
816 msgInfo.direction = MSG_DIRECTION_TYPE_MT;
818 if (msgInfo.msgType.subType == MSG_RETRIEVE_AUTOCONF_MMS)
819 msgInfo.networkStatus = MSG_NETWORK_RETRIEVE_SUCCESS;
820 else if (msgInfo.msgType.subType == MSG_SENDCONF_MMS)
821 msgInfo.networkStatus = MSG_NETWORK_SEND_SUCCESS;
823 msgInfo.networkStatus = MSG_NETWORK_RECEIVED;
825 } else if (!strncmp(pObject->pszValue[0], "OUTBOX", strlen("OUTBOX"))) {
826 msgInfo.folderId = MSG_OUTBOX_ID;
827 msgInfo.direction = MSG_DIRECTION_TYPE_MO;
829 msgInfo.networkStatus = MSG_NETWORK_SEND_FAIL;
830 } else if (!strncmp(pObject->pszValue[0], "SENTBOX", strlen("SENTBOX"))) {
831 msgInfo.folderId = MSG_SENTBOX_ID;
832 msgInfo.direction = MSG_DIRECTION_TYPE_MO;
834 msgInfo.networkStatus = MSG_NETWORK_SEND_SUCCESS;
835 } else if (!strncmp(pObject->pszValue[0], "DRAFTBOX", strlen("DRAFTBOX"))) {
836 msgInfo.folderId = MSG_DRAFT_ID;
837 msgInfo.direction = MSG_DIRECTION_TYPE_MO;
839 msgInfo.networkStatus = MSG_NETWORK_NOT_SEND;
841 vmsg_free_vtree_memory(vMsg);
842 err = MSG_ERR_STORAGE_ERROR;
848 case VMSG_TYPE_STATUS : {
849 if(!strncmp(pObject->pszValue[0], "READ", strlen("READ"))) {
850 msgInfo.bRead = true;
851 } else if (!strncmp(pObject->pszValue[0], "UNREAD", strlen("UNREAD"))) {
852 msgInfo.bRead = false;
854 vmsg_free_vtree_memory(vMsg);
855 err = MSG_ERR_STORAGE_ERROR;
861 case VMSG_TYPE_DATE : {
862 struct tm displayTime;
864 if (!_convert_vdata_str_to_tm(pObject->pszValue[0], &displayTime)) {
865 vmsg_free_vtree_memory(vMsg);
866 err = MSG_ERR_STORAGE_ERROR;
870 msgInfo.displayTime = mktime(&displayTime);
874 case VMSG_TYPE_SUBJECT : {
875 MSG_DEBUG("subject length is [%d].", strlen(pObject->pszValue[0]));
877 if(strlen(pObject->pszValue[0]) > 0) {
878 strncpy(msgInfo.subject, pObject->pszValue[0], MAX_SUBJECT_LEN);
879 if ( msgInfo.subject[strlen(pObject->pszValue[0])-1] == '\r' )
880 msgInfo.subject[strlen(pObject->pszValue[0])-1] = '\0';
885 case VMSG_TYPE_BODY : {
886 if (msgInfo.msgType.mainType == MSG_MMS_TYPE) {
887 msgInfo.bTextSms = true;
889 if(msgInfo.msgType.subType == MSG_NOTIFICATIONIND_MMS) {
890 msgInfo.bTextSms = true;
892 /* Save Message Data into File */
893 char fileName[MAX_COMMON_INFO_SIZE+1];
894 memset(fileName, 0x00, sizeof(fileName));
896 if (MsgCreateFileName(fileName) == false) {
897 vmsg_free_vtree_memory(vMsg);
898 return MSG_ERR_STORAGE_ERROR;
901 if (MsgWriteIpcFile(fileName, pObject->pszValue[0], pObject->numOfBiData) == false) {
902 vmsg_free_vtree_memory(vMsg);
903 return MSG_ERR_STORAGE_ERROR;
905 strncpy(msgInfo.msgData, MSG_IPC_DATA_PATH, MAX_MSG_DATA_LEN);
906 strncat(msgInfo.msgData, fileName, MAX_MSG_DATA_LEN-strlen(msgInfo.msgData));
907 msgInfo.dataSize = strlen(fileName);
908 MsgPlugin* plg = MsgPluginManager::instance()->getPlugin(msgInfo.msgType.mainType);
910 vmsg_free_vtree_memory(vMsg);
911 return MSG_ERR_NULL_POINTER;
913 err = plg->restoreMsg(&msgInfo, pObject->pszValue[0], pObject->numOfBiData, NULL);
916 /** From here was avaliable */
917 char retrievedFilePath[MAX_FULL_PATH_SIZE] = {0, };
918 MsgPlugin* plg = MsgPluginManager::instance()->getPlugin(msgInfo.msgType.mainType);
920 vmsg_free_vtree_memory(vMsg);
921 return MSG_ERR_NULL_POINTER;
923 err = plg->restoreMsg(&msgInfo, pObject->pszValue[0], pObject->numOfBiData, retrievedFilePath);
924 msgInfo.bTextSms = false;
926 char fileName[MAX_COMMON_INFO_SIZE+1];
927 memset(fileName, 0x00, sizeof(fileName));
929 if (MsgCreateFileName(fileName) == false) {
930 vmsg_free_vtree_memory(vMsg);
931 return MSG_ERR_STORAGE_ERROR;
933 MSG_SEC_DEBUG("fileName: %s, retrievedFilePath: %s (%d)", fileName, retrievedFilePath, strlen(retrievedFilePath));
935 if (MsgWriteIpcFile(fileName, retrievedFilePath, strlen(retrievedFilePath)+ 1) == false) {
936 vmsg_free_vtree_memory(vMsg);
937 return MSG_ERR_STORAGE_ERROR;
939 strncpy(msgInfo.msgData, fileName, MAX_MSG_DATA_LEN);
940 msgInfo.dataSize = strlen(retrievedFilePath) + 1;
942 if (err != MSG_SUCCESS)
943 return vmsg_free_vtree_memory(vMsg);
947 msgInfo.bTextSms = false;
949 char fileName[MAX_COMMON_INFO_SIZE+1];
950 memset(fileName, 0x00, sizeof(fileName));
952 if (MsgCreateFileName(fileName) == false) {
953 vmsg_free_vtree_memory(vMsg);
954 err = MSG_ERR_STORAGE_ERROR;
958 if (MsgWriteIpcFile(fileName, pObject->pszValue[0], pObject->numOfBiData) == false) {
959 vmsg_free_vtree_memory(vMsg);
960 err = MSG_ERR_STORAGE_ERROR;
964 /*set serialized mms data ipcfilename */
965 strncpy(msgInfo.msgData, fileName, MAX_MSG_DATA_LEN);
971 case VCARD_TYPE_TEL : {
972 MSG_ADDRESS_INFO_S * addrInfo = NULL;
974 msgInfo.nAddressCnt++;
976 if (msgInfo.addressList == NULL) {
977 addrInfo = (MSG_ADDRESS_INFO_S *)calloc(1, sizeof(MSG_ADDRESS_INFO_S));
979 addrInfo = (MSG_ADDRESS_INFO_S *)realloc(msgInfo.addressList, msgInfo.nAddressCnt * sizeof(MSG_ADDRESS_INFO_S));
982 if (addrInfo == NULL) {
983 vmsg_free_vtree_memory(vMsg);
984 err = MSG_ERR_STORAGE_ERROR;
988 msgInfo.addressList = addrInfo;
990 msgInfo.addressList[msgInfo.nAddressCnt-1].addressType = MSG_ADDRESS_TYPE_PLMN;
991 msgInfo.addressList[msgInfo.nAddressCnt-1].recipientType = MSG_RECIPIENTS_TYPE_TO;
992 strncpy(msgInfo.addressList[msgInfo.nAddressCnt-1].addressVal, pObject->pszValue[0], MAX_ADDRESS_VAL_LEN);
997 if (pObject->pSibling != NULL)
998 pObject = pObject->pSibling;
1003 if (vMsg->pNext != NULL) {
1005 pObject = vMsg->pTop;
1011 msgInfo.bBackup = true; /* Set Backup Flag */
1012 msgInfo.storageId = MSG_STORAGE_PHONE; /* Set Storage Id */
1013 msgInfo.priority = MSG_MESSAGE_PRIORITY_NORMAL; /* Set Priority */
1015 err = MsgStoAddMessage(&msgInfo, NULL);
1016 if (err != MSG_SUCCESS) {
1017 MSG_DEBUG("MsgStoAddMessage() error : %d", err);
1020 if (msgInfo.msgType.mainType == MSG_MMS_TYPE)
1021 MsgStoUpdateMms(&msgInfo);
1023 if (msgIdList->nCount == 0) {
1024 msgIdList->msgIdList = (msg_message_id_t*)calloc(1, sizeof(msg_message_id_t));
1026 msg_message_id_t * msg_id_list;
1027 msg_id_list = (msg_message_id_t*)realloc(msgIdList->msgIdList, sizeof(msg_message_id_t)*(msgIdList->nCount+1));
1030 msgIdList->msgIdList = msg_id_list;
1032 MSG_DEBUG("realloc failed");
1033 err = MSG_ERR_UNKNOWN;
1038 msgIdList->msgIdList[msgIdList->nCount] = msgInfo.msgId;
1039 msgIdList->nCount++;
1041 vmsg_free_vtree_memory(vMsg);
1044 pCurrent = pTemp + strlen("END:VMSG");
1045 #ifndef MSG_FOR_DEBUG
1048 *result_id_list = msgIdList;
1057 if (*result_id_list == NULL && msgIdList) {
1058 if (msgIdList->msgIdList) {
1059 free(msgIdList->msgIdList);
1067 msg_error_t MsgStoAddPushEvent(MSG_PUSH_EVENT_INFO_S* pPushEvent)
1069 MsgDbHandler *dbHandle = getDbHandle();
1070 char sqlQuery[MAX_QUERY_LEN+1];
1071 unsigned int rowId = 0;
1073 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1075 /* Check whether Same record exists or not. */
1077 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT * FROM %s WHERE CONTENT_TYPE LIKE '%s' AND APP_ID LIKE '%s' AND (PKG_NAME LIKE '%s' OR SECURE = 1);",
1078 MSGFW_PUSH_CONFIG_TABLE_NAME, pPushEvent->contentType, pPushEvent->appId, pPushEvent->pkgName);
1080 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT * FROM %s WHERE CONTENT_TYPE LIKE '%s' AND APP_ID LIKE '%s';",
1081 MSGFW_PUSH_CONFIG_TABLE_NAME, pPushEvent->contentType, pPushEvent->appId);
1084 if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
1085 MSG_DEBUG("Query Failed [%s]", sqlQuery);
1086 return MSG_ERR_DB_PREPARE;
1089 if (dbHandle->stepQuery() == MSG_ERR_DB_ROW) {
1090 dbHandle->finalizeQuery();
1091 return MSG_ERR_DB_ROW;
1093 dbHandle->finalizeQuery();
1095 dbHandle->beginTrans();
1097 if (dbHandle->getRowId(MSGFW_PUSH_CONFIG_TABLE_NAME, &rowId) != MSG_SUCCESS) {
1098 MSG_DEBUG("getRowId is failed!!!");
1101 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1103 snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, ?, ?, ?, %d, 0, 0);",
1104 MSGFW_PUSH_CONFIG_TABLE_NAME, rowId, pPushEvent->bLaunch);
1107 MSG_DEBUG("QUERY : %s", sqlQuery);
1109 if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
1110 dbHandle->endTrans(false);
1111 return MSG_ERR_DB_EXEC;
1114 dbHandle->bindText(pPushEvent->contentType, 1);
1115 dbHandle->bindText(pPushEvent->appId, 2);
1116 dbHandle->bindText(pPushEvent->pkgName, 3);
1118 if (dbHandle->stepQuery() != MSG_ERR_DB_DONE) {
1119 dbHandle->finalizeQuery();
1120 dbHandle->endTrans(false);
1121 return MSG_ERR_DB_EXEC;
1124 dbHandle->finalizeQuery();
1125 dbHandle->endTrans(true);
1131 msg_error_t MsgStoDeletePushEvent(MSG_PUSH_EVENT_INFO_S* pPushEvent)
1133 MsgDbHandler *dbHandle = getDbHandle();
1134 char sqlQuery[MAX_QUERY_LEN+1];
1135 dbHandle->beginTrans();
1136 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1137 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE CONTENT_TYPE LIKE '%s' AND APP_ID LIKE '%s' AND PKG_NAME LIKE '%s';",
1138 MSGFW_PUSH_CONFIG_TABLE_NAME, pPushEvent->contentType, pPushEvent->appId, pPushEvent->pkgName);
1140 if (dbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
1141 dbHandle->endTrans(false);
1142 return MSG_ERR_DB_EXEC;
1144 dbHandle->endTrans(true);
1148 msg_error_t MsgStoUpdatePushEvent(MSG_PUSH_EVENT_INFO_S* pSrc, MSG_PUSH_EVENT_INFO_S* pDst)
1150 MsgDbHandler *dbHandle = getDbHandle();
1151 char sqlQuery[MAX_QUERY_LEN+1];
1152 dbHandle->beginTrans();
1153 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1154 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET CONTENT_TYPE = ?, APP_ID = ?, PKG_NAME = ?, LAUNCH = %d WHERE CONTENT_TYPE LIKE '%s' AND APP_ID LIKE '%s' AND PKG_NAME LIKE '%s';",
1155 MSGFW_PUSH_CONFIG_TABLE_NAME, pDst->bLaunch, pSrc->contentType, pSrc->appId, pSrc->pkgName);
1157 if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
1158 dbHandle->endTrans(false);
1159 return MSG_ERR_DB_EXEC;
1162 dbHandle->bindText(pDst->contentType, 1);
1163 dbHandle->bindText(pDst->appId, 2);
1164 dbHandle->bindText(pDst->pkgName, 3);
1166 if (dbHandle->stepQuery() != MSG_ERR_DB_DONE) {
1167 dbHandle->finalizeQuery();
1168 dbHandle->endTrans(false);
1169 return MSG_ERR_DB_EXEC;
1172 dbHandle->finalizeQuery();
1173 dbHandle->endTrans(true);