3.0 migration
[platform/core/messaging/msg-service.git] / framework / storage-handler / MsgStorageMessage.cpp
index 1c5af1e..086d278 100755 (executable)
@@ -1,17 +1,17 @@
 /*
-* Copyright 2012  Samsung Electronics Co., Ltd
-*
-* Licensed under the Flora License, Version 1.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*    http://www.tizenopensource.org/license
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
 */
 
 #include <stdio.h>
@@ -35,6 +35,8 @@
 #include "MsgStorageHandler.h"
 #include "MsgNotificationWrapper.h"
 #include "MsgMmsMessage.h"
+#include "MsgDevicedWrapper.h"
+
 
 using namespace std;
 
@@ -42,7 +44,6 @@ using namespace std;
 /*==================================================================================================
                                      VARIABLES
 ==================================================================================================*/
-extern MsgDbHandler dbHandle;
 
 Mutex delNotiMx;
 CndVar delNoticv;
@@ -56,17 +57,11 @@ bool delLogRunning = false;
 /*==================================================================================================
                                      FUNCTION FOR THREAD
 ==================================================================================================*/
-static gboolean updateUnreadMsgCount(void *pVoid)
+static gboolean resetNotification(void *pVoid)
 {
        MSG_BEGIN();
 
-       int smsCnt = 0;
-       int mmsCnt = 0;
-
-       smsCnt = MsgStoGetUnreadCnt(&dbHandle, MSG_SMS_TYPE);
-       mmsCnt = MsgStoGetUnreadCnt(&dbHandle, MSG_MMS_TYPE);
-
-       MsgSettingSetIndicator(smsCnt, mmsCnt);
+       MsgRefreshAllNotification(true, false, false);
 
        MSG_END();
 
@@ -77,6 +72,7 @@ static gboolean updateUnreadMsgCount(void *pVoid)
 /*==================================================================================================
                                      FUNCTION IMPLEMENTATION
 ==================================================================================================*/
+
 msg_error_t MsgStoAddMessage(MSG_MESSAGE_INFO_S *pMsg, MSG_SENDINGOPT_INFO_S *pSendOptInfo)
 {
        MSG_BEGIN();
@@ -88,130 +84,217 @@ msg_error_t MsgStoAddMessage(MSG_MESSAGE_INFO_S *pMsg, MSG_SENDINGOPT_INFO_S *pS
 
        char sqlQuery[MAX_QUERY_LEN+1];
 
-       dbHandle.beginTrans();
+       MsgDbHandler *dbHandle = getDbHandle();
+
+       dbHandle->beginTrans();
 
        if (pMsg->nAddressCnt > 0) {
-               err = MsgStoAddAddress(&dbHandle, pMsg, &convId);
+               err = MsgStoAddAddress(dbHandle, pMsg, &convId);
 
                if (err != MSG_SUCCESS) {
-                       dbHandle.endTrans(false);
+                       dbHandle->endTrans(false);
                        return err;
                }
 
                pMsg->threadId = convId;
        }
 
-
-       ///////// temporary code for draft message in conversation view.
-       if(convId > 0 && pMsg->folderId == MSG_DRAFT_ID) {
-               memset(sqlQuery, 0x00, sizeof(sqlQuery));
-
-               snprintf(sqlQuery, sizeof(sqlQuery),
-                               "DELETE FROM %s WHERE CONV_ID = %d AND FOLDER_ID = %d;",
-                               MSGFW_MESSAGE_TABLE_NAME, convId, MSG_DRAFT_ID);
-
-               MSG_DEBUG("sqlQuery [%s]", sqlQuery);
-
-               err = dbHandle.execQuery(sqlQuery);
-
+       if (pMsg->msgId > 0) {
+               rowId = pMsg->msgId;
+       } else {
+               // get rowId
+               err = dbHandle->getRowId(MSGFW_MESSAGE_TABLE_NAME, &rowId);
                if (err != MSG_SUCCESS) {
-                       MSG_DEBUG("fail to delete draft messages.");
+                       dbHandle->endTrans(false);
+                       return err;
                }
+               pMsg->msgId = (msg_message_id_t)rowId;
        }
-       ////////
-
-       err = dbHandle.getRowId(MSGFW_MESSAGE_TABLE_NAME, &rowId);
-
-       if (err != MSG_SUCCESS) {
-               dbHandle.endTrans(false);
-               return err;
-       }
-
-       pMsg->msgId = (msg_message_id_t)rowId;
 
        int fileSize = 0;
+       gchar *contents = NULL;
 
        char *pFileData = NULL;
        AutoPtr<char> buf(&pFileData);
 
-       // Get File Data
-       if (pMsg->bTextSms == false) {
-               if (MsgOpenAndReadFile(pMsg->msgData, &pFileData, &fileSize) == false) {
-                       dbHandle.endTrans(false);
-                       return MSG_ERR_STORAGE_ERROR;
-               }
-               MSG_DEBUG("file size [%d]", fileSize);
-       }
+       char keyName[MAX_VCONFKEY_NAME_LEN];
+       memset(keyName, 0x00, sizeof(keyName));
+       sprintf(keyName, "%s/%d", MSG_SIM_SUBS_ID, pMsg->sim_idx);
+
+       char *imsi = MsgSettingGetString(keyName);
 
        // Add Message
        memset(sqlQuery, 0x00, sizeof(sqlQuery));
 
-       snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, %d, %d, %d, %d, %d, %ld, %d, %d, %d, %d, %d, %d, %ld, %d, ?, ?, ?, ?, 0);",
+       snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, %d, %d, %d, %d, %d, %u, %d, %d, %d, %d, %d, %d, %d, %d, ?, '', '', ?, 0, %d, '%s');",
                        MSGFW_MESSAGE_TABLE_NAME, rowId, convId, pMsg->folderId, pMsg->storageId, pMsg->msgType.mainType, pMsg->msgType.subType,
-                       pMsg->displayTime, pMsg->dataSize, pMsg->networkStatus, pMsg->bRead, pMsg->bProtected, pMsg->priority, pMsg->direction,
-                       0, pMsg->bBackup);
+                       (unsigned int)pMsg->displayTime, pMsg->dataSize, pMsg->networkStatus, pMsg->bRead, pMsg->bProtected, pMsg->priority, pMsg->direction,
+                       0, pMsg->bBackup, (int)pMsg->sim_idx, imsi);
 
        MSG_DEBUG("QUERY : %s", sqlQuery);
 
-       if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS) {
-               dbHandle.endTrans(false);
+       g_free(imsi);
+       imsi = NULL;
+
+       if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
+               dbHandle->endTrans(false);
                return MSG_ERR_DB_EXEC;
        }
 
-       dbHandle.bindText(pMsg->subject, 1);
+       dbHandle->bindText(pMsg->subject, 1);
 
-       dbHandle.bindText(pMsg->msgData, 2);
+       if (pMsg->msgType.subType == MSG_NOTIFICATIONIND_MMS) {
+               dbHandle->bindText("", 2);
+       } else {
+               if (pMsg->bTextSms == false) {
+                       //CID 47860: pMsg->msgData is an array, hence null check is not required
+                       char fn[MSG_FILEPATH_LEN_MAX];
+                       memset(fn,0x00,MSG_FILEPATH_LEN_MAX);
+                       snprintf(fn, MSG_FILEPATH_LEN_MAX, "%s%s", MSG_IPC_DATA_PATH, pMsg->msgData);
+
+                       if (g_file_get_contents(fn, &contents, NULL, NULL)) {
+                               MSG_DEBUG("g_file_get_contents() Success!!");
+                               dbHandle->bindText(contents, 2);
+                       } else {
+                               MSG_DEBUG("g_file_get_contents() Failed!!");
+                               dbHandle->bindText("", 2);
+                       }
 
-       dbHandle.bindText(pMsg->thumbPath, 3);
+               } else
+                       dbHandle->bindText(pMsg->msgText, 2);
+       }
 
-       if (pMsg->bTextSms == false)
-               dbHandle.bindText(pFileData, 4);
-       else
-               dbHandle.bindText(pMsg->msgText, 4);
+       if (dbHandle->stepQuery() != MSG_ERR_DB_DONE) {
+               dbHandle->finalizeQuery();
+               dbHandle->endTrans(false);
+               //free contents
+               if (contents) {
+                       g_free(contents);
+                       contents = NULL;
+               }
 
-       if (dbHandle.stepQuery() != MSG_ERR_DB_DONE) {
-               dbHandle.finalizeQuery();
-               dbHandle.endTrans(false);
                return MSG_ERR_DB_EXEC;
        }
 
-       dbHandle.finalizeQuery();
+       dbHandle->finalizeQuery();
+
+       //free contents
+       if (contents) {
+               g_free(contents);
+               contents = NULL;
+       }
 
        if (pMsg->msgType.subType != MSG_SENDREQ_MMS) {
-               err = MsgStoUpdateConversation(&dbHandle, convId);
+               err = MsgStoUpdateConversation(dbHandle, convId);
 
                if (err != MSG_SUCCESS) {
-                       dbHandle.endTrans(false);
+                       dbHandle->endTrans(false);
                        return err;
                }
        }
 
-       dbHandle.endTrans(true);
-
+#if 0
        /* In the case of MMS Message, load the MMS plugin to save MMS PDU */
        if (pMsg->msgType.mainType == MSG_MMS_TYPE) {
-               MMS_MESSAGE_DATA_S mmsMsg;
-               memset(&mmsMsg, 0x00, sizeof(MMS_MESSAGE_DATA_S));
 
                if (pMsg->msgType.subType != MSG_DELIVERYIND_MMS && pMsg->msgType.subType != MSG_READORGIND_MMS) {
+
                        MsgPlugin *plg = MsgPluginManager::instance()->getPlugin(MSG_MMS_TYPE);
 
+                       if (pFileData == NULL) {
+                               if (MsgOpenAndReadFile(pMsg->msgData, &pFileData, &fileSize) == false) {
+                                       dbHandle->endTrans(false);
+                                       return MSG_ERR_STORAGE_ERROR;
+                               }
+
+                               MSG_DEBUG("file size [%d]", fileSize);
+                       }
+
                        err = plg->addMessage(pMsg, pSendOptInfo, pFileData);
 
-                       if (err != MSG_SUCCESS)
+                       if (err != MSG_SUCCESS) {
+                               dbHandle->endTrans(false);
                                return MSG_ERR_STORAGE_ERROR;
+                       }
+
+                       if (pMsg->msgType.subType == MSG_SENDREQ_MMS
+                                       || pMsg->msgType.subType == MSG_RETRIEVE_MMS
+                                       || pMsg->msgType.subType == MSG_RETRIEVE_AUTOCONF_MMS
+                                       || pMsg->msgType.subType == MSG_RETRIEVE_MANUALCONF_MMS) {
 
-                       if (pMsg->msgType.subType == MSG_SENDREQ_MMS) {
                                MSG_DEBUG("pMsg->msgText: %s, pMsg->thumbPath: %s ", pMsg->msgText, pMsg->thumbPath);
 
                                err = MsgStoUpdateMMSMessage(pMsg);
 
-                               if (err != MSG_SUCCESS)
+                               if (err != MSG_SUCCESS) {
+                                       dbHandle->endTrans(false);
+                                       return MSG_ERR_STORAGE_ERROR;
+                               }
+
+                       }
+               }
+       } else if (pMsg->msgType.mainType == MSG_SMS_TYPE && pSendOptInfo != NULL) {
+               MsgPlugin *plg = MsgPluginManager::instance()->getPlugin(MSG_SMS_TYPE);
+               if (plg) err = plg->addMessage(pMsg, pSendOptInfo, NULL);
+               if (err != MSG_SUCCESS) {
+                       dbHandle->endTrans(false);
+                       return MSG_ERR_STORAGE_ERROR;
+               }
+       }
+#else
+       if (pMsg->msgType.mainType == MSG_MMS_TYPE) {
+               char *pMmsSerializedData = NULL;
+               AutoPtr<char> buf_mms(&pMmsSerializedData);
+
+               if (pMsg->msgType.subType != MSG_DELIVERYIND_MMS && pMsg->msgType.subType != MSG_READORGIND_MMS) {
+
+                       MsgPlugin *plg = MsgPluginManager::instance()->getPlugin(MSG_MMS_TYPE);
+
+                       if (pMmsSerializedData == NULL) {
+                               if (MsgOpenAndReadFile(pMsg->msgData, &pMmsSerializedData, &fileSize) == false) {
+                                       dbHandle->endTrans(false);
                                        return MSG_ERR_STORAGE_ERROR;
+                               }
+
+                               MSG_DEBUG("file size [%d]", fileSize);
+                       }
+
+                       err = plg->addMessage(pMsg, pSendOptInfo, pMmsSerializedData);
+
+                       if (err != MSG_SUCCESS) {
+                               dbHandle->endTrans(false);
+                               return MSG_ERR_STORAGE_ERROR;
+                       }
+
+//                     if (pMsg->msgText[0] != '\0') {
+//                             g_file_get_contents(pMsg->msgText, &pFileData, (gsize *)&fileSize, NULL);
+//                             MSG_DEBUG("file size [%d]", fileSize);
+//                     }
+
+                       if (pMsg->msgType.subType == MSG_SENDREQ_MMS
+                               || pMsg->msgType.subType == MSG_RETRIEVE_MMS
+                               || pMsg->msgType.subType == MSG_RETRIEVE_AUTOCONF_MMS
+                               || pMsg->msgType.subType == MSG_RETRIEVE_MANUALCONF_MMS)
+                       {
+                               MSG_DEBUG("pMsg->msgText: %s, pMsg->thumbPath: %s ", pMsg->msgText, pMsg->thumbPath);
+
+                               err = MsgStoUpdateMMSMessage(pMsg);
+                       }
 
+               }
+       } else {
+
+               // Get File Data
+               if (pMsg->bTextSms == false) {
+                       if (MsgOpenAndReadFile(pMsg->msgData, &pFileData, &fileSize) == false) {
+                               dbHandle->endTrans(false);
+                               return MSG_ERR_STORAGE_ERROR;
                        }
+                       MSG_DEBUG("file size [%d]", fileSize);
                }
        }
+#endif
+       dbHandle->endTrans(true);
 
        MSG_END();
 
@@ -226,14 +309,56 @@ msg_error_t MsgStoUpdateMessage(MSG_MESSAGE_INFO_S *pMsg, MSG_SENDINGOPT_INFO_S
        char sqlQuery[MAX_QUERY_LEN+1];
 
        msg_thread_id_t convId = 0;
+       MsgDbHandler *dbHandle = getDbHandle();
+       dbHandle->beginTrans();
+
+       MSG_MAIN_TYPE_T prevType;
+       memset(sqlQuery, 0x00, sizeof(sqlQuery));
+       snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MAIN_TYPE FROM %s WHERE MSG_ID = %d;",
+                       MSGFW_MESSAGE_TABLE_NAME, pMsg->msgId);
+
+       MSG_DEBUG("QUERY : %s", sqlQuery);
+
+       if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
+               dbHandle->endTrans(false);
+               return MSG_ERR_DB_PREPARE;
+       }
+
+       if (dbHandle->stepQuery() != MSG_ERR_DB_ROW) {
+               dbHandle->finalizeQuery();
+               dbHandle->endTrans(false);
+               return MSG_ERR_STORAGE_ERROR;
+       }
+
+       prevType = dbHandle->columnInt(0);
+       dbHandle->finalizeQuery();
 
-       dbHandle.beginTrans();
+       //check msg type with previous type
+       if (prevType != pMsg->msgType.mainType) {
+               MSG_DEBUG("different msg type to update [prev : %d], [current : %d]", prevType, pMsg->msgType.mainType);
+
+               err = MsgStoDeleteMessage(pMsg->msgId, false);
+               if (err != MSG_SUCCESS) {
+                       dbHandle->endTrans(false);
+                       return err;
+               }
+
+               err = MsgStoAddMessage(pMsg, pSendOptInfo);
+               if (err != MSG_SUCCESS) {
+                       dbHandle->endTrans(false);
+                       return err;
+               }
+
+               dbHandle->endTrans(false);
+               return err;
+       }
 
        if (pMsg->nAddressCnt > 0) {
-               err = MsgStoAddAddress(&dbHandle, pMsg, &convId);
+               pMsg->threadId = 0;
+               err = MsgStoAddAddress(dbHandle, pMsg, &convId);
 
                if (err != MSG_SUCCESS) {
-                       dbHandle.endTrans(false);
+                       dbHandle->endTrans(false);
                        return err;
                }
        }
@@ -246,7 +371,7 @@ msg_error_t MsgStoUpdateMessage(MSG_MESSAGE_INFO_S *pMsg, MSG_SENDINGOPT_INFO_S
        // Get File Data
        if (pMsg->bTextSms == false) {
                if (MsgOpenAndReadFile(pMsg->msgData, &pFileData, &fileSize) == false) {
-                       dbHandle.endTrans(false);
+                       dbHandle->endTrans(false);
                        return MSG_ERR_STORAGE_ERROR;
                }
        }
@@ -284,48 +409,51 @@ msg_error_t MsgStoUpdateMessage(MSG_MESSAGE_INFO_S *pMsg, MSG_SENDINGOPT_INFO_S
 
        snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET CONV_ID = %d, FOLDER_ID = %d, STORAGE_ID = %d, MAIN_TYPE = %d, SUB_TYPE = %d, \
                        DISPLAY_TIME = %lu, DATA_SIZE = %d, NETWORK_STATUS = %d, READ_STATUS = %d, PROTECTED = %d, PRIORITY = %d, MSG_DIRECTION = %d, \
-                       BACKUP = %d, SUBJECT = ?, MSG_DATA = ?, THUMB_PATH = ?, MSG_TEXT = ? \
+                       BACKUP = %d, SUBJECT = ?, MSG_TEXT = ? \
                        WHERE MSG_ID = %d;",
                        MSGFW_MESSAGE_TABLE_NAME, convId, pMsg->folderId, pMsg->storageId, pMsg->msgType.mainType, pMsg->msgType.subType, pMsg->displayTime, pMsg->dataSize,
-                       pMsg->networkStatus, pMsg->bRead, pMsg->bProtected, pMsg->priority, pMsg->direction, pMsg->bBackup, pMsg->msgId);
+                       pMsg->networkStatus, pMsg->bRead, pMsg->bProtected, pMsg->priority, pMsg->direction, pMsg->bBackup, (int)pMsg->msgId);
 
-       if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS) {
-               dbHandle.endTrans(false);
+       if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
+               dbHandle->endTrans(false);
                return MSG_ERR_DB_EXEC;
        }
 
-       dbHandle.bindText(pMsg->subject, 1);
-
-       dbHandle.bindText(pMsg->msgData, 2);
-
-       dbHandle.bindText(pMsg->thumbPath, 3);
+       dbHandle->bindText(pMsg->subject, 1);
 
        if (pMsg->msgType.mainType == MSG_SMS_TYPE && pMsg->bTextSms == false)
-               dbHandle.bindText(pFileData, 4);
+               dbHandle->bindText(pFileData, 2);
        else
-               dbHandle.bindText(pMsg->msgText, 4);
+               dbHandle->bindText(pMsg->msgText, 2);
 
        MSG_DEBUG("%s", sqlQuery);
 
-       if (dbHandle.stepQuery() != MSG_ERR_DB_DONE) {
-               dbHandle.finalizeQuery();
-               dbHandle.endTrans(false);
+       if (dbHandle->stepQuery() != MSG_ERR_DB_DONE) {
+               dbHandle->finalizeQuery();
+               dbHandle->endTrans(false);
                return MSG_ERR_DB_EXEC;
        }
 
-       dbHandle.finalizeQuery();
+       dbHandle->finalizeQuery();
 
        if (pMsg->msgType.mainType == MSG_SMS_TYPE && pSendOptInfo != NULL) {
                if (pSendOptInfo->bSetting == true) {
                        memset(sqlQuery, 0x00, sizeof(sqlQuery));
-                       snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET \
-                                       DELREP_REQ = %d, KEEP_COPY = %d, REPLY_PATH = %d \
-                                       WHERE MSG_ID = %d;",
-                                       MSGFW_SMS_SENDOPT_TABLE_NAME, pSendOptInfo->bDeliverReq,
-                                       pSendOptInfo->bKeepCopy, pSendOptInfo->option.smsSendOptInfo.bReplyPath, pMsg->msgId);
-
-                       if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
-                               dbHandle.endTrans(false);
+                       snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET "
+                                       "DELREP_REQ = %d, "
+                                       "KEEP_COPY = %d, "
+                                       "REPLY_PATH = %d, "
+                                       "ENCODE_TYPE = %d "
+                                       "WHERE MSG_ID = %d;",
+                                       MSGFW_SMS_SENDOPT_TABLE_NAME,
+                                       pSendOptInfo->bDeliverReq,
+                                       pSendOptInfo->bKeepCopy,
+                                       pSendOptInfo->option.smsSendOptInfo.bReplyPath,
+                                       pMsg->encodeType,
+                                       pMsg->msgId);
+
+                       if (dbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
+                               dbHandle->endTrans(false);
                                return MSG_ERR_DB_EXEC;
                        }
                }
@@ -335,26 +463,37 @@ msg_error_t MsgStoUpdateMessage(MSG_MESSAGE_INFO_S *pMsg, MSG_SENDINGOPT_INFO_S
                err = plg->updateMessage(pMsg, pSendOptInfo, pFileData);
 
                if (err != MSG_SUCCESS) {
-                       dbHandle.endTrans(false);
+                       dbHandle->endTrans(false);
                        return MSG_ERR_STORAGE_ERROR;
                }
+
+               if (pMsg->msgType.subType == MSG_SENDREQ_MMS) {
+                       MSG_SEC_DEBUG("pMsg->msgText: %s, pMsg->thumbPath: %s ", pMsg->msgText, pMsg->thumbPath);
+
+                       err = MsgStoUpdateMMSMessage(pMsg);
+
+                       if (err != MSG_SUCCESS) {
+                               dbHandle->endTrans(false);
+                               return MSG_ERR_STORAGE_ERROR;
+                       }
+               }
        }
 
-       err = MsgStoUpdateConversation(&dbHandle, convId);
+       err = MsgStoUpdateConversation(dbHandle, convId);
 
        if (err != MSG_SUCCESS) {
-               dbHandle.endTrans(false);
+               dbHandle->endTrans(false);
                return MSG_ERR_STORAGE_ERROR;
        }
 
-       err = MsgStoClearConversationTable(&dbHandle);
+       err = MsgStoClearConversationTable(dbHandle);
 
        if (err != MSG_SUCCESS) {
-               dbHandle.endTrans(false);
+               dbHandle->endTrans(false);
                return MSG_ERR_STORAGE_ERROR;
        }
 
-       dbHandle.endTrans(true);
+       dbHandle->endTrans(true);
 
        return MSG_SUCCESS;
 }
@@ -366,30 +505,34 @@ msg_error_t MsgStoUpdateReadStatus(msg_message_id_t msgId, bool bRead)
 
        msg_storage_id_t storageId;
 
-       if (MsgStoSetReadStatus(&dbHandle, msgId, bRead) != MSG_SUCCESS) {
+       MsgDbHandler *dbHandle = getDbHandle();
+       if (MsgStoSetReadStatus(dbHandle, msgId, bRead) != MSG_SUCCESS) {
                MSG_DEBUG("MsgStoSetReadStatus() Error");
                return MSG_ERR_STORAGE_ERROR;
        }
 
+       MsgRefreshAllNotification(true, false, false);
+
        // Get STORAGE_ID
        memset(sqlQuery, 0x00, sizeof(sqlQuery));
        snprintf(sqlQuery, sizeof(sqlQuery), "SELECT STORAGE_ID FROM %s WHERE MSG_ID = %d;",
                        MSGFW_MESSAGE_TABLE_NAME, msgId);
 
-       if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
+       if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
                return MSG_ERR_DB_PREPARE;
 
-       if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
-               storageId = dbHandle.columnInt(0);
+       if (dbHandle->stepQuery() == MSG_ERR_DB_ROW) {
+               storageId = dbHandle->columnInt(0);
        } else {
-               dbHandle.finalizeQuery();
+               dbHandle->finalizeQuery();
                return MSG_ERR_DB_STEP;
        }
 
-       dbHandle.finalizeQuery();
+       dbHandle->finalizeQuery();
 
        MSG_DEBUG("StorageId:[%d]", storageId);
 
+#ifndef FEATURE_SMS_CDMA
        // Update Read Status for SIM Msg
        if (storageId == MSG_STORAGE_SIM) {
                MsgPlugin *plg = MsgPluginManager::instance()->getPlugin(MSG_SMS_TYPE);
@@ -401,80 +544,100 @@ msg_error_t MsgStoUpdateReadStatus(msg_message_id_t msgId, bool bRead)
 
                // Get SIM Msg ID
                memset(sqlQuery, 0x00, sizeof(sqlQuery));
-               snprintf(sqlQuery, sizeof(sqlQuery), "SELECT SIM_ID FROM %s WHERE MSG_ID = %d;",
+               snprintf(sqlQuery, sizeof(sqlQuery), "SELECT SIM_SLOT_ID, SIM_ID FROM %s WHERE MSG_ID = %d;",
                                MSGFW_SIM_MSG_TABLE_NAME, msgId);
 
-               if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
+               if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
                        return MSG_ERR_DB_PREPARE;
 
                msg_sim_id_t simId;
+               msg_sim_slot_id_t sim_idx;
 
-               while (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
-                       simId = dbHandle.columnInt(0);
+               while (dbHandle->stepQuery() == MSG_ERR_DB_ROW) {
+                       sim_idx = dbHandle->columnInt(0);
+                       simId = dbHandle->columnInt(1);
 
-                       if (plg->setReadStatus(simId) != MSG_SUCCESS) {
+                       if (plg->setReadStatus(sim_idx, simId) != MSG_SUCCESS) {
                                MSG_DEBUG("Fail to Set Read Status for SIM SMS");
                                continue;
                        }
                }
-
-               dbHandle.finalizeQuery();
+               dbHandle->finalizeQuery();
        }
-
+#endif
        return MSG_SUCCESS;
 }
 
 
-msg_error_t MsgStoUpdateThreadReadStatus(msg_thread_id_t threadId)
+msg_error_t MsgStoUpdateThreadReadStatus(msg_thread_id_t threadId, msg_id_list_s *pMsgIdList)
 {
        MSG_BEGIN();
 
        msg_error_t err = MSG_SUCCESS;
 
-       int rowCnt = 0;
        char sqlQuery[MAX_QUERY_LEN+1];
 
-       // Get sim MSG_ID
+       /*** Get msg id list **/
+       int rowCnt = 0;
+       int index = 1;
+       pMsgIdList->nCount = 0;
+       MsgDbHandler *dbHandle = getDbHandle();
+
        memset(sqlQuery, 0x00, sizeof(sqlQuery));
-       snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s A \
-                       WHERE CONV_ID = %d AND READ_STATUS = 0 AND STORAGE_ID = %d;",
-                       MSGFW_MESSAGE_TABLE_NAME, threadId, MSG_STORAGE_SIM);
+       snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s "
+                       "WHERE CONV_ID = %d AND READ_STATUS = 0 AND STORAGE_ID = %d AND FOLDER_ID < %d;",
+                       MSGFW_MESSAGE_TABLE_NAME,
+                       threadId, MSG_STORAGE_PHONE, MSG_SPAMBOX_ID);
 
-       rowCnt = 0;
-       err = dbHandle.getTable(sqlQuery, &rowCnt);
+       err = dbHandle->getTable(sqlQuery, &rowCnt);
 
        if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
-               dbHandle.freeTable();
+               MSG_DEBUG("Fail to getTable().");
+               dbHandle->freeTable();
                return err;
        }
 
-       for (int i = 1; i <= rowCnt; i++) {
-               MsgStoUpdateReadStatus(dbHandle.getColumnToInt(i), true);
+       if (rowCnt <= 0) {
+               dbHandle->freeTable();
+               return MSG_SUCCESS;
        }
 
-       dbHandle.freeTable();
+       pMsgIdList->nCount = rowCnt;
+       MSG_DEBUG("pMsgIdList->nCount [%d]", pMsgIdList->nCount);
+
+       pMsgIdList->msgIdList = (msg_message_id_t *)new char[sizeof(msg_message_id_t) * rowCnt];
+
+       for (int i = 0; i < rowCnt; i++)
+               pMsgIdList->msgIdList[i] = dbHandle->getColumnToInt(index++);
+
+       dbHandle->freeTable();
+       /*** **/
 
        // set read status
+       dbHandle->beginTrans();
        memset(sqlQuery, 0x00, sizeof(sqlQuery));
-       snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET READ_STATUS = %d \
-                       WHERE CONV_ID = %d AND READ_STATUS = 0;",
-                       MSGFW_MESSAGE_TABLE_NAME, 1, threadId);
+       snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET READ_STATUS = %d "
+                       "WHERE CONV_ID = %d AND READ_STATUS = 0 AND STORAGE_ID = %d AND FOLDER_ID < %d;",
+                       MSGFW_MESSAGE_TABLE_NAME, 1,
+                       threadId, MSG_STORAGE_PHONE, MSG_SPAMBOX_ID);
 
-       if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS)
+       if (dbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
+               dbHandle->endTrans(false);
                return MSG_ERR_DB_EXEC;
+       }
 
 
-       if (MsgStoUpdateConversation(&dbHandle, threadId) != MSG_SUCCESS) {
+       if (MsgStoUpdateConversation(dbHandle, threadId) != MSG_SUCCESS) {
                MSG_DEBUG("MsgStoUpdateConversation() Error");
+               dbHandle->endTrans(false);
                return MSG_ERR_STORAGE_ERROR;
        }
 
-       if (g_idle_add(updateUnreadMsgCount, NULL) == 0) {
-               MSG_DEBUG("updateUnreadMsgCount() Error");
+       dbHandle->endTrans(true);
+       if (g_idle_add(resetNotification, NULL) == 0) {
+               MSG_DEBUG("resetNotification() Error");
        }
 
-       MsgRefreshNoti();
-
        MSG_END();
 
        return MSG_SUCCESS;
@@ -484,12 +647,13 @@ msg_error_t MsgStoUpdateThreadReadStatus(msg_thread_id_t threadId)
 msg_error_t MsgStoUpdateProtectedStatus(msg_message_id_t msgId, bool bProtected)
 {
        char sqlQuery[MAX_QUERY_LEN+1];
+       MsgDbHandler *dbHandle = getDbHandle();
 
        memset(sqlQuery, 0x00, sizeof(sqlQuery));
        snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET PROTECTED = %d WHERE MSG_ID = %d;",
                        MSGFW_MESSAGE_TABLE_NAME, (int)bProtected, msgId);
 
-       if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS)
+       if (dbHandle->execQuery(sqlQuery) != MSG_SUCCESS)
                return MSG_ERR_DB_EXEC;
 
        return MSG_SUCCESS;
@@ -505,14 +669,37 @@ msg_error_t MsgStoDeleteMessage(msg_message_id_t msgId, bool bCheckIndication)
        msg_error_t err = MSG_SUCCESS;
 
        char sqlQuery[MAX_QUERY_LEN+1];
+       MsgDbHandler *dbHandle = getDbHandle();
+
+       // delete report notification
+       char tempAddr[MAX_ADDRESS_VAL_LEN+1];
+       memset(tempAddr, 0x00, sizeof(tempAddr));
+       memset(sqlQuery, 0x00, sizeof(sqlQuery));
+       snprintf(sqlQuery, sizeof(sqlQuery), "SELECT B.ADDRESS_VAL FROM %s A, %s B WHERE A.CONV_ID = B.CONV_ID AND A.MSG_ID = %d;"
+                       , MSGFW_MESSAGE_TABLE_NAME, MSGFW_ADDRESS_TABLE_NAME, msgId);
+
+       if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
+               return MSG_ERR_DB_PREPARE;
+
+       if (dbHandle->stepQuery() != MSG_ERR_DB_ROW) {
+               dbHandle->finalizeQuery();
+               return MSG_ERR_DB_DONE;
+       }
+
+       snprintf(tempAddr, sizeof(tempAddr), "%s", dbHandle->columnText(0));
+
+       MSG_SEC_DEBUG("Updated address = %s", tempAddr);
+
+       MsgDeleteReportNotification(tempAddr);
+
+       dbHandle->finalizeQuery();
 
        // Get SUB_TYPE, STORAGE_ID
        memset(sqlQuery, 0x00, sizeof(sqlQuery));
-       snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.MAIN_TYPE, A.SUB_TYPE, A.FOLDER_ID, A.STORAGE_ID, A.READ_STATUS, B.CONV_ID \
-                       FROM %s A, %s B WHERE A.MSG_ID = %d AND A.CONV_ID = B.CONV_ID;",
-                       MSGFW_MESSAGE_TABLE_NAME, MSGFW_CONVERSATION_TABLE_NAME, msgId);
+       snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MAIN_TYPE, SUB_TYPE, FOLDER_ID, STORAGE_ID, READ_STATUS, CONV_ID, SIM_INDEX \
+                       FROM %s WHERE MSG_ID = %d;", MSGFW_MESSAGE_TABLE_NAME, msgId);
 
-       if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS) {
+       if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
                MSG_DEBUG("Query Failed [%s]", sqlQuery);
                return MSG_ERR_DB_PREPARE;
        }
@@ -521,26 +708,28 @@ msg_error_t MsgStoDeleteMessage(msg_message_id_t msgId, bool bCheckIndication)
        msg_folder_id_t folderId;
        msg_storage_id_t storageId;
        msg_thread_id_t convId;
+       msg_sim_slot_id_t simIndex;
        bool bRead;
 
-       if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
-               msgType.mainType = dbHandle.columnInt(0);
-               msgType.subType = dbHandle.columnInt(1);
-               folderId = dbHandle.columnInt(2);
-               storageId = dbHandle.columnInt(3);
-               bRead = dbHandle.columnInt(4);
-               convId = dbHandle.columnInt(5);
+       if (dbHandle->stepQuery() == MSG_ERR_DB_ROW) {
+               msgType.mainType = dbHandle->columnInt(0);
+               msgType.subType = dbHandle->columnInt(1);
+               folderId = dbHandle->columnInt(2);
+               storageId = dbHandle->columnInt(3);
+               bRead = dbHandle->columnInt(4);
+               convId = dbHandle->columnInt(5);
+               simIndex = dbHandle->columnInt(6);
 
-               MSG_DEBUG("Main Type:[%d] SubType:[%d] FolderId:[%d] StorageId:[%d] ConversationId:[%d]", msgType.mainType, msgType.subType, folderId, storageId, convId);
+               MSG_DEBUG("Main Type:[%d] SubType:[%d] FolderId:[%d] StorageId:[%d] ReadStatus:[%d] ConversationId:[%d], simIndex=[%d]", msgType.mainType, msgType.subType, folderId, storageId, bRead, convId, simIndex);
        } else {
                MSG_DEBUG("MsgStepQuery() Error [%s]", sqlQuery);
 
-               dbHandle.finalizeQuery();
+               dbHandle->finalizeQuery();
 
                return MSG_ERR_DB_STEP;
        }
 
-       dbHandle.finalizeQuery();
+       dbHandle->finalizeQuery();
 
        MsgPlugin *plg = MsgPluginManager::instance()->getPlugin(MSG_SMS_TYPE);
 
@@ -550,51 +739,60 @@ msg_error_t MsgStoDeleteMessage(msg_message_id_t msgId, bool bCheckIndication)
                return MSG_ERR_NULL_POINTER;
        }
 
-       dbHandle.beginTrans();
+       dbHandle->beginTrans();
 
+#ifndef FEATURE_SMS_CDMA
        // Check sim message
        if (storageId == MSG_STORAGE_SIM) {
-               // get sim message id
-               memset(sqlQuery, 0x00, sizeof(sqlQuery));
-               snprintf(sqlQuery, sizeof(sqlQuery), "SELECT SIM_ID FROM %s WHERE MSG_ID = %d;",
-                               MSGFW_SIM_MSG_TABLE_NAME, msgId);
+               msg_sim_id_t simMsgId;
+               msg_sim_slot_id_t sim_idx;
 
-               MSG_DEBUG("sqlQuery is [%s]", sqlQuery);
+               while (true) {
+                       // get sim message id
+                       memset(sqlQuery, 0x00, sizeof(sqlQuery));
+                       snprintf(sqlQuery, sizeof(sqlQuery), "SELECT SIM_SLOT_ID, SIM_ID FROM %s WHERE MSG_ID = %d;",
+                                       MSGFW_SIM_MSG_TABLE_NAME, msgId);
 
-               msg_sim_id_t simMsgId;
+                       MSG_DEBUG("sqlQuery is [%s]", sqlQuery);
 
-               if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS) {
-                       dbHandle.endTrans(false);
-                       return MSG_ERR_DB_PREPARE;
-               }
+                       if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
+                               dbHandle->endTrans(false);
+                               return MSG_ERR_DB_PREPARE;
+                       }
+
+                       if (dbHandle->stepQuery() != MSG_ERR_DB_ROW) {
+                               break;
+                       }
 
-               while (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
-                       simMsgId = dbHandle.columnInt(0);
+                       sim_idx = dbHandle->columnInt(0);
+                       simMsgId = dbHandle->columnInt(1);
 
                        MSG_DEBUG("SIM Msg Id : [%d]", simMsgId);
 
-                       err = plg->deleteSimMessage(simMsgId);
+                       err = plg->deleteSimMessage(sim_idx, simMsgId);
 
                        if (err != MSG_SUCCESS) {
-                               dbHandle.finalizeQuery();
-                               dbHandle.endTrans(false);
+                               dbHandle->finalizeQuery();
+                               dbHandle->endTrans(false);
                                return err;
                        }
 
+                       dbHandle->finalizeQuery();
+
                        //Sim message delete in db table
                        memset(sqlQuery, 0x00, sizeof(sqlQuery));
-                       snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE SIM_ID = %d;", MSGFW_SIM_MSG_TABLE_NAME, simMsgId);
+                       snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE SIM_ID = %d AND SIM_SLOT_ID =%d;", MSGFW_SIM_MSG_TABLE_NAME, simMsgId, sim_idx);
 
-                       if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
-                               dbHandle.finalizeQuery();
-                               dbHandle.endTrans(false);
+                       if (dbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
+                               dbHandle->finalizeQuery();
+                               dbHandle->endTrans(false);
                                return MSG_ERR_DB_EXEC;
                        }
                }
 
-               dbHandle.finalizeQuery();
+               dbHandle->finalizeQuery();
        }
-
+#endif
        /* each type has to be handled in plug in ? */
        if (msgType.mainType == MSG_SMS_TYPE) {
                memset(sqlQuery, 0x00, sizeof(sqlQuery));
@@ -602,8 +800,18 @@ msg_error_t MsgStoDeleteMessage(msg_message_id_t msgId, bool bCheckIndication)
                                MSGFW_SMS_SENDOPT_TABLE_NAME, msgId);
 
                // Delete SMS Send Option
-               if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
-                       dbHandle.endTrans(false);
+               if (dbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
+                       dbHandle->endTrans(false);
+                       return MSG_ERR_DB_EXEC;
+               }
+
+               memset(sqlQuery, 0x00, sizeof(sqlQuery));
+               snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE MSG_ID = %d;",
+                               MSGFW_SMS_REPORT_TABLE_NAME, msgId);
+
+               // Delete Data from SMS_REPORT table
+               if (dbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
+                       dbHandle->endTrans(false);
                        return MSG_ERR_DB_EXEC;
                }
 
@@ -613,8 +821,8 @@ msg_error_t MsgStoDeleteMessage(msg_message_id_t msgId, bool bCheckIndication)
                                        MSGFW_CB_MSG_TABLE_NAME, msgId);
 
                        // Delete Push Message from push table
-                       if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
-                               dbHandle.endTrans(false);
+                       if (dbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
+                               dbHandle->endTrans(false);
                                return MSG_ERR_DB_EXEC;
                        }
                } else if (msgType.subType >= MSG_WAP_SI_SMS && msgType.subType <= MSG_WAP_CO_SMS) {
@@ -623,8 +831,8 @@ msg_error_t MsgStoDeleteMessage(msg_message_id_t msgId, bool bCheckIndication)
                                        MSGFW_PUSH_MSG_TABLE_NAME, msgId);
 
                        // Delete Push Message from push table
-                       if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
-                               dbHandle.endTrans(false);
+                       if (dbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
+                               dbHandle->endTrans(false);
                                return MSG_ERR_DB_EXEC;
                        }
                } else if (msgType.subType == MSG_SYNCML_CP) {
@@ -633,34 +841,66 @@ msg_error_t MsgStoDeleteMessage(msg_message_id_t msgId, bool bCheckIndication)
                                        MSGFW_SYNCML_MSG_TABLE_NAME, msgId);
 
                        // Delete SyncML Message from syncML table
-                       if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
-                               dbHandle.endTrans(false);
+                       if (dbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
+                               dbHandle->endTrans(false);
                                return MSG_ERR_DB_EXEC;
                        }
                }
        } else if (msgType.mainType == MSG_MMS_TYPE) {
 
-               char filePath[MSG_FILEPATH_LEN_MAX] = {0,};
-               char dirPath[MSG_FILEPATH_LEN_MAX]= {0,};
+               char filePath[MSG_FILEPATH_LEN_MAX + 1] = {0,};
+               char dirPath[MSG_FILEPATH_LEN_MAX + 1]= {0,};
+
+               {//remove multipart
+                       memset(sqlQuery, 0x00, sizeof(sqlQuery));
+                       snprintf(sqlQuery, sizeof(sqlQuery), "SELECT FILE_PATH FROM %s WHERE MSG_ID = %d;",
+                                       MSGFW_MMS_MULTIPART_TABLE_NAME, msgId);
+
+                       if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
+                               dbHandle->endTrans(false);
+                               return MSG_ERR_DB_PREPARE;
+                       }
+
+                       while (dbHandle->stepQuery() == MSG_ERR_DB_ROW) {
+                               memset(filePath, 0x00, sizeof(filePath));
+                               strncpy(filePath, (char *)dbHandle->columnText(0), MSG_FILEPATH_LEN_MAX);
+                               if (remove(filePath) == -1)
+                                       MSG_SEC_DEBUG("Fail to delete file [%s]", filePath);
+                               else
+                                       MSG_SEC_DEBUG("Success to delete file [%s]", filePath);
+                       }
+                       dbHandle->finalizeQuery();
+
+                       // Delete Data from Multipart table
+                       memset(sqlQuery, 0x00, sizeof(sqlQuery));
+                       snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE MSG_ID = %d;",
+                                       MSGFW_MMS_MULTIPART_TABLE_NAME, msgId);
+
+                       if (dbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
+                               dbHandle->endTrans(false);
+                               return MSG_ERR_DB_EXEC;
+                       }
+               }
+
 
                memset(sqlQuery, 0x00, sizeof(sqlQuery));
                snprintf(sqlQuery, sizeof(sqlQuery), "SELECT FILE_PATH FROM %s WHERE MSG_ID = %d;",
                                MMS_PLUGIN_MESSAGE_TABLE_NAME, msgId);
 
-               if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS) {
-                       dbHandle.endTrans(false);
+               if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
+                       dbHandle->endTrans(false);
                        return MSG_ERR_DB_PREPARE;
                }
 
-               if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
-                       strncpy(filePath, (char *)dbHandle.columnText(0), MSG_FILEPATH_LEN_MAX);
+               if (dbHandle->stepQuery() == MSG_ERR_DB_ROW) {
+                       strncpy(filePath, (char *)dbHandle->columnText(0), MSG_FILEPATH_LEN_MAX);
 
                        snprintf(dirPath, MSG_FILEPATH_LEN_MAX, "%s.dir", filePath);
 
                        if (remove(filePath) == -1)
-                               MSG_DEBUG("Fail to delete file [%s]", filePath);
+                               MSG_SEC_DEBUG("Fail to delete file [%s]", filePath);
                        else
-                               MSG_DEBUG("Success to delete file [%s]", filePath);
+                               MSG_SEC_DEBUG("Success to delete file [%s]", filePath);
 
                        MsgRmRf(dirPath);
 
@@ -668,12 +908,12 @@ msg_error_t MsgStoDeleteMessage(msg_message_id_t msgId, bool bCheckIndication)
 
                } else {
                        MSG_DEBUG("MsgStepQuery() Error [%s]", sqlQuery);
-                       dbHandle.finalizeQuery();
-                       dbHandle.endTrans(false);
+                       dbHandle->finalizeQuery();
+                       dbHandle->endTrans(false);
                        return MSG_ERR_DB_STEP;
                }
 
-               dbHandle.finalizeQuery();
+               dbHandle->finalizeQuery();
 
                // remove thumbnail file
                memset(sqlQuery, 0x00, sizeof(sqlQuery));
@@ -682,28 +922,28 @@ msg_error_t MsgStoDeleteMessage(msg_message_id_t msgId, bool bCheckIndication)
                                "WHERE MSG_ID = %d AND (TYPE=%d OR TYPE=%d);",
                                MSGFW_MMS_PREVIEW_TABLE_NAME, msgId, MSG_MMS_ITEM_TYPE_IMG, MSG_MMS_ITEM_TYPE_VIDEO);
 
-               if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS) {
-                       dbHandle.endTrans(false);
+               if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
+                       dbHandle->endTrans(false);
                        return MSG_ERR_DB_PREPARE;
                }
 
-               while (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
+               while (dbHandle->stepQuery() == MSG_ERR_DB_ROW) {
                        memset(filePath, 0x00, sizeof(filePath));
-                       strncpy(filePath, (char *)dbHandle.columnText(0), MSG_FILEPATH_LEN_MAX);
+                       strncpy(filePath, (char *)dbHandle->columnText(0), MSG_FILEPATH_LEN_MAX);
                        if (remove(filePath) == -1)
-                               MSG_DEBUG("Fail to delete file [%s]", filePath);
+                               MSG_SEC_DEBUG("Fail to delete file [%s]", filePath);
                        else
-                               MSG_DEBUG("Success to delete file [%s]", filePath);
+                               MSG_SEC_DEBUG("Success to delete file [%s]", filePath);
                }
 
-               dbHandle.finalizeQuery();
+               dbHandle->finalizeQuery();
 
                memset(sqlQuery, 0x00, sizeof(sqlQuery));
                snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE MSG_ID = %d;",
                                MSGFW_MMS_PREVIEW_TABLE_NAME, msgId);
 
-               if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
-                       dbHandle.endTrans(false);
+               if (dbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
+                       dbHandle->endTrans(false);
                        return MSG_ERR_DB_EXEC;
                }
 
@@ -712,8 +952,8 @@ msg_error_t MsgStoDeleteMessage(msg_message_id_t msgId, bool bCheckIndication)
                                MMS_PLUGIN_MESSAGE_TABLE_NAME, msgId);
 
                // Delete Data from MMS table
-               if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
-                       dbHandle.endTrans(false);
+               if (dbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
+                       dbHandle->endTrans(false);
                        return MSG_ERR_DB_EXEC;
                }
 
@@ -722,8 +962,8 @@ msg_error_t MsgStoDeleteMessage(msg_message_id_t msgId, bool bCheckIndication)
                                MSGFW_REPORT_TABLE_NAME, msgId);
 
                // Delete Data from MMS STATUS table
-               if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
-                       dbHandle.endTrans(false);
+               if (dbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
+                       dbHandle->endTrans(false);
                        return MSG_ERR_DB_EXEC;
                }
        }
@@ -732,54 +972,57 @@ msg_error_t MsgStoDeleteMessage(msg_message_id_t msgId, bool bCheckIndication)
        snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE MSG_ID = %d;", MSGFW_MESSAGE_TABLE_NAME, msgId);
 
        // Delete Message from msg table
-       if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
-               dbHandle.endTrans(false);
+       if (dbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
+               dbHandle->endTrans(false);
                return MSG_ERR_DB_EXEC;
        }
 
-       // Clear Conversation table
-       if (MsgStoClearConversationTable(&dbHandle) != MSG_SUCCESS) {
-               dbHandle.endTrans(false);
+#ifdef FEATURE_SMS_CDMA
+       memset(sqlQuery, 0x00, sizeof(sqlQuery));
+       snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE MSG_ID = %d;", MSGFW_UNIQUENESS_INFO_TABLE_NAME, msgId);
+
+       // Delete Message from uniqueness table
+       if (dbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
+               dbHandle->endTrans(false);
                return MSG_ERR_DB_EXEC;
        }
+#endif
 
-       // Update conversation table.
-       if (MsgStoUpdateConversation(&dbHandle, convId) != MSG_SUCCESS) {
-               dbHandle.endTrans(false);
-               return MSG_ERR_STORAGE_ERROR;
-       }
+       if (convId > 0) {
+               // Clear Conversation table
+               if (MsgStoClearConversationTable(dbHandle) != MSG_SUCCESS) {
+                       dbHandle->endTrans(false);
+                       return MSG_ERR_DB_EXEC;
+               }
 
-       dbHandle.endTrans(true);
+               // Update conversation table.
+               if (MsgStoUpdateConversation(dbHandle, convId) != MSG_SUCCESS) {
+                       dbHandle->endTrans(false);
+                       return MSG_ERR_STORAGE_ERROR;
+               }
+       }
+       dbHandle->endTrans(true);
 
        if (msgType.mainType == MSG_SMS_TYPE && folderId == MSG_INBOX_ID) {
                msgType.classType = MSG_CLASS_NONE;
 
                // Set memory status in SIM
-               if (MsgStoCheckMsgCntFull(&dbHandle, &msgType, folderId) == MSG_SUCCESS) {
+               if (MsgStoCheckMsgCntFull(dbHandle, &msgType, folderId) == MSG_SUCCESS) {
                        MSG_DEBUG("Set Memory Status");
 
+#ifndef FEATURE_SMS_CDMA
+                       plg->setMemoryStatus(simIndex, MSG_SUCCESS);
+#else
                        plg->setMemoryStatus(MSG_SUCCESS);
+#endif
                }
        }
 
        if (bCheckIndication == true) {
                MSG_DEBUG("bCheckIndication is true.");
-
-               int smsCnt = 0;
-               int mmsCnt = 0;
-
-               smsCnt = MsgStoGetUnreadCnt(&dbHandle, MSG_SMS_TYPE);
-               mmsCnt = MsgStoGetUnreadCnt(&dbHandle, MSG_MMS_TYPE);
-
-               MsgSettingSetIndicator(smsCnt, mmsCnt);
-
-//             MsgDeleteNotiByMsgId(msgId);
-               MsgRefreshNoti();
+               MsgRefreshAllNotification(true, false, false);
        }
 
-       //Delete phone log
-//     MsgDeletePhoneLog(msgId);
-
        return MSG_SUCCESS;
 }
 
@@ -792,13 +1035,22 @@ msg_error_t MsgStoDeleteAllMessageInFolder(msg_folder_id_t folderId, bool bOnlyD
 
        queue<msg_thread_id_t> threadList;
 
+#ifdef FEATURE_SMS_CDMA
+       const char *tableList[] = {MSGFW_PUSH_MSG_TABLE_NAME, MSGFW_CB_MSG_TABLE_NAME,
+                                               MSGFW_SYNCML_MSG_TABLE_NAME, MSGFW_SMS_SENDOPT_TABLE_NAME,
+                                               MMS_PLUGIN_MESSAGE_TABLE_NAME, MSGFW_MMS_PREVIEW_TABLE_NAME,
+                                               MSGFW_REPORT_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME,
+                                               MSGFW_UNIQUENESS_INFO_TABLE_NAME};
+#else
        const char *tableList[] = {MSGFW_PUSH_MSG_TABLE_NAME, MSGFW_CB_MSG_TABLE_NAME,
                                                MSGFW_SYNCML_MSG_TABLE_NAME, MSGFW_SMS_SENDOPT_TABLE_NAME,
                                                MMS_PLUGIN_MESSAGE_TABLE_NAME, MSGFW_MMS_PREVIEW_TABLE_NAME,
                                                MSGFW_REPORT_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME};
+#endif
 
        int listCnt = sizeof(tableList)/sizeof(char *);
        int rowCnt = 0;
+       MsgDbHandler *dbHandle = getDbHandle();
 
        // Get conversation ID from Folder
        memset(sqlQuery, 0x00, sizeof(sqlQuery));
@@ -806,27 +1058,25 @@ msg_error_t MsgStoDeleteAllMessageInFolder(msg_folder_id_t folderId, bool bOnlyD
        snprintf(sqlQuery, sizeof(sqlQuery), "SELECT DISTINCT(CONV_ID) FROM %s WHERE FOLDER_ID = %d",
                        MSGFW_MESSAGE_TABLE_NAME, folderId);
 
-       err = dbHandle.getTable(sqlQuery, &rowCnt);
+       err = dbHandle->getTable(sqlQuery, &rowCnt);
 
        if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
-               MSG_DEBUG("sql query is %s.", sqlQuery);
-
-               dbHandle.freeTable();
+               MSG_DEBUG("Fail to getTable().");
+               dbHandle->freeTable();
                return err;
        }
 
        if (rowCnt <= 0) {
-               dbHandle.freeTable();
-
+               dbHandle->freeTable();
                return MSG_SUCCESS;
        }
 
        for (int i = 1; i <= rowCnt; i++) {
-               MSG_DEBUG("thread ID : %d", dbHandle.getColumnToInt(i));
-               threadList.push((msg_thread_id_t)dbHandle.getColumnToInt(i));
+               MSG_DEBUG("thread ID : %d", dbHandle->getColumnToInt(i));
+               threadList.push((msg_thread_id_t)dbHandle->getColumnToInt(i));
        }
 
-       dbHandle.freeTable();
+       dbHandle->freeTable();
 
        /*** Get msg id list **/
        msg_id_list_s *pToDeleteMsgIdList = NULL;
@@ -844,18 +1094,16 @@ msg_error_t MsgStoDeleteAllMessageInFolder(msg_folder_id_t folderId, bool bOnlyD
        rowCnt = 0;
        int index = 1;
 
-       err = dbHandle.getTable(sqlQuery, &rowCnt);
+       err = dbHandle->getTable(sqlQuery, &rowCnt);
 
        if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
-               MSG_DEBUG("sqlQuery [%s]", sqlQuery);
-
-               dbHandle.freeTable();
-
+               MSG_DEBUG("Fail to getTable().");
+               dbHandle->freeTable();
                goto FREE_MEMORY;
        }
 
        if (rowCnt <= 0) {
-               dbHandle.freeTable();
+               dbHandle->freeTable();
                err = MSG_SUCCESS;
 
                goto FREE_MEMORY;
@@ -868,9 +1116,9 @@ msg_error_t MsgStoDeleteAllMessageInFolder(msg_folder_id_t folderId, bool bOnlyD
        pToDeleteMsgIdList->msgIdList = (msg_message_id_t *)new char[sizeof(msg_message_id_t) * rowCnt];
 
        for (int i = 0; i < rowCnt; i++)
-               pToDeleteMsgIdList->msgIdList[i] = dbHandle.getColumnToInt(index++);
+               pToDeleteMsgIdList->msgIdList[i] = dbHandle->getColumnToInt(index++);
 
-       dbHandle.freeTable();
+       dbHandle->freeTable();
        /*** **/
 
        /*** Delete Sim Message In Folder **/
@@ -880,37 +1128,33 @@ msg_error_t MsgStoDeleteAllMessageInFolder(msg_folder_id_t folderId, bool bOnlyD
                snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s WHERE FOLDER_ID = %d AND STORAGE_ID = %d",
                                MSGFW_MESSAGE_TABLE_NAME, folderId, MSG_STORAGE_SIM);
 
-               MSG_DEBUG("sql query is %s.", sqlQuery);
-
                rowCnt = 0;
 
-               err = dbHandle.getTable(sqlQuery, &rowCnt);
-
+               err = dbHandle->getTable(sqlQuery, &rowCnt);
                if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
-                       dbHandle.freeTable();
-
+                       dbHandle->freeTable();
                        goto FREE_MEMORY;
                }
 
                for (int i = 1; i <= rowCnt; i++) {
-                       err = MsgStoDeleteMessage(dbHandle.getColumnToInt(i), false);
+                       err = MsgStoDeleteMessage(dbHandle->getColumnToInt(i), false);
 
                        if (err != MSG_SUCCESS) {
                                MSG_DEBUG("MsgStoDeleteMessage() Error!!!");
 
-                               dbHandle.freeTable();
+                               dbHandle->freeTable();
 
                                goto FREE_MEMORY;
                        }
 
                        //Delete phone log
-//                     MsgDeletePhoneLog(dbHandle.getColumnToInt(i));
+//                     MsgDeletePhoneLog(dbHandle->getColumnToInt(i));
                }
 
-               dbHandle.freeTable();
+               dbHandle->freeTable();
        }
 
-       dbHandle.beginTrans();
+       dbHandle->beginTrans();
 
        for (int i = 0; i < listCnt; i++) {
                if (!strcmp(tableList[i], MMS_PLUGIN_MESSAGE_TABLE_NAME)) {
@@ -920,22 +1164,52 @@ msg_error_t MsgStoDeleteAllMessageInFolder(msg_folder_id_t folderId, bool bOnlyD
                        char filePath[MSG_FILEPATH_LEN_MAX] = {0,};
                        char dirPath[MSG_FILEPATH_LEN_MAX] = {0,};
 
+                       {//remove multipart
+                               memset(sqlQuery, 0x00, sizeof(sqlQuery));
+                               snprintf(sqlQuery, sizeof(sqlQuery), "SELECT FILE_PATH FROM %s;",
+                                               MSGFW_MMS_MULTIPART_TABLE_NAME);
+
+                               if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
+                                       dbHandle->endTrans(false);
+                                       return MSG_ERR_DB_PREPARE;
+                               }
+
+                               while (dbHandle->stepQuery() == MSG_ERR_DB_ROW) {
+                                       memset(filePath, 0x00, sizeof(filePath));
+                                       strncpy(filePath, (char *)dbHandle->columnText(0), MSG_FILEPATH_LEN_MAX);
+                                       if (remove(filePath) == -1)
+                                               MSG_SEC_DEBUG("Fail to delete file [%s]", filePath);
+                                       else
+                                               MSG_SEC_DEBUG("Success to delete file [%s]", filePath);
+                               }
+                               dbHandle->finalizeQuery();
+
+                               // Delete Data from Multipart table
+                               memset(sqlQuery, 0x00, sizeof(sqlQuery));
+                               snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s;",
+                                               MSGFW_MMS_MULTIPART_TABLE_NAME);
+
+                               if (dbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
+                                       err = MSG_ERR_DB_EXEC;
+                                       dbHandle->endTrans(false);
+                                       goto FREE_MEMORY;
+                               }
+                       }
+
                        //get mms msg id list
                        memset(sqlQuery, 0x00, sizeof(sqlQuery));
                        snprintf(sqlQuery, sizeof(sqlQuery), "SELECT B.FILE_PATH FROM %s A, %s B \
                                        WHERE A.FOLDER_ID = %d AND A.MAIN_TYPE = %d AND A.MSG_ID = B.MSG_ID",
                                        MSGFW_MESSAGE_TABLE_NAME, MMS_PLUGIN_MESSAGE_TABLE_NAME, folderId, MSG_MMS_TYPE);
 
-                       MSG_DEBUG("sqlQuery [%s]", sqlQuery);
-
-                       err = dbHandle.getTable(sqlQuery, &rowCnt);
+                       err = dbHandle->getTable(sqlQuery, &rowCnt);
                        MSG_DEBUG("rowCnt %d", rowCnt);
 
                        if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
-                               MSG_DEBUG("sqlQuery [%s]", sqlQuery);
+                               MSG_DEBUG("Fail to getTable().");
 
-                               dbHandle.freeTable();
-                               dbHandle.endTrans(false);
+                               dbHandle->freeTable();
+                               dbHandle->endTrans(false);
 
                                goto FREE_MEMORY;
                        }
@@ -943,17 +1217,17 @@ msg_error_t MsgStoDeleteAllMessageInFolder(msg_folder_id_t folderId, bool bOnlyD
                        for (int i = 1; i <= rowCnt; i++) {
 
                                memset(filePath, 0x00, sizeof(filePath));
-                               dbHandle.getColumnToString(i, MSG_FILEPATH_LEN_MAX, filePath);
+                               dbHandle->getColumnToString(i, MSG_FILEPATH_LEN_MAX, filePath);
 
-                               MSG_DEBUG("filePath [%s]", filePath);
+                               MSG_SEC_DEBUG("filePath [%s]", filePath);
 
                                //delete raw file
                                snprintf(dirPath, sizeof(dirPath), "%s.dir", filePath);
 
                                if (remove(filePath) == -1)
-                                       MSG_DEBUG("Fail to delete file [%s]", filePath);
+                                       MSG_SEC_DEBUG("Fail to delete file [%s]", filePath);
                                else
-                                       MSG_DEBUG("Success to delete file [%s]", filePath);
+                                       MSG_SEC_DEBUG("Success to delete file [%s]", filePath);
 
                                MsgRmRf(dirPath);
 
@@ -961,7 +1235,7 @@ msg_error_t MsgStoDeleteAllMessageInFolder(msg_folder_id_t folderId, bool bOnlyD
 
                        }
 
-                       dbHandle.freeTable();
+                       dbHandle->freeTable();
                }
 
                // delete thumbnail
@@ -973,21 +1247,21 @@ msg_error_t MsgStoDeleteAllMessageInFolder(msg_folder_id_t folderId, bool bOnlyD
                                "AND (MSG_ID IN (SELECT MSG_ID FROM %s WHERE FOLDER_ID = %d));",
                                MSGFW_MMS_PREVIEW_TABLE_NAME, MSG_MMS_ITEM_TYPE_IMG, MSG_MMS_ITEM_TYPE_VIDEO, MSGFW_MESSAGE_TABLE_NAME, folderId);
 
-               if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS) {
-                       dbHandle.endTrans(false);
+               if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
+                       dbHandle->endTrans(false);
                        return MSG_ERR_DB_PREPARE;
                }
 
-               while (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
+               while (dbHandle->stepQuery() == MSG_ERR_DB_ROW) {
                        memset(filePath, 0x00, sizeof(filePath));
-                       strncpy(filePath, (char *)dbHandle.columnText(0), MSG_FILEPATH_LEN_MAX);
+                       strncpy(filePath, (char *)dbHandle->columnText(0), MSG_FILEPATH_LEN_MAX);
                        if (remove(filePath) == -1)
-                               MSG_DEBUG("Fail to delete file [%s]", filePath);
+                               MSG_SEC_DEBUG("Fail to delete file [%s]", filePath);
                        else
-                               MSG_DEBUG("Success to delete file [%s]", filePath);
+                               MSG_SEC_DEBUG("Success to delete file [%s]", filePath);
                }
 
-               dbHandle.finalizeQuery();
+               dbHandle->finalizeQuery();
 
                memset(sqlQuery, 0x00, sizeof(sqlQuery));
 
@@ -996,9 +1270,9 @@ msg_error_t MsgStoDeleteAllMessageInFolder(msg_folder_id_t folderId, bool bOnlyD
                                tableList[i], MSGFW_MESSAGE_TABLE_NAME, folderId);
 
                // Delete Message in specific folder from table
-               if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
+               if (dbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
                        MSG_DEBUG("sqlQuery [%s]", sqlQuery);
-                       dbHandle.endTrans(false);
+                       dbHandle->endTrans(false);
                        err = MSG_ERR_DB_EXEC;
 
                        goto FREE_MEMORY;
@@ -1006,8 +1280,8 @@ msg_error_t MsgStoDeleteAllMessageInFolder(msg_folder_id_t folderId, bool bOnlyD
        }
 
        // Clear Conversation table
-       if (MsgStoClearConversationTable(&dbHandle) != MSG_SUCCESS) {
-               dbHandle.endTrans(false);
+       if (MsgStoClearConversationTable(dbHandle) != MSG_SUCCESS) {
+               dbHandle->endTrans(false);
                err = MSG_ERR_DB_EXEC;
 
                goto FREE_MEMORY;
@@ -1015,28 +1289,18 @@ msg_error_t MsgStoDeleteAllMessageInFolder(msg_folder_id_t folderId, bool bOnlyD
 
        // Update Address
        while (!threadList.empty()) {
-               err = MsgStoUpdateConversation(&dbHandle, threadList.front());
+               err = MsgStoUpdateConversation(dbHandle, threadList.front());
 
                threadList.pop();
 
                if (err != MSG_SUCCESS) {
-                       dbHandle.endTrans(false);
+                       dbHandle->endTrans(false);
 
                        goto FREE_MEMORY;
                }
        }
 
-       dbHandle.endTrans(true);
-
-       if (folderId == MSG_INBOX_ID) {
-               int smsCnt = 0;
-               int mmsCnt = 0;
-
-               smsCnt = MsgStoGetUnreadCnt(&dbHandle, MSG_SMS_TYPE);
-               mmsCnt = MsgStoGetUnreadCnt(&dbHandle, MSG_MMS_TYPE);
-
-               MsgSettingSetIndicator(smsCnt, mmsCnt);
-       }
+       dbHandle->endTrans(true);
 
 /*** Set pMsgIdList **/
        if (pMsgIdList != NULL && pToDeleteMsgIdList->nCount > 0) {
@@ -1063,7 +1327,7 @@ msg_error_t MsgStoDeleteAllMessageInFolder(msg_folder_id_t folderId, bool bOnlyD
 //                             err = MSG_ERR_UNKNOWN;
 //                     }
 
-                       MsgRefreshNoti();
+                       MsgRefreshAllNotification(true, false, false);
                }
        }
 /*** **/
@@ -1094,257 +1358,309 @@ FREE_MEMORY:
 
 msg_error_t MsgStoDeleteMessageByList(msg_id_list_s *pMsgIdList)
 {
+       std::string q;
+
        MSG_BEGIN();
+
        msg_error_t err = MSG_SUCCESS;
+       if (pMsgIdList->nCount < 1) {
+               MSG_DEBUG("pMsgIdList->nCount < 1");
+               return err;
+       }
 
        char sqlQuery[MAX_QUERY_LEN+1];
-       char whereQuery[MAX_QUERY_LEN+1];
-       char sqlQuerySubset[(MAX_QUERY_LEN/5)+1];
 
-       queue<msg_thread_id_t> threadList;
+       queue<msg_thread_id_t> threadList1, threadList2;
 
-       const char *tableList[] = {MSGFW_PUSH_MSG_TABLE_NAME, MSGFW_CB_MSG_TABLE_NAME,
+#ifdef FEATURE_SMS_CDMA
+       const char *tableList[] = {MMS_PLUGIN_MESSAGE_TABLE_NAME, MSGFW_MMS_PREVIEW_TABLE_NAME,
+                                               MSGFW_PUSH_MSG_TABLE_NAME, MSGFW_CB_MSG_TABLE_NAME,
+                                               MSGFW_SYNCML_MSG_TABLE_NAME, MSGFW_SMS_SENDOPT_TABLE_NAME,
+                                               MSGFW_REPORT_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME,
+                                               MSGFW_SMS_REPORT_TABLE_NAME, MSGFW_MMS_MULTIPART_TABLE_NAME,
+                                               MSGFW_UNIQUENESS_INFO_TABLE_NAME};
+#else
+       const char *tableList[] = {MMS_PLUGIN_MESSAGE_TABLE_NAME, MSGFW_MMS_PREVIEW_TABLE_NAME,
+                                               MSGFW_PUSH_MSG_TABLE_NAME, MSGFW_CB_MSG_TABLE_NAME,
                                                MSGFW_SYNCML_MSG_TABLE_NAME, MSGFW_SMS_SENDOPT_TABLE_NAME,
-                                               MSGFW_MMS_PREVIEW_TABLE_NAME, MSGFW_REPORT_TABLE_NAME,
-                                               MMS_PLUGIN_MESSAGE_TABLE_NAME,  MSGFW_MESSAGE_TABLE_NAME};
+                                               MSGFW_REPORT_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME,
+                                               MSGFW_SMS_REPORT_TABLE_NAME, MSGFW_MMS_MULTIPART_TABLE_NAME};
+#endif
 
        int listCnt = sizeof(tableList)/sizeof(char *);
        int rowCnt = 0;
+       MsgDbHandler *dbHandle = getDbHandle();
 
-       memset(whereQuery, 0x00, sizeof(whereQuery));
+       dbHandle->beginTrans();
+       // reset msgid temp table
+       memset(sqlQuery, 0x00, sizeof(sqlQuery));
+       snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s;", MSGFW_TMP_MSGID_TABLE_NAME);
+       MSG_DEBUG("[%s]", sqlQuery);
 
-       if (pMsgIdList->nCount < 1) {
-               return MSG_SUCCESS;
-       } else {
-               for (int i=0; i < pMsgIdList->nCount; i++) {
-                       memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
-                       if (i==0)
-                               snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "(MSG_ID = %d ", pMsgIdList->msgIdList[i]);
-                       else
-                               snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "OR MSG_ID = %d ", pMsgIdList->msgIdList[i]);
-                       strncat(whereQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(whereQuery));
-               }
+       if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
+               dbHandle->endTrans(false);
+               return MSG_ERR_DB_EXEC;
        }
-       strncat(whereQuery, ");", MAX_QUERY_LEN-strlen(whereQuery));
 
-       // Get conversation ID from Folder
-       memset(sqlQuery, 0x00, sizeof(sqlQuery));
-       snprintf(sqlQuery, sizeof(sqlQuery), "SELECT DISTINCT(CONV_ID) FROM %s WHERE ", MSGFW_MESSAGE_TABLE_NAME);
-       strncat(sqlQuery, whereQuery, MAX_QUERY_LEN-strlen(sqlQuery));
+       if (dbHandle->stepQuery() != MSG_ERR_DB_DONE) {
+               dbHandle->finalizeQuery();
+               dbHandle->endTrans(false);
+               return MSG_ERR_DB_EXEC;
+       }
+
+       dbHandle->finalizeQuery();
+
+       memset(sqlQuery, 0x00, sizeof(sqlQuery));
+       snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (?)", MSGFW_TMP_MSGID_TABLE_NAME);
+       MSG_DEBUG("[%s]", sqlQuery);
+       if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
+               dbHandle->endTrans(false);
+               return MSG_ERR_DB_PREPARE;
+       }
 
-       err = dbHandle.getTable(sqlQuery, &rowCnt);
+       for (int i = 0; i < pMsgIdList->nCount; i++) {
+               dbHandle->resetQuery();
+               dbHandle->bindInt(pMsgIdList->msgIdList[i], 1);
+               if (dbHandle->stepQuery() != MSG_ERR_DB_DONE) {
+                       dbHandle->finalizeQuery();
+                       dbHandle->endTrans(false);
+                       return MSG_ERR_DB_EXEC;
+               }
+       }
+
+       dbHandle->finalizeQuery();
+       dbHandle->endTrans(true);
+
+       memset(sqlQuery, 0x00, sizeof(sqlQuery));
+       snprintf(sqlQuery, sizeof(sqlQuery), "SELECT DISTINCT(CONV_ID) FROM %s WHERE MSG_ID IN %s;", MSGFW_MESSAGE_TABLE_NAME, MSGFW_TMP_MSGID_TABLE_NAME);
+
+       err = dbHandle->getTable(sqlQuery, &rowCnt);
 
        if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
-               MSG_DEBUG("sql query is %s.", sqlQuery);
-               dbHandle.freeTable();
+               MSG_DEBUG("Fail to getTable().");
+               dbHandle->freeTable();
                return err;
        }
 
-       if (rowCnt <= 0) {
-               dbHandle.freeTable();
+       MSG_DEBUG("rowCnt [%d]", rowCnt);
+
+       if (rowCnt < 1) {
+               dbHandle->freeTable();
                return MSG_SUCCESS;
        }
 
        for (int i = 1; i <= rowCnt; i++) {
-               MSG_DEBUG("thread ID : %d", dbHandle.getColumnToInt(i));
-               threadList.push((msg_thread_id_t)dbHandle.getColumnToInt(i));
+               MSG_DEBUG("thread ID : %d", dbHandle->getColumnToInt(i));
+               threadList1.push((msg_thread_id_t)dbHandle->getColumnToInt(i));
+               threadList2.push((msg_thread_id_t)dbHandle->getColumnToInt(i));
+       }
+       dbHandle->freeTable();
+
+       // delete report notification
+       char tempAddr[MAX_ADDRESS_VAL_LEN+1];
+       while (!threadList1.empty()) {
+               memset(tempAddr, 0x00, sizeof(tempAddr));
+               memset(sqlQuery, 0x00, sizeof(sqlQuery));
+               snprintf(sqlQuery, sizeof(sqlQuery), "SELECT B.ADDRESS_VAL FROM %s A, %s B WHERE A.CONV_ID = B.CONV_ID AND A.CONV_ID = %d;"
+                               , MSGFW_MESSAGE_TABLE_NAME, MSGFW_ADDRESS_TABLE_NAME, threadList1.front());
+
+               if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
+                       return MSG_ERR_DB_PREPARE;
+
+               if (dbHandle->stepQuery() != MSG_ERR_DB_ROW) {
+                       dbHandle->finalizeQuery();
+                       return MSG_ERR_DB_DONE;
+               }
+
+               snprintf(tempAddr, sizeof(tempAddr), "%s", dbHandle->columnText(0));
+
+               MSG_SEC_DEBUG("Updated address = %s", tempAddr);
+
+               MsgDeleteReportNotification(tempAddr);
+
+               dbHandle->finalizeQuery();
+
+               threadList1.pop();
        }
 
-       dbHandle.freeTable();
 
-       /*** Delete Sim Message In Folder **/
        memset(sqlQuery, 0x00, sizeof(sqlQuery));
-       snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s WHERE STORAGE_ID = %d AND ", MSGFW_MESSAGE_TABLE_NAME, MSG_STORAGE_SIM);
-       strncat(sqlQuery, whereQuery, MAX_QUERY_LEN-strlen(sqlQuery));
+       snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s WHERE STORAGE_ID = %d AND MSG_ID IN %s;",
+                       MSGFW_MESSAGE_TABLE_NAME, MSG_STORAGE_SIM, MSGFW_TMP_MSGID_TABLE_NAME);
 
        rowCnt = 0;
-
-       err = dbHandle.getTable(sqlQuery, &rowCnt);
+       err = dbHandle->getTable(sqlQuery, &rowCnt);
 
        if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
-               MSG_DEBUG("sql query is %s.", sqlQuery);
-               dbHandle.freeTable();
-               return err;
+               MSG_DEBUG("Fail to getTable().");
+               dbHandle->freeTable();
+               rowCnt = 0;
        }
 
        for (int i = 1; i <= rowCnt; i++) {
-               err = MsgStoDeleteMessage(dbHandle.getColumnToInt(i), false);
-
+               err = MsgStoDeleteMessage(dbHandle->getColumnToInt(i), false);
                if (err != MSG_SUCCESS) {
                        MSG_DEBUG("MsgStoDeleteMessage() Error!!!");
-                       dbHandle.freeTable();
-                       return err;
                }
        }
-
-       dbHandle.freeTable();
+       dbHandle->freeTable();
        /*** **/
 
-       dbHandle.beginTrans();
-
+       dbHandle->beginTrans();
        for (int i = 0; i < listCnt; i++) {
-               if (!strcmp(tableList[i], MMS_PLUGIN_MESSAGE_TABLE_NAME)) {
+               if ( !i ) {
 
-                       int rowCnt = 0;
+                       char filePath[MSG_FILEPATH_LEN_MAX];
+                       char dirPath[MSG_FILEPATH_LEN_MAX];
 
-                       char filePath[MSG_FILEPATH_LEN_MAX] = {0,};
-                       char dirPath[MSG_FILEPATH_LEN_MAX] = {0,};
-                       char thumbnailPath[MSG_FILEPATH_LEN_MAX] = {0,};
+                       rowCnt = 0;
 
-                       //get mms msg id list
                        memset(sqlQuery, 0x00, sizeof(sqlQuery));
-                       snprintf(sqlQuery, sizeof(sqlQuery), "SELECT FILE_PATH FROM %s WHERE ", MMS_PLUGIN_MESSAGE_TABLE_NAME);
-                       strncat(sqlQuery, whereQuery, MAX_QUERY_LEN-strlen(sqlQuery));
+                       snprintf(sqlQuery, sizeof(sqlQuery), "SELECT FILE_PATH FROM %s WHERE MSG_ID IN %s;", MMS_PLUGIN_MESSAGE_TABLE_NAME, MSGFW_TMP_MSGID_TABLE_NAME);
 
-                       err = dbHandle.getTable(sqlQuery, &rowCnt);
-                       MSG_DEBUG("rowCnt %d", rowCnt);
+                       err = dbHandle->getTable(sqlQuery, &rowCnt);
 
                        if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
-                               MSG_DEBUG("sqlQuery [%s]", sqlQuery);
-                               dbHandle.freeTable();
-                               dbHandle.endTrans(false);
-                               return err;
+                               MSG_DEBUG("Fail to getTable().");
+                               rowCnt = 0;
                        }
 
+                       MSG_DEBUG("rowCnt %d", rowCnt);
+
                        for (int i = 1; i <= rowCnt; i++) {
-                               memset(filePath, 0x00, sizeof(filePath));
-                               dbHandle.getColumnToString(i, MSG_FILEPATH_LEN_MAX, filePath);
+                               dbHandle->getColumnToString(i, MSG_FILEPATH_LEN_MAX, filePath);
 
-                               MSG_DEBUG("filePath [%s]", filePath);
+                               MSG_SEC_DEBUG("filePath [%s]", filePath);
 
-                               //delete raw file
+                               // Delete raw file.
                                snprintf(dirPath, sizeof(dirPath), "%s.dir", filePath);
 
                                if (remove(filePath) == -1)
-                                       MSG_DEBUG("Fail to delete file [%s]", filePath);
+                                       MSG_SEC_DEBUG("Fail to delete file [%s]", filePath);
                                else
-                                       MSG_DEBUG("Success to delete file [%s]", filePath);
+                                       MSG_SEC_DEBUG("Success to delete file [%s]", filePath);
 
                                MsgRmRf(dirPath);
 
                                rmdir(dirPath);
                        }
+                       dbHandle->freeTable();
+
+               } else if (i == 1) {
 
-                       dbHandle.freeTable();
-               } else if (!strcmp(tableList[i], MSGFW_MMS_PREVIEW_TABLE_NAME)) {
                        char filePath[MSG_FILEPATH_LEN_MAX] = {0,};
+
+                       rowCnt = 0;
+
                        memset(sqlQuery, 0x00, sizeof(sqlQuery));
-                       snprintf(sqlQuery, sizeof(sqlQuery),
-                                       "SELECT VALUE FROM %s "
-                                       "WHERE (TYPE=%d OR TYPE=%d) "
-                                       "AND ",
-                                       MSGFW_MMS_PREVIEW_TABLE_NAME, MSG_MMS_ITEM_TYPE_IMG, MSG_MMS_ITEM_TYPE_VIDEO);
+                       snprintf(sqlQuery, sizeof(sqlQuery), "SELECT VALUE FROM %s WHERE (TYPE = %d OR TYPE = %d) AND MSG_ID IN %s;",
+                                       MSGFW_MMS_PREVIEW_TABLE_NAME, MSG_MMS_ITEM_TYPE_IMG, MSG_MMS_ITEM_TYPE_VIDEO, MSGFW_TMP_MSGID_TABLE_NAME);
 
-                       strncat(sqlQuery, whereQuery, MAX_QUERY_LEN-strlen(sqlQuery));
+                       err = dbHandle->getTable(sqlQuery, &rowCnt);
 
-                       if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS) {
-                               dbHandle.endTrans(false);
-                               return MSG_ERR_DB_PREPARE;
+                       if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
+                               MSG_DEBUG("Fail to getTable().");
+                               rowCnt = 0;
                        }
 
-                       while (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
-                               memset(filePath, 0x00, sizeof(filePath));
+                       MSG_DEBUG("rowCnt %d", rowCnt);
 
-                               strncpy(filePath, (char *)dbHandle.columnText(0), MSG_FILEPATH_LEN_MAX);
+                       for (int i = 1; i <= rowCnt; i++) {
+                               memset(filePath, 0x00, sizeof(filePath));
+                               dbHandle->getColumnToString(i, MSG_FILEPATH_LEN_MAX, filePath);
                                if (remove(filePath) == -1)
-                                       MSG_DEBUG("Fail to delete file [%s]", filePath);
+                                       MSG_SEC_DEBUG("Fail to delete file [%s]", filePath);
                                else
-                                       MSG_DEBUG("Success to delete file [%s]", filePath);
+                                       MSG_SEC_DEBUG("Success to delete file [%s]", filePath);
                        }
+                       dbHandle->freeTable();
+               } else if (!strcmp(tableList[i], MSGFW_MMS_MULTIPART_TABLE_NAME)) {
+                               // MMS file path to delete.
+                               char filePath[MSG_FILEPATH_LEN_MAX] = {0,};
 
-                       dbHandle.finalizeQuery();
-               }
-
-               memset(sqlQuery, 0x00, sizeof(sqlQuery));
+                               rowCnt = 0;
 
-               snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE ", tableList[i]);
-               strncat(sqlQuery, whereQuery, MAX_QUERY_LEN-strlen(sqlQuery));
+                               memset(sqlQuery, 0x00, sizeof(sqlQuery));
+                               snprintf(sqlQuery, sizeof(sqlQuery), "SELECT FILE_PATH FROM %s WHERE MSG_ID IN %s;", MSGFW_MMS_MULTIPART_TABLE_NAME, MSGFW_TMP_MSGID_TABLE_NAME);
 
-               // Delete Message in specific folder from table
-               err = dbHandle.execQuery(sqlQuery);
-               if (err != MSG_SUCCESS) {
-                       MSG_DEBUG("sqlQuery [%s]", sqlQuery);
-                       dbHandle.endTrans(false);
-                       return err;
-               }
-       }
+                               err = dbHandle->getTable(sqlQuery, &rowCnt);
 
-       // Clear Conversation table
-       err = MsgStoClearConversationTable(&dbHandle);
-       if (err != MSG_SUCCESS) {
-               dbHandle.endTrans(false);
-               return err;
-       }
+                               if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
+                                       MSG_DEBUG("Fail to getTable().");
+                                       rowCnt = 0;
+                               }
 
-       // Update Address
-       while (!threadList.empty()) {
-               err = MsgStoUpdateConversation(&dbHandle, threadList.front());
+                               MSG_DEBUG("rowCnt %d", rowCnt);
 
-               threadList.pop();
+                               for (int i = 1; i <= rowCnt; i++) {
+                                       memset(filePath, 0x00, sizeof(filePath));
+                                       dbHandle->getColumnToString(i, MSG_FILEPATH_LEN_MAX, filePath);
+                                       if (filePath[0] != '\0') {
+                                               if (remove(filePath) == -1)
+                                                       MSG_SEC_DEBUG("Fail to delete file [%s]", filePath);
+                                               else
+                                                       MSG_SEC_DEBUG("Success to delete file [%s]", filePath);
+                                       }
+                               }
+                               dbHandle->freeTable();
 
-               if (err != MSG_SUCCESS) {
-                       dbHandle.endTrans(false);
-                       return err;
-               }
-       }
+                               // MMS thumbnail path to delete
+                               memset(sqlQuery, 0x00, sizeof(sqlQuery));
+                               snprintf(sqlQuery, sizeof(sqlQuery), "SELECT THUMB_FILE_PATH FROM %s WHERE MSG_ID IN %s;", MSGFW_MMS_MULTIPART_TABLE_NAME, MSGFW_TMP_MSGID_TABLE_NAME);
 
-       dbHandle.endTrans(true);
+                               err = dbHandle->getTable(sqlQuery, &rowCnt);
 
-       int smsCnt = 0;
-       int mmsCnt = 0;
+                               if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
+                                       MSG_DEBUG("Fail to getTable().");
+                                       rowCnt = 0;
+                               }
 
-       smsCnt = MsgStoGetUnreadCnt(&dbHandle, MSG_SMS_TYPE);
-       mmsCnt = MsgStoGetUnreadCnt(&dbHandle, MSG_MMS_TYPE);
+                               MSG_DEBUG("rowCnt %d", rowCnt);
 
-       MsgSettingSetIndicator(smsCnt, mmsCnt);
+                               for (int i = 1; i <= rowCnt; i++) {
+                                       memset(filePath, 0x00, sizeof(filePath));
+                                       dbHandle->getColumnToString(i, MSG_FILEPATH_LEN_MAX, filePath);
+                                       if (filePath[0] != '\0') {
+                                               if (remove(filePath) == -1)
+                                                       MSG_SEC_DEBUG("Fail to delete file [%s]", filePath);
+                                               else
+                                                       MSG_SEC_DEBUG("Success to delete file [%s]", filePath);
+                                       }
+                               }
 
-#if 0
-/*** Create thread  for noti and phone log delete. **/
-       if (pMsgIdList->nCount > 0) {
-               msg_id_list_s *pToDeleteMsgIdList = NULL;
-               pToDeleteMsgIdList = (msg_id_list_s *)new char[sizeof(msg_id_list_s)];
-               memset(pToDeleteMsgIdList, 0x00, sizeof(msg_id_list_s));
-               pToDeleteMsgIdList->nCount = pMsgIdList->nCount;
-               pToDeleteMsgIdList->msgIdList = (msg_message_id_t *)new char[sizeof(msg_message_id_t)*pMsgIdList->nCount];
-               memcpy(pToDeleteMsgIdList->msgIdList, pMsgIdList->msgIdList, sizeof(msg_message_id_t)*pMsgIdList->nCount);
-
-               msg_id_list_s *pToDeleteMsgIdListCpy = NULL;
-               pToDeleteMsgIdListCpy = (msg_id_list_s *)new char[sizeof(msg_id_list_s)];
-               memset(pToDeleteMsgIdListCpy, 0x00, sizeof(msg_id_list_s));
-               pToDeleteMsgIdListCpy->nCount = pMsgIdList->nCount;
-               pToDeleteMsgIdListCpy->msgIdList = (msg_message_id_t *)new char[sizeof(msg_message_id_t)*pMsgIdList->nCount];
-               memcpy(pToDeleteMsgIdListCpy->msgIdList, pMsgIdList->msgIdList, sizeof(msg_message_id_t)*pMsgIdList->nCount);
-
-               if (g_idle_add(startToDeleteNoti, (void *)pToDeleteMsgIdList) == 0) {
-                       MSG_DEBUG("startToDeleteNoti not invoked: %s", strerror(errno));
-                       // memory free
-                       if (pToDeleteMsgIdList != NULL) {
-                               //free peer info list
-                               if (pToDeleteMsgIdList->msgIdList != NULL)
-                                       delete [] pToDeleteMsgIdList->msgIdList;
-
-                               delete [] pToDeleteMsgIdList;
-                       }
-                       err = MSG_ERR_UNKNOWN;
+                               dbHandle->freeTable();
                }
 
-               if (g_idle_add(startToDeletePhoneLog, (void *)pToDeleteMsgIdListCpy) == 0) {
-                       MSG_DEBUG("startToDeletePhoneLog not invoked: %s", strerror(errno));
-                       // memory free
-                       if (pToDeleteMsgIdListCpy != NULL) {
-                               //free peer info list
-                               if (pToDeleteMsgIdListCpy->msgIdList != NULL)
-                                       delete [] pToDeleteMsgIdListCpy->msgIdList;
+               memset(sqlQuery, 0x00, sizeof(sqlQuery));
+               snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE MSG_ID IN %s;", tableList[i], MSGFW_TMP_MSGID_TABLE_NAME);
 
-                               delete [] pToDeleteMsgIdListCpy;
-                       }
-                       err = MSG_ERR_UNKNOWN;
+               // Delete Message in specific folder from table
+               err = dbHandle->execQuery(sqlQuery);
+               if (err != MSG_SUCCESS) {
+                       MSG_DEBUG("Fail to execQuery().");
                }
        }
-/*** **/
-#endif
 
-       MsgRefreshNoti();
+       // Clear Conversation table
+       err = MsgStoClearConversationTable(dbHandle);
+       if (err != MSG_SUCCESS) MSG_DEBUG("Fail to MsgStoClearConversationTable().");
+
+       // Update Address
+       while (!threadList2.empty()) {
+               err = MsgStoUpdateConversation(dbHandle, threadList2.front());
+               if (err != MSG_SUCCESS) MSG_DEBUG("Fail to MsgStoUpdateConversation().");
+               threadList2.pop();
+       }
+       err = dbHandle->endTrans(true);
+       if (err != MSG_SUCCESS) {
+               MSG_DEBUG("Fail to endTrans(true).");
+               dbHandle->endTrans(false);
+               return err;
+       }
+
+       if (g_idle_add(resetNotification, NULL) == 0) {
+               MSG_DEBUG("resetNotification() Error");
+       }
 
        MSG_END();
        return MSG_SUCCESS;
@@ -1360,6 +1676,7 @@ msg_error_t MsgStoMoveMessageToFolder(msg_message_id_t msgId, msg_folder_id_t de
        MsgStoGetMsgType(msgId, &msgType);
 
        char sqlQuery[MAX_QUERY_LEN+1];
+       MsgDbHandler *dbHandle = getDbHandle();
 
        memset(sqlQuery, 0x00, sizeof(sqlQuery));
 
@@ -1368,7 +1685,7 @@ msg_error_t MsgStoMoveMessageToFolder(msg_message_id_t msgId, msg_folder_id_t de
        else
                snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET FOLDER_ID = %d WHERE MSG_ID = %d;", MSGFW_MESSAGE_TABLE_NAME, destFolderId, msgId);
 
-       if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS)
+       if (dbHandle->execQuery(sqlQuery) != MSG_SUCCESS)
                return MSG_ERR_DB_EXEC;
 
        /* get conversation id */
@@ -1377,18 +1694,21 @@ msg_error_t MsgStoMoveMessageToFolder(msg_message_id_t msgId, msg_folder_id_t de
        snprintf(sqlQuery, sizeof(sqlQuery), "SELECT CONV_ID FROM %s WHERE MSG_ID = %d;",
                                                        MSGFW_MESSAGE_TABLE_NAME, msgId);
 
-       if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
+       if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
                return MSG_ERR_DB_PREPARE;
 
-       if (dbHandle.stepQuery() == MSG_ERR_DB_ROW)
-               convId = dbHandle.columnInt(0);
+       if (dbHandle->stepQuery() == MSG_ERR_DB_ROW)
+               convId = dbHandle->columnInt(0);
 
        MSG_DEBUG("convId : %d",  convId);
 
-       dbHandle.finalizeQuery();
+       dbHandle->finalizeQuery();
 
        /* update conversation table */
-       err = MsgStoUpdateConversation(&dbHandle, convId);
+       err = MsgStoUpdateConversation(dbHandle, convId);
+
+       /* update notification */
+       MsgRefreshAllNotification(true, false, false);
 
        return err;
 }
@@ -1401,11 +1721,13 @@ msg_error_t MsgStoMoveMessageToStorage(msg_message_id_t msgId, msg_storage_id_t
        msg_error_t err = MSG_SUCCESS;
 
        char sqlQuery[MAX_QUERY_LEN+1];
+       MsgDbHandler *dbHandle = getDbHandle();
 
        MSG_DEBUG("msgId : %d, destStorageId : %d", msgId, destStorageId);
 
        switch (destStorageId) {
        case MSG_STORAGE_SIM : // Move message to sim card
+       case MSG_STORAGE_SIM2 :
                {
                        MSG_MESSAGE_INFO_S msgInfo;
                        SMS_SIM_ID_LIST_S simIdList;
@@ -1418,32 +1740,39 @@ msg_error_t MsgStoMoveMessageToStorage(msg_message_id_t msgId, msg_storage_id_t
 
                        MsgPlugin *plg = MsgPluginManager::instance()->getPlugin(MSG_SMS_TYPE);
 
+                       if (destStorageId == MSG_STORAGE_SIM)
+                               msgInfo.sim_idx = 1;
+                       else if (destStorageId == MSG_STORAGE_SIM2)
+                               msgInfo.sim_idx = 2;
+
                        if ((err = plg->saveSimMessage(&msgInfo, &simIdList)) != MSG_SUCCESS)
                                return err;
 
-                       dbHandle.beginTrans();
+                       dbHandle->beginTrans();
 
                        memset(sqlQuery, 0x00, sizeof(sqlQuery));
-                       snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET STORAGE_ID = %d WHERE MSG_ID = %d;",
-                                       MSGFW_MESSAGE_TABLE_NAME, destStorageId, msgId);
+                       snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET STORAGE_ID = %d, SIM_INDEX = %d WHERE MSG_ID = %d;",
+                                       MSGFW_MESSAGE_TABLE_NAME, MSG_STORAGE_SIM, msgInfo.sim_idx, msgId);
+                       MSG_DEBUG("SQL query=[%s]", sqlQuery);
 
-                       if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
-                               dbHandle.endTrans(false);
+                       if (dbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
+                               dbHandle->endTrans(false);
                                return MSG_ERR_DB_EXEC;
                        }
 
                        for (unsigned int i = 0; i < simIdList.count; i++) {
                                memset(sqlQuery, 0x00, sizeof(sqlQuery));
-                               snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, %d);",
-                                               MSGFW_SIM_MSG_TABLE_NAME, msgId, simIdList.simId[i]);
+                               snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, %d, %d);",
+                                               MSGFW_SIM_MSG_TABLE_NAME, msgInfo.sim_idx, simIdList.simId[i], msgId);
+                               MSG_DEBUG("SQL query=[%s]", sqlQuery);
 
-                               if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
-                                       dbHandle.endTrans(false);
+                               if (dbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
+                                       dbHandle->endTrans(false);
                                        return MSG_ERR_DB_EXEC;
                                }
                        }
 
-                       dbHandle.endTrans(true);
+                       dbHandle->endTrans(true);
                }
        break;
 
@@ -1456,65 +1785,68 @@ msg_error_t MsgStoMoveMessageToStorage(msg_message_id_t msgId, msg_storage_id_t
                        snprintf(sqlQuery, sizeof(sqlQuery), "SELECT STORAGE_ID FROM %s WHERE MSG_ID = %d;",
                                        MSGFW_MESSAGE_TABLE_NAME, msgId);
 
-                       err = dbHandle.getTable(sqlQuery, &rowCnt);
+                       err = dbHandle->getTable(sqlQuery, &rowCnt);
 
                        if (err != MSG_SUCCESS) {
-                               dbHandle.freeTable();
+                               MSG_DEBUG("Fail to getTable().");
+                               dbHandle->freeTable();
                                return err;
                        }
 
-                       if (dbHandle.getColumnToInt(1) == MSG_STORAGE_SIM) {
+                       if (dbHandle->getColumnToInt(1) == MSG_STORAGE_SIM) {
                                MSG_DEBUG("It is SIM Message");
                                bSimMsg = true;
                        }
 
-                       dbHandle.freeTable();
+                       dbHandle->freeTable();
 
+#ifndef FEATURE_SMS_CDMA
                        if (bSimMsg == true) {
                                msg_sim_id_t simMsgId;
+                               msg_sim_slot_id_t sim_idx;
 
                                // get sim message id
                                memset(sqlQuery, 0x00, sizeof(sqlQuery));
 
-                               snprintf(sqlQuery, sizeof(sqlQuery), "SELECT SIM_ID FROM %s WHERE MSG_ID = %d;",
+                               snprintf(sqlQuery, sizeof(sqlQuery), "SELECT SIM_SLOT_ID, SIM_ID FROM %s WHERE MSG_ID = %d;",
                                                MSGFW_SIM_MSG_TABLE_NAME, msgId);
 
-                               MSG_DEBUG("sqlQuery is %s.", sqlQuery);
-
-                               err = dbHandle.getTable(sqlQuery, &rowCnt);
+                               err = dbHandle->getTable(sqlQuery, &rowCnt);
 
                                if (err != MSG_SUCCESS) {
-                                       dbHandle.freeTable();
+                                       MSG_DEBUG("Fail to getTable().");
+                                       dbHandle->freeTable();
                                        return err;
                                }
 
                                //Delete messages in sim card
                                MsgPlugin *plg = MsgPluginManager::instance()->getPlugin(MSG_SMS_TYPE);
+                               int index = 2;
 
                                for (int i = 0; i < rowCnt; i++) {
-                                       simMsgId = dbHandle.getColumnToInt(i+1);
+                                       sim_idx =  dbHandle->getColumnToInt(index++);
+                                       simMsgId = dbHandle->getColumnToInt(index++);
 
                                        MSG_DEBUG("simMsgId is %d.", simMsgId);
 
-                                       if ((err = plg->deleteSimMessage(simMsgId)) != MSG_SUCCESS) {
-                                               dbHandle.freeTable();
+                                       if ((err = plg->deleteSimMessage(sim_idx, simMsgId)) != MSG_SUCCESS) {
+                                               dbHandle->freeTable();
                                                return err;
                                        }
                                }
 
-                               dbHandle.freeTable();
+                               dbHandle->freeTable();
 
-                               dbHandle.beginTrans();
+                               dbHandle->beginTrans();
 
                                //Delete Messages in SIM Msg table
                                memset(sqlQuery, 0x00, sizeof(sqlQuery));
                                snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE MSG_ID = %d;",
                                                MSGFW_SIM_MSG_TABLE_NAME, msgId);
+                               MSG_DEBUG("SQL query=[%s]", sqlQuery);
 
-                               MSG_DEBUG("sqlQuery is %s.", sqlQuery);
-
-                               if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
-                                       dbHandle.endTrans(false);
+                               if (dbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
+                                       dbHandle->endTrans(false);
                                        return MSG_ERR_DB_EXEC;
                                }
 
@@ -1522,15 +1854,18 @@ msg_error_t MsgStoMoveMessageToStorage(msg_message_id_t msgId, msg_storage_id_t
                                memset(sqlQuery, 0x00, sizeof(sqlQuery));
                                snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET STORAGE_ID = %d WHERE MSG_ID = %d;",
                                                MSGFW_MESSAGE_TABLE_NAME, destStorageId, msgId);
+                               MSG_DEBUG("SQL query=[%s]", sqlQuery);
 
-                               if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
-                                       dbHandle.endTrans(false);
+                               if (dbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
+                                       dbHandle->endTrans(false);
                                        return MSG_ERR_DB_EXEC;
                                }
 
-                               dbHandle.endTrans(true);
+                               dbHandle->endTrans(true);
                        }
+#endif
                }
+               break;
        }
 
        return MSG_SUCCESS;
@@ -1545,49 +1880,50 @@ msg_error_t MsgStoCountMessage(msg_folder_id_t folderId, MSG_COUNT_INFO_S *pCoun
        }
 
        char sqlQuery[MAX_QUERY_LEN+1];
+       MsgDbHandler *dbHandle = getDbHandle();
 
        memset(sqlQuery, 0x00, sizeof(sqlQuery));
-       snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s WHERE FOLDER_ID = %d AND READ_STATUS = 1 \
-                       UNION ALL SELECT COUNT(MSG_ID) FROM %s WHERE FOLDER_ID = %d AND READ_STATUS = 0 \
-                       UNION ALL SELECT COUNT(MSG_ID) FROM %s WHERE FOLDER_ID = %d AND MAIN_TYPE = %d \
-                       UNION ALL SELECT COUNT(MSG_ID) FROM %s WHERE FOLDER_ID = %d AND MAIN_TYPE = %d;",
-                       MSGFW_MESSAGE_TABLE_NAME, folderId,
-                       MSGFW_MESSAGE_TABLE_NAME, folderId,
-                       MSGFW_MESSAGE_TABLE_NAME, folderId, MSG_SMS_TYPE,
-                       MSGFW_MESSAGE_TABLE_NAME, folderId, MSG_MMS_TYPE);
-
-       if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
+       snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s WHERE FOLDER_ID = %d AND READ_STATUS = 1 AND STORAGE_ID = %d "
+                       "UNION ALL SELECT COUNT(MSG_ID) FROM %s WHERE FOLDER_ID = %d AND READ_STATUS = 0 AND STORAGE_ID = %d "
+                       "UNION ALL SELECT COUNT(MSG_ID) FROM %s WHERE FOLDER_ID = %d AND MAIN_TYPE = %d AND STORAGE_ID = %d "
+                       "UNION ALL SELECT COUNT(MSG_ID) FROM %s WHERE FOLDER_ID = %d AND MAIN_TYPE = %d AND STORAGE_ID = %d;",
+                       MSGFW_MESSAGE_TABLE_NAME, folderId, MSG_STORAGE_PHONE,
+                       MSGFW_MESSAGE_TABLE_NAME, folderId, MSG_STORAGE_PHONE,
+                       MSGFW_MESSAGE_TABLE_NAME, folderId, MSG_SMS_TYPE, MSG_STORAGE_PHONE,
+                       MSGFW_MESSAGE_TABLE_NAME, folderId, MSG_MMS_TYPE, MSG_STORAGE_PHONE);
+
+       if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
                return MSG_ERR_DB_PREPARE;
 
-       if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
-               pCountInfo->nReadCnt = dbHandle.columnInt(0);
+       if (dbHandle->stepQuery() == MSG_ERR_DB_ROW) {
+               pCountInfo->nReadCnt = dbHandle->columnInt(0);
        } else {
-               dbHandle.finalizeQuery();
+               dbHandle->finalizeQuery();
                return MSG_ERR_DB_STEP;
        }
 
-       if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
-               pCountInfo->nUnreadCnt = dbHandle.columnInt(0);
+       if (dbHandle->stepQuery() == MSG_ERR_DB_ROW) {
+               pCountInfo->nUnreadCnt = dbHandle->columnInt(0);
        } else {
-               dbHandle.finalizeQuery();
+               dbHandle->finalizeQuery();
                return MSG_ERR_DB_STEP;
        }
 
-       if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
-               pCountInfo->nSms = dbHandle.columnInt(0);
+       if (dbHandle->stepQuery() == MSG_ERR_DB_ROW) {
+               pCountInfo->nSms = dbHandle->columnInt(0);
        } else {
-               dbHandle.finalizeQuery();
+               dbHandle->finalizeQuery();
                return MSG_ERR_DB_STEP;
        }
 
-       if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
-               pCountInfo->nMms = dbHandle.columnInt(0);
+       if (dbHandle->stepQuery() == MSG_ERR_DB_ROW) {
+               pCountInfo->nMms = dbHandle->columnInt(0);
        } else {
-               dbHandle.finalizeQuery();
+               dbHandle->finalizeQuery();
                return MSG_ERR_DB_STEP;
        }
 
-       dbHandle.finalizeQuery();
+       dbHandle->finalizeQuery();
 
        return MSG_SUCCESS;
 }
@@ -1605,6 +1941,7 @@ msg_error_t MsgStoCountMsgByType(const MSG_MESSAGE_TYPE_S *pMsgType, int *pMsgCo
        char sqlQuery[MAX_QUERY_LEN+1];
        memset(sqlQuery, 0x00, sizeof(sqlQuery));
 
+       MsgDbHandler *dbHandle = getDbHandle();
        // SMS
        if ((pMsgType->mainType == MSG_SMS_TYPE) &&
                        (pMsgType->subType == MSG_NORMAL_SMS || pMsgType->subType == MSG_STATUS_REPORT_SMS || pMsgType->subType == MSG_CONCAT_SIM_SMS)) {
@@ -1624,17 +1961,17 @@ msg_error_t MsgStoCountMsgByType(const MSG_MESSAGE_TYPE_S *pMsgType, int *pMsgCo
                return MSG_ERR_INVALID_PARAMETER;
        }
 
-       if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
+       if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
                return MSG_ERR_DB_PREPARE;
 
-       if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
-               *pMsgCount = dbHandle.columnInt(0);
+       if (dbHandle->stepQuery() == MSG_ERR_DB_ROW) {
+               *pMsgCount = dbHandle->columnInt(0);
        } else {
-               dbHandle.finalizeQuery();
+               dbHandle->finalizeQuery();
                return MSG_ERR_DB_STEP;
        }
 
-       dbHandle.finalizeQuery();
+       dbHandle->finalizeQuery();
 
        return MSG_SUCCESS;
 }
@@ -1643,36 +1980,35 @@ msg_error_t MsgStoCountMsgByType(const MSG_MESSAGE_TYPE_S *pMsgType, int *pMsgCo
 msg_error_t MsgStoGetMessage(msg_message_id_t msgId, MSG_MESSAGE_INFO_S *pMsg, MSG_SENDINGOPT_INFO_S *pSendOptInfo)
 {
        char sqlQuery[MAX_QUERY_LEN+1];
-
-       int order = MsgGetContactNameOrder();
-
        memset(sqlQuery, 0x00, sizeof(sqlQuery));
        snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID, CONV_ID, FOLDER_ID, STORAGE_ID, MAIN_TYPE, \
                        SUB_TYPE, DISPLAY_TIME, DATA_SIZE, NETWORK_STATUS, READ_STATUS, PROTECTED, \
-                       BACKUP, PRIORITY, MSG_DIRECTION, SCHEDULED_TIME, SUBJECT, MSG_TEXT, THUMB_PATH \
+                       BACKUP, PRIORITY, MSG_DIRECTION, SCHEDULED_TIME, SUBJECT, MSG_TEXT, THUMB_PATH, SIM_INDEX \
                        FROM %s WHERE MSG_ID = %d;",
                        MSGFW_MESSAGE_TABLE_NAME, msgId);
 
-       if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
+       MsgDbHandler *dbHandle = getDbHandle();
+
+       if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
                return MSG_ERR_DB_PREPARE;
 
-       if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
-               pMsg->msgId = dbHandle.columnInt(0);
-               pMsg->threadId = dbHandle.columnInt(1);
-               pMsg->folderId = dbHandle.columnInt(2);
-               pMsg->storageId = dbHandle.columnInt(3);
-               pMsg->msgType.mainType = dbHandle.columnInt(4);
-               pMsg->msgType.subType = dbHandle.columnInt(5);
-               pMsg->displayTime = (time_t)dbHandle.columnInt(6);
-               pMsg->dataSize = dbHandle.columnInt(7);
-               pMsg->networkStatus = dbHandle.columnInt(8);
-               pMsg->bRead = dbHandle.columnInt(9);
-               pMsg->bProtected = dbHandle.columnInt(10);
-               pMsg->bBackup = dbHandle.columnInt(11);
-               pMsg->priority = dbHandle.columnInt(12);
-               pMsg->direction= dbHandle.columnInt(13);
-
-               strncpy(pMsg->subject, (char *)dbHandle.columnText(15), MAX_SUBJECT_LEN);
+       if (dbHandle->stepQuery() == MSG_ERR_DB_ROW) {
+               pMsg->msgId = dbHandle->columnInt(0);
+               pMsg->threadId = dbHandle->columnInt(1);
+               pMsg->folderId = dbHandle->columnInt(2);
+               pMsg->storageId = dbHandle->columnInt(3);
+               pMsg->msgType.mainType = dbHandle->columnInt(4);
+               pMsg->msgType.subType = dbHandle->columnInt(5);
+               pMsg->displayTime = (time_t)dbHandle->columnInt(6);
+               pMsg->dataSize = dbHandle->columnInt(7);
+               pMsg->networkStatus = dbHandle->columnInt(8);
+               pMsg->bRead = dbHandle->columnInt(9);
+               pMsg->bProtected = dbHandle->columnInt(10);
+               pMsg->bBackup = dbHandle->columnInt(11);
+               pMsg->priority = dbHandle->columnInt(12);
+               pMsg->direction= dbHandle->columnInt(13);
+
+               strncpy(pMsg->subject, (char *)dbHandle->columnText(15), MAX_SUBJECT_LEN);
 
                /* Temp_File_Handling */
                if (pMsg->msgType.mainType == MSG_SMS_TYPE || pMsg->msgType.subType == MSG_NOTIFICATIONIND_MMS) {
@@ -1680,21 +2016,21 @@ msg_error_t MsgStoGetMessage(msg_message_id_t msgId, MSG_MESSAGE_INFO_S *pMsg, M
                                char msgData[pMsg->dataSize+1];
                                memset(msgData, 0x00, sizeof(msgData));
 
-                               strncpy(msgData, (char *)dbHandle.columnText(16), pMsg->dataSize);
+                               strncpy(msgData, (char *)dbHandle->columnText(16), pMsg->dataSize);
 
                                // Save Message Data into File
-                               char fileName[MAX_COMMON_INFO_SIZE+1];
+                               char fileName[MSG_FILENAME_LEN_MAX+1];
                                memset(fileName, 0x00, sizeof(fileName));
 
                                if (MsgCreateFileName(fileName) == false) {
-                                       dbHandle.finalizeQuery();
+                                       dbHandle->finalizeQuery();
                                        return MSG_ERR_STORAGE_ERROR;
                                }
 
-                               MSG_DEBUG("Save Message Data into file : size[%d] name[%s]\n", pMsg->dataSize, fileName);
+                               MSG_SEC_DEBUG("Save Message Data into file : size[%d] name[%s]\n", pMsg->dataSize, fileName);
 
                                if (MsgWriteIpcFile(fileName, msgData, pMsg->dataSize) == false) {
-                                       dbHandle.finalizeQuery();
+                                       dbHandle->finalizeQuery();
                                        return MSG_ERR_STORAGE_ERROR;
                                }
 
@@ -1703,53 +2039,59 @@ msg_error_t MsgStoGetMessage(msg_message_id_t msgId, MSG_MESSAGE_INFO_S *pMsg, M
                                pMsg->bTextSms = false;
                        } else {
                                memset(pMsg->msgText, 0x00, sizeof(pMsg->msgText));
-                               strncpy(pMsg->msgText, (char *)dbHandle.columnText(16), pMsg->dataSize);
+                               strncpy(pMsg->msgText, (char *)dbHandle->columnText(16), pMsg->dataSize);
 
                                // For WAP PUSH SI Message
                                if (pMsg->msgType.subType == MSG_WAP_SI_SMS) {
                                        strncat(pMsg->msgText, "\n", MAX_MSG_TEXT_LEN-strlen(pMsg->msgText));
                                        strncat(pMsg->msgText, pMsg->subject, MAX_MSG_TEXT_LEN-strlen(pMsg->msgText));
-                                       MSG_DEBUG("pMsg->msgText : [%s]", pMsg->msgText);
+                                       MSG_SEC_DEBUG("pMsg->msgText : [%s]", pMsg->msgText);
                                        pMsg->dataSize = sizeof(pMsg->msgText);
                                }
 
                                pMsg->bTextSms = true;
                        }
                } else {
-                       if (dbHandle.columnText(16) != NULL)
-                               strncpy(pMsg->msgText, (char *)dbHandle.columnText(16), MAX_MSG_TEXT_LEN);
+                       if (dbHandle->columnText(16) != NULL)
+                               strncpy(pMsg->msgText, (char *)dbHandle->columnText(16), MAX_MSG_TEXT_LEN);
                }
 
                // thumbnail path
-               if (dbHandle.columnText(17)!=NULL && ((char *)dbHandle.columnText(17))[0] != '\0') {
-                       strncpy(pMsg->thumbPath, (char *)dbHandle.columnText(17), MSG_FILEPATH_LEN_MAX);
+               if (dbHandle->columnText(17)!= NULL && ((char *)dbHandle->columnText(17))[0] != '\0') {
+                       strncpy(pMsg->thumbPath, (char *)dbHandle->columnText(17), MSG_FILEPATH_LEN_MAX);
                        MSG_DEBUG("pMsg->thumbPath : [%s]", pMsg->thumbPath);
                }
+               pMsg->sim_idx = dbHandle->columnInt(18);
        } else {
-               dbHandle.finalizeQuery();
+               dbHandle->finalizeQuery();
                MSG_DEBUG("%s", sqlQuery);
                return MSG_ERR_DB_STEP;
        }
 
-       dbHandle.finalizeQuery();
+       dbHandle->finalizeQuery();
 
 
        // get address information.
-       MsgStoGetAddressByMsgId(&dbHandle, pMsg->msgId, order, &pMsg->nAddressCnt, pMsg->addressList);
+       //contacts-service is not used for gear
+       //contactNameOrder is never used
+#ifndef MSG_CONTACTS_SERVICE_NOT_SUPPORTED
+       MsgStoGetAddressByMsgId(dbHandle, pMsg->msgId, MsgGetContactNameOrder(), &pMsg->nAddressCnt, &pMsg->addressList);
+#else
+//     MsgStoGetAddressByMsgId(dbHandle, pMsg->msgId, &pMsg->nAddressCnt, &pMsg->addressList);
+#endif //MSG_CONTACTS_SERVICE_NOT_SUPPORTED
 
        // Get MMS body if it is MMS.
        if ((pMsg->networkStatus == MSG_NETWORK_RETRIEVE_SUCCESS &&
-                       (pMsg->msgType.subType == MSG_RETRIEVE_AUTOCONF_MMS || pMsg->msgType.subType == MSG_RETRIEVE_MANUALCONF_MMS)) ||
-                       pMsg->msgType.subType == MSG_SENDREQ_MMS || pMsg->msgType.subType == MSG_SENDCONF_MMS) {
+                       (pMsg->msgType.subType == MSG_RETRIEVE_MMS || pMsg->msgType.subType == MSG_RETRIEVE_AUTOCONF_MMS || pMsg->msgType.subType == MSG_RETRIEVE_MANUALCONF_MMS)) ||
+                       pMsg->msgType.subType == MSG_SENDREQ_MMS || pMsg->msgType.subType == MSG_SENDCONF_MMS || pMsg->msgType.subType == MSG_NOTIFICATIONIND_MMS) {
                msg_error_t err = MSG_SUCCESS;
-               MMS_MESSAGE_DATA_S      mmsMsg;
                char *pDestMsg = NULL;
                int temp_size = pMsg->dataSize;//save raw file size;
+
                // call mms plugin to get mms specific message data
                MsgPlugin *plg = MsgPluginManager::instance()->getPlugin(pMsg->msgType.mainType);
-               memset(&mmsMsg, 0, sizeof(MMS_MESSAGE_DATA_S));
-               err =  plg->getMmsMessage(pMsg, pSendOptInfo, &mmsMsg, &pDestMsg);
 
+               err =  plg->getMmsMessage(pMsg, pSendOptInfo, &pDestMsg);
                if (err != MSG_SUCCESS) {
                        if (pDestMsg) {
                                free(pDestMsg);
@@ -1773,7 +2115,7 @@ msg_error_t MsgStoGetMessage(msg_message_id_t msgId, MSG_MESSAGE_INFO_S *pMsg, M
                                }
                                return MSG_ERR_STORAGE_ERROR;
                        }
-                       MSG_DEBUG("Save Message Data into file : size[%d] name[%s]\n", pMsg->dataSize, tempFileName);
+                       MSG_SEC_DEBUG("Save Message Data into file : size[%d] name[%s]\n", pMsg->dataSize, tempFileName);
 
                        if (MsgWriteIpcFile(tempFileName, pDestMsg, pMsg->dataSize) == false) {
                                if(pDestMsg) {
@@ -1799,134 +2141,44 @@ msg_error_t MsgStoGetMessage(msg_message_id_t msgId, MSG_MESSAGE_INFO_S *pMsg, M
 
        // Get SMS Sending Options
        if (pMsg->msgType.mainType == MSG_SMS_TYPE && pSendOptInfo != NULL)
-               MsgStoGetSmsSendOpt(pMsg->msgId, pSendOptInfo);
+               MsgStoGetSmsSendOpt(pMsg, pSendOptInfo);
 
        return MSG_SUCCESS;
 }
 
-
-msg_error_t MsgStoGetFolderViewList(msg_folder_id_t folderId, const MSG_SORT_RULE_S *pSortRule, msg_struct_list_s *pMsgFolderViewList)
+msg_error_t MsgStoGetFailedMessage(int **failed_msg_list, int *count)
 {
-       if (pMsgFolderViewList == NULL) {
-               MSG_DEBUG("pMsgFolderViewList is NULL");
-               return MSG_ERR_NULL_POINTER;
-       }
-
-       int rowCnt = 0;
-       int index = 19; // numbers of index
-
+       MSG_BEGIN();
 
+       msg_error_t err = MSG_SUCCESS;
        char sqlQuery[MAX_QUERY_LEN+1];
-       char sqlSort[64];
-
-       // Get Name Order
-       int order = MsgGetContactNameOrder();
+       int rowCnt = 0;
+       int index = 1;
+       MsgDbHandler *dbHandle = getDbHandle();
 
-       // Get Message In Folder
        memset(sqlQuery, 0x00, sizeof(sqlQuery));
 
-       if (folderId == MSG_ALLBOX_ID) {
-               snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID, CONV_ID, FOLDER_ID, STORAGE_ID, MAIN_TYPE, SUB_TYPE, \
-                               DISPLAY_TIME, DATA_SIZE, NETWORK_STATUS, READ_STATUS, PROTECTED, BACKUP, PRIORITY, \
-                               MSG_DIRECTION, SCHEDULED_TIME, SUBJECT, MSG_TEXT, ATTACHMENT_COUNT, THUMB_PATH \
-                               FROM %s WHERE FOLDER_ID < %d ",
-                               MSGFW_MESSAGE_TABLE_NAME, MSG_SPAMBOX_ID);
-       } else {
-               snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID, CONV_ID, FOLDER_ID, STORAGE_ID, MAIN_TYPE, SUB_TYPE, \
-                               DISPLAY_TIME, DATA_SIZE, NETWORK_STATUS, READ_STATUS, PROTECTED, BACKUP, PRIORITY, \
-                               MSG_DIRECTION, SCHEDULED_TIME, SUBJECT, MSG_TEXT, ATTACHMENT_COUNT, THUMB_PATH \
-                               FROM %s WHERE FOLDER_ID = %d ",
-                               MSGFW_MESSAGE_TABLE_NAME, folderId);
-       }
-
-       memset(sqlSort, 0x00, sizeof(sqlSort));
-       MsgMakeSortRule(pSortRule, sqlSort);
-       strncat(sqlQuery, sqlSort, strlen(sqlSort));
-
-       msg_error_t  err = dbHandle.getTable(sqlQuery, &rowCnt);
-
-       if (err == MSG_ERR_DB_NORECORD) {
-               pMsgFolderViewList->nCount = 0;
-               pMsgFolderViewList->msg_struct_info = NULL;
-
-               dbHandle.freeTable();
+       snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s WHERE NETWORK_STATUS = %d AND FOLDER_ID = %d;",
+                               MSGFW_MESSAGE_TABLE_NAME, MSG_NETWORK_SEND_PENDING, MSG_OUTBOX_ID);
+       err = dbHandle->getTable(sqlQuery, &rowCnt);
 
+       if(err == MSG_ERR_DB_NORECORD){
+               dbHandle->freeTable();
                return MSG_SUCCESS;
-       } else if (err != MSG_SUCCESS) {
-               MSG_DEBUG("sqlQuery is - %s", sqlQuery);
-               dbHandle.freeTable();
-               return err;
        }
+       *count = rowCnt;
+       int *list = new int[rowCnt];
 
-       pMsgFolderViewList->nCount = rowCnt;
-
-       MSG_DEBUG("pMsgCommInfoList->nCount [%d]", pMsgFolderViewList->nCount);
-
-       pMsgFolderViewList->msg_struct_info = (msg_struct_t *)new char[sizeof(msg_struct_t) * rowCnt];
-
-       msg_struct_s *msg = NULL;
-       MSG_MESSAGE_HIDDEN_S *pTmp = NULL;
-
-       for (int i = 0; i < rowCnt; i++) {
-               pMsgFolderViewList->msg_struct_info[i] = (msg_struct_t)new char[sizeof(msg_struct_s)];;
-
-               msg = (msg_struct_s *)pMsgFolderViewList->msg_struct_info[i];
-
-               msg->type = MSG_STRUCT_MESSAGE_INFO;
-               msg->data = new char[sizeof(MSG_MESSAGE_HIDDEN_S)];
-
-               pTmp = (MSG_MESSAGE_HIDDEN_S *)msg->data;
-
-               pTmp->pData = NULL;
-               pTmp->pMmsData = NULL;
-
-               pTmp->msgId = dbHandle.getColumnToInt(index++);
-               pTmp->threadId = dbHandle.getColumnToInt(index++);
-               pTmp->folderId = dbHandle.getColumnToInt(index++);
-               pTmp->storageId = dbHandle.getColumnToInt(index++);
-               pTmp->mainType = dbHandle.getColumnToInt(index++);
-               pTmp->subType = dbHandle.getColumnToInt(index++);
-               pTmp->displayTime = (time_t)dbHandle.getColumnToInt(index++);
-               pTmp->dataSize = dbHandle.getColumnToInt(index++);
-               pTmp->networkStatus = dbHandle.getColumnToInt(index++);
-               pTmp->bRead = dbHandle.getColumnToInt(index++);
-               pTmp->bProtected = dbHandle.getColumnToInt(index++);
-               pTmp->bBackup = dbHandle.getColumnToInt(index++);
-               pTmp->priority = dbHandle.getColumnToInt(index++);
-               pTmp->direction= dbHandle.getColumnToInt(index++);
-               index++; // This field is reserved.
-
-               dbHandle.getColumnToString(index++, MAX_SUBJECT_LEN, pTmp->subject);
-
-               if (pTmp->mainType == MSG_MMS_TYPE &&
-                       (pTmp->networkStatus == MSG_NETWORK_RETRIEVING || pTmp->networkStatus == MSG_NETWORK_RETRIEVE_FAIL || pTmp->subType == MSG_NOTIFICATIONIND_MMS)) {
-                       pTmp->pData = NULL;
-                       index++;
-               } else {
-                       pTmp->pData = (void *)new char[pTmp->dataSize + 2];
-                       memset(pTmp->pData, 0x00, pTmp->dataSize + 2);
-
-                       dbHandle.getColumnToString(index++, pTmp->dataSize+1, (char *)pTmp->pData);
-               }
-
-               // get address information from db.
-               msg_struct_list_s *addr_list = (msg_struct_list_s *)new msg_struct_list_s;
-
-               MsgStoGetAddressByMsgId(&dbHandle, pTmp->msgId, order, addr_list);
-
-               pTmp->addr_list = addr_list;
-
-               pTmp->attachCount = dbHandle.getColumnToInt(index++);
-
-               dbHandle.getColumnToString(index++, MSG_FILEPATH_LEN_MAX, pTmp->thumbPath);
+       for(int i=0; i<rowCnt; ++i){
+               list[i] = dbHandle->getColumnToInt(index++);
        }
+       *failed_msg_list = list;
+       dbHandle->freeTable();
 
-       dbHandle.freeTable();
-
-       return MSG_SUCCESS;
+       MSG_END();
+       return err;
 }
 
-
 msg_error_t MsgStoAddSyncMLMessage(MSG_MESSAGE_INFO_S *pMsgInfo, int extId, int pinCode)
 {
        MSG_BEGIN();
@@ -1937,24 +2189,25 @@ msg_error_t MsgStoAddSyncMLMessage(MSG_MESSAGE_INFO_S *pMsgInfo, int extId, int
 
        unsigned int rowId = 0;
        msg_thread_id_t convId = 0;
+       MsgDbHandler *dbHandle = getDbHandle();
 
-       dbHandle.beginTrans();
+       dbHandle->beginTrans();
 
        if (pMsgInfo->nAddressCnt > 0) {
-               err = MsgStoAddAddress(&dbHandle, pMsgInfo, &convId);
+               err = MsgStoAddAddress(dbHandle, pMsgInfo, &convId);
 
                if (err != MSG_SUCCESS) {
-                       dbHandle.endTrans(false);
+                       dbHandle->endTrans(false);
                        return err;
                }
        }
 
        // Add Message Table
        pMsgInfo->threadId = convId;
-       rowId = MsgStoAddMessageTable(&dbHandle, pMsgInfo);
+       rowId = MsgStoAddMessageTable(dbHandle, pMsgInfo);
 
        if (rowId <= 0) {
-               dbHandle.endTrans(false);
+               dbHandle->endTrans(false);
                return MSG_ERR_DB_ROW;
        }
 
@@ -1962,31 +2215,22 @@ msg_error_t MsgStoAddSyncMLMessage(MSG_MESSAGE_INFO_S *pMsgInfo, int extId, int
        snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, %d, %d);",
                        MSGFW_SYNCML_MSG_TABLE_NAME, rowId, extId, pinCode);
 
-       if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
-               dbHandle.endTrans(false);
+       if (dbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
+               dbHandle->endTrans(false);
                return MSG_ERR_DB_EXEC;
        }
 
-       if (MsgStoUpdateConversation(&dbHandle, convId) != MSG_SUCCESS) {
-               dbHandle.endTrans(false);
+       if (MsgStoUpdateConversation(dbHandle, convId) != MSG_SUCCESS) {
+               dbHandle->endTrans(false);
                return MSG_ERR_STORAGE_ERROR;
        }
 
-       dbHandle.endTrans(true);
+       dbHandle->endTrans(true);
 
        pMsgInfo->msgId = (msg_message_id_t)rowId;
 
-       MsgSoundPlayStart(false);
-
-       int smsCnt = 0;
-       int mmsCnt = 0;
-
-       smsCnt = MsgStoGetUnreadCnt(&dbHandle, MSG_SMS_TYPE);
-       mmsCnt = MsgStoGetUnreadCnt(&dbHandle, MSG_MMS_TYPE);
-
-       MsgSettingHandleNewMsg(smsCnt, mmsCnt);
-
-       MsgInsertNoti(&dbHandle, pMsgInfo);
+       MsgInsertNotification(pMsgInfo);
+       MsgChangePmState();
 
        MSG_END();
 
@@ -1996,6 +2240,7 @@ msg_error_t MsgStoAddSyncMLMessage(MSG_MESSAGE_INFO_S *pMsgInfo, int extId, int
 
 msg_error_t MsgStoGetMsgType(msg_message_id_t msgId, MSG_MESSAGE_TYPE_S *pMsgType)
 {
+       MsgDbHandler *dbHandle = getDbHandle();
        char sqlQuery[MAX_QUERY_LEN+1];
 
        memset(sqlQuery, 0x00, sizeof(sqlQuery));
@@ -2003,15 +2248,15 @@ msg_error_t MsgStoGetMsgType(msg_message_id_t msgId, MSG_MESSAGE_TYPE_S *pMsgTyp
        snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MAIN_TYPE, SUB_TYPE FROM %s WHERE MSG_ID = %d;",
                        MSGFW_MESSAGE_TABLE_NAME, msgId);
 
-       if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
+       if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
                return MSG_ERR_DB_PREPARE;
 
-       if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
-               pMsgType->mainType = dbHandle.columnInt(0);
-               pMsgType->subType = dbHandle.columnInt(1);
+       if (dbHandle->stepQuery() == MSG_ERR_DB_ROW) {
+               pMsgType->mainType = dbHandle->columnInt(0);
+               pMsgType->subType = dbHandle->columnInt(1);
        }
 
-       dbHandle.finalizeQuery();
+       dbHandle->finalizeQuery();
 
        return MSG_SUCCESS;
 }
@@ -2021,6 +2266,7 @@ msg_error_t MsgStoGetQuickPanelData(msg_quickpanel_type_t QPtype, MSG_MESSAGE_IN
 {
        msg_error_t     err = MSG_SUCCESS;
 
+       MsgDbHandler *dbHandle = getDbHandle();
        char sqlQuery[MAX_QUERY_LEN+1];
 
        memset(sqlQuery, 0x00, sizeof(sqlQuery));
@@ -2048,17 +2294,17 @@ msg_error_t MsgStoGetQuickPanelData(msg_quickpanel_type_t QPtype, MSG_MESSAGE_IN
        // Get Message ID
        msg_message_id_t msgId;
 
-       if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
+       if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
                return MSG_ERR_DB_PREPARE;
 
-       if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
-               msgId = dbHandle.columnInt(0);
+       if (dbHandle->stepQuery() == MSG_ERR_DB_ROW) {
+               msgId = dbHandle->columnInt(0);
        } else {
-               dbHandle.finalizeQuery();
+               dbHandle->finalizeQuery();
                return MSG_ERR_DB_STEP;
        }
 
-       dbHandle.finalizeQuery();
+       dbHandle->finalizeQuery();
 
        // Get Message Info
        err = MsgStoGetMessage(msgId, pMsg, NULL);
@@ -2067,1239 +2313,295 @@ msg_error_t MsgStoGetQuickPanelData(msg_quickpanel_type_t QPtype, MSG_MESSAGE_IN
 }
 
 
-msg_error_t MsgStoGetThreadViewList(const MSG_SORT_RULE_S *pSortRule, msg_struct_list_s *pThreadViewList)
+msg_error_t MsgStoDeleteThreadMessageList(msg_thread_id_t threadId, bool bIncludeProtect, msg_id_list_s *pMsgIdList)
 {
-       pThreadViewList->nCount = 0;
-       pThreadViewList->msg_struct_info = NULL;
+       msg_error_t err = MSG_SUCCESS;
 
+       MsgDbHandler *dbHandle = getDbHandle();
+       char sqlQuery[MAX_QUERY_LEN+1];
+
+       /*** Get msg id list **/
        int rowCnt = 0;
-       int index = 11; // numbers of index
+       int index = 1;
 
-       char sqlQuery[MAX_QUERY_LEN+1];
        memset(sqlQuery, 0x00, sizeof(sqlQuery));
 
-       snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.CONV_ID, A.UNREAD_CNT, A.SMS_CNT, A.MMS_CNT, \
-                       A.MAIN_TYPE, A.SUB_TYPE, A.MSG_DIRECTION, A.DISPLAY_TIME, A.DISPLAY_NAME, A.MSG_TEXT, \
-                       (SELECT COUNT(*) FROM %s B WHERE B.CONV_ID = A.CONV_ID AND B.PROTECTED = 1) AS PROTECTED \
-                       FROM %s A WHERE A.SMS_CNT > 0 OR A.MMS_CNT > 0 ORDER BY A.DISPLAY_TIME DESC;",
-                       MSGFW_MESSAGE_TABLE_NAME, MSGFW_CONVERSATION_TABLE_NAME);
+#ifdef MSG_NOTI_INTEGRATION
+       if (bIncludeProtect) {
+               snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s WHERE \
+                               CONV_ID = %d AND FOLDER_ID > %d AND FOLDER_ID < %d AND STORAGE_ID = %d;",
+                               MSGFW_MESSAGE_TABLE_NAME, threadId, MSG_ALLBOX_ID, MSG_SPAMBOX_ID, MSG_STORAGE_PHONE);
+       } else {
+               snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s WHERE \
+                               CONV_ID = %d AND FOLDER_ID > %d AND FOLDER_ID < %d AND STORAGE_ID = %d AND PROTECTED = 0;",
+                               MSGFW_MESSAGE_TABLE_NAME, threadId, MSG_ALLBOX_ID, MSG_SPAMBOX_ID, MSG_STORAGE_PHONE);
+       }
+#else
+       if (bIncludeProtect) {
+               snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s WHERE \
+                               CONV_ID = %d AND FOLDER_ID > %d AND FOLDER_ID < %d AND STORAGE_ID = %d;",
+                               MSGFW_MESSAGE_TABLE_NAME, threadId, MSG_ALLBOX_ID, MSG_CBMSGBOX_ID, MSG_STORAGE_PHONE);
+       } else {
+               snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s WHERE \
+                               CONV_ID = %d AND FOLDER_ID > %d AND FOLDER_ID < %d AND STORAGE_ID = %d AND PROTECTED = 0;",
+                               MSGFW_MESSAGE_TABLE_NAME, threadId, MSG_ALLBOX_ID, MSG_CBMSGBOX_ID, MSG_STORAGE_PHONE);
+       }
+#endif
 
-       msg_error_t  err = dbHandle.getTable(sqlQuery, &rowCnt);
+       err = dbHandle->getTable(sqlQuery, &rowCnt);
 
-       if (err == MSG_ERR_DB_NORECORD) {
-               dbHandle.freeTable();
-               return MSG_SUCCESS;
-       } else if (err != MSG_SUCCESS) {
-               MSG_DEBUG("%s", sqlQuery);
-               dbHandle.freeTable();
+       if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
+               MSG_DEBUG("Fail to getTable().");
+               dbHandle->freeTable();
                return err;
        }
 
-       if (rowCnt < 1) {
-               MSG_DEBUG("rowCnt is %d", rowCnt);
-               dbHandle.freeTable();
-               return err;
+       if (rowCnt <= 0) {
+//             dbHandle->freeTable();
+               err = MSG_SUCCESS;
        }
 
-       pThreadViewList->nCount = rowCnt;
-
-       MSG_DEBUG("pThreadViewList->nCount [%d]", pThreadViewList->nCount);
+       pMsgIdList->nCount = rowCnt;
 
-       pThreadViewList->msg_struct_info = (msg_struct_t *)new char[sizeof(msg_struct_t)*rowCnt];
+       MSG_DEBUG("pMsgIdList->nCount [%d]", pMsgIdList->nCount);
 
-       MSG_THREAD_VIEW_S *pTmp = NULL;
-       msg_struct_s *thread_t = NULL;
+       pMsgIdList->msgIdList = (msg_message_id_t *)new char[sizeof(msg_message_id_t) * rowCnt];
 
-       for (int i = 0; i < rowCnt; i++) {
-               thread_t = (msg_struct_s *)new msg_struct_s;
-               pThreadViewList->msg_struct_info[i] = (msg_struct_t)thread_t;
+       for (int i = 0; i < rowCnt; i++)
+               pMsgIdList->msgIdList[i] = dbHandle->getColumnToInt(index++);
 
-               thread_t->type = MSG_STRUCT_THREAD_INFO;
-               thread_t->data = new MSG_THREAD_VIEW_S;
+       dbHandle->freeTable();
+       /*** **/
 
-               pTmp = (MSG_THREAD_VIEW_S *)thread_t->data;
-               memset(pTmp, 0x00, sizeof(MSG_THREAD_VIEW_S));
+       err = MsgStoDeleteMessageByList(pMsgIdList);
 
-               pTmp->threadId = dbHandle.getColumnToInt(index++);
+       return err;
+}
 
-               pTmp->unreadCnt = dbHandle.getColumnToInt(index++);
-               pTmp->smsCnt = dbHandle.getColumnToInt(index++);
-               pTmp->mmsCnt = dbHandle.getColumnToInt(index++);
 
-               pTmp->mainType = dbHandle.getColumnToInt(index++);
-               pTmp->subType = dbHandle.getColumnToInt(index++);
+msg_error_t MsgStoCountMsgByContact(const MSG_THREAD_LIST_INDEX_S *pAddrInfo, MSG_THREAD_COUNT_INFO_S *pThreadCountInfo)
+{
+       MsgDbHandler *dbHandle = getDbHandle();
+       char sqlQuery[MAX_QUERY_LEN+1];
 
-               pTmp->direction = dbHandle.getColumnToInt(index++);
-               pTmp->threadTime = (time_t)dbHandle.getColumnToInt(index++);
+       memset(sqlQuery, 0x00, sizeof(sqlQuery));
 
-               memset(pTmp->threadName, 0x00, sizeof(pTmp->threadName));
-               dbHandle.getColumnToString(index++, MAX_THREAD_NAME_LEN, pTmp->threadName);
+       if (pAddrInfo->contactId > 0) {
+               snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(*) AS TOTAL, \
+                               SUM(CASE WHEN READ_STATUS=0 AND FOLDER_ID=%d THEN 1 ELSE 0 END), \
+                               SUM(CASE WHEN MAIN_TYPE=%d THEN 1 ELSE 0 END), \
+                               SUM(CASE WHEN MAIN_TYPE=%d THEN 1 ELSE 0 END) \
+                               FROM (SELECT * FROM %s A  JOIN %s B ON A.CONV_ID = B.CONV_ID WHERE B.CONTACT_ID = %d)",
+                               MSG_INBOX_ID, MSG_SMS_TYPE, MSG_MMS_TYPE, MSGFW_MESSAGE_TABLE_NAME, MSGFW_ADDRESS_TABLE_NAME, pAddrInfo->contactId);
+       } else {
+               snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(*) AS TOTAL, \
+                               SUM(CASE WHEN READ_STATUS=0 AND FOLDER_ID=%d THEN 1 ELSE 0 END), \
+                               SUM(CASE WHEN MAIN_TYPE=%d THEN 1 ELSE 0 END), \
+                               SUM(CASE WHEN MAIN_TYPE=%d THEN 1 ELSE 0 END) \
+                               FROM (SELECT * FROM %s A  JOIN %s B ON A.CONV_ID = B.CONV_ID WHERE B.ADDRESS_VAL = '%s')",
+                               MSG_INBOX_ID, MSG_SMS_TYPE, MSG_MMS_TYPE, MSGFW_MESSAGE_TABLE_NAME, MSGFW_ADDRESS_TABLE_NAME, pAddrInfo->msgAddrInfo.addressVal);
+       }
 
-               memset(pTmp->threadData, 0x00, sizeof(pTmp->threadData));
-               dbHandle.getColumnToString(index++, MAX_THREAD_DATA_LEN, pTmp->threadData);
+       if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
+               return MSG_ERR_DB_PREPARE;
 
-               int protectedCnt = dbHandle.getColumnToInt(index++);
-               if (protectedCnt > 0)
-                       pTmp->bProtected = true;
+       if (dbHandle->stepQuery() == MSG_ERR_DB_ROW) {
+               pThreadCountInfo->totalCount = dbHandle->columnInt(0);
+               pThreadCountInfo->unReadCount = dbHandle->columnInt(1);
+               pThreadCountInfo->smsMsgCount = dbHandle->columnInt(2);
+               pThreadCountInfo->mmsMsgCount = dbHandle->columnInt(3);
+       } else {
+               dbHandle->finalizeQuery();
+               return MSG_ERR_DB_STEP;
        }
 
-       dbHandle.freeTable();
+       dbHandle->finalizeQuery();
 
        return MSG_SUCCESS;
 }
 
-msg_error_t MsgStoGetConversationPreview(MSG_CONVERSATION_VIEW_S *pConv)
+
+msg_error_t MsgStoGetSyncMLExtId(msg_message_id_t msgId, int *extId)
 {
-       MsgDbHandler dbHandleForInner;
-       char sqlQuery[MAX_QUERY_LEN + 1];
-       int rowCnt;
-       int index = 3;
-       memset(sqlQuery, 0x00, sizeof(sqlQuery));
+       MsgDbHandler *dbHandle = getDbHandle();
+       char sqlQuery[MAX_QUERY_LEN+1];
 
-       if (pConv == NULL)
-               return MSG_ERR_NULL_POINTER;
+       memset(sqlQuery, 0x00, sizeof(sqlQuery));
 
-       //(MSG_ID INTEGER, TYPE INTEGER, VALUE TEXT, COUNT INTEGER)
-       snprintf(sqlQuery, sizeof(sqlQuery),
-                       "SELECT TYPE, VALUE, COUNT "
-                       "FROM %s WHERE MSG_ID=%d;",
-                       MSGFW_MMS_PREVIEW_TABLE_NAME, pConv->msgId);
+       snprintf(sqlQuery, sizeof(sqlQuery), "SELECT EXT_ID FROM %s WHERE MSG_ID = %d;",
+                       MSGFW_SYNCML_MSG_TABLE_NAME, msgId);
 
-       MSG_DEBUG("QUERY : [%s]", sqlQuery);
+       if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
+               return MSG_ERR_DB_PREPARE;
 
-       msg_error_t err = dbHandleForInner.getTable(sqlQuery, &rowCnt);
-       if (err == MSG_SUCCESS) {
-               for (int i = 0; i < rowCnt; i++) {
-                       int type = dbHandleForInner.getColumnToInt(index++);
-                       if (type == MSG_MMS_ITEM_TYPE_IMG) {
-                               dbHandleForInner.getColumnToString(index++, MSG_FILEPATH_LEN_MAX, pConv->imageThumbPath);
-                               dbHandleForInner.getColumnToInt(index++);
-                       } else if (type == MSG_MMS_ITEM_TYPE_VIDEO) {
-                               dbHandleForInner.getColumnToString(index++, MSG_FILEPATH_LEN_MAX, pConv->videoThumbPath);
-                               dbHandleForInner.getColumnToInt(index++);
-                       } else if (type == MSG_MMS_ITEM_TYPE_AUDIO) {
-                               dbHandleForInner.getColumnToString(index++, MSG_FILENAME_LEN_MAX, pConv->audioFileName);
-                               dbHandleForInner.getColumnToInt(index++);
-                       } else if (type == MSG_MMS_ITEM_TYPE_ATTACH) {
-                               dbHandleForInner.getColumnToString(index++, MSG_FILENAME_LEN_MAX, pConv->attachFileName);
-                               dbHandleForInner.getColumnToInt(index++);
-                       } else if (type == MSG_MMS_ITEM_TYPE_PAGE) {
-                               index++;
-                               pConv->pageCount = dbHandleForInner.getColumnToInt(index++);
-                       } else {
-                               MSG_DEBUG("Unknown item type [%d]", type);
-                               index+=2;
-                       }
-               }
+       if (dbHandle->stepQuery() == MSG_ERR_DB_ROW) {
+               *extId = dbHandle->columnInt(0);
+       } else {
+               dbHandle->finalizeQuery();
+               return MSG_ERR_DB_STEP;
        }
 
-       dbHandleForInner.freeTable();
+       dbHandle->finalizeQuery();
+
        return MSG_SUCCESS;
 }
 
-msg_error_t MsgStoGetConversationViewItem(msg_message_id_t msgId, MSG_CONVERSATION_VIEW_S *pConv)
+
+msg_error_t MsgStoGetSmsReportStatus(msg_message_id_t msgId, int *count, MSG_REPORT_STATUS_INFO_S **pReportStatus)
 {
-       int rowCnt = 0;
-       int index = 16; /** numbers of index */
+       MsgDbHandler *dbHandle = getDbHandle();
        char sqlQuery[MAX_QUERY_LEN+1];
+       msg_error_t err = MSG_SUCCESS;
 
        memset(sqlQuery, 0x00, sizeof(sqlQuery));
+       snprintf(sqlQuery, sizeof(sqlQuery),
+                       "SELECT ADDRESS_VAL, STATUS_TYPE, STATUS, TIME "
+                       "FROM %s "
+                       "WHERE MSG_ID = %d "
+                       "order by TIME ASC;"
+                       , MSGFW_SMS_REPORT_TABLE_NAME, msgId);
 
-       snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID, CONV_ID, FOLDER_ID, STORAGE_ID, MAIN_TYPE, SUB_TYPE, \
-                       DISPLAY_TIME, DATA_SIZE, NETWORK_STATUS, READ_STATUS, PROTECTED, \
-                       MSG_DIRECTION, SCHEDULED_TIME, SUBJECT, MSG_TEXT, ATTACHMENT_COUNT \
-                       FROM %s WHERE MSG_ID=%d;",
-                       MSGFW_MESSAGE_TABLE_NAME, msgId);
+       int rowCnt;
+       err = dbHandle->getTable(sqlQuery, &rowCnt);
 
-       msg_error_t err = dbHandle.getTable(sqlQuery, &rowCnt);
+       if (err != MSG_SUCCESS) {
+               MSG_DEBUG("Fail to getTable().");
+               dbHandle->freeTable();
+               return err;
+       }
 
-       if (err == MSG_ERR_DB_NORECORD) {
-               dbHandle.freeTable();
-               return MSG_SUCCESS;
-       } else if (err != MSG_SUCCESS) {
-               MSG_DEBUG("%s", sqlQuery);
-               dbHandle.freeTable();
-               return err;
-       }
-
-       memset(pConv, 0x00, sizeof(MSG_CONVERSATION_VIEW_S));
-       pConv->pText = NULL;
-
-       pConv->msgId = dbHandle.getColumnToInt(index++);
-       pConv->threadId = dbHandle.getColumnToInt(index++);
-       pConv->folderId = dbHandle.getColumnToInt(index++);
-       pConv->storageId = dbHandle.getColumnToInt(index++);
-       pConv->mainType = dbHandle.getColumnToInt(index++);
-       pConv->subType = dbHandle.getColumnToInt(index++);
-       pConv->displayTime = (time_t)dbHandle.getColumnToInt(index++);
-       pConv->textSize = dbHandle.getColumnToInt(index++);
-       pConv->networkStatus = dbHandle.getColumnToInt(index++);
-       pConv->bRead = dbHandle.getColumnToInt(index++);
-       pConv->bProtected = dbHandle.getColumnToInt(index++);
-       pConv->direction = dbHandle.getColumnToInt(index++);
-       pConv->scheduledTime = (time_t)dbHandle.getColumnToInt(index++);
-
-       dbHandle.getColumnToString(index++, MAX_SUBJECT_LEN, pConv->subject);
-
-       if (pConv->mainType == MSG_MMS_TYPE &&
-               (pConv->networkStatus == MSG_NETWORK_RETRIEVING || pConv->networkStatus == MSG_NETWORK_RETRIEVE_FAIL || pConv->subType == MSG_NOTIFICATIONIND_MMS)) {
-               pConv->pText = NULL;
-               pConv->textSize = 0;
-               index++;
-       } else {
-               if (pConv->mainType == MSG_SMS_TYPE) {
-                       pConv->pText = new char[pConv->textSize+2];
-                       memset(pConv->pText, 0x00, pConv->textSize+2);
-                       dbHandle.getColumnToString(index++, pConv->textSize+1, pConv->pText);
-               } else {
-                       char tmpMmsText[MAX_MMS_TEXT_LEN+1];
-                       memset(tmpMmsText, 0x00, MAX_MMS_TEXT_LEN+1);
-
-                       dbHandle.getColumnToString(index++, MAX_MMS_TEXT_LEN, tmpMmsText);
-
-                       pConv->textSize = strlen(tmpMmsText);
-
-                       pConv->pText = new char[pConv->textSize+2];
-                       memset(pConv->pText, 0x00, pConv->textSize+2);
-
-                       strncpy(pConv->pText, tmpMmsText, pConv->textSize+1);
-
-                       MsgStoGetConversationPreview(pConv);
-               }
-       }
-
-       pConv->attachCount = dbHandle.getColumnToInt(index++);
-
-       MSG_END();
-
-       return MSG_SUCCESS;
-}
-
-msg_error_t MsgStoGetConversationViewList(msg_thread_id_t threadId, msg_struct_list_s *pConvViewList)
-{
-       MSG_BEGIN();
-
-       pConvViewList->nCount = 0;
-       pConvViewList->msg_struct_info = NULL;
-
-       int rowCnt = 0;
-       int index = 16; /** numbers of index */
-       char sqlQuery[MAX_QUERY_LEN+1];
-
-       memset(sqlQuery, 0x00, sizeof(sqlQuery));
-
-       snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID, CONV_ID, FOLDER_ID, STORAGE_ID, MAIN_TYPE, SUB_TYPE, \
-                       DISPLAY_TIME, DATA_SIZE, NETWORK_STATUS, READ_STATUS, PROTECTED, \
-                       MSG_DIRECTION, SCHEDULED_TIME, SUBJECT, MSG_TEXT, ATTACHMENT_COUNT \
-                       FROM %s WHERE CONV_ID = %d AND FOLDER_ID > %d AND FOLDER_ID < %d AND STORAGE_ID = %d ORDER BY DISPLAY_TIME, MSG_ID ASC;",
-                       MSGFW_MESSAGE_TABLE_NAME, threadId, MSG_ALLBOX_ID, MSG_CBMSGBOX_ID, MSG_STORAGE_PHONE);
-
-       msg_error_t err = dbHandle.getTable(sqlQuery, &rowCnt);
-
-       if (err == MSG_ERR_DB_NORECORD) {
-               dbHandle.freeTable();
-               return MSG_SUCCESS;
-       } else if (err != MSG_SUCCESS) {
-               MSG_DEBUG("%s", sqlQuery);
-               dbHandle.freeTable();
-               return err;
-       }
-
-       pConvViewList->nCount = rowCnt;
-
-       MSG_DEBUG("pConvViewList->nCount [%d]", pConvViewList->nCount);
-
-       pConvViewList->msg_struct_info = (msg_struct_t *)new char[sizeof(msg_struct_t) * rowCnt];
-       memset(pConvViewList->msg_struct_info, 0x00, sizeof(msg_struct_t) * rowCnt);
-
-       msg_struct_s *conv = NULL;
-       MSG_CONVERSATION_VIEW_S *pTmp = NULL;
-
-       for (int i = 0; i < rowCnt; i++) {
-               pConvViewList->msg_struct_info[i] = (msg_struct_t)new char[sizeof(msg_struct_s)];;
-               memset(pConvViewList->msg_struct_info[i], 0x00, sizeof(msg_struct_s));
-
-               conv = (msg_struct_s *)pConvViewList->msg_struct_info[i];
-
-               conv->type = MSG_STRUCT_CONV_INFO;
-               conv->data = new char[sizeof(MSG_CONVERSATION_VIEW_S)];
-               memset(conv->data, 0x00, sizeof(MSG_CONVERSATION_VIEW_S));
-
-               pTmp = (MSG_CONVERSATION_VIEW_S *)conv->data;
-
-               pTmp->pText = NULL;
-
-               pTmp->msgId = dbHandle.getColumnToInt(index++);
-               pTmp->threadId = dbHandle.getColumnToInt(index++);
-               pTmp->folderId = dbHandle.getColumnToInt(index++);
-               pTmp->storageId = dbHandle.getColumnToInt(index++);
-               pTmp->mainType = dbHandle.getColumnToInt(index++);
-               pTmp->subType = dbHandle.getColumnToInt(index++);
-               pTmp->displayTime = (time_t)dbHandle.getColumnToInt(index++);
-               pTmp->textSize = dbHandle.getColumnToInt(index++);
-               pTmp->networkStatus = dbHandle.getColumnToInt(index++);
-               pTmp->bRead = dbHandle.getColumnToInt(index++);
-               pTmp->bProtected = dbHandle.getColumnToInt(index++);
-               pTmp->direction = dbHandle.getColumnToInt(index++);
-               index++; // This field is reserved.
-
-               dbHandle.getColumnToString(index++, MAX_SUBJECT_LEN, pTmp->subject);
-
-               if (pTmp->mainType == MSG_MMS_TYPE &&
-                       (pTmp->networkStatus == MSG_NETWORK_RETRIEVING || pTmp->networkStatus == MSG_NETWORK_RETRIEVE_FAIL || pTmp->subType == MSG_NOTIFICATIONIND_MMS)) {
-                       pTmp->pText = NULL;
-                       pTmp->textSize = 0;
-                       index++;
-               } else {
-                       if (pTmp->mainType == MSG_SMS_TYPE) {
-                               pTmp->pText = new char[pTmp->textSize+2];
-                               memset(pTmp->pText, 0x00, pTmp->textSize+2);
-                               dbHandle.getColumnToString(index++, pTmp->textSize+1, pTmp->pText);
-                       } else {
-                               char tmpMmsText[MAX_MMS_TEXT_LEN+1];
-                               memset(tmpMmsText, 0x00, MAX_MMS_TEXT_LEN+1);
-
-                               dbHandle.getColumnToString(index++, MAX_MMS_TEXT_LEN, tmpMmsText);
-
-                               pTmp->textSize = strlen(tmpMmsText);
-
-                               pTmp->pText = new char[pTmp->textSize+2];
-                               memset(pTmp->pText, 0x00, pTmp->textSize+2);
-
-                               strncpy(pTmp->pText, tmpMmsText, pTmp->textSize+1);
-                       }
-               }
-
-               pTmp->attachCount = dbHandle.getColumnToInt(index++);
-
-               MsgStoGetConversationPreview(pTmp);
-       }
-
-       dbHandle.freeTable();
-
-       MSG_END();
-
-       return MSG_SUCCESS;
-}
-
-
-msg_error_t MsgStoDeleteThreadMessageList(msg_thread_id_t threadId, bool bIncludeProtect, msg_id_list_s *pMsgIdList)
-{
-       msg_error_t err = MSG_SUCCESS;
-
-#if 1
-       char sqlQuery[MAX_QUERY_LEN+1];
-
-       /*** Get msg id list **/
-       int rowCnt = 0;
-       int index = 1;
-
-       memset(sqlQuery, 0x00, sizeof(sqlQuery));
-
-       if (bIncludeProtect) {
-               snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s WHERE \
-                               CONV_ID = %d AND FOLDER_ID > %d AND FOLDER_ID < %d AND STORAGE_ID = %d;",
-                               MSGFW_MESSAGE_TABLE_NAME, threadId, MSG_ALLBOX_ID, MSG_CBMSGBOX_ID, MSG_STORAGE_PHONE);
-       } else {
-               snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s WHERE \
-                               CONV_ID = %d AND FOLDER_ID > %d AND FOLDER_ID < %d AND STORAGE_ID = %d AND PROTECTED = 0;",
-                               MSGFW_MESSAGE_TABLE_NAME, threadId, MSG_ALLBOX_ID, MSG_CBMSGBOX_ID, MSG_STORAGE_PHONE);
-       }
-
-       err = dbHandle.getTable(sqlQuery, &rowCnt);
-
-       if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
-               MSG_DEBUG("sqlQuery [%s]", sqlQuery);
-               dbHandle.freeTable();
-       }
-
-       if (rowCnt <= 0) {
-               dbHandle.freeTable();
-               err = MSG_SUCCESS;
-       }
-
-       pMsgIdList->nCount = rowCnt;
-
-       MSG_DEBUG("pMsgIdList->nCount [%d]", pMsgIdList->nCount);
-
-       pMsgIdList->msgIdList = (msg_message_id_t *)new char[sizeof(msg_message_id_t) * rowCnt];
-
-       for (int i = 0; i < rowCnt; i++)
-               pMsgIdList->msgIdList[i] = dbHandle.getColumnToInt(index++);
-
-       dbHandle.freeTable();
-       /*** **/
-
-       err = MsgStoDeleteMessageByList(pMsgIdList);
-
-#else
-       char sqlQuery[MAX_QUERY_LEN+1];
-       /*** Get msg id list **/
-       msg_id_list_s *pToDeleteMsgIdList = NULL;
-
-       int rowCnt = 0;
-       int index = 1;
-       // Set Indicator
-       int smsCnt = 0;
-       int mmsCnt = 0;
-
-       const char *tableList[] = {MSGFW_PUSH_MSG_TABLE_NAME, MSGFW_CB_MSG_TABLE_NAME,
-                       MSGFW_SYNCML_MSG_TABLE_NAME, MSGFW_SMS_SENDOPT_TABLE_NAME,
-                       MMS_PLUGIN_MESSAGE_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME};
-
-       int listCnt = sizeof(tableList)/sizeof(char *);
-
-       pToDeleteMsgIdList = (msg_id_list_s *)new char[sizeof(msg_id_list_s)];
-       memset(pToDeleteMsgIdList, 0x00, sizeof(msg_id_list_s));
-
-       memset(sqlQuery, 0x00, sizeof(sqlQuery));
-       snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s WHERE CONV_ID = %d;", MSGFW_MESSAGE_TABLE_NAME, threadId);
-
-       err = dbHandle.getTable(sqlQuery, &rowCnt);
-
-       if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
-               MSG_DEBUG("sqlQuery [%s]", sqlQuery);
-
-               dbHandle.freeTable();
-
-               goto FREE_MEMORY;
-       }
-
-       if (rowCnt <= 0) {
-               dbHandle.freeTable();
-               err = MSG_SUCCESS;
-
-               goto FREE_MEMORY;
-       }
-
-       pToDeleteMsgIdList->nCount = rowCnt;
-
-       MSG_DEBUG("pToDeleteMsgIdList->nCount [%d]", pToDeleteMsgIdList->nCount);
-
-       pToDeleteMsgIdList->msgIdList = (msg_message_id_t *)new char[sizeof(msg_message_id_t) * rowCnt];
-
-       for (int i = 0; i < rowCnt; i++)
-               pToDeleteMsgIdList->msgIdList[i] = dbHandle.getColumnToInt(index++);
-
-       dbHandle.freeTable();
-       /*** **/
-
-       /*** Delete Sim Message **/
-       memset(sqlQuery, 0x00, sizeof(sqlQuery));
-
-       snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s WHERE CONV_ID = %d AND STORAGE_ID = %d",
-                       MSGFW_MESSAGE_TABLE_NAME, threadId, MSG_STORAGE_SIM);
-
-       rowCnt = 0;
-
-       err = dbHandle.getTable(sqlQuery, &rowCnt);
-
-       if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
-               MSG_DEBUG("sqlQuery [%s]", sqlQuery);
-
-               dbHandle.freeTable();
-
-               goto FREE_MEMORY;
-       }
-
-       for (int i = 1; i <= rowCnt; i++) {
-               err = MsgStoDeleteMessage(dbHandle.getColumnToInt(i), false);
-
-               if (err != MSG_SUCCESS) {
-                       MSG_DEBUG("MsgStoDeleteMessage() Error!!!");
-
-                       dbHandle.freeTable();
-
-                       goto FREE_MEMORY;
-               }
-       }
-
-       dbHandle.freeTable();
-       /*** **/
-
-       dbHandle.beginTrans();
-
-       for (int i = 0; i < listCnt; i++) {
-               if (!strcmp(tableList[i], MMS_PLUGIN_MESSAGE_TABLE_NAME)) {
-
-                       int rowCnt = 0;
-
-                       //get mms msg id list
-                       memset(sqlQuery, 0x00, sizeof(sqlQuery));
-                       snprintf(sqlQuery, sizeof(sqlQuery), "SELECT FILE_PATH FROM %s A, %s B\
-                                       WHERE A.CONV_ID = %d AND A.MAIN_TYPE = %d AND A.MSG_ID = B.MSG_ID;",
-                                       MSGFW_MESSAGE_TABLE_NAME, MMS_PLUGIN_MESSAGE_TABLE_NAME, threadId, MSG_MMS_TYPE);
-
-                       err = dbHandle.getTable(sqlQuery, &rowCnt);
-                       MSG_DEBUG("rowCnt %d", rowCnt);
-
-                       if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
-                               MSG_DEBUG("sqlQuery [%s]", sqlQuery);
-
-                               dbHandle.freeTable();
-                               dbHandle.endTrans(false);
-
-                               goto FREE_MEMORY;
-                       }
-
-                       for (int i = 1; i <= rowCnt; i++) {
-
-                               char filePath[MSG_FILEPATH_LEN_MAX] = {0,};
-                               char dirPath[MSG_FILEPATH_LEN_MAX] = {0,};
-                               char thumbnailPath[MSG_FILEPATH_LEN_MAX] = {0,};
-
-                               dbHandle.getColumnToString(i, MSG_FILEPATH_LEN_MAX, filePath);
-
-                               MSG_DEBUG("filePath [%s]", filePath);
-
-                               //delete raw file
-                               snprintf(dirPath, sizeof(dirPath), "%s.dir", filePath);
-
-                               if (remove(filePath) == -1)
-                                       MSG_DEBUG("Fail to delete file [%s]", filePath);
-                               else
-                                       MSG_DEBUG("Success to delete file [%s]", filePath);
-
-                               MsgRmRf(dirPath);
-
-                               // remove directory also
-                               rmdir(dirPath);
-
-                               // delete thumbnail
-                               char *fileName = NULL;
-                               fileName = strrchr(filePath, '/');
-
-                               snprintf(thumbnailPath, sizeof(thumbnailPath), MSG_THUMBNAIL_PATH"%s.jpg", fileName+1);
-
-                               if (remove(thumbnailPath) == -1)
-                                       MSG_DEBUG("Fail to delete thumbnail [%s]", thumbnailPath);
-                               else
-                                       MSG_DEBUG("Success to delete thumbnail [%s]", thumbnailPath);
-                       }
-
-                       dbHandle.freeTable();
-               }
-
-               memset(sqlQuery, 0x00, sizeof(sqlQuery));
-               snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE MSG_ID IN \
-                               (SELECT MSG_ID FROM %s WHERE CONV_ID = %d);",
-                               tableList[i], MSGFW_MESSAGE_TABLE_NAME, threadId);
-
-               // Delete Message in specific folder from table
-               if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS) {
-                       MSG_DEBUG("sqlQuery [%s]", sqlQuery);
-                       dbHandle.endTrans(false);
-                       err = MSG_ERR_DB_EXEC;
-
-                       goto FREE_MEMORY;
-               }
-       }
-
-       // Clear Conversation table
-       if (MsgStoClearConversationTable(&dbHandle) != MSG_SUCCESS) {
-               dbHandle.endTrans(false);
-               err = MSG_ERR_DB_EXEC;
-
-               goto FREE_MEMORY;
-       }
-
-       dbHandle.endTrans(true);
-
-       MSG_MESSAGE_TYPE_S msgType;
-
-       msgType.mainType = MSG_SMS_TYPE;
-       msgType.subType = MSG_NORMAL_SMS;
-       msgType.classType = MSG_CLASS_NONE;
-
-       // Set memory status in SIM
-       if (MsgStoCheckMsgCntFull(&dbHandle, &msgType, MSG_INBOX_ID) == MSG_SUCCESS) {
-               MSG_DEBUG("Set Memory Status");
-
-               MsgPlugin *plg = MsgPluginManager::instance()->getPlugin(MSG_SMS_TYPE);
-
-               if (plg == NULL) {
-                       MSG_DEBUG("SMS Plug-in is NULL");
-                       err = MSG_ERR_NULL_POINTER;
-
-                       goto FREE_MEMORY;
-               }
-
-               plg->setMemoryStatus(MSG_SUCCESS);
-       }
-
-       // Set Indicator
-       smsCnt = MsgStoGetUnreadCnt(&dbHandle, MSG_SMS_TYPE);
-       mmsCnt = MsgStoGetUnreadCnt(&dbHandle, MSG_MMS_TYPE);
-
-       MsgSettingSetIndicator(smsCnt, mmsCnt);
-
-/*** Set pMsgIdList **/
-       if (pMsgIdList != NULL && pToDeleteMsgIdList->nCount > 0) {
-               pMsgIdList->nCount = pToDeleteMsgIdList->nCount;
-
-               pMsgIdList->msgIdList = (msg_message_id_t *)new char[sizeof(msg_message_id_t)*pToDeleteMsgIdList->nCount];
-               memcpy(pMsgIdList->msgIdList, pToDeleteMsgIdList->msgIdList, sizeof(msg_message_id_t)*pToDeleteMsgIdList->nCount);
-       }
-/*** **/
-
-       /*** Create thread  for noti and phone log delete. **/
-       if (pToDeleteMsgIdList->nCount > 0) {
-               msg_id_list_s *pToDeleteMsgIdListCpy = NULL;
-               pToDeleteMsgIdListCpy = (msg_id_list_s *)new char[sizeof(msg_id_list_s)];
-               memset(pToDeleteMsgIdListCpy, 0x00, sizeof(msg_id_list_s));
-
-               pToDeleteMsgIdListCpy->nCount = pToDeleteMsgIdList->nCount;
-
-               pToDeleteMsgIdListCpy->msgIdList = (msg_message_id_t *)new char[sizeof(msg_message_id_t)*pToDeleteMsgIdList->nCount];
-               memcpy(pToDeleteMsgIdListCpy->msgIdList, pToDeleteMsgIdList->msgIdList, sizeof(msg_message_id_t)*pToDeleteMsgIdList->nCount);
-
-               if (g_idle_add(startToDeleteNoti, (void *)pToDeleteMsgIdList) == 0) {
-                       MSG_DEBUG("startToDeleteNoti not invoked: %s", strerror(errno));
-                       // memory free
-                       if (pToDeleteMsgIdList != NULL) {
-                               //free peer info list
-                               if (pToDeleteMsgIdList->msgIdList != NULL)
-                                       delete [] pToDeleteMsgIdList->msgIdList;
-
-                               delete [] pToDeleteMsgIdList;
-                       }
-                       err = MSG_ERR_UNKNOWN;
-               }
-
-               if (g_idle_add(startToDeletePhoneLog, (void *)pToDeleteMsgIdListCpy) == 0) {
-                       MSG_DEBUG("startToDeletePhoneLog not invoked: %s", strerror(errno));
-                       // memory free
-                       if (pToDeleteMsgIdListCpy != NULL) {
-                               //free peer info list
-                               if (pToDeleteMsgIdListCpy->msgIdList != NULL)
-                                       delete [] pToDeleteMsgIdListCpy->msgIdList;
-
-                               delete [] pToDeleteMsgIdListCpy;
-                       }
-                       err = MSG_ERR_UNKNOWN;
-               }
-       }
-       /*** **/
-
-       return MSG_SUCCESS;
-
-FREE_MEMORY:
-       MSG_DEBUG("Error case Free Memory");
-       // memory free
-       if (pToDeleteMsgIdList != NULL) {
-               //free peer info list
-               if (pToDeleteMsgIdList->msgIdList != NULL) {
-                       delete [] pToDeleteMsgIdList->msgIdList;
-                       pToDeleteMsgIdList->msgIdList = NULL;
-               }
-
-               delete [] pToDeleteMsgIdList;
-               pToDeleteMsgIdList = NULL;
-       }
-#endif
-
-       return err;
-}
-
-
-msg_error_t MsgStoCountMsgByContact(const MSG_THREAD_LIST_INDEX_S *pAddrInfo, MSG_THREAD_COUNT_INFO_S *pThreadCountInfo)
-{
-       char sqlQuery[MAX_QUERY_LEN+1];
-
-       memset(sqlQuery, 0x00, sizeof(sqlQuery));
-
-       if (pAddrInfo->contactId > 0) {
-               snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(*) AS TOTAL, \
-                               SUM(CASE WHEN READ_STATUS=0 AND FOLDER_ID=%d THEN 1 ELSE 0 END), \
-                               SUM(CASE WHEN MAIN_TYPE=%d THEN 1 ELSE 0 END), \
-                               SUM(CASE WHEN MAIN_TYPE=%d THEN 1 ELSE 0 END) \
-                               FROM (SELECT * FROM %s A  JOIN %s B ON A.ADDRESS_ID = B.ADDRESS_ID WHERE B.CONTACT_ID = %d)",
-                               MSG_INBOX_ID, MSG_SMS_TYPE, MSG_MMS_TYPE, MSGFW_MESSAGE_TABLE_NAME, MSGFW_ADDRESS_TABLE_NAME, pAddrInfo->contactId);
-       } else {
-               snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(*) AS TOTAL, \
-                               SUM(CASE WHEN READ_STATUS=0 AND FOLDER_ID=%d THEN 1 ELSE 0 END), \
-                               SUM(CASE WHEN MAIN_TYPE=%d THEN 1 ELSE 0 END), \
-                               SUM(CASE WHEN MAIN_TYPE=%d THEN 1 ELSE 0 END) \
-                               FROM (SELECT * FROM %s A  JOIN %s B ON A.ADDRESS_ID = B.ADDRESS_ID WHERE B.ADDRESS_VAL = '%s')",
-                               MSG_INBOX_ID, MSG_SMS_TYPE, MSG_MMS_TYPE, MSGFW_MESSAGE_TABLE_NAME, MSGFW_ADDRESS_TABLE_NAME, pAddrInfo->msgAddrInfo.addressVal);
-       }
-
-       if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
-               return MSG_ERR_DB_PREPARE;
-
-       if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
-               pThreadCountInfo->totalCount = dbHandle.columnInt(0);
-               pThreadCountInfo->unReadCount = dbHandle.columnInt(1);
-               pThreadCountInfo->smsMsgCount = dbHandle.columnInt(2);
-               pThreadCountInfo->mmsMsgCount = dbHandle.columnInt(3);
-       } else {
-               dbHandle.finalizeQuery();
-               return MSG_ERR_DB_STEP;
-       }
-
-       dbHandle.finalizeQuery();
-
-       return MSG_SUCCESS;
-}
-
-
-msg_error_t MsgStoSearchMessage(const char *pSearchString, msg_struct_list_s *pThreadViewList)
-{
-       if (!pSearchString)
-               return MSG_ERR_NULL_POINTER;
-
-       // Clear Out Parameter
-       pThreadViewList->nCount = 0;
-       pThreadViewList->msg_struct_info = NULL;
-
-       tr1::unordered_set<msg_thread_id_t> IdList;
-       queue<MSG_THREAD_VIEW_S> searchList;
-
-       MSG_THREAD_VIEW_S threadView;
-
-       char sqlQuery[MAX_QUERY_LEN+1];
-
-       // Replace string for '%' and '_' character
-       char *ext1_str = NULL;
-       char *ext2_str = NULL;
-
-       ext1_str = MsgStoReplaceString(pSearchString, "_", "\\_");
-       ext2_str = MsgStoReplaceString(ext1_str, "%", "\\%");
-
-       // Search - Address, Name
-       memset(sqlQuery, 0x00, sizeof(sqlQuery));
-
-       snprintf(sqlQuery, sizeof(sqlQuery), "SELECT CONV_ID, UNREAD_CNT, SMS_CNT, MMS_CNT, DISPLAY_NAME, \
-                       MAIN_TYPE, SUB_TYPE, MSG_DIRECTION, DISPLAY_TIME, MSG_TEXT \
-                       FROM %s WHERE DISPLAY_NAME LIKE '%%%s%%' ESCAPE '\\' ORDER BY DISPLAY_TIME DESC;",
-                       MSGFW_CONVERSATION_TABLE_NAME, ext2_str);
-
-       if (ext1_str) {
-               free(ext1_str);
-               ext1_str = NULL;
-       }
-
-       if (ext2_str) {
-               free(ext2_str);
-               ext2_str = NULL;
-       }
-
-       MSG_DEBUG("[%s]", sqlQuery);
-
-       if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS) {
-               MSG_DEBUG("Prepare query fail. [%s]", sqlQuery);
-               return MSG_ERR_DB_PREPARE;
-       }
-
-       while (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
-               memset(&threadView, 0x00, sizeof(threadView));
-
-               threadView.threadId = dbHandle.columnInt(0);
-               threadView.unreadCnt = dbHandle.columnInt(1);
-               threadView.smsCnt = dbHandle.columnInt(2);
-               threadView.mmsCnt = dbHandle.columnInt(3);
-
-               strncpy(threadView.threadName, (char *)dbHandle.columnText(4), MAX_THREAD_NAME_LEN);
-
-               threadView.mainType = dbHandle.columnInt(5);
-               threadView.subType = dbHandle.columnInt(6);
-
-               threadView.direction = dbHandle.columnInt(7);
-               threadView.threadTime = (time_t)dbHandle.columnInt(8);
-
-               strncpy(threadView.threadData, (char *)dbHandle.columnText(9), MAX_THREAD_DATA_LEN);
-
-               tr1::unordered_set<msg_thread_id_t>::iterator it;
-
-               it = IdList.find(threadView.threadId);
-
-               if (it == IdList.end()) {
-                       IdList.insert(threadView.threadId);
-                       searchList.push(threadView);
-               }
-
-       }
-
-       dbHandle.finalizeQuery();
-
-       // Add data to Out Parameter
-       pThreadViewList->nCount = searchList.size();
-       pThreadViewList->msg_struct_info = (msg_struct_t *)new char[sizeof(msg_struct_t) * searchList.size()];
-
-       MSG_THREAD_VIEW_S *pTmp = NULL;
-       msg_struct_s *thread_t = NULL;
-
-       int index = 0;
-
-       while (!searchList.empty()) {
-               thread_t = (msg_struct_s *)new msg_struct_s;
-               pThreadViewList->msg_struct_info[index] = (msg_struct_t)thread_t;
-
-               thread_t->type = MSG_STRUCT_THREAD_INFO;
-               thread_t->data = new MSG_THREAD_VIEW_S;
-
-               pTmp = (MSG_THREAD_VIEW_S *)thread_t->data;
-               memset(pTmp, 0x00, sizeof(MSG_THREAD_VIEW_S));
-
-               memcpy(pTmp, &(searchList.front()), sizeof(MSG_THREAD_VIEW_S));
-
-               searchList.pop();
-
-               index++;
-       }
-
-       return MSG_SUCCESS;
-}
-
-
-msg_error_t MsgStoSearchMessage(const MSG_SEARCH_CONDITION_S *pSearchCon, int offset, int limit, msg_struct_list_s *pMsgList)
-{
-       // Clear Out Parameter
-       pMsgList->nCount = 0;
-       pMsgList->msg_struct_info = NULL;
-
-       int rowCnt = 0;
-       int index = 26; // numbers of index
-
-       char sqlQuery[MAX_QUERY_LEN+1];
-       char sqlQuerySubset[(MAX_QUERY_LEN/5)+1];
-
-       char firstName[MAX_DISPLAY_NAME_LEN+1], lastName[MAX_DISPLAY_NAME_LEN+1];
-       char displayName[MAX_DISPLAY_NAME_LEN+1];
-
-       char *ext1_str = NULL;
-       char *ext2_str = NULL;
-
-       // Get Name Order
-       int order = MsgGetContactNameOrder();
-
-       memset(sqlQuery, 0x00, sizeof(sqlQuery));
-
-       snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.MSG_ID, A.CONV_ID, A.FOLDER_ID, A.STORAGE_ID, A.MAIN_TYPE, A.SUB_TYPE, \
-                       A.DISPLAY_TIME, A.DATA_SIZE, A.NETWORK_STATUS, A.READ_STATUS, A.PROTECTED, A.BACKUP, A.PRIORITY, \
-                       A.MSG_DIRECTION, A.SCHEDULED_TIME, A.SUBJECT, A.MSG_TEXT, B.ADDRESS_TYPE, B.RECIPIENT_TYPE, \
-                       B.CONTACT_ID, B.ADDRESS_VAL, B.DISPLAY_NAME, B.FIRST_NAME, B.LAST_NAME, A.ATTACHMENT_COUNT, A.THUMB_PATH \
-                       FROM %s A, %s B \
-                       WHERE A.CONV_ID = B.CONV_ID AND B.ADDRESS_ID <> 0 ",
-                       MSGFW_MESSAGE_TABLE_NAME, MSGFW_ADDRESS_TABLE_NAME);
-
-       //// folder
-       memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
-
-       if (pSearchCon->folderId == MSG_ALLBOX_ID)
-               snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.FOLDER_ID > 0 AND A.FOLDER_ID < %d ", MSG_CBMSGBOX_ID);
-       else if (pSearchCon->folderId == MSG_IOSBOX_ID)
-               snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.FOLDER_ID > 0 AND A.FOLDER_ID < %d ", MSG_DRAFT_ID);
-       else
-               snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.FOLDER_ID = %d ", pSearchCon->folderId);
-
-       strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
-
-
-       //// msg type
-       memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
-
-       switch (pSearchCon->msgType) {
-               case MSG_TYPE_SMS:
-                       snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.MAIN_TYPE = %d AND A.SUB_TYPE = %d ", MSG_SMS_TYPE, MSG_NORMAL_SMS);
-                       break;
-
-               case MSG_TYPE_MMS:
-                       snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.MAIN_TYPE = %d ", MSG_MMS_TYPE);
-                       break;
-
-               case MSG_TYPE_MMS_JAVA:
-                       snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.MAIN_TYPE = %d AND A.SUB_TYPE = %d ", MSG_MMS_TYPE, MSG_SENDREQ_JAVA_MMS);
-                       break;
-
-               case MSG_TYPE_SMS_SYNCML:
-                       snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.MAIN_TYPE = %d AND A.SUB_TYPE = %d ", MSG_SMS_TYPE, MSG_SYNCML_CP);
-                       break;
-
-               case MSG_TYPE_SMS_REJECT:
-                       snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.MAIN_TYPE = %d AND A.SUB_TYPE = %d ", MSG_SMS_TYPE, MSG_REJECT_SMS);
-                       break;
-
-               default:
-                       MSG_DEBUG("msg type is not set.");
-                       break;
-       }
-
-       strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
-
-       /// string
-       if (pSearchCon->pSearchVal != NULL) {
-
-               // Replace string for '%' and '_' character
-               ext1_str = MsgStoReplaceString(pSearchCon->pSearchVal, "_", "\\_");
-               ext2_str = MsgStoReplaceString(ext1_str, "%", "\\%");
-
-               memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
-               snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND ( A.MSG_TEXT LIKE '%%%s%%' ESCAPE '\\' \
-                               OR A.SUBJECT LIKE '%%%s%%' ESCAPE '\\' \
-                               OR B.ADDRESS_VAL LIKE '%%%s%%' ESCAPE '\\' \
-                               OR B.DISPLAY_NAME LIKE '%%%s%%' ESCAPE '\\' \
-                               OR B.FIRST_NAME LIKE '%%%s%%' ESCAPE '\\' \
-                               OR B.LAST_NAME LIKE '%%%s%%' ESCAPE '\\') ",
-                               ext2_str, ext2_str, ext2_str, ext2_str, ext2_str, ext2_str);
-               strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
-
-               if (ext1_str) {
-                       free(ext1_str);
-                       ext1_str = NULL;
-               }
-
-               if (ext2_str) {
-                       free(ext2_str);
-                       ext2_str = NULL;
-               }
-       }
-
-       /// address
-       if (pSearchCon->pAddressVal != NULL) {
-
-               // Replace string for '%' and '_' character
-               ext1_str = MsgStoReplaceString(pSearchCon->pAddressVal, "_", "\\_");
-               ext2_str = MsgStoReplaceString(ext1_str, "%", "\\%");
-
-               memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
-               snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND B.ADDRESS_VAL LIKE '%%%s%%' ESCAPE '\\' ", ext2_str);
-               strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
-
-               if (ext1_str) {
-                       free(ext1_str);
-                       ext1_str = NULL;
-               }
-
-               if (ext2_str) {
-                       free(ext2_str);
-                       ext2_str = NULL;
-               }
-       }
-
-       /// limit, offset
-       memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
-
-       if (offset >= 0 && limit > 0)
-               snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "ORDER BY A.DISPLAY_TIME DESC LIMIT %d OFFSET %d;", limit, offset);
-       else
-               snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "ORDER BY A.DISPLAY_TIME DESC;");
-
-       strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
-
-       msg_error_t err = dbHandle.getTable(sqlQuery, &rowCnt);
-
-       if (err == MSG_ERR_DB_NORECORD) {
-               dbHandle.freeTable();
-
-               return MSG_SUCCESS;
-       } else if (err != MSG_SUCCESS) {
-               MSG_DEBUG("Get table fail. [%s]", sqlQuery);
-
-               dbHandle.freeTable();
-
-               return err;
-       }
-
-       pMsgList->nCount = rowCnt;
-
-       MSG_DEBUG("pMsgList->nCount [%d]", pMsgList->nCount);
-
-       pMsgList->msg_struct_info = (msg_struct_t *)new char[sizeof(msg_struct_t) * rowCnt];
-
-       MSG_MESSAGE_HIDDEN_S *pTmp = NULL;
-       msg_struct_s *msg = NULL;
-
-       for (int i = 0; i < rowCnt; i++) {
-               pMsgList->msg_struct_info[i] = (msg_struct_t)new msg_struct_s;
-
-               msg = (msg_struct_s *)pMsgList->msg_struct_info[i];
-
-               msg->type = MSG_STRUCT_MESSAGE_INFO;
-               msg->data = (int *)new char[sizeof(MSG_MESSAGE_HIDDEN_S)];
-
-               pTmp = (MSG_MESSAGE_HIDDEN_S *)msg->data;
-
-               memset(pTmp, 0x00, sizeof(MSG_MESSAGE_HIDDEN_S));
-
-               pTmp->pData = NULL;
-               pTmp->pMmsData = NULL;
-
-               pTmp->msgId = dbHandle.getColumnToInt(index++);
-               pTmp->threadId = dbHandle.getColumnToInt(index++);
-               pTmp->folderId = dbHandle.getColumnToInt(index++);
-               pTmp->storageId = dbHandle.getColumnToInt(index++);
-               pTmp->mainType = dbHandle.getColumnToInt(index++);
-               pTmp->subType = dbHandle.getColumnToInt(index++);
-               pTmp->displayTime = (time_t)dbHandle.getColumnToInt(index++);
-               pTmp->dataSize = dbHandle.getColumnToInt(index++);
-               pTmp->networkStatus = dbHandle.getColumnToInt(index++);
-               pTmp->bRead = dbHandle.getColumnToInt(index++);
-               pTmp->bProtected = dbHandle.getColumnToInt(index++);
-               pTmp->bBackup = dbHandle.getColumnToInt(index++);
-               pTmp->priority = dbHandle.getColumnToInt(index++);
-               pTmp->direction= dbHandle.getColumnToInt(index++);
-               index++; // This field is reserved.
-
-               dbHandle.getColumnToString(index++, MAX_SUBJECT_LEN, pTmp->subject);
-
-               if (pTmp->mainType == MSG_MMS_TYPE &&
-                       (pTmp->networkStatus == MSG_NETWORK_RETRIEVING || pTmp->networkStatus == MSG_NETWORK_RETRIEVE_FAIL || pTmp->subType == MSG_NOTIFICATIONIND_MMS)) {
-                       pTmp->pData = NULL;
-                       index++;
-               } else {
-                       MSG_DEBUG("pTmp->dataSize [%d]", pTmp->dataSize);
-                       pTmp->pData = (void *)new char[pTmp->dataSize + 2];
-                       memset(pTmp->pData, 0x00, pTmp->dataSize + 2);
-
-                       dbHandle.getColumnToString(index++, pTmp->dataSize+1, (char *)pTmp->pData);
-               }
-
-               msg_struct_list_s *addr_list = (msg_struct_list_s *)new msg_struct_list_s;
-               msg_struct_s *addr_info = NULL;
-               MSG_ADDRESS_INFO_S *address = NULL;
-
-               addr_list->nCount = 1;
-               addr_list->msg_struct_info = (msg_struct_t *)new char[sizeof(msg_struct_t *)*MAX_TO_ADDRESS_CNT];
-
-               msg_struct_s *pTmpAddr = NULL;
-
-               for (int i = 0; i < MAX_TO_ADDRESS_CNT; i++) {
-                       addr_list->msg_struct_info[i] = (msg_struct_t)new char[sizeof(msg_struct_s)];
-                       pTmpAddr = (msg_struct_s *)addr_list->msg_struct_info[i];
-                       pTmpAddr->type = MSG_STRUCT_ADDRESS_INFO;
-                       pTmpAddr->data = new MSG_ADDRESS_INFO_S;
-                       memset(pTmpAddr->data, 0x00, sizeof(MSG_ADDRESS_INFO_S));
-
-                       addr_list->msg_struct_info[i] = (msg_struct_t)pTmpAddr;
-               }
-
-               addr_info = (msg_struct_s *)addr_list->msg_struct_info[0];
-               address = (MSG_ADDRESS_INFO_S *)addr_info->data;
-               address->addressType = dbHandle.getColumnToInt(index++);
-               address->recipientType = dbHandle.getColumnToInt(index++);
-               address->contactId = dbHandle.getColumnToInt(index++);
-
-               dbHandle.getColumnToString(index++, MAX_ADDRESS_VAL_LEN, address->addressVal);
-
-               memset(displayName, 0x00, sizeof(displayName));
-               dbHandle.getColumnToString(index++, MAX_DISPLAY_NAME_LEN, displayName);
-
-               memset(firstName, 0x00, sizeof(firstName));
-               dbHandle.getColumnToString(index++, MAX_DISPLAY_NAME_LEN, firstName);
-
-               memset(lastName, 0x00, sizeof(lastName));
-               dbHandle.getColumnToString(index++, MAX_DISPLAY_NAME_LEN, lastName);
-
-               if (strlen(displayName) <= 0) {
-                       if (order == 0) {
-                               if (firstName[0] != '\0') {
-                                       strncpy(displayName, firstName, MAX_DISPLAY_NAME_LEN);
-                               }
-
-                               if (lastName[0] != '\0') {
-                                       strncat(displayName, " ", MAX_DISPLAY_NAME_LEN-strlen(displayName));
-                                       strncat(displayName, lastName, MAX_DISPLAY_NAME_LEN-strlen(displayName));
-                               }
-                       } else if (order == 1) {
-                               if (lastName[0] != '\0') {
-                                       strncpy(displayName, lastName, MAX_DISPLAY_NAME_LEN);
-                                       strncat(displayName, " ", MAX_DISPLAY_NAME_LEN-strlen(displayName));
-                               }
-
-                               if (firstName[0] != '\0') {
-                                       strncat(displayName, firstName, MAX_DISPLAY_NAME_LEN-strlen(displayName));
-                               }
-                       }
-               }
-
-               strncpy(address->displayName, displayName, MAX_DISPLAY_NAME_LEN);
-
-               pTmp->addr_list = addr_list;
+       int index = 4;
 
-               pTmp->attachCount = dbHandle.getColumnToInt(index++);
+       *count =  rowCnt;
+       MSG_REPORT_STATUS_INFO_S *report_status = (MSG_REPORT_STATUS_INFO_S*)new char[sizeof(MSG_REPORT_STATUS_INFO_S)*rowCnt];
+       memset(report_status, 0x00, sizeof(MSG_REPORT_STATUS_INFO_S)*rowCnt);
 
-               dbHandle.getColumnToString(index++, MSG_FILEPATH_LEN_MAX, pTmp->thumbPath);
+       for (int i = 0; i < rowCnt; i++) {
+               dbHandle->getColumnToString(index++, MAX_ADDRESS_VAL_LEN, report_status[i].addressVal);
+               report_status[i].type = dbHandle->getColumnToInt(index++);
+               report_status[i].status = dbHandle->getColumnToInt(index++);
+               report_status[i].statusTime = (time_t)dbHandle->getColumnToInt(index++);
 
+               MSG_SEC_DEBUG("(%d/%d) address = %s, report_type = %d, report_status = %d, report_time = %d", i+1, rowCnt, report_status[i].addressVal, report_status[i].type, report_status[i].status, report_status[i].statusTime);
        }
-       dbHandle.freeTable();
-
-       return MSG_SUCCESS;
-}
 
+       *pReportStatus = report_status;
 
-void MsgConvertNumber(const char *pSrcNum, char *pDestNum)
-{
-       int overLen = 0;
-       int i = 0;
-
-       overLen = strlen(pSrcNum) - MAX_PRECONFIG_NUM;
-
-       for (i = 0; i < MAX_PRECONFIG_NUM; i++)
-               pDestNum[i] = pSrcNum[i+overLen];
+       dbHandle->freeTable();
 
-       pDestNum[i] = '\0';
+       return MSG_SUCCESS;
 }
 
-
-msg_error_t MsgStoGetRejectMsgList(const char *pNumber, msg_struct_list_s *pRejectMsgList)
+msg_error_t MsgStoGetMmsReportStatus(msg_message_id_t msgId, int *count, MSG_REPORT_STATUS_INFO_S **pReportStatus)
 {
-       // Clear Out Parameter
-       pRejectMsgList->nCount = 0;
-       pRejectMsgList->msg_struct_info = NULL;
-
-       int rowCnt = 0;
-       int index = 3; // numbers of index
-
+       MsgDbHandler *dbHandle = getDbHandle();
        char sqlQuery[MAX_QUERY_LEN+1];
 
-       // Search Reject Msg
-       memset(sqlQuery, 0x00, sizeof(sqlQuery));
-
-       if (pNumber != NULL) {
-               char phoneNumber[MAX_PRECONFIG_NUM+1];
-               memset(phoneNumber, 0x00, sizeof(phoneNumber));
-
-               if (strlen(pNumber) > MAX_PRECONFIG_NUM)
-                       MsgConvertNumber(pNumber, phoneNumber);
-               else
-                       strncpy(phoneNumber, pNumber, MAX_PRECONFIG_NUM);
-
-               snprintf(sqlQuery, sizeof(sqlQuery), "SELECT B.MSG_ID, B.MSG_TEXT, B.DISPLAY_TIME \
-                               FROM %s A, %s B \
-                               WHERE A.CONV_ID = B.CONV_ID AND B.MAIN_TYPE = %d \
-                               AND B.SUB_TYPE = %d AND A.ADDRESS_VAL LIKE '%%%s' \
-                               ORDER BY B.DISPLAY_TIME DESC;",
-                               MSGFW_ADDRESS_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME,
-                               MSG_SMS_TYPE, MSG_REJECT_SMS, phoneNumber);
-       } else {
-               snprintf(sqlQuery, sizeof(sqlQuery), "SELECT B.MSG_ID, B.MSG_TEXT, B.DISPLAY_TIME \
-                               FROM %s A, %s B \
-                               WHERE A.CONV_ID = B.CONV_ID AND B.MAIN_TYPE = %d AND B.SUB_TYPE = %d \
-                               ORDER BY B.DISPLAY_TIME DESC;",
-                               MSGFW_ADDRESS_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME,
-                               MSG_SMS_TYPE, MSG_REJECT_SMS);
-       }
-
-       msg_error_t  err = dbHandle.getTable(sqlQuery, &rowCnt);
+       msg_direction_type_t    direction = MSG_DIRECTION_TYPE_MO;
 
-       if (err != MSG_SUCCESS) {
-               MSG_DEBUG("%s", sqlQuery);
+       snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_DIRECTION FROM %s WHERE MSG_ID = %d;",
+                       MSGFW_MESSAGE_TABLE_NAME, msgId);
 
-               dbHandle.freeTable();
+       if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
+               return MSG_ERR_DB_PREPARE;
 
-               return err;
+       if (dbHandle->stepQuery() == MSG_ERR_DB_ROW) {
+               direction = dbHandle->columnInt(0);
        }
 
-       pRejectMsgList->nCount = rowCnt;
-
-       MSG_DEBUG("pRejectMsgList->nCount [%d]", pRejectMsgList->nCount);
+       dbHandle->finalizeQuery();
 
-       pRejectMsgList->msg_struct_info = (msg_struct_t *)new char[sizeof(MSG_REJECT_MSG_INFO_S *)*rowCnt];
+       if (direction == MSG_DIRECTION_TYPE_MO) {//get received report list of MO message
 
-       msg_struct_s* pTmp = NULL;
-
-       for (int i = 0; i < rowCnt; i++) {
-               pRejectMsgList->msg_struct_info[i] = (msg_struct_t)new char[sizeof(msg_struct_s)];
-
-               pTmp = (msg_struct_s *)pRejectMsgList->msg_struct_info[i];
-               pTmp->type = MSG_STRUCT_REJECT_MSG_INFO;
-               pTmp->data = new char[sizeof(MSG_FOLDER_INFO_S)];
-               MSG_REJECT_MSG_INFO_S * pMsg = (MSG_REJECT_MSG_INFO_S *)pTmp->data;
-               memset(pMsg, 0x00, sizeof(MSG_REJECT_MSG_INFO_S));
-
-               pMsg->msgId = dbHandle.getColumnToInt(index++);
-               memset(pMsg->msgText, 0x00, sizeof(pMsg->msgText));
-               dbHandle.getColumnToString(index++, MAX_MSG_TEXT_LEN, pMsg->msgText);
-
-               pMsg->displayTime = (time_t)dbHandle.getColumnToInt(index++);
-       }
+               memset(sqlQuery, 0x00, sizeof(sqlQuery));
+               //MSG_ID INTEGER , ADDRESS_VAL TEXT , STATUS_TYPE INTEGER , STATUS INTEGER DEFAULT 0 , TIME DATETIME)
+               //select * from MSG_REPORT_TABLE where MSG_ID=38 order by ADDRESS_VAL DESC, STATUS_TYPE ASC;
+               snprintf(sqlQuery, sizeof(sqlQuery),
+                               "SELECT ADDRESS_VAL, STATUS_TYPE, STATUS, TIME "
+                               "FROM %s "
+                               "WHERE MSG_ID = %d "
+                               "order by ADDRESS_VAL DESC, STATUS_TYPE ASC;"
+                               , MSGFW_REPORT_TABLE_NAME, msgId);
+
+               int rowCnt;
+               msg_error_t  err = dbHandle->getTable(sqlQuery, &rowCnt);
+               if (err != MSG_SUCCESS) {
+                       MSG_DEBUG("Fail to getTable().");
+                       dbHandle->freeTable();
+                       return err;
+               }
 
-       dbHandle.freeTable();
+               int index = 4;
 
-       return MSG_SUCCESS;
-}
+               *count =  rowCnt;
+               MSG_REPORT_STATUS_INFO_S *report_status = (MSG_REPORT_STATUS_INFO_S*)new char[sizeof(MSG_REPORT_STATUS_INFO_S)*rowCnt];
+               memset(report_status, 0x00, sizeof(MSG_REPORT_STATUS_INFO_S)*rowCnt);
 
+               for (int i = 0; i < rowCnt; i++) {
+                       dbHandle->getColumnToString(index++, MAX_ADDRESS_VAL_LEN, report_status[i].addressVal);
+                       report_status[i].type = dbHandle->getColumnToInt(index++);
+                       report_status[i].status = dbHandle->getColumnToInt(index++);
+                       report_status[i].statusTime = (time_t)dbHandle->getColumnToInt(index++);
 
-msg_error_t MsgStoGetSyncMLExtId(msg_message_id_t msgId, int *extId)
-{
-       char sqlQuery[MAX_QUERY_LEN+1];
+                       MSG_DEBUG("(%d/%d) addr = %s, report_type = %d, report_status = %d, report_time = %d", i+1, rowCnt, report_status[i].addressVal, report_status[i].type, report_status[i].status, report_status[i].statusTime );
+               }
 
-       memset(sqlQuery, 0x00, sizeof(sqlQuery));
+               *pReportStatus = report_status;
 
-       snprintf(sqlQuery, sizeof(sqlQuery), "SELECT EXT_ID FROM %s WHERE MSG_ID = %d;",
-                       MSGFW_SYNCML_MSG_TABLE_NAME, msgId);
+               dbHandle->freeTable();
 
-       if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
-               return MSG_ERR_DB_PREPARE;
+       } else if (direction == MSG_DIRECTION_TYPE_MT) {//read report sent status of MT message
 
-       if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
-               *extId = dbHandle.columnInt(0);
-       } else {
-               dbHandle.finalizeQuery();
-               return MSG_ERR_DB_STEP;
-       }
+               int readReportSentStatus;
 
-       dbHandle.finalizeQuery();
+               if (MsgStoCheckReadReportRequested(dbHandle, msgId) == false) {
+                       *count = 0;
+                       *pReportStatus = NULL;
+                       return MSG_ERR_READREPORT_NOT_REQUESTED;
+               }
 
-       return MSG_SUCCESS;
-}
+               MsgStoGetReadReportSendStatus(msgId, &readReportSentStatus);
 
-msg_error_t MsgStoGetReportStatus(msg_message_id_t msgId, int *count, MSG_REPORT_STATUS_INFO_S **pReportStatus)
-{
-       char sqlQuery[MAX_QUERY_LEN+1];
+               *count =  1;
 
-       memset(sqlQuery, 0x00, sizeof(sqlQuery));
-       //MSG_ID INTEGER , ADDRESS_VAL TEXT , STATUS_TYPE INTEGER , STATUS INTEGER DEFAULT 0 , TIME DATETIME)
-       //select * from MSG_REPORT_TABLE where MSG_ID=38 order by ADDRESS_VAL DESC, STATUS_TYPE ASC;
-       snprintf(sqlQuery, sizeof(sqlQuery),
-                       "SELECT ADDRESS_VAL, STATUS_TYPE, STATUS, TIME "
-                       "FROM %s "
-                       "WHERE MSG_ID = %d "
-                       "order by ADDRESS_VAL DESC, STATUS_TYPE ASC;"
-                       , MSGFW_REPORT_TABLE_NAME, msgId);
+               MSG_REPORT_STATUS_INFO_S *report_status = (MSG_REPORT_STATUS_INFO_S*)new char[sizeof(MSG_REPORT_STATUS_INFO_S)];
+               memset(report_status, 0x00, sizeof(MSG_REPORT_STATUS_INFO_S));
 
-       int rowCnt;
-       msg_error_t  err = dbHandle.getTable(sqlQuery, &rowCnt);
-       if (err != MSG_SUCCESS) {
-               MSG_DEBUG("%s", sqlQuery);
-               dbHandle.freeTable();
-               return err;
-       }
+               report_status->addressVal[0] = '\0';
+               report_status->type = MSG_REPORT_TYPE_READ_REPORT_SENT;
+               report_status->status = readReportSentStatus;
+               report_status->statusTime = 0;
 
-       int index = 4;
+               MSG_DEBUG("report_type = %d, report_status = %d", report_status->type, report_status->status);
 
-       *count =  rowCnt;
-       MSG_REPORT_STATUS_INFO_S *report_status = (MSG_REPORT_STATUS_INFO_S*)new char[sizeof(MSG_REPORT_STATUS_INFO_S)*rowCnt];
-       memset(report_status, 0x00, sizeof(MSG_REPORT_STATUS_INFO_S)*rowCnt);
+               *pReportStatus = report_status;
 
-       for (int i = 0; i < rowCnt; i++) {
-               dbHandle.getColumnToString(index++, MAX_ADDRESS_VAL_LEN, report_status[i].addressVal);
-               report_status[i].type = dbHandle.getColumnToInt(index++);
-               report_status[i].status = dbHandle.getColumnToInt(index++);
-               report_status[i].statusTime = (time_t)dbHandle.getColumnToInt(index++);
 
-               MSG_DEBUG("(%d/%d) addr = %s, report_type = %d, report_status = %d, report_time = %d", i, rowCnt, report_status[i].addressVal, report_status[i].type, report_status[i].status, report_status[i].statusTime );
        }
 
-       *pReportStatus = report_status;
-
        return MSG_SUCCESS;
 }
 
 
 msg_error_t MsgStoGetThreadIdByAddress(const MSG_MESSAGE_INFO_S *pMsg, msg_thread_id_t *pThreadId)
 {
+       MsgDbHandler *dbHandle = getDbHandle();
        if(pMsg->nAddressCnt > 0) {
-               if (MsgExistAddress(&dbHandle, pMsg, pThreadId) == true) {
+               if (MsgExistAddress(dbHandle, pMsg, pThreadId) == true) {
                        MSG_DEBUG("Conversation ID : [%d]", *pThreadId);
-               } else {
-                       *pThreadId = 0;
-                       return MSG_ERR_STORAGE_ERROR;
+
+                       // check thread count
+                       MSG_THREAD_VIEW_S threadInfo;
+                       memset(&threadInfo, 0x00, sizeof(MSG_THREAD_VIEW_S));
+                       MsgStoGetThreadInfo(*pThreadId, &threadInfo);
+                       MSG_DEBUG("threadInfo.smsCnt [%d], threadInfo.mmsCnt [%d]", threadInfo.smsCnt, threadInfo.mmsCnt);
+                       if ((threadInfo.smsCnt + threadInfo.mmsCnt) > 0) {
+                               return MSG_SUCCESS;
+                       }
                }
-       } else {
-               *pThreadId = 0;
        }
+
+       *pThreadId = 0;
        return MSG_SUCCESS;
 }
 
@@ -3308,26 +2610,25 @@ msg_error_t MsgStoGetThreadUnreadCnt(msg_thread_id_t threadId, int *cnt)
 {
        MSG_BEGIN();
 
+       MsgDbHandler *dbHandle = getDbHandle();
        int msgCnt = 0;
        *cnt = 0;
 
        char sqlQuery[MAX_QUERY_LEN+1];
 
-       memset(sqlQuery, 0x00, sizeof(sqlQuery));
-
        // Get MSG_ID
        memset(sqlQuery, 0x00, sizeof(sqlQuery));
        snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s A \
                        WHERE CONV_ID = %d AND READ_STATUS = 0;", MSGFW_MESSAGE_TABLE_NAME, threadId);
 
-       if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
+       if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
                return MSG_ERR_DB_PREPARE;
 
-       if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
-               msgCnt = dbHandle.columnInt(0);
+       if (dbHandle->stepQuery() == MSG_ERR_DB_ROW) {
+               msgCnt = dbHandle->columnInt(0);
        }
 
-       dbHandle.finalizeQuery();
+       dbHandle->finalizeQuery();
 
        *cnt = msgCnt;
 
@@ -3337,74 +2638,86 @@ msg_error_t MsgStoGetThreadUnreadCnt(msg_thread_id_t threadId, int *cnt)
 }
 
 
-msg_error_t MsgStoGetAddressList(const msg_thread_id_t threadId, msg_struct_list_s *pAddrList)
-{
-       msg_error_t err = MSG_SUCCESS;
-
-       int order = MsgGetContactNameOrder();
-
-       err = MsgStoGetAddressByConvId(&dbHandle, threadId, order, pAddrList);
-
-       return err;
-}
-
-
 msg_error_t MsgStoGetThreadInfo(msg_thread_id_t threadId, MSG_THREAD_VIEW_S *pThreadInfo)
 {
        MSG_BEGIN();
 
+       MsgDbHandler *dbHandle = getDbHandle();
        int rowCnt;
-       int index = 11; // numbers of index
+       int index = 15; // numbers of index
 
        char sqlQuery[MAX_QUERY_LEN+1];
        memset(sqlQuery, 0x00, sizeof(sqlQuery));
 
-       snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.CONV_ID, A.UNREAD_CNT, A.SMS_CNT, A.MMS_CNT, \
-                       A.MAIN_TYPE, A.SUB_TYPE, A.MSG_DIRECTION, A.DISPLAY_TIME, A.DISPLAY_NAME, A.MSG_TEXT, \
-                       (SELECT COUNT(*) FROM %s B WHERE B.CONV_ID = A.CONV_ID AND B.PROTECTED = 1) AS PROTECTED \
-                       FROM %s A WHERE A.CONV_ID = %d;",
-                       MSGFW_MESSAGE_TABLE_NAME, MSGFW_CONVERSATION_TABLE_NAME, threadId);
-
-       msg_error_t  err = dbHandle.getTable(sqlQuery, &rowCnt);
+       snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.CONV_ID, A.UNREAD_CNT, A.SMS_CNT, A.MMS_CNT, "
+                       "A.MAIN_TYPE, A.SUB_TYPE, A.MSG_DIRECTION, A.DISPLAY_TIME, A.DISPLAY_NAME, A.MSG_TEXT, "
+                       "(SELECT COUNT(*) FROM %s B WHERE B.CONV_ID = A.CONV_ID AND B.PROTECTED = 1) AS PROTECTED, "
+                       "(SELECT COUNT(*) FROM %s B WHERE B.CONV_ID = A.CONV_ID AND B.FOLDER_ID = %d) AS DRAFT, "
+                       "(SELECT COUNT(*) FROM %s B WHERE B.CONV_ID = A.CONV_ID AND B.NETWORK_STATUS = %d) AS FAILED, "
+                       "(SELECT COUNT(*) FROM %s B WHERE B.CONV_ID = A.CONV_ID AND B.NETWORK_STATUS = %d) AS SENDING, "
+                       "(SELECT SIM_INDEX FROM %s B WHERE B.CONV_ID = A.CONV_ID) "
+                       "FROM %s A WHERE A.CONV_ID = %d AND A.SMS_CNT + A.MMS_CNT > 0;",
+                       MSGFW_MESSAGE_TABLE_NAME,
+                       MSGFW_MESSAGE_TABLE_NAME, MSG_DRAFT_ID,
+                       MSGFW_MESSAGE_TABLE_NAME, MSG_NETWORK_SEND_FAIL,
+                       MSGFW_MESSAGE_TABLE_NAME, MSG_NETWORK_SENDING,
+                       MSGFW_MESSAGE_TABLE_NAME,
+                       MSGFW_CONVERSATION_TABLE_NAME, threadId);
+
+       msg_error_t  err = dbHandle->getTable(sqlQuery, &rowCnt);
 
        if (err == MSG_ERR_DB_NORECORD) {
-               dbHandle.freeTable();
+               dbHandle->freeTable();
                return MSG_SUCCESS;
        } else if (err != MSG_SUCCESS) {
-               MSG_DEBUG("%s", sqlQuery);
-               dbHandle.freeTable();
+               MSG_DEBUG("Fail to getTable().");
+               dbHandle->freeTable();
                return err;
        }
 
        if (rowCnt < 1) {
                MSG_DEBUG("rowCnt is %d", rowCnt);
-               dbHandle.freeTable();
+               dbHandle->freeTable();
                return err;
        } else {
-               pThreadInfo->threadId = dbHandle.getColumnToInt(index++);
+               pThreadInfo->threadId = dbHandle->getColumnToInt(index++);
 
-               pThreadInfo->unreadCnt = dbHandle.getColumnToInt(index++);
-               pThreadInfo->smsCnt = dbHandle.getColumnToInt(index++);
-               pThreadInfo->mmsCnt = dbHandle.getColumnToInt(index++);
+               pThreadInfo->unreadCnt = dbHandle->getColumnToInt(index++);
+               pThreadInfo->smsCnt = dbHandle->getColumnToInt(index++);
+               pThreadInfo->mmsCnt = dbHandle->getColumnToInt(index++);
 
-               pThreadInfo->mainType = dbHandle.getColumnToInt(index++);
-               pThreadInfo->subType = dbHandle.getColumnToInt(index++);
+               pThreadInfo->mainType = dbHandle->getColumnToInt(index++);
+               pThreadInfo->subType = dbHandle->getColumnToInt(index++);
 
-               pThreadInfo->direction = dbHandle.getColumnToInt(index++);
-               pThreadInfo->threadTime = (time_t)dbHandle.getColumnToInt(index++);
+               pThreadInfo->direction = dbHandle->getColumnToInt(index++);
+               pThreadInfo->threadTime = (time_t)dbHandle->getColumnToInt(index++);
 
                memset(pThreadInfo->threadName, 0x00, sizeof(pThreadInfo->threadName));
-               dbHandle.getColumnToString(index++, MAX_THREAD_NAME_LEN, pThreadInfo->threadName);
+               dbHandle->getColumnToString(index++, MAX_THREAD_NAME_LEN, pThreadInfo->threadName);
 
                memset(pThreadInfo->threadData, 0x00, sizeof(pThreadInfo->threadData));
-               dbHandle.getColumnToString(index++, MAX_THREAD_DATA_LEN, pThreadInfo->threadData);
+               dbHandle->getColumnToString(index++, MAX_THREAD_DATA_LEN, pThreadInfo->threadData);
 
-               int protectedCnt = dbHandle.getColumnToInt(index++);
+               int protectedCnt = dbHandle->getColumnToInt(index++);
                if (protectedCnt > 0)
                        pThreadInfo->bProtected = true;
+
+               int draftCnt = dbHandle->getColumnToInt(index++);
+               if (draftCnt > 0)
+                       pThreadInfo->bDraft = true;
+
+               int failedCnt = dbHandle->getColumnToInt(index++);
+               if (failedCnt > 0)
+                       pThreadInfo->bSendFailed = true;
+
+               int sendingCnt = dbHandle->getColumnToInt(index++);
+               if (sendingCnt > 0)
+                       pThreadInfo->bSending = true;
+
+               pThreadInfo->simIndex = dbHandle->getColumnToInt(index++);
        }
 
-       dbHandle.freeTable();
+       dbHandle->freeTable();
 
        MSG_END();
 
@@ -3412,176 +2725,367 @@ msg_error_t MsgStoGetThreadInfo(msg_thread_id_t threadId, MSG_THREAD_VIEW_S *pTh
 }
 
 
-msg_error_t MsgStoGetMessageList(msg_folder_id_t folderId, msg_thread_id_t threadId, msg_message_type_t msgType, msg_storage_id_t storageId, msg_struct_list_s *pMsgList)
+msg_error_t MsgStoRestoreMessage(MSG_MESSAGE_INFO_S *pMsg, MSG_SENDINGOPT_INFO_S *pSendOptInfo)
 {
-       // Clear Out Parameter
-       pMsgList->nCount = 0;
-       pMsgList->msg_struct_info = NULL;
-
-       int rowCnt = 0;
-       int index = 19; // numbers of index
+       MSG_BEGIN();
 
+       MsgDbHandler *dbHandle = getDbHandle();
+       msg_error_t err = MSG_SUCCESS;
        char sqlQuery[MAX_QUERY_LEN+1];
-       char sqlQuerySubset[(MAX_QUERY_LEN/5)+1];
 
-       // Get Name Order
-       int order = MsgGetContactNameOrder();
+       if(MsgExistConversation(dbHandle, pMsg->threadId))
+       {
+               // add message to address table  which having same thread_id and datetime;
+               for (int i=0; i<pMsg->nAddressCnt; i++) {
+                       if(MsgExistAddress(dbHandle, pMsg, pMsg->threadId, i) == false)
+                       {
+                               unsigned int addrId;
+                               MSG_CONTACT_INFO_S contactInfo;
+                               memset(&contactInfo, 0x00, sizeof(MSG_CONTACT_INFO_S));
+
+                               // Get Contact Info
+//                             if (MsgGetContactInfo(&(pMsg->addressList[i]), &contactInfo) != MSG_SUCCESS) {
+//                                     MSG_DEBUG("MsgGetContactInfo() fail.");
+//                             }
+                               err = dbHandle->getRowId(MSGFW_ADDRESS_TABLE_NAME, &addrId);
+                               if (err != MSG_SUCCESS) {
+                                       MSG_DEBUG("pDbHandle->getRowId fail. [%d]", err);
+                                       return err;
+                               }
 
-       memset(sqlQuery, 0x00, sizeof(sqlQuery));
+                               // Add Address
+                               memset(sqlQuery, 0x00, sizeof(sqlQuery));
+                               snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, %d, %d, %d, '%s', %d, %d, ?, ?, ?, ?, ?, '%s', 0);",
+                                                       MSGFW_ADDRESS_TABLE_NAME, addrId, pMsg->threadId, pMsg->addressList[i].addressType, pMsg->addressList[i].recipientType, pMsg->addressList[i].addressVal,
+                                                       contactInfo.contactId, contactInfo.addrbookId, contactInfo.imagePath);
 
-       snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID, CONV_ID, FOLDER_ID, STORAGE_ID, MAIN_TYPE, SUB_TYPE, \
-                       DISPLAY_TIME, DATA_SIZE, NETWORK_STATUS, READ_STATUS, PROTECTED, BACKUP, PRIORITY, \
-                       MSG_DIRECTION, SCHEDULED_TIME, SUBJECT, MSG_TEXT, ATTACHMENT_COUNT, THUMB_PATH \
-                       FROM %s WHERE ", MSGFW_MESSAGE_TABLE_NAME);
+                               MSG_SEC_DEBUG("Add Address Info. [%s]", sqlQuery);
 
+                               if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
+                                       return MSG_ERR_DB_PREPARE;
 
-       //// folder
-       memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
+                               dbHandle->bindText(contactInfo.firstName, 1);
+                               dbHandle->bindText(contactInfo.lastName, 2);
+                               dbHandle->bindText(contactInfo.middleName, 3);
+                               dbHandle->bindText(contactInfo.prefix, 4);
+                               dbHandle->bindText(contactInfo.suffix, 5);
 
-       if (folderId == MSG_ALLBOX_ID)
-               snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "FOLDER_ID > 0 AND FOLDER_ID < %d ", MSG_CBMSGBOX_ID);
-       else if (folderId == MSG_IOSBOX_ID)
-               snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "FOLDER_ID > 0 AND FOLDER_ID < %d ", MSG_DRAFT_ID);
-       else
-               snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "FOLDER_ID = %d ", folderId);
+                               if (dbHandle->stepQuery() != MSG_ERR_DB_DONE) {
+                                       dbHandle->finalizeQuery();
+                                       return MSG_ERR_DB_STEP;
+                               }
 
-       strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
+                               dbHandle->finalizeQuery();
 
+                               // set conversation display name by conv id
+                               MsgStoSetConversationDisplayName(dbHandle, pMsg->threadId);
+                       }
+               }
 
-       //// thread
-       memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
 
-       if (threadId > 0)
-               snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND CONV_ID = %d ", threadId);
+               if(!MsgExistMessage(dbHandle, pMsg))
+               {
+                       unsigned int rowId = 0;
 
-       strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
+                       if(pMsg->threadId > 0 && pMsg->folderId == MSG_DRAFT_ID) {
+                               memset(sqlQuery, 0x00, sizeof(sqlQuery));
 
+                               snprintf(sqlQuery, sizeof(sqlQuery),
+                                               "DELETE FROM %s WHERE CONV_ID = %d AND FOLDER_ID = %d;",
+                                               MSGFW_MESSAGE_TABLE_NAME, pMsg->threadId, MSG_DRAFT_ID);
 
-       //// msg type
-       memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
+                               MSG_DEBUG("sqlQuery [%s]", sqlQuery);
 
-       switch (msgType) {
-               case MSG_TYPE_SMS:
-                       snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND MAIN_TYPE = %d AND SUB_TYPE = %d ", MSG_SMS_TYPE, MSG_NORMAL_SMS);
-                       break;
+                               err = dbHandle->execQuery(sqlQuery);
 
-               case MSG_TYPE_MMS:
-                       snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND MAIN_TYPE = %d ", MSG_MMS_TYPE);
-                       break;
+                               if (err != MSG_SUCCESS) {
+                                       MSG_DEBUG("fail to delete draft messages.");
+                               }
+                       }
 
-               case MSG_TYPE_MMS_JAVA:
-                       snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND MAIN_TYPE = %d AND SUB_TYPE = %d ", MSG_MMS_TYPE, MSG_SENDREQ_JAVA_MMS);
-                       break;
+                       err = dbHandle->getRowId(MSGFW_MESSAGE_TABLE_NAME, &rowId);
 
-               case MSG_TYPE_SMS_SYNCML:
-                       snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND MAIN_TYPE = %d AND SUB_TYPE = %d ", MSG_SMS_TYPE, MSG_SYNCML_CP);
-                       break;
+                       pMsg->msgId = (msg_message_id_t)rowId;
 
-               case MSG_TYPE_SMS_REJECT:
-                       snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND MAIN_TYPE = %d AND SUB_TYPE = %d ", MSG_SMS_TYPE, MSG_REJECT_SMS);
-                       break;
+                       int fileSize = 0;
 
-               default:
-                       MSG_DEBUG("msg type is not set.");
-       }
+                       char *pFileData = NULL;
+                       AutoPtr<char> buf(&pFileData);
 
-       strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
+                       // Get File Data
+                       if (pMsg->bTextSms == false) {
+                               if (MsgOpenAndReadFile(pMsg->msgData, &pFileData, &fileSize) == false) {
+                                       return MSG_ERR_STORAGE_ERROR;
+                               }
+                               MSG_DEBUG("file size [%d]", fileSize);
+                       }
 
-       //// storage
-       memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
+                       char keyName[MAX_VCONFKEY_NAME_LEN];
+                       memset(keyName, 0x00, sizeof(keyName));
+                       snprintf(keyName, sizeof(keyName), "%s/%d", MSG_SIM_SUBS_ID, pMsg->sim_idx);
 
-       if (storageId > MSG_STORAGE_UNKNOWN)
-               snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND STORAGE_ID = %d ", storageId);
+                       char *imsi = MsgSettingGetString(keyName);
 
-       strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
+                       // Add Message
+                       memset(sqlQuery, 0x00, sizeof(sqlQuery));
 
+                       snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, %d, %d, %d, %d, %d, %ld, %d, %d, %d, %d, %d, %d, 0, %d, ?, '', '', ?, 0, %d, '%s');",
+                                       MSGFW_MESSAGE_TABLE_NAME, rowId, pMsg->threadId, pMsg->folderId, pMsg->storageId, pMsg->msgType.mainType, pMsg->msgType.subType,
+                                       pMsg->displayTime, pMsg->dataSize, pMsg->networkStatus, pMsg->bRead, pMsg->bProtected, pMsg->priority, pMsg->direction,
+                                       pMsg->bBackup, (int)pMsg->sim_idx, imsi);
 
-       /// order
-       memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
-       snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "ORDER BY DISPLAY_TIME DESC;");
 
-       strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
+                       MSG_DEBUG("QUERY : %s", sqlQuery);
 
-       msg_error_t err = dbHandle.getTable(sqlQuery, &rowCnt);
+                       if (imsi) {
+                               free(imsi);
+                               imsi = NULL;
+                       }
 
-       if (err == MSG_ERR_DB_NORECORD) {
-               dbHandle.freeTable();
+                       if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
+                               return MSG_ERR_DB_EXEC;
+                       }
 
-               return MSG_SUCCESS;
-       } else if (err != MSG_SUCCESS) {
-               MSG_DEBUG("Get table fail. [%s]", sqlQuery);
+                       dbHandle->bindText(pMsg->subject, 1);
 
-               dbHandle.freeTable();
+                       if (pMsg->bTextSms == false)
+                               dbHandle->bindText(pFileData, 2);
+                       else
+                               dbHandle->bindText(pMsg->msgText, 2);
 
-               return err;
+                       if (dbHandle->stepQuery() != MSG_ERR_DB_DONE) {
+                               dbHandle->finalizeQuery();
+                               return MSG_ERR_DB_EXEC;
+                       }
+
+                       dbHandle->finalizeQuery();
+
+                       if (pMsg->msgType.subType != MSG_SENDREQ_MMS) {
+                               err = MsgStoUpdateConversation(dbHandle, pMsg->threadId);
+
+                               if (err != MSG_SUCCESS) {
+                                       return err;
+                               }
+                       }
+
+                       /* In the case of MMS Message, load the MMS plugin to save MMS PDU */
+                       if (pMsg->msgType.mainType == MSG_MMS_TYPE) {
+                               MMS_MESSAGE_DATA_S mmsMsg;
+                               memset(&mmsMsg, 0x00, sizeof(MMS_MESSAGE_DATA_S));
+
+                               if (pMsg->msgType.subType != MSG_DELIVERYIND_MMS && pMsg->msgType.subType != MSG_READORGIND_MMS) {
+                                       MsgPlugin *plg = MsgPluginManager::instance()->getPlugin(MSG_MMS_TYPE);
+
+                                       err = plg->addMessage(pMsg, pSendOptInfo, pFileData);
+
+                                       if (err != MSG_SUCCESS)
+                                               return MSG_ERR_STORAGE_ERROR;
+
+                                       if (pMsg->msgType.subType == MSG_SENDREQ_MMS) {
+                                               MSG_SEC_DEBUG("pMsg->msgText: %s, pMsg->thumbPath: %s ", pMsg->msgText, pMsg->thumbPath);
+
+                                               err = MsgStoUpdateMMSMessage(pMsg);
+
+                                               if (err != MSG_SUCCESS)
+                                                       return MSG_ERR_STORAGE_ERROR;
+
+                                       }
+                               }
+                       }
+
+               }
+       }
+       else
+       {
+               // add message to conversation, message, address table;
+               pMsg->msgId = 0;
+               err = MsgStoAddMessage(pMsg, pSendOptInfo);
        }
 
-       pMsgList->nCount = rowCnt;
+       MSG_END();
 
-       MSG_DEBUG("pMsgList->nCount [%d]", pMsgList->nCount);
+       return err;
+}
 
-       pMsgList->msg_struct_info = (msg_struct_t *)new char[sizeof(msg_struct_t) * rowCnt];
 
-       MSG_MESSAGE_HIDDEN_S *pTmp = NULL;
-       msg_struct_s *msg = NULL;
+msg_message_id_t MsgStoAddSimMessage(MSG_MESSAGE_INFO_S *pMsg, int *simIdList, int listSize)
+{
+       MSG_BEGIN();
+       MsgDbHandler *dbHandle = getDbHandle();
+       if (pMsg == NULL || pMsg->msgType.mainType == MSG_MMS_TYPE) {
+               MSG_DEBUG("pMsg == NULL || pMsg->msgType.mainType == MSG_MMS_TYPE");
+               return 0;
+       }
 
-       for (int i = 0; i < rowCnt; i++) {
-               pMsgList->msg_struct_info[i] = (msg_struct_t)new msg_struct_s;
-
-               msg = (msg_struct_s *)pMsgList->msg_struct_info[i];
-
-               msg->type = MSG_STRUCT_MESSAGE_INFO;
-               msg->data = (int *)new char[sizeof(MSG_MESSAGE_HIDDEN_S)];
-
-               pTmp = (MSG_MESSAGE_HIDDEN_S *)msg->data;
-
-               memset(pTmp, 0x00, sizeof(MSG_MESSAGE_HIDDEN_S));
-
-               pTmp->pData = NULL;
-               pTmp->pMmsData = NULL;
-
-               pTmp->msgId = dbHandle.getColumnToInt(index++);
-               pTmp->threadId = dbHandle.getColumnToInt(index++);
-               pTmp->folderId = dbHandle.getColumnToInt(index++);
-               pTmp->storageId = dbHandle.getColumnToInt(index++);
-               pTmp->mainType = dbHandle.getColumnToInt(index++);
-               pTmp->subType = dbHandle.getColumnToInt(index++);
-               pTmp->displayTime = (time_t)dbHandle.getColumnToInt(index++);
-               pTmp->dataSize = dbHandle.getColumnToInt(index++);
-               pTmp->networkStatus = dbHandle.getColumnToInt(index++);
-               pTmp->bRead = dbHandle.getColumnToInt(index++);
-               pTmp->bProtected = dbHandle.getColumnToInt(index++);
-               pTmp->bBackup = dbHandle.getColumnToInt(index++);
-               pTmp->priority = dbHandle.getColumnToInt(index++);
-               pTmp->direction = dbHandle.getColumnToInt(index++);
-               index++; // This field is reserved.
-
-               dbHandle.getColumnToString(index++, MAX_SUBJECT_LEN, pTmp->subject);
-
-               if (pTmp->mainType == MSG_MMS_TYPE &&
-                       (pTmp->networkStatus == MSG_NETWORK_RETRIEVING || pTmp->networkStatus == MSG_NETWORK_RETRIEVE_FAIL || pTmp->subType == MSG_NOTIFICATIONIND_MMS)) {
-                       pTmp->pData = NULL;
-                       index++;
+       if ((pMsg->msgType.subType >= MSG_REPLACE_TYPE1_SMS) && (pMsg->msgType.subType <= MSG_REPLACE_TYPE7_SMS)) {
+               if (pMsg->msgId > 0) {
+                       pMsg->bRead = false;
+                       if (MsgStoUpdateMessage(pMsg, NULL) != MSG_SUCCESS) {
+                               MSG_DEBUG("MsgStoUpdateMessage is failed!!!");
+                       }
                } else {
-                       pTmp->pData = (void *)new char[pTmp->dataSize+2];
-                       memset(pTmp->pData, 0x00, pTmp->dataSize+2);
+                       if (MsgStoAddMessage(pMsg, NULL) != MSG_SUCCESS) {
+                               MSG_DEBUG("MsgStoAddMessage is failed!!!");
+                       }
+               }
+       } else {
+               pMsg->msgId = 0;
+               if (MsgStoAddMessage(pMsg, NULL) != MSG_SUCCESS) {
+                       MSG_DEBUG("MsgStoAddMessage is failed!!!");
+               }
+       }
+
+       if(simIdList) {
+               dbHandle->beginTrans();
+
+               MSG_DEBUG("simIdList exist.");
+               int simId = 0;
+               for(int i=0; i < listSize; ++i)
+               {
+                       if(simIdList[i]) {
+                               simId = simIdList[i] - 1;
+                               char sqlQuery[MAX_QUERY_LEN+1];
+                               memset(sqlQuery, 0x00, sizeof(sqlQuery));
+                               snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, %d, %d);",
+                                               MSGFW_SIM_MSG_TABLE_NAME, pMsg->sim_idx, simId, pMsg->msgId);
+
+                               MSG_DEBUG("QUERY : %s", sqlQuery);
 
-                       dbHandle.getColumnToString(index++, pTmp->dataSize+1, (char *)pTmp->pData);
+                               if (dbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
+                                       dbHandle->endTrans(false);
+                                       return 0;
+                               }
+                       } else {
+                               break;
+                       }
+               }
+
+               dbHandle->endTrans(true);
+       }
+
+       MSG_END();
+
+       return pMsg->msgId;
+}
+
+#ifdef FEATURE_SMS_CDMA
+msg_error_t MsgCheckUniqueness(bool bInsert, msg_message_id_t msgId, MSG_UNIQUE_INDEX_S *p_msg)
+{
+       MSG_BEGIN();
+
+       MsgDbHandler *dbHandle = getDbHandle();
+       int nRowCnt = 0;
+
+       char sqlQuery[MAX_QUERY_LEN+1];
+
+       if (!bInsert) {
+               memset(sqlQuery, 0x00, sizeof(sqlQuery));
+               dbHandle->beginTrans();
+
+               snprintf(sqlQuery, sizeof(sqlQuery), "SELECT * FROM %s WHERE TELE_MSG_ID = %d AND ADDRESS = '%s' AND SUB_ADDRESS = '%s' AND TIME_STAMP = '%s' AND TELESVC_ID = %d;",
+                                       MSGFW_UNIQUENESS_INFO_TABLE_NAME, p_msg->tele_msgId, p_msg->address, p_msg->sub_address, p_msg->time_stamp, p_msg->telesvc_id);
+
+               dbHandle->getTable(sqlQuery, &nRowCnt);
+               MSG_DEBUG("nRowCnt = [%d]", nRowCnt);
+
+               dbHandle->freeTable();
+               dbHandle->endTrans(true);
+
+               if (nRowCnt == 0) {
+                       MSG_DEBUG("<<<<This incoming message is a new message>>>>");
+                       return MSG_SUCCESS;
+               }
+               else {
+                       MSG_DEBUG("<<<<This incoming message is a repeated message>>>>");
+                       return MSG_ERR_UNKNOWN;
+               }
+       }
+       else {
+               memset(sqlQuery, 0x00, sizeof(sqlQuery));
+               dbHandle->beginTrans();
+
+               snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, %d, '%s', '%s', '%s', %d);",
+                                       MSGFW_UNIQUENESS_INFO_TABLE_NAME, msgId, p_msg->tele_msgId, p_msg->address, p_msg->sub_address, p_msg->time_stamp, p_msg->telesvc_id);
+
+               dbHandle->execQuery(sqlQuery);
+               dbHandle->endTrans(true);
+       }
+
+       MSG_END();
+
+       return MSG_SUCCESS;
+}
+#endif
+
+msg_error_t MsgStoUpdateIMSI(int sim_idx)
+{
+       MSG_BEGIN();
+       MSG_DEBUG("sim_idx = %d", sim_idx);
+
+//     msg_error_t err = MSG_SUCCESS;
+       MsgDbHandler *dbHandle = getDbHandle();
+
+       char sqlQuery[MAX_QUERY_LEN+1];
+       char keyName[MAX_VCONFKEY_NAME_LEN];
+
+       dbHandle->beginTrans();
+
+       if(sim_idx == 0){
+               MSG_DEBUG("sim index is 0");
+               memset(sqlQuery, 0x00, sizeof(sqlQuery));
+
+               snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET SIM_INDEX = 0;",
+                               MSGFW_MESSAGE_TABLE_NAME);
+
+               if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
+                       dbHandle->endTrans(false);
+                       return MSG_ERR_DB_EXEC;
+               }
+
+               if (dbHandle->stepQuery() != MSG_ERR_DB_DONE) {
+                       dbHandle->finalizeQuery();
+                       dbHandle->endTrans(false);
+                       return MSG_ERR_DB_EXEC;
                }
+       }
+       else
+       {
+               MSG_DEBUG("sim index is %d", sim_idx);
 
-               pTmp->attachCount = dbHandle.getColumnToInt(index++);
+               memset(keyName, 0x00, sizeof(keyName));
+               sprintf(keyName, "%s/%d", MSG_SIM_SUBS_ID, sim_idx);
+
+               char *imsi = MsgSettingGetString(keyName);
+
+               MSG_DEBUG("imsi value exist -> %s", imsi);
+
+               memset(sqlQuery, 0x00, sizeof(sqlQuery));
 
-               dbHandle.getColumnToString(index++, MSG_FILEPATH_LEN_MAX, pTmp->thumbPath);
+               snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET SIM_INDEX = %d \
+                               WHERE SIM_IMSI LIKE '%s';",
+                               MSGFW_MESSAGE_TABLE_NAME, sim_idx, imsi);
 
-               // add address information.
-               order = MsgGetContactNameOrder();
+               if (imsi) {
+                       free(imsi);
+                       imsi = NULL;
+               }
 
-               msg_struct_list_s *addr_list = (msg_struct_list_s *)new msg_struct_list_s;
-               MsgStoGetAddressByMsgId(&dbHandle, pTmp->msgId, order, addr_list);
+               if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
+                       dbHandle->endTrans(false);
+                       return MSG_ERR_DB_EXEC;
+               }
 
-               pTmp->addr_list = addr_list;
+               if (dbHandle->stepQuery() != MSG_ERR_DB_DONE) {
+                       dbHandle->finalizeQuery();
+                       dbHandle->endTrans(false);
+                       return MSG_ERR_DB_EXEC;
+               }
        }
-       dbHandle.freeTable();
+
+       dbHandle->finalizeQuery();
+       dbHandle->endTrans(true);
+
+       MSG_END();
 
        return MSG_SUCCESS;
 }