2 * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
20 #include <tr1/unordered_set>
24 #include <boost/filesystem.hpp>
25 #include <boost/chrono/detail/system.hpp>
28 #include "MsgUtilFile.h"
29 #include "MsgContact.h"
30 #include "MsgCppTypes.h"
31 #include "MsgGconfWrapper.h"
32 #include "MsgUtilFunction.h"
33 #include "MsgUtilStorage.h"
34 #include "MsgException.h"
36 static int msgCntLimit[MSG_COUNT_LIMIT_MAILBOX_TYPE_MAX][MSG_COUNT_LIMIT_MSG_TYPE_MAX] = {{10, 10, 0, 10, 10}, {5, 10, 0, 0, 0}, {10, 10, 0, 0, 0}, {10, 10, 0, 0, 0}, {0, 0, 10, 0, 0}};
40 #define CHECK_SIZE 1 * 1024 * 1024 * 1024
41 #define RESERVE 100 * 1024 * 1024
42 #define RESERVE_LITE 5 * 1024 * 1024
44 /*==================================================================================================
45 FUNCTION IMPLEMENTATION
46 ==================================================================================================*/
48 unsigned int MsgStoAddMessageTable(MsgDbHandler *pDbHandle, const MSG_MESSAGE_INFO_S *pMsgInfo)
52 msg_error_t err = MSG_SUCCESS;
54 msg_message_id_t msgId = 0;
56 err = pDbHandle->getRowId(MSGFW_MESSAGE_TABLE_NAME, &msgId);
58 if (err != MSG_SUCCESS)
63 char* pFileData = NULL;
64 unique_ptr<char*, void(*)(char**)> buf(&pFileData, unique_ptr_deleter);
67 if (pMsgInfo->bTextSms == false) {
68 if (MsgOpenAndReadFile(pMsgInfo->msgData, &pFileData, &fileSize) == false)
71 MSG_DEBUG("file size [%d]", fileSize);
74 char keyName[MAX_VCONFKEY_NAME_LEN];
75 memset(keyName, 0x00, sizeof(keyName));
76 snprintf(keyName, sizeof(keyName), "%s/%d", MSG_SIM_SUBS_ID, pMsgInfo->sim_idx);
79 if (MsgSettingGetString(keyName, &imsi) != MSG_SUCCESS) {
80 MSG_INFO("MsgSettingGetString() is failed");
84 char sqlQuery[MAX_QUERY_LEN+1];
86 memset(sqlQuery, 0x00, sizeof(sqlQuery));
87 snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, %d, %d, %d, %d, %d, %lu, %zu, %d, %d, %d, %d, %d, %d, %d, ?, '', '', ?, 0, %d, '%s', %d);",
88 MSGFW_MESSAGE_TABLE_NAME, msgId, pMsgInfo->threadId, pMsgInfo->folderId, pMsgInfo->storageId, pMsgInfo->msgType.mainType,
89 pMsgInfo->msgType.subType, pMsgInfo->displayTime, pMsgInfo->dataSize, pMsgInfo->networkStatus, pMsgInfo->bRead, pMsgInfo->bProtected,
90 pMsgInfo->priority, pMsgInfo->direction, 0, pMsgInfo->bBackup, pMsgInfo->sim_idx, imsi, pMsgInfo->bRestricted);
92 MSG_DEBUG("QUERY : %s", sqlQuery);
97 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
100 pDbHandle->bindText(pMsgInfo->subject, 1);
102 if (pMsgInfo->msgType.subType == MSG_NOTIFICATIONIND_MMS) {
103 pDbHandle->bindText("", 2);
105 if (pMsgInfo->bTextSms == false)
106 pDbHandle->bindText(pFileData, 2);
108 pDbHandle->bindText(pMsgInfo->msgText, 2);
111 if (pDbHandle->stepQuery() != MSG_ERR_DB_DONE) {
112 pDbHandle->finalizeQuery();
116 pDbHandle->finalizeQuery();
122 msg_error_t MsgStoSetReadStatus(MsgDbHandler *pDbHandle, msg_message_id_t msgId, bool bRead)
124 char sqlQuery[MAX_QUERY_LEN+1];
126 memset(sqlQuery, 0x00, sizeof(sqlQuery));
127 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET READ_STATUS = %d WHERE MSG_ID = %d;",
128 MSGFW_MESSAGE_TABLE_NAME, (int)bRead, msgId);
130 if (pDbHandle->execQuery(sqlQuery) != MSG_SUCCESS)
131 return MSG_ERR_DB_EXEC;
133 /* Get MAIN_TYPE, SUB_TYPE, STORAGE_ID */
134 memset(sqlQuery, 0x00, sizeof(sqlQuery));
135 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.MAIN_TYPE, A.SUB_TYPE, B.CONV_ID \
136 FROM %s A, %s B WHERE A.MSG_ID = %d AND A.CONV_ID = B.CONV_ID;",
137 MSGFW_MESSAGE_TABLE_NAME, MSGFW_CONVERSATION_TABLE_NAME, msgId);
139 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
140 return MSG_ERR_DB_PREPARE;
142 MSG_MESSAGE_TYPE_S msgType;
143 msg_thread_id_t convId;
145 if (pDbHandle->stepQuery() == MSG_ERR_DB_ROW) {
146 msgType.mainType = pDbHandle->columnInt(0);
147 msgType.subType = pDbHandle->columnInt(1);
148 convId = pDbHandle->columnInt(2);
150 pDbHandle->finalizeQuery();
151 return MSG_ERR_DB_STEP;
154 pDbHandle->finalizeQuery();
156 MSG_DEBUG("Main Type:[%d] SubType:[%d] ConvId:[%d]", msgType.mainType, msgType.subType, convId);
158 if (MsgStoUpdateConversation(pDbHandle, convId) != MSG_SUCCESS) {
159 MSG_DEBUG("MsgStoUpdateConversation() Error");
160 return MSG_ERR_STORAGE_ERROR;
167 msg_error_t MsgStoGetOldestMessage(MsgDbHandler *pDbHandle, const MSG_MESSAGE_INFO_S *pMsgInfo, msg_message_id_t *pMsgId)
169 char sqlQuery[MAX_QUERY_LEN+1];
171 memset(sqlQuery, 0x00, sizeof(sqlQuery));
173 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s \
174 WHERE SUB_TYPE = %d AND FOLDER_ID = %d AND STORAGE_ID = %d AND PROTECTED = 0 \
175 ORDER BY DISPLAY_TIME ASC",
176 MSGFW_MESSAGE_TABLE_NAME, pMsgInfo->msgType.subType, pMsgInfo->folderId, MSG_STORAGE_PHONE);
178 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
179 return MSG_ERR_DB_PREPARE;
181 if (pDbHandle->stepQuery() == MSG_ERR_DB_ROW) {
182 *pMsgId = pDbHandle->columnInt(0);
184 pDbHandle->finalizeQuery();
185 return MSG_ERR_DB_STEP;
188 pDbHandle->finalizeQuery();
194 msg_error_t MsgStoCheckMsgCntFull(MsgDbHandler *pDbHandle, const MSG_MESSAGE_TYPE_S* pMsgType, msg_folder_id_t folderId)
198 msg_error_t err = MSG_SUCCESS;
200 boost::system::error_code ec;
201 boost::filesystem::space_info si = boost::filesystem::space(TZ_SYS_HOME_PATH, ec);
202 long long int available = 0;
205 MSG_ERR("Failed to get space info [%s]", ec.message().c_str());
206 return MSG_ERR_STORAGE_ERROR;
208 if (si.capacity < CHECK_SIZE)
209 available = si.available - RESERVE_LITE;
211 available = si.available - RESERVE;
216 MSG_DEBUG("Free space of storage is [%llu] Bytes.", available);
218 if (available < SMS_MINIMUM_SPACE && pMsgType->mainType == MSG_SMS_TYPE)
219 err = MSG_ERR_MESSAGE_COUNT_FULL;
220 else if (available < MMS_MINIMUM_SPACE && pMsgType->mainType == MSG_MMS_TYPE)
221 err = MSG_ERR_MESSAGE_COUNT_FULL;
230 msg_error_t MsgStoCountMsgByLimitCategory(MsgDbHandler *pDbHandle, const MSG_MESSAGE_TYPE_S *pMsgType, int *pMsgCount, msg_folder_id_t folderId)
232 if (pMsgType == NULL) {
233 MSG_DEBUG("pMsgType is NULL");
234 return MSG_ERR_NULL_POINTER;
239 char sqlQuery[MAX_QUERY_LEN+1];
240 memset(sqlQuery, 0x00, sizeof(sqlQuery));
242 if ((pMsgType->mainType == MSG_SMS_TYPE) && (pMsgType->subType == MSG_WAP_SI_SMS ||pMsgType->subType == MSG_WAP_SL_SMS)) { /* PUSH */
243 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s WHERE MAIN_TYPE = %d AND SUB_TYPE IN (%d, %d) AND FOLDER_ID = %d;",
244 MSGFW_MESSAGE_TABLE_NAME, pMsgType->mainType, MSG_WAP_SI_SMS, MSG_WAP_SL_SMS, MSG_INBOX_ID);
245 } else if ((pMsgType->mainType == MSG_SMS_TYPE) && (pMsgType->subType == MSG_CB_SMS)) { /* CB */
246 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s WHERE MAIN_TYPE = %d AND SUB_TYPE IN (%d) AND FOLDER_ID = %d;",
247 MSGFW_MESSAGE_TABLE_NAME, pMsgType->mainType, MSG_CB_SMS, MSG_CBMSGBOX_ID);
248 } else if ((pMsgType->mainType == MSG_SMS_TYPE) && (pMsgType->subType == MSG_SYNCML_CP)) { /* Provision */
249 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s WHERE MAIN_TYPE = %d AND SUB_TYPE IN (%d) AND FOLDER_ID = %d;",
250 MSGFW_MESSAGE_TABLE_NAME, pMsgType->mainType, MSG_SYNCML_CP, MSG_INBOX_ID);
251 } else if ((pMsgType->mainType == MSG_SMS_TYPE)) { /* SMS */
252 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s WHERE MAIN_TYPE = %d AND SUB_TYPE NOT IN (%d, %d, %d, %d) AND FOLDER_ID = %d;",
253 MSGFW_MESSAGE_TABLE_NAME, pMsgType->mainType, MSG_WAP_SI_SMS, MSG_WAP_SL_SMS, MSG_CB_SMS, MSG_SYNCML_CP, MSG_INBOX_ID); /* etc SMS */
254 } else if ((pMsgType->mainType == MSG_MMS_TYPE) &&
255 (pMsgType->subType == MSG_SENDREQ_MMS || pMsgType->subType == MSG_SENDCONF_MMS || pMsgType->subType == MSG_RETRIEVE_AUTOCONF_MMS ||
256 pMsgType->subType == MSG_RETRIEVE_MANUALCONF_MMS || pMsgType->subType == MSG_NOTIFICATIONIND_MMS)) { /* MMS */
257 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s WHERE MAIN_TYPE = %d AND SUB_TYPE IN (%d, %d, %d, %d, %d) AND FOLDER_ID = %d;",
258 MSGFW_MESSAGE_TABLE_NAME, pMsgType->mainType, MSG_SENDREQ_MMS, MSG_SENDCONF_MMS, MSG_RETRIEVE_AUTOCONF_MMS, MSG_RETRIEVE_MANUALCONF_MMS, MSG_NOTIFICATIONIND_MMS, folderId);
260 return MSG_ERR_INVALID_PARAMETER;
263 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
264 return MSG_ERR_DB_PREPARE;
266 if (pDbHandle->stepQuery() == MSG_ERR_DB_ROW) {
267 *pMsgCount = pDbHandle->columnInt(0);
269 pDbHandle->finalizeQuery();
270 return MSG_ERR_DB_STEP;
273 pDbHandle->finalizeQuery();
279 int MsgStoCheckMsgCntLimit(const MSG_MESSAGE_TYPE_S* pMsgType, msg_folder_id_t folderId)
286 msgboxType = MSG_COUNT_LIMIT_INBOX_TYPE;
290 msgboxType = MSG_COUNT_LIMIT_OUTBOX_TYPE;
293 case MSG_SENTBOX_ID :
294 msgboxType = MSG_COUNT_LIMIT_SENTBOX_TYPE;
298 msgboxType = MSG_COUNT_LIMIT_DRAFTBOX_TYPE;
301 case MSG_CBMSGBOX_ID :
302 msgboxType = MSG_COUNT_LIMIT_CBMSGBOX_TYPE;
306 MSG_DEBUG("Unknown mailbox Type [%d]", folderId);
310 switch (pMsgType->subType) {
312 case MSG_REPLACE_TYPE1_SMS:
313 case MSG_REPLACE_TYPE2_SMS:
314 case MSG_REPLACE_TYPE3_SMS:
315 case MSG_REPLACE_TYPE4_SMS:
316 case MSG_REPLACE_TYPE5_SMS:
317 case MSG_REPLACE_TYPE6_SMS:
318 case MSG_REPLACE_TYPE7_SMS:
319 case MSG_MWI_VOICE_SMS:
320 case MSG_MWI_FAX_SMS:
321 case MSG_MWI_EMAIL_SMS:
322 case MSG_MWI_OTHER_SMS:
323 case MSG_STATUS_REPORT_SMS:
324 msgType = MSG_COUNT_LIMIT_SMS_TYPE;
328 msgType = MSG_COUNT_LIMIT_CB_TYPE;
333 msgType = MSG_COUNT_LIMIT_WAPPUSH_TYPE;
337 msgType = MSG_COUNT_LIMIT_PROVISION_TYPE;
340 case MSG_SENDREQ_MMS:
341 case MSG_SENDCONF_MMS:
342 case MSG_NOTIFICATIONIND_MMS:
343 case MSG_RETRIEVE_AUTOCONF_MMS:
344 case MSG_RETRIEVE_MANUALCONF_MMS:
345 msgType = MSG_COUNT_LIMIT_MMS_TYPE;
349 MSG_DEBUG("Unknown Message Type [%d]", pMsgType->subType);
353 return msgCntLimit[msgboxType][msgType];
357 msg_error_t MsgStocheckMemoryStatus()
359 msg_error_t err = MSG_SUCCESS;
360 boost::system::error_code ec;
361 boost::filesystem::space_info si = boost::filesystem::space(TZ_SYS_HOME_PATH, ec);
362 long long int available = 0;
365 MSG_ERR("Failed to get space info [%s]", ec.message().c_str());
366 return MSG_ERR_STORAGE_ERROR;
369 if (si.capacity < CHECK_SIZE)
370 available = si.available - RESERVE_LITE;
372 available = si.available - RESERVE;
377 MSG_DEBUG("Free space of storage is [%llu] Bytes.", available);
379 if (available < SMS_MINIMUM_SPACE)
380 err = MSG_ERR_MESSAGE_COUNT_FULL;
382 MSG_DEBUG("Memory status =[%d]", err);
388 msg_error_t MsgStoAddAddress(MsgDbHandler *pDbHandle, const MSG_MESSAGE_INFO_S *pMsg, msg_thread_id_t *pConvId)
390 msg_error_t err = MSG_SUCCESS;
392 char sqlQuery[MAX_QUERY_LEN+1];
394 /* Check if new address or not */
395 if (MsgExistAddress(pDbHandle, pMsg, pConvId) == true) {
396 MSG_DEBUG("The address already exists. Conversation ID : [%d]", *pConvId);
397 MsgStoUpdateAddress(pDbHandle, pMsg, *pConvId);
402 *pConvId = pMsg->threadId;
404 /* conversation insert */
405 err = MsgStoAddConversation(pDbHandle, pConvId);
406 if (err != MSG_SUCCESS) {
407 MSG_DEBUG("MsgStoAddConversation() fail [%d]", err);
411 /* insert address in loop */
412 for (int i = 0; i < pMsg->nAddressCnt; i++) {
414 MSG_CONTACT_INFO_S contactInfo;
415 memset(&contactInfo, 0x00, sizeof(MSG_CONTACT_INFO_S));
417 /* Get Contact Info */
419 if (MsgGetContactInfo(&(pMsg->addressList[i]), &contactInfo) != MSG_SUCCESS) {
420 MSG_DEBUG("MsgGetContactInfo() fail.");
424 err = pDbHandle->getRowId(MSGFW_ADDRESS_TABLE_NAME, &addrId);
425 if (err != MSG_SUCCESS) {
426 MSG_DEBUG("pDbHandle->getRowId fail. [%d]", err);
431 memset(sqlQuery, 0x00, sizeof(sqlQuery));
432 snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, %d, %d, %d, '%s', %d, %d, ?, ?, ?, ?, ?, '%s', 0);",
433 MSGFW_ADDRESS_TABLE_NAME, addrId, *pConvId, pMsg->addressList[i].addressType, pMsg->addressList[i].recipientType, pMsg->addressList[i].addressVal,
434 contactInfo.contactId, contactInfo.addrbookId, contactInfo.imagePath);
436 MSG_SEC_DEBUG("Add Address Info. [%s]", sqlQuery);
438 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
439 return MSG_ERR_DB_PREPARE;
441 pDbHandle->bindText(contactInfo.firstName, 1);
442 pDbHandle->bindText(contactInfo.lastName, 2);
443 pDbHandle->bindText(contactInfo.middleName, 3);
444 pDbHandle->bindText(contactInfo.prefix, 4);
445 pDbHandle->bindText(contactInfo.suffix, 5);
447 if (pDbHandle->stepQuery() != MSG_ERR_DB_DONE) {
448 pDbHandle->finalizeQuery();
449 return MSG_ERR_DB_STEP;
452 pDbHandle->finalizeQuery();
456 /* set conversation display name by conv id */
457 MsgStoSetConversationDisplayName(pDbHandle, *pConvId);
462 msg_error_t MsgStoGetAddressByMsgId(MsgDbHandler *pDbHandle, msg_message_id_t msgId, int *nAddressCnt, MSG_ADDRESS_INFO_S **pAddress)
464 char sqlQuery[MAX_QUERY_LEN+1];
465 int rowCnt = 0, index = 0;
469 memset(sqlQuery, 0x00, sizeof(sqlQuery));
470 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT "
475 "WHERE A.CONV_ID = B.CONV_ID "
476 "AND B.MSG_ID = %d;",
477 MSGFW_ADDRESS_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME,
480 msg_error_t err = pDbHandle->getTable(sqlQuery, &rowCnt, &index);
482 if (err == MSG_ERR_DB_NORECORD) {
483 pDbHandle->freeTable();
485 } else if (err != MSG_SUCCESS) {
486 MSG_DEBUG("Fail to getTable().");
487 pDbHandle->freeTable();
491 *nAddressCnt = rowCnt;
493 MSG_DEBUG("*nAddressCnt [%d]", *nAddressCnt);
495 MSG_ADDRESS_INFO_S *tmpAddressList = (MSG_ADDRESS_INFO_S *)new char[sizeof(MSG_ADDRESS_INFO_S) * rowCnt];
496 memset(tmpAddressList, 0x00, sizeof(MSG_ADDRESS_INFO_S) * rowCnt);
497 *pAddress = tmpAddressList;
499 for (int i = 0; i < rowCnt; i++) {
500 tmpAddressList[i].addressType = pDbHandle->getColumnToInt(index++);
501 tmpAddressList[i].recipientType = pDbHandle->getColumnToInt(index++);
502 pDbHandle->getColumnToString(index++, MAX_ADDRESS_VAL_LEN, tmpAddressList[i].addressVal);
504 strncpy(tmpAddressList[i].displayName, tmpAddressList[i].addressVal, MAX_DISPLAY_NAME_LEN);
506 pDbHandle->freeTable();
511 msg_error_t MsgStoGetAddressByMsgId(MsgDbHandler *pDbHandle, msg_message_id_t msgId, msg_struct_list_s *pAddress)
513 char sqlQuery[MAX_QUERY_LEN+1];
515 int rowCnt = 0, index = 0;
517 pAddress->nCount = 0;
518 pAddress->msg_struct_info = NULL;
520 msg_struct_s *pTmp = NULL;
521 MSG_ADDRESS_INFO_S *pAddr = NULL;
523 pAddress->msg_struct_info = (msg_struct_t *)calloc(MAX_TO_ADDRESS_CNT, sizeof(msg_struct_t));
524 if (pAddress->msg_struct_info == NULL)
525 return MSG_ERR_MEMORY_ERROR;
527 for (int i = 0; i < MAX_TO_ADDRESS_CNT; i++) {
528 pAddress->msg_struct_info[i] = (msg_struct_t)new msg_struct_s;
529 pTmp = (msg_struct_s *)pAddress->msg_struct_info[i];
530 pTmp->type = MSG_STRUCT_ADDRESS_INFO;
531 pTmp->data = new MSG_ADDRESS_INFO_S;
532 memset(pTmp->data, 0x00, sizeof(MSG_ADDRESS_INFO_S));
535 memset(sqlQuery, 0x00, sizeof(sqlQuery));
536 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT "
541 "WHERE A.CONV_ID = B.CONV_ID "
542 "AND B.MSG_ID = %d;",
543 MSGFW_ADDRESS_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME,
546 msg_error_t err = pDbHandle->getTable(sqlQuery, &rowCnt, &index);
548 if (err == MSG_ERR_DB_NORECORD) {
549 pDbHandle->freeTable();
551 } else if (err != MSG_SUCCESS) {
552 MSG_DEBUG("Fail to getTable().");
553 pDbHandle->freeTable();
557 rowCnt = (rowCnt > 10)? MAX_TO_ADDRESS_CNT: rowCnt;
558 pAddress->nCount = rowCnt;
560 for (int i = 0; i < rowCnt; i++) {
561 pTmp = (msg_struct_s *)pAddress->msg_struct_info[i];
562 pAddr = (MSG_ADDRESS_INFO_S *)pTmp->data;
564 pAddr->addressType = pDbHandle->getColumnToInt(index++);
565 pAddr->recipientType = pDbHandle->getColumnToInt(index++);
567 pDbHandle->getColumnToString(index++, MAX_ADDRESS_VAL_LEN, pAddr->addressVal);
569 strncpy(pAddr->displayName, pAddr->addressVal, MAX_DISPLAY_NAME_LEN);
572 pDbHandle->freeTable();
578 msg_error_t MsgStoGetRecipientsByMsgId(MsgDbHandler *pDbHandle, msg_message_id_t msgId, int *nAddressCnt, MSG_ADDRESS_INFO_S **pAddress)
580 char sqlQuery[MAX_QUERY_LEN+1];
581 int rowCnt = 0, index = 0;
585 memset(sqlQuery, 0x00, sizeof(sqlQuery));
586 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT ADDRESS_TYPE, RECIPIENT_TYPE, ADDRESS_VAL FROM %s WHERE MSG_ID = %d;",
587 MSGFW_MMS_RECIPIENTS_TABLE_NAME, msgId);
589 msg_error_t err = pDbHandle->getTable(sqlQuery, &rowCnt, &index);
591 if (err == MSG_ERR_DB_NORECORD) {
592 pDbHandle->freeTable();
594 } else if (err != MSG_SUCCESS) {
595 MSG_DEBUG("Fail to getTable().");
596 pDbHandle->freeTable();
600 *nAddressCnt = rowCnt;
602 MSG_DEBUG("*nAddressCnt [%d]", *nAddressCnt);
604 MSG_ADDRESS_INFO_S *tmpAddressList = (MSG_ADDRESS_INFO_S *)new char[sizeof(MSG_ADDRESS_INFO_S) * rowCnt];
605 memset(tmpAddressList, 0x00, sizeof(MSG_ADDRESS_INFO_S) * rowCnt);
606 *pAddress = tmpAddressList;
608 for (int i = 0; i < rowCnt; i++) {
609 tmpAddressList[i].addressType = pDbHandle->getColumnToInt(index++);
610 tmpAddressList[i].recipientType = pDbHandle->getColumnToInt(index++);
611 pDbHandle->getColumnToString(index++, MAX_ADDRESS_VAL_LEN, tmpAddressList[i].addressVal);
612 strncpy(tmpAddressList[i].displayName, tmpAddressList[i].addressVal, MAX_DISPLAY_NAME_LEN);
614 pDbHandle->freeTable();
620 msg_error_t MsgStoGetAddressByConvId(MsgDbHandler *pDbHandle, msg_thread_id_t convId, msg_struct_list_s *pAddrlist)
622 char sqlQuery[MAX_QUERY_LEN+1];
624 int rowCnt = 0, index = 0;
626 pAddrlist->nCount = 0;
627 pAddrlist->msg_struct_info = NULL;
629 memset(sqlQuery, 0x00, sizeof(sqlQuery));
630 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT "
634 "FROM %s WHERE CONV_ID = %d;",
635 MSGFW_ADDRESS_TABLE_NAME, convId);
637 msg_error_t err = pDbHandle->getTable(sqlQuery, &rowCnt, &index);
639 if (err == MSG_ERR_DB_NORECORD) {
640 pDbHandle->freeTable();
642 } else if (err != MSG_SUCCESS) {
643 MSG_DEBUG("Fail to getTable().");
644 pDbHandle->freeTable();
648 pAddrlist->nCount = rowCnt;
650 MSG_DEBUG("pAddrlist->nCount [%d]", pAddrlist->nCount);
652 msg_struct_s *pTmp = NULL;
653 MSG_ADDRESS_INFO_S *pAddr = NULL;
655 pAddrlist->msg_struct_info = (msg_struct_t *)calloc(rowCnt, sizeof(msg_struct_t));
657 if (pAddrlist->msg_struct_info == NULL){
658 pDbHandle->freeTable();
659 return MSG_ERR_NULL_POINTER;
662 for (int i = 0; i < rowCnt; i++) {
663 pAddrlist->msg_struct_info[i] = (msg_struct_t)new msg_struct_s;
664 pTmp = (msg_struct_s *)pAddrlist->msg_struct_info[i];
665 pTmp->type = MSG_STRUCT_ADDRESS_INFO;
666 pTmp->data = new MSG_ADDRESS_INFO_S;
667 memset(pTmp->data, 0x00, sizeof(MSG_ADDRESS_INFO_S));
670 /* rowCnt = (rowCnt > 10)? MAX_TO_ADDRESS_CNT: rowCnt; */
672 for (int i = 0; i < rowCnt; i++) {
673 pTmp = (msg_struct_s *)pAddrlist->msg_struct_info[i];
674 pAddr = (MSG_ADDRESS_INFO_S *)pTmp->data;
676 pAddr->addressType = pDbHandle->getColumnToInt(index++);
677 pAddr->recipientType = pDbHandle->getColumnToInt(index++);
678 pDbHandle->getColumnToString(index++, MAX_ADDRESS_VAL_LEN, pAddr->addressVal);
680 strncpy(pAddr->displayName, pAddr->addressVal, MAX_DISPLAY_NAME_LEN);
682 pDbHandle->freeTable();
687 /* Have to use trigger for this function. */
688 msg_error_t MsgStoUpdateConversation(MsgDbHandler *pDbHandle, msg_thread_id_t convId)
692 char sqlQuery[MAX_QUERY_LEN];
693 unsigned int tmpSize = 0;
695 #ifdef MSG_NOTI_INTEGRATION
696 memset(sqlQuery, 0x00, MAX_QUERY_LEN);
697 snprintf(sqlQuery, sizeof(sqlQuery),
700 "WHERE CONV_ID = %d "
701 "AND FOLDER_ID > %d AND FOLDER_ID < %d "
702 "AND STORAGE_ID = %d;",
703 MSGFW_MESSAGE_TABLE_NAME,
705 MSG_ALLBOX_ID, MSG_SPAMBOX_ID,
708 memset(sqlQuery, 0x00, MAX_QUERY_LEN);
709 snprintf(sqlQuery, sizeof(sqlQuery),
712 "WHERE CONV_ID = %d "
713 "AND FOLDER_ID > %d AND FOLDER_ID < %d "
714 "AND STORAGE_ID = %d;",
715 MSGFW_MESSAGE_TABLE_NAME,
717 MSG_ALLBOX_ID, MSG_CBMSGBOX_ID,
721 msg_error_t err = pDbHandle->prepareQuery(sqlQuery);
722 if (err != MSG_SUCCESS) {
723 MSG_DEBUG("Fail to prepareQuery().");
724 pDbHandle->finalizeQuery();
728 if (pDbHandle->stepQuery() == MSG_ERR_DB_ROW) {
729 pDbHandle->finalizeQuery();
731 memset(sqlQuery, 0x00, MAX_QUERY_LEN);
732 snprintf(sqlQuery, sizeof(sqlQuery),
733 "SELECT MAIN_TYPE, SUB_TYPE, MSG_DIRECTION, MSG_ID, DISPLAY_TIME, LENGTH(SUBJECT), SUBJECT, MSG_TEXT, DPM_RESTRICTED "
735 "WHERE CONV_ID = %d AND FOLDER_ID > %d AND FOLDER_ID < %d AND STORAGE_ID = %d AND SCHEDULED_TIME = 0 ORDER BY DISPLAY_TIME DESC;",
736 MSGFW_MESSAGE_TABLE_NAME,
737 convId, MSG_ALLBOX_ID, MSG_SPAMBOX_ID, MSG_STORAGE_PHONE);
739 err = pDbHandle->prepareQuery(sqlQuery);
740 if (err != MSG_SUCCESS) {
741 MSG_DEBUG("Fail to prepareQuery().");
745 err = pDbHandle->stepQuery();
746 if (err != MSG_ERR_DB_ROW) {
747 MSG_DEBUG("Fail to stepQuery().");
748 pDbHandle->finalizeQuery();
752 int main_type = pDbHandle->columnInt(0);
753 int sub_type = pDbHandle->columnInt(1);
754 int msg_direction = pDbHandle->columnInt(2);
755 int last_msg_id = pDbHandle->columnInt(3);
756 time_t disp_time = (time_t)pDbHandle->columnInt(4);
757 int subject_length = pDbHandle->columnInt(5);
758 bool dpm_restricted = pDbHandle->columnInt(8);
759 char subject[MAX_SUBJECT_LEN+1] = {0, };
760 char msg_text[MAX_MSG_TEXT_LEN+1] = {0, };
761 if (!dpm_restricted) {
762 snprintf(subject, sizeof(subject), "%s", pDbHandle->columnText(6));
763 snprintf(msg_text, sizeof(msg_text), "%s", pDbHandle->columnText(7));
765 snprintf(subject, sizeof(subject), "restricted message");
766 snprintf(msg_text, sizeof(msg_text), "restricted message");
769 pDbHandle->finalizeQuery();
770 memset(sqlQuery, 0x00, MAX_QUERY_LEN);
771 snprintf(sqlQuery, sizeof(sqlQuery),
773 MSGFW_CONVERSATION_TABLE_NAME);
775 tmpSize = strlen(sqlQuery);
776 #ifdef MSG_NOTI_INTEGRATION
777 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
778 "UNREAD_CNT = (SELECT COUNT(MSG_ID) FROM %s WHERE CONV_ID = %d AND (FOLDER_ID = %d OR FOLDER_ID = %d) AND STORAGE_ID = %d AND READ_STATUS = 0), ",
779 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_INBOX_ID, MSG_CBMSGBOX_ID, MSG_STORAGE_PHONE);
781 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
782 "UNREAD_CNT = (SELECT COUNT(MSG_ID) FROM %s WHERE CONV_ID = %d AND FOLDER_ID = %d AND STORAGE_ID = %d AND READ_STATUS = 0), ",
783 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_INBOX_ID, MSG_STORAGE_PHONE);
786 tmpSize = strlen(sqlQuery);
787 #ifdef MSG_NOTI_INTEGRATION
788 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
789 "SMS_CNT = (SELECT COUNT(MSG_ID) FROM %s WHERE CONV_ID = %d AND MAIN_TYPE = %d AND FOLDER_ID > %d AND FOLDER_ID < %d AND STORAGE_ID = %d), ",
790 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_SMS_TYPE, MSG_ALLBOX_ID, MSG_SPAMBOX_ID, MSG_STORAGE_PHONE);
792 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
793 "SMS_CNT = (SELECT COUNT(MSG_ID) FROM %s WHERE CONV_ID = %d AND MAIN_TYPE = %d AND FOLDER_ID > %d AND FOLDER_ID < %d AND STORAGE_ID = %d), ",
794 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_SMS_TYPE, MSG_ALLBOX_ID, MSG_CBMSGBOX_ID, MSG_STORAGE_PHONE);
797 tmpSize = strlen(sqlQuery);
798 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
799 "MMS_CNT = (SELECT COUNT(MSG_ID) FROM %s WHERE CONV_ID = %d AND MAIN_TYPE = %d AND SUB_TYPE NOT IN (%d, %d, %d) AND FOLDER_ID > %d AND FOLDER_ID < %d AND STORAGE_ID = %d), ",
800 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_MMS_TYPE, MSG_DELIVERYIND_MMS, MSG_READRECIND_MMS, MSG_READORGIND_MMS, MSG_ALLBOX_ID, MSG_CBMSGBOX_ID, MSG_STORAGE_PHONE);
803 tmpSize = strlen(sqlQuery);
804 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
805 "MAIN_TYPE = (SELECT MAIN_TYPE FROM %s WHERE CONV_ID = %d AND FOLDER_ID > %d AND FOLDER_ID < %d AND STORAGE_ID = %d ORDER BY DISPLAY_TIME DESC), ",
806 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_ALLBOX_ID, MSG_SPAMBOX_ID, MSG_STORAGE_PHONE);
808 tmpSize = strlen(sqlQuery);
809 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
810 "SUB_TYPE = (SELECT SUB_TYPE FROM %s WHERE CONV_ID = %d AND FOLDER_ID > %d AND FOLDER_ID < %d AND STORAGE_ID = %d ORDER BY DISPLAY_TIME DESC), ",
811 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_ALLBOX_ID, MSG_SPAMBOX_ID, MSG_STORAGE_PHONE);
813 tmpSize = strlen(sqlQuery);
814 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
815 "MSG_DIRECTION = (SELECT MSG_DIRECTION FROM %s WHERE CONV_ID = %d AND FOLDER_ID > %d AND FOLDER_ID < %d AND STORAGE_ID = %d ORDER BY DISPLAY_TIME DESC), ",
816 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_ALLBOX_ID, MSG_SPAMBOX_ID, MSG_STORAGE_PHONE);
818 tmpSize = strlen(sqlQuery);
820 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
821 "DISPLAY_TIME = CASE "
822 "WHEN (SELECT COUNT(MSG_ID) FROM %s WHERE CONV_ID = %d AND FOLDER_ID > %d AND FOLDER_ID < %d AND STORAGE_ID = %d AND SCHEDULED_TIME = 0 ORDER BY DISPLAY_TIME DESC) > 0 "
823 "THEN (SELECT DISPLAY_TIME FROM %s WHERE CONV_ID = %d AND FOLDER_ID > %d AND FOLDER_ID < %d AND STORAGE_ID = %d AND SCHEDULED_TIME = 0 ORDER BY DISPLAY_TIME DESC) "
826 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_ALLBOX_ID, MSG_SPAMBOX_ID, MSG_STORAGE_PHONE,
827 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_ALLBOX_ID, MSG_SPAMBOX_ID, MSG_STORAGE_PHONE);
829 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
830 "DISPLAY_TIME = CASE "
831 "WHEN (SELECT COUNT(MSG_ID) FROM %s WHERE CONV_ID = %d AND FOLDER_ID = %d AND STORAGE_ID = %d AND READ_STATUS = 0) > 0 "
832 "THEN (SELECT DISPLAY_TIME FROM %s WHERE CONV_ID = %d AND FOLDER_ID = %d AND STORAGE_ID = %d AND READ_STATUS = 0 ORDER BY DISPLAY_TIME DESC) "
833 "WHEN (SELECT COUNT(MSG_ID) FROM %s WHERE CONV_ID = %d AND FOLDER_ID = %d AND STORAGE_ID = %d) > 0 "
834 "THEN (SELECT DISPLAY_TIME FROM %s WHERE CONV_ID = %d AND FOLDER_ID = %d AND STORAGE_ID = %d ORDER BY DISPLAY_TIME DESC) "
835 "WHEN (SELECT COUNT(MSG_ID) FROM %s WHERE CONV_ID = %d AND FOLDER_ID = %d AND STORAGE_ID = %d AND NETWORK_STATUS = %d) > 0 "
836 "THEN (SELECT DISPLAY_TIME FROM %s WHERE CONV_ID = %d AND FOLDER_ID = %d AND STORAGE_ID = %d AND NETWORK_STATUS = %d ORDER BY DISPLAY_TIME DESC) "
837 "ELSE (SELECT DISPLAY_TIME FROM %s WHERE CONV_ID = %d AND FOLDER_ID > %d AND FOLDER_ID < %d AND STORAGE_ID = %d ORDER BY DISPLAY_TIME DESC) "
839 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_INBOX_ID, MSG_STORAGE_PHONE,
840 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_INBOX_ID, MSG_STORAGE_PHONE,
841 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_DRAFT_ID, MSG_STORAGE_PHONE,
842 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_DRAFT_ID, MSG_STORAGE_PHONE,
843 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_OUTBOX_ID, MSG_STORAGE_PHONE, MSG_NETWORK_SEND_FAIL,
844 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_OUTBOX_ID, MSG_STORAGE_PHONE, MSG_NETWORK_SEND_FAIL,
845 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_ALLBOX_ID, MSG_SPAMBOX_ID, MSG_STORAGE_PHONE);
849 tmpSize = strlen(sqlQuery);
850 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
852 "WHEN %d > 0 THEN ? ELSE ? "
856 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
858 "WHEN (SELECT COUNT(MSG_ID) FROM %s WHERE CONV_ID = %d AND FOLDER_ID > %d AND FOLDER_ID < %d AND STORAGE_ID = %d AND SCHEDULED_TIME = 0 ORDER BY DISPLAY_TIME DESC) > 0 "
860 "WHEN (SELECT LENGTH(SUBJECT) FROM %s WHERE CONV_ID = %d AND FOLDER_ID > %d AND FOLDER_ID < %d AND STORAGE_ID = %d AND SCHEDULED_TIME = 0 ORDER BY DISPLAY_TIME DESC) > 0 "
861 "THEN (SELECT SUBJECT FROM %s WHERE CONV_ID = %d AND FOLDER_ID > %d AND FOLDER_ID < %d AND STORAGE_ID = %d AND SCHEDULED_TIME = 0 ORDER BY DISPLAY_TIME DESC) "
862 "ELSE (SELECT MSG_TEXT FROM %s WHERE CONV_ID = %d AND FOLDER_ID > %d AND FOLDER_ID < %d AND STORAGE_ID = %d AND SCHEDULED_TIME = 0 ORDER BY DISPLAY_TIME DESC) "
865 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_ALLBOX_ID, MSG_SPAMBOX_ID, MSG_STORAGE_PHONE,
866 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_ALLBOX_ID, MSG_SPAMBOX_ID, MSG_STORAGE_PHONE,
867 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_ALLBOX_ID, MSG_SPAMBOX_ID, MSG_STORAGE_PHONE,
868 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_ALLBOX_ID, MSG_SPAMBOX_ID, MSG_STORAGE_PHONE);
870 tmpSize = strlen(sqlQuery);
871 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
872 "MAIN_TYPE = %d, SUB_TYPE = %d, MSG_DIRECTION = %d, DISPLAY_TIME = %lu, LAST_MSG_ID = %d ",
873 main_type, sub_type, msg_direction, disp_time, last_msg_id);
875 tmpSize = strlen(sqlQuery);
876 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
877 "WHERE CONV_ID = %d;",
879 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
880 MSG_DEBUG("Query Failed [%s]", sqlQuery);
881 return MSG_ERR_DB_PREPARE;
884 pDbHandle->bindText(subject, 1);
885 pDbHandle->bindText(msg_text, 2);
887 if (pDbHandle->stepQuery() != MSG_ERR_DB_DONE) {
888 MSG_DEBUG("stepQuery() Failed");
889 pDbHandle->finalizeQuery();
890 return MSG_ERR_DB_STEP;
893 pDbHandle->finalizeQuery();
895 pDbHandle->finalizeQuery();
897 memset(sqlQuery, 0x00, MAX_QUERY_LEN);
898 snprintf(sqlQuery, sizeof(sqlQuery),
899 "UPDATE %s SET UNREAD_CNT = 0, SMS_CNT = 0, MMS_CNT = 0, MAIN_TYPE = 0, SUB_TYPE = 0, MSG_DIRECTION = 0, DISPLAY_TIME = 0, MSG_TEXT = '' "
900 "WHERE CONV_ID = %d;",
901 MSGFW_CONVERSATION_TABLE_NAME, convId);
903 if (pDbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
904 MSG_DEBUG("Query Failed [%s]", sqlQuery);
905 return MSG_ERR_DB_EXEC;
915 /* consider to replcae this function to trigger. */
916 msg_error_t MsgStoClearConversationTable(MsgDbHandler *pDbHandle)
918 msg_error_t err = MSG_SUCCESS;
920 char sqlQuery[MAX_QUERY_LEN+1];
922 memset(sqlQuery, 0x00, sizeof(sqlQuery));
924 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s "
925 "WHERE CONV_ID NOT IN (SELECT CONV_ID FROM %s) AND CONV_ID <> 0;",
926 MSGFW_CONVERSATION_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME);
928 err = pDbHandle->execQuery(sqlQuery);
930 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE CONV_ID NOT IN (SELECT CONV_ID FROM %s);",
931 MSGFW_ADDRESS_TABLE_NAME, MSGFW_CONVERSATION_TABLE_NAME);
933 err = pDbHandle->execQuery(sqlQuery);
939 msg_thread_id_t MsgGetThreadId(MsgDbHandler *pDbHandle, msg_message_id_t msgId)
941 msg_thread_id_t conv_id = 0;
943 char sqlQuery[MAX_QUERY_LEN+1];
944 memset(sqlQuery, 0x00, sizeof(sqlQuery));
945 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT CONV_ID FROM %s WHERE MSG_ID = %d;",
946 MSGFW_MESSAGE_TABLE_NAME, msgId);
948 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
951 if (pDbHandle->stepQuery() == MSG_ERR_DB_ROW) {
952 conv_id = pDbHandle->columnInt(0);
955 pDbHandle->finalizeQuery();
960 /* Change the function name to conversation related. */
961 bool MsgExistAddress(MsgDbHandler *pDbHandle, const MSG_MESSAGE_INFO_S *pMsg, msg_thread_id_t *pConvId)
963 msg_error_t err = MSG_SUCCESS;
965 char sqlQuery[MAX_QUERY_LEN+1];
966 unsigned int tmpSize = 0;
970 memset(sqlQuery, 0x00, sizeof(sqlQuery));
971 snprintf(sqlQuery, sizeof(sqlQuery),
972 "SELECT CONV_ID FROM ( SELECT CONV_ID FROM %s WHERE ( ",
973 MSGFW_ADDRESS_TABLE_NAME);
975 for (int i = 0; i < pMsg->nAddressCnt; i++) {
976 if (strlen(pMsg->addressList[i].addressVal) >= (unsigned int)MsgContactGetMinMatchDigit()
977 && pMsg->addressList[i].addressType != MSG_ADDRESS_TYPE_EMAIL
978 && MsgIsNumber(pMsg->addressList[i].addressVal)) {
979 int addrSize = strlen(pMsg->addressList[i].addressVal);
980 char newPhoneNum[addrSize+1];
981 memset(newPhoneNum, 0x00, sizeof(newPhoneNum));
982 MsgConvertNumber(pMsg->addressList[i].addressVal, newPhoneNum, addrSize);
984 tmpSize = strlen(sqlQuery);
985 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
986 "ADDRESS_VAL LIKE '%%%%%s' ",
989 if ((pMsg->nAddressCnt-1) == i) break;
991 tmpSize = strlen(sqlQuery);
992 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize, " OR ");
995 tmpSize = strlen(sqlQuery);
996 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
997 "ADDRESS_VAL LIKE '%s' ",
998 pMsg->addressList[i].addressVal);
1000 if ((pMsg->nAddressCnt-1) == i) break;
1002 tmpSize = strlen(sqlQuery);
1003 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize, " OR ");
1007 tmpSize = strlen(sqlQuery);
1008 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
1009 ") AND CONV_ID IN (SELECT CONV_ID FROM %s GROUP BY CONV_ID HAVING COUNT(CONV_ID)=%d) ",
1010 MSGFW_ADDRESS_TABLE_NAME, pMsg->nAddressCnt);
1013 tmpSize = strlen(sqlQuery);
1014 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
1015 ") GROUP BY CONV_ID HAVING COUNT(CONV_ID)=%d;",
1021 err = pDbHandle->getTable(sqlQuery, &rowCnt, NULL);
1023 /* No record or other error */
1024 if (err != MSG_SUCCESS) {
1025 MSG_DEBUG("Fail to getTable().");
1026 pDbHandle->freeTable();
1030 convId = pDbHandle->getColumnToInt(1);
1033 MSG_DEBUG("Success to get convId [%d]", convId);
1035 pDbHandle->freeTable();
1039 pDbHandle->freeTable();
1045 int MsgStoGetUnreadCnt(MsgDbHandler *pDbHandle, MSG_MAIN_TYPE_T msgType)
1049 char sqlQuery[MAX_QUERY_LEN+1];
1051 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1053 if (msgType == MSG_SMS_TYPE) {
1054 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s "
1055 "WHERE MAIN_TYPE = %d "
1056 "AND (SUB_TYPE IN (%d, %d, %d, %d, %d, %d, %d) OR (SUB_TYPE >= %d AND SUB_TYPE <= %d)) "
1057 "AND FOLDER_ID = %d AND READ_STATUS = 0 AND STORAGE_ID = %d;",
1058 MSGFW_MESSAGE_TABLE_NAME,
1060 MSG_NORMAL_SMS, MSG_STATUS_REPORT_SMS, MSG_CONCAT_SIM_SMS, MSG_WAP_SI_SMS, MSG_WAP_SL_SMS, MSG_MWI_VOICE_SMS, MSG_SYNCML_CP,
1061 MSG_REPLACE_TYPE1_SMS, MSG_REPLACE_TYPE7_SMS,
1062 MSG_INBOX_ID, MSG_STORAGE_PHONE);
1063 } else if (msgType == MSG_MMS_TYPE) {
1064 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s "
1065 "WHERE MAIN_TYPE = %d AND SUB_TYPE IN (%d, %d, %d) "
1066 "AND FOLDER_ID = %d AND READ_STATUS = 0 AND STORAGE_ID = %d;",
1067 MSGFW_MESSAGE_TABLE_NAME,
1069 MSG_RETRIEVE_AUTOCONF_MMS, MSG_RETRIEVE_MANUALCONF_MMS, MSG_NOTIFICATIONIND_MMS,
1070 MSG_INBOX_ID, MSG_STORAGE_PHONE);
1073 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
1076 if (pDbHandle->stepQuery() == MSG_ERR_DB_ROW) {
1077 msgCnt = pDbHandle->columnInt(0);
1079 pDbHandle->finalizeQuery();
1083 pDbHandle->finalizeQuery();
1089 msg_error_t MsgStoGetMmsRawFilePath(MsgDbHandler *pDbHandle, msg_message_id_t msgId, char *pFilePath)
1091 char sqlQuery[MAX_QUERY_LEN+1];
1093 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1095 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.FILE_PATH FROM %s A, %s B \
1096 WHERE A.MSG_ID = B.MSG_ID AND B.MSG_ID = %d;",
1097 MMS_PLUGIN_MESSAGE_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME, msgId);
1099 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
1100 return MSG_ERR_DB_PREPARE;
1102 if (pDbHandle->stepQuery() == MSG_ERR_DB_ROW) {
1103 if (pDbHandle->columnText(0) != NULL)
1104 strncpy(pFilePath, (char*)pDbHandle->columnText(0), MSG_FILEPATH_LEN_MAX);
1106 pDbHandle->finalizeQuery();
1107 return MSG_ERR_DB_STEP;
1110 pDbHandle->finalizeQuery();
1116 bool MsgStoCheckReadReportRequested(MsgDbHandler *pDbHandle, msg_message_id_t msgId)
1118 msg_error_t err = MSG_SUCCESS;
1120 char sqlQuery[MAX_QUERY_LEN+1];
1122 bool bReadReportRequested = false;
1124 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1126 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.ASK_READ_REPLY FROM %s A, %s B \
1127 WHERE A.MSG_ID = B.MSG_ID AND B.MSG_ID = %d;",
1128 MMS_PLUGIN_MESSAGE_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME, msgId);
1130 err = pDbHandle->getTable(sqlQuery, &rowCnt, NULL);
1132 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
1133 pDbHandle->freeTable();
1134 MSG_DEBUG("[Error]Failed to Get Table");
1135 return bReadReportRequested;
1139 pDbHandle->freeTable();
1140 MSG_DEBUG("[Error]MSG_ERR_DB_NORECORD");
1141 return bReadReportRequested;
1144 bReadReportRequested = pDbHandle->getColumnToInt(1);
1146 pDbHandle->freeTable();
1148 return bReadReportRequested;
1152 bool MsgStoCheckReadReportIsSent(MsgDbHandler *pDbHandle, msg_message_id_t msgId)
1154 msg_error_t err = MSG_SUCCESS;
1156 char sqlQuery[MAX_QUERY_LEN+1];
1159 bool bReadReportIsSent = true;
1161 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1163 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.READ_REPORT_SENT FROM %s A, %s B \
1164 WHERE A.MSG_ID = B.MSG_ID AND B.MSG_ID = %d;",
1165 MMS_PLUGIN_MESSAGE_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME, msgId);
1167 err = pDbHandle->getTable(sqlQuery, &rowCnt, NULL);
1169 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
1170 pDbHandle->freeTable();
1171 MSG_DEBUG("[Error]Failed to Get Table");
1172 return bReadReportIsSent;
1176 pDbHandle->freeTable();
1177 MSG_DEBUG("[Error]MSG_ERR_DB_NORECORD");
1178 return bReadReportIsSent;
1181 bReadReportIsSent = (bool)pDbHandle->getColumnToInt(1);
1183 pDbHandle->freeTable();
1185 return bReadReportIsSent;
1189 msg_error_t MsgStoAddConversation(MsgDbHandler *pDbHandle, msg_thread_id_t *pConvId)
1191 char sqlQuery[MAX_QUERY_LEN+1];
1194 if (pDbHandle->getRowId(MSGFW_CONVERSATION_TABLE_NAME, pConvId) != MSG_SUCCESS) {
1195 return MSG_ERR_DB_EXEC;
1198 /* Add Conversation */
1199 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1200 snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, 0, 0, 0, 0, 0, 0, 0, '', '', 0);",
1201 MSGFW_CONVERSATION_TABLE_NAME, *pConvId);
1203 if (pDbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
1204 MSG_DEBUG("Query Failed. [%s]", sqlQuery);
1205 return MSG_ERR_DB_EXEC;
1212 msg_error_t MsgStoSetConversationDisplayName(MsgDbHandler *pDbHandle, int contactId)
1214 msg_error_t err = MSG_SUCCESS;
1216 char displayName[MAX_DISPLAY_NAME_LEN+1];
1217 char sqlQuery[MAX_QUERY_LEN+1];
1219 MSG_DEBUG("contactId [%d]", contactId);
1221 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1222 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT DISTINCT(CONV_ID) FROM %s WHERE CONTACT_ID = %d;",
1223 MSGFW_ADDRESS_TABLE_NAME, contactId);
1225 err = pDbHandle->getTable(sqlQuery, &rowCnt, NULL);
1227 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
1228 pDbHandle->freeTable();
1229 MSG_DEBUG("Fail to getTable().");
1233 msg_struct_s *pAddrInfo = NULL;
1234 MSG_ADDRESS_INFO_S *address = NULL;
1236 for (int i = 1; i <= rowCnt; i++) {
1237 memset(displayName, 0x00, sizeof(displayName));
1238 MsgDbHandler tmpDbHandle;
1239 msg_struct_list_s addressList = {0, };
1240 MsgStoGetAddressByConvId(&tmpDbHandle, (msg_thread_id_t)pDbHandle->getColumnToInt(i), &addressList);
1242 for (int j = 0; j < addressList.nCount; j++) {
1244 strncat(displayName, ", ", MAX_DISPLAY_NAME_LEN-strlen(displayName));
1246 pAddrInfo = (msg_struct_s *)addressList.msg_struct_info[j];
1247 address = (MSG_ADDRESS_INFO_S *)pAddrInfo->data;
1249 if (address->displayName[0] == '\0')
1250 strncat(displayName, address->addressVal, MAX_DISPLAY_NAME_LEN-strlen(displayName));
1252 strncat(displayName, address->displayName, MAX_DISPLAY_NAME_LEN-strlen(displayName));
1255 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1256 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET DISPLAY_NAME = ? WHERE CONV_ID = %d;",
1257 MSGFW_CONVERSATION_TABLE_NAME, pDbHandle->getColumnToInt(i));
1259 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
1260 pDbHandle->freeTable();
1261 MSG_DEBUG("Query Failed [%s]", sqlQuery);
1262 return MSG_ERR_DB_PREPARE;
1265 pDbHandle->bindText(displayName, 1);
1267 if (pDbHandle->stepQuery() != MSG_ERR_DB_DONE) {
1268 pDbHandle->freeTable();
1269 pDbHandle->finalizeQuery();
1270 MSG_SEC_DEBUG("Update Conversation disply name. Fail [%s]", sqlQuery);
1271 return MSG_ERR_DB_STEP;
1274 pDbHandle->finalizeQuery();
1276 /* free address list */
1277 for (int j = 0; j < addressList.nCount; j++) {
1278 msg_struct_s *pStruct = (msg_struct_s *)addressList.msg_struct_info[j];
1279 delete (MSG_ADDRESS_INFO_S *)pStruct->data;
1280 delete (msg_struct_s *)pStruct;
1283 if (addressList.msg_struct_info != NULL) {
1284 g_free((msg_struct_t *)addressList.msg_struct_info);
1288 pDbHandle->freeTable();
1294 msg_error_t MsgStoSetConversationDisplayName(MsgDbHandler *pDbHandle, msg_thread_id_t convId)
1296 msg_error_t err = MSG_SUCCESS;
1298 char displayName[MAX_DISPLAY_NAME_LEN+1];
1299 char sqlQuery[MAX_QUERY_LEN+1];
1301 msg_struct_list_s addressList = {0, };
1303 msg_struct_s *pAddrInfo = NULL;
1304 MSG_ADDRESS_INFO_S *address = NULL;
1306 memset(displayName, 0x00, sizeof(displayName));
1308 MsgStoGetAddressByConvId(pDbHandle, convId, &addressList);
1310 for (int j = 0; j < addressList.nCount; j++) {
1312 strncat(displayName, ", ", MAX_DISPLAY_NAME_LEN-strlen(displayName));
1314 pAddrInfo = (msg_struct_s *)addressList.msg_struct_info[j];
1315 address = (MSG_ADDRESS_INFO_S *)pAddrInfo->data;
1317 if (address->displayName[0] == '\0')
1318 strncat(displayName, address->addressVal, MAX_DISPLAY_NAME_LEN-strlen(displayName));
1320 strncat(displayName, address->displayName, MAX_DISPLAY_NAME_LEN-strlen(displayName));
1323 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1324 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET DISPLAY_NAME = ? WHERE CONV_ID = %d;",
1325 MSGFW_CONVERSATION_TABLE_NAME, convId);
1327 for (int j = 0; j < addressList.nCount; j++) {
1328 msg_struct_s *pStruct = (msg_struct_s *)addressList.msg_struct_info[j];
1329 delete (MSG_ADDRESS_INFO_S *)pStruct->data;
1330 delete (msg_struct_s *)pStruct;
1333 if (addressList.msg_struct_info != NULL) {
1334 g_free((msg_struct_t *)addressList.msg_struct_info);
1337 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
1338 MSG_DEBUG("Query Failed [%s]", sqlQuery);
1339 return MSG_ERR_DB_PREPARE;
1342 pDbHandle->bindText(displayName, 1);
1344 if (pDbHandle->stepQuery() != MSG_ERR_DB_DONE) {
1345 pDbHandle->finalizeQuery();
1346 MSG_SEC_DEBUG("Update Conversation disply name. Fail [%s]", sqlQuery);
1347 return MSG_ERR_DB_STEP;
1350 pDbHandle->finalizeQuery();
1355 msg_error_t MsgStoUpdateNetworkStatus(MsgDbHandler *pDbHandle, MSG_MESSAGE_INFO_S *pMsgInfo, msg_network_status_t status)
1357 msg_error_t err = MSG_SUCCESS;
1359 char sqlQuery[MAX_QUERY_LEN+1];
1361 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1363 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET NETWORK_STATUS = %d WHERE MSG_ID = %d;",
1364 MSGFW_MESSAGE_TABLE_NAME, status, pMsgInfo->msgId);
1366 if (pDbHandle->execQuery(sqlQuery) != MSG_SUCCESS)
1367 err = MSG_ERR_DB_EXEC;
1369 pDbHandle->finalizeQuery();
1374 bool MsgExistConversation(MsgDbHandler *pDbHandle, msg_thread_id_t convId)
1376 msg_error_t err = MSG_SUCCESS;
1378 char sqlQuery[MAX_QUERY_LEN+1];
1382 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1384 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT CONV_ID FROM %s WHERE CONV_ID = %d;",
1385 MSGFW_CONVERSATION_TABLE_NAME, convId);
1387 err = pDbHandle->getTable(sqlQuery, &rowCnt, NULL);
1389 if (err == MSG_ERR_DB_NORECORD) {
1390 pDbHandle->freeTable();
1392 } else if (err != MSG_SUCCESS) {
1393 pDbHandle->freeTable();
1396 pDbHandle->freeTable();
1401 bool MsgExistInThreadViewList(MsgDbHandler *pDbHandle, msg_thread_id_t convId)
1403 msg_error_t err = MSG_SUCCESS;
1405 char sqlQuery[MAX_QUERY_LEN+1];
1409 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1411 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;",
1412 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_ALLBOX_ID, MSG_SPAMBOX_ID, MSG_STORAGE_PHONE);
1414 err = pDbHandle->getTable(sqlQuery, &rowCnt, NULL);
1416 if (err == MSG_ERR_DB_NORECORD) {
1417 pDbHandle->freeTable();
1419 } else if (err != MSG_SUCCESS) {
1420 pDbHandle->freeTable();
1423 pDbHandle->freeTable();
1428 bool MsgExistMessage(MsgDbHandler *pDbHandle, MSG_MESSAGE_INFO_S *pMsg)
1430 msg_error_t err = MSG_SUCCESS;
1432 char sqlQuery[MAX_QUERY_LEN+1];
1437 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1439 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s WHERE CONV_ID = %ud AND DISPLAY_TIME = %ud;",
1440 MSGFW_MESSAGE_TABLE_NAME, pMsg->threadId, (int)pMsg->displayTime);
1442 err = pDbHandle->getTable(sqlQuery, &rowCnt, NULL);
1445 if (err != MSG_SUCCESS) {
1446 pDbHandle->freeTable();
1451 pMsg->msgId = pDbHandle->getColumnToInt(1);
1453 pDbHandle->freeTable();
1459 bool MsgExistAddress(MsgDbHandler *pDbHandle, MSG_MESSAGE_INFO_S *pMsg, msg_thread_id_t convId, int index)
1461 msg_error_t err = MSG_SUCCESS;
1463 char sqlQuery[MAX_QUERY_LEN+1];
1468 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1470 if (strlen(pMsg->addressList[index].addressVal) > (unsigned int)MsgContactGetMinMatchDigit()) {
1471 int addrSize = strlen(pMsg->addressList[index].addressVal);
1472 char newPhoneNum[addrSize+1];
1473 memset(newPhoneNum, 0x00, sizeof(newPhoneNum));
1474 MsgConvertNumber(pMsg->addressList[index].addressVal, newPhoneNum, addrSize);
1476 snprintf(sqlQuery, sizeof(sqlQuery),
1477 "SELECT ADDRESS_ID FROM %s WHERE ADDRESS_VAL LIKE '%%%%%s' AND CONV_ID= %d;",
1478 MSGFW_ADDRESS_TABLE_NAME, newPhoneNum, convId);
1480 snprintf(sqlQuery, sizeof(sqlQuery),
1481 "SELECT ADDRESS_ID FROM %s WHERE ADDRESS_VAL = '%s' AND CONV_ID= %d;",
1482 MSGFW_ADDRESS_TABLE_NAME, pMsg->addressList[index].addressVal, convId);
1485 err = pDbHandle->getTable(sqlQuery, &rowCnt, NULL);
1487 if (err == MSG_ERR_DB_NORECORD) {
1488 pDbHandle->freeTable();
1490 } else if (err != MSG_SUCCESS) {
1491 pDbHandle->freeTable();
1494 pDbHandle->freeTable();
1500 void MsgStoUpdateAddress(MsgDbHandler *pDbHandle, const MSG_MESSAGE_INFO_S *pMsg, msg_thread_id_t convId)
1503 msg_error_t err = MSG_SUCCESS;
1505 char sqlQuery[MAX_QUERY_LEN+1];
1507 for (int i = 0; i < pMsg->nAddressCnt; i++) {
1508 if (strlen(pMsg->addressList[i].addressVal) > (unsigned int)MsgContactGetMinMatchDigit() && pMsg->addressList[i].addressType == MSG_ADDRESS_TYPE_PLMN) {
1509 int addrSize = strlen(pMsg->addressList[i].addressVal);
1510 char newPhoneNum[addrSize+1];
1511 memset(newPhoneNum, 0x00, sizeof(newPhoneNum));
1512 MsgConvertNumber(pMsg->addressList[i].addressVal, newPhoneNum, addrSize);
1514 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1515 snprintf(sqlQuery, sizeof(sqlQuery),
1517 "ADDRESS_VAL = '%s', "
1518 "ADDRESS_TYPE = %d, "
1519 "RECIPIENT_TYPE = %d "
1520 "WHERE CONV_ID = %d "
1521 "AND ADDRESS_VAL LIKE '%%%%%s';",
1522 MSGFW_ADDRESS_TABLE_NAME, pMsg->addressList[i].addressVal,
1523 pMsg->addressList[i].addressType, pMsg->addressList[i].recipientType, convId, newPhoneNum);
1525 err = pDbHandle->execQuery(sqlQuery);
1526 if (err != MSG_SUCCESS) MSG_DEBUG("Fail to execQuery(). [%s]", sqlQuery);
1528 pDbHandle->finalizeQuery();
1535 msg_error_t MsgStoAddCBChannelInfo(MsgDbHandler *pDbHandle, MSG_CB_CHANNEL_S *pCBChannel, msg_sim_slot_id_t simIndex)
1539 char sqlQuery[MAX_QUERY_LEN] = {0, };
1541 pDbHandle->beginTrans();
1543 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1544 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE SIM_INDEX = %d;", MSGFW_CB_CHANNEL_INFO_TABLE_NAME, simIndex);
1546 if (pDbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
1547 pDbHandle->endTrans(false);
1548 return MSG_ERR_DB_EXEC;
1551 for (int i = 0; i < pCBChannel->channelCnt; i++) {
1553 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1554 snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s(CHANNEL_ACTIVATION, CHANNEL_FROM, CHANNEL_TO, CHANNEL_NAME, SIM_INDEX) VALUES (?, ?, ?, ?, ?);",
1555 MSGFW_CB_CHANNEL_INFO_TABLE_NAME);
1557 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
1558 pDbHandle->endTrans(false);
1559 return MSG_ERR_DB_PREPARE;
1561 pDbHandle->bindInt(pCBChannel->channelInfo[i].bActivate, index++);
1562 pDbHandle->bindInt(pCBChannel->channelInfo[i].from, index++);
1563 pDbHandle->bindInt(pCBChannel->channelInfo[i].to, index++);
1564 pDbHandle->bindText(pCBChannel->channelInfo[i].name, index++);
1565 pDbHandle->bindInt(simIndex, index++);
1567 if (pDbHandle->stepQuery() != MSG_ERR_DB_DONE) {
1568 pDbHandle->finalizeQuery();
1569 pDbHandle->endTrans(false);
1570 return MSG_ERR_DB_STEP;
1573 pDbHandle->finalizeQuery();
1576 pDbHandle->endTrans(true);
1584 msg_error_t MsgStoGetCBChannelInfo(MsgDbHandler *pDbHandle, MSG_CB_CHANNEL_S *pCBChannel, msg_sim_slot_id_t simIndex)
1588 int rowCnt = 0, index = 0;
1590 char sqlQuery[MAX_QUERY_LEN] = {0, };
1592 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1593 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT CHANNEL_ACTIVATION, CHANNEL_FROM, CHANNEL_TO, CHANNEL_NAME FROM %s WHERE SIM_INDEX = %d;", MSGFW_CB_CHANNEL_INFO_TABLE_NAME, simIndex);
1595 msg_error_t err = pDbHandle->getTable(sqlQuery, &rowCnt, &index);
1597 pCBChannel->channelCnt = rowCnt;
1599 if (err == MSG_ERR_DB_NORECORD) {
1600 pDbHandle->freeTable();
1601 return MSG_ERR_DB_NORECORD;
1602 } else if (err != MSG_SUCCESS) {
1603 MSG_DEBUG("Fail to getTable().");
1604 pDbHandle->freeTable();
1605 return MSG_ERR_DB_GETTABLE;
1608 for (int i = 0; i < rowCnt; i++) {
1609 pCBChannel->channelInfo[i].bActivate = pDbHandle->getColumnToInt(index++);
1610 pCBChannel->channelInfo[i].from = pDbHandle->getColumnToInt(index++);
1611 pCBChannel->channelInfo[i].to = pDbHandle->getColumnToInt(index++);
1612 pDbHandle->getColumnToString(index++, CB_CHANNEL_NAME_MAX, pCBChannel->channelInfo[i].name);
1614 MSG_DEBUG("CH_ACT = %d", pCBChannel->channelInfo[i].bActivate);
1615 MSG_DEBUG("CH_FROM = %d", pCBChannel->channelInfo[i].from);
1616 MSG_DEBUG("CH_TO = %d", pCBChannel->channelInfo[i].to);
1617 MSG_DEBUG("CH_NAME = %s", pCBChannel->channelInfo[i].name);
1620 pDbHandle->freeTable();
1628 msg_error_t MsgStoAddCBChannelInfo(MsgDbHandler *pDbHandle, MSG_CB_CHANNEL_S *pCBChannel)
1632 char sqlQuery[MAX_QUERY_LEN] = {0,};
1634 pDbHandle->beginTrans();
1636 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1637 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s;", MSGFW_CDMA_CB_CHANNEL_INFO_TABLE_NAME);
1639 if (pDbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
1640 pDbHandle->endTrans(false);
1641 return MSG_ERR_DB_EXEC;
1644 for (int i = 0; i < pCBChannel->channelCnt; i++) {
1645 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1646 snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, %d, %d, %d, '%s');", MSGFW_CDMA_CB_CHANNEL_INFO_TABLE_NAME,
1647 i, pCBChannel->channelInfo[i].bActivate, pCBChannel->channelInfo[i].ctg,
1648 pCBChannel->channelInfo[i].lang, pCBChannel->channelInfo[i].name);
1650 if (pDbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
1651 pDbHandle->endTrans(false);
1652 return MSG_ERR_DB_EXEC;
1656 pDbHandle->endTrans(true);
1664 msg_error_t MsgStoGetCBChannelInfo(MsgDbHandler *pDbHandle, MSG_CB_CHANNEL_S *pCBChannel)
1668 int rowCnt = 0, index = 0;
1670 char sqlQuery[MAX_QUERY_LEN] = {0, };
1672 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1673 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT CHANNEL_ACTIVATION, CHANNEL_CATEGORY, CHANNEL_LANGUAGE, CHANNEL_NAME FROM %s;", MSGFW_CDMA_CB_CHANNEL_INFO_TABLE_NAME);
1675 msg_error_t err = pDbHandle->getTable(sqlQuery, &rowCnt, &index);
1677 pCBChannel->channelCnt = rowCnt;
1679 if (err == MSG_ERR_DB_NORECORD) {
1680 pDbHandle->freeTable();
1681 return MSG_ERR_DB_NORECORD;
1682 } else if (err != MSG_SUCCESS) {
1683 MSG_ERR("Fail to getTable().");
1684 pDbHandle->freeTable();
1685 return MSG_ERR_DB_GETTABLE;
1688 for (int i = 0; i < rowCnt; i++) {
1689 pCBChannel->channelInfo[i].bActivate = pDbHandle->getColumnToInt(index++);
1690 pCBChannel->channelInfo[i].ctg = pDbHandle->getColumnToInt(index++);
1691 pCBChannel->channelInfo[i].lang = pDbHandle->getColumnToInt(index++);
1692 pDbHandle->getColumnToString(index++, CB_CHANNEL_NAME_MAX, pCBChannel->channelInfo[i].name);
1694 MSG_DEBUG("CH_ACT: [%d], CH_CTG: [%d], CH_LANG: [%d], CH_NAME: [%s]",
1695 pCBChannel->channelInfo[i].bActivate, pCBChannel->channelInfo[i].ctg, pCBChannel->channelInfo[i].lang, pCBChannel->channelInfo[i].name);
1698 pDbHandle->freeTable();
1707 msg_error_t MsgStoGetThreadViewList(const MSG_SORT_RULE_S *pSortRule, msg_struct_list_s *pThreadViewList)
1709 MsgDbHandler *dbHandle = getDbHandle();
1710 dbHandle->connectReadOnly();
1712 pThreadViewList->nCount = 0;
1713 pThreadViewList->msg_struct_info = NULL;
1715 int rowCnt = 0, index = 0;
1717 char sqlQuery[MAX_QUERY_LEN+1];
1718 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1720 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.CONV_ID, A.UNREAD_CNT, A.SMS_CNT, A.MMS_CNT, A.MAIN_TYPE, A.SUB_TYPE, "
1721 "A.MSG_DIRECTION, A.DISPLAY_TIME, A.DISPLAY_NAME, A.MSG_TEXT, "
1722 "(COUNT(CASE WHEN M.PROTECTED = 1 THEN 1 END)) AS PROTECTED, "
1723 "(CASE WHEN B.FOLDER_ID = %d THEN 1 END) AS DRAFT, "
1724 "(CASE WHEN B.NETWORK_STATUS = %d THEN 1 END) AS FAILED, "
1725 "(CASE WHEN B.NETWORK_STATUS = %d THEN 1 END) AS SENDING "
1727 "LEFT OUTER JOIN %s B ON A.LAST_MSG_ID = B.MSG_ID "
1728 "LEFT OUTER JOIN %s M ON A.CONV_ID = M.CONV_ID "
1729 "WHERE A.SMS_CNT + A.MMS_CNT > 0 "
1730 "GROUP BY A.CONV_ID ORDER BY A.DISPLAY_TIME DESC;",
1732 MSG_NETWORK_SEND_FAIL,
1733 MSG_NETWORK_SENDING,
1734 MSGFW_CONVERSATION_TABLE_NAME,
1735 MSGFW_MESSAGE_TABLE_NAME,
1736 MSGFW_MESSAGE_TABLE_NAME);
1738 msg_error_t err = dbHandle->getTable(sqlQuery, &rowCnt, &index);
1740 if (err == MSG_ERR_DB_NORECORD) {
1741 dbHandle->freeTable();
1743 } else if (err != MSG_SUCCESS) {
1744 MSG_DEBUG("Fail to getTable().");
1745 dbHandle->freeTable();
1750 MSG_DEBUG("rowCnt is %d", rowCnt);
1751 dbHandle->freeTable();
1755 pThreadViewList->nCount = rowCnt;
1757 MSG_DEBUG("pThreadViewList->nCount [%d]", pThreadViewList->nCount);
1759 pThreadViewList->msg_struct_info = (msg_struct_t *)calloc(rowCnt, sizeof(msg_struct_t));
1761 if (pThreadViewList->msg_struct_info == NULL){
1762 dbHandle->freeTable();
1763 return MSG_ERR_NULL_POINTER;
1766 MSG_THREAD_VIEW_S *pTmp = NULL;
1767 msg_struct_s *thread_t = NULL;
1769 for (int i = 0; i < rowCnt; i++) {
1770 thread_t = (msg_struct_s *)new msg_struct_s;
1771 pThreadViewList->msg_struct_info[i] = (msg_struct_t)thread_t;
1773 thread_t->type = MSG_STRUCT_THREAD_INFO;
1774 thread_t->data = new MSG_THREAD_VIEW_S;
1776 pTmp = (MSG_THREAD_VIEW_S *)thread_t->data;
1777 memset(pTmp, 0x00, sizeof(MSG_THREAD_VIEW_S));
1779 pTmp->threadId = dbHandle->getColumnToInt(index++);
1781 pTmp->unreadCnt = dbHandle->getColumnToInt(index++);
1782 pTmp->smsCnt = dbHandle->getColumnToInt(index++);
1783 pTmp->mmsCnt = dbHandle->getColumnToInt(index++);
1785 pTmp->mainType = dbHandle->getColumnToInt(index++);
1786 pTmp->subType = dbHandle->getColumnToInt(index++);
1788 pTmp->direction = dbHandle->getColumnToInt(index++);
1789 pTmp->threadTime = (time_t)dbHandle->getColumnToInt(index++);
1791 memset(pTmp->threadName, 0x00, sizeof(pTmp->threadName));
1792 dbHandle->getColumnToString(index++, MAX_THREAD_NAME_LEN, pTmp->threadName);
1794 char tmpData[MAX_THREAD_DATA_LEN + 1] = {0};
1795 dbHandle->getColumnToString(index++, MAX_THREAD_DATA_LEN, tmpData);
1796 memset(pTmp->threadData, 0x00, sizeof(pTmp->threadData));
1798 if (g_utf8_validate(tmpData, -1, (const gchar **)&end) == true) {
1799 g_utf8_strncpy(pTmp->threadData, tmpData, g_utf8_strlen(tmpData, -1));
1801 g_utf8_strncpy(pTmp->threadData, tmpData, g_utf8_strlen(tmpData, end - tmpData));
1804 pTmp->bProtected = (dbHandle->getColumnToInt(index++) > 0) ? true : false;
1805 pTmp->bDraft = dbHandle->getColumnToInt(index++);
1806 pTmp->bSendFailed = dbHandle->getColumnToInt(index++);
1807 pTmp->bSending = dbHandle->getColumnToInt(index++);
1810 dbHandle->freeTable();
1816 msg_error_t MsgStoGetThreadViewListWithCondition(const MSG_SORT_RULE_S *pSortRule, const MSG_LIST_CONDITION_S *pListCond, msg_struct_list_s *pThreadViewList)
1818 msg_error_t err = MSG_SUCCESS;
1821 err = MsgStoGetThreadViewList(pSortRule, pThreadViewList);
1822 if (err != MSG_SUCCESS) {
1823 MSG_ERR("MsgStoGetThreadViewList() Error!!");
1829 MsgDbHandler *dbHandle = getDbHandle();
1830 dbHandle->connectReadOnly();
1832 pThreadViewList->nCount = 0;
1833 pThreadViewList->msg_struct_info = NULL;
1835 int rowCnt = 0, index = 0;
1837 char sqlQuery[MAX_QUERY_LEN+1];
1838 char sqlQuerySubset[MAX_QUERY_LEN+1];
1839 char conditionQuery[MAX_QUERY_LEN+1] = {0};
1841 if (pListCond->bProtected == true) {
1842 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
1843 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "PROTECTED = 1 AND ");
1844 strncat(conditionQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(conditionQuery));
1847 if (pListCond->folderId > MSG_ALLBOX_ID) {
1848 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
1849 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "FOLDER_ID = %d ", pListCond->folderId);
1850 strncat(conditionQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(conditionQuery));
1852 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
1853 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "FOLDER_ID > %d AND FOLDER_ID < %d ", MSG_ALLBOX_ID, MSG_SPAMBOX_ID);
1854 strncat(conditionQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(conditionQuery));
1857 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1858 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT DISTINCT(CONV_ID) FROM %s WHERE ", MSGFW_MESSAGE_TABLE_NAME);
1860 strncat(sqlQuery, conditionQuery, MAX_QUERY_LEN-strlen(sqlQuery));
1862 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
1863 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "ORDER BY DISPLAY_TIME DESC;");
1864 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
1867 err = dbHandle->getTable(sqlQuery, &rowCnt, NULL);
1868 if (err == MSG_ERR_DB_NORECORD) {
1870 } else if (err != MSG_SUCCESS) {
1871 MSG_ERR("Fail to getTable(). [%d]", err);
1872 dbHandle->freeTable();
1876 msg_thread_id_t conv_ids[rowCnt];
1877 for (int i = 1; i <= rowCnt; i++) {
1878 conv_ids[i - 1] = dbHandle->getColumnToInt(i);
1881 dbHandle->freeTable();
1883 pThreadViewList->nCount = rowCnt;
1884 MSG_DEBUG("pThreadViewList->nCount [%d]", pThreadViewList->nCount);
1886 pThreadViewList->msg_struct_info = (msg_struct_t *)calloc(rowCnt, sizeof(msg_struct_t));
1887 if (pThreadViewList->msg_struct_info == NULL) {
1888 MSG_ERR("calloc failed");
1889 return MSG_ERR_MEMORY_ERROR;
1892 MSG_THREAD_VIEW_S *pTmp = NULL;
1893 msg_struct_s *thread_t = NULL;
1895 for (int i = 0; i < pThreadViewList->nCount; i++) {
1896 thread_t = (msg_struct_s *)new msg_struct_s;
1897 pThreadViewList->msg_struct_info[i] = (msg_struct_t)thread_t;
1898 thread_t->type = MSG_STRUCT_THREAD_INFO;
1899 thread_t->data = new MSG_THREAD_VIEW_S;
1901 pTmp = (MSG_THREAD_VIEW_S *)thread_t->data;
1902 memset(pTmp, 0x00, sizeof(MSG_THREAD_VIEW_S));
1904 pTmp->threadId = conv_ids[i];
1906 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1907 snprintf(sqlQuery, MAX_QUERY_LEN, "SELECT DISPLAY_NAME FROM %s WHERE CONV_ID = %d;",
1908 MSGFW_CONVERSATION_TABLE_NAME, conv_ids[i]);
1910 err = dbHandle->getTable(sqlQuery, &rowCnt, &index);
1911 if (err != MSG_SUCCESS) {
1912 MSG_ERR("Fail to getTable(). [%d]", err);
1913 dbHandle->freeTable();
1917 dbHandle->getColumnToString(index++, MAX_THREAD_NAME_LEN, pTmp->threadName);
1919 dbHandle->freeTable();
1921 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1922 snprintf(sqlQuery, MAX_QUERY_LEN, "SELECT "
1923 "(COUNT(DISTINCT(CASE WHEN READ_STATUS = 0 THEN MSG_ID END))) AS UNREAD_CNT, "
1924 "(COUNT(DISTINCT(CASE WHEN MAIN_TYPE = %d THEN MSG_ID END))) AS SMS_CNT, "
1925 "(COUNT(DISTINCT(CASE WHEN MAIN_TYPE = %d THEN MSG_ID END))) AS MMS_CNT "
1926 "FROM %s WHERE CONV_ID = %d AND ",
1929 MSGFW_MESSAGE_TABLE_NAME, conv_ids[i]);
1931 strncat(sqlQuery, conditionQuery, MAX_QUERY_LEN-strlen(sqlQuery));
1932 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), ";");
1933 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
1935 err = dbHandle->getTable(sqlQuery, &rowCnt, &index);
1936 if (err != MSG_SUCCESS) {
1937 MSG_ERR("Fail to getTable(). [%d]", err);
1938 dbHandle->freeTable();
1942 pTmp->unreadCnt = dbHandle->getColumnToInt(index++);
1943 pTmp->smsCnt = dbHandle->getColumnToInt(index++);
1944 pTmp->mmsCnt = dbHandle->getColumnToInt(index++);
1946 dbHandle->freeTable();
1948 memset(sqlQuery, 0x00, MAX_QUERY_LEN);
1949 snprintf(sqlQuery, sizeof(sqlQuery),
1950 "SELECT MAIN_TYPE, SUB_TYPE, MSG_DIRECTION, DISPLAY_TIME, DPM_RESTRICTED, (CASE WHEN LENGTH(SUBJECT) > 0 THEN SUBJECT ELSE MSG_TEXT END) "
1951 "FROM %s WHERE CONV_ID = %d AND ",
1952 MSGFW_MESSAGE_TABLE_NAME, conv_ids[i]);
1954 strncat(sqlQuery, conditionQuery, MAX_QUERY_LEN-strlen(sqlQuery));
1955 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "ORDER BY DISPLAY_TIME DESC LIMIT 1;");
1956 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
1958 err = dbHandle->getTable(sqlQuery, &rowCnt, &index);
1959 if (err != MSG_SUCCESS) {
1960 MSG_ERR("Fail to getTable(). [%d]", err);
1961 dbHandle->freeTable();
1965 pTmp->mainType = (MSG_MAIN_TYPE_T)dbHandle->getColumnToInt(index++);
1966 pTmp->subType = (MSG_SUB_TYPE_T)dbHandle->getColumnToInt(index++);
1967 pTmp->direction = (msg_direction_type_t)dbHandle->getColumnToInt(index++);
1968 pTmp->threadTime = (time_t)dbHandle->getColumnToInt(index++);
1969 bool dpm_restricted = dbHandle->getColumnToInt(index++);
1970 char tmpData[MAX_THREAD_DATA_LEN + 1] = {0};
1971 if (!dpm_restricted) {
1972 dbHandle->getColumnToString(index++, MAX_THREAD_DATA_LEN, tmpData);
1974 snprintf(tmpData, sizeof(tmpData), "restricted message");
1978 if (g_utf8_validate(tmpData, -1, (const gchar **)&end) == true) {
1979 g_utf8_strncpy(pTmp->threadData, tmpData, g_utf8_strlen(tmpData, -1));
1981 g_utf8_strncpy(pTmp->threadData, tmpData, g_utf8_strlen(tmpData, end - tmpData));
1984 dbHandle->freeTable();
1991 msg_error_t MsgStoGetConversationPreview(MsgDbHandler *pDbHandle, MSG_CONVERSATION_VIEW_S *pConv)
1993 char sqlQuery[MAX_QUERY_LEN + 1];
1994 int rowCnt = 0, index = 0;
1995 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1998 return MSG_ERR_NULL_POINTER;
2000 pConv->tcs_bc_level = -1; /* init */
2002 /*(MSG_ID INTEGER, TYPE INTEGER, VALUE TEXT, COUNT INTEGER) */
2003 snprintf(sqlQuery, sizeof(sqlQuery),
2004 "SELECT TYPE, VALUE, COUNT "
2005 "FROM %s WHERE MSG_ID=%d;",
2006 MSGFW_MMS_PREVIEW_TABLE_NAME, pConv->msgId);
2008 msg_error_t err = pDbHandle->getTable(sqlQuery, &rowCnt, &index);
2009 if (err == MSG_SUCCESS) {
2010 for (int i = 0; i < rowCnt; i++) {
2011 int type = pDbHandle->getColumnToInt(index++);
2012 if (type == MSG_MMS_ITEM_TYPE_IMG) {
2013 pDbHandle->getColumnToString(index++, MSG_FILEPATH_LEN_MAX, pConv->imageThumbPath);
2014 pDbHandle->getColumnToInt(index++);
2015 } else if (type == MSG_MMS_ITEM_TYPE_VIDEO) {
2016 pDbHandle->getColumnToString(index++, MSG_FILEPATH_LEN_MAX, pConv->videoThumbPath);
2017 pDbHandle->getColumnToInt(index++);
2018 } else if (type == MSG_MMS_ITEM_TYPE_AUDIO) {
2019 pDbHandle->getColumnToString(index++, MSG_FILENAME_LEN_MAX, pConv->audioFileName);
2020 pDbHandle->getColumnToInt(index++);
2021 } else if (type == MSG_MMS_ITEM_TYPE_ATTACH) {
2022 pDbHandle->getColumnToString(index++, MSG_FILENAME_LEN_MAX, pConv->attachFileName);
2023 pConv->attachCount = pDbHandle->getColumnToInt(index++);
2024 } else if (type == MSG_MMS_ITEM_TYPE_PAGE) {
2026 pConv->pageCount = pDbHandle->getColumnToInt(index++);
2027 } else if (type == MSG_MMS_ITEM_TYPE_MALWARE) {
2029 pConv->tcs_bc_level = pDbHandle->getColumnToInt(index++);
2030 } else if (type == MSG_MMS_ITEM_TYPE_1ST_MEDIA) {
2031 pDbHandle->getColumnToString(index++, MSG_FILEPATH_LEN_MAX, pConv->firstMediaPath);
2032 pDbHandle->getColumnToInt(index++);
2034 MSG_DEBUG("Unknown item type [%d]", type);
2040 pDbHandle->freeTable();
2044 msg_error_t MsgStoGetConversationMultipart(MsgDbHandler *pDbHandle, MSG_CONVERSATION_VIEW_S *pConv)
2046 char sqlQuery[MAX_QUERY_LEN + 1];
2047 int rowCnt = 0, index = 0;
2048 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2051 return MSG_ERR_NULL_POINTER;
2053 snprintf(sqlQuery, sizeof(sqlQuery),
2054 "SELECT CONTENT_TYPE, NAME, FILE_PATH, CONTENT_ID, CONTENT_LOCATION, TCS_LEVEL, MALWARE_ALLOW, THUMB_FILE_PATH "
2055 "FROM %s WHERE MSG_ID=%d;",
2056 MSGFW_MMS_MULTIPART_TABLE_NAME, pConv->msgId);
2058 msg_error_t err = pDbHandle->getTable(sqlQuery, &rowCnt, &index);
2059 if (err == MSG_SUCCESS) {
2060 GList *multipart_list = NULL;
2061 for (int i = 0; i < rowCnt; i++) {
2062 msg_struct_s *multipart_struct_s = new msg_struct_s;
2063 multipart_struct_s->type = MSG_STRUCT_MULTIPART_INFO;
2064 multipart_struct_s->data = new MMS_MULTIPART_DATA_S;
2065 memset(multipart_struct_s->data, 0x00, sizeof(MMS_MULTIPART_DATA_S));
2067 MMS_MULTIPART_DATA_S *multipart = (MMS_MULTIPART_DATA_S *)multipart_struct_s->data;
2069 pDbHandle->getColumnToString(index++, sizeof(multipart->szContentType), multipart->szContentType);
2070 pDbHandle->getColumnToString(index++, sizeof(multipart->szFileName), multipart->szFileName);
2071 pDbHandle->getColumnToString(index++, sizeof(multipart->szFilePath), multipart->szFilePath);
2072 pDbHandle->getColumnToString(index++, sizeof(multipart->szContentID), multipart->szContentID);
2073 pDbHandle->getColumnToString(index++, sizeof(multipart->szContentLocation), multipart->szContentLocation);
2075 multipart->tcs_bc_level = pDbHandle->getColumnToInt(index++);
2076 multipart->malware_allow = pDbHandle->getColumnToInt(index++);
2077 pDbHandle->getColumnToString(index++, sizeof(multipart->szThumbFilePath), multipart->szThumbFilePath);
2079 multipart_list = g_list_append(multipart_list, multipart_struct_s);
2081 pConv->multipart_list = (msg_list_handle_t)multipart_list;
2084 pDbHandle->freeTable();
2088 msg_error_t MsgStoGetConversationViewItem(msg_message_id_t msgId, MSG_CONVERSATION_VIEW_S *pConv)
2090 MsgDbHandler *dbHandle = getDbHandle();
2091 dbHandle->connectReadOnly();
2093 int rowCnt = 0, index = 0;
2095 char sqlQuery[MAX_QUERY_LEN+1];
2097 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2099 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID, CONV_ID, FOLDER_ID, STORAGE_ID, MAIN_TYPE, SUB_TYPE, \
2100 DISPLAY_TIME, DATA_SIZE, NETWORK_STATUS, READ_STATUS, PROTECTED, \
2101 MSG_DIRECTION, DPM_RESTRICTED, SCHEDULED_TIME, SUBJECT, MSG_TEXT, ATTACHMENT_COUNT, SIM_INDEX\
2102 FROM %s WHERE MSG_ID = %d;",
2103 MSGFW_MESSAGE_TABLE_NAME, msgId);
2105 msg_error_t err = dbHandle->getTable(sqlQuery, &rowCnt, &index);
2107 if (err == MSG_ERR_DB_NORECORD) {
2108 dbHandle->freeTable();
2110 } else if (err != MSG_SUCCESS) {
2111 MSG_DEBUG("Fail to getTable().");
2112 dbHandle->freeTable();
2116 memset(pConv, 0x00, sizeof(MSG_CONVERSATION_VIEW_S));
2117 pConv->pText = NULL;
2119 pConv->msgId = dbHandle->getColumnToInt(index++);
2120 pConv->threadId = dbHandle->getColumnToInt(index++);
2121 pConv->folderId = dbHandle->getColumnToInt(index++);
2122 pConv->storageId = dbHandle->getColumnToInt(index++);
2123 pConv->mainType = dbHandle->getColumnToInt(index++);
2124 pConv->subType = dbHandle->getColumnToInt(index++);
2125 pConv->displayTime = (time_t)dbHandle->getColumnToInt(index++);
2126 pConv->textSize = dbHandle->getColumnToInt(index++);
2127 pConv->networkStatus = dbHandle->getColumnToInt(index++);
2128 pConv->bRead = dbHandle->getColumnToInt(index++);
2129 pConv->bProtected = dbHandle->getColumnToInt(index++);
2130 pConv->direction = dbHandle->getColumnToInt(index++);
2131 pConv->bRestricted = dbHandle->getColumnToInt(index++);
2132 pConv->scheduledTime = (time_t)dbHandle->getColumnToInt(index++);
2134 dbHandle->getColumnToString(index++, MAX_SUBJECT_LEN, pConv->subject);
2135 char *tmpText = g_strdup(dbHandle->getColumnToString(index++));
2137 /*It does Not need to Get attach count in MSG_MESSAGE_TABLE. see MsgStoGetConversationPreview */
2138 /*pConv->attachCount = dbHandle->getColumnToInt(index++); */
2140 if (pConv->bRestricted == true) {
2141 pConv->textSize = 0;
2142 memset(pConv->subject, 0x00, sizeof(pConv->subject));
2147 pConv->simIndex = dbHandle->getColumnToInt(index++);
2149 dbHandle->freeTable();
2151 if (pConv->mainType == MSG_MMS_TYPE &&
2152 (pConv->networkStatus == MSG_NETWORK_RETRIEVING || pConv->networkStatus == MSG_NETWORK_RETRIEVE_FAIL || pConv->subType == MSG_NOTIFICATIONIND_MMS)) {
2153 pConv->pText = NULL;
2154 pConv->textSize = 0;
2156 if (pConv->mainType == MSG_SMS_TYPE) {
2157 pConv->pText = new char[pConv->textSize+2];
2158 memset(pConv->pText, 0x00, pConv->textSize+2);
2159 snprintf(pConv->pText, pConv->textSize+1, "%s", tmpText);
2160 } else if (pConv->mainType == MSG_MMS_TYPE) {
2162 pConv->textSize = strlen(tmpText);
2164 pConv->pText = new char[pConv->textSize+1];
2165 memset(pConv->pText, 0x00, pConv->textSize+1);
2167 strncpy(pConv->pText, tmpText, pConv->textSize);
2170 MsgStoGetConversationPreview(dbHandle, pConv);
2171 MsgStoGetConversationMultipart(dbHandle, pConv);
2186 msg_error_t MsgStoGetConversationViewList(msg_thread_id_t threadId, msg_struct_list_s *pConvViewList)
2190 MsgDbHandler *dbHandle = getDbHandle();
2191 dbHandle->connectReadOnly();
2193 pConvViewList->nCount = 0;
2194 pConvViewList->msg_struct_info = NULL;
2196 int rowCnt = 0, index = 0;
2198 char sqlQuery[MAX_QUERY_LEN+1];
2200 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2202 #ifdef MSG_NOTI_INTEGRATION
2203 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID, CONV_ID, FOLDER_ID, STORAGE_ID, MAIN_TYPE, SUB_TYPE, \
2204 DISPLAY_TIME, DATA_SIZE, NETWORK_STATUS, READ_STATUS, PROTECTED, \
2205 MSG_DIRECTION, DPM_RESTRICTED, SCHEDULED_TIME, SUBJECT, MSG_TEXT, ATTACHMENT_COUNT, SIM_INDEX \
2206 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;",
2207 MSGFW_MESSAGE_TABLE_NAME, threadId, MSG_ALLBOX_ID, MSG_SPAMBOX_ID, MSG_STORAGE_PHONE);
2209 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID, CONV_ID, FOLDER_ID, STORAGE_ID, MAIN_TYPE, SUB_TYPE, \
2210 DISPLAY_TIME, DATA_SIZE, NETWORK_STATUS, READ_STATUS, PROTECTED, \
2211 MSG_DIRECTION, DPM_RESTRICTED, SCHEDULED_TIME, SUBJECT, MSG_TEXT, ATTACHMENT_COUNT \
2212 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;",
2213 MSGFW_MESSAGE_TABLE_NAME, threadId, MSG_ALLBOX_ID, MSG_CBMSGBOX_ID, MSG_STORAGE_PHONE);
2216 msg_error_t err = dbHandle->getTable(sqlQuery, &rowCnt, &index);
2218 if (err == MSG_ERR_DB_NORECORD) {
2219 dbHandle->freeTable();
2221 } else if (err != MSG_SUCCESS) {
2222 MSG_DEBUG("Fail to getTable().");
2223 dbHandle->freeTable();
2227 pConvViewList->nCount = rowCnt;
2228 char *tmpText[rowCnt] = {NULL};
2230 MSG_DEBUG("pConvViewList->nCount [%d]", pConvViewList->nCount);
2232 pConvViewList->msg_struct_info = (msg_struct_t *)calloc(rowCnt, sizeof(msg_struct_t));
2234 if (pConvViewList->msg_struct_info == NULL){
2235 dbHandle->freeTable();
2236 return MSG_ERR_NULL_POINTER;
2239 msg_struct_s *conv = NULL;
2240 MSG_CONVERSATION_VIEW_S *pTmp = NULL;
2242 for (int i = 0; i < rowCnt; i++) {
2243 pConvViewList->msg_struct_info[i] = (msg_struct_t)new msg_struct_s;
2244 memset(pConvViewList->msg_struct_info[i], 0x00, sizeof(msg_struct_s));
2246 conv = (msg_struct_s *)pConvViewList->msg_struct_info[i];
2248 conv->type = MSG_STRUCT_CONV_INFO;
2249 conv->data = new MSG_CONVERSATION_VIEW_S;
2250 memset(conv->data, 0x00, sizeof(MSG_CONVERSATION_VIEW_S));
2252 pTmp = (MSG_CONVERSATION_VIEW_S *)conv->data;
2256 pTmp->msgId = dbHandle->getColumnToInt(index++);
2257 pTmp->threadId = dbHandle->getColumnToInt(index++);
2258 pTmp->folderId = dbHandle->getColumnToInt(index++);
2259 pTmp->storageId = dbHandle->getColumnToInt(index++);
2260 pTmp->mainType = dbHandle->getColumnToInt(index++);
2261 pTmp->subType = dbHandle->getColumnToInt(index++);
2262 pTmp->displayTime = (time_t)dbHandle->getColumnToInt(index++);
2263 pTmp->textSize = dbHandle->getColumnToInt(index++);
2264 pTmp->networkStatus = dbHandle->getColumnToInt(index++);
2265 pTmp->bRead = dbHandle->getColumnToInt(index++);
2266 pTmp->bProtected = dbHandle->getColumnToInt(index++);
2267 pTmp->direction = dbHandle->getColumnToInt(index++);
2268 pTmp->bRestricted = dbHandle->getColumnToInt(index++);
2269 index++; /* This field is reserved. */
2271 dbHandle->getColumnToString(index++, MAX_SUBJECT_LEN, pTmp->subject);
2272 tmpText[i] = g_strdup(dbHandle->getColumnToString(index++));
2274 /*It does Not need to Get attach count in MSG_MESSAGE_TABLE. see MsgStoGetConversationPreview */
2275 /*pTmp->attachCount = dbHandle->getColumnToInt(index++); */
2278 if (pTmp->bRestricted == true) {
2280 memset(pTmp->subject, 0x00, sizeof(pTmp->subject));
2282 tmpText[i][0] = '\0';
2284 pTmp->simIndex = dbHandle->getColumnToInt(index++);
2286 dbHandle->freeTable();
2288 for (int i = 0; i < pConvViewList->nCount; i++) {
2289 conv = (msg_struct_s *)pConvViewList->msg_struct_info[i];
2290 pTmp = (MSG_CONVERSATION_VIEW_S *)conv->data;
2292 if (pTmp->mainType == MSG_MMS_TYPE &&
2293 (pTmp->networkStatus == MSG_NETWORK_RETRIEVING || pTmp->networkStatus == MSG_NETWORK_RETRIEVE_FAIL || pTmp->subType == MSG_NOTIFICATIONIND_MMS)) {
2297 if (pTmp->mainType == MSG_SMS_TYPE) {
2298 pTmp->pText = new char[pTmp->textSize+2];
2299 memset(pTmp->pText, 0x00, pTmp->textSize+2);
2300 snprintf(pTmp->pText, pTmp->textSize+1, "%s", tmpText[i]);
2301 } else if (pTmp->mainType == MSG_MMS_TYPE) {
2303 pTmp->textSize = strlen(tmpText[i]);
2305 pTmp->pText = new char[pTmp->textSize+1];
2306 memset(pTmp->pText, 0x00, pTmp->textSize+1);
2308 strncpy(pTmp->pText, tmpText[i], pTmp->textSize);
2311 MsgStoGetConversationPreview(dbHandle, pTmp);
2312 MsgStoGetConversationMultipart(dbHandle, pTmp);
2327 msg_error_t MsgStoSearchMessage(const char *pSearchString, msg_struct_list_s *pThreadViewList, int contactCount)
2330 return MSG_ERR_NULL_POINTER;
2332 MsgDbHandler *dbHandle = getDbHandle();
2333 dbHandle->connectReadOnly();
2334 char *escapeAddressStr = NULL;
2336 /* Clear Out Parameter */
2337 pThreadViewList->nCount = 0;
2338 pThreadViewList->msg_struct_info = NULL;
2340 tr1::unordered_set<msg_thread_id_t> IdList;
2341 queue<MSG_THREAD_VIEW_S> searchList;
2343 MSG_THREAD_VIEW_S threadView;
2345 char sqlQuery[MAX_QUERY_LEN+1];
2347 /* Search - Address, Name */
2348 memset(sqlQuery, 0x00, MAX_QUERY_LEN+1);
2349 snprintf(sqlQuery, MAX_QUERY_LEN, "SELECT A.CONV_ID, A.UNREAD_CNT, A.SMS_CNT, A.MMS_CNT, A.DISPLAY_NAME, "
2350 "A.MAIN_TYPE, A.SUB_TYPE, A.MSG_DIRECTION, A.DISPLAY_TIME, A.MSG_TEXT, "
2351 "(SELECT COUNT(*) FROM %s B WHERE B.CONV_ID = A.CONV_ID AND B.PROTECTED = 1) AS PROTECTED, "
2352 "(SELECT COUNT(*) FROM %s B WHERE B.MSG_ID = A.LAST_MSG_ID AND B.FOLDER_ID = %d) AS DRAFT, "
2353 "(SELECT COUNT(*) FROM %s B WHERE B.MSG_ID = A.LAST_MSG_ID AND B.NETWORK_STATUS = %d) AS FAILED, "
2354 "(SELECT COUNT(*) FROM %s B WHERE B.MSG_ID = A.LAST_MSG_ID AND B.NETWORK_STATUS = %d) AS SENDING "
2355 "FROM %s A WHERE (A.SMS_CNT > 0 OR A.MMS_CNT > 0) "
2357 "(SELECT DISTINCT(CONV_ID) FROM %s WHERE "
2358 "ADDRESS_VAL LIKE ? ESCAPE '%c' ",
2359 MSGFW_MESSAGE_TABLE_NAME,
2360 MSGFW_MESSAGE_TABLE_NAME, MSG_DRAFT_ID,
2361 MSGFW_MESSAGE_TABLE_NAME, MSG_NETWORK_SEND_FAIL,
2362 MSGFW_MESSAGE_TABLE_NAME, MSG_NETWORK_SENDING,
2363 MSGFW_CONVERSATION_TABLE_NAME,
2364 MSGFW_ADDRESS_TABLE_NAME,
2365 MSGFW_DB_ESCAPE_CHAR);
2367 unsigned int tmpSize = 0;
2368 if (contactCount > 0) {
2369 tmpSize = strlen(sqlQuery);
2370 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
2371 "OR ADDRESS_VAL IN (SELECT C.ADDRESS_VAL FROM %s C JOIN %s D ON (C.ADDRESS_VAL LIKE D.ADDRESS_VAL))"
2372 , MSGFW_ADDRESS_TABLE_NAME, MSGFW_ADDRESS_TEMP_TABLE_NAME);
2375 tmpSize = strlen(sqlQuery);
2376 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
2377 ") ORDER BY A.DISPLAY_TIME DESC;");
2379 MSG_DEBUG("sqlQuery=[%s]", sqlQuery);
2381 if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
2382 MSG_DEBUG("Prepare query fail.");
2383 return MSG_ERR_DB_PREPARE;
2386 MsgConvertStrWithEscape(pSearchString, &escapeAddressStr);
2387 MSG_DEBUG("escapeAddressStr [%s]", escapeAddressStr);
2388 dbHandle->bindText(escapeAddressStr, 1);
2389 /*dbHandle->bindText(escapeAddressStr, 2); */
2390 /*dbHandle->bindText(escapeAddressStr, 3); */
2391 /*dbHandle->bindText(escapeAddressStr, 4); */
2393 while (dbHandle->stepQuery() == MSG_ERR_DB_ROW) {
2394 memset(&threadView, 0x00, sizeof(threadView));
2396 threadView.threadId = dbHandle->columnInt(0);
2397 threadView.unreadCnt = dbHandle->columnInt(1);
2398 threadView.smsCnt = dbHandle->columnInt(2);
2399 threadView.mmsCnt = dbHandle->columnInt(3);
2401 if (dbHandle->columnText(4))
2402 strncpy(threadView.threadName, (char *)dbHandle->columnText(4), MAX_THREAD_NAME_LEN);
2404 threadView.mainType = dbHandle->columnInt(5);
2405 threadView.subType = dbHandle->columnInt(6);
2407 threadView.direction = dbHandle->columnInt(7);
2408 threadView.threadTime = (time_t)dbHandle->columnInt(8);
2410 if (dbHandle->columnText(9))
2411 strncpy(threadView.threadData, (char *)dbHandle->columnText(9), MAX_THREAD_DATA_LEN);
2413 int protectedCnt = dbHandle->columnInt(10);
2414 if (protectedCnt > 0)
2415 threadView.bProtected = true;
2417 int draftCnt = dbHandle->columnInt(11);
2419 threadView.bDraft = true;
2421 int failedCnt = dbHandle->columnInt(12);
2423 threadView.bSendFailed = true;
2425 int sendingCnt = dbHandle->columnInt(13);
2427 threadView.bSending = true;
2429 tr1::unordered_set<msg_thread_id_t>::iterator it;
2431 it = IdList.find(threadView.threadId);
2433 if (it == IdList.end()) {
2434 IdList.insert(threadView.threadId);
2435 searchList.push(threadView);
2439 dbHandle->finalizeQuery();
2441 if (escapeAddressStr) {
2442 free(escapeAddressStr);
2443 escapeAddressStr = NULL;
2447 /* Add data to Out Parameter */
2448 pThreadViewList->nCount = searchList.size();
2449 pThreadViewList->msg_struct_info = (msg_struct_t *)calloc(searchList.size(), sizeof(msg_struct_t));
2450 if (pThreadViewList->msg_struct_info == NULL)
2451 return MSG_ERR_MEMORY_ERROR;
2453 MSG_THREAD_VIEW_S *pTmp = NULL;
2454 msg_struct_s *thread_t = NULL;
2458 while (!searchList.empty()) {
2459 thread_t = (msg_struct_s *)new msg_struct_s;
2460 pThreadViewList->msg_struct_info[index] = (msg_struct_t)thread_t;
2462 thread_t->type = MSG_STRUCT_THREAD_INFO;
2463 thread_t->data = new MSG_THREAD_VIEW_S;
2465 pTmp = (MSG_THREAD_VIEW_S *)thread_t->data;
2466 memset(pTmp, 0x00, sizeof(MSG_THREAD_VIEW_S));
2468 memcpy(pTmp, &(searchList.front()), sizeof(MSG_THREAD_VIEW_S));
2479 msg_error_t MsgStoGetRejectMsgList(const char *pNumber, msg_struct_list_s *pRejectMsgList)
2481 MsgDbHandler *dbHandle = getDbHandle();
2482 dbHandle->connectReadOnly();
2484 /* Clear Out Parameter */
2485 pRejectMsgList->nCount = 0;
2486 pRejectMsgList->msg_struct_info = NULL;
2488 int rowCnt = 0, index = 0;
2490 char sqlQuery[MAX_QUERY_LEN+1];
2492 /* Search Reject Msg */
2493 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2495 if (pNumber != NULL) {
2496 int addrSize = strlen(pNumber);
2497 char phoneNumber[addrSize+1];
2498 memset(phoneNumber, 0x00, sizeof(phoneNumber));
2500 if (addrSize > MsgContactGetMinMatchDigit())
2501 MsgConvertNumber(pNumber, phoneNumber, addrSize);
2503 strncpy(phoneNumber, pNumber, addrSize);
2505 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT "
2510 "WHERE A.CONV_ID = B.CONV_ID "
2511 "AND B.MAIN_TYPE = %d "
2512 "AND B.SUB_TYPE = %d "
2513 "AND A.ADDRESS_VAL LIKE '%%%s' "
2514 "ORDER BY B.DISPLAY_TIME DESC;",
2515 MSGFW_ADDRESS_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME,
2520 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT "
2525 "WHERE A.CONV_ID = B.CONV_ID "
2526 "AND B.MAIN_TYPE = %d "
2527 "AND B.SUB_TYPE = %d "
2528 "ORDER BY B.DISPLAY_TIME DESC;",
2529 MSGFW_ADDRESS_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME,
2534 msg_error_t err = dbHandle->getTable(sqlQuery, &rowCnt, &index);
2536 if (err != MSG_SUCCESS) {
2537 MSG_DEBUG("Fail to getTable().");
2538 dbHandle->freeTable();
2542 pRejectMsgList->nCount = rowCnt;
2544 MSG_DEBUG("pRejectMsgList->nCount [%d]", pRejectMsgList->nCount);
2546 pRejectMsgList->msg_struct_info = (msg_struct_t *)calloc(rowCnt, sizeof(MSG_REJECT_MSG_INFO_S *));
2548 msg_struct_s* pTmp = NULL;
2550 if (pRejectMsgList->msg_struct_info == NULL){
2551 dbHandle->freeTable();
2552 return MSG_ERR_NULL_POINTER;
2555 for (int i = 0; i < rowCnt; i++) {
2556 pRejectMsgList->msg_struct_info[i] = (msg_struct_t)new msg_struct_s;
2558 pTmp = (msg_struct_s *)pRejectMsgList->msg_struct_info[i];
2559 pTmp->type = MSG_STRUCT_REJECT_MSG_INFO;
2560 pTmp->data = new MSG_REJECT_MSG_INFO_S;
2561 MSG_REJECT_MSG_INFO_S * pMsg = (MSG_REJECT_MSG_INFO_S *)pTmp->data;
2562 memset(pMsg, 0x00, sizeof(MSG_REJECT_MSG_INFO_S));
2564 pMsg->msgId = dbHandle->getColumnToInt(index++);
2565 memset(pMsg->msgText, 0x00, sizeof(pMsg->msgText));
2566 dbHandle->getColumnToString(index++, MAX_MSG_TEXT_LEN, pMsg->msgText);
2568 pMsg->displayTime = (time_t)dbHandle->getColumnToInt(index++);
2571 dbHandle->freeTable();
2577 msg_error_t MsgStoGetAddressList(const msg_thread_id_t threadId, msg_struct_list_s *pAddrList)
2579 MsgDbHandler *dbHandle = getDbHandle();
2580 dbHandle->connectReadOnly();
2582 msg_error_t err = MSG_SUCCESS;
2584 err = MsgStoGetAddressByConvId(dbHandle, threadId, pAddrList);
2590 msg_error_t MsgStoGetMessageList(const MSG_LIST_CONDITION_S *pListCond, msg_struct_list_s *pMsgList, int contactCount)
2592 MsgDbHandler *dbHandle = getDbHandle();
2593 dbHandle->connectReadOnly();
2595 /* Clear Out Parameter */
2596 pMsgList->nCount = 0;
2597 pMsgList->msg_struct_info = NULL;
2600 int multipartCnt = 0;
2602 char sqlQuery[MAX_QUERY_LEN+1];
2603 char sqlQuerySubset[(MAX_QUERY_LEN/5)+1];
2605 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2606 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(*) FROM %s;", MSGFW_MMS_MULTIPART_TABLE_NAME);
2608 if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
2609 return MSG_ERR_DB_PREPARE;
2611 if (dbHandle->stepQuery() == MSG_ERR_DB_ROW) {
2612 multipartCnt = dbHandle->columnInt(0);
2614 dbHandle->finalizeQuery();
2615 return MSG_ERR_DB_STEP;
2618 dbHandle->finalizeQuery();
2620 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2621 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT DISTINCT "
2630 "A.NETWORK_STATUS, "
2636 "A.SCHEDULED_TIME, "
2639 "A.ATTACHMENT_COUNT, "
2643 "B.RECIPIENT_TYPE, "
2646 if (pListCond->pTextVal != NULL && multipartCnt > 0) {
2647 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2648 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "FROM %s C, %s B, %s A WHERE A.CONV_ID > 0 AND A.CONV_ID = B.CONV_ID ",
2649 MSGFW_MMS_MULTIPART_TABLE_NAME, MSGFW_ADDRESS_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME);
2651 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2652 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "FROM %s B, %s A WHERE A.CONV_ID > 0 AND A.CONV_ID = B.CONV_ID ",
2653 MSGFW_ADDRESS_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME);
2656 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2658 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2659 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.DPM_RESTRICTED = 0 ");
2660 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2663 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2665 if (pListCond->folderId == MSG_ALLBOX_ID)
2666 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.FOLDER_ID > 0 AND A.FOLDER_ID < %d ", MSG_SPAMBOX_ID);
2667 else if (pListCond->folderId == MSG_IOSBOX_ID)
2668 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.FOLDER_ID > 0 AND A.FOLDER_ID < %d ", MSG_DRAFT_ID);
2670 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.FOLDER_ID = %d ", pListCond->folderId);
2672 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2676 if (pListCond->threadId > 0) {
2677 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2678 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.CONV_ID = %d ", pListCond->threadId);
2679 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2684 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2686 switch (pListCond->msgType) {
2688 if (pListCond->pAddressVal == NULL)
2689 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.MAIN_TYPE = %d ", MSG_SMS_TYPE);
2691 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.MAIN_TYPE = %d AND A.SUB_TYPE = %d ", MSG_SMS_TYPE, MSG_NORMAL_SMS);
2695 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.MAIN_TYPE = %d ", MSG_MMS_TYPE);
2698 case MSG_TYPE_MMS_JAVA:
2699 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.MAIN_TYPE = %d AND A.SUB_TYPE = %d ", MSG_MMS_TYPE, MSG_SENDREQ_JAVA_MMS);
2702 case MSG_TYPE_SMS_SYNCML:
2703 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.MAIN_TYPE = %d AND A.SUB_TYPE = %d ", MSG_SMS_TYPE, MSG_SYNCML_CP);
2705 case MSG_TYPE_SMS_REJECT:
2706 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.MAIN_TYPE = %d AND A.SUB_TYPE = %d ", MSG_SMS_TYPE, MSG_REJECT_SMS);
2710 MSG_DEBUG("msg type is not set.");
2714 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2718 if (pListCond->storageId > MSG_STORAGE_UNKNOWN) {
2719 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2720 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.STORAGE_ID = %d ", pListCond->storageId);
2721 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2726 if (pListCond->bProtected) {
2727 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2728 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.PROTECTED = %d ", pListCond->bProtected);
2729 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2734 if (pListCond->bScheduled) {
2735 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2736 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.SCHEDULED_TIME > 0 ");
2737 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2742 if (pListCond->simIndex > 0) {
2743 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2744 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.SIM_INDEX = %d ", pListCond->simIndex);
2745 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2750 if (pListCond->fromTime > 0) {
2751 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2752 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.DISPLAY_TIME >= %u ", (unsigned int)pListCond->fromTime);
2753 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2756 if (pListCond->toTime > 0) {
2757 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2758 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.DISPLAY_TIME <= %u ", (unsigned int)pListCond->toTime);
2759 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2762 if (pListCond->pAddressVal == NULL) {
2764 if (pListCond->pTextVal != NULL) {
2765 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2766 if (multipartCnt > 0) {
2767 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset),
2768 "AND ((A.MSG_TEXT LIKE ? ESCAPE '%c' OR A.SUBJECT LIKE ? ESCAPE '%c' OR (C.TEXT LIKE ? ESCAPE '%c' AND A.MSG_ID = C.MSG_ID AND C.CONTENT_TYPE = 'text/plain'))) ",
2769 MSGFW_DB_ESCAPE_CHAR, MSGFW_DB_ESCAPE_CHAR, MSGFW_DB_ESCAPE_CHAR);
2771 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset),
2772 "AND ((A.MSG_TEXT LIKE ? ESCAPE '%c' OR A.SUBJECT LIKE ? ESCAPE '%c')) ",
2773 MSGFW_DB_ESCAPE_CHAR, MSGFW_DB_ESCAPE_CHAR);
2775 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2779 if (pListCond->pTextVal != NULL) {
2780 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2781 if (multipartCnt > 0) {
2782 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset),
2783 "AND ((A.MSG_TEXT LIKE ? ESCAPE '%c' OR A.SUBJECT LIKE ? ESCAPE '%c' OR (C.TEXT LIKE ? ESCAPE '%c' AND A.MSG_ID = C.MSG_ID AND C.CONTENT_TYPE = 'text/plain')) ",
2784 MSGFW_DB_ESCAPE_CHAR, MSGFW_DB_ESCAPE_CHAR, MSGFW_DB_ESCAPE_CHAR);
2786 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset),
2787 "AND ((A.MSG_TEXT LIKE ? ESCAPE '%c' OR A.SUBJECT LIKE ? ESCAPE '%c') ",
2788 MSGFW_DB_ESCAPE_CHAR, MSGFW_DB_ESCAPE_CHAR);
2790 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2792 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2793 if (pListCond->bAnd) {
2794 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND ");
2796 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "OR ");
2798 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2801 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2802 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset),
2803 "(B.ADDRESS_VAL LIKE ? ESCAPE '%c' ", MSGFW_DB_ESCAPE_CHAR);
2804 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2806 if (contactCount > 0) {
2807 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2808 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset),
2809 "OR B.ADDRESS_VAL IN (SELECT D.ADDRESS_VAL FROM %s D JOIN %s E ON (D.ADDRESS_VAL LIKE E.ADDRESS_VAL)) "
2810 , MSGFW_ADDRESS_TABLE_NAME, MSGFW_ADDRESS_TEMP_TABLE_NAME);
2811 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2814 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2815 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), ")) ");
2816 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2819 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2820 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset),
2821 "AND (B.ADDRESS_VAL LIKE ? ESCAPE '%c' ", MSGFW_DB_ESCAPE_CHAR);
2822 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2824 if (contactCount > 0) {
2825 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2826 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset),
2827 "OR B.ADDRESS_VAL IN (SELECT D.ADDRESS_VAL FROM %s D JOIN %s E ON (D.ADDRESS_VAL LIKE E.ADDRESS_VAL)) "
2828 , MSGFW_ADDRESS_TABLE_NAME, MSGFW_ADDRESS_TEMP_TABLE_NAME);
2829 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2832 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2833 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), ") ");
2834 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2838 msg_struct_s *pSortRule = (msg_struct_s *)pListCond->sortRule;
2840 if (pSortRule->type != MSG_STRUCT_SORT_RULE) {
2842 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2843 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "ORDER BY A.DISPLAY_TIME ");
2845 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2848 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2849 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "DESC ");
2851 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2853 MSG_SORT_RULE_S *pTmp = (MSG_SORT_RULE_S *)pSortRule->data;
2854 /* order : TODO: have to finish this */
2855 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2856 switch (pTmp->sortType) {
2857 case MSG_SORT_BY_MSG_TYPE:
2858 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "ORDER BY A.MAIN_TYPE ");
2860 case MSG_SORT_BY_READ_STATUS:
2861 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "ORDER BY A.READ_STATUS ");
2863 case MSG_SORT_BY_STORAGE_TYPE:
2864 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "ORDER BY A.STORAGE_ID ");
2867 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "ORDER BY A.DISPLAY_TIME ");
2870 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2873 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2874 if (pTmp->bAscending)
2875 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "ASC ");
2877 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "DESC ");
2879 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2882 /* offset & limit */
2883 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2884 if (pListCond->offset >= 0 && pListCond->limit > 0)
2885 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "LIMIT %d OFFSET %d;", pListCond->limit, pListCond->offset);
2887 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), ";");
2889 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2892 /* 'til here sqlQuery is complete. */
2894 queue<MSG_MESSAGE_HIDDEN_S*> searchList;
2896 MSG_DEBUG("[%s]", sqlQuery);
2898 if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
2899 MSG_DEBUG("Prepare query fail.");
2900 return MSG_ERR_DB_PREPARE;
2903 char *escapeTextStr = NULL;
2904 char *escapeAddressStr = NULL;
2906 if (pListCond->pAddressVal == NULL) {
2908 if (pListCond->pTextVal != NULL) {
2909 MsgConvertStrWithEscape(pListCond->pTextVal, &escapeTextStr);
2910 MSG_DEBUG("escapeTextStr [%s]", escapeTextStr);
2911 dbHandle->bindText(escapeTextStr, 1);
2912 dbHandle->bindText(escapeTextStr, 2);
2913 if (multipartCnt > 0) dbHandle->bindText(escapeTextStr, 3);
2917 if (pListCond->pTextVal != NULL) {
2918 MsgConvertStrWithEscape(pListCond->pTextVal, &escapeTextStr);
2919 MSG_DEBUG("escapeTestStr [%s]", escapeTextStr);
2922 MsgConvertStrWithEscape(pListCond->pAddressVal, &escapeAddressStr);
2923 MSG_DEBUG("escapeAddressStr [%s]", escapeAddressStr);
2925 dbHandle->bindText(escapeTextStr, 1);
2926 dbHandle->bindText(escapeTextStr, 2);
2927 if (multipartCnt > 0) {
2928 dbHandle->bindText(escapeTextStr, 3);
2929 dbHandle->bindText(escapeAddressStr, 4);
2931 dbHandle->bindText(escapeAddressStr, 3);
2936 MsgConvertStrWithEscape(pListCond->pAddressVal, &escapeAddressStr);
2937 MSG_DEBUG("escapeAddressStr [%s]", escapeAddressStr);
2938 dbHandle->bindText(escapeAddressStr, 1);
2943 MSG_MESSAGE_HIDDEN_S *pTmp = NULL;
2944 int lastMsgId = 0; /* for comparing same msg id. */
2946 while (dbHandle->stepQuery() == MSG_ERR_DB_ROW) {
2949 int msgid = dbHandle->columnInt(index++);
2950 MSG_DEBUG("msgid [%d]", msgid);
2952 if (lastMsgId != msgid) {
2953 MSG_DEBUG("lastMsgId != msgid");
2957 pTmp = new MSG_MESSAGE_HIDDEN_S;
2960 memset(pTmp, 0x00, sizeof(MSG_MESSAGE_HIDDEN_S));
2963 pTmp->pMmsData = NULL;
2964 pTmp->addressList = NULL;
2966 pTmp->msgId = msgid;
2968 pTmp->threadId = dbHandle->columnInt(index++);
2969 pTmp->folderId = dbHandle->columnInt(index++);
2970 pTmp->storageId = dbHandle->columnInt(index++);
2971 pTmp->mainType = dbHandle->columnInt(index++);
2972 pTmp->subType = dbHandle->columnInt(index++);
2973 pTmp->displayTime = (time_t)dbHandle->columnInt(index++);
2974 pTmp->dataSize = dbHandle->columnInt(index++);
2975 pTmp->networkStatus = dbHandle->columnInt(index++);
2976 pTmp->bRead = dbHandle->columnInt(index++);
2977 pTmp->bProtected = dbHandle->columnInt(index++);
2978 pTmp->bBackup = dbHandle->columnInt(index++);
2979 pTmp->priority = dbHandle->columnInt(index++);
2980 pTmp->direction = dbHandle->columnInt(index++);
2981 index++; /* This field is reserved. */
2983 strncpy(pTmp->subject, (char *)dbHandle->columnText(index++), MAX_SUBJECT_LEN);
2985 if (pTmp->mainType == MSG_MMS_TYPE &&
2986 (pTmp->networkStatus == MSG_NETWORK_RETRIEVING || pTmp->networkStatus == MSG_NETWORK_RETRIEVE_FAIL || pTmp->subType == MSG_NOTIFICATIONIND_MMS)) {
2990 pTmp->pData = (void *)new char[pTmp->dataSize+2];
2991 memset(pTmp->pData, 0x00, pTmp->dataSize+2);
2993 strncpy((char *)pTmp->pData, (char *)dbHandle->columnText(index++), pTmp->dataSize+1);
2996 pTmp->attachCount = dbHandle->columnInt(index++);
2998 strncpy(pTmp->thumbPath, (char *)dbHandle->columnText(index++), MSG_FILEPATH_LEN_MAX);
3000 pTmp->simIndex = dbHandle->columnInt(index++);
3002 pTmp->addr_list = (msg_struct_list_s *)new msg_struct_list_s;
3003 pTmp->addr_list->nCount = 0;
3004 pTmp->addr_list->msg_struct_info = (msg_struct_t *)calloc(MAX_TO_ADDRESS_CNT, sizeof(msg_struct_t));
3005 for (int i = 0; i < MAX_TO_ADDRESS_CNT; i++) {
3006 pTmp->addr_list->msg_struct_info[i] = (msg_struct_t)new msg_struct_s;
3007 memset(pTmp->addr_list->msg_struct_info[i], 0x00, sizeof(msg_struct_s));
3010 searchList.push(pTmp);
3014 MSG_DEBUG("lastMsgId == msgid");
3019 MSG_ADDRESS_INFO_S *pAddr = new MSG_ADDRESS_INFO_S;
3020 memset(pAddr, 0x00, sizeof(MSG_ADDRESS_INFO_S));
3022 pAddr->addressType = dbHandle->columnInt(index++);
3023 pAddr->recipientType = dbHandle->columnInt(index++);
3025 strncpy(pAddr->addressVal, (char *)dbHandle->columnText(index++), MAX_ADDRESS_VAL_LEN);
3027 strncpy(pAddr->displayName, pAddr->addressVal, MAX_DISPLAY_NAME_LEN);
3029 /* For GList *addressList */
3030 msg_struct_s *addr_info_s = new msg_struct_s;
3031 memset(addr_info_s, 0x00, sizeof(msg_struct_s));
3032 addr_info_s->type = MSG_STRUCT_ADDRESS_INFO;
3033 addr_info_s->data = new MSG_ADDRESS_INFO_S;
3034 memset(addr_info_s->data, 0x00, sizeof(MSG_ADDRESS_INFO_S));
3035 MSG_ADDRESS_INFO_S *addr_info = (MSG_ADDRESS_INFO_S *)addr_info_s->data;
3036 addr_info->addressType = pAddr->addressType;
3037 addr_info->recipientType = pAddr->recipientType;
3038 addr_info->contactId = pAddr->contactId;
3039 strncpy(addr_info->addressVal, pAddr->addressVal, MAX_ADDRESS_VAL_LEN);
3040 strncpy(addr_info->displayName, pAddr->displayName, MAX_DISPLAY_NAME_LEN);
3041 addr_info->displayName[MAX_DISPLAY_NAME_LEN] = '\0';
3043 pTmp->addressList = g_list_append(pTmp->addressList, addr_info_s);
3045 if (pTmp->addr_list->nCount >= MAX_TO_ADDRESS_CNT) {
3049 msg_struct_s *pStruct = (msg_struct_s *)pTmp->addr_list->msg_struct_info[pTmp->addr_list->nCount];
3050 pTmp->addr_list->nCount++;
3051 pStruct->type = MSG_STRUCT_ADDRESS_INFO;
3052 pStruct->data = pAddr;
3057 dbHandle->finalizeQuery();
3059 pMsgList->nCount = searchList.size();
3060 MSG_DEBUG("pMsgList->nCount [%d]", pMsgList->nCount);
3062 pMsgList->msg_struct_info = (msg_struct_t *)calloc(pMsgList->nCount, sizeof(msg_struct_t));
3063 if (pMsgList->msg_struct_info == NULL)
3064 return MSG_ERR_MEMORY_ERROR;
3067 while (!searchList.empty()) {
3068 msg_struct_s *msg = new msg_struct_s;
3070 pMsgList->msg_struct_info[offset++] = (msg_struct_t)msg;
3072 msg->type = MSG_STRUCT_MESSAGE_INFO;
3073 msg->data = searchList.front();
3080 free(escapeTextStr);
3082 if (escapeAddressStr)
3083 free(escapeAddressStr);
3089 msg_error_t MsgStoGetMediaList(const msg_thread_id_t threadId, msg_list_handle_t *pMediaList)
3092 msg_error_t err = MSG_SUCCESS;
3093 MsgDbHandler *dbHandle = getDbHandle();
3094 dbHandle->connectReadOnly();
3095 char sqlQuery[MAX_QUERY_LEN+1];
3099 memset(sqlQuery, 0x00, sizeof(sqlQuery));
3100 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s WHERE MAIN_TYPE = %d AND DPM_RESTRICTED = 0 AND CONV_ID = %d;",
3101 MSGFW_MESSAGE_TABLE_NAME, MSG_MMS_TYPE, threadId);
3103 MSG_DEBUG("sqlQuery = [%s]", sqlQuery);
3105 err = dbHandle->getTable(sqlQuery, &msgIdCnt, NULL);
3106 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
3107 dbHandle->freeTable();
3109 } else if (err == MSG_ERR_DB_NORECORD) {
3110 dbHandle->freeTable();
3114 msg_message_id_t msgIds[msgIdCnt];
3116 for (int i = 1; i <= msgIdCnt; i++) {
3117 msgIds[i-1] = dbHandle->getColumnToInt(i);
3120 dbHandle->freeTable();
3122 GList *media_list = NULL;
3124 for (int i = 0; i < msgIdCnt; i++) {
3125 memset(sqlQuery, 0x00, sizeof(sqlQuery));
3126 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID, TCS_LEVEL, MALWARE_ALLOW, CONTENT_TYPE, FILE_PATH, THUMB_FILE_PATH, TCS_LEVEL, MALWARE_ALLOW "
3127 "FROM %s WHERE MSG_ID = %d AND SEQ <> -1 AND (TCS_LEVEL = -1 OR MALWARE_ALLOW = 1);",
3128 MSGFW_MMS_MULTIPART_TABLE_NAME, msgIds[i]);
3130 int rowCnt = 0, msg_id = 0, index = 0;
3132 err = dbHandle->getTable(sqlQuery, &rowCnt, &index);
3134 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
3135 dbHandle->freeTable();
3139 MSG_MEDIA_INFO_S *pMedia = NULL;
3140 int tcs_level = -1, malware_allow = 0, thumb_tcs_level = -1, thumb_malware_allow = 0;
3141 char mime_type[MAX_MIME_TYPE_LEN+1], media_item[MSG_FILEPATH_LEN_MAX+1], thumb_path[MSG_FILEPATH_LEN_MAX+1];
3143 for (int j = 0; j < rowCnt; j++) {
3144 msg_id = dbHandle->getColumnToInt(index++);
3145 tcs_level = dbHandle->getColumnToInt(index++);
3146 malware_allow = dbHandle->getColumnToInt(index++);
3147 memset(mime_type, 0x00, sizeof(mime_type));
3148 dbHandle->getColumnToString(index++, MAX_MIME_TYPE_LEN, mime_type);
3149 memset(media_item, 0x00, sizeof(media_item));
3150 dbHandle->getColumnToString(index++, MSG_FILEPATH_LEN_MAX, media_item);
3151 memset(thumb_path, 0x00, sizeof(thumb_path));
3152 dbHandle->getColumnToString(index++, MSG_FILEPATH_LEN_MAX, thumb_path);
3153 thumb_tcs_level = dbHandle->getColumnToInt(index++);
3154 thumb_malware_allow = dbHandle->getColumnToInt(index++);
3156 if (strstr(mime_type, "image") || strstr(mime_type, "video")) {
3157 msg_struct_s *media_struct_s = new msg_struct_s;
3158 media_struct_s->type = MSG_STRUCT_MEDIA_INFO;
3159 media_struct_s->data = new MSG_MEDIA_INFO_S;
3160 memset(media_struct_s->data, 0x00, sizeof(MSG_MEDIA_INFO_S));
3162 pMedia = (MSG_MEDIA_INFO_S *)media_struct_s->data;
3164 pMedia->msg_id = msg_id;
3165 pMedia->tcs_level = tcs_level;
3166 pMedia->malware_allow = malware_allow;
3167 wrn = snprintf(pMedia->mime_type, MAX_MIME_TYPE_LEN, "%s", mime_type);
3169 MSG_DEBUG("snprintf was failed");
3170 wrn = snprintf(pMedia->media_item, MSG_FILEPATH_LEN_MAX, "%s", media_item);
3172 MSG_DEBUG("snprintf was failed");
3173 wrn = snprintf(pMedia->thumb_path, MSG_FILEPATH_LEN_MAX, "%s", thumb_path);
3175 MSG_DEBUG("snprintf was failed");
3176 pMedia->thumb_tcs_level = thumb_tcs_level;
3177 pMedia->thumb_malware_allow = thumb_malware_allow;
3179 media_list = g_list_append(media_list, media_struct_s);
3183 dbHandle->freeTable();
3185 *pMediaList = (msg_list_handle_t)media_list;
3193 msg_error_t MsgStoDbSelectWithQuery(const char *szQuery, char ***db_res, int *row_count, int *col_count)
3197 msg_error_t err = MSG_SUCCESS;
3199 MsgDbHandler *dbHandle = getDbHandle();
3200 err = dbHandle->connectReadOnly();
3201 if (err != MSG_SUCCESS) {
3202 MSG_ERR("db connect (read only) is failed [%d]", err);
3206 char *zSQL = sqlite3_mprintf("SELECT %q;", szQuery);
3209 err = dbHandle->getTableWithResult((const char *)zSQL, db_res, row_count, col_count);
3213 THROW(MsgException::INVALID_RESULT, "sqlite3_mprintf() is failed");
3216 MSG_DEBUG("getTableWithResult :: row_count=[%d], col_count=[%d]", *row_count, *col_count);
3218 if (err == MSG_ERR_DB_NORECORD) {
3219 dbHandle->freeTable(*db_res);
3222 } else if (err != MSG_SUCCESS) {
3223 MSG_DEBUG("Fail to getTable().");
3224 dbHandle->freeTable(*db_res);
3232 void MsgStoDbFree(char **db_res)
3234 MsgDbHandler *dbHandle = getDbHandle();
3235 dbHandle->freeTable(db_res);
3239 msg_error_t MsgStoClearUniquenessTable()
3243 msg_error_t err = MSG_SUCCESS;
3245 MsgDbHandler *dbHandle = getDbHandle();
3247 char sqlQuery[MAX_QUERY_LEN+1] = {0, };
3248 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE MSG_ID = 0", MSGFW_UNIQUENESS_INFO_TABLE_NAME);
3250 err = dbHandle->execQuery(sqlQuery);
3258 msg_error_t MsgStoGetSimIndexByMsgId(msg_message_id_t msgId, int* simIndex)
3262 msg_error_t err = MSG_SUCCESS;
3264 MsgDbHandler *dbHandle = getDbHandle();
3266 char sqlQuery[MAX_QUERY_LEN+1];
3267 memset(sqlQuery, 0x00, sizeof(sqlQuery));
3268 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT SIM_INDEX FROM %s WHERE MSG_ID = %d;", MSGFW_MESSAGE_TABLE_NAME, msgId);
3270 if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
3271 return MSG_ERR_DB_PREPARE;
3274 if (dbHandle->stepQuery() == MSG_ERR_DB_ROW) {
3275 *simIndex = dbHandle->columnInt(0);
3276 dbHandle->finalizeQuery();
3278 MSG_DEBUG("MsgStepQuery() Error [%s]", sqlQuery);
3279 dbHandle->finalizeQuery();
3280 err = MSG_ERR_DB_STEP;
3289 msg_error_t MsgStoGetNetworkStatusByMsgId(msg_message_id_t msgId, int *networkStatus)
3291 char sqlQuery[MAX_QUERY_LEN + 1] = {0,};
3292 MsgDbHandler *dbHandle = getDbHandle();
3294 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT NETWORK_STATUS FROM %s WHERE MSG_ID = %d;",
3295 MSGFW_MESSAGE_TABLE_NAME, msgId);
3297 if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
3298 return MSG_ERR_DB_PREPARE;
3301 if (dbHandle->stepQuery() != MSG_ERR_DB_ROW) {
3302 dbHandle->finalizeQuery();
3303 return MSG_ERR_STORAGE_ERROR;
3306 *networkStatus = dbHandle->columnInt(0);
3307 dbHandle->finalizeQuery();