3 * Copyright (c) 2000-2012 Samsung Electronics Co., Ltd. All Rights Reserved.
5 * This file is part of msg-service.
7 * Contact: Jaeyun Jeong <jyjeong@samsung.com>
8 * Sangkoo Kim <sangkoo.kim@samsung.com>
9 * Seunghwan Lee <sh.cat.lee@samsung.com>
10 * SoonMin Jung <sm0415.jung@samsung.com>
11 * Jae-Young Lee <jy4710.lee@samsung.com>
12 * KeeBum Kim <keebum.kim@samsung.com>
14 * PROPRIETARY/CONFIDENTIAL
16 * This software is the confidential and proprietary information of
17 * SAMSUNG ELECTRONICS ("Confidential Information"). You shall not
18 * disclose such Confidential Information and shall use it only in
19 * accordance with the terms of the license agreement you entered
20 * into with SAMSUNG ELECTRONICS.
22 * SAMSUNG make no representations or warranties about the suitability
23 * of the software, either express or implied, including but not limited
24 * to the implied warranties of merchantability, fitness for a particular
25 * purpose, or non-infringement. SAMSUNG shall not be liable for any
26 * damages suffered by licensee as a result of using, modifying or
27 * distributing this software or its derivatives.
34 #include <tr1/unordered_set>
40 #include "MsgCppTypes.h"
41 #include "MsgContact.h"
42 #include "MsgUtilFile.h"
44 #include "MsgUtilStorage.h"
45 #include "MsgSoundPlayer.h"
46 #include "MsgGconfWrapper.h"
47 #include "MsgSqliteWrapper.h"
48 #include "MsgPluginManager.h"
49 #include "MsgStorageHandler.h"
50 #include "MsgNotificationWrapper.h"
51 #include "MsgMmsMessage.h"
56 /*==================================================================================================
58 ==================================================================================================*/
59 extern MsgDbHandler dbHandle;
61 static unsigned int refId = 0;
65 bool delNotiRunning = false;
69 bool delLogRunning = false;
72 /*==================================================================================================
74 ==================================================================================================*/
75 static gboolean startToDeleteNoti(void *pVoid)
79 MSG_MSGID_LIST_S *pMsgIdList = (MSG_MSGID_LIST_S *)pVoid;
81 MSG_DEBUG("pMsgIdList->nCount [%d]", pMsgIdList->nCount);
85 while (delNotiRunning) {
86 delNoticv.wait(delNotiMx.pMutex());
89 delNotiRunning = true;
91 for (int i = 0; i < pMsgIdList->nCount; i++) {
92 MsgDeleteNotiByMsgId(pMsgIdList->msgIdList[i]);
94 /** sleep for moment */
95 if ((i%100 == 0) && (i != 0))
99 delNotiRunning = false;
105 if (pMsgIdList != NULL) {
106 //free peer info list
107 if (pMsgIdList->msgIdList != NULL)
108 delete [] pMsgIdList->msgIdList;
110 delete [] pMsgIdList;
119 static gboolean updateUnreadMsgCount(void *pVoid)
126 smsCnt = MsgStoGetUnreadCnt(&dbHandle, MSG_SMS_TYPE);
127 mmsCnt = MsgStoGetUnreadCnt(&dbHandle, MSG_MMS_TYPE);
129 MsgSettingSetIndicator(smsCnt, mmsCnt);
137 /*==================================================================================================
138 FUNCTION IMPLEMENTATION
139 ==================================================================================================*/
140 MSG_ERROR_T MsgStoAddMessage(MSG_MESSAGE_INFO_S *pMsg, MSG_SENDINGOPT_INFO_S *pSendOptInfo, int addrIdx)
144 MSG_ERROR_T err = MSG_SUCCESS;
146 unsigned int rowId = 0;
147 unsigned int addrId = 0;
149 char sqlQuery[MAX_QUERY_LEN+1];
151 dbHandle.beginTrans();
153 if (pMsg->nAddressCnt > 0) {
154 err = MsgStoAddAddress(&dbHandle, &(pMsg->addressList[addrIdx]), &addrId);
156 if (err != MSG_SUCCESS) {
157 dbHandle.endTrans(false);
161 pMsg->addressList[addrIdx].threadId = (MSG_THREAD_ID_T)addrId;
164 err = dbHandle.getRowId(MSGFW_MESSAGE_TABLE_NAME, &rowId);
166 if (err != MSG_SUCCESS) {
167 dbHandle.endTrans(false);
171 pMsg->msgId = (MSG_MESSAGE_ID_T)rowId;
176 pMsg->referenceId = refId;
180 char *pFileData = NULL;
181 AutoPtr<char> buf(&pFileData);
184 if (pMsg->bTextSms == false) {
185 if (MsgOpenAndReadFile(pMsg->msgData, &pFileData, &fileSize) == false) {
186 dbHandle.endTrans(false);
187 return MSG_ERR_STORAGE_ERROR;
189 MSG_DEBUG("file size [%d]", fileSize);
193 memset(sqlQuery, 0x00, sizeof(sqlQuery));
195 snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, %d, %d, %d, %d, %d, %d, %ld, %d, %d, %d, %d, %d, %d, %ld, %d, ?, ?, ?, ?, %d, 0, %d, 0, 0);",
196 MSGFW_MESSAGE_TABLE_NAME, rowId, addrId, pMsg->folderId, pMsg->referenceId, pMsg->storageId, pMsg->msgType.mainType, pMsg->msgType.subType,
197 pMsg->displayTime, pMsg->dataSize, pMsg->networkStatus, pMsg->bRead, pMsg->bProtected, pMsg->priority, pMsg->direction,
198 pMsg->scheduledTime, pMsg->bBackup, MSG_DELIVERY_REPORT_NONE, MSG_READ_REPORT_NONE);
200 MSG_DEBUG("QUERY : %s", sqlQuery);
202 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS) {
203 dbHandle.endTrans(false);
204 return MSG_ERR_DB_EXEC;
207 dbHandle.bindText(pMsg->subject, 1);
209 dbHandle.bindText(pMsg->msgData, 2);
211 dbHandle.bindText(pMsg->thumbPath, 3);
213 if (pMsg->bTextSms == false)
214 dbHandle.bindText(pFileData, 4);
216 dbHandle.bindText(pMsg->msgText, 4);
218 if (dbHandle.stepQuery() != MSG_ERR_DB_DONE) {
219 dbHandle.finalizeQuery();
220 dbHandle.endTrans(false);
221 return MSG_ERR_DB_EXEC;
224 dbHandle.finalizeQuery();
226 if (pMsg->msgType.subType != MSG_SENDREQ_MMS) {
227 err = MsgStoUpdateAddress(&dbHandle, addrId);
229 if (err != MSG_SUCCESS) {
230 dbHandle.endTrans(false);
235 dbHandle.endTrans(true);
237 /* In the case of MMS Message, load the MMS plugin to save MMS PDU */
238 if (pMsg->msgType.mainType == MSG_MMS_TYPE) {
239 MMS_MESSAGE_DATA_S mmsMsg;
240 memset(&mmsMsg, 0x00, sizeof(MMS_MESSAGE_DATA_S));
242 if (pMsg->dataSize == 0) {
243 MSG_DEBUG("pMsg->dataSize == 0, So Making emtpy MMS body.");
244 char * tempMmsBody = _MsgMmsSerializeMessageData(&mmsMsg, &(pMsg->dataSize));
245 memcpy(&pMsg->msgText, tempMmsBody, pMsg->dataSize);
249 if (pMsg->msgType.subType != MSG_DELIVERYIND_MMS && pMsg->msgType.subType != MSG_READORGIND_MMS) {
250 MsgPlugin *plg = MsgPluginManager::instance()->getPlugin(MSG_MMS_TYPE);
252 //pMsg->msgId = pMsg->refernceId;
254 err = plg->addMessage(pMsg, pSendOptInfo, pFileData);
256 if (err != MSG_SUCCESS)
257 return MSG_ERR_STORAGE_ERROR;
259 if (pMsg->msgType.subType == MSG_SENDREQ_MMS) {
260 MSG_DEBUG("pMsg->msgText: %s, pMsg->thumbPath: %s ", pMsg->msgText, pMsg->thumbPath);
262 err = MsgStoUpdateMMSMessage(pMsg);
264 if (err != MSG_SUCCESS)
265 return MSG_ERR_STORAGE_ERROR;
277 MSG_ERROR_T MsgStoUpdateMessage(MSG_MESSAGE_INFO_S *pMsg, MSG_SENDINGOPT_INFO_S *pSendOptInfo, int addrIdx)
279 MSG_ERROR_T err = MSG_SUCCESS;
281 char sqlQuery[MAX_QUERY_LEN+1];
283 unsigned int addrId = 0;
285 dbHandle.beginTrans();
287 if (pMsg->nAddressCnt > 0) {
288 err = MsgStoAddAddress(&dbHandle, &(pMsg->addressList[addrIdx]), &addrId);
290 if (err != MSG_SUCCESS) {
291 dbHandle.endTrans(false);
298 char *pFileData = NULL;
299 AutoPtr<char> buf(&pFileData);
302 if (pMsg->bTextSms == false) {
303 if (MsgOpenAndReadFile(pMsg->msgData, &pFileData, &fileSize) == false) {
304 dbHandle.endTrans(false);
305 return MSG_ERR_STORAGE_ERROR;
309 if (pSendOptInfo != NULL) {
310 // Get Global setting value if bSetting == false
311 if (pSendOptInfo->bSetting == false) {
312 MsgSettingGetBool(MSG_KEEP_COPY, &pSendOptInfo->bKeepCopy);
314 if (pMsg->msgType.mainType == MSG_SMS_TYPE) {
315 MsgSettingGetBool(SMS_SEND_DELIVERY_REPORT, &pSendOptInfo->bDeliverReq);
316 MsgSettingGetBool(SMS_SEND_REPLY_PATH, &pSendOptInfo->option.smsSendOptInfo.bReplyPath);
317 } else if (pMsg->msgType.mainType == MSG_MMS_TYPE) {
318 MsgSettingGetBool(MMS_SEND_DELIVERY_REPORT, &pSendOptInfo->bDeliverReq);
319 MsgSettingGetBool(MMS_SEND_READ_REPLY, &pSendOptInfo->option.mmsSendOptInfo.bReadReq);
320 pSendOptInfo->option.mmsSendOptInfo.expiryTime.time = (unsigned int)MsgSettingGetInt(MMS_SEND_EXPIRY_TIME);
322 MSG_MMS_DELIVERY_TIME_T deliveryTime = (MSG_MMS_DELIVERY_TIME_T)MsgSettingGetInt(MMS_SEND_DELIVERY_TIME);
324 if (deliveryTime == MSG_DELIVERY_TIME_CUSTOM) {
325 pSendOptInfo->option.mmsSendOptInfo.bUseDeliveryCustomTime = true;
326 pSendOptInfo->option.mmsSendOptInfo.deliveryTime.time = (unsigned int)MsgSettingGetInt(MMS_SEND_CUSTOM_DELIVERY);
328 pSendOptInfo->option.mmsSendOptInfo.bUseDeliveryCustomTime = false;
329 pSendOptInfo->option.mmsSendOptInfo.deliveryTime.time = (unsigned int)deliveryTime;
332 pSendOptInfo->option.mmsSendOptInfo.priority = (MSG_PRIORITY_TYPE_T)MsgSettingGetInt(MMS_SEND_PRIORITY);
338 memset(sqlQuery, 0x00, sizeof(sqlQuery));
340 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET ADDRESS_ID = %d, FOLDER_ID = %d, STORAGE_ID = %d, MAIN_TYPE = %d, SUB_TYPE = %d, \
341 DISPLAY_TIME = %lu, DATA_SIZE = %d, NETWORK_STATUS = %d, READ_STATUS = %d, \
342 PROTECTED = %d, PRIORITY = %d, MSG_DIRECTION = %d, SCHEDULED_TIME = %lu, BACKUP = %d, SUBJECT = ?, MSG_DATA = ?, THUMB_PATH = ?, MSG_TEXT = ? \
344 MSGFW_MESSAGE_TABLE_NAME, addrId, pMsg->folderId, pMsg->storageId, pMsg->msgType.mainType, pMsg->msgType.subType, pMsg->displayTime, pMsg->dataSize,
345 pMsg->networkStatus, pMsg->bRead, pMsg->bProtected, pMsg->priority, pMsg->direction, pMsg->scheduledTime, pMsg->bBackup, pMsg->msgId);
347 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS) {
348 dbHandle.endTrans(false);
349 return MSG_ERR_DB_EXEC;
352 dbHandle.bindText(pMsg->subject, 1);
354 dbHandle.bindText(pMsg->msgData, 2);
356 dbHandle.bindText(pMsg->thumbPath, 3);
358 if (pMsg->msgType.mainType == MSG_SMS_TYPE && pMsg->bTextSms == false)
359 dbHandle.bindText(pFileData, 4);
361 dbHandle.bindText(pMsg->msgText, 4);
363 MSG_DEBUG("%s", sqlQuery);
365 if (dbHandle.stepQuery() != MSG_ERR_DB_DONE) {
366 dbHandle.finalizeQuery();
367 dbHandle.endTrans(false);
368 return MSG_ERR_DB_EXEC;
371 dbHandle.finalizeQuery();
373 if (pMsg->msgType.mainType == MSG_SMS_TYPE && pSendOptInfo != NULL) {
374 if (pSendOptInfo->bSetting == true) {
375 memset(sqlQuery, 0x00, sizeof(sqlQuery));
376 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET DELREP_REQ = %d, KEEP_COPY = %d, REPLY_PATH = %d \
378 MSGFW_SMS_SENDOPT_TABLE_NAME, pSendOptInfo->bDeliverReq, pSendOptInfo->bKeepCopy, pSendOptInfo->option.smsSendOptInfo.bReplyPath, pMsg->msgId);
380 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
381 dbHandle.endTrans(false);
382 return MSG_ERR_DB_EXEC;
385 } else if (pMsg->msgType.mainType == MSG_MMS_TYPE) {
386 MsgPlugin *plg = MsgPluginManager::instance()->getPlugin(MSG_MMS_TYPE);
388 err = plg->updateMessage(pMsg, pSendOptInfo, pFileData);
390 if (err != MSG_SUCCESS) {
391 dbHandle.endTrans(false);
392 return MSG_ERR_STORAGE_ERROR;
396 err = MsgStoUpdateAddress(&dbHandle, addrId);
398 if (err != MSG_SUCCESS) {
399 dbHandle.endTrans(false);
400 return MSG_ERR_STORAGE_ERROR;
403 err = MsgStoClearAddressTable(&dbHandle);
405 if (err != MSG_SUCCESS) {
406 dbHandle.endTrans(false);
407 return MSG_ERR_STORAGE_ERROR;
410 dbHandle.endTrans(true);
416 MSG_ERROR_T MsgStoUpdateReadStatus(MSG_MESSAGE_ID_T MsgId, bool bRead)
418 char sqlQuery[MAX_QUERY_LEN+1];
420 MSG_STORAGE_ID_T storageId;
422 if (MsgStoSetReadStatus(&dbHandle, MsgId, bRead) != MSG_SUCCESS) {
423 MSG_DEBUG("MsgStoUpdateAddress() Error");
424 return MSG_ERR_STORAGE_ERROR;
428 memset(sqlQuery, 0x00, sizeof(sqlQuery));
429 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT STORAGE_ID \
432 MSGFW_MESSAGE_TABLE_NAME, MsgId);
434 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
435 return MSG_ERR_DB_PREPARE;
437 if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
438 storageId = dbHandle.columnInt(0);
440 dbHandle.finalizeQuery();
441 return MSG_ERR_DB_STEP;
444 dbHandle.finalizeQuery();
446 MSG_DEBUG("StorageId:[%d]", storageId);
448 // Update Read Status for SIM Msg
449 if (storageId == MSG_STORAGE_SIM) {
450 MsgPlugin *plg = MsgPluginManager::instance()->getPlugin(MSG_SMS_TYPE);
453 MSG_DEBUG("SMS Plug-in is NULL");
454 return MSG_ERR_NULL_POINTER;
458 memset(sqlQuery, 0x00, sizeof(sqlQuery));
459 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT SIM_ID FROM %s WHERE MSG_ID = %d;",
460 MSGFW_SIM_MSG_TABLE_NAME, MsgId);
462 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
463 return MSG_ERR_DB_PREPARE;
467 while (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
468 simId = dbHandle.columnInt(0);
470 if (plg->setReadStatus(simId) != MSG_SUCCESS) {
471 MSG_DEBUG("Fail to Set Read Status for SIM SMS");
476 dbHandle.finalizeQuery();
483 MSG_ERROR_T MsgStoUpdateThreadReadStatus(MSG_THREAD_ID_T ThreadId)
487 MSG_ERROR_T err = MSG_SUCCESS;
491 MSG_MSGID_LIST_S *pUnreadMsgIdList = NULL;
493 pUnreadMsgIdList = (MSG_MSGID_LIST_S *)new char[sizeof(MSG_MSGID_LIST_S)];
494 memset(pUnreadMsgIdList, 0x00, sizeof(MSG_MSGID_LIST_S));
496 char sqlQuery[MAX_QUERY_LEN+1];
499 memset(sqlQuery, 0x00, sizeof(sqlQuery));
500 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID \
502 WHERE ADDRESS_ID = %d AND READ_STATUS = 0;",
503 MSGFW_MESSAGE_TABLE_NAME, ThreadId);
505 err = dbHandle.getTable(sqlQuery, &rowCnt);
507 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
508 dbHandle.freeTable();
512 pUnreadMsgIdList->nCount = rowCnt;
514 MSG_DEBUG("unreadMsgIdList.nCount [%d]", pUnreadMsgIdList->nCount);
516 pUnreadMsgIdList->msgIdList = (MSG_MESSAGE_ID_T *)new char[sizeof(MSG_MESSAGE_ID_T) * rowCnt];
518 for (int i = 0; i < rowCnt; i++)
519 pUnreadMsgIdList->msgIdList[i] = dbHandle.getColumnToInt(index++);
521 dbHandle.freeTable();
525 memset(sqlQuery, 0x00, sizeof(sqlQuery));
526 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID \
528 WHERE ADDRESS_ID = %d AND READ_STATUS = 0 AND STORAGE_ID = %d;",
529 MSGFW_MESSAGE_TABLE_NAME, ThreadId, MSG_STORAGE_SIM);
532 err = dbHandle.getTable(sqlQuery, &rowCnt);
534 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
535 dbHandle.freeTable();
539 for (int i = 1; i <= rowCnt; i++) {
540 MsgStoUpdateReadStatus(dbHandle.getColumnToInt(i), true);
543 dbHandle.freeTable();
546 memset(sqlQuery, 0x00, sizeof(sqlQuery));
547 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET READ_STATUS = %d \
548 WHERE ADDRESS_ID = %d AND READ_STATUS = 0;",
549 MSGFW_MESSAGE_TABLE_NAME, 1, ThreadId);
551 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS)
552 return MSG_ERR_DB_EXEC;
555 if (MsgStoUpdateAddress(&dbHandle, ThreadId) != MSG_SUCCESS) {
556 MSG_DEBUG("MsgStoUpdateAddress() Error");
557 return MSG_ERR_STORAGE_ERROR;
560 if (g_idle_add(updateUnreadMsgCount, NULL) == 0) {
561 MSG_DEBUG("updateUnreadMsgCount() Error");
564 if (pUnreadMsgIdList->nCount > 0) {
565 if (g_idle_add(startToDeleteNoti, (void *)pUnreadMsgIdList) == 0) {
566 MSG_DEBUG("startToDeleteNoti not invoked: %s", strerror(errno));
568 if (pUnreadMsgIdList != NULL) {
569 //free peer info list
570 if (pUnreadMsgIdList->msgIdList != NULL)
571 delete [] pUnreadMsgIdList->msgIdList;
573 delete [] pUnreadMsgIdList;
575 err = MSG_ERR_UNKNOWN;
584 MSG_ERROR_T MsgStoUpdateProtectedStatus(MSG_MESSAGE_ID_T MsgId, bool bProtected)
586 char sqlQuery[MAX_QUERY_LEN+1];
588 memset(sqlQuery, 0x00, sizeof(sqlQuery));
589 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET PROTECTED = %d WHERE MSG_ID = %d;",
590 MSGFW_MESSAGE_TABLE_NAME, (int)bProtected, MsgId);
592 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS)
593 return MSG_ERR_DB_EXEC;
599 MSG_ERROR_T MsgStoDeleteMessage(MSG_MESSAGE_ID_T MsgId, bool bCheckIndication)
603 MSG_DEBUG("Msg Id : %d", MsgId);
605 MSG_ERROR_T err = MSG_SUCCESS;
607 char sqlQuery[MAX_QUERY_LEN+1];
609 // Get SUB_TYPE, STORAGE_ID
610 memset(sqlQuery, 0x00, sizeof(sqlQuery));
611 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.MAIN_TYPE, A.SUB_TYPE, A.FOLDER_ID, A.STORAGE_ID, A.READ_STATUS, B.CONTACT_ID, B.ADDRESS_ID \
613 WHERE A.MSG_ID = %d AND A.ADDRESS_ID = B.ADDRESS_ID;",
614 MSGFW_MESSAGE_TABLE_NAME, MSGFW_ADDRESS_TABLE_NAME, MsgId);
616 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
617 return MSG_ERR_DB_PREPARE;
619 MSG_MESSAGE_TYPE_S msgType;
620 MSG_FOLDER_ID_T folderId;
621 MSG_STORAGE_ID_T storageId;
622 MSG_CONTACT_ID_T contactId;
627 if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
628 msgType.mainType = dbHandle.columnInt(0);
629 msgType.subType = dbHandle.columnInt(1);
630 folderId = dbHandle.columnInt(2);
631 storageId = dbHandle.columnInt(3);
632 bRead = dbHandle.columnInt(4);
633 contactId = dbHandle.columnInt(5);
634 addrId = dbHandle.columnInt(6);
636 MSG_DEBUG("Main Type:[%d] SubType:[%d] FolderId:[%d] StorageId:[%d] ContactId:[%d] AddressId:[%d]", msgType.mainType, msgType.subType, folderId, storageId, contactId, addrId);
638 MSG_DEBUG("MsgStepQuery() Error [%s]", sqlQuery);
640 dbHandle.finalizeQuery();
642 return MSG_ERR_DB_STEP;
645 dbHandle.finalizeQuery();
647 MsgPlugin *plg = MsgPluginManager::instance()->getPlugin(MSG_SMS_TYPE);
650 MSG_DEBUG("SMS Plug-in is NULL");
652 return MSG_ERR_NULL_POINTER;
655 dbHandle.beginTrans();
658 if (storageId == MSG_STORAGE_SIM) {
659 // get sim message id
660 memset(sqlQuery, 0x00, sizeof(sqlQuery));
661 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT SIM_ID FROM %s WHERE MSG_ID = %d;", MSGFW_SIM_MSG_TABLE_NAME, MsgId);
663 MSG_DEBUG("sqlQuery is [%s]", sqlQuery);
665 MSG_SIM_ID_T simMsgId;
667 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS) {
668 dbHandle.endTrans(false);
669 return MSG_ERR_DB_PREPARE;
672 while (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
673 simMsgId = dbHandle.columnInt(0);
675 MSG_DEBUG("SIM Msg Id : [%d]", simMsgId);
677 err = plg->deleteSimMessage(simMsgId);
679 if (err != MSG_SUCCESS) {
680 dbHandle.finalizeQuery();
681 dbHandle.endTrans(false);
685 //Sim message delete in db table
686 memset(sqlQuery, 0x00, sizeof(sqlQuery));
687 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE SIM_ID = %d;", MSGFW_SIM_MSG_TABLE_NAME, simMsgId);
689 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
690 dbHandle.finalizeQuery();
691 dbHandle.endTrans(false);
692 return MSG_ERR_DB_EXEC;
696 dbHandle.finalizeQuery();
699 memset(sqlQuery, 0x00, sizeof(sqlQuery));
700 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE MSG_ID = %d;", MSGFW_SCHEDULED_MSG_TABLE_NAME, MsgId);
702 // Delete Message from scheduled msg table
703 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
704 dbHandle.endTrans(false);
705 return MSG_ERR_DB_EXEC;
708 if (msgType.mainType == MSG_SMS_TYPE) {
709 memset(sqlQuery, 0x00, sizeof(sqlQuery));
710 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE MSG_ID = %d;", MSGFW_SMS_SENDOPT_TABLE_NAME, MsgId);
712 // Delete SMS Send Option
713 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
714 dbHandle.endTrans(false);
715 return MSG_ERR_DB_EXEC;
718 if (msgType.subType == MSG_CB_SMS || msgType.subType == MSG_JAVACB_SMS) {
719 memset(sqlQuery, 0x00, sizeof(sqlQuery));
720 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE MSG_ID = %d;", MSGFW_CB_MSG_TABLE_NAME, MsgId);
722 // Delete Push Message from push table
723 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
724 dbHandle.endTrans(false);
725 return MSG_ERR_DB_EXEC;
727 } else if (msgType.subType >= MSG_WAP_SI_SMS && msgType.subType <= MSG_WAP_CO_SMS) {
728 memset(sqlQuery, 0x00, sizeof(sqlQuery));
729 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE MSG_ID = %d;", MSGFW_PUSH_MSG_TABLE_NAME, MsgId);
731 // Delete Push Message from push table
732 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
733 dbHandle.endTrans(false);
734 return MSG_ERR_DB_EXEC;
736 } else if (msgType.subType == MSG_SYNCML_CP) {
737 memset(sqlQuery, 0x00, sizeof(sqlQuery));
738 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE MSG_ID = %d;", MSGFW_SYNCML_MSG_TABLE_NAME, MsgId);
740 // Delete SyncML Message from syncML table
741 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
742 dbHandle.endTrans(false);
743 return MSG_ERR_DB_EXEC;
746 } else if (msgType.mainType == MSG_MMS_TYPE) {
747 //get multiple recipient message count
748 memset(sqlQuery, 0x00, sizeof(sqlQuery));
749 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s WHERE REFERENCE_ID IN \
750 (SELECT REFERENCE_ID FROM %s WHERE MSG_ID = %d);",
751 MSGFW_MESSAGE_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME, MsgId);
755 err = dbHandle.getTable(sqlQuery, &rowCnt);
757 if (err != MSG_SUCCESS) {
758 dbHandle.freeTable();
762 dbHandle.freeTable();
763 MSG_DEBUG("rowCnt = %d", rowCnt);
766 char filePath[MSG_FILEPATH_LEN_MAX] = {0,};
767 char thumbnailpath[MSG_FILEPATH_LEN_MAX] = {0,};
768 char dirPath[MSG_FILEPATH_LEN_MAX]= {0,};
770 memset(sqlQuery, 0x00, sizeof(sqlQuery));
771 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT FILE_PATH FROM %s WHERE REFERENCE_ID IN \
772 (SELECT REFERENCE_ID FROM %s WHERE MSG_ID = %d);",
773 MMS_PLUGIN_MESSAGE_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME, MsgId);
775 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS) {
776 dbHandle.endTrans(false);
777 return MSG_ERR_DB_PREPARE;
780 if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
781 strncpy(filePath, (char *)dbHandle.columnText(0), MSG_FILEPATH_LEN_MAX);
783 snprintf(dirPath, MSG_FILEPATH_LEN_MAX, "%s.dir", filePath);
785 if (remove(filePath) == -1)
786 MSG_DEBUG("Fail to delete file [%s]", filePath);
788 MSG_DEBUG("Success to delete file [%s]", filePath);
793 // remove thumbnail file
794 char *fileName = NULL;
795 fileName = strrchr(filePath, '/');
797 snprintf(thumbnailpath, MSG_FILEPATH_LEN_MAX, MSG_THUMBNAIL_PATH"%s.jpg", fileName+1);
798 if(remove(thumbnailpath) == -1)
799 MSG_DEBUG("Fail to delete thumbnail [%s]", thumbnailpath);
801 MSG_DEBUG("Success to delete thumbnail [%s]", thumbnailpath);
803 MSG_DEBUG("MsgStepQuery() Error [%s]", sqlQuery);
804 dbHandle.finalizeQuery();
805 dbHandle.endTrans(false);
806 return MSG_ERR_DB_STEP;
809 dbHandle.finalizeQuery();
811 const char *tableList[] = {MMS_PLUGIN_MESSAGE_TABLE_NAME, MMS_PLUGIN_ATTRIBUTE_TABLE_NAME};
813 int listCnt = sizeof(tableList)/sizeof(char *);
815 for (int i = 0; i < listCnt; i++) {
816 memset(sqlQuery, 0x00, sizeof(sqlQuery));
817 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE REFERENCE_ID IN \
818 (SELECT REFERENCE_ID FROM %s WHERE MSG_ID = %d);",
819 tableList[i], MSGFW_MESSAGE_TABLE_NAME, MsgId);
821 // Delete Data from MMS table
822 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
823 dbHandle.endTrans(false);
824 return MSG_ERR_DB_EXEC;
828 MSG_DEBUG("There is more multi-recipient mms. MMS DB table is not destroyed");
832 memset(sqlQuery, 0x00, sizeof(sqlQuery));
833 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE MSG_ID = %d;", MSGFW_MESSAGE_TABLE_NAME, MsgId);
835 // Delete Message from msg table
836 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
837 dbHandle.endTrans(false);
838 return MSG_ERR_DB_EXEC;
841 // Clear Address table
842 if (MsgStoClearAddressTable(&dbHandle) != MSG_SUCCESS) {
843 dbHandle.endTrans(false);
844 return MSG_ERR_DB_EXEC;
847 // Update Address Info.
848 if (MsgStoUpdateAddress(&dbHandle, addrId) != MSG_SUCCESS) {
849 dbHandle.endTrans(false);
850 return MSG_ERR_STORAGE_ERROR;
853 dbHandle.endTrans(true);
855 if (msgType.mainType == MSG_SMS_TYPE && folderId == MSG_INBOX_ID) {
856 msgType.classType = MSG_CLASS_NONE;
858 // Set memory status in SIM
859 if (MsgStoCheckMsgCntFull(&dbHandle, &msgType, folderId) == MSG_SUCCESS) {
860 MSG_DEBUG("Set Memory Status");
862 plg->setMemoryStatus(MSG_SUCCESS);
866 if (bCheckIndication == true) {
867 MSG_DEBUG("bCheckIndication is true.");
872 smsCnt = MsgStoGetUnreadCnt(&dbHandle, MSG_SMS_TYPE);
873 mmsCnt = MsgStoGetUnreadCnt(&dbHandle, MSG_MMS_TYPE);
875 MsgSettingSetIndicator(smsCnt, mmsCnt);
877 MsgDeleteNotiByMsgId(MsgId);
884 MSG_ERROR_T MsgStoDeleteAllMessageInFolder(MSG_FOLDER_ID_T FolderId, bool bOnlyDB, MSG_MSGID_LIST_S *pMsgIdList)
886 MSG_ERROR_T err = MSG_SUCCESS;
888 char sqlQuery[MAX_QUERY_LEN+1];
890 queue<MSG_THREAD_ID_T> threadList;
892 const char *tableList[] = {MSGFW_PUSH_MSG_TABLE_NAME, MSGFW_CB_MSG_TABLE_NAME,
893 MSGFW_SYNCML_MSG_TABLE_NAME, MSGFW_SCHEDULED_MSG_TABLE_NAME,
894 MSGFW_SMS_SENDOPT_TABLE_NAME, MMS_PLUGIN_MESSAGE_TABLE_NAME,
895 MSGFW_MESSAGE_TABLE_NAME};
897 int listCnt = sizeof(tableList)/sizeof(char *);
900 // Get Address ID in Folder
901 memset(sqlQuery, 0x00, sizeof(sqlQuery));
903 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT DISTINCT(B.ADDRESS_ID) \
905 WHERE A.ADDRESS_ID = B.ADDRESS_ID \
906 AND A.FOLDER_ID = %d",
907 MSGFW_MESSAGE_TABLE_NAME, MSGFW_ADDRESS_TABLE_NAME, FolderId);
909 err = dbHandle.getTable(sqlQuery, &rowCnt);
911 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
912 MSG_DEBUG("sql query is %s.", sqlQuery);
914 dbHandle.freeTable();
919 dbHandle.freeTable();
924 for (int i = 1; i <= rowCnt; i++) {
925 MSG_DEBUG("thread ID : %d", dbHandle.getColumnToInt(i));
926 threadList.push((MSG_THREAD_ID_T)dbHandle.getColumnToInt(i));
929 dbHandle.freeTable();
931 /*** Get msg id list **/
932 MSG_MSGID_LIST_S *pToDeleteMsgIdList = NULL;
933 pToDeleteMsgIdList = (MSG_MSGID_LIST_S *)new char[sizeof(MSG_MSGID_LIST_S)];
934 memset(pToDeleteMsgIdList, 0x00, sizeof(MSG_MSGID_LIST_S));
936 memset(sqlQuery, 0x00, sizeof(sqlQuery));
937 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s WHERE FOLDER_ID = %d",
938 MSGFW_MESSAGE_TABLE_NAME, FolderId);
943 err = dbHandle.getTable(sqlQuery, &rowCnt);
945 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
946 MSG_DEBUG("sqlQuery [%s]", sqlQuery);
948 dbHandle.freeTable();
954 dbHandle.freeTable();
960 pToDeleteMsgIdList->nCount = rowCnt;
962 MSG_DEBUG("pToDeleteMsgIdList->nCount [%d]", pToDeleteMsgIdList->nCount);
964 pToDeleteMsgIdList->msgIdList = (MSG_MESSAGE_ID_T *)new char[sizeof(MSG_MESSAGE_ID_T) * rowCnt];
966 for (int i = 0; i < rowCnt; i++)
967 pToDeleteMsgIdList->msgIdList[i] = dbHandle.getColumnToInt(index++);
969 dbHandle.freeTable();
972 /*** Delete Sim Message In Folder **/
973 if (FolderId >= MSG_INBOX_ID) {
974 memset(sqlQuery, 0x00, sizeof(sqlQuery));
976 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s \
977 WHERE FOLDER_ID = %d AND STORAGE_ID = %d",
978 MSGFW_MESSAGE_TABLE_NAME, FolderId, MSG_STORAGE_SIM);
980 MSG_DEBUG("sql query is %s.", sqlQuery);
984 err = dbHandle.getTable(sqlQuery, &rowCnt);
986 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
987 dbHandle.freeTable();
992 for (int i = 1; i <= rowCnt; i++) {
993 err = MsgStoDeleteMessage(dbHandle.getColumnToInt(i), false);
995 if (err != MSG_SUCCESS) {
996 MSG_DEBUG("MsgStoDeleteMessage() Error!!!");
998 dbHandle.freeTable();
1004 dbHandle.freeTable();
1007 dbHandle.beginTrans();
1009 for (int i = 0; i < listCnt; i++) {
1010 if (!strcmp(tableList[i], MMS_PLUGIN_MESSAGE_TABLE_NAME)) {
1011 //MMS_PLUGIN_MESSAGE_TABLE and MMS_PLUGIN_ATTRIBUTE_TABLE will be updated together
1016 //get mms msg id list
1017 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1018 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID, REFERENCE_ID FROM %s \
1019 WHERE FOLDER_ID = %d AND MAIN_TYPE = %d",
1020 MSGFW_MESSAGE_TABLE_NAME, FolderId, MSG_MMS_TYPE);
1022 MSG_DEBUG("sqlQuery [%s]", sqlQuery);
1024 err = dbHandle.getTable(sqlQuery, &rowCnt);
1025 MSG_DEBUG("rowCnt %d", rowCnt);
1027 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
1028 MSG_DEBUG("sqlQuery [%s]", sqlQuery);
1030 dbHandle.freeTable();
1031 dbHandle.endTrans(false);
1036 for (int i = 1; i <= rowCnt; i++) {
1040 msgId = dbHandle.getColumnToInt(index++);
1041 refId = dbHandle.getColumnToInt(index++);
1043 //get multiple recipient message count
1044 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1045 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s WHERE REFERENCE_ID = %d;",
1046 MSGFW_MESSAGE_TABLE_NAME, refId);
1048 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS) {
1049 dbHandle.freeTable();
1050 dbHandle.endTrans(false);
1051 err = MSG_ERR_DB_PREPARE;
1058 if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
1059 msgCnt = dbHandle.columnInt(0);
1061 dbHandle.finalizeQuery();
1062 dbHandle.freeTable();
1063 dbHandle.endTrans(false);
1064 err = MSG_ERR_DB_STEP;
1069 dbHandle.finalizeQuery();
1071 //delete mms raw file and db(mms_table and mms_attr_table) data
1073 char filePath[MSG_FILEPATH_LEN_MAX] = {0,};
1074 char dirPath[MSG_FILEPATH_LEN_MAX] = {0,};
1075 char thumbnailPath[MSG_FILEPATH_LEN_MAX] = {0,};
1078 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1079 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT FILE_PATH FROM %s WHERE REFERENCE_ID = %d;",
1080 MMS_PLUGIN_MESSAGE_TABLE_NAME, refId);
1082 MSG_DEBUG("sqlQuery [%s]", sqlQuery);
1083 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS) {
1084 dbHandle.freeTable();
1085 dbHandle.endTrans(false);
1086 err = MSG_ERR_DB_PREPARE;
1091 if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
1092 strncpy(filePath, (char *)dbHandle.columnText(0), MSG_FILEPATH_LEN_MAX);
1094 dbHandle.finalizeQuery();
1095 dbHandle.freeTable();
1096 dbHandle.endTrans(false);
1097 err = MSG_ERR_DB_STEP;
1102 dbHandle.finalizeQuery();
1104 MSG_DEBUG("filePath [%s]", filePath);
1107 snprintf(dirPath, sizeof(dirPath), "%s.dir", filePath);
1109 if (remove(filePath) == -1)
1110 MSG_DEBUG("Fail to delete file [%s]", filePath);
1112 MSG_DEBUG("Success to delete file [%s]", filePath);
1118 char *fileName = NULL;
1119 fileName = strrchr(filePath, '/');
1121 snprintf(thumbnailPath, sizeof(thumbnailPath), MSG_THUMBNAIL_PATH"%s.jpg", fileName+1);
1123 if (remove(thumbnailPath) == -1)
1124 MSG_DEBUG("Fail to delete thumbnail [%s]", thumbnailPath);
1126 MSG_DEBUG("Success to delete thumbnail [%s]", thumbnailPath);
1128 //delete MMS_PLUGIN_MESSAGE_TABLE_NAME table data
1129 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1130 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE REFERENCE_ID = %d;",
1131 MMS_PLUGIN_MESSAGE_TABLE_NAME, refId);
1133 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
1134 MSG_DEBUG("sqlQuery [%s]", sqlQuery);
1135 dbHandle.freeTable();
1136 dbHandle.endTrans(false);
1137 err = MSG_ERR_DB_EXEC;
1142 //delete MMS_PLUGIN_ATTRIBUTE_TABLE_NAME table data
1143 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1144 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE REFERENCE_ID = %d;",
1145 MMS_PLUGIN_ATTRIBUTE_TABLE_NAME, refId);
1147 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
1148 MSG_DEBUG("sqlQuery [%s]", sqlQuery);
1149 dbHandle.freeTable();
1150 dbHandle.endTrans(false);
1151 err = MSG_ERR_DB_EXEC;
1156 MSG_DEBUG("There is remained multi-recipient mms for this msg = %d", msgId);
1160 dbHandle.freeTable();
1162 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1164 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE MSG_ID IN \
1165 (SELECT MSG_ID FROM %s WHERE FOLDER_ID = %d);",
1166 tableList[i], MSGFW_MESSAGE_TABLE_NAME, FolderId);
1168 // Delete Message in specific folder from table
1169 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
1170 MSG_DEBUG("sqlQuery [%s]", sqlQuery);
1171 dbHandle.endTrans(false);
1172 err = MSG_ERR_DB_EXEC;
1179 // Clear Address table
1180 if (MsgStoClearAddressTable(&dbHandle) != MSG_SUCCESS) {
1181 dbHandle.endTrans(false);
1182 err = MSG_ERR_DB_EXEC;
1188 while (!threadList.empty()) {
1189 err = MsgStoUpdateAddress(&dbHandle, threadList.front());
1193 if (err != MSG_SUCCESS) {
1194 dbHandle.endTrans(false);
1200 dbHandle.endTrans(true);
1202 if (FolderId == MSG_INBOX_ID) {
1206 smsCnt = MsgStoGetUnreadCnt(&dbHandle, MSG_SMS_TYPE);
1207 mmsCnt = MsgStoGetUnreadCnt(&dbHandle, MSG_MMS_TYPE);
1209 MsgSettingSetIndicator(smsCnt, mmsCnt);
1212 /*** Set pMsgIdList **/
1213 if (pMsgIdList != NULL && pToDeleteMsgIdList->nCount > 0) {
1214 pMsgIdList->nCount = pToDeleteMsgIdList->nCount;
1216 pMsgIdList->msgIdList = (MSG_MESSAGE_ID_T *)new char[sizeof(MSG_MESSAGE_ID_T)*pToDeleteMsgIdList->nCount];
1217 memcpy(pMsgIdList->msgIdList, pToDeleteMsgIdList->msgIdList, sizeof(MSG_MESSAGE_ID_T)*pToDeleteMsgIdList->nCount);
1221 /*** Create thread for noti delete. **/
1223 if (pToDeleteMsgIdList->nCount > 0) {
1225 if (g_idle_add(startToDeleteNoti, (void *)pToDeleteMsgIdList) == 0) {
1226 MSG_DEBUG("startToDeleteNoti not invoked: %s", strerror(errno));
1228 if (pToDeleteMsgIdList != NULL) {
1229 //free peer info list
1230 if (pToDeleteMsgIdList->msgIdList != NULL)
1231 delete [] pToDeleteMsgIdList->msgIdList;
1233 delete [] pToDeleteMsgIdList;
1235 err = MSG_ERR_UNKNOWN;
1244 MSG_DEBUG("Error case Free Memory");
1246 while (!threadList.empty()) {
1252 if (pToDeleteMsgIdList != NULL) {
1253 //free peer info list
1254 if (pToDeleteMsgIdList->msgIdList != NULL)
1255 delete [] pToDeleteMsgIdList->msgIdList;
1257 delete [] pToDeleteMsgIdList;
1265 MSG_ERROR_T MsgStoMoveMessageToFolder(MSG_MESSAGE_ID_T MsgId, MSG_FOLDER_ID_T DestFolderId)
1267 MSG_MESSAGE_TYPE_S msgType;
1269 MsgStoGetMsgType(MsgId, &msgType);
1271 char sqlQuery[MAX_QUERY_LEN+1];
1273 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1275 if (msgType.mainType == MSG_SMS_TYPE) {
1276 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET FOLDER_ID = %d WHERE MSG_ID = %d;",
1277 MSGFW_MESSAGE_TABLE_NAME, DestFolderId, MsgId);
1279 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET FOLDER_ID = %d WHERE REFERENCE_ID = %d;",
1280 MSGFW_MESSAGE_TABLE_NAME, DestFolderId, MsgId);
1283 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS)
1284 return MSG_ERR_DB_EXEC;
1286 unsigned int addrId = 0;
1287 /* get address id */
1288 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1290 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT ADDRESS_ID FROM %s WHERE MSG_ID = %d;",
1291 MSGFW_MESSAGE_TABLE_NAME, MsgId);
1293 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
1294 return MSG_ERR_DB_PREPARE;
1296 if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
1297 addrId = dbHandle.columnInt(0);
1299 MSG_DEBUG("addrId : %d", addrId);
1301 dbHandle.finalizeQuery();
1303 /* update address table */
1304 MsgStoUpdateAddress(&dbHandle, addrId);
1310 MSG_ERROR_T MsgStoMoveMessageToStorage(MSG_MESSAGE_ID_T MsgId, MSG_STORAGE_ID_T DestStorageId)
1314 MSG_ERROR_T err = MSG_SUCCESS;
1316 char sqlQuery[MAX_QUERY_LEN+1];
1318 MSG_DEBUG("MsgId : %d, DestStorageId : %d", MsgId, DestStorageId);
1320 switch (DestStorageId) {
1321 case MSG_STORAGE_SIM : // Move message to sim card
1323 MSG_MESSAGE_INFO_S msgInfo;
1324 SMS_SIM_ID_LIST_S simIdList;
1326 memset(&simIdList, 0x00, sizeof(SMS_SIM_ID_LIST_S));
1328 if ((err = MsgStoGetMessage(MsgId, &msgInfo, NULL)) != MSG_SUCCESS)
1331 MsgPlugin *plg = MsgPluginManager::instance()->getPlugin(MSG_SMS_TYPE);
1333 if ((err = plg->saveSimMessage(&msgInfo, &simIdList)) != MSG_SUCCESS)
1336 dbHandle.beginTrans();
1338 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1339 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET STORAGE_ID = %d WHERE MSG_ID = %d;",
1340 MSGFW_MESSAGE_TABLE_NAME, DestStorageId, MsgId);
1342 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
1343 dbHandle.endTrans(false);
1344 return MSG_ERR_DB_EXEC;
1347 for (unsigned int i = 0; i < simIdList.count; i++) {
1348 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1349 snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, %d);",
1350 MSGFW_SIM_MSG_TABLE_NAME, MsgId, simIdList.simId[i]);
1352 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
1353 dbHandle.endTrans(false);
1354 return MSG_ERR_DB_EXEC;
1358 dbHandle.endTrans(true);
1362 default: //Moving message to memory (when destination storage id is MSG_STORAGE_PHONE)
1364 bool bSimMsg = false;
1367 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1368 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT STORAGE_ID FROM %s WHERE MSG_ID = %d;",
1369 MSGFW_MESSAGE_TABLE_NAME, MsgId);
1371 err = dbHandle.getTable(sqlQuery, &rowCnt);
1373 if (err != MSG_SUCCESS) {
1374 dbHandle.freeTable();
1378 if (dbHandle.getColumnToInt(1) == MSG_STORAGE_SIM) {
1379 MSG_DEBUG("It is SIM Message");
1383 dbHandle.freeTable();
1385 if (bSimMsg == true) {
1386 MSG_SIM_ID_T simMsgId;
1388 // get sim message id
1389 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1391 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT SIM_ID FROM %s WHERE MSG_ID = %d;",
1392 MSGFW_SIM_MSG_TABLE_NAME, MsgId);
1394 MSG_DEBUG("sqlQuery is %s.", sqlQuery);
1396 err = dbHandle.getTable(sqlQuery, &rowCnt);
1398 if (err != MSG_SUCCESS) {
1399 dbHandle.freeTable();
1403 //Delete messages in sim card
1404 MsgPlugin *plg = MsgPluginManager::instance()->getPlugin(MSG_SMS_TYPE);
1406 for (int i = 0; i < rowCnt; i++) {
1407 simMsgId = dbHandle.getColumnToInt(i+1);
1409 MSG_DEBUG("simMsgId is %d.", simMsgId);
1411 if ((err = plg->deleteSimMessage(simMsgId)) != MSG_SUCCESS) {
1412 dbHandle.freeTable();
1417 dbHandle.freeTable();
1419 dbHandle.beginTrans();
1421 //Delete Messages in SIM Msg table
1422 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1423 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE MSG_ID = %d;",
1424 MSGFW_SIM_MSG_TABLE_NAME, MsgId);
1425 MSG_DEBUG("sqlQuery is %s.", sqlQuery);
1427 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
1428 dbHandle.endTrans(false);
1429 return MSG_ERR_DB_EXEC;
1433 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1434 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET STORAGE_ID = %d WHERE MSG_ID = %d;",
1435 MSGFW_MESSAGE_TABLE_NAME, DestStorageId, MsgId);
1437 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
1438 dbHandle.endTrans(false);
1439 return MSG_ERR_DB_EXEC;
1442 dbHandle.endTrans(true);
1451 MSG_ERROR_T MsgStoCountMessage(MSG_FOLDER_ID_T FolderId, MSG_COUNT_INFO_S *pCountInfo)
1453 if (pCountInfo == NULL) {
1454 MSG_DEBUG("pCountInfo is NULL");
1455 return MSG_ERR_NULL_POINTER;
1458 char sqlQuery[MAX_QUERY_LEN+1];
1460 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1461 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s WHERE FOLDER_ID = %d AND READ_STATUS = 1 \
1462 UNION ALL SELECT COUNT(MSG_ID) FROM %s WHERE FOLDER_ID = %d AND READ_STATUS = 0 \
1463 UNION ALL SELECT COUNT(MSG_ID) FROM %s WHERE FOLDER_ID = %d AND MAIN_TYPE = %d \
1464 UNION ALL SELECT COUNT(MSG_ID) FROM %s WHERE FOLDER_ID = %d AND MAIN_TYPE = %d ;",
1465 MSGFW_MESSAGE_TABLE_NAME, FolderId,
1466 MSGFW_MESSAGE_TABLE_NAME, FolderId,
1467 MSGFW_MESSAGE_TABLE_NAME, FolderId, MSG_SMS_TYPE,
1468 MSGFW_MESSAGE_TABLE_NAME, FolderId, MSG_MMS_TYPE);
1470 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
1471 return MSG_ERR_DB_PREPARE;
1473 if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
1474 pCountInfo->nReadCnt = dbHandle.columnInt(0);
1476 dbHandle.finalizeQuery();
1477 return MSG_ERR_DB_STEP;
1480 if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
1481 pCountInfo->nUnreadCnt = dbHandle.columnInt(0);
1483 dbHandle.finalizeQuery();
1484 return MSG_ERR_DB_STEP;
1487 if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
1488 pCountInfo->nSms = dbHandle.columnInt(0);
1490 dbHandle.finalizeQuery();
1491 return MSG_ERR_DB_STEP;
1494 if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
1495 pCountInfo->nMms = dbHandle.columnInt(0);
1497 dbHandle.finalizeQuery();
1498 return MSG_ERR_DB_STEP;
1501 dbHandle.finalizeQuery();
1507 MSG_ERROR_T MsgStoCountMsgByType(const MSG_MESSAGE_TYPE_S *pMsgType, int *pMsgCount)
1509 if (pMsgType == NULL) {
1510 MSG_DEBUG("pMsgType is NULL");
1511 return MSG_ERR_NULL_POINTER;
1516 char sqlQuery[MAX_QUERY_LEN+1];
1517 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1519 if ((pMsgType->mainType == MSG_SMS_TYPE) &&
1520 (pMsgType->subType == MSG_NORMAL_SMS || pMsgType->subType == MSG_STATUS_REPORT_SMS || pMsgType->subType == MSG_CONCAT_SIM_SMS)) {
1521 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s WHERE MAIN_TYPE = %d AND SUB_TYPE IN (%d, %d, %d);",
1522 MSGFW_MESSAGE_TABLE_NAME, pMsgType->mainType, MSG_NORMAL_SMS, MSG_STATUS_REPORT_SMS, MSG_CONCAT_SIM_SMS);
1523 } else if ((pMsgType->mainType == MSG_SMS_TYPE) &&
1524 (pMsgType->subType == MSG_WAP_SI_SMS || pMsgType->subType == MSG_WAP_SL_SMS)) {
1526 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s WHERE MAIN_TYPE = %d AND SUB_TYPE IN (%d, %d);",
1527 MSGFW_MESSAGE_TABLE_NAME, pMsgType->mainType, MSG_WAP_SI_SMS, MSG_WAP_SL_SMS);
1528 } else if ((pMsgType->mainType == MSG_MMS_TYPE) &&
1529 (pMsgType->subType == MSG_SENDREQ_MMS || pMsgType->subType == MSG_SENDCONF_MMS || pMsgType->subType == MSG_RETRIEVE_AUTOCONF_MMS || pMsgType->subType == MSG_RETRIEVE_MANUALCONF_MMS)) {
1531 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s WHERE MAIN_TYPE = %d AND SUB_TYPE IN (%d, %d, %d, %d);",
1532 MSGFW_MESSAGE_TABLE_NAME, pMsgType->mainType, MSG_SENDREQ_MMS, MSG_SENDCONF_MMS, MSG_RETRIEVE_AUTOCONF_MMS, MSG_RETRIEVE_MANUALCONF_MMS);
1534 return MSG_ERR_INVALID_PARAMETER;
1537 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
1538 return MSG_ERR_DB_PREPARE;
1540 if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
1541 *pMsgCount = dbHandle.columnInt(0);
1543 dbHandle.finalizeQuery();
1544 return MSG_ERR_DB_STEP;
1547 dbHandle.finalizeQuery();
1553 MSG_ERROR_T MsgStoGetMessage(MSG_MESSAGE_ID_T MsgId, MSG_MESSAGE_INFO_S *pMsg, MSG_SENDINGOPT_INFO_S *pSendOptInfo)
1555 char sqlQuery[MAX_QUERY_LEN+1];
1557 unsigned int addrId = 0;
1559 char firstName[MAX_DISPLAY_NAME_LEN+1], lastName[MAX_DISPLAY_NAME_LEN+1];
1561 memset(firstName, 0x00, sizeof(firstName));
1562 memset(lastName, 0x00, sizeof(lastName));
1564 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1565 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.MSG_ID, A.ADDRESS_ID, A.FOLDER_ID, A.REFERENCE_ID, A.STORAGE_ID, A.MAIN_TYPE, A.SUB_TYPE, A.DISPLAY_TIME, A.DATA_SIZE, \
1566 A.NETWORK_STATUS, A.READ_STATUS, A.PROTECTED, A.BACKUP, A.PRIORITY, A.MSG_DIRECTION, A.SCHEDULED_TIME, A.SUBJECT, A.MSG_TEXT, \
1567 B.ADDRESS_TYPE, B.RECIPIENT_TYPE, B.CONTACT_ID, B.ADDRESS_VAL, B.DISPLAY_NAME, B.FIRST_NAME, B.LAST_NAME, A.THUMB_PATH \
1568 FROM %s A, %s B WHERE A.MSG_ID = %d AND A.ADDRESS_ID = B.ADDRESS_ID;",
1569 MSGFW_MESSAGE_TABLE_NAME, MSGFW_ADDRESS_TABLE_NAME, MsgId);
1571 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
1572 return MSG_ERR_DB_PREPARE;
1574 if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
1575 pMsg->msgId = dbHandle.columnInt(0);
1576 addrId = dbHandle.columnInt(1);
1577 pMsg->folderId = dbHandle.columnInt(2);
1578 pMsg->referenceId = dbHandle.columnInt(3);
1579 pMsg->storageId = dbHandle.columnInt(4);
1580 pMsg->msgType.mainType = dbHandle.columnInt(5);
1581 pMsg->msgType.subType = dbHandle.columnInt(6);
1582 pMsg->displayTime = (time_t)dbHandle.columnInt(7);
1583 pMsg->dataSize = dbHandle.columnInt(8);
1584 pMsg->networkStatus = dbHandle.columnInt(9);
1585 pMsg->bRead = dbHandle.columnInt(10);
1586 pMsg->bProtected = dbHandle.columnInt(11);
1587 pMsg->bBackup = dbHandle.columnInt(12);
1588 pMsg->priority = dbHandle.columnInt(13);
1589 pMsg->direction= dbHandle.columnInt(14);
1590 pMsg->scheduledTime = (time_t)dbHandle.columnInt(15);
1592 strncpy(pMsg->subject, (char *)dbHandle.columnText(16), MAX_SUBJECT_LEN);
1594 /* Temp_File_Handling */
1595 if (pMsg->msgType.mainType == MSG_SMS_TYPE || pMsg->msgType.subType == MSG_NOTIFICATIONIND_MMS) {
1596 if (pMsg->dataSize > MAX_MSG_TEXT_LEN) {
1597 char msgData[pMsg->dataSize+1];
1598 memset(msgData, 0x00, sizeof(msgData));
1600 strncpy(msgData, (char *)dbHandle.columnText(17), pMsg->dataSize);
1602 // Save Message Data into File
1603 char fileName[MAX_COMMON_INFO_SIZE+1];
1604 memset(fileName, 0x00, sizeof(fileName));
1606 if (MsgCreateFileName(fileName) == false) {
1607 dbHandle.finalizeQuery();
1608 return MSG_ERR_STORAGE_ERROR;
1611 MSG_DEBUG("Save Message Data into file : size[%d] name[%s]\n", pMsg->dataSize, fileName);
1613 if (MsgWriteIpcFile(fileName, msgData, pMsg->dataSize) == false) {
1614 dbHandle.finalizeQuery();
1615 return MSG_ERR_STORAGE_ERROR;
1618 strncpy(pMsg->msgData, fileName, MAX_MSG_DATA_LEN);
1620 pMsg->bTextSms = false;
1622 memset(pMsg->msgText, 0x00, sizeof(pMsg->msgText));
1623 strncpy(pMsg->msgText, (char *)dbHandle.columnText(17), pMsg->dataSize);
1625 // For WAP PUSH SI Message
1626 if (pMsg->msgType.subType == MSG_WAP_SI_SMS) {
1627 strncat(pMsg->msgText, "\n", MAX_MSG_TEXT_LEN-strlen(pMsg->msgText));
1628 strncat(pMsg->msgText, pMsg->subject, MAX_MSG_TEXT_LEN-strlen(pMsg->msgText));
1629 MSG_DEBUG("pMsg->msgText : [%s]", pMsg->msgText);
1630 pMsg->dataSize = sizeof(pMsg->msgText);
1633 pMsg->bTextSms = true;
1636 if (dbHandle.columnText(17) != NULL)
1637 strncpy(pMsg->msgText, (char *)dbHandle.columnText(17), MAX_MSG_TEXT_LEN);
1641 pMsg->nAddressCnt = 1;
1643 pMsg->nAddressCnt = 0;
1645 pMsg->addressList[0].threadId = addrId;
1646 pMsg->addressList[0].addressType = dbHandle.columnInt(18);
1647 pMsg->addressList[0].recipientType = dbHandle.columnInt(19);
1648 pMsg->addressList[0].contactId = dbHandle.columnInt(20);
1650 if (dbHandle.columnText(21) != NULL)
1651 strncpy(pMsg->addressList[0].addressVal, (char *)dbHandle.columnText(21), MAX_ADDRESS_VAL_LEN);
1653 if (dbHandle.columnText(22) != NULL && ((char *)dbHandle.columnText(22))[0]!='\0') {
1654 MSG_DEBUG("displayName : [%s]", dbHandle.columnText(22));
1655 strncpy(pMsg->addressList[0].displayName, (char *)dbHandle.columnText(22), MAX_DISPLAY_NAME_LEN);
1657 if (dbHandle.columnText(23) != NULL)
1658 strncpy(firstName, (char *)dbHandle.columnText(23), MAX_DISPLAY_NAME_LEN);
1660 if (dbHandle.columnText(24) != NULL)
1661 strncpy(lastName, (char *)dbHandle.columnText(24), MAX_DISPLAY_NAME_LEN);
1663 int order = MsgGetContactNameOrder();
1666 if (strlen(firstName) > 0) {
1667 strncpy(pMsg->addressList[0].displayName, firstName, MAX_DISPLAY_NAME_LEN);
1670 if (strlen(lastName) > 0) {
1671 strncat(pMsg->addressList[0].displayName, " ", MAX_DISPLAY_NAME_LEN-strlen(pMsg->addressList[0].displayName));
1672 strncat(pMsg->addressList[0].displayName, lastName, MAX_DISPLAY_NAME_LEN-strlen(pMsg->addressList[0].displayName));
1674 } else if (order == 1) {
1675 if (strlen(lastName) > 0) {
1676 strncpy(pMsg->addressList[0].displayName, lastName, MAX_DISPLAY_NAME_LEN);
1677 strncat(pMsg->addressList[0].displayName, " ", MAX_DISPLAY_NAME_LEN-strlen(pMsg->addressList[0].displayName));
1680 if (strlen(firstName) > 0) {
1681 strncat(pMsg->addressList[0].displayName, firstName, MAX_DISPLAY_NAME_LEN-strlen(pMsg->addressList[0].displayName));
1687 if (dbHandle.columnText(25)!=NULL && ((char *)dbHandle.columnText(25))[0] != '\0') {
1688 strncpy(pMsg->thumbPath, (char *)dbHandle.columnText(25), MSG_FILEPATH_LEN_MAX);
1689 MSG_DEBUG("pMsg->thumbPath : [%s]", pMsg->thumbPath);
1692 dbHandle.finalizeQuery();
1693 MSG_DEBUG("%s", sqlQuery);
1694 return MSG_ERR_DB_STEP;
1697 dbHandle.finalizeQuery();
1699 // Get MMS body if it is MMS.
1700 if ((pMsg->networkStatus == MSG_NETWORK_RETRIEVE_SUCCESS && (pMsg->msgType.subType == MSG_RETRIEVE_AUTOCONF_MMS || pMsg->msgType.subType == MSG_RETRIEVE_MANUALCONF_MMS)) ||
1701 pMsg->msgType.subType == MSG_SENDREQ_MMS ||
1702 pMsg->msgType.subType == MSG_SENDCONF_MMS) {
1703 MSG_ERROR_T err = MSG_SUCCESS;
1704 MMS_MESSAGE_DATA_S mmsMsg;
1705 char *pDestMsg = NULL;
1707 // call mms plugin to get mms specific message data
1708 MsgPlugin *plg = MsgPluginManager::instance()->getPlugin(pMsg->msgType.mainType);
1709 memset(&mmsMsg, 0, sizeof(MMS_MESSAGE_DATA_S));
1710 err = plg->getMmsMessage(pMsg, pSendOptInfo, &mmsMsg, &pDestMsg);
1712 if (err != MSG_SUCCESS) {
1717 return MSG_ERR_STORAGE_ERROR;
1720 memset(pMsg->msgData, 0, MAX_MSG_DATA_LEN+1);
1722 // Encode MMS specific data to MMS_MESSAGE_DATA_S
1723 if (pMsg->dataSize > MAX_MSG_DATA_LEN) {
1724 // Save Message Data into File
1725 char tempFileName[MAX_COMMON_INFO_SIZE+1];
1726 memset(tempFileName, 0x00, sizeof(tempFileName));
1728 if (MsgCreateFileName(tempFileName) == false) {
1733 return MSG_ERR_STORAGE_ERROR;
1735 MSG_DEBUG("Save Message Data into file : size[%d] name[%s]\n", pMsg->dataSize, tempFileName);
1737 if (MsgWriteIpcFile(tempFileName, pDestMsg, pMsg->dataSize) == false) {
1742 return MSG_ERR_STORAGE_ERROR;
1744 strncpy(pMsg->msgData, tempFileName, MAX_MSG_DATA_LEN);
1745 //pMsg->dataSize = strlen(fileName);
1746 pMsg->bTextSms = false;
1748 strncpy(pMsg->msgData, pDestMsg, pMsg->dataSize);
1749 pMsg->bTextSms = true;
1758 // Get SMS Sending Options
1759 if (pMsg->msgType.mainType == MSG_SMS_TYPE && pSendOptInfo != NULL) {
1760 MsgStoGetSmsSendOpt(pMsg->msgId, pSendOptInfo);
1767 MSG_ERROR_T MsgStoGetFolderViewList(MSG_FOLDER_ID_T FolderId, const MSG_SORT_RULE_S *pSortRule, MSG_LIST_S *pMsgFolderViewList)
1769 if (pMsgFolderViewList == NULL) {
1770 MSG_DEBUG("pMsgFolderViewList is NULL");
1771 return MSG_ERR_NULL_POINTER;
1775 int index = 27; // numbers of index
1777 unsigned int addrId = 0;
1779 char sqlQuery[MAX_QUERY_LEN+1];
1781 char firstName[MAX_DISPLAY_NAME_LEN+1], lastName[MAX_DISPLAY_NAME_LEN+1];
1782 char displayName[MAX_DISPLAY_NAME_LEN+1];
1784 int order = MsgGetContactNameOrder();
1786 // Get Message In Folder
1787 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1789 if (FolderId == MSG_ALLBOX_ID) {
1790 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.MSG_ID, A.ADDRESS_ID, A.FOLDER_ID, A.REFERENCE_ID, A.STORAGE_ID, A.MAIN_TYPE, A.SUB_TYPE, \
1791 A.DISPLAY_TIME, A.DATA_SIZE, A.NETWORK_STATUS, A.READ_STATUS, A.PROTECTED, A.BACKUP, A.PRIORITY, \
1792 A.MSG_DIRECTION, A.SCHEDULED_TIME, A.SUBJECT, A.MSG_TEXT, B.ADDRESS_TYPE, B.RECIPIENT_TYPE, \
1793 B.CONTACT_ID, B.ADDRESS_VAL, B.DISPLAY_NAME, B.FIRST_NAME, B.LAST_NAME, A.ATTACHMENT_COUNT, A.THUMB_PATH \
1795 WHERE A.ADDRESS_ID = B.ADDRESS_ID \
1796 AND A.FOLDER_ID < %d ",
1797 MSGFW_MESSAGE_TABLE_NAME, MSGFW_ADDRESS_TABLE_NAME, MSG_CBMSGBOX_ID);
1799 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.MSG_ID, A.ADDRESS_ID, A.FOLDER_ID, A.REFERENCE_ID, A.STORAGE_ID, A.MAIN_TYPE, A.SUB_TYPE, \
1800 A.DISPLAY_TIME, A.DATA_SIZE, A.NETWORK_STATUS, A.READ_STATUS, A.PROTECTED, A.BACKUP, A.PRIORITY, \
1801 A.MSG_DIRECTION, A.SCHEDULED_TIME, A.SUBJECT, A.MSG_TEXT, B.ADDRESS_TYPE, B.RECIPIENT_TYPE, \
1802 B.CONTACT_ID, B.ADDRESS_VAL, B.DISPLAY_NAME, B.FIRST_NAME, B.LAST_NAME, A.ATTACHMENT_COUNT, A.THUMB_PATH \
1804 WHERE A.ADDRESS_ID = B.ADDRESS_ID \
1805 AND A.FOLDER_ID = %d ",
1806 MSGFW_MESSAGE_TABLE_NAME, MSGFW_ADDRESS_TABLE_NAME, FolderId);
1809 memset(sqlSort, 0x00, sizeof(sqlSort));
1810 MsgMakeSortRule(pSortRule, sqlSort);
1811 strncat(sqlQuery, sqlSort, strlen(sqlSort));
1813 MSG_ERROR_T err = dbHandle.getTable(sqlQuery, &rowCnt);
1815 if (err == MSG_ERR_DB_NORECORD) {
1816 pMsgFolderViewList->nCount = 0;
1817 pMsgFolderViewList->msgInfo = NULL;
1819 dbHandle.freeTable();
1822 } else if (err != MSG_SUCCESS) {
1823 MSG_DEBUG("sqlQuery is - %s", sqlQuery);
1824 dbHandle.freeTable();
1828 pMsgFolderViewList->nCount = rowCnt;
1830 MSG_DEBUG("pMsgCommInfoList->nCount [%d]", pMsgFolderViewList->nCount);
1832 pMsgFolderViewList->msgInfo = (msg_message_t *)new char[sizeof(MSG_MESSAGE_S *) * rowCnt];
1834 MSG_MESSAGE_S *pTmp = NULL;
1836 for (int i = 0; i < rowCnt; i++) {
1837 pMsgFolderViewList->msgInfo[i] = (msg_message_t)new char[sizeof(MSG_MESSAGE_S)];
1839 pTmp = (MSG_MESSAGE_S *)pMsgFolderViewList->msgInfo[i];
1841 memset(pTmp, 0x00, sizeof(pTmp));
1844 pTmp->pMmsData = NULL;
1846 pTmp->msgId = dbHandle.getColumnToInt(index++);
1847 addrId = dbHandle.getColumnToInt(index++);
1848 pTmp->folderId = dbHandle.getColumnToInt(index++);
1849 pTmp->referenceId = dbHandle.getColumnToInt(index++);
1850 pTmp->storageId = dbHandle.getColumnToInt(index++);
1851 pTmp->msgType.mainType = dbHandle.getColumnToInt(index++);
1852 pTmp->msgType.subType = dbHandle.getColumnToInt(index++);
1853 pTmp->displayTime = (time_t)dbHandle.getColumnToInt(index++);
1854 pTmp->dataSize = dbHandle.getColumnToInt(index++);
1855 pTmp->networkStatus = dbHandle.getColumnToInt(index++);
1856 pTmp->bRead = dbHandle.getColumnToInt(index++);
1857 pTmp->bProtected = dbHandle.getColumnToInt(index++);
1858 pTmp->bBackup = dbHandle.getColumnToInt(index++);
1859 pTmp->priority = dbHandle.getColumnToInt(index++);
1860 pTmp->direction= dbHandle.getColumnToInt(index++);
1861 pTmp->scheduledTime = (time_t)dbHandle.getColumnToInt(index++);
1863 dbHandle.getColumnToString(index++, MAX_SUBJECT_LEN, pTmp->subject);
1865 if (pTmp->msgType.mainType == MSG_MMS_TYPE &&
1866 (pTmp->networkStatus == MSG_NETWORK_RETRIEVING || pTmp->networkStatus == MSG_NETWORK_RETRIEVE_FAIL || pTmp->msgType.subType == MSG_NOTIFICATIONIND_MMS)) {
1870 pTmp->pData = (void *)new char[pTmp->dataSize + 2];
1871 memset(pTmp->pData, 0x00, sizeof(pTmp->pData));
1873 dbHandle.getColumnToString(index++, pTmp->dataSize+1, (char *)pTmp->pData);
1877 pTmp->nAddressCnt = 1;
1879 pTmp->nAddressCnt = 0;
1881 pTmp->addressList[0].threadId = addrId;
1882 pTmp->addressList[0].addressType = dbHandle.getColumnToInt(index++);
1883 pTmp->addressList[0].recipientType = dbHandle.getColumnToInt(index++);
1884 pTmp->addressList[0].contactId = dbHandle.getColumnToInt(index++);
1886 dbHandle.getColumnToString(index++, MAX_ADDRESS_VAL_LEN, pTmp->addressList[0].addressVal);
1888 memset(displayName, 0x00, sizeof(displayName));
1889 dbHandle.getColumnToString(index++, MAX_DISPLAY_NAME_LEN, displayName);
1891 memset(firstName, 0x00, sizeof(firstName));
1892 dbHandle.getColumnToString(index++, MAX_DISPLAY_NAME_LEN, firstName);
1894 memset(lastName, 0x00, sizeof(lastName));
1895 dbHandle.getColumnToString(index++, MAX_DISPLAY_NAME_LEN, lastName);
1898 if (strlen(displayName) <= 0) {
1900 if (firstName[0] != '\0') {
1901 strncpy(displayName, firstName, MAX_DISPLAY_NAME_LEN);
1904 if (lastName[0] != '\0') {
1905 strncat(displayName, " ", MAX_DISPLAY_NAME_LEN-strlen(displayName));
1906 strncat(displayName, lastName, MAX_DISPLAY_NAME_LEN-strlen(displayName));
1908 } else if (order == 1) {
1909 if (lastName[0] != '\0') {
1910 strncpy(displayName, lastName, MAX_DISPLAY_NAME_LEN);
1911 strncat(displayName, " ", MAX_DISPLAY_NAME_LEN-strlen(displayName));
1914 if (firstName[0] != '\0') {
1915 strncat(displayName, firstName, MAX_DISPLAY_NAME_LEN-strlen(displayName));
1920 strncpy(pTmp->addressList[0].displayName, displayName, MAX_DISPLAY_NAME_LEN);
1922 pTmp->attachCount = dbHandle.getColumnToInt(index++);
1924 dbHandle.getColumnToString(index++, MSG_FILEPATH_LEN_MAX, pTmp->thumbPath);
1927 dbHandle.freeTable();
1933 MSG_ERROR_T MsgStoAddSyncMLMessage(MSG_MESSAGE_INFO_S *pMsgInfo, int ExtId, int PinCode)
1937 MSG_ERROR_T err = MSG_SUCCESS;
1939 char sqlQuery[MAX_QUERY_LEN+1];
1941 unsigned int rowId = 0;
1942 unsigned int addrId = 0;
1944 dbHandle.beginTrans();
1946 if (pMsgInfo->nAddressCnt > 0) {
1947 err = MsgStoAddAddress(&dbHandle, &(pMsgInfo->addressList[0]), &addrId);
1949 if (err != MSG_SUCCESS) {
1950 dbHandle.endTrans(false);
1955 // Add Message Table
1956 rowId = MsgStoAddMessageTable(&dbHandle, pMsgInfo, addrId);
1959 dbHandle.endTrans(false);
1960 return MSG_ERR_DB_ROW;
1963 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1964 snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, %d, %d);",
1965 MSGFW_SYNCML_MSG_TABLE_NAME, rowId, ExtId, PinCode);
1967 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
1968 dbHandle.endTrans(false);
1969 return MSG_ERR_DB_EXEC;
1972 if (MsgStoUpdateAddress(&dbHandle, addrId) != MSG_SUCCESS) {
1973 dbHandle.endTrans(false);
1974 return MSG_ERR_STORAGE_ERROR;
1977 dbHandle.endTrans(true);
1979 pMsgInfo->msgId = (MSG_MESSAGE_ID_T)rowId;
1980 pMsgInfo->referenceId = (MSG_REFERENCE_ID_T)rowId;
1982 MsgSoundPlayStart();
1987 smsCnt = MsgStoGetUnreadCnt(&dbHandle, MSG_SMS_TYPE);
1988 mmsCnt = MsgStoGetUnreadCnt(&dbHandle, MSG_MMS_TYPE);
1990 MsgSettingHandleNewMsg(smsCnt, mmsCnt);
1992 MsgInsertNoti(&dbHandle, pMsgInfo);
2000 MSG_ERROR_T MsgStoGetMsgType(MSG_MESSAGE_ID_T msgId, MSG_MESSAGE_TYPE_S *pMsgType)
2002 char sqlQuery[MAX_QUERY_LEN+1];
2004 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2006 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MAIN_TYPE, SUB_TYPE FROM %s WHERE MSG_ID = %d;",
2007 MSGFW_MESSAGE_TABLE_NAME, msgId);
2009 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
2010 return MSG_ERR_DB_PREPARE;
2012 if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
2013 pMsgType->mainType = dbHandle.columnInt(0);
2014 pMsgType->subType = dbHandle.columnInt(1);
2017 dbHandle.finalizeQuery();
2023 MSG_ERROR_T MsgStoGetQuickPanelData(MSG_QUICKPANEL_TYPE_T Type, MSG_MESSAGE_INFO_S *pMsg)
2025 MSG_ERROR_T err = MSG_SUCCESS;
2027 char sqlQuery[MAX_QUERY_LEN+1];
2029 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2031 if (Type == MSG_QUICKPANEL_SMS) {
2032 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;",
2033 MSGFW_MESSAGE_TABLE_NAME, MSG_INBOX_ID, MSG_SMS_TYPE, MSG_NORMAL_SMS);
2034 } else if (Type == MSG_QUICKPANEL_MMS) {
2035 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;",
2036 MSGFW_MESSAGE_TABLE_NAME, MSG_INBOX_ID, MSG_MMS_TYPE, MSG_RETRIEVE_AUTOCONF_MMS, MSG_RETRIEVE_MANUALCONF_MMS);
2037 } else if (Type == MSG_QUICKPANEL_DELIVER_REP) {
2038 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s WHERE SUB_TYPE IN (%d, %d) AND READ_STATUS = 0 ORDER BY DISPLAY_TIME DESC;",
2039 MSGFW_MESSAGE_TABLE_NAME, MSG_STATUS_REPORT_SMS, MSG_DELIVERYIND_MMS);
2040 } else if (Type == MSG_QUICKPANEL_READ_REP) {
2041 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;",
2042 MSGFW_MESSAGE_TABLE_NAME, MSG_MMS_TYPE, MSG_READORGIND_MMS);
2043 } else if (Type == MSG_QUICKPANEL_VOICEMAIL) {
2044 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;",
2045 MSGFW_MESSAGE_TABLE_NAME, MSG_INBOX_ID, MSG_SMS_TYPE, MSG_MWI_VOICE_SMS);
2046 } else if (Type == MSG_QUICKPANEL_MMS_NOTI) {
2047 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;",
2048 MSGFW_MESSAGE_TABLE_NAME, MSG_INBOX_ID, MSG_MMS_TYPE, MSG_NOTIFICATIONIND_MMS);
2052 MSG_MESSAGE_ID_T msgId;
2054 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
2055 return MSG_ERR_DB_PREPARE;
2057 if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
2058 msgId = dbHandle.columnInt(0);
2060 dbHandle.finalizeQuery();
2061 return MSG_ERR_DB_STEP;
2064 dbHandle.finalizeQuery();
2067 err = MsgStoGetMessage(msgId, pMsg, NULL);
2073 MSG_ERROR_T MsgStoGetThreadViewList(const MSG_SORT_RULE_S *pSortRule, MSG_THREAD_VIEW_LIST_S *pThreadViewList)
2075 pThreadViewList->nCount = 0;
2076 pThreadViewList->msgThreadInfo = NULL;
2079 int index = 15; // numbers of index
2081 char sqlQuery[MAX_QUERY_LEN+1];
2084 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2086 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT ADDRESS_ID, CONTACT_ID, ADDRESS_VAL, \
2087 DISPLAY_NAME, FIRST_NAME, LAST_NAME, IMAGE_PATH, \
2088 UNREAD_CNT, SMS_CNT, MMS_CNT, MAIN_TYPE, SUB_TYPE, \
2089 MSG_DIRECTION, MSG_TIME, MSG_TEXT \
2091 WHERE ADDRESS_ID <> 0 AND (SMS_CNT > 0 OR MMS_CNT > 0) ",
2092 MSGFW_ADDRESS_TABLE_NAME);
2094 memset(sqlSort, 0x00, sizeof(sqlSort));
2095 MsgMakeSortRule(pSortRule, sqlSort);
2096 strncat(sqlQuery, sqlSort, sizeof(sqlQuery) - strlen(sqlQuery) - 1);
2098 MSG_ERROR_T err = dbHandle.getTable(sqlQuery, &rowCnt);
2100 if (err == MSG_ERR_DB_NORECORD) {
2101 dbHandle.freeTable();
2104 } else if (err != MSG_SUCCESS) {
2105 MSG_DEBUG("%s", sqlQuery);
2107 dbHandle.freeTable();
2112 char firstName[MAX_THREAD_NAME_LEN+1];
2113 char lastName[MAX_THREAD_NAME_LEN+1];
2114 char displayName[MAX_DISPLAY_NAME_LEN+1];
2116 int order = MsgGetContactNameOrder();
2118 pThreadViewList->nCount = rowCnt;
2120 MSG_DEBUG("pThreadViewList->nCount [%d]", pThreadViewList->nCount);
2122 pThreadViewList->msgThreadInfo = (msg_thread_view_t *)new char[sizeof(MSG_THREAD_VIEW_S *)*rowCnt];
2124 MSG_THREAD_VIEW_S *pTmp = NULL;
2126 for (int i = 0; i < rowCnt; i++) {
2127 pThreadViewList->msgThreadInfo[i] = (msg_thread_view_t)new char[sizeof(MSG_THREAD_VIEW_S)];
2129 pTmp = (MSG_THREAD_VIEW_S *)pThreadViewList->msgThreadInfo[i];
2131 pTmp->threadId = dbHandle.getColumnToInt(index++);
2132 pTmp->contactId = dbHandle.getColumnToInt(index++);
2134 memset(pTmp->threadAddr, 0x00, sizeof(pTmp->threadAddr));
2135 dbHandle.getColumnToString(index++, MAX_THREAD_ADDR_LEN, pTmp->threadAddr);
2137 memset(displayName, 0x00, sizeof(displayName));
2138 dbHandle.getColumnToString(index++, MAX_THREAD_NAME_LEN, displayName);
2140 memset(firstName, 0x00, sizeof(firstName));
2141 dbHandle.getColumnToString(index++, MAX_THREAD_NAME_LEN, firstName);
2143 memset(lastName, 0x00, sizeof(lastName));
2144 dbHandle.getColumnToString(index++, MAX_THREAD_NAME_LEN, lastName);
2146 if (strlen(displayName) <= 0) {
2148 if (firstName[0] != '\0') {
2149 strncpy(displayName, firstName, MAX_DISPLAY_NAME_LEN);
2152 if (lastName[0] != '\0') {
2153 strncat(displayName, " ", MAX_DISPLAY_NAME_LEN-strlen(displayName));
2154 strncat(displayName, lastName, MAX_DISPLAY_NAME_LEN-strlen(displayName));
2156 } else if (order == 1) {
2157 if (lastName[0] != '\0') {
2158 strncpy(displayName, lastName, MAX_DISPLAY_NAME_LEN);
2159 strncat(displayName, " ", MAX_DISPLAY_NAME_LEN-strlen(displayName));
2162 if (firstName[0] != '\0') {
2163 strncat(displayName, firstName, MAX_DISPLAY_NAME_LEN-strlen(displayName));
2168 memset(pTmp->threadName, 0x00, sizeof(pTmp->threadName));
2169 strncpy(pTmp->threadName, displayName, MAX_THREAD_NAME_LEN);
2171 memset(pTmp->threadImagePath, 0x00, sizeof(pTmp->threadImagePath));
2172 dbHandle.getColumnToString(index++, MAX_IMAGE_PATH_LEN, pTmp->threadImagePath);
2174 pTmp->unreadCnt = dbHandle.getColumnToInt(index++);
2175 pTmp->smsCnt = dbHandle.getColumnToInt(index++);
2176 pTmp->mmsCnt = dbHandle.getColumnToInt(index++);
2178 pTmp->threadType.mainType = dbHandle.getColumnToInt(index++);
2179 pTmp->threadType.subType = dbHandle.getColumnToInt(index++);
2181 pTmp->direction = dbHandle.getColumnToInt(index++);
2182 pTmp->threadTime = (time_t)dbHandle.getColumnToInt(index++);
2184 memset(pTmp->threadData, 0x00, sizeof(pTmp->threadData));
2185 dbHandle.getColumnToString(index++, MAX_THREAD_DATA_LEN, pTmp->threadData);
2188 dbHandle.freeTable();
2194 MSG_ERROR_T MsgStoGetConversationViewList(MSG_THREAD_ID_T ThreadId, MSG_LIST_S *pConvViewList)
2198 pConvViewList->nCount = 0;
2199 pConvViewList->msgInfo = NULL;
2202 int index = 20; /** numbers of index */
2204 unsigned int addrId = 0;
2206 char sqlQuery[MAX_QUERY_LEN+1];
2208 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2210 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID, ADDRESS_ID, FOLDER_ID, REFERENCE_ID, STORAGE_ID, MAIN_TYPE, SUB_TYPE, \
2211 DISPLAY_TIME, DATA_SIZE, NETWORK_STATUS, READ_STATUS, PROTECTED, BACKUP, PRIORITY, \
2212 MSG_DIRECTION, SCHEDULED_TIME, SUBJECT, MSG_TEXT, ATTACHMENT_COUNT, THUMB_PATH \
2214 WHERE ADDRESS_ID = %d AND FOLDER_ID > %d AND FOLDER_ID < %d \
2215 ORDER BY DISPLAY_TIME, MSG_ID ASC;",
2216 MSGFW_MESSAGE_TABLE_NAME, ThreadId, MSG_ALLBOX_ID, MSG_CBMSGBOX_ID);
2218 MSG_ERROR_T err = dbHandle.getTable(sqlQuery, &rowCnt);
2220 if (err == MSG_ERR_DB_NORECORD) {
2221 dbHandle.freeTable();
2223 } else if (err != MSG_SUCCESS) {
2224 MSG_DEBUG("%s", sqlQuery);
2225 dbHandle.freeTable();
2229 pConvViewList->nCount = rowCnt;
2231 MSG_DEBUG("pConvViewList->nCount [%d]", pConvViewList->nCount);
2233 pConvViewList->msgInfo = (msg_message_t *)new char[sizeof(MSG_MESSAGE_S *) * rowCnt];
2235 MSG_MESSAGE_S *pTmp = NULL;
2237 for (int i = 0; i < rowCnt; i++) {
2238 pConvViewList->msgInfo[i] = (msg_message_t)new char[sizeof(MSG_MESSAGE_S)];
2240 pTmp = (MSG_MESSAGE_S *)pConvViewList->msgInfo[i];
2242 memset(pTmp, 0x00, sizeof(pTmp));
2245 pTmp->pMmsData = NULL;
2247 pTmp->msgId = dbHandle.getColumnToInt(index++);
2248 addrId = dbHandle.getColumnToInt(index++);
2249 pTmp->folderId = dbHandle.getColumnToInt(index++);
2250 pTmp->referenceId = dbHandle.getColumnToInt(index++);
2251 pTmp->storageId = dbHandle.getColumnToInt(index++);
2252 pTmp->msgType.mainType = dbHandle.getColumnToInt(index++);
2253 pTmp->msgType.subType = dbHandle.getColumnToInt(index++);
2254 pTmp->displayTime = (time_t)dbHandle.getColumnToInt(index++);
2255 pTmp->dataSize = dbHandle.getColumnToInt(index++);
2256 pTmp->networkStatus = dbHandle.getColumnToInt(index++);
2257 pTmp->bRead = dbHandle.getColumnToInt(index++);
2258 pTmp->bProtected = dbHandle.getColumnToInt(index++);
2259 pTmp->bBackup = dbHandle.getColumnToInt(index++);
2260 pTmp->priority = dbHandle.getColumnToInt(index++);
2261 pTmp->direction = dbHandle.getColumnToInt(index++);
2262 pTmp->scheduledTime = (time_t)dbHandle.getColumnToInt(index++);
2264 dbHandle.getColumnToString(index++, MAX_SUBJECT_LEN, pTmp->subject);
2266 if (pTmp->msgType.mainType == MSG_MMS_TYPE &&
2267 (pTmp->networkStatus == MSG_NETWORK_RETRIEVING || pTmp->networkStatus == MSG_NETWORK_RETRIEVE_FAIL || pTmp->msgType.subType == MSG_NOTIFICATIONIND_MMS)) {
2271 pTmp->pData = (void *)new char[pTmp->dataSize+2];
2272 memset(pTmp->pData, 0x00, pTmp->dataSize+2);
2274 dbHandle.getColumnToString(index++, pTmp->dataSize+1, (char *)pTmp->pData);
2277 pTmp->attachCount = dbHandle.getColumnToInt(index++);
2279 dbHandle.getColumnToString(index++, MSG_FILEPATH_LEN_MAX, pTmp->thumbPath);
2283 dbHandle.freeTable();
2291 MSG_ERROR_T MsgStoDeleteThreadMessageList(MSG_THREAD_ID_T ThreadId, MSG_MSGID_LIST_S *pMsgIdList)
2293 MSG_ERROR_T err = MSG_SUCCESS;
2295 char sqlQuery[MAX_QUERY_LEN+1];
2296 /*** Get msg id list **/
2297 MSG_MSGID_LIST_S *pToDeleteMsgIdList = NULL;
2305 const char *tableList[] = {MSGFW_PUSH_MSG_TABLE_NAME, MSGFW_CB_MSG_TABLE_NAME,
2306 MSGFW_SYNCML_MSG_TABLE_NAME, MSGFW_SCHEDULED_MSG_TABLE_NAME,
2307 MSGFW_SMS_SENDOPT_TABLE_NAME, MMS_PLUGIN_MESSAGE_TABLE_NAME,
2308 MSGFW_MESSAGE_TABLE_NAME};
2310 int listCnt = sizeof(tableList)/sizeof(char *);
2312 pToDeleteMsgIdList = (MSG_MSGID_LIST_S *)new char[sizeof(MSG_MSGID_LIST_S)];
2313 memset(pToDeleteMsgIdList, 0x00, sizeof(MSG_MSGID_LIST_S));
2315 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2316 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s WHERE ADDRESS_ID = %d",
2317 MSGFW_MESSAGE_TABLE_NAME, ThreadId);
2319 err = dbHandle.getTable(sqlQuery, &rowCnt);
2321 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
2322 MSG_DEBUG("sqlQuery [%s]", sqlQuery);
2324 dbHandle.freeTable();
2330 dbHandle.freeTable();
2336 pToDeleteMsgIdList->nCount = rowCnt;
2338 MSG_DEBUG("pToDeleteMsgIdList->nCount [%d]", pToDeleteMsgIdList->nCount);
2340 pToDeleteMsgIdList->msgIdList = (MSG_MESSAGE_ID_T *)new char[sizeof(MSG_MESSAGE_ID_T) * rowCnt];
2342 for (int i = 0; i < rowCnt; i++)
2343 pToDeleteMsgIdList->msgIdList[i] = dbHandle.getColumnToInt(index++);
2345 dbHandle.freeTable();
2348 /*** Delete Sim Message **/
2349 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2351 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID \
2353 WHERE ADDRESS_ID = %d \
2354 AND STORAGE_ID = %d",
2355 MSGFW_MESSAGE_TABLE_NAME, ThreadId, MSG_STORAGE_SIM);
2359 err = dbHandle.getTable(sqlQuery, &rowCnt);
2361 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
2362 MSG_DEBUG("sqlQuery [%s]", sqlQuery);
2364 dbHandle.freeTable();
2369 for (int i = 1; i <= rowCnt; i++) {
2370 err = MsgStoDeleteMessage(dbHandle.getColumnToInt(i), false);
2372 if (err != MSG_SUCCESS) {
2373 MSG_DEBUG("MsgStoDeleteMessage() Error!!!");
2375 dbHandle.freeTable();
2381 dbHandle.freeTable();
2384 dbHandle.beginTrans();
2386 for (int i = 0; i < listCnt; i++) {
2387 if (!strcmp(tableList[i], MMS_PLUGIN_MESSAGE_TABLE_NAME)) {
2388 //MMS_PLUGIN_MESSAGE_TABLE_NAME and MMS_PLUGIN_ATTRIBUTE_TABLE_NAME will be updated together
2393 //get mms msg id list
2394 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2395 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID, REFERENCE_ID FROM %s \
2396 WHERE ADDRESS_ID = %d AND MAIN_TYPE = %d",
2397 MSGFW_MESSAGE_TABLE_NAME, ThreadId, MSG_MMS_TYPE);
2399 err = dbHandle.getTable(sqlQuery, &rowCnt);
2400 MSG_DEBUG("rowCnt %d", rowCnt);
2402 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
2403 MSG_DEBUG("sqlQuery [%s]", sqlQuery);
2405 dbHandle.freeTable();
2406 dbHandle.endTrans(false);
2411 for (int i = 1; i <= rowCnt; i++) {
2415 msgId = dbHandle.getColumnToInt(index++);
2416 refId = dbHandle.getColumnToInt(index++);
2418 //get multiple recipient message count
2419 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2420 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s WHERE REFERENCE_ID = %d;",
2421 MSGFW_MESSAGE_TABLE_NAME, refId);
2423 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS) {
2424 dbHandle.freeTable();
2425 dbHandle.endTrans(false);
2426 err = MSG_ERR_DB_PREPARE;
2433 if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
2434 msgCnt = dbHandle.columnInt(0);
2436 dbHandle.finalizeQuery();
2437 dbHandle.freeTable();
2438 dbHandle.endTrans(false);
2439 err = MSG_ERR_DB_STEP;
2444 dbHandle.finalizeQuery();
2446 //delete mms raw file and db(mms_table and mms_attr_table) data
2448 char filePath[MSG_FILEPATH_LEN_MAX] = {0,};
2449 char dirPath[MSG_FILEPATH_LEN_MAX] = {0,};
2450 char thumbnailPath[MSG_FILEPATH_LEN_MAX] = {0,};
2453 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2454 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT FILE_PATH FROM %s WHERE REFERENCE_ID = %d;",
2455 MMS_PLUGIN_MESSAGE_TABLE_NAME, refId);
2457 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS) {
2458 dbHandle.freeTable();
2459 dbHandle.endTrans(false);
2460 err = MSG_ERR_DB_PREPARE;
2465 if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
2466 strncpy(filePath, (char *)dbHandle.columnText(0), MSG_FILEPATH_LEN_MAX);
2468 dbHandle.finalizeQuery();
2469 dbHandle.freeTable();
2470 dbHandle.endTrans(false);
2471 err = MSG_ERR_DB_STEP;
2476 dbHandle.finalizeQuery();
2478 MSG_DEBUG("filePath [%s]", filePath);
2481 snprintf(dirPath, sizeof(dirPath), "%s.dir", filePath);
2483 if (remove(filePath) == -1)
2484 MSG_DEBUG("Fail to delete file [%s]", filePath);
2486 MSG_DEBUG("Success to delete file [%s]", filePath);
2489 // remove directory also
2493 char *fileName = NULL;
2494 fileName = strrchr(filePath, '/');
2496 snprintf(thumbnailPath, sizeof(thumbnailPath), MSG_THUMBNAIL_PATH"%s.jpg", fileName+1);
2498 if (remove(thumbnailPath) == -1)
2499 MSG_DEBUG("Fail to delete thumbnail [%s]", thumbnailPath);
2501 MSG_DEBUG("Success to delete thumbnail [%s]", thumbnailPath);
2503 //delete MMS_PLUGIN_MESSAGE_TABLE_NAME table data
2504 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2505 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE REFERENCE_ID = %d;",
2506 MMS_PLUGIN_MESSAGE_TABLE_NAME, refId);
2508 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
2509 MSG_DEBUG("sqlQuery [%s]", sqlQuery);
2510 dbHandle.freeTable();
2511 dbHandle.endTrans(false);
2512 err = MSG_ERR_DB_EXEC;
2517 //delete MMS_PLUGIN_ATTRIBUTE_TABLE_NAME table data
2518 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2519 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE REFERENCE_ID = %d;",
2520 MMS_PLUGIN_ATTRIBUTE_TABLE_NAME, refId);
2522 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
2523 MSG_DEBUG("sqlQuery [%s]", sqlQuery);
2524 dbHandle.freeTable();
2525 dbHandle.endTrans(false);
2526 err = MSG_ERR_DB_EXEC;
2531 MSG_DEBUG("There is remained multi-recipient mms for this msg = %d", msgId);
2535 dbHandle.freeTable();
2537 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2538 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE MSG_ID IN \
2539 (SELECT MSG_ID FROM %s WHERE ADDRESS_ID = %d);",
2540 tableList[i], MSGFW_MESSAGE_TABLE_NAME, ThreadId);
2542 // Delete Message in specific folder from table
2543 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
2544 MSG_DEBUG("sqlQuery [%s]", sqlQuery);
2545 dbHandle.endTrans(false);
2546 err = MSG_ERR_DB_EXEC;
2553 // Delete Address table
2554 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2557 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s \
2558 WHERE ADDRESS_ID = %d;",
2559 MSGFW_ADDRESS_TABLE_NAME, ThreadId);
2561 if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
2562 MSG_DEBUG("sqlQuery [%s]", sqlQuery);
2563 dbHandle.endTrans(false);
2564 err = MSG_ERR_DB_EXEC;
2570 dbHandle.endTrans(true);
2572 MSG_MESSAGE_TYPE_S msgType;
2574 msgType.mainType = MSG_SMS_TYPE;
2575 msgType.subType = MSG_NORMAL_SMS;
2576 msgType.classType = MSG_CLASS_NONE;
2578 // Set memory status in SIM
2579 if (MsgStoCheckMsgCntFull(&dbHandle, &msgType, MSG_INBOX_ID) == MSG_SUCCESS) {
2580 MSG_DEBUG("Set Memory Status");
2582 MsgPlugin *plg = MsgPluginManager::instance()->getPlugin(MSG_SMS_TYPE);
2585 MSG_DEBUG("SMS Plug-in is NULL");
2586 err = MSG_ERR_NULL_POINTER;
2591 plg->setMemoryStatus(MSG_SUCCESS);
2595 smsCnt = MsgStoGetUnreadCnt(&dbHandle, MSG_SMS_TYPE);
2596 mmsCnt = MsgStoGetUnreadCnt(&dbHandle, MSG_MMS_TYPE);
2598 MsgSettingSetIndicator(smsCnt, mmsCnt);
2600 /*** Set pMsgIdList **/
2601 if (pMsgIdList != NULL && pToDeleteMsgIdList->nCount > 0) {
2602 pMsgIdList->nCount = pToDeleteMsgIdList->nCount;
2604 pMsgIdList->msgIdList = (MSG_MESSAGE_ID_T *)new char[sizeof(MSG_MESSAGE_ID_T)*pToDeleteMsgIdList->nCount];
2605 memcpy(pMsgIdList->msgIdList, pToDeleteMsgIdList->msgIdList, sizeof(MSG_MESSAGE_ID_T)*pToDeleteMsgIdList->nCount);
2609 /*** Create thread for noti delete. **/
2610 if (pToDeleteMsgIdList->nCount > 0) {
2611 if (g_idle_add(startToDeleteNoti, (void *)pToDeleteMsgIdList) == 0) {
2612 MSG_DEBUG("startToDeleteNoti not invoked: %s", strerror(errno));
2614 if (pToDeleteMsgIdList != NULL) {
2615 //free peer info list
2616 if (pToDeleteMsgIdList->msgIdList != NULL)
2617 delete [] pToDeleteMsgIdList->msgIdList;
2619 delete [] pToDeleteMsgIdList;
2621 err = MSG_ERR_UNKNOWN;
2629 MSG_DEBUG("Error case Free Memory");
2631 if (pToDeleteMsgIdList != NULL) {
2632 //free peer info list
2633 if (pToDeleteMsgIdList->msgIdList != NULL) {
2634 delete [] pToDeleteMsgIdList->msgIdList;
2635 pToDeleteMsgIdList->msgIdList = NULL;
2638 delete [] pToDeleteMsgIdList;
2639 pToDeleteMsgIdList = NULL;
2647 MSG_ERROR_T MsgStoCountMsgByContact(const MSG_THREAD_LIST_INDEX_S *pAddrInfo, MSG_THREAD_COUNT_INFO_S *pThreadCountInfo)
2649 char sqlQuery[MAX_QUERY_LEN+1];
2651 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2653 if (pAddrInfo->contactId > 0) {
2654 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(*) AS TOTAL, \
2655 SUM(CASE WHEN READ_STATUS=0 AND FOLDER_ID=%d THEN 1 ELSE 0 END), \
2656 SUM(CASE WHEN MAIN_TYPE=%d THEN 1 ELSE 0 END), \
2657 SUM(CASE WHEN MAIN_TYPE=%d THEN 1 ELSE 0 END) \
2658 FROM (SELECT * FROM %s A JOIN %s B ON A.ADDRESS_ID = B.ADDRESS_ID WHERE B.CONTACT_ID = %d)",
2659 MSG_INBOX_ID, MSG_SMS_TYPE, MSG_MMS_TYPE,
2660 MSGFW_MESSAGE_TABLE_NAME, MSGFW_ADDRESS_TABLE_NAME, pAddrInfo->contactId);
2662 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(*) AS TOTAL, \
2663 SUM(CASE WHEN READ_STATUS=0 AND FOLDER_ID=%d THEN 1 ELSE 0 END), \
2664 SUM(CASE WHEN MAIN_TYPE=%d THEN 1 ELSE 0 END), \
2665 SUM(CASE WHEN MAIN_TYPE=%d THEN 1 ELSE 0 END) \
2666 FROM (SELECT * FROM %s A JOIN %s B ON A.ADDRESS_ID = B.ADDRESS_ID WHERE B.ADDRESS_VAL = '%s')",
2667 MSG_INBOX_ID, MSG_SMS_TYPE, MSG_MMS_TYPE,
2668 MSGFW_MESSAGE_TABLE_NAME, MSGFW_ADDRESS_TABLE_NAME, pAddrInfo->msgAddrInfo.addressVal);
2671 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
2672 return MSG_ERR_DB_PREPARE;
2674 if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
2675 pThreadCountInfo->totalCount = dbHandle.columnInt(0);
2676 pThreadCountInfo->unReadCount = dbHandle.columnInt(1);
2677 pThreadCountInfo->smsMsgCount = dbHandle.columnInt(2);
2678 pThreadCountInfo->mmsMsgCount = dbHandle.columnInt(3);
2680 dbHandle.finalizeQuery();
2681 return MSG_ERR_DB_STEP;
2684 dbHandle.finalizeQuery();
2690 MSG_ERROR_T MsgStoSearchMessage(const char *pSearchString, MSG_THREAD_VIEW_LIST_S *pThreadViewList)
2693 return MSG_ERR_NULL_POINTER;
2695 // Clear Out Parameter
2696 pThreadViewList->nCount = 0;
2697 pThreadViewList->msgThreadInfo = NULL;
2699 tr1::unordered_set<MSG_THREAD_ID_T> IdList;
2700 queue<MSG_THREAD_VIEW_S> searchList;
2702 MSG_THREAD_VIEW_S threadView;
2704 char sqlQuery[MAX_QUERY_LEN+1];
2706 char firstName[MAX_DISPLAY_NAME_LEN+1];
2707 char lastName[MAX_DISPLAY_NAME_LEN+1];
2708 char displayName[MAX_DISPLAY_NAME_LEN+1];
2711 int order = MsgGetContactNameOrder();
2713 // Replace string for '%' and '_' character
2714 char *ext1_str = NULL;
2715 char *ext2_str = NULL;
2717 ext1_str = MsgStoReplaceString(pSearchString, "_", "\\_");
2718 ext2_str = MsgStoReplaceString(ext1_str, "%", "\\%");
2720 // Search - Address, Name
2721 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2723 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.ADDRESS_ID, A.CONTACT_ID, A.ADDRESS_VAL, \
2724 A.DISPLAY_NAME, A.FIRST_NAME, A.LAST_NAME, A.IMAGE_PATH, \
2725 A.UNREAD_CNT, A.SMS_CNT, A.MMS_CNT, \
2726 A.MSG_DIRECTION, B.DISPLAY_TIME, B.MSG_TEXT \
2728 WHERE A.ADDRESS_ID = B.ADDRESS_ID AND A.ADDRESS_ID <> 0 \
2729 AND B.FOLDER_ID > 0 AND B.FOLDER_ID < %d \
2730 AND ( B.MSG_TEXT LIKE '%%%s%%' ESCAPE '\\' \
2731 OR B.SUBJECT LIKE '%%%s%%' ESCAPE '\\' \
2732 OR A.ADDRESS_VAL LIKE '%%%s%%' ESCAPE '\\' \
2733 OR A.DISPLAY_NAME LIKE '%%%s%%' ESCAPE '\\' \
2734 OR A.FIRST_NAME LIKE '%%%s%%' ESCAPE '\\' \
2735 OR A.LAST_NAME LIKE '%%%s%%' ESCAPE '\\') \
2736 ORDER BY B.DISPLAY_TIME DESC;",
2737 MSGFW_ADDRESS_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME, MSG_CBMSGBOX_ID,
2738 ext2_str, ext2_str, ext2_str, ext2_str, ext2_str, ext2_str);
2751 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
2752 return MSG_ERR_DB_PREPARE;
2754 while (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
2755 memset(&threadView, 0x00, sizeof(threadView));
2757 threadView.threadId = dbHandle.columnInt(0);
2758 threadView.contactId = dbHandle.columnInt(1);
2760 memset(threadView.threadAddr, 0x00, sizeof(threadView.threadAddr));
2761 strncpy(threadView.threadAddr, (char *)dbHandle.columnText(2), MAX_THREAD_ADDR_LEN);
2763 memset(displayName, 0x00, sizeof(displayName));
2764 strncpy(displayName, (char *)dbHandle.columnText(3), MAX_DISPLAY_NAME_LEN);
2766 memset(firstName, 0x00, sizeof(firstName));
2767 strncpy(firstName, (char *)dbHandle.columnText(4), MAX_DISPLAY_NAME_LEN);
2769 memset(lastName, 0x00, sizeof(lastName));
2770 strncpy(lastName, (char *)dbHandle.columnText(5), MAX_DISPLAY_NAME_LEN);
2772 if (strlen(displayName) <= 0) {
2774 if (firstName[0] != '\0') {
2775 strncpy(displayName, firstName, MAX_DISPLAY_NAME_LEN);
2778 if (lastName[0] != '\0') {
2779 strncat(displayName, " ", MAX_DISPLAY_NAME_LEN-strlen(displayName));
2780 strncat(displayName, lastName, MAX_DISPLAY_NAME_LEN-strlen(displayName));
2782 } else if (order == 1) {
2783 if (lastName[0] != '\0') {
2784 strncpy(displayName, lastName, MAX_DISPLAY_NAME_LEN);
2785 strncat(displayName, " ", MAX_DISPLAY_NAME_LEN-strlen(displayName));
2788 if (firstName[0] != '\0') {
2789 strncat(displayName, firstName, MAX_DISPLAY_NAME_LEN-strlen(displayName));
2794 strncpy(threadView.threadName, displayName, MAX_THREAD_NAME_LEN);
2796 strncpy(threadView.threadImagePath, (char *)dbHandle.columnText(6), MAX_IMAGE_PATH_LEN);
2798 threadView.unreadCnt = dbHandle.columnInt(7);
2799 threadView.smsCnt = dbHandle.columnInt(8);
2800 threadView.mmsCnt = dbHandle.columnInt(9);
2802 threadView.direction = dbHandle.columnInt(10);
2803 threadView.threadTime = (time_t)dbHandle.columnInt(11);
2805 strncpy(threadView.threadData, (char *)dbHandle.columnText(12), MAX_THREAD_DATA_LEN);
2807 tr1::unordered_set<MSG_THREAD_ID_T>::iterator it;
2809 it = IdList.find(threadView.threadId);
2811 if (it == IdList.end()) {
2812 IdList.insert(threadView.threadId);
2813 searchList.push(threadView);
2818 dbHandle.finalizeQuery();
2820 // Add data to Out Parameter
2821 pThreadViewList->nCount = searchList.size();
2822 pThreadViewList->msgThreadInfo = (msg_thread_view_t *)new char[sizeof(MSG_THREAD_VIEW_S *) * searchList.size()];
2824 MSG_THREAD_VIEW_S *pTmp = NULL;
2828 while (!searchList.empty()) {
2829 pThreadViewList->msgThreadInfo[index] = (msg_thread_view_t)new char[sizeof(MSG_THREAD_VIEW_S)];
2831 pTmp = (MSG_THREAD_VIEW_S *)pThreadViewList->msgThreadInfo[index];
2833 memcpy(pTmp, &(searchList.front()), sizeof(MSG_THREAD_VIEW_S));
2844 MSG_ERROR_T MsgStoSearchMessage(const MSG_SEARCH_CONDITION_S *pSearchCon, int offset, int limit, MSG_LIST_S *pMsgList)
2846 // Clear Out Parameter
2847 pMsgList->nCount = 0;
2848 pMsgList->msgInfo = NULL;
2851 int index = 27; // numbers of index
2853 unsigned int addrId = 0;
2855 char sqlQuery[MAX_QUERY_LEN+1];
2856 char sqlQuerySubset[(MAX_QUERY_LEN/5)+1];
2858 char firstName[MAX_DISPLAY_NAME_LEN+1], lastName[MAX_DISPLAY_NAME_LEN+1];
2859 char displayName[MAX_DISPLAY_NAME_LEN+1];
2861 char *ext1_str = NULL;
2862 char *ext2_str = NULL;
2865 int order = MsgGetContactNameOrder();
2867 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2869 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.MSG_ID, A.ADDRESS_ID, A.FOLDER_ID, A.REFERENCE_ID, A.STORAGE_ID, A.MAIN_TYPE, A.SUB_TYPE, \
2870 A.DISPLAY_TIME, A.DATA_SIZE, A.NETWORK_STATUS, A.READ_STATUS, A.PROTECTED, A.BACKUP, A.PRIORITY, \
2871 A.MSG_DIRECTION, A.SCHEDULED_TIME, A.SUBJECT, A.MSG_TEXT, B.ADDRESS_TYPE, B.RECIPIENT_TYPE, \
2872 B.CONTACT_ID, B.ADDRESS_VAL, B.DISPLAY_NAME, B.FIRST_NAME, B.LAST_NAME, A.ATTACHMENT_COUNT, A.THUMB_PATH \
2874 WHERE A.ADDRESS_ID = B.ADDRESS_ID AND B.ADDRESS_ID <> 0 ",
2875 MSGFW_MESSAGE_TABLE_NAME, MSGFW_ADDRESS_TABLE_NAME);
2878 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2880 if (pSearchCon->folderId == MSG_ALLBOX_ID)
2881 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.FOLDER_ID > 0 AND A.FOLDER_ID < %d ", MSG_CBMSGBOX_ID);
2882 else if (pSearchCon->folderId == MSG_IOSBOX_ID)
2883 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.FOLDER_ID > 0 AND A.FOLDER_ID < %d ", MSG_DRAFT_ID);
2885 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.FOLDER_ID = %d ", pSearchCon->folderId);
2887 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2891 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2893 switch (pSearchCon->msgType) {
2895 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.MAIN_TYPE = %d AND A.SUB_TYPE = %d ", MSG_SMS_TYPE, MSG_NORMAL_SMS);
2899 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.MAIN_TYPE = %d ", MSG_MMS_TYPE);
2902 case MSG_TYPE_MMS_JAVA:
2903 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.MAIN_TYPE = %d AND A.SUB_TYPE = %d ", MSG_MMS_TYPE, MSG_SENDREQ_JAVA_MMS);
2906 case MSG_TYPE_SMS_SYNCML:
2907 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.MAIN_TYPE = %d AND A.SUB_TYPE = %d ", MSG_SMS_TYPE, MSG_SYNCML_CP);
2910 case MSG_TYPE_SMS_REJECT:
2911 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.MAIN_TYPE = %d AND A.SUB_TYPE = %d ", MSG_SMS_TYPE, MSG_REJECT_SMS);
2915 MSG_DEBUG("msg type is not set.");
2918 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2921 if (pSearchCon->pSearchVal != NULL) {
2923 // Replace string for '%' and '_' character
2924 ext1_str = MsgStoReplaceString(pSearchCon->pSearchVal, "_", "\\_");
2925 ext2_str = MsgStoReplaceString(ext1_str, "%", "\\%");
2927 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2928 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND ( A.MSG_TEXT LIKE '%%%s%%' ESCAPE '\\' \
2929 OR A.SUBJECT LIKE '%%%s%%' ESCAPE '\\' \
2930 OR B.ADDRESS_VAL LIKE '%%%s%%' ESCAPE '\\' \
2931 OR B.DISPLAY_NAME LIKE '%%%s%%' ESCAPE '\\' \
2932 OR B.FIRST_NAME LIKE '%%%s%%' ESCAPE '\\' \
2933 OR B.LAST_NAME LIKE '%%%s%%' ESCAPE '\\') ",
2934 ext2_str, ext2_str, ext2_str, ext2_str, ext2_str, ext2_str);
2935 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2949 if (pSearchCon->pAddressVal != NULL) {
2951 // Replace string for '%' and '_' character
2952 ext1_str = MsgStoReplaceString(pSearchCon->pAddressVal, "_", "\\_");
2953 ext2_str = MsgStoReplaceString(ext1_str, "%", "\\%");
2955 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2956 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND B.ADDRESS_VAL LIKE '%%%s%%' ESCAPE '\\'", ext2_str);
2957 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2971 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2973 if (offset >= 0 && limit > 0)
2974 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "ORDER BY A.DISPLAY_TIME DESC LIMIT %d OFFSET %d;", limit, offset);
2976 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "ORDER BY A.DISPLAY_TIME DESC;");
2978 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2980 MSG_ERROR_T err = dbHandle.getTable(sqlQuery, &rowCnt);
2982 if (err == MSG_ERR_DB_NORECORD) {
2983 dbHandle.freeTable();
2986 } else if (err != MSG_SUCCESS) {
2987 MSG_DEBUG("%s", sqlQuery);
2989 dbHandle.freeTable();
2994 pMsgList->nCount = rowCnt;
2996 MSG_DEBUG("pMsgList->nCount [%d]", pMsgList->nCount);
2998 pMsgList->msgInfo = (msg_message_t *)new char[sizeof(MSG_MESSAGE_S *) * rowCnt];
3000 MSG_MESSAGE_S *pTmp = NULL;
3002 for (int i = 0; i < rowCnt; i++) {
3003 pMsgList->msgInfo[i] = (msg_message_t)new char[sizeof(MSG_MESSAGE_S)];
3005 pTmp = (MSG_MESSAGE_S *)pMsgList->msgInfo[i];
3007 memset(pTmp, 0x00, sizeof(pTmp));
3010 pTmp->pMmsData = NULL;
3012 pTmp->msgId = dbHandle.getColumnToInt(index++);
3013 addrId = dbHandle.getColumnToInt(index++);
3014 pTmp->folderId = dbHandle.getColumnToInt(index++);
3015 pTmp->referenceId = dbHandle.getColumnToInt(index++);
3016 pTmp->storageId = dbHandle.getColumnToInt(index++);
3017 pTmp->msgType.mainType = dbHandle.getColumnToInt(index++);
3018 pTmp->msgType.subType = dbHandle.getColumnToInt(index++);
3019 pTmp->displayTime = (time_t)dbHandle.getColumnToInt(index++);
3020 pTmp->dataSize = dbHandle.getColumnToInt(index++);
3021 pTmp->networkStatus = dbHandle.getColumnToInt(index++);
3022 pTmp->bRead = dbHandle.getColumnToInt(index++);
3023 pTmp->bProtected = dbHandle.getColumnToInt(index++);
3024 pTmp->bBackup = dbHandle.getColumnToInt(index++);
3025 pTmp->priority = dbHandle.getColumnToInt(index++);
3026 pTmp->direction= dbHandle.getColumnToInt(index++);
3027 pTmp->scheduledTime = (time_t)dbHandle.getColumnToInt(index++);
3029 dbHandle.getColumnToString(index++, MAX_SUBJECT_LEN, pTmp->subject);
3031 if (pTmp->msgType.mainType == MSG_MMS_TYPE &&
3032 (pTmp->networkStatus == MSG_NETWORK_RETRIEVING || pTmp->networkStatus == MSG_NETWORK_RETRIEVE_FAIL || pTmp->msgType.subType == MSG_NOTIFICATIONIND_MMS)) {
3036 MSG_DEBUG("pTmp->dataSize [%d]", pTmp->dataSize);
3037 pTmp->pData = (void *)new char[pTmp->dataSize + 2];
3038 memset(pTmp->pData, 0x00, sizeof(pTmp->pData));
3040 dbHandle.getColumnToString(index++, pTmp->dataSize+1, (char *)pTmp->pData);
3044 pTmp->nAddressCnt = 1;
3046 pTmp->nAddressCnt = 0;
3048 pTmp->addressList[0].threadId = addrId;
3049 pTmp->addressList[0].addressType = dbHandle.getColumnToInt(index++);
3050 pTmp->addressList[0].recipientType = dbHandle.getColumnToInt(index++);
3051 pTmp->addressList[0].contactId = dbHandle.getColumnToInt(index++);
3053 dbHandle.getColumnToString(index++, MAX_ADDRESS_VAL_LEN, pTmp->addressList[0].addressVal);
3055 memset(displayName, 0x00, sizeof(displayName));
3056 dbHandle.getColumnToString(index++, MAX_DISPLAY_NAME_LEN, displayName);
3058 memset(firstName, 0x00, sizeof(firstName));
3059 dbHandle.getColumnToString(index++, MAX_DISPLAY_NAME_LEN, firstName);
3061 memset(lastName, 0x00, sizeof(lastName));
3062 dbHandle.getColumnToString(index++, MAX_DISPLAY_NAME_LEN, lastName);
3064 if (strlen(displayName) <= 0) {
3066 if (firstName[0] != '\0') {
3067 strncpy(displayName, firstName, MAX_DISPLAY_NAME_LEN);
3070 if (lastName[0] != '\0') {
3071 strncat(displayName, " ", MAX_DISPLAY_NAME_LEN-strlen(displayName));
3072 strncat(displayName, lastName, MAX_DISPLAY_NAME_LEN-strlen(displayName));
3074 } else if (order == 1) {
3075 if (lastName[0] != '\0') {
3076 strncpy(displayName, lastName, MAX_DISPLAY_NAME_LEN);
3077 strncat(displayName, " ", MAX_DISPLAY_NAME_LEN-strlen(displayName));
3080 if (firstName[0] != '\0') {
3081 strncat(displayName, firstName, MAX_DISPLAY_NAME_LEN-strlen(displayName));
3086 strncpy(pTmp->addressList[0].displayName, displayName, MAX_DISPLAY_NAME_LEN);
3088 pTmp->attachCount = dbHandle.getColumnToInt(index++);
3090 dbHandle.getColumnToString(index++, MSG_FILEPATH_LEN_MAX, pTmp->thumbPath);
3093 dbHandle.freeTable();
3100 MSG_ERROR_T MsgStoGetMsgIdList(MSG_REFERENCE_ID_T RefId, MSG_MSGID_LIST_S *pMsgIdList)
3102 // Clear Out Parameter
3103 pMsgIdList->nCount = 0;
3104 pMsgIdList->msgIdList = NULL;
3107 int index = 1; // numbers of index
3109 char sqlQuery[MAX_QUERY_LEN+1];
3111 // Search - Address, Name
3112 memset(sqlQuery, 0x00, sizeof(sqlQuery));
3114 snprintf(sqlQuery, sizeof(sqlQuery),
3117 WHERE REFERENCE_ID = %d \
3118 ORDER BY MSG_ID ASC;",
3119 MSGFW_MESSAGE_TABLE_NAME, RefId);
3121 MSG_ERROR_T err = dbHandle.getTable(sqlQuery, &rowCnt);
3123 if (err != MSG_SUCCESS) {
3124 MSG_DEBUG("%s", sqlQuery);
3126 dbHandle.freeTable();
3131 pMsgIdList->nCount = rowCnt;
3133 MSG_DEBUG("pMsgIdList->nCount [%d]", pMsgIdList->nCount);
3135 pMsgIdList->msgIdList = (MSG_MESSAGE_ID_T *)new char[sizeof(MSG_MESSAGE_ID_T *) * rowCnt];
3137 for (int i = 0; i < rowCnt; i++) {
3138 pMsgIdList->msgIdList[i] = (MSG_MESSAGE_ID_T)new char[sizeof(MSG_MESSAGE_ID_T)];
3140 pMsgIdList->msgIdList[i] = dbHandle.getColumnToInt(index++);
3143 dbHandle.freeTable();
3149 void MsgConvertNumber(const char *pSrcNum, char *pDestNum)
3154 overLen = strlen(pSrcNum) - MAX_PRECONFIG_NUM;
3156 for (i = 0; i < MAX_PRECONFIG_NUM; i++)
3157 pDestNum[i] = pSrcNum[i+overLen];
3163 MSG_ERROR_T MsgStoGetRejectMsgList(const char *pNumber, MSG_REJECT_MSG_LIST_S *pRejectMsgList)
3165 // Clear Out Parameter
3166 pRejectMsgList->nCount = 0;
3167 pRejectMsgList->rejectMsgInfo = NULL;
3170 int index = 3; // numbers of index
3172 char sqlQuery[MAX_QUERY_LEN+1];
3174 // Search Reject Msg
3175 memset(sqlQuery, 0x00, sizeof(sqlQuery));
3177 if (pNumber != NULL) {
3178 char phoneNumber[MAX_PRECONFIG_NUM+1];
3179 memset(phoneNumber, 0x00, sizeof(phoneNumber));
3181 if (strlen(pNumber) > MAX_PRECONFIG_NUM) {
3182 MsgConvertNumber(pNumber, phoneNumber);
3184 strncpy(phoneNumber, pNumber, MAX_PRECONFIG_NUM);
3187 snprintf(sqlQuery, sizeof(sqlQuery),
3188 "SELECT B.MSG_ID, B.MSG_TEXT, B.DISPLAY_TIME \
3190 WHERE A.ADDRESS_ID = B.ADDRESS_ID \
3191 AND B.MAIN_TYPE = %d \
3192 AND B.SUB_TYPE = %d \
3193 AND A.ADDRESS_VAL LIKE '%%%s' \
3194 ORDER BY B.DISPLAY_TIME DESC;",
3195 MSGFW_ADDRESS_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME,
3196 MSG_SMS_TYPE, MSG_REJECT_SMS, phoneNumber);
3198 snprintf(sqlQuery, sizeof(sqlQuery),
3199 "SELECT B.MSG_ID, B.MSG_TEXT, B.DISPLAY_TIME \
3201 WHERE A.ADDRESS_ID = B.ADDRESS_ID \
3202 AND B.MAIN_TYPE = %d \
3203 AND B.SUB_TYPE = %d \
3204 ORDER BY B.DISPLAY_TIME DESC;",
3205 MSGFW_ADDRESS_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME,
3206 MSG_SMS_TYPE, MSG_REJECT_SMS);
3209 MSG_ERROR_T err = dbHandle.getTable(sqlQuery, &rowCnt);
3211 if (err != MSG_SUCCESS) {
3212 MSG_DEBUG("%s", sqlQuery);
3214 dbHandle.freeTable();
3219 pRejectMsgList->nCount = rowCnt;
3221 MSG_DEBUG("pRejectMsgList->nCount [%d]", pRejectMsgList->nCount);
3223 pRejectMsgList->rejectMsgInfo = (MSG_REJECT_MSG_INFO_S *)new char[sizeof(MSG_REJECT_MSG_INFO_S)*rowCnt];
3225 MSG_REJECT_MSG_INFO_S *pTmp = pRejectMsgList->rejectMsgInfo;
3227 for (int i = 0; i < rowCnt; i++) {
3228 pTmp->msgId = dbHandle.getColumnToInt(index++);
3230 memset(pTmp->msgText, 0x00, sizeof(pTmp->msgText));
3231 dbHandle.getColumnToString(index++, MAX_MSG_TEXT_LEN, pTmp->msgText);
3233 pTmp->displayTime = (time_t)dbHandle.getColumnToInt(index++);
3238 dbHandle.freeTable();
3244 MSG_ERROR_T MsgStoGetSyncMLExtId(MSG_MESSAGE_ID_T msgId, int *extId)
3246 char sqlQuery[MAX_QUERY_LEN+1];
3248 memset(sqlQuery, 0x00, sizeof(sqlQuery));
3250 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT EXT_ID FROM %s WHERE MSG_ID = %d;",
3251 MSGFW_SYNCML_MSG_TABLE_NAME, msgId);
3253 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
3254 return MSG_ERR_DB_PREPARE;
3256 if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
3257 *extId = dbHandle.columnInt(0);
3259 dbHandle.finalizeQuery();
3260 return MSG_ERR_DB_STEP;
3263 dbHandle.finalizeQuery();
3269 MSG_ERROR_T MsgStoGetReportStatus(MSG_MESSAGE_ID_T msgId, MSG_REPORT_STATUS_INFO_S *pReportStatus)
3271 char sqlQuery[MAX_QUERY_LEN+1];
3273 memset(sqlQuery, 0x00, sizeof(sqlQuery));
3275 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT DELIVERY_REPORT_STATUS, DELIVERY_REPORT_TIME, READ_REPORT_STATUS, READ_REPORT_TIME \
3276 FROM %s WHERE MSG_ID = %d;",
3277 MSGFW_MESSAGE_TABLE_NAME, msgId);
3279 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
3280 return MSG_ERR_DB_PREPARE;
3282 if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
3283 pReportStatus->deliveryStatus = (MSG_DELIVERY_REPORT_STATUS_T)dbHandle.columnInt(0);
3284 pReportStatus->deliveryStatusTime = (time_t)dbHandle.columnInt(1);
3285 pReportStatus->readStatus = (MSG_READ_REPORT_STATUS_T)dbHandle.columnInt(2);
3286 pReportStatus->readStatusTime = (time_t)dbHandle.columnInt(3);
3289 dbHandle.finalizeQuery();
3295 MSG_ERROR_T MsgStoGetThreadUnreadCnt(MSG_THREAD_ID_T ThreadId, int *cnt)
3302 char sqlQuery[MAX_QUERY_LEN+1];
3304 memset(sqlQuery, 0x00, sizeof(sqlQuery));
3307 memset(sqlQuery, 0x00, sizeof(sqlQuery));
3308 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s A \
3309 WHERE ADDRESS_ID = %d AND READ_STATUS = 0;",
3310 MSGFW_MESSAGE_TABLE_NAME, ThreadId);
3312 if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
3313 return MSG_ERR_DB_PREPARE;
3315 if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
3316 msgCnt = dbHandle.columnInt(0);
3319 dbHandle.finalizeQuery();