2 * Copyright 2012-2013 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.1 (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://floralicense.org/license/
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
20 #include <tr1/unordered_set>
26 #include "MsgCppTypes.h"
27 #include "MsgContact.h"
28 #include "MsgUtilFile.h"
30 #include "MsgUtilStorage.h"
31 #include "MsgSoundPlayer.h"
32 #include "MsgGconfWrapper.h"
33 #include "MsgSqliteWrapper.h"
34 #include "MsgPluginManager.h"
35 #include "MsgStorageHandler.h"
36 #include "MsgNotificationWrapper.h"
37 #include "MsgMmsMessage.h"
42 /*==================================================================================================
44 ==================================================================================================*/
45 extern MsgDbHandler dbHandle;
49 bool delNotiRunning = false;
53 bool delLogRunning = false;
56 /*==================================================================================================
58 ==================================================================================================*/
59 static gboolean updateUnreadMsgCount(void *pVoid)
66 smsCnt = MsgStoGetUnreadCnt(&dbHandle, MSG_SMS_TYPE);
67 mmsCnt = MsgStoGetUnreadCnt(&dbHandle, MSG_MMS_TYPE);
69 MsgSettingSetIndicator(smsCnt, mmsCnt);
77 /*==================================================================================================
78 FUNCTION IMPLEMENTATION
79 ==================================================================================================*/
80 msg_error_t MsgStoAddMessage(MSG_MESSAGE_INFO_S *pMsg, MSG_SENDINGOPT_INFO_S *pSendOptInfo)
84 msg_error_t err = MSG_SUCCESS;
86 unsigned int rowId = 0;
87 msg_thread_id_t convId = 0;
89 char sqlQuery[MAX_QUERY_LEN+1];
91 dbHandle.beginTrans();
93 if (pMsg->nAddressCnt > 0) {
94 err = MsgStoAddAddress(&dbHandle, pMsg, &convId);
96 if (err != MSG_SUCCESS) {
97 dbHandle.endTrans(false);
101 pMsg->threadId = convId;
104 err = dbHandle.getRowId(MSGFW_MESSAGE_TABLE_NAME, &rowId);
106 if (err != MSG_SUCCESS) {
107 dbHandle.endTrans(false);
111 pMsg->msgId = (msg_message_id_t)rowId;
115 char *pFileData = NULL;
116 AutoPtr<char> buf(&pFileData);
119 if (pMsg->bTextSms == false) {
120 if (MsgOpenAndReadFile(pMsg->msgData, &pFileData, &fileSize) == false) {
121 dbHandle.endTrans(false);
122 return MSG_ERR_STORAGE_ERROR;
124 MSG_DEBUG("file size [%d]", fileSize);
128 memset(sqlQuery, 0x00, sizeof(sqlQuery));
130 snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, %d, %d, %d, %d, %d, %ld, %d, %d, %d, %d, %d, %d, %ld, %d, ?, ?, ?, ?, 0);",
131 MSGFW_MESSAGE_TABLE_NAME, rowId, convId, pMsg->folderId, pMsg->storageId, pMsg->msgType.mainType, pMsg->msgType.subType,
132 pMsg->displayTime, pMsg->dataSize, pMsg->networkStatus, pMsg->bRead, pMsg->bProtected, pMsg->priority, pMsg->direction,
135 MSG_DEBUG("QUERY : %s", sqlQuery);
137 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS) {
138 dbHandle.endTrans(false);
139 return MSG_ERR_DB_EXEC;
142 dbHandle.bindText(pMsg->subject, 1);
144 dbHandle.bindText(pMsg->msgData, 2);
146 dbHandle.bindText(pMsg->thumbPath, 3);
148 if (pMsg->bTextSms == false)
149 dbHandle.bindText(pFileData, 4);
151 dbHandle.bindText(pMsg->msgText, 4);
153 if (dbHandle.stepQuery() != MSG_ERR_DB_DONE) {
154 dbHandle.finalizeQuery();
155 dbHandle.endTrans(false);
156 return MSG_ERR_DB_EXEC;
159 dbHandle.finalizeQuery();
161 if (pMsg->msgType.subType != MSG_SENDREQ_MMS) {
162 err = MsgStoUpdateConversation(&dbHandle, convId);
164 if (err != MSG_SUCCESS) {
165 dbHandle.endTrans(false);
170 dbHandle.endTrans(true);
172 /* In the case of MMS Message, load the MMS plugin to save MMS PDU */
173 if (pMsg->msgType.mainType == MSG_MMS_TYPE) {
174 MMS_MESSAGE_DATA_S mmsMsg;
175 memset(&mmsMsg, 0x00, sizeof(MMS_MESSAGE_DATA_S));
177 if (pMsg->msgType.subType != MSG_DELIVERYIND_MMS && pMsg->msgType.subType != MSG_READORGIND_MMS) {
178 MsgPlugin *plg = MsgPluginManager::instance()->getPlugin(MSG_MMS_TYPE);
180 err = plg->addMessage(pMsg, pSendOptInfo, pFileData);
182 if (err != MSG_SUCCESS)
183 return MSG_ERR_STORAGE_ERROR;
185 if (pMsg->msgType.subType == MSG_SENDREQ_MMS) {
186 MSG_DEBUG("pMsg->msgText: %s, pMsg->thumbPath: %s ", pMsg->msgText, pMsg->thumbPath);
188 err = MsgStoUpdateMMSMessage(pMsg);
190 if (err != MSG_SUCCESS)
191 return MSG_ERR_STORAGE_ERROR;
203 msg_error_t MsgStoUpdateMessage(MSG_MESSAGE_INFO_S *pMsg, MSG_SENDINGOPT_INFO_S *pSendOptInfo)
205 msg_error_t err = MSG_SUCCESS;
207 char sqlQuery[MAX_QUERY_LEN+1];
209 msg_thread_id_t convId = 0;
211 dbHandle.beginTrans();
213 MSG_MAIN_TYPE_T prevType;
214 memset(sqlQuery, 0x00, sizeof(sqlQuery));
215 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MAIN_TYPE FROM %s WHERE MSG_ID = %d;",
216 MSGFW_MESSAGE_TABLE_NAME, pMsg->msgId);
218 MSG_DEBUG("QUERY : %s", sqlQuery);
220 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS) {
221 dbHandle.endTrans(false);
222 return MSG_ERR_DB_PREPARE;
225 if (dbHandle.stepQuery() != MSG_ERR_DB_ROW) {
226 dbHandle.finalizeQuery();
227 dbHandle.endTrans(false);
228 return MSG_ERR_STORAGE_ERROR;
231 prevType = dbHandle.columnInt(0);
232 dbHandle.finalizeQuery();
234 //check msg type with previous type
235 if (prevType != pMsg->msgType.mainType) {
236 MSG_DEBUG("different msg type to update [prev : %d], [current : %d]", prevType, pMsg->msgType.mainType);
238 err = MsgStoDeleteMessage(pMsg->msgId, false);
239 if (err != MSG_SUCCESS) {
240 dbHandle.endTrans(false);
244 err = MsgStoAddMessage(pMsg, pSendOptInfo);
245 if (err != MSG_SUCCESS) {
246 dbHandle.endTrans(false);
250 dbHandle.endTrans(false);
254 if (pMsg->nAddressCnt > 0) {
255 err = MsgStoAddAddress(&dbHandle, pMsg, &convId);
257 if (err != MSG_SUCCESS) {
258 dbHandle.endTrans(false);
265 char *pFileData = NULL;
266 AutoPtr<char> buf(&pFileData);
269 if (pMsg->bTextSms == false) {
270 if (MsgOpenAndReadFile(pMsg->msgData, &pFileData, &fileSize) == false) {
271 dbHandle.endTrans(false);
272 return MSG_ERR_STORAGE_ERROR;
276 if (pSendOptInfo != NULL) {
277 // Get Global setting value if bSetting == false
278 if (pSendOptInfo->bSetting == false) {
279 MsgSettingGetBool(MSG_KEEP_COPY, &pSendOptInfo->bKeepCopy);
281 if (pMsg->msgType.mainType == MSG_SMS_TYPE) {
282 MsgSettingGetBool(SMS_SEND_DELIVERY_REPORT, &pSendOptInfo->bDeliverReq);
283 MsgSettingGetBool(SMS_SEND_REPLY_PATH, &pSendOptInfo->option.smsSendOptInfo.bReplyPath);
284 } else if (pMsg->msgType.mainType == MSG_MMS_TYPE) {
285 MsgSettingGetBool(MMS_SEND_DELIVERY_REPORT, &pSendOptInfo->bDeliverReq);
286 MsgSettingGetBool(MMS_SEND_READ_REPLY, &pSendOptInfo->option.mmsSendOptInfo.bReadReq);
287 pSendOptInfo->option.mmsSendOptInfo.expiryTime.time = (unsigned int)MsgSettingGetInt(MMS_SEND_EXPIRY_TIME);
289 MSG_MMS_DELIVERY_TIME_T deliveryTime = (MSG_MMS_DELIVERY_TIME_T)MsgSettingGetInt(MMS_SEND_DELIVERY_TIME);
291 if (deliveryTime == MSG_DELIVERY_TIME_CUSTOM) {
292 pSendOptInfo->option.mmsSendOptInfo.bUseDeliveryCustomTime = true;
293 pSendOptInfo->option.mmsSendOptInfo.deliveryTime.time = (unsigned int)MsgSettingGetInt(MMS_SEND_CUSTOM_DELIVERY);
295 pSendOptInfo->option.mmsSendOptInfo.bUseDeliveryCustomTime = false;
296 pSendOptInfo->option.mmsSendOptInfo.deliveryTime.time = (unsigned int)deliveryTime;
299 pSendOptInfo->option.mmsSendOptInfo.priority = (msg_priority_type_t)MsgSettingGetInt(MMS_SEND_PRIORITY);
305 memset(sqlQuery, 0x00, sizeof(sqlQuery));
307 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET CONV_ID = %d, FOLDER_ID = %d, STORAGE_ID = %d, MAIN_TYPE = %d, SUB_TYPE = %d, \
308 DISPLAY_TIME = %lu, DATA_SIZE = %d, NETWORK_STATUS = %d, READ_STATUS = %d, PROTECTED = %d, PRIORITY = %d, MSG_DIRECTION = %d, \
309 BACKUP = %d, SUBJECT = ?, MSG_DATA = ?, THUMB_PATH = ?, MSG_TEXT = ? \
311 MSGFW_MESSAGE_TABLE_NAME, convId, pMsg->folderId, pMsg->storageId, pMsg->msgType.mainType, pMsg->msgType.subType, pMsg->displayTime, pMsg->dataSize,
312 pMsg->networkStatus, pMsg->bRead, pMsg->bProtected, pMsg->priority, pMsg->direction, pMsg->bBackup, pMsg->msgId);
314 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS) {
315 dbHandle.endTrans(false);
316 return MSG_ERR_DB_EXEC;
319 dbHandle.bindText(pMsg->subject, 1);
321 dbHandle.bindText(pMsg->msgData, 2);
323 dbHandle.bindText(pMsg->thumbPath, 3);
325 if (pMsg->msgType.mainType == MSG_SMS_TYPE && pMsg->bTextSms == false)
326 dbHandle.bindText(pFileData, 4);
328 dbHandle.bindText(pMsg->msgText, 4);
330 MSG_DEBUG("%s", sqlQuery);
332 if (dbHandle.stepQuery() != MSG_ERR_DB_DONE) {
333 dbHandle.finalizeQuery();
334 dbHandle.endTrans(false);
335 return MSG_ERR_DB_EXEC;
338 dbHandle.finalizeQuery();
340 if (pMsg->msgType.mainType == MSG_SMS_TYPE && pSendOptInfo != NULL) {
341 if (pSendOptInfo->bSetting == true) {
342 memset(sqlQuery, 0x00, sizeof(sqlQuery));
343 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET \
344 DELREP_REQ = %d, KEEP_COPY = %d, REPLY_PATH = %d \
346 MSGFW_SMS_SENDOPT_TABLE_NAME, pSendOptInfo->bDeliverReq,
347 pSendOptInfo->bKeepCopy, pSendOptInfo->option.smsSendOptInfo.bReplyPath, pMsg->msgId);
349 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
350 dbHandle.endTrans(false);
351 return MSG_ERR_DB_EXEC;
354 } else if (pMsg->msgType.mainType == MSG_MMS_TYPE) {
355 MsgPlugin *plg = MsgPluginManager::instance()->getPlugin(MSG_MMS_TYPE);
357 err = plg->updateMessage(pMsg, pSendOptInfo, pFileData);
359 if (err != MSG_SUCCESS) {
360 dbHandle.endTrans(false);
361 return MSG_ERR_STORAGE_ERROR;
364 if (pMsg->msgType.subType == MSG_SENDREQ_MMS) {
365 MSG_DEBUG("pMsg->msgText: %s, pMsg->thumbPath: %s ", pMsg->msgText, pMsg->thumbPath);
367 err = MsgStoUpdateMMSMessage(pMsg);
369 if (err != MSG_SUCCESS) {
370 return MSG_ERR_STORAGE_ERROR;
375 err = MsgStoUpdateConversation(&dbHandle, convId);
377 if (err != MSG_SUCCESS) {
378 dbHandle.endTrans(false);
379 return MSG_ERR_STORAGE_ERROR;
382 err = MsgStoClearConversationTable(&dbHandle);
384 if (err != MSG_SUCCESS) {
385 dbHandle.endTrans(false);
386 return MSG_ERR_STORAGE_ERROR;
389 dbHandle.endTrans(true);
395 msg_error_t MsgStoUpdateReadStatus(msg_message_id_t msgId, bool bRead)
397 char sqlQuery[MAX_QUERY_LEN+1];
399 msg_storage_id_t storageId;
401 if (MsgStoSetReadStatus(&dbHandle, msgId, bRead) != MSG_SUCCESS) {
402 MSG_DEBUG("MsgStoSetReadStatus() Error");
403 return MSG_ERR_STORAGE_ERROR;
407 memset(sqlQuery, 0x00, sizeof(sqlQuery));
408 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT STORAGE_ID FROM %s WHERE MSG_ID = %d;",
409 MSGFW_MESSAGE_TABLE_NAME, msgId);
411 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
412 return MSG_ERR_DB_PREPARE;
414 if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
415 storageId = dbHandle.columnInt(0);
417 dbHandle.finalizeQuery();
418 return MSG_ERR_DB_STEP;
421 dbHandle.finalizeQuery();
423 MSG_DEBUG("StorageId:[%d]", storageId);
425 // Update Read Status for SIM Msg
426 if (storageId == MSG_STORAGE_SIM) {
427 MsgPlugin *plg = MsgPluginManager::instance()->getPlugin(MSG_SMS_TYPE);
430 MSG_DEBUG("SMS Plug-in is NULL");
431 return MSG_ERR_NULL_POINTER;
435 memset(sqlQuery, 0x00, sizeof(sqlQuery));
436 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT SIM_ID FROM %s WHERE MSG_ID = %d;",
437 MSGFW_SIM_MSG_TABLE_NAME, msgId);
439 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
440 return MSG_ERR_DB_PREPARE;
444 while (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
445 simId = dbHandle.columnInt(0);
447 if (plg->setReadStatus(simId) != MSG_SUCCESS) {
448 MSG_DEBUG("Fail to Set Read Status for SIM SMS");
453 dbHandle.finalizeQuery();
460 msg_error_t MsgStoUpdateThreadReadStatus(msg_thread_id_t threadId)
464 msg_error_t err = MSG_SUCCESS;
467 char sqlQuery[MAX_QUERY_LEN+1];
470 memset(sqlQuery, 0x00, sizeof(sqlQuery));
471 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s A \
472 WHERE CONV_ID = %d AND READ_STATUS = 0 AND STORAGE_ID = %d;",
473 MSGFW_MESSAGE_TABLE_NAME, threadId, MSG_STORAGE_SIM);
476 err = dbHandle.getTable(sqlQuery, &rowCnt);
478 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
479 dbHandle.freeTable();
483 for (int i = 1; i <= rowCnt; i++) {
484 MsgStoUpdateReadStatus(dbHandle.getColumnToInt(i), true);
487 dbHandle.freeTable();
490 memset(sqlQuery, 0x00, sizeof(sqlQuery));
491 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET READ_STATUS = %d \
492 WHERE CONV_ID = %d AND READ_STATUS = 0;",
493 MSGFW_MESSAGE_TABLE_NAME, 1, threadId);
495 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS)
496 return MSG_ERR_DB_EXEC;
499 if (MsgStoUpdateConversation(&dbHandle, threadId) != MSG_SUCCESS) {
500 MSG_DEBUG("MsgStoUpdateConversation() Error");
501 return MSG_ERR_STORAGE_ERROR;
504 if (g_idle_add(updateUnreadMsgCount, NULL) == 0) {
505 MSG_DEBUG("updateUnreadMsgCount() Error");
508 MsgRefreshNoti(false);
516 msg_error_t MsgStoUpdateProtectedStatus(msg_message_id_t msgId, bool bProtected)
518 char sqlQuery[MAX_QUERY_LEN+1];
520 memset(sqlQuery, 0x00, sizeof(sqlQuery));
521 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET PROTECTED = %d WHERE MSG_ID = %d;",
522 MSGFW_MESSAGE_TABLE_NAME, (int)bProtected, msgId);
524 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS)
525 return MSG_ERR_DB_EXEC;
531 msg_error_t MsgStoDeleteMessage(msg_message_id_t msgId, bool bCheckIndication)
535 MSG_DEBUG("Msg Id : %d", msgId);
537 msg_error_t err = MSG_SUCCESS;
539 char sqlQuery[MAX_QUERY_LEN+1];
541 // Get SUB_TYPE, STORAGE_ID
542 memset(sqlQuery, 0x00, sizeof(sqlQuery));
543 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MAIN_TYPE, SUB_TYPE, FOLDER_ID, STORAGE_ID, READ_STATUS, CONV_ID \
544 FROM %s WHERE MSG_ID = %d;", MSGFW_MESSAGE_TABLE_NAME, msgId);
546 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS) {
547 MSG_DEBUG("Query Failed [%s]", sqlQuery);
548 return MSG_ERR_DB_PREPARE;
551 MSG_MESSAGE_TYPE_S msgType;
552 msg_folder_id_t folderId;
553 msg_storage_id_t storageId;
554 msg_thread_id_t convId;
557 if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
558 msgType.mainType = dbHandle.columnInt(0);
559 msgType.subType = dbHandle.columnInt(1);
560 folderId = dbHandle.columnInt(2);
561 storageId = dbHandle.columnInt(3);
562 bRead = dbHandle.columnInt(4);
563 convId = dbHandle.columnInt(5);
565 MSG_DEBUG("Main Type:[%d] SubType:[%d] FolderId:[%d] StorageId:[%d] ConversationId:[%d]", msgType.mainType, msgType.subType, folderId, storageId, convId);
567 MSG_DEBUG("MsgStepQuery() Error [%s]", sqlQuery);
569 dbHandle.finalizeQuery();
571 return MSG_ERR_DB_STEP;
574 dbHandle.finalizeQuery();
576 MsgPlugin *plg = MsgPluginManager::instance()->getPlugin(MSG_SMS_TYPE);
579 MSG_DEBUG("SMS Plug-in is NULL");
581 return MSG_ERR_NULL_POINTER;
584 dbHandle.beginTrans();
587 if (storageId == MSG_STORAGE_SIM) {
588 // get sim message id
589 memset(sqlQuery, 0x00, sizeof(sqlQuery));
590 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT SIM_ID FROM %s WHERE MSG_ID = %d;",
591 MSGFW_SIM_MSG_TABLE_NAME, msgId);
593 MSG_DEBUG("sqlQuery is [%s]", sqlQuery);
595 msg_sim_id_t simMsgId;
597 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS) {
598 dbHandle.endTrans(false);
599 return MSG_ERR_DB_PREPARE;
602 while (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
603 simMsgId = dbHandle.columnInt(0);
605 MSG_DEBUG("SIM Msg Id : [%d]", simMsgId);
607 err = plg->deleteSimMessage(simMsgId);
609 if (err != MSG_SUCCESS) {
610 dbHandle.finalizeQuery();
611 dbHandle.endTrans(false);
615 //Sim message delete in db table
616 memset(sqlQuery, 0x00, sizeof(sqlQuery));
617 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE SIM_ID = %d;", MSGFW_SIM_MSG_TABLE_NAME, simMsgId);
619 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
620 dbHandle.finalizeQuery();
621 dbHandle.endTrans(false);
622 return MSG_ERR_DB_EXEC;
626 dbHandle.finalizeQuery();
629 /* each type has to be handled in plug in ? */
630 if (msgType.mainType == MSG_SMS_TYPE) {
631 memset(sqlQuery, 0x00, sizeof(sqlQuery));
632 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE MSG_ID = %d;",
633 MSGFW_SMS_SENDOPT_TABLE_NAME, msgId);
635 // Delete SMS Send Option
636 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
637 dbHandle.endTrans(false);
638 return MSG_ERR_DB_EXEC;
641 if (msgType.subType == MSG_CB_SMS || msgType.subType == MSG_JAVACB_SMS) {
642 memset(sqlQuery, 0x00, sizeof(sqlQuery));
643 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE MSG_ID = %d;",
644 MSGFW_CB_MSG_TABLE_NAME, msgId);
646 // Delete Push Message from push table
647 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
648 dbHandle.endTrans(false);
649 return MSG_ERR_DB_EXEC;
651 } else if (msgType.subType >= MSG_WAP_SI_SMS && msgType.subType <= MSG_WAP_CO_SMS) {
652 memset(sqlQuery, 0x00, sizeof(sqlQuery));
653 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE MSG_ID = %d;",
654 MSGFW_PUSH_MSG_TABLE_NAME, msgId);
656 // Delete Push Message from push table
657 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
658 dbHandle.endTrans(false);
659 return MSG_ERR_DB_EXEC;
661 } else if (msgType.subType == MSG_SYNCML_CP) {
662 memset(sqlQuery, 0x00, sizeof(sqlQuery));
663 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE MSG_ID = %d;",
664 MSGFW_SYNCML_MSG_TABLE_NAME, msgId);
666 // Delete SyncML Message from syncML table
667 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
668 dbHandle.endTrans(false);
669 return MSG_ERR_DB_EXEC;
672 } else if (msgType.mainType == MSG_MMS_TYPE) {
674 char filePath[MSG_FILEPATH_LEN_MAX] = {0,};
675 char dirPath[MSG_FILEPATH_LEN_MAX]= {0,};
677 memset(sqlQuery, 0x00, sizeof(sqlQuery));
678 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT FILE_PATH FROM %s WHERE MSG_ID = %d;",
679 MMS_PLUGIN_MESSAGE_TABLE_NAME, msgId);
681 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS) {
682 dbHandle.endTrans(false);
683 return MSG_ERR_DB_PREPARE;
686 if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
687 strncpy(filePath, (char *)dbHandle.columnText(0), MSG_FILEPATH_LEN_MAX);
689 snprintf(dirPath, MSG_FILEPATH_LEN_MAX, "%s.dir", filePath);
691 if (remove(filePath) == -1)
692 MSG_DEBUG("Fail to delete file [%s]", filePath);
694 MSG_DEBUG("Success to delete file [%s]", filePath);
701 MSG_DEBUG("MsgStepQuery() Error [%s]", sqlQuery);
702 dbHandle.finalizeQuery();
703 dbHandle.endTrans(false);
704 return MSG_ERR_DB_STEP;
707 dbHandle.finalizeQuery();
709 // remove thumbnail file
710 memset(sqlQuery, 0x00, sizeof(sqlQuery));
711 snprintf(sqlQuery, sizeof(sqlQuery),
712 "SELECT VALUE FROM %s "
713 "WHERE MSG_ID = %d AND (TYPE=%d OR TYPE=%d);",
714 MSGFW_MMS_PREVIEW_TABLE_NAME, msgId, MSG_MMS_ITEM_TYPE_IMG, MSG_MMS_ITEM_TYPE_VIDEO);
716 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS) {
717 dbHandle.endTrans(false);
718 return MSG_ERR_DB_PREPARE;
721 while (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
722 memset(filePath, 0x00, sizeof(filePath));
723 strncpy(filePath, (char *)dbHandle.columnText(0), MSG_FILEPATH_LEN_MAX);
724 if (remove(filePath) == -1)
725 MSG_DEBUG("Fail to delete file [%s]", filePath);
727 MSG_DEBUG("Success to delete file [%s]", filePath);
730 dbHandle.finalizeQuery();
732 memset(sqlQuery, 0x00, sizeof(sqlQuery));
733 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE MSG_ID = %d;",
734 MSGFW_MMS_PREVIEW_TABLE_NAME, msgId);
736 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
737 dbHandle.endTrans(false);
738 return MSG_ERR_DB_EXEC;
741 memset(sqlQuery, 0x00, sizeof(sqlQuery));
742 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE MSG_ID = %d;",
743 MMS_PLUGIN_MESSAGE_TABLE_NAME, msgId);
745 // Delete Data from MMS table
746 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
747 dbHandle.endTrans(false);
748 return MSG_ERR_DB_EXEC;
751 memset(sqlQuery, 0x00, sizeof(sqlQuery));
752 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE MSG_ID = %d;",
753 MSGFW_REPORT_TABLE_NAME, msgId);
755 // Delete Data from MMS STATUS table
756 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
757 dbHandle.endTrans(false);
758 return MSG_ERR_DB_EXEC;
762 memset(sqlQuery, 0x00, sizeof(sqlQuery));
763 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE MSG_ID = %d;", MSGFW_MESSAGE_TABLE_NAME, msgId);
765 // Delete Message from msg table
766 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
767 dbHandle.endTrans(false);
768 return MSG_ERR_DB_EXEC;
772 // Clear Conversation table
773 if (MsgStoClearConversationTable(&dbHandle) != MSG_SUCCESS) {
774 dbHandle.endTrans(false);
775 return MSG_ERR_DB_EXEC;
778 // Update conversation table.
779 if (MsgStoUpdateConversation(&dbHandle, convId) != MSG_SUCCESS) {
780 dbHandle.endTrans(false);
781 return MSG_ERR_STORAGE_ERROR;
784 dbHandle.endTrans(true);
786 if (msgType.mainType == MSG_SMS_TYPE && folderId == MSG_INBOX_ID) {
787 msgType.classType = MSG_CLASS_NONE;
789 // Set memory status in SIM
790 if (MsgStoCheckMsgCntFull(&dbHandle, &msgType, folderId) == MSG_SUCCESS) {
791 MSG_DEBUG("Set Memory Status");
793 plg->setMemoryStatus(MSG_SUCCESS);
797 if (bCheckIndication == true) {
798 MSG_DEBUG("bCheckIndication is true.");
803 smsCnt = MsgStoGetUnreadCnt(&dbHandle, MSG_SMS_TYPE);
804 mmsCnt = MsgStoGetUnreadCnt(&dbHandle, MSG_MMS_TYPE);
806 MsgSettingSetIndicator(smsCnt, mmsCnt);
808 MsgRefreshNoti(false);
815 msg_error_t MsgStoDeleteAllMessageInFolder(msg_folder_id_t folderId, bool bOnlyDB, msg_id_list_s *pMsgIdList)
817 msg_error_t err = MSG_SUCCESS;
819 char sqlQuery[MAX_QUERY_LEN+1];
821 queue<msg_thread_id_t> threadList;
823 const char *tableList[] = {MSGFW_PUSH_MSG_TABLE_NAME, MSGFW_CB_MSG_TABLE_NAME,
824 MSGFW_SYNCML_MSG_TABLE_NAME, MSGFW_SMS_SENDOPT_TABLE_NAME,
825 MMS_PLUGIN_MESSAGE_TABLE_NAME, MSGFW_MMS_PREVIEW_TABLE_NAME,
826 MSGFW_REPORT_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME};
828 int listCnt = sizeof(tableList)/sizeof(char *);
831 // Get conversation ID from Folder
832 memset(sqlQuery, 0x00, sizeof(sqlQuery));
834 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT DISTINCT(CONV_ID) FROM %s WHERE FOLDER_ID = %d",
835 MSGFW_MESSAGE_TABLE_NAME, folderId);
837 err = dbHandle.getTable(sqlQuery, &rowCnt);
839 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
840 MSG_DEBUG("sql query is %s.", sqlQuery);
842 dbHandle.freeTable();
847 dbHandle.freeTable();
852 for (int i = 1; i <= rowCnt; i++) {
853 MSG_DEBUG("thread ID : %d", dbHandle.getColumnToInt(i));
854 threadList.push((msg_thread_id_t)dbHandle.getColumnToInt(i));
857 dbHandle.freeTable();
859 /*** Get msg id list **/
860 msg_id_list_s *pToDeleteMsgIdList = NULL;
861 pToDeleteMsgIdList = (msg_id_list_s *)new char[sizeof(msg_id_list_s)];
862 if (pToDeleteMsgIdList == NULL) {
863 MSG_DEBUG("pToDeleteMsgIdList is NULL.");
864 return MSG_ERR_NULL_POINTER;
866 memset(pToDeleteMsgIdList, 0x00, sizeof(msg_id_list_s));
868 memset(sqlQuery, 0x00, sizeof(sqlQuery));
869 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s WHERE FOLDER_ID = %d",
870 MSGFW_MESSAGE_TABLE_NAME, folderId);
875 err = dbHandle.getTable(sqlQuery, &rowCnt);
877 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
878 MSG_DEBUG("sqlQuery [%s]", sqlQuery);
880 dbHandle.freeTable();
886 dbHandle.freeTable();
892 pToDeleteMsgIdList->nCount = rowCnt;
894 MSG_DEBUG("pToDeleteMsgIdList->nCount [%d]", pToDeleteMsgIdList->nCount);
896 pToDeleteMsgIdList->msgIdList = (msg_message_id_t *)new char[sizeof(msg_message_id_t) * rowCnt];
898 for (int i = 0; i < rowCnt; i++)
899 pToDeleteMsgIdList->msgIdList[i] = dbHandle.getColumnToInt(index++);
901 dbHandle.freeTable();
904 /*** Delete Sim Message In Folder **/
905 if (folderId >= MSG_INBOX_ID) {
906 memset(sqlQuery, 0x00, sizeof(sqlQuery));
908 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s WHERE FOLDER_ID = %d AND STORAGE_ID = %d",
909 MSGFW_MESSAGE_TABLE_NAME, folderId, MSG_STORAGE_SIM);
911 MSG_DEBUG("sql query is %s.", sqlQuery);
915 err = dbHandle.getTable(sqlQuery, &rowCnt);
917 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
918 dbHandle.freeTable();
923 for (int i = 1; i <= rowCnt; i++) {
924 err = MsgStoDeleteMessage(dbHandle.getColumnToInt(i), false);
926 if (err != MSG_SUCCESS) {
927 MSG_DEBUG("MsgStoDeleteMessage() Error!!!");
929 dbHandle.freeTable();
935 // MsgDeletePhoneLog(dbHandle.getColumnToInt(i));
938 dbHandle.freeTable();
941 dbHandle.beginTrans();
943 for (int i = 0; i < listCnt; i++) {
944 if (!strcmp(tableList[i], MMS_PLUGIN_MESSAGE_TABLE_NAME)) {
948 char filePath[MSG_FILEPATH_LEN_MAX] = {0,};
949 char dirPath[MSG_FILEPATH_LEN_MAX] = {0,};
951 //get mms msg id list
952 memset(sqlQuery, 0x00, sizeof(sqlQuery));
953 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT B.FILE_PATH FROM %s A, %s B \
954 WHERE A.FOLDER_ID = %d AND A.MAIN_TYPE = %d AND A.MSG_ID = B.MSG_ID",
955 MSGFW_MESSAGE_TABLE_NAME, MMS_PLUGIN_MESSAGE_TABLE_NAME, folderId, MSG_MMS_TYPE);
957 MSG_DEBUG("sqlQuery [%s]", sqlQuery);
959 err = dbHandle.getTable(sqlQuery, &rowCnt);
960 MSG_DEBUG("rowCnt %d", rowCnt);
962 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
963 MSG_DEBUG("sqlQuery [%s]", sqlQuery);
965 dbHandle.freeTable();
966 dbHandle.endTrans(false);
971 for (int i = 1; i <= rowCnt; i++) {
973 memset(filePath, 0x00, sizeof(filePath));
974 dbHandle.getColumnToString(i, MSG_FILEPATH_LEN_MAX, filePath);
976 MSG_DEBUG("filePath [%s]", filePath);
979 snprintf(dirPath, sizeof(dirPath), "%s.dir", filePath);
981 if (remove(filePath) == -1)
982 MSG_DEBUG("Fail to delete file [%s]", filePath);
984 MSG_DEBUG("Success to delete file [%s]", filePath);
992 dbHandle.freeTable();
996 char filePath[MSG_FILEPATH_LEN_MAX] = {0,};
997 memset(sqlQuery, 0x00, sizeof(sqlQuery));
998 snprintf(sqlQuery, sizeof(sqlQuery),
999 "SELECT VALUE FROM %s "
1000 "WHERE (TYPE=%d OR TYPE=%d) "
1001 "AND (MSG_ID IN (SELECT MSG_ID FROM %s WHERE FOLDER_ID = %d));",
1002 MSGFW_MMS_PREVIEW_TABLE_NAME, MSG_MMS_ITEM_TYPE_IMG, MSG_MMS_ITEM_TYPE_VIDEO, MSGFW_MESSAGE_TABLE_NAME, folderId);
1004 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS) {
1005 dbHandle.endTrans(false);
1006 return MSG_ERR_DB_PREPARE;
1009 while (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
1010 memset(filePath, 0x00, sizeof(filePath));
1011 strncpy(filePath, (char *)dbHandle.columnText(0), MSG_FILEPATH_LEN_MAX);
1012 if (remove(filePath) == -1)
1013 MSG_DEBUG("Fail to delete file [%s]", filePath);
1015 MSG_DEBUG("Success to delete file [%s]", filePath);
1018 dbHandle.finalizeQuery();
1020 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1022 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE MSG_ID IN \
1023 (SELECT MSG_ID FROM %s WHERE FOLDER_ID = %d);",
1024 tableList[i], MSGFW_MESSAGE_TABLE_NAME, folderId);
1026 // Delete Message in specific folder from table
1027 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
1028 MSG_DEBUG("sqlQuery [%s]", sqlQuery);
1029 dbHandle.endTrans(false);
1030 err = MSG_ERR_DB_EXEC;
1036 // Clear Conversation table
1037 if (MsgStoClearConversationTable(&dbHandle) != MSG_SUCCESS) {
1038 dbHandle.endTrans(false);
1039 err = MSG_ERR_DB_EXEC;
1045 while (!threadList.empty()) {
1046 err = MsgStoUpdateConversation(&dbHandle, threadList.front());
1050 if (err != MSG_SUCCESS) {
1051 dbHandle.endTrans(false);
1057 dbHandle.endTrans(true);
1059 if (folderId == MSG_INBOX_ID) {
1063 smsCnt = MsgStoGetUnreadCnt(&dbHandle, MSG_SMS_TYPE);
1064 mmsCnt = MsgStoGetUnreadCnt(&dbHandle, MSG_MMS_TYPE);
1066 MsgSettingSetIndicator(smsCnt, mmsCnt);
1069 /*** Set pMsgIdList **/
1070 if (pMsgIdList != NULL && pToDeleteMsgIdList->nCount > 0) {
1071 pMsgIdList->nCount = pToDeleteMsgIdList->nCount;
1073 pMsgIdList->msgIdList = (msg_message_id_t *)new char[sizeof(msg_message_id_t)*pToDeleteMsgIdList->nCount];
1074 memcpy(pMsgIdList->msgIdList, pToDeleteMsgIdList->msgIdList, sizeof(msg_message_id_t)*pToDeleteMsgIdList->nCount);
1078 /*** Create thread for noti and phone log delete. **/
1080 if (pToDeleteMsgIdList->nCount > 0) {
1081 // if (g_idle_add(startToDeletePhoneLog, (void *)pToDeleteMsgIdList) == 0) {
1082 // MSG_DEBUG("startToDeletePhoneLog not invoked: %s", strerror(errno));
1084 if (pToDeleteMsgIdList != NULL) {
1085 //free peer info list
1086 if (pToDeleteMsgIdList->msgIdList != NULL)
1087 delete [] pToDeleteMsgIdList->msgIdList;
1089 delete [] pToDeleteMsgIdList;
1091 // err = MSG_ERR_UNKNOWN;
1094 MsgRefreshNoti(false);
1102 MSG_DEBUG("Error case Free Memory");
1104 while (!threadList.empty()) {
1110 if (pToDeleteMsgIdList != NULL) {
1111 //free peer info list
1112 if (pToDeleteMsgIdList->msgIdList != NULL)
1113 delete [] pToDeleteMsgIdList->msgIdList;
1115 delete [] pToDeleteMsgIdList;
1123 msg_error_t MsgStoDeleteMessageByList(msg_id_list_s *pMsgIdList)
1126 msg_error_t err = MSG_SUCCESS;
1128 char sqlQuery[MAX_QUERY_LEN+1];
1129 char whereQuery[MAX_QUERY_LEN+1];
1130 char sqlQuerySubset[(MAX_QUERY_LEN/5)+1];
1132 queue<msg_thread_id_t> threadList;
1134 const char *tableList[] = {MSGFW_PUSH_MSG_TABLE_NAME, MSGFW_CB_MSG_TABLE_NAME,
1135 MSGFW_SYNCML_MSG_TABLE_NAME, MSGFW_SMS_SENDOPT_TABLE_NAME,
1136 MSGFW_MMS_PREVIEW_TABLE_NAME, MSGFW_REPORT_TABLE_NAME,
1137 MMS_PLUGIN_MESSAGE_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME};
1139 int listCnt = sizeof(tableList)/sizeof(char *);
1142 memset(whereQuery, 0x00, sizeof(whereQuery));
1144 if (pMsgIdList->nCount < 1) {
1147 for (int i=0; i < pMsgIdList->nCount; i++) {
1148 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
1150 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "(MSG_ID = %d ", pMsgIdList->msgIdList[i]);
1152 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "OR MSG_ID = %d ", pMsgIdList->msgIdList[i]);
1153 strncat(whereQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(whereQuery));
1156 strncat(whereQuery, ");", MAX_QUERY_LEN-strlen(whereQuery));
1158 // Get conversation ID from Folder
1159 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1160 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT DISTINCT(CONV_ID) FROM %s WHERE ", MSGFW_MESSAGE_TABLE_NAME);
1161 strncat(sqlQuery, whereQuery, MAX_QUERY_LEN-strlen(sqlQuery));
1163 err = dbHandle.getTable(sqlQuery, &rowCnt);
1165 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
1166 MSG_DEBUG("sql query is %s.", sqlQuery);
1167 dbHandle.freeTable();
1172 dbHandle.freeTable();
1176 for (int i = 1; i <= rowCnt; i++) {
1177 MSG_DEBUG("thread ID : %d", dbHandle.getColumnToInt(i));
1178 threadList.push((msg_thread_id_t)dbHandle.getColumnToInt(i));
1181 dbHandle.freeTable();
1183 /*** Delete Sim Message In Folder **/
1184 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1185 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s WHERE STORAGE_ID = %d AND ", MSGFW_MESSAGE_TABLE_NAME, MSG_STORAGE_SIM);
1186 strncat(sqlQuery, whereQuery, MAX_QUERY_LEN-strlen(sqlQuery));
1190 err = dbHandle.getTable(sqlQuery, &rowCnt);
1192 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
1193 MSG_DEBUG("sql query is %s.", sqlQuery);
1194 dbHandle.freeTable();
1198 for (int i = 1; i <= rowCnt; i++) {
1199 err = MsgStoDeleteMessage(dbHandle.getColumnToInt(i), false);
1201 if (err != MSG_SUCCESS) {
1202 MSG_DEBUG("MsgStoDeleteMessage() Error!!!");
1203 dbHandle.freeTable();
1208 dbHandle.freeTable();
1211 dbHandle.beginTrans();
1213 for (int i = 0; i < listCnt; i++) {
1214 if (!strcmp(tableList[i], MMS_PLUGIN_MESSAGE_TABLE_NAME)) {
1218 char filePath[MSG_FILEPATH_LEN_MAX] = {0,};
1219 char dirPath[MSG_FILEPATH_LEN_MAX] = {0,};
1220 // char thumbnailPath[MSG_FILEPATH_LEN_MAX] = {0,};
1222 //get mms msg id list
1223 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1224 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT FILE_PATH FROM %s WHERE ", MMS_PLUGIN_MESSAGE_TABLE_NAME);
1225 strncat(sqlQuery, whereQuery, MAX_QUERY_LEN-strlen(sqlQuery));
1227 err = dbHandle.getTable(sqlQuery, &rowCnt);
1228 MSG_DEBUG("rowCnt %d", rowCnt);
1230 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
1231 MSG_DEBUG("sqlQuery [%s]", sqlQuery);
1232 dbHandle.freeTable();
1233 dbHandle.endTrans(false);
1237 for (int i = 1; i <= rowCnt; i++) {
1238 memset(filePath, 0x00, sizeof(filePath));
1239 dbHandle.getColumnToString(i, MSG_FILEPATH_LEN_MAX, filePath);
1241 MSG_DEBUG("filePath [%s]", filePath);
1244 snprintf(dirPath, sizeof(dirPath), "%s.dir", filePath);
1246 if (remove(filePath) == -1)
1247 MSG_DEBUG("Fail to delete file [%s]", filePath);
1249 MSG_DEBUG("Success to delete file [%s]", filePath);
1256 dbHandle.freeTable();
1257 } else if (!strcmp(tableList[i], MSGFW_MMS_PREVIEW_TABLE_NAME)) {
1258 char filePath[MSG_FILEPATH_LEN_MAX] = {0,};
1259 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1260 snprintf(sqlQuery, sizeof(sqlQuery),
1261 "SELECT VALUE FROM %s "
1262 "WHERE (TYPE=%d OR TYPE=%d) "
1264 MSGFW_MMS_PREVIEW_TABLE_NAME, MSG_MMS_ITEM_TYPE_IMG, MSG_MMS_ITEM_TYPE_VIDEO);
1266 strncat(sqlQuery, whereQuery, MAX_QUERY_LEN-strlen(sqlQuery));
1268 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS) {
1269 dbHandle.endTrans(false);
1270 return MSG_ERR_DB_PREPARE;
1273 while (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
1274 memset(filePath, 0x00, sizeof(filePath));
1276 strncpy(filePath, (char *)dbHandle.columnText(0), MSG_FILEPATH_LEN_MAX);
1277 if (remove(filePath) == -1)
1278 MSG_DEBUG("Fail to delete file [%s]", filePath);
1280 MSG_DEBUG("Success to delete file [%s]", filePath);
1283 dbHandle.finalizeQuery();
1286 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1288 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE ", tableList[i]);
1289 strncat(sqlQuery, whereQuery, MAX_QUERY_LEN-strlen(sqlQuery));
1291 // Delete Message in specific folder from table
1292 err = dbHandle.execQuery(sqlQuery);
1293 if (err != MSG_SUCCESS) {
1294 MSG_DEBUG("sqlQuery [%s]", sqlQuery);
1295 dbHandle.endTrans(false);
1300 // Clear Conversation table
1301 err = MsgStoClearConversationTable(&dbHandle);
1302 if (err != MSG_SUCCESS) {
1303 dbHandle.endTrans(false);
1308 while (!threadList.empty()) {
1309 err = MsgStoUpdateConversation(&dbHandle, threadList.front());
1313 if (err != MSG_SUCCESS) {
1314 dbHandle.endTrans(false);
1319 dbHandle.endTrans(true);
1324 smsCnt = MsgStoGetUnreadCnt(&dbHandle, MSG_SMS_TYPE);
1325 mmsCnt = MsgStoGetUnreadCnt(&dbHandle, MSG_MMS_TYPE);
1327 MsgSettingSetIndicator(smsCnt, mmsCnt);
1330 /*** Create thread for noti and phone log delete. **/
1331 if (pMsgIdList->nCount > 0) {
1332 msg_id_list_s *pToDeleteMsgIdListCpy = NULL;
1333 pToDeleteMsgIdListCpy = (msg_id_list_s *)new char[sizeof(msg_id_list_s)];
1334 memset(pToDeleteMsgIdListCpy, 0x00, sizeof(msg_id_list_s));
1335 pToDeleteMsgIdListCpy->nCount = pMsgIdList->nCount;
1336 pToDeleteMsgIdListCpy->msgIdList = (msg_message_id_t *)new char[sizeof(msg_message_id_t)*pMsgIdList->nCount];
1337 memcpy(pToDeleteMsgIdListCpy->msgIdList, pMsgIdList->msgIdList, sizeof(msg_message_id_t)*pMsgIdList->nCount);
1339 if (g_idle_add(startToDeletePhoneLog, (void *)pToDeleteMsgIdListCpy) == 0) {
1340 MSG_DEBUG("startToDeletePhoneLog not invoked: %s", strerror(errno));
1342 if (pToDeleteMsgIdListCpy != NULL) {
1343 //free peer info list
1344 if (pToDeleteMsgIdListCpy->msgIdList != NULL)
1345 delete [] pToDeleteMsgIdListCpy->msgIdList;
1347 delete [] pToDeleteMsgIdListCpy;
1349 err = MSG_ERR_UNKNOWN;
1355 MsgRefreshNoti(false);
1362 msg_error_t MsgStoMoveMessageToFolder(msg_message_id_t msgId, msg_folder_id_t destFolderId)
1364 msg_error_t err = MSG_SUCCESS;
1365 MSG_MESSAGE_TYPE_S msgType;
1366 msg_thread_id_t convId = 0;
1368 MsgStoGetMsgType(msgId, &msgType);
1370 char sqlQuery[MAX_QUERY_LEN+1];
1372 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1374 if (msgType.mainType == MSG_SMS_TYPE)
1375 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET FOLDER_ID = %d WHERE MSG_ID = %d;", MSGFW_MESSAGE_TABLE_NAME, destFolderId, msgId);
1377 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET FOLDER_ID = %d WHERE MSG_ID = %d;", MSGFW_MESSAGE_TABLE_NAME, destFolderId, msgId);
1379 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS)
1380 return MSG_ERR_DB_EXEC;
1382 /* get conversation id */
1383 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1385 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT CONV_ID FROM %s WHERE MSG_ID = %d;",
1386 MSGFW_MESSAGE_TABLE_NAME, msgId);
1388 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
1389 return MSG_ERR_DB_PREPARE;
1391 if (dbHandle.stepQuery() == MSG_ERR_DB_ROW)
1392 convId = dbHandle.columnInt(0);
1394 MSG_DEBUG("convId : %d", convId);
1396 dbHandle.finalizeQuery();
1398 /* update conversation table */
1399 err = MsgStoUpdateConversation(&dbHandle, convId);
1405 msg_error_t MsgStoMoveMessageToStorage(msg_message_id_t msgId, msg_storage_id_t destStorageId)
1409 msg_error_t err = MSG_SUCCESS;
1411 char sqlQuery[MAX_QUERY_LEN+1];
1413 MSG_DEBUG("msgId : %d, destStorageId : %d", msgId, destStorageId);
1415 switch (destStorageId) {
1416 case MSG_STORAGE_SIM : // Move message to sim card
1418 MSG_MESSAGE_INFO_S msgInfo;
1419 SMS_SIM_ID_LIST_S simIdList;
1421 memset(&msgInfo, 0x00, sizeof(MSG_MESSAGE_INFO_S));
1422 memset(&simIdList, 0x00, sizeof(SMS_SIM_ID_LIST_S));
1424 if ((err = MsgStoGetMessage(msgId, &msgInfo, NULL)) != MSG_SUCCESS)
1427 MsgPlugin *plg = MsgPluginManager::instance()->getPlugin(MSG_SMS_TYPE);
1429 if ((err = plg->saveSimMessage(&msgInfo, &simIdList)) != MSG_SUCCESS)
1432 dbHandle.beginTrans();
1434 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1435 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET STORAGE_ID = %d WHERE MSG_ID = %d;",
1436 MSGFW_MESSAGE_TABLE_NAME, destStorageId, msgId);
1438 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
1439 dbHandle.endTrans(false);
1440 return MSG_ERR_DB_EXEC;
1443 for (unsigned int i = 0; i < simIdList.count; i++) {
1444 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1445 snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, %d);",
1446 MSGFW_SIM_MSG_TABLE_NAME, msgId, simIdList.simId[i]);
1448 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
1449 dbHandle.endTrans(false);
1450 return MSG_ERR_DB_EXEC;
1454 dbHandle.endTrans(true);
1458 default: //Moving message to memory (when destination storage id is MSG_STORAGE_PHONE)
1460 bool bSimMsg = false;
1463 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1464 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT STORAGE_ID FROM %s WHERE MSG_ID = %d;",
1465 MSGFW_MESSAGE_TABLE_NAME, msgId);
1467 err = dbHandle.getTable(sqlQuery, &rowCnt);
1469 if (err != MSG_SUCCESS) {
1470 dbHandle.freeTable();
1474 if (dbHandle.getColumnToInt(1) == MSG_STORAGE_SIM) {
1475 MSG_DEBUG("It is SIM Message");
1479 dbHandle.freeTable();
1481 if (bSimMsg == true) {
1482 msg_sim_id_t simMsgId;
1484 // get sim message id
1485 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1487 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT SIM_ID FROM %s WHERE MSG_ID = %d;",
1488 MSGFW_SIM_MSG_TABLE_NAME, msgId);
1490 MSG_DEBUG("sqlQuery is %s.", sqlQuery);
1492 err = dbHandle.getTable(sqlQuery, &rowCnt);
1494 if (err != MSG_SUCCESS) {
1495 dbHandle.freeTable();
1499 //Delete messages in sim card
1500 MsgPlugin *plg = MsgPluginManager::instance()->getPlugin(MSG_SMS_TYPE);
1502 for (int i = 0; i < rowCnt; i++) {
1503 simMsgId = dbHandle.getColumnToInt(i+1);
1505 MSG_DEBUG("simMsgId is %d.", simMsgId);
1507 if ((err = plg->deleteSimMessage(simMsgId)) != MSG_SUCCESS) {
1508 dbHandle.freeTable();
1513 dbHandle.freeTable();
1515 dbHandle.beginTrans();
1517 //Delete Messages in SIM Msg table
1518 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1519 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE MSG_ID = %d;",
1520 MSGFW_SIM_MSG_TABLE_NAME, msgId);
1522 MSG_DEBUG("sqlQuery is %s.", sqlQuery);
1524 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
1525 dbHandle.endTrans(false);
1526 return MSG_ERR_DB_EXEC;
1530 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1531 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET STORAGE_ID = %d WHERE MSG_ID = %d;",
1532 MSGFW_MESSAGE_TABLE_NAME, destStorageId, msgId);
1534 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
1535 dbHandle.endTrans(false);
1536 return MSG_ERR_DB_EXEC;
1539 dbHandle.endTrans(true);
1548 msg_error_t MsgStoCountMessage(msg_folder_id_t folderId, MSG_COUNT_INFO_S *pCountInfo)
1550 if (pCountInfo == NULL) {
1551 MSG_DEBUG("pCountInfo is NULL");
1552 return MSG_ERR_NULL_POINTER;
1555 char sqlQuery[MAX_QUERY_LEN+1];
1557 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1558 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s WHERE FOLDER_ID = %d AND READ_STATUS = 1 \
1559 UNION ALL SELECT COUNT(MSG_ID) FROM %s WHERE FOLDER_ID = %d AND READ_STATUS = 0 \
1560 UNION ALL SELECT COUNT(MSG_ID) FROM %s WHERE FOLDER_ID = %d AND MAIN_TYPE = %d \
1561 UNION ALL SELECT COUNT(MSG_ID) FROM %s WHERE FOLDER_ID = %d AND MAIN_TYPE = %d;",
1562 MSGFW_MESSAGE_TABLE_NAME, folderId,
1563 MSGFW_MESSAGE_TABLE_NAME, folderId,
1564 MSGFW_MESSAGE_TABLE_NAME, folderId, MSG_SMS_TYPE,
1565 MSGFW_MESSAGE_TABLE_NAME, folderId, MSG_MMS_TYPE);
1567 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
1568 return MSG_ERR_DB_PREPARE;
1570 if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
1571 pCountInfo->nReadCnt = dbHandle.columnInt(0);
1573 dbHandle.finalizeQuery();
1574 return MSG_ERR_DB_STEP;
1577 if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
1578 pCountInfo->nUnreadCnt = dbHandle.columnInt(0);
1580 dbHandle.finalizeQuery();
1581 return MSG_ERR_DB_STEP;
1584 if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
1585 pCountInfo->nSms = dbHandle.columnInt(0);
1587 dbHandle.finalizeQuery();
1588 return MSG_ERR_DB_STEP;
1591 if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
1592 pCountInfo->nMms = dbHandle.columnInt(0);
1594 dbHandle.finalizeQuery();
1595 return MSG_ERR_DB_STEP;
1598 dbHandle.finalizeQuery();
1604 msg_error_t MsgStoCountMsgByType(const MSG_MESSAGE_TYPE_S *pMsgType, int *pMsgCount)
1606 if (pMsgType == NULL) {
1607 MSG_DEBUG("pMsgType is NULL");
1608 return MSG_ERR_NULL_POINTER;
1613 char sqlQuery[MAX_QUERY_LEN+1];
1614 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1617 if ((pMsgType->mainType == MSG_SMS_TYPE) &&
1618 (pMsgType->subType == MSG_NORMAL_SMS || pMsgType->subType == MSG_STATUS_REPORT_SMS || pMsgType->subType == MSG_CONCAT_SIM_SMS)) {
1619 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s WHERE MAIN_TYPE = %d AND SUB_TYPE IN (%d, %d, %d);",
1620 MSGFW_MESSAGE_TABLE_NAME, pMsgType->mainType, MSG_NORMAL_SMS, MSG_STATUS_REPORT_SMS, MSG_CONCAT_SIM_SMS);
1621 } else if ((pMsgType->mainType == MSG_SMS_TYPE) &&
1622 (pMsgType->subType == MSG_WAP_SI_SMS || pMsgType->subType == MSG_WAP_SL_SMS)) {
1624 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s WHERE MAIN_TYPE = %d AND SUB_TYPE IN (%d, %d);",
1625 MSGFW_MESSAGE_TABLE_NAME, pMsgType->mainType, MSG_WAP_SI_SMS, MSG_WAP_SL_SMS);
1626 } else if ((pMsgType->mainType == MSG_MMS_TYPE) &&
1627 (pMsgType->subType == MSG_SENDREQ_MMS || pMsgType->subType == MSG_SENDCONF_MMS || pMsgType->subType == MSG_RETRIEVE_AUTOCONF_MMS || pMsgType->subType == MSG_RETRIEVE_MANUALCONF_MMS)) {
1629 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s WHERE MAIN_TYPE = %d AND SUB_TYPE IN (%d, %d, %d, %d);",
1630 MSGFW_MESSAGE_TABLE_NAME, pMsgType->mainType, MSG_SENDREQ_MMS, MSG_SENDCONF_MMS, MSG_RETRIEVE_AUTOCONF_MMS, MSG_RETRIEVE_MANUALCONF_MMS);
1632 return MSG_ERR_INVALID_PARAMETER;
1635 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
1636 return MSG_ERR_DB_PREPARE;
1638 if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
1639 *pMsgCount = dbHandle.columnInt(0);
1641 dbHandle.finalizeQuery();
1642 return MSG_ERR_DB_STEP;
1645 dbHandle.finalizeQuery();
1651 msg_error_t MsgStoGetMessage(msg_message_id_t msgId, MSG_MESSAGE_INFO_S *pMsg, MSG_SENDINGOPT_INFO_S *pSendOptInfo)
1653 char sqlQuery[MAX_QUERY_LEN+1];
1655 int order = MsgGetContactNameOrder();
1657 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1658 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID, CONV_ID, FOLDER_ID, STORAGE_ID, MAIN_TYPE, \
1659 SUB_TYPE, DISPLAY_TIME, DATA_SIZE, NETWORK_STATUS, READ_STATUS, PROTECTED, \
1660 BACKUP, PRIORITY, MSG_DIRECTION, SCHEDULED_TIME, SUBJECT, MSG_TEXT, THUMB_PATH \
1661 FROM %s WHERE MSG_ID = %d;",
1662 MSGFW_MESSAGE_TABLE_NAME, msgId);
1664 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
1665 return MSG_ERR_DB_PREPARE;
1667 if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
1668 pMsg->msgId = dbHandle.columnInt(0);
1669 pMsg->threadId = dbHandle.columnInt(1);
1670 pMsg->folderId = dbHandle.columnInt(2);
1671 pMsg->storageId = dbHandle.columnInt(3);
1672 pMsg->msgType.mainType = dbHandle.columnInt(4);
1673 pMsg->msgType.subType = dbHandle.columnInt(5);
1674 pMsg->displayTime = (time_t)dbHandle.columnInt(6);
1675 pMsg->dataSize = dbHandle.columnInt(7);
1676 pMsg->networkStatus = dbHandle.columnInt(8);
1677 pMsg->bRead = dbHandle.columnInt(9);
1678 pMsg->bProtected = dbHandle.columnInt(10);
1679 pMsg->bBackup = dbHandle.columnInt(11);
1680 pMsg->priority = dbHandle.columnInt(12);
1681 pMsg->direction= dbHandle.columnInt(13);
1683 strncpy(pMsg->subject, (char *)dbHandle.columnText(15), MAX_SUBJECT_LEN);
1685 /* Temp_File_Handling */
1686 if (pMsg->msgType.mainType == MSG_SMS_TYPE || pMsg->msgType.subType == MSG_NOTIFICATIONIND_MMS) {
1687 if (pMsg->dataSize > MAX_MSG_TEXT_LEN) {
1688 char msgData[pMsg->dataSize+1];
1689 memset(msgData, 0x00, sizeof(msgData));
1691 strncpy(msgData, (char *)dbHandle.columnText(16), pMsg->dataSize);
1693 // Save Message Data into File
1694 char fileName[MSG_FILENAME_LEN_MAX+1];
1695 memset(fileName, 0x00, sizeof(fileName));
1697 if (MsgCreateFileName(fileName) == false) {
1698 dbHandle.finalizeQuery();
1699 return MSG_ERR_STORAGE_ERROR;
1702 MSG_DEBUG("Save Message Data into file : size[%d] name[%s]\n", pMsg->dataSize, fileName);
1704 if (MsgWriteIpcFile(fileName, msgData, pMsg->dataSize) == false) {
1705 dbHandle.finalizeQuery();
1706 return MSG_ERR_STORAGE_ERROR;
1709 strncpy(pMsg->msgData, fileName, MAX_MSG_DATA_LEN);
1711 pMsg->bTextSms = false;
1713 memset(pMsg->msgText, 0x00, sizeof(pMsg->msgText));
1714 strncpy(pMsg->msgText, (char *)dbHandle.columnText(16), pMsg->dataSize);
1716 // For WAP PUSH SI Message
1717 if (pMsg->msgType.subType == MSG_WAP_SI_SMS) {
1718 strncat(pMsg->msgText, "\n", MAX_MSG_TEXT_LEN-strlen(pMsg->msgText));
1719 strncat(pMsg->msgText, pMsg->subject, MAX_MSG_TEXT_LEN-strlen(pMsg->msgText));
1720 MSG_DEBUG("pMsg->msgText : [%s]", pMsg->msgText);
1721 pMsg->dataSize = sizeof(pMsg->msgText);
1724 pMsg->bTextSms = true;
1727 if (dbHandle.columnText(16) != NULL)
1728 strncpy(pMsg->msgText, (char *)dbHandle.columnText(16), MAX_MSG_TEXT_LEN);
1732 if (dbHandle.columnText(17)!=NULL && ((char *)dbHandle.columnText(17))[0] != '\0') {
1733 strncpy(pMsg->thumbPath, (char *)dbHandle.columnText(17), MSG_FILEPATH_LEN_MAX);
1734 MSG_DEBUG("pMsg->thumbPath : [%s]", pMsg->thumbPath);
1737 dbHandle.finalizeQuery();
1738 MSG_DEBUG("%s", sqlQuery);
1739 return MSG_ERR_DB_STEP;
1742 dbHandle.finalizeQuery();
1745 // get address information.
1746 MsgStoGetAddressByMsgId(&dbHandle, pMsg->msgId, order, &pMsg->nAddressCnt, pMsg->addressList);
1748 // Get MMS body if it is MMS.
1749 if ((pMsg->networkStatus == MSG_NETWORK_RETRIEVE_SUCCESS &&
1750 (pMsg->msgType.subType == MSG_RETRIEVE_AUTOCONF_MMS || pMsg->msgType.subType == MSG_RETRIEVE_MANUALCONF_MMS)) ||
1751 pMsg->msgType.subType == MSG_SENDREQ_MMS || pMsg->msgType.subType == MSG_SENDCONF_MMS) {
1752 msg_error_t err = MSG_SUCCESS;
1753 MMS_MESSAGE_DATA_S mmsMsg;
1754 char *pDestMsg = NULL;
1755 int temp_size = pMsg->dataSize;//save raw file size;
1756 // call mms plugin to get mms specific message data
1757 MsgPlugin *plg = MsgPluginManager::instance()->getPlugin(pMsg->msgType.mainType);
1758 memset(&mmsMsg, 0, sizeof(MMS_MESSAGE_DATA_S));
1759 err = plg->getMmsMessage(pMsg, pSendOptInfo, &mmsMsg, &pDestMsg);
1761 if (err != MSG_SUCCESS) {
1766 return MSG_ERR_STORAGE_ERROR;
1769 memset(pMsg->msgData, 0, MAX_MSG_DATA_LEN+1);
1771 // Encode MMS specific data to MMS_MESSAGE_DATA_S
1772 if (pMsg->dataSize > MAX_MSG_DATA_LEN) {
1773 // Save Message Data into File
1774 char tempFileName[MSG_FILENAME_LEN_MAX+1];
1775 memset(tempFileName, 0x00, sizeof(tempFileName));
1777 if (MsgCreateFileName(tempFileName) == false) {
1782 return MSG_ERR_STORAGE_ERROR;
1784 MSG_DEBUG("Save Message Data into file : size[%d] name[%s]\n", pMsg->dataSize, tempFileName);
1786 if (MsgWriteIpcFile(tempFileName, pDestMsg, pMsg->dataSize) == false) {
1791 return MSG_ERR_STORAGE_ERROR;
1793 strncpy(pMsg->msgData, tempFileName, MAX_MSG_DATA_LEN);
1794 pMsg->bTextSms = false;
1796 strncpy(pMsg->msgData, pDestMsg, pMsg->dataSize);
1797 pMsg->bTextSms = true;
1800 pMsg->dataSize = temp_size;//raw file size;
1808 // Get SMS Sending Options
1809 if (pMsg->msgType.mainType == MSG_SMS_TYPE && pSendOptInfo != NULL)
1810 MsgStoGetSmsSendOpt(pMsg->msgId, pSendOptInfo);
1816 msg_error_t MsgStoGetFolderViewList(msg_folder_id_t folderId, const MSG_SORT_RULE_S *pSortRule, msg_struct_list_s *pMsgFolderViewList)
1818 if (pMsgFolderViewList == NULL) {
1819 MSG_DEBUG("pMsgFolderViewList is NULL");
1820 return MSG_ERR_NULL_POINTER;
1824 int index = 19; // numbers of index
1827 char sqlQuery[MAX_QUERY_LEN+1];
1831 int order = MsgGetContactNameOrder();
1833 // Get Message In Folder
1834 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1836 if (folderId == MSG_ALLBOX_ID) {
1837 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID, CONV_ID, FOLDER_ID, STORAGE_ID, MAIN_TYPE, SUB_TYPE, \
1838 DISPLAY_TIME, DATA_SIZE, NETWORK_STATUS, READ_STATUS, PROTECTED, BACKUP, PRIORITY, \
1839 MSG_DIRECTION, SCHEDULED_TIME, SUBJECT, MSG_TEXT, ATTACHMENT_COUNT, THUMB_PATH \
1840 FROM %s WHERE FOLDER_ID < %d ",
1841 MSGFW_MESSAGE_TABLE_NAME, MSG_SPAMBOX_ID);
1843 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID, CONV_ID, FOLDER_ID, STORAGE_ID, MAIN_TYPE, SUB_TYPE, \
1844 DISPLAY_TIME, DATA_SIZE, NETWORK_STATUS, READ_STATUS, PROTECTED, BACKUP, PRIORITY, \
1845 MSG_DIRECTION, SCHEDULED_TIME, SUBJECT, MSG_TEXT, ATTACHMENT_COUNT, THUMB_PATH \
1846 FROM %s WHERE FOLDER_ID = %d ",
1847 MSGFW_MESSAGE_TABLE_NAME, folderId);
1850 memset(sqlSort, 0x00, sizeof(sqlSort));
1851 MsgMakeSortRule(pSortRule, sqlSort);
1852 strncat(sqlQuery, sqlSort, strlen(sqlSort));
1854 msg_error_t err = dbHandle.getTable(sqlQuery, &rowCnt);
1856 if (err == MSG_ERR_DB_NORECORD) {
1857 pMsgFolderViewList->nCount = 0;
1858 pMsgFolderViewList->msg_struct_info = NULL;
1860 dbHandle.freeTable();
1863 } else if (err != MSG_SUCCESS) {
1864 MSG_DEBUG("sqlQuery is - %s", sqlQuery);
1865 dbHandle.freeTable();
1869 pMsgFolderViewList->nCount = rowCnt;
1871 MSG_DEBUG("pMsgCommInfoList->nCount [%d]", pMsgFolderViewList->nCount);
1873 pMsgFolderViewList->msg_struct_info = (msg_struct_t *)new char[sizeof(msg_struct_t) * rowCnt];
1875 msg_struct_s *msg = NULL;
1876 MSG_MESSAGE_HIDDEN_S *pTmp = NULL;
1878 for (int i = 0; i < rowCnt; i++) {
1879 pMsgFolderViewList->msg_struct_info[i] = (msg_struct_t)new char[sizeof(msg_struct_s)];;
1881 msg = (msg_struct_s *)pMsgFolderViewList->msg_struct_info[i];
1883 msg->type = MSG_STRUCT_MESSAGE_INFO;
1884 msg->data = new char[sizeof(MSG_MESSAGE_HIDDEN_S)];
1886 pTmp = (MSG_MESSAGE_HIDDEN_S *)msg->data;
1889 pTmp->pMmsData = NULL;
1891 pTmp->msgId = dbHandle.getColumnToInt(index++);
1892 pTmp->threadId = dbHandle.getColumnToInt(index++);
1893 pTmp->folderId = dbHandle.getColumnToInt(index++);
1894 pTmp->storageId = dbHandle.getColumnToInt(index++);
1895 pTmp->mainType = dbHandle.getColumnToInt(index++);
1896 pTmp->subType = dbHandle.getColumnToInt(index++);
1897 pTmp->displayTime = (time_t)dbHandle.getColumnToInt(index++);
1898 pTmp->dataSize = dbHandle.getColumnToInt(index++);
1899 pTmp->networkStatus = dbHandle.getColumnToInt(index++);
1900 pTmp->bRead = dbHandle.getColumnToInt(index++);
1901 pTmp->bProtected = dbHandle.getColumnToInt(index++);
1902 pTmp->bBackup = dbHandle.getColumnToInt(index++);
1903 pTmp->priority = dbHandle.getColumnToInt(index++);
1904 pTmp->direction= dbHandle.getColumnToInt(index++);
1905 index++; // This field is reserved.
1907 dbHandle.getColumnToString(index++, MAX_SUBJECT_LEN, pTmp->subject);
1909 if (pTmp->mainType == MSG_MMS_TYPE &&
1910 (pTmp->networkStatus == MSG_NETWORK_RETRIEVING || pTmp->networkStatus == MSG_NETWORK_RETRIEVE_FAIL || pTmp->subType == MSG_NOTIFICATIONIND_MMS)) {
1914 pTmp->pData = (void *)new char[pTmp->dataSize + 2];
1915 memset(pTmp->pData, 0x00, pTmp->dataSize + 2);
1917 dbHandle.getColumnToString(index++, pTmp->dataSize+1, (char *)pTmp->pData);
1920 // get address information from db.
1921 msg_struct_list_s *addr_list = (msg_struct_list_s *)new msg_struct_list_s;
1923 MsgStoGetAddressByMsgId(&dbHandle, pTmp->msgId, order, addr_list);
1925 pTmp->addr_list = addr_list;
1927 pTmp->attachCount = dbHandle.getColumnToInt(index++);
1929 dbHandle.getColumnToString(index++, MSG_FILEPATH_LEN_MAX, pTmp->thumbPath);
1932 dbHandle.freeTable();
1938 msg_error_t MsgStoAddSyncMLMessage(MSG_MESSAGE_INFO_S *pMsgInfo, int extId, int pinCode)
1942 msg_error_t err = MSG_SUCCESS;
1944 char sqlQuery[MAX_QUERY_LEN+1];
1946 unsigned int rowId = 0;
1947 msg_thread_id_t convId = 0;
1949 dbHandle.beginTrans();
1951 if (pMsgInfo->nAddressCnt > 0) {
1952 err = MsgStoAddAddress(&dbHandle, pMsgInfo, &convId);
1954 if (err != MSG_SUCCESS) {
1955 dbHandle.endTrans(false);
1960 // Add Message Table
1961 pMsgInfo->threadId = convId;
1962 rowId = MsgStoAddMessageTable(&dbHandle, pMsgInfo);
1965 dbHandle.endTrans(false);
1966 return MSG_ERR_DB_ROW;
1969 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1970 snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, %d, %d);",
1971 MSGFW_SYNCML_MSG_TABLE_NAME, rowId, extId, pinCode);
1973 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
1974 dbHandle.endTrans(false);
1975 return MSG_ERR_DB_EXEC;
1978 if (MsgStoUpdateConversation(&dbHandle, convId) != MSG_SUCCESS) {
1979 dbHandle.endTrans(false);
1980 return MSG_ERR_STORAGE_ERROR;
1983 dbHandle.endTrans(true);
1985 pMsgInfo->msgId = (msg_message_id_t)rowId;
1987 MsgSoundPlayStart(false);
1992 smsCnt = MsgStoGetUnreadCnt(&dbHandle, MSG_SMS_TYPE);
1993 mmsCnt = MsgStoGetUnreadCnt(&dbHandle, MSG_MMS_TYPE);
1995 MsgSettingHandleNewMsg(smsCnt, mmsCnt);
1997 MsgInsertNoti(pMsgInfo);
2005 msg_error_t MsgStoGetMsgType(msg_message_id_t msgId, MSG_MESSAGE_TYPE_S *pMsgType)
2007 char sqlQuery[MAX_QUERY_LEN+1];
2009 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2011 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MAIN_TYPE, SUB_TYPE FROM %s WHERE MSG_ID = %d;",
2012 MSGFW_MESSAGE_TABLE_NAME, msgId);
2014 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
2015 return MSG_ERR_DB_PREPARE;
2017 if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
2018 pMsgType->mainType = dbHandle.columnInt(0);
2019 pMsgType->subType = dbHandle.columnInt(1);
2022 dbHandle.finalizeQuery();
2028 msg_error_t MsgStoGetQuickPanelData(msg_quickpanel_type_t QPtype, MSG_MESSAGE_INFO_S *pMsg)
2030 msg_error_t err = MSG_SUCCESS;
2032 char sqlQuery[MAX_QUERY_LEN+1];
2034 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2036 if (QPtype == MSG_QUICKPANEL_SMS) {
2037 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s WHERE FOLDER_ID = %d AND MAIN_TYPE = %d AND SUB_TYPE = %d AND READ_STATUS = 0 ORDER BY DISPLAY_TIME DESC;",
2038 MSGFW_MESSAGE_TABLE_NAME, MSG_INBOX_ID, MSG_SMS_TYPE, MSG_NORMAL_SMS);
2039 } else if (QPtype == MSG_QUICKPANEL_MMS) {
2040 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s WHERE FOLDER_ID = %d AND MAIN_TYPE = %d AND SUB_TYPE IN (%d, %d) AND READ_STATUS = 0 ORDER BY DISPLAY_TIME DESC;",
2041 MSGFW_MESSAGE_TABLE_NAME, MSG_INBOX_ID, MSG_MMS_TYPE, MSG_RETRIEVE_AUTOCONF_MMS, MSG_RETRIEVE_MANUALCONF_MMS);
2042 } else if (QPtype == MSG_QUICKPANEL_DELIVER_REP) {
2043 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s WHERE SUB_TYPE IN (%d, %d) AND READ_STATUS = 0 ORDER BY DISPLAY_TIME DESC;",
2044 MSGFW_MESSAGE_TABLE_NAME, MSG_STATUS_REPORT_SMS, MSG_DELIVERYIND_MMS);
2045 } else if (QPtype == MSG_QUICKPANEL_READ_REP) {
2046 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s WHERE MAIN_TYPE = %d AND SUB_TYPE = %d AND READ_STATUS = 0 ORDER BY DISPLAY_TIME DESC;",
2047 MSGFW_MESSAGE_TABLE_NAME, MSG_MMS_TYPE, MSG_READORGIND_MMS);
2048 } else if (QPtype == MSG_QUICKPANEL_VOICEMAIL) {
2049 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s WHERE FOLDER_ID = %d AND MAIN_TYPE = %d AND SUB_TYPE = %d AND READ_STATUS = 0 ORDER BY DISPLAY_TIME DESC;",
2050 MSGFW_MESSAGE_TABLE_NAME, MSG_INBOX_ID, MSG_SMS_TYPE, MSG_MWI_VOICE_SMS);
2051 } else if (QPtype == MSG_QUICKPANEL_MMS_NOTI) {
2052 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s WHERE FOLDER_ID = %d AND MAIN_TYPE = %d AND SUB_TYPE = %d AND READ_STATUS = 0 ORDER BY DISPLAY_TIME DESC;",
2053 MSGFW_MESSAGE_TABLE_NAME, MSG_INBOX_ID, MSG_MMS_TYPE, MSG_NOTIFICATIONIND_MMS);
2057 msg_message_id_t msgId;
2059 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
2060 return MSG_ERR_DB_PREPARE;
2062 if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
2063 msgId = dbHandle.columnInt(0);
2065 dbHandle.finalizeQuery();
2066 return MSG_ERR_DB_STEP;
2069 dbHandle.finalizeQuery();
2072 err = MsgStoGetMessage(msgId, pMsg, NULL);
2078 msg_error_t MsgStoGetThreadViewList(const MSG_SORT_RULE_S *pSortRule, msg_struct_list_s *pThreadViewList)
2080 pThreadViewList->nCount = 0;
2081 pThreadViewList->msg_struct_info = NULL;
2084 int index = 11; // numbers of index
2086 char sqlQuery[MAX_QUERY_LEN+1];
2087 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2089 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.CONV_ID, A.UNREAD_CNT, A.SMS_CNT, A.MMS_CNT, \
2090 A.MAIN_TYPE, A.SUB_TYPE, A.MSG_DIRECTION, A.DISPLAY_TIME, A.DISPLAY_NAME, A.MSG_TEXT, \
2091 (SELECT COUNT(*) FROM %s B WHERE B.CONV_ID = A.CONV_ID AND B.PROTECTED = 1) AS PROTECTED \
2092 FROM %s A WHERE A.SMS_CNT > 0 OR A.MMS_CNT > 0 ORDER BY A.DISPLAY_TIME DESC;",
2093 MSGFW_MESSAGE_TABLE_NAME, MSGFW_CONVERSATION_TABLE_NAME);
2095 msg_error_t err = dbHandle.getTable(sqlQuery, &rowCnt);
2097 if (err == MSG_ERR_DB_NORECORD) {
2098 dbHandle.freeTable();
2100 } else if (err != MSG_SUCCESS) {
2101 MSG_DEBUG("%s", sqlQuery);
2102 dbHandle.freeTable();
2107 MSG_DEBUG("rowCnt is %d", rowCnt);
2108 dbHandle.freeTable();
2112 pThreadViewList->nCount = rowCnt;
2114 MSG_DEBUG("pThreadViewList->nCount [%d]", pThreadViewList->nCount);
2116 pThreadViewList->msg_struct_info = (msg_struct_t *)new char[sizeof(msg_struct_t)*rowCnt];
2118 MSG_THREAD_VIEW_S *pTmp = NULL;
2119 msg_struct_s *thread_t = NULL;
2121 for (int i = 0; i < rowCnt; i++) {
2122 thread_t = (msg_struct_s *)new msg_struct_s;
2123 pThreadViewList->msg_struct_info[i] = (msg_struct_t)thread_t;
2125 thread_t->type = MSG_STRUCT_THREAD_INFO;
2126 thread_t->data = new MSG_THREAD_VIEW_S;
2128 pTmp = (MSG_THREAD_VIEW_S *)thread_t->data;
2129 memset(pTmp, 0x00, sizeof(MSG_THREAD_VIEW_S));
2131 pTmp->threadId = dbHandle.getColumnToInt(index++);
2133 pTmp->unreadCnt = dbHandle.getColumnToInt(index++);
2134 pTmp->smsCnt = dbHandle.getColumnToInt(index++);
2135 pTmp->mmsCnt = dbHandle.getColumnToInt(index++);
2137 pTmp->mainType = dbHandle.getColumnToInt(index++);
2138 pTmp->subType = dbHandle.getColumnToInt(index++);
2140 pTmp->direction = dbHandle.getColumnToInt(index++);
2141 pTmp->threadTime = (time_t)dbHandle.getColumnToInt(index++);
2143 memset(pTmp->threadName, 0x00, sizeof(pTmp->threadName));
2144 dbHandle.getColumnToString(index++, MAX_THREAD_NAME_LEN, pTmp->threadName);
2146 memset(pTmp->threadData, 0x00, sizeof(pTmp->threadData));
2147 dbHandle.getColumnToString(index++, MAX_THREAD_DATA_LEN, pTmp->threadData);
2149 int protectedCnt = dbHandle.getColumnToInt(index++);
2150 if (protectedCnt > 0)
2151 pTmp->bProtected = true;
2154 dbHandle.freeTable();
2159 msg_error_t MsgStoGetConversationPreview(MSG_CONVERSATION_VIEW_S *pConv)
2161 MsgDbHandler dbHandleForInner;
2162 char sqlQuery[MAX_QUERY_LEN + 1];
2165 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2168 return MSG_ERR_NULL_POINTER;
2170 //(MSG_ID INTEGER, TYPE INTEGER, VALUE TEXT, COUNT INTEGER)
2171 snprintf(sqlQuery, sizeof(sqlQuery),
2172 "SELECT TYPE, VALUE, COUNT "
2173 "FROM %s WHERE MSG_ID=%d;",
2174 MSGFW_MMS_PREVIEW_TABLE_NAME, pConv->msgId);
2176 MSG_DEBUG("QUERY : [%s]", sqlQuery);
2178 msg_error_t err = dbHandleForInner.getTable(sqlQuery, &rowCnt);
2179 if (err == MSG_SUCCESS) {
2180 for (int i = 0; i < rowCnt; i++) {
2181 int type = dbHandleForInner.getColumnToInt(index++);
2182 if (type == MSG_MMS_ITEM_TYPE_IMG) {
2183 dbHandleForInner.getColumnToString(index++, MSG_FILEPATH_LEN_MAX, pConv->imageThumbPath);
2184 dbHandleForInner.getColumnToInt(index++);
2185 } else if (type == MSG_MMS_ITEM_TYPE_VIDEO) {
2186 dbHandleForInner.getColumnToString(index++, MSG_FILEPATH_LEN_MAX, pConv->videoThumbPath);
2187 dbHandleForInner.getColumnToInt(index++);
2188 } else if (type == MSG_MMS_ITEM_TYPE_AUDIO) {
2189 dbHandleForInner.getColumnToString(index++, MSG_FILENAME_LEN_MAX, pConv->audioFileName);
2190 dbHandleForInner.getColumnToInt(index++);
2191 } else if (type == MSG_MMS_ITEM_TYPE_ATTACH) {
2192 dbHandleForInner.getColumnToString(index++, MSG_FILENAME_LEN_MAX, pConv->attachFileName);
2193 dbHandleForInner.getColumnToInt(index++);
2194 } else if (type == MSG_MMS_ITEM_TYPE_PAGE) {
2196 pConv->pageCount = dbHandleForInner.getColumnToInt(index++);
2198 MSG_DEBUG("Unknown item type [%d]", type);
2204 dbHandleForInner.freeTable();
2208 msg_error_t MsgStoGetConversationViewItem(msg_message_id_t msgId, MSG_CONVERSATION_VIEW_S *pConv)
2211 int index = 16; /** numbers of index */
2212 char sqlQuery[MAX_QUERY_LEN+1];
2214 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2216 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID, CONV_ID, FOLDER_ID, STORAGE_ID, MAIN_TYPE, SUB_TYPE, \
2217 DISPLAY_TIME, DATA_SIZE, NETWORK_STATUS, READ_STATUS, PROTECTED, \
2218 MSG_DIRECTION, SCHEDULED_TIME, SUBJECT, MSG_TEXT, ATTACHMENT_COUNT \
2219 FROM %s WHERE MSG_ID=%d;",
2220 MSGFW_MESSAGE_TABLE_NAME, msgId);
2222 msg_error_t err = dbHandle.getTable(sqlQuery, &rowCnt);
2224 if (err == MSG_ERR_DB_NORECORD) {
2225 dbHandle.freeTable();
2227 } else if (err != MSG_SUCCESS) {
2228 MSG_DEBUG("%s", sqlQuery);
2229 dbHandle.freeTable();
2233 memset(pConv, 0x00, sizeof(MSG_CONVERSATION_VIEW_S));
2234 pConv->pText = NULL;
2236 pConv->msgId = dbHandle.getColumnToInt(index++);
2237 pConv->threadId = dbHandle.getColumnToInt(index++);
2238 pConv->folderId = dbHandle.getColumnToInt(index++);
2239 pConv->storageId = dbHandle.getColumnToInt(index++);
2240 pConv->mainType = dbHandle.getColumnToInt(index++);
2241 pConv->subType = dbHandle.getColumnToInt(index++);
2242 pConv->displayTime = (time_t)dbHandle.getColumnToInt(index++);
2243 pConv->textSize = dbHandle.getColumnToInt(index++);
2244 pConv->networkStatus = dbHandle.getColumnToInt(index++);
2245 pConv->bRead = dbHandle.getColumnToInt(index++);
2246 pConv->bProtected = dbHandle.getColumnToInt(index++);
2247 pConv->direction = dbHandle.getColumnToInt(index++);
2248 pConv->scheduledTime = (time_t)dbHandle.getColumnToInt(index++);
2250 dbHandle.getColumnToString(index++, MAX_SUBJECT_LEN, pConv->subject);
2252 if (pConv->mainType == MSG_MMS_TYPE &&
2253 (pConv->networkStatus == MSG_NETWORK_RETRIEVING || pConv->networkStatus == MSG_NETWORK_RETRIEVE_FAIL || pConv->subType == MSG_NOTIFICATIONIND_MMS)) {
2254 pConv->pText = NULL;
2255 pConv->textSize = 0;
2258 if (pConv->mainType == MSG_SMS_TYPE) {
2259 pConv->pText = new char[pConv->textSize+2];
2260 memset(pConv->pText, 0x00, pConv->textSize+2);
2261 dbHandle.getColumnToString(index++, pConv->textSize+1, pConv->pText);
2263 char tmpMmsText[MAX_MMS_TEXT_LEN+1];
2264 memset(tmpMmsText, 0x00, MAX_MMS_TEXT_LEN+1);
2266 dbHandle.getColumnToString(index++, MAX_MMS_TEXT_LEN, tmpMmsText);
2268 pConv->textSize = strlen(tmpMmsText);
2270 pConv->pText = new char[pConv->textSize+2];
2271 memset(pConv->pText, 0x00, pConv->textSize+2);
2273 strncpy(pConv->pText, tmpMmsText, pConv->textSize+1);
2275 MsgStoGetConversationPreview(pConv);
2279 pConv->attachCount = dbHandle.getColumnToInt(index++);
2286 msg_error_t MsgStoGetConversationViewList(msg_thread_id_t threadId, msg_struct_list_s *pConvViewList)
2290 pConvViewList->nCount = 0;
2291 pConvViewList->msg_struct_info = NULL;
2294 int index = 16; /** numbers of index */
2295 char sqlQuery[MAX_QUERY_LEN+1];
2297 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2299 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID, CONV_ID, FOLDER_ID, STORAGE_ID, MAIN_TYPE, SUB_TYPE, \
2300 DISPLAY_TIME, DATA_SIZE, NETWORK_STATUS, READ_STATUS, PROTECTED, \
2301 MSG_DIRECTION, SCHEDULED_TIME, SUBJECT, MSG_TEXT, ATTACHMENT_COUNT \
2302 FROM %s WHERE CONV_ID = %d AND FOLDER_ID > %d AND FOLDER_ID < %d AND STORAGE_ID = %d ORDER BY DISPLAY_TIME, MSG_ID ASC;",
2303 MSGFW_MESSAGE_TABLE_NAME, threadId, MSG_ALLBOX_ID, MSG_CBMSGBOX_ID, MSG_STORAGE_PHONE);
2305 msg_error_t err = dbHandle.getTable(sqlQuery, &rowCnt);
2307 if (err == MSG_ERR_DB_NORECORD) {
2308 dbHandle.freeTable();
2310 } else if (err != MSG_SUCCESS) {
2311 MSG_DEBUG("%s", sqlQuery);
2312 dbHandle.freeTable();
2316 pConvViewList->nCount = rowCnt;
2318 MSG_DEBUG("pConvViewList->nCount [%d]", pConvViewList->nCount);
2320 pConvViewList->msg_struct_info = (msg_struct_t *)new char[sizeof(msg_struct_t) * rowCnt];
2321 memset(pConvViewList->msg_struct_info, 0x00, sizeof(msg_struct_t) * rowCnt);
2323 msg_struct_s *conv = NULL;
2324 MSG_CONVERSATION_VIEW_S *pTmp = NULL;
2326 for (int i = 0; i < rowCnt; i++) {
2327 pConvViewList->msg_struct_info[i] = (msg_struct_t)new char[sizeof(msg_struct_s)];;
2328 memset(pConvViewList->msg_struct_info[i], 0x00, sizeof(msg_struct_s));
2330 conv = (msg_struct_s *)pConvViewList->msg_struct_info[i];
2332 conv->type = MSG_STRUCT_CONV_INFO;
2333 conv->data = new char[sizeof(MSG_CONVERSATION_VIEW_S)];
2334 memset(conv->data, 0x00, sizeof(MSG_CONVERSATION_VIEW_S));
2336 pTmp = (MSG_CONVERSATION_VIEW_S *)conv->data;
2340 pTmp->msgId = dbHandle.getColumnToInt(index++);
2341 pTmp->threadId = dbHandle.getColumnToInt(index++);
2342 pTmp->folderId = dbHandle.getColumnToInt(index++);
2343 pTmp->storageId = dbHandle.getColumnToInt(index++);
2344 pTmp->mainType = dbHandle.getColumnToInt(index++);
2345 pTmp->subType = dbHandle.getColumnToInt(index++);
2346 pTmp->displayTime = (time_t)dbHandle.getColumnToInt(index++);
2347 pTmp->textSize = dbHandle.getColumnToInt(index++);
2348 pTmp->networkStatus = dbHandle.getColumnToInt(index++);
2349 pTmp->bRead = dbHandle.getColumnToInt(index++);
2350 pTmp->bProtected = dbHandle.getColumnToInt(index++);
2351 pTmp->direction = dbHandle.getColumnToInt(index++);
2352 index++; // This field is reserved.
2354 dbHandle.getColumnToString(index++, MAX_SUBJECT_LEN, pTmp->subject);
2356 if (pTmp->mainType == MSG_MMS_TYPE &&
2357 (pTmp->networkStatus == MSG_NETWORK_RETRIEVING || pTmp->networkStatus == MSG_NETWORK_RETRIEVE_FAIL || pTmp->subType == MSG_NOTIFICATIONIND_MMS)) {
2362 if (pTmp->mainType == MSG_SMS_TYPE) {
2363 pTmp->pText = new char[pTmp->textSize+2];
2364 memset(pTmp->pText, 0x00, pTmp->textSize+2);
2365 dbHandle.getColumnToString(index++, pTmp->textSize+1, pTmp->pText);
2367 char tmpMmsText[MAX_MMS_TEXT_LEN+1];
2368 memset(tmpMmsText, 0x00, MAX_MMS_TEXT_LEN+1);
2370 dbHandle.getColumnToString(index++, MAX_MMS_TEXT_LEN, tmpMmsText);
2372 pTmp->textSize = strlen(tmpMmsText);
2374 pTmp->pText = new char[pTmp->textSize+2];
2375 memset(pTmp->pText, 0x00, pTmp->textSize+2);
2377 strncpy(pTmp->pText, tmpMmsText, pTmp->textSize+1);
2381 pTmp->attachCount = dbHandle.getColumnToInt(index++);
2383 MsgStoGetConversationPreview(pTmp);
2386 dbHandle.freeTable();
2394 msg_error_t MsgStoDeleteThreadMessageList(msg_thread_id_t threadId, bool bIncludeProtect, msg_id_list_s *pMsgIdList)
2396 msg_error_t err = MSG_SUCCESS;
2398 char sqlQuery[MAX_QUERY_LEN+1];
2400 /*** Get msg id list **/
2404 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2406 if (bIncludeProtect) {
2407 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s WHERE \
2408 CONV_ID = %d AND FOLDER_ID > %d AND FOLDER_ID < %d AND STORAGE_ID = %d;",
2409 MSGFW_MESSAGE_TABLE_NAME, threadId, MSG_ALLBOX_ID, MSG_CBMSGBOX_ID, MSG_STORAGE_PHONE);
2411 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s WHERE \
2412 CONV_ID = %d AND FOLDER_ID > %d AND FOLDER_ID < %d AND STORAGE_ID = %d AND PROTECTED = 0;",
2413 MSGFW_MESSAGE_TABLE_NAME, threadId, MSG_ALLBOX_ID, MSG_CBMSGBOX_ID, MSG_STORAGE_PHONE);
2416 err = dbHandle.getTable(sqlQuery, &rowCnt);
2418 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
2419 MSG_DEBUG("sqlQuery [%s]", sqlQuery);
2420 dbHandle.freeTable();
2424 dbHandle.freeTable();
2428 pMsgIdList->nCount = rowCnt;
2430 MSG_DEBUG("pMsgIdList->nCount [%d]", pMsgIdList->nCount);
2432 pMsgIdList->msgIdList = (msg_message_id_t *)new char[sizeof(msg_message_id_t) * rowCnt];
2434 for (int i = 0; i < rowCnt; i++)
2435 pMsgIdList->msgIdList[i] = dbHandle.getColumnToInt(index++);
2437 dbHandle.freeTable();
2440 err = MsgStoDeleteMessageByList(pMsgIdList);
2446 msg_error_t MsgStoCountMsgByContact(const MSG_THREAD_LIST_INDEX_S *pAddrInfo, MSG_THREAD_COUNT_INFO_S *pThreadCountInfo)
2448 char sqlQuery[MAX_QUERY_LEN+1];
2450 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2452 if (pAddrInfo->contactId > 0) {
2453 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(*) AS TOTAL, \
2454 SUM(CASE WHEN READ_STATUS=0 AND FOLDER_ID=%d THEN 1 ELSE 0 END), \
2455 SUM(CASE WHEN MAIN_TYPE=%d THEN 1 ELSE 0 END), \
2456 SUM(CASE WHEN MAIN_TYPE=%d THEN 1 ELSE 0 END) \
2457 FROM (SELECT * FROM %s A JOIN %s B ON A.ADDRESS_ID = B.ADDRESS_ID WHERE B.CONTACT_ID = %d)",
2458 MSG_INBOX_ID, MSG_SMS_TYPE, MSG_MMS_TYPE, MSGFW_MESSAGE_TABLE_NAME, MSGFW_ADDRESS_TABLE_NAME, pAddrInfo->contactId);
2460 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(*) AS TOTAL, \
2461 SUM(CASE WHEN READ_STATUS=0 AND FOLDER_ID=%d THEN 1 ELSE 0 END), \
2462 SUM(CASE WHEN MAIN_TYPE=%d THEN 1 ELSE 0 END), \
2463 SUM(CASE WHEN MAIN_TYPE=%d THEN 1 ELSE 0 END) \
2464 FROM (SELECT * FROM %s A JOIN %s B ON A.ADDRESS_ID = B.ADDRESS_ID WHERE B.ADDRESS_VAL = '%s')",
2465 MSG_INBOX_ID, MSG_SMS_TYPE, MSG_MMS_TYPE, MSGFW_MESSAGE_TABLE_NAME, MSGFW_ADDRESS_TABLE_NAME, pAddrInfo->msgAddrInfo.addressVal);
2468 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
2469 return MSG_ERR_DB_PREPARE;
2471 if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
2472 pThreadCountInfo->totalCount = dbHandle.columnInt(0);
2473 pThreadCountInfo->unReadCount = dbHandle.columnInt(1);
2474 pThreadCountInfo->smsMsgCount = dbHandle.columnInt(2);
2475 pThreadCountInfo->mmsMsgCount = dbHandle.columnInt(3);
2477 dbHandle.finalizeQuery();
2478 return MSG_ERR_DB_STEP;
2481 dbHandle.finalizeQuery();
2487 msg_error_t MsgStoSearchMessage(const char *pSearchString, msg_struct_list_s *pThreadViewList)
2490 return MSG_ERR_NULL_POINTER;
2492 // Clear Out Parameter
2493 pThreadViewList->nCount = 0;
2494 pThreadViewList->msg_struct_info = NULL;
2496 tr1::unordered_set<msg_thread_id_t> IdList;
2497 queue<MSG_THREAD_VIEW_S> searchList;
2499 MSG_THREAD_VIEW_S threadView;
2501 char sqlQuery[MAX_QUERY_LEN+1];
2503 // Replace string for '%' and '_' character
2504 char *ext1_str = NULL;
2505 char *ext2_str = NULL;
2507 ext1_str = MsgStoReplaceString(pSearchString, "_", "\\_");
2508 ext2_str = MsgStoReplaceString(ext1_str, "%", "\\%");
2510 // Search - Address, Name
2511 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2513 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT CONV_ID, UNREAD_CNT, SMS_CNT, MMS_CNT, DISPLAY_NAME, \
2514 MAIN_TYPE, SUB_TYPE, MSG_DIRECTION, DISPLAY_TIME, MSG_TEXT \
2515 FROM %s WHERE DISPLAY_NAME LIKE '%%%s%%' ESCAPE '\\' ORDER BY DISPLAY_TIME DESC;",
2516 MSGFW_CONVERSATION_TABLE_NAME, ext2_str);
2528 MSG_DEBUG("[%s]", sqlQuery);
2530 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS) {
2531 MSG_DEBUG("Prepare query fail. [%s]", sqlQuery);
2532 return MSG_ERR_DB_PREPARE;
2535 while (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
2536 memset(&threadView, 0x00, sizeof(threadView));
2538 threadView.threadId = dbHandle.columnInt(0);
2539 threadView.unreadCnt = dbHandle.columnInt(1);
2540 threadView.smsCnt = dbHandle.columnInt(2);
2541 threadView.mmsCnt = dbHandle.columnInt(3);
2543 strncpy(threadView.threadName, (char *)dbHandle.columnText(4), MAX_THREAD_NAME_LEN);
2545 threadView.mainType = dbHandle.columnInt(5);
2546 threadView.subType = dbHandle.columnInt(6);
2548 threadView.direction = dbHandle.columnInt(7);
2549 threadView.threadTime = (time_t)dbHandle.columnInt(8);
2551 strncpy(threadView.threadData, (char *)dbHandle.columnText(9), MAX_THREAD_DATA_LEN);
2553 tr1::unordered_set<msg_thread_id_t>::iterator it;
2555 it = IdList.find(threadView.threadId);
2557 if (it == IdList.end()) {
2558 IdList.insert(threadView.threadId);
2559 searchList.push(threadView);
2564 dbHandle.finalizeQuery();
2566 // Add data to Out Parameter
2567 pThreadViewList->nCount = searchList.size();
2568 pThreadViewList->msg_struct_info = (msg_struct_t *)new char[sizeof(msg_struct_t) * searchList.size()];
2570 MSG_THREAD_VIEW_S *pTmp = NULL;
2571 msg_struct_s *thread_t = NULL;
2575 while (!searchList.empty()) {
2576 thread_t = (msg_struct_s *)new msg_struct_s;
2577 pThreadViewList->msg_struct_info[index] = (msg_struct_t)thread_t;
2579 thread_t->type = MSG_STRUCT_THREAD_INFO;
2580 thread_t->data = new MSG_THREAD_VIEW_S;
2582 pTmp = (MSG_THREAD_VIEW_S *)thread_t->data;
2583 memset(pTmp, 0x00, sizeof(MSG_THREAD_VIEW_S));
2585 memcpy(pTmp, &(searchList.front()), sizeof(MSG_THREAD_VIEW_S));
2596 msg_error_t MsgStoSearchMessage(const MSG_SEARCH_CONDITION_S *pSearchCon, int offset, int limit, msg_struct_list_s *pMsgList)
2598 // Clear Out Parameter
2599 pMsgList->nCount = 0;
2600 pMsgList->msg_struct_info = NULL;
2603 int index = 26; // numbers of index
2605 char sqlQuery[MAX_QUERY_LEN+1];
2606 char sqlQuerySubset[(MAX_QUERY_LEN/5)+1];
2608 char firstName[MAX_DISPLAY_NAME_LEN+1], lastName[MAX_DISPLAY_NAME_LEN+1];
2609 char displayName[MAX_DISPLAY_NAME_LEN+1];
2611 char *ext1_str = NULL;
2612 char *ext2_str = NULL;
2615 int order = MsgGetContactNameOrder();
2617 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2619 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.MSG_ID, A.CONV_ID, A.FOLDER_ID, A.STORAGE_ID, A.MAIN_TYPE, A.SUB_TYPE, "
2620 "A.DISPLAY_TIME, A.DATA_SIZE, A.NETWORK_STATUS, A.READ_STATUS, A.PROTECTED, A.BACKUP, A.PRIORITY, "
2621 "A.MSG_DIRECTION, A.SCHEDULED_TIME, A.SUBJECT, A.MSG_TEXT, B.ADDRESS_TYPE, B.RECIPIENT_TYPE, "
2622 "B.CONTACT_ID, B.ADDRESS_VAL, B.DISPLAY_NAME, B.FIRST_NAME, B.LAST_NAME, A.ATTACHMENT_COUNT, A.THUMB_PATH "
2623 "FROM %s A, %s B WHERE A.CONV_ID = B.CONV_ID AND B.ADDRESS_ID <> 0 ",
2624 MSGFW_MESSAGE_TABLE_NAME, MSGFW_ADDRESS_TABLE_NAME);
2627 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2629 if (pSearchCon->folderId == MSG_ALLBOX_ID)
2630 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.FOLDER_ID > 0 AND A.FOLDER_ID < %d ", MSG_CBMSGBOX_ID);
2631 else if (pSearchCon->folderId == MSG_IOSBOX_ID)
2632 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.FOLDER_ID > 0 AND A.FOLDER_ID < %d ", MSG_DRAFT_ID);
2634 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.FOLDER_ID = %d ", pSearchCon->folderId);
2636 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2640 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2642 switch (pSearchCon->msgType) {
2644 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.MAIN_TYPE = %d AND A.SUB_TYPE = %d ", MSG_SMS_TYPE, MSG_NORMAL_SMS);
2648 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.MAIN_TYPE = %d ", MSG_MMS_TYPE);
2651 case MSG_TYPE_MMS_JAVA:
2652 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.MAIN_TYPE = %d AND A.SUB_TYPE = %d ", MSG_MMS_TYPE, MSG_SENDREQ_JAVA_MMS);
2655 case MSG_TYPE_SMS_SYNCML:
2656 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.MAIN_TYPE = %d AND A.SUB_TYPE = %d ", MSG_SMS_TYPE, MSG_SYNCML_CP);
2659 case MSG_TYPE_SMS_REJECT:
2660 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.MAIN_TYPE = %d AND A.SUB_TYPE = %d ", MSG_SMS_TYPE, MSG_REJECT_SMS);
2664 MSG_DEBUG("msg type is not set.");
2668 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2671 if (pSearchCon->pSearchVal != NULL) {
2673 // Replace string for '%' and '_' character
2674 ext1_str = MsgStoReplaceString(pSearchCon->pSearchVal, "_", "\\_");
2675 ext2_str = MsgStoReplaceString(ext1_str, "%", "\\%");
2677 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2678 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset),
2679 "AND ( A.MSG_TEXT LIKE '%%%s%%' ESCAPE '\\' "
2680 "OR A.SUBJECT LIKE '%%%s%%' ESCAPE '\\' "
2681 "OR B.ADDRESS_VAL LIKE '%%%s%%' ESCAPE '\\' "
2682 "OR B.DISPLAY_NAME LIKE '%%%s%%' ESCAPE '\\' "
2683 "OR B.FIRST_NAME LIKE '%%%s%%' ESCAPE '\\' "
2684 "OR B.LAST_NAME LIKE '%%%s%%' ESCAPE '\\') ",
2685 ext2_str, ext2_str, ext2_str, ext2_str, ext2_str, ext2_str);
2686 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2700 if (pSearchCon->pAddressVal != NULL) {
2702 // Replace string for '%' and '_' character
2703 ext1_str = MsgStoReplaceString(pSearchCon->pAddressVal, "_", "\\_");
2704 ext2_str = MsgStoReplaceString(ext1_str, "%", "\\%");
2706 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2707 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND B.ADDRESS_VAL LIKE '%%%s%%' ESCAPE '\\' ", ext2_str);
2708 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2722 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2724 if (offset >= 0 && limit > 0)
2725 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "GROUP BY A.MSG_ID ORDER BY A.DISPLAY_TIME DESC LIMIT %d OFFSET %d;", limit, offset);
2727 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "GROUP BY A.MSG_ID ORDER BY A.DISPLAY_TIME DESC;");
2729 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2731 msg_error_t err = dbHandle.getTable(sqlQuery, &rowCnt);
2733 if (err == MSG_ERR_DB_NORECORD) {
2734 dbHandle.freeTable();
2737 } else if (err != MSG_SUCCESS) {
2738 MSG_DEBUG("Get table fail. [%s]", sqlQuery);
2740 dbHandle.freeTable();
2745 pMsgList->nCount = rowCnt;
2747 MSG_DEBUG("pMsgList->nCount [%d]", pMsgList->nCount);
2749 pMsgList->msg_struct_info = (msg_struct_t *)new char[sizeof(msg_struct_t) * rowCnt];
2751 MSG_MESSAGE_HIDDEN_S *pTmp = NULL;
2752 msg_struct_s *msg = NULL;
2754 for (int i = 0; i < rowCnt; i++) {
2755 pMsgList->msg_struct_info[i] = (msg_struct_t)new msg_struct_s;
2757 msg = (msg_struct_s *)pMsgList->msg_struct_info[i];
2759 msg->type = MSG_STRUCT_MESSAGE_INFO;
2760 msg->data = (int *)new char[sizeof(MSG_MESSAGE_HIDDEN_S)];
2762 pTmp = (MSG_MESSAGE_HIDDEN_S *)msg->data;
2764 memset(pTmp, 0x00, sizeof(MSG_MESSAGE_HIDDEN_S));
2767 pTmp->pMmsData = NULL;
2769 pTmp->msgId = dbHandle.getColumnToInt(index++);
2770 pTmp->threadId = dbHandle.getColumnToInt(index++);
2771 pTmp->folderId = dbHandle.getColumnToInt(index++);
2772 pTmp->storageId = dbHandle.getColumnToInt(index++);
2773 pTmp->mainType = dbHandle.getColumnToInt(index++);
2774 pTmp->subType = dbHandle.getColumnToInt(index++);
2775 pTmp->displayTime = (time_t)dbHandle.getColumnToInt(index++);
2776 pTmp->dataSize = dbHandle.getColumnToInt(index++);
2777 pTmp->networkStatus = dbHandle.getColumnToInt(index++);
2778 pTmp->bRead = dbHandle.getColumnToInt(index++);
2779 pTmp->bProtected = dbHandle.getColumnToInt(index++);
2780 pTmp->bBackup = dbHandle.getColumnToInt(index++);
2781 pTmp->priority = dbHandle.getColumnToInt(index++);
2782 pTmp->direction= dbHandle.getColumnToInt(index++);
2783 index++; // This field is reserved.
2785 dbHandle.getColumnToString(index++, MAX_SUBJECT_LEN, pTmp->subject);
2787 if (pTmp->mainType == MSG_MMS_TYPE &&
2788 (pTmp->networkStatus == MSG_NETWORK_RETRIEVING || pTmp->networkStatus == MSG_NETWORK_RETRIEVE_FAIL || pTmp->subType == MSG_NOTIFICATIONIND_MMS)) {
2792 MSG_DEBUG("pTmp->dataSize [%d]", pTmp->dataSize);
2793 pTmp->pData = (void *)new char[pTmp->dataSize + 2];
2794 memset(pTmp->pData, 0x00, pTmp->dataSize + 2);
2796 dbHandle.getColumnToString(index++, pTmp->dataSize+1, (char *)pTmp->pData);
2799 msg_struct_list_s *addr_list = (msg_struct_list_s *)new msg_struct_list_s;
2800 msg_struct_s *addr_info = NULL;
2801 MSG_ADDRESS_INFO_S *address = NULL;
2803 addr_list->nCount = 1;
2804 addr_list->msg_struct_info = (msg_struct_t *)new char[sizeof(msg_struct_t *)*MAX_TO_ADDRESS_CNT];
2806 msg_struct_s *pTmpAddr = NULL;
2808 for (int i = 0; i < MAX_TO_ADDRESS_CNT; i++) {
2809 addr_list->msg_struct_info[i] = (msg_struct_t)new char[sizeof(msg_struct_s)];
2810 pTmpAddr = (msg_struct_s *)addr_list->msg_struct_info[i];
2811 pTmpAddr->type = MSG_STRUCT_ADDRESS_INFO;
2812 pTmpAddr->data = new MSG_ADDRESS_INFO_S;
2813 memset(pTmpAddr->data, 0x00, sizeof(MSG_ADDRESS_INFO_S));
2815 addr_list->msg_struct_info[i] = (msg_struct_t)pTmpAddr;
2818 addr_info = (msg_struct_s *)addr_list->msg_struct_info[0];
2819 address = (MSG_ADDRESS_INFO_S *)addr_info->data;
2820 address->addressType = dbHandle.getColumnToInt(index++);
2821 address->recipientType = dbHandle.getColumnToInt(index++);
2822 address->contactId = dbHandle.getColumnToInt(index++);
2824 dbHandle.getColumnToString(index++, MAX_ADDRESS_VAL_LEN, address->addressVal);
2826 memset(displayName, 0x00, sizeof(displayName));
2827 dbHandle.getColumnToString(index++, MAX_DISPLAY_NAME_LEN, displayName);
2829 memset(firstName, 0x00, sizeof(firstName));
2830 dbHandle.getColumnToString(index++, MAX_DISPLAY_NAME_LEN, firstName);
2832 memset(lastName, 0x00, sizeof(lastName));
2833 dbHandle.getColumnToString(index++, MAX_DISPLAY_NAME_LEN, lastName);
2835 if (strlen(displayName) <= 0) {
2837 if (firstName[0] != '\0') {
2838 strncpy(displayName, firstName, MAX_DISPLAY_NAME_LEN);
2841 if (lastName[0] != '\0') {
2842 strncat(displayName, " ", MAX_DISPLAY_NAME_LEN-strlen(displayName));
2843 strncat(displayName, lastName, MAX_DISPLAY_NAME_LEN-strlen(displayName));
2845 } else if (order == 1) {
2846 if (lastName[0] != '\0') {
2847 strncpy(displayName, lastName, MAX_DISPLAY_NAME_LEN);
2848 strncat(displayName, " ", MAX_DISPLAY_NAME_LEN-strlen(displayName));
2851 if (firstName[0] != '\0') {
2852 strncat(displayName, firstName, MAX_DISPLAY_NAME_LEN-strlen(displayName));
2857 strncpy(address->displayName, displayName, MAX_DISPLAY_NAME_LEN);
2859 pTmp->addr_list = addr_list;
2861 pTmp->attachCount = dbHandle.getColumnToInt(index++);
2863 dbHandle.getColumnToString(index++, MSG_FILEPATH_LEN_MAX, pTmp->thumbPath);
2866 dbHandle.freeTable();
2872 void MsgConvertNumber(const char *pSrcNum, char *pDestNum)
2877 overLen = strlen(pSrcNum) - MAX_PRECONFIG_NUM;
2879 for (i = 0; i < MAX_PRECONFIG_NUM; i++)
2880 pDestNum[i] = pSrcNum[i+overLen];
2886 msg_error_t MsgStoGetRejectMsgList(const char *pNumber, msg_struct_list_s *pRejectMsgList)
2888 // Clear Out Parameter
2889 pRejectMsgList->nCount = 0;
2890 pRejectMsgList->msg_struct_info = NULL;
2893 int index = 3; // numbers of index
2895 char sqlQuery[MAX_QUERY_LEN+1];
2897 // Search Reject Msg
2898 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2900 if (pNumber != NULL) {
2901 char phoneNumber[MAX_PRECONFIG_NUM+1];
2902 memset(phoneNumber, 0x00, sizeof(phoneNumber));
2904 if (strlen(pNumber) > MAX_PRECONFIG_NUM)
2905 MsgConvertNumber(pNumber, phoneNumber);
2907 strncpy(phoneNumber, pNumber, MAX_PRECONFIG_NUM);
2909 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT B.MSG_ID, B.MSG_TEXT, B.DISPLAY_TIME \
2911 WHERE A.CONV_ID = B.CONV_ID AND B.MAIN_TYPE = %d \
2912 AND B.SUB_TYPE = %d AND A.ADDRESS_VAL LIKE '%%%s' \
2913 ORDER BY B.DISPLAY_TIME DESC;",
2914 MSGFW_ADDRESS_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME,
2915 MSG_SMS_TYPE, MSG_REJECT_SMS, phoneNumber);
2917 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT B.MSG_ID, B.MSG_TEXT, B.DISPLAY_TIME \
2919 WHERE A.CONV_ID = B.CONV_ID AND B.MAIN_TYPE = %d AND B.SUB_TYPE = %d \
2920 ORDER BY B.DISPLAY_TIME DESC;",
2921 MSGFW_ADDRESS_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME,
2922 MSG_SMS_TYPE, MSG_REJECT_SMS);
2925 msg_error_t err = dbHandle.getTable(sqlQuery, &rowCnt);
2927 if (err != MSG_SUCCESS) {
2928 MSG_DEBUG("%s", sqlQuery);
2930 dbHandle.freeTable();
2935 pRejectMsgList->nCount = rowCnt;
2937 MSG_DEBUG("pRejectMsgList->nCount [%d]", pRejectMsgList->nCount);
2939 pRejectMsgList->msg_struct_info = (msg_struct_t *)new char[sizeof(MSG_REJECT_MSG_INFO_S *)*rowCnt];
2941 msg_struct_s* pTmp = NULL;
2943 for (int i = 0; i < rowCnt; i++) {
2944 pRejectMsgList->msg_struct_info[i] = (msg_struct_t)new char[sizeof(msg_struct_s)];
2946 pTmp = (msg_struct_s *)pRejectMsgList->msg_struct_info[i];
2947 pTmp->type = MSG_STRUCT_REJECT_MSG_INFO;
2948 pTmp->data = new char[sizeof(MSG_FOLDER_INFO_S)];
2949 MSG_REJECT_MSG_INFO_S * pMsg = (MSG_REJECT_MSG_INFO_S *)pTmp->data;
2950 memset(pMsg, 0x00, sizeof(MSG_REJECT_MSG_INFO_S));
2952 pMsg->msgId = dbHandle.getColumnToInt(index++);
2953 memset(pMsg->msgText, 0x00, sizeof(pMsg->msgText));
2954 dbHandle.getColumnToString(index++, MAX_MSG_TEXT_LEN, pMsg->msgText);
2956 pMsg->displayTime = (time_t)dbHandle.getColumnToInt(index++);
2959 dbHandle.freeTable();
2965 msg_error_t MsgStoGetSyncMLExtId(msg_message_id_t msgId, int *extId)
2967 char sqlQuery[MAX_QUERY_LEN+1];
2969 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2971 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT EXT_ID FROM %s WHERE MSG_ID = %d;",
2972 MSGFW_SYNCML_MSG_TABLE_NAME, msgId);
2974 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
2975 return MSG_ERR_DB_PREPARE;
2977 if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
2978 *extId = dbHandle.columnInt(0);
2980 dbHandle.finalizeQuery();
2981 return MSG_ERR_DB_STEP;
2984 dbHandle.finalizeQuery();
2989 msg_error_t MsgStoGetReportStatus(msg_message_id_t msgId, int *count, MSG_REPORT_STATUS_INFO_S **pReportStatus)
2991 char sqlQuery[MAX_QUERY_LEN+1];
2993 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2994 //MSG_ID INTEGER , ADDRESS_VAL TEXT , STATUS_TYPE INTEGER , STATUS INTEGER DEFAULT 0 , TIME DATETIME)
2995 //select * from MSG_REPORT_TABLE where MSG_ID=38 order by ADDRESS_VAL DESC, STATUS_TYPE ASC;
2996 snprintf(sqlQuery, sizeof(sqlQuery),
2997 "SELECT ADDRESS_VAL, STATUS_TYPE, STATUS, TIME "
2999 "WHERE MSG_ID = %d "
3000 "order by ADDRESS_VAL DESC, STATUS_TYPE ASC;"
3001 , MSGFW_REPORT_TABLE_NAME, msgId);
3004 msg_error_t err = dbHandle.getTable(sqlQuery, &rowCnt);
3005 if (err != MSG_SUCCESS) {
3006 MSG_DEBUG("%s", sqlQuery);
3007 dbHandle.freeTable();
3014 MSG_REPORT_STATUS_INFO_S *report_status = (MSG_REPORT_STATUS_INFO_S*)new char[sizeof(MSG_REPORT_STATUS_INFO_S)*rowCnt];
3015 memset(report_status, 0x00, sizeof(MSG_REPORT_STATUS_INFO_S)*rowCnt);
3017 for (int i = 0; i < rowCnt; i++) {
3018 dbHandle.getColumnToString(index++, MAX_ADDRESS_VAL_LEN, report_status[i].addressVal);
3019 report_status[i].type = dbHandle.getColumnToInt(index++);
3020 report_status[i].status = dbHandle.getColumnToInt(index++);
3021 report_status[i].statusTime = (time_t)dbHandle.getColumnToInt(index++);
3023 MSG_DEBUG("(%d/%d) addr = %s, report_type = %d, report_status = %d, report_time = %d", i, rowCnt, report_status[i].addressVal, report_status[i].type, report_status[i].status, report_status[i].statusTime );
3026 *pReportStatus = report_status;
3032 msg_error_t MsgStoGetThreadIdByAddress(const MSG_MESSAGE_INFO_S *pMsg, msg_thread_id_t *pThreadId)
3034 if(pMsg->nAddressCnt > 0) {
3035 if (MsgExistAddress(&dbHandle, pMsg, pThreadId) == true) {
3036 MSG_DEBUG("Conversation ID : [%d]", *pThreadId);
3039 return MSG_ERR_STORAGE_ERROR;
3048 msg_error_t MsgStoGetThreadUnreadCnt(msg_thread_id_t threadId, int *cnt)
3055 char sqlQuery[MAX_QUERY_LEN+1];
3057 memset(sqlQuery, 0x00, sizeof(sqlQuery));
3060 memset(sqlQuery, 0x00, sizeof(sqlQuery));
3061 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s A \
3062 WHERE CONV_ID = %d AND READ_STATUS = 0;", MSGFW_MESSAGE_TABLE_NAME, threadId);
3064 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
3065 return MSG_ERR_DB_PREPARE;
3067 if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
3068 msgCnt = dbHandle.columnInt(0);
3071 dbHandle.finalizeQuery();
3081 msg_error_t MsgStoGetAddressList(const msg_thread_id_t threadId, msg_struct_list_s *pAddrList)
3083 msg_error_t err = MSG_SUCCESS;
3085 int order = MsgGetContactNameOrder();
3087 err = MsgStoGetAddressByConvId(&dbHandle, threadId, order, pAddrList);
3093 msg_error_t MsgStoGetThreadInfo(msg_thread_id_t threadId, MSG_THREAD_VIEW_S *pThreadInfo)
3098 int index = 11; // numbers of index
3100 char sqlQuery[MAX_QUERY_LEN+1];
3101 memset(sqlQuery, 0x00, sizeof(sqlQuery));
3103 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.CONV_ID, A.UNREAD_CNT, A.SMS_CNT, A.MMS_CNT, \
3104 A.MAIN_TYPE, A.SUB_TYPE, A.MSG_DIRECTION, A.DISPLAY_TIME, A.DISPLAY_NAME, A.MSG_TEXT, \
3105 (SELECT COUNT(*) FROM %s B WHERE B.CONV_ID = A.CONV_ID AND B.PROTECTED = 1) AS PROTECTED \
3106 FROM %s A WHERE A.CONV_ID = %d;",
3107 MSGFW_MESSAGE_TABLE_NAME, MSGFW_CONVERSATION_TABLE_NAME, threadId);
3109 msg_error_t err = dbHandle.getTable(sqlQuery, &rowCnt);
3111 if (err == MSG_ERR_DB_NORECORD) {
3112 dbHandle.freeTable();
3114 } else if (err != MSG_SUCCESS) {
3115 MSG_DEBUG("%s", sqlQuery);
3116 dbHandle.freeTable();
3121 MSG_DEBUG("rowCnt is %d", rowCnt);
3122 dbHandle.freeTable();
3125 pThreadInfo->threadId = dbHandle.getColumnToInt(index++);
3127 pThreadInfo->unreadCnt = dbHandle.getColumnToInt(index++);
3128 pThreadInfo->smsCnt = dbHandle.getColumnToInt(index++);
3129 pThreadInfo->mmsCnt = dbHandle.getColumnToInt(index++);
3131 pThreadInfo->mainType = dbHandle.getColumnToInt(index++);
3132 pThreadInfo->subType = dbHandle.getColumnToInt(index++);
3134 pThreadInfo->direction = dbHandle.getColumnToInt(index++);
3135 pThreadInfo->threadTime = (time_t)dbHandle.getColumnToInt(index++);
3137 memset(pThreadInfo->threadName, 0x00, sizeof(pThreadInfo->threadName));
3138 dbHandle.getColumnToString(index++, MAX_THREAD_NAME_LEN, pThreadInfo->threadName);
3140 memset(pThreadInfo->threadData, 0x00, sizeof(pThreadInfo->threadData));
3141 dbHandle.getColumnToString(index++, MAX_THREAD_DATA_LEN, pThreadInfo->threadData);
3143 int protectedCnt = dbHandle.getColumnToInt(index++);
3144 if (protectedCnt > 0)
3145 pThreadInfo->bProtected = true;
3148 dbHandle.freeTable();
3156 msg_error_t MsgStoGetMessageList(msg_folder_id_t folderId, msg_thread_id_t threadId, msg_message_type_t msgType, msg_storage_id_t storageId, msg_struct_list_s *pMsgList)
3158 // Clear Out Parameter
3159 pMsgList->nCount = 0;
3160 pMsgList->msg_struct_info = NULL;
3163 int index = 19; // numbers of index
3165 char sqlQuery[MAX_QUERY_LEN+1];
3166 char sqlQuerySubset[(MAX_QUERY_LEN/5)+1];
3169 int order = MsgGetContactNameOrder();
3171 memset(sqlQuery, 0x00, sizeof(sqlQuery));
3173 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID, CONV_ID, FOLDER_ID, STORAGE_ID, MAIN_TYPE, SUB_TYPE, \
3174 DISPLAY_TIME, DATA_SIZE, NETWORK_STATUS, READ_STATUS, PROTECTED, BACKUP, PRIORITY, \
3175 MSG_DIRECTION, SCHEDULED_TIME, SUBJECT, MSG_TEXT, ATTACHMENT_COUNT, THUMB_PATH \
3176 FROM %s WHERE ", MSGFW_MESSAGE_TABLE_NAME);
3180 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
3182 if (folderId == MSG_ALLBOX_ID)
3183 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "FOLDER_ID > 0 AND FOLDER_ID < %d ", MSG_CBMSGBOX_ID);
3184 else if (folderId == MSG_IOSBOX_ID)
3185 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "FOLDER_ID > 0 AND FOLDER_ID < %d ", MSG_DRAFT_ID);
3187 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "FOLDER_ID = %d ", folderId);
3189 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
3193 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
3196 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND CONV_ID = %d ", threadId);
3198 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
3202 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
3206 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND MAIN_TYPE = %d AND SUB_TYPE = %d ", MSG_SMS_TYPE, MSG_NORMAL_SMS);
3210 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND MAIN_TYPE = %d ", MSG_MMS_TYPE);
3213 case MSG_TYPE_MMS_JAVA:
3214 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND MAIN_TYPE = %d AND SUB_TYPE = %d ", MSG_MMS_TYPE, MSG_SENDREQ_JAVA_MMS);
3217 case MSG_TYPE_SMS_SYNCML:
3218 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND MAIN_TYPE = %d AND SUB_TYPE = %d ", MSG_SMS_TYPE, MSG_SYNCML_CP);
3221 case MSG_TYPE_SMS_REJECT:
3222 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND MAIN_TYPE = %d AND SUB_TYPE = %d ", MSG_SMS_TYPE, MSG_REJECT_SMS);
3226 MSG_DEBUG("msg type is not set.");
3229 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
3232 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
3234 if (storageId > MSG_STORAGE_UNKNOWN)
3235 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND STORAGE_ID = %d ", storageId);
3237 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
3241 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
3242 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "ORDER BY DISPLAY_TIME DESC;");
3244 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
3246 msg_error_t err = dbHandle.getTable(sqlQuery, &rowCnt);
3248 if (err == MSG_ERR_DB_NORECORD) {
3249 dbHandle.freeTable();
3252 } else if (err != MSG_SUCCESS) {
3253 MSG_DEBUG("Get table fail. [%s]", sqlQuery);
3255 dbHandle.freeTable();
3260 pMsgList->nCount = rowCnt;
3262 MSG_DEBUG("pMsgList->nCount [%d]", pMsgList->nCount);
3264 pMsgList->msg_struct_info = (msg_struct_t *)new char[sizeof(msg_struct_t) * rowCnt];
3266 MSG_MESSAGE_HIDDEN_S *pTmp = NULL;
3267 msg_struct_s *msg = NULL;
3269 for (int i = 0; i < rowCnt; i++) {
3270 pMsgList->msg_struct_info[i] = (msg_struct_t)new msg_struct_s;
3272 msg = (msg_struct_s *)pMsgList->msg_struct_info[i];
3274 msg->type = MSG_STRUCT_MESSAGE_INFO;
3275 msg->data = (int *)new char[sizeof(MSG_MESSAGE_HIDDEN_S)];
3277 pTmp = (MSG_MESSAGE_HIDDEN_S *)msg->data;
3279 memset(pTmp, 0x00, sizeof(MSG_MESSAGE_HIDDEN_S));
3282 pTmp->pMmsData = NULL;
3284 pTmp->msgId = dbHandle.getColumnToInt(index++);
3285 pTmp->threadId = dbHandle.getColumnToInt(index++);
3286 pTmp->folderId = dbHandle.getColumnToInt(index++);
3287 pTmp->storageId = dbHandle.getColumnToInt(index++);
3288 pTmp->mainType = dbHandle.getColumnToInt(index++);
3289 pTmp->subType = dbHandle.getColumnToInt(index++);
3290 pTmp->displayTime = (time_t)dbHandle.getColumnToInt(index++);
3291 pTmp->dataSize = dbHandle.getColumnToInt(index++);
3292 pTmp->networkStatus = dbHandle.getColumnToInt(index++);
3293 pTmp->bRead = dbHandle.getColumnToInt(index++);
3294 pTmp->bProtected = dbHandle.getColumnToInt(index++);
3295 pTmp->bBackup = dbHandle.getColumnToInt(index++);
3296 pTmp->priority = dbHandle.getColumnToInt(index++);
3297 pTmp->direction = dbHandle.getColumnToInt(index++);
3298 index++; // This field is reserved.
3300 dbHandle.getColumnToString(index++, MAX_SUBJECT_LEN, pTmp->subject);
3302 if (pTmp->mainType == MSG_MMS_TYPE &&
3303 (pTmp->networkStatus == MSG_NETWORK_RETRIEVING || pTmp->networkStatus == MSG_NETWORK_RETRIEVE_FAIL || pTmp->subType == MSG_NOTIFICATIONIND_MMS)) {
3307 pTmp->pData = (void *)new char[pTmp->dataSize+2];
3308 memset(pTmp->pData, 0x00, pTmp->dataSize+2);
3310 dbHandle.getColumnToString(index++, pTmp->dataSize+1, (char *)pTmp->pData);
3313 pTmp->attachCount = dbHandle.getColumnToInt(index++);
3315 dbHandle.getColumnToString(index++, MSG_FILEPATH_LEN_MAX, pTmp->thumbPath);
3317 // add address information.
3318 order = MsgGetContactNameOrder();
3320 msg_struct_list_s *addr_list = (msg_struct_list_s *)new msg_struct_list_s;
3321 MsgStoGetAddressByMsgId(&dbHandle, pTmp->msgId, order, addr_list);
3323 pTmp->addr_list = addr_list;
3325 dbHandle.freeTable();