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"
37 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}};
41 #define ITERATION_SIZE 200
42 /*==================================================================================================
43 FUNCTION IMPLEMENTATION
44 ==================================================================================================*/
46 unsigned int MsgStoAddMessageTable(MsgDbHandler *pDbHandle, const MSG_MESSAGE_INFO_S *pMsgInfo)
50 msg_error_t err = MSG_SUCCESS;
52 msg_message_id_t msgId = 0;
54 err = pDbHandle->getRowId(MSGFW_MESSAGE_TABLE_NAME, &msgId);
56 if (err != MSG_SUCCESS)
61 char* pFileData = NULL;
62 unique_ptr<char*, void(*)(char**)> buf(&pFileData, unique_ptr_deleter);
65 if (pMsgInfo->bTextSms == false) {
66 if (MsgOpenAndReadFile(pMsgInfo->msgData, &pFileData, &fileSize) == false)
69 MSG_DEBUG("file size [%d]", fileSize);
72 char keyName[MAX_VCONFKEY_NAME_LEN];
73 memset(keyName, 0x00, sizeof(keyName));
74 snprintf(keyName, sizeof(keyName), "%s/%d", MSG_SIM_SUBS_ID, pMsgInfo->sim_idx);
77 if (MsgSettingGetString(keyName, &imsi) != MSG_SUCCESS) {
78 MSG_INFO("MsgSettingGetString() is failed");
82 char sqlQuery[MAX_QUERY_LEN+1];
84 memset(sqlQuery, 0x00, sizeof(sqlQuery));
85 snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, %d, %d, %d, %d, %d, %u, %d, %d, %d, %d, %d, %d, %d, %d, ?, '', '', ?, 0, %d, '%s');",
86 MSGFW_MESSAGE_TABLE_NAME, msgId, pMsgInfo->threadId, pMsgInfo->folderId, pMsgInfo->storageId, pMsgInfo->msgType.mainType,
87 pMsgInfo->msgType.subType, (unsigned int)pMsgInfo->displayTime, pMsgInfo->dataSize, pMsgInfo->networkStatus, pMsgInfo->bRead, pMsgInfo->bProtected,
88 pMsgInfo->priority, pMsgInfo->direction, 0, pMsgInfo->bBackup, pMsgInfo->sim_idx, imsi);
90 MSG_DEBUG("QUERY : %s", sqlQuery);
95 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
98 pDbHandle->bindText(pMsgInfo->subject, 1);
100 if (pMsgInfo->msgType.subType == MSG_NOTIFICATIONIND_MMS) {
101 pDbHandle->bindText("", 2);
103 if (pMsgInfo->bTextSms == false)
104 pDbHandle->bindText(pFileData, 2);
106 pDbHandle->bindText(pMsgInfo->msgText, 2);
109 if (pDbHandle->stepQuery() != MSG_ERR_DB_DONE) {
110 pDbHandle->finalizeQuery();
114 pDbHandle->finalizeQuery();
120 msg_error_t MsgStoSetReadStatus(MsgDbHandler *pDbHandle, msg_message_id_t msgId, bool bRead)
122 char sqlQuery[MAX_QUERY_LEN+1];
124 memset(sqlQuery, 0x00, sizeof(sqlQuery));
125 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET READ_STATUS = %d WHERE MSG_ID = %d;",
126 MSGFW_MESSAGE_TABLE_NAME, (int)bRead, msgId);
128 if (pDbHandle->execQuery(sqlQuery) != MSG_SUCCESS)
129 return MSG_ERR_DB_EXEC;
131 /* Get MAIN_TYPE, SUB_TYPE, STORAGE_ID */
132 memset(sqlQuery, 0x00, sizeof(sqlQuery));
133 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.MAIN_TYPE, A.SUB_TYPE, B.CONV_ID \
134 FROM %s A, %s B WHERE A.MSG_ID = %d AND A.CONV_ID = B.CONV_ID;",
135 MSGFW_MESSAGE_TABLE_NAME, MSGFW_CONVERSATION_TABLE_NAME, msgId);
137 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
138 return MSG_ERR_DB_PREPARE;
140 MSG_MESSAGE_TYPE_S msgType;
141 msg_thread_id_t convId;
143 if (pDbHandle->stepQuery() == MSG_ERR_DB_ROW) {
144 msgType.mainType = pDbHandle->columnInt(0);
145 msgType.subType = pDbHandle->columnInt(1);
146 convId = pDbHandle->columnInt(2);
148 pDbHandle->finalizeQuery();
149 return MSG_ERR_DB_STEP;
152 pDbHandle->finalizeQuery();
154 MSG_DEBUG("Main Type:[%d] SubType:[%d] ConvId:[%d]", msgType.mainType, msgType.subType, convId);
156 if (MsgStoUpdateConversation(pDbHandle, convId) != MSG_SUCCESS) {
157 MSG_DEBUG("MsgStoUpdateConversation() Error");
158 return MSG_ERR_STORAGE_ERROR;
165 msg_error_t MsgStoGetOldestMessage(MsgDbHandler *pDbHandle, const MSG_MESSAGE_INFO_S *pMsgInfo, msg_message_id_t *pMsgId)
167 char sqlQuery[MAX_QUERY_LEN+1];
169 memset(sqlQuery, 0x00, sizeof(sqlQuery));
171 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s \
172 WHERE SUB_TYPE = %d AND FOLDER_ID = %d AND STORAGE_ID = %d AND PROTECTED = 0 \
173 ORDER BY DISPLAY_TIME ASC",
174 MSGFW_MESSAGE_TABLE_NAME, pMsgInfo->msgType.subType, pMsgInfo->folderId, MSG_STORAGE_PHONE);
176 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
177 return MSG_ERR_DB_PREPARE;
179 if (pDbHandle->stepQuery() == MSG_ERR_DB_ROW) {
180 *pMsgId = pDbHandle->columnInt(0);
182 pDbHandle->finalizeQuery();
183 return MSG_ERR_DB_STEP;
186 pDbHandle->finalizeQuery();
192 msg_error_t MsgStoCheckMsgCntFull(MsgDbHandler *pDbHandle, const MSG_MESSAGE_TYPE_S* pMsgType, msg_folder_id_t folderId)
196 msg_error_t err = MSG_SUCCESS;
198 boost::system::error_code ec;
199 boost::filesystem::space_info si = boost::filesystem::space(TZ_SYS_HOME_PATH, ec);
202 MSG_ERR("Faile to get space info [%s]", ec.message().c_str());
203 return MSG_ERR_STORAGE_ERROR;
205 MSG_DEBUG("Free space of storage is [%llu] Bytes.", si.available);
207 if (si.available < SMS_MINIMUM_SPACE && pMsgType->mainType == MSG_SMS_TYPE)
208 err = MSG_ERR_MESSAGE_COUNT_FULL;
209 else if (si.available < MMS_MINIMUM_SPACE && pMsgType->mainType == MSG_MMS_TYPE)
210 err = MSG_ERR_MESSAGE_COUNT_FULL;
219 msg_error_t MsgStoCountMsgByLimitCategory(MsgDbHandler *pDbHandle, const MSG_MESSAGE_TYPE_S *pMsgType, int *pMsgCount, msg_folder_id_t folderId)
221 if (pMsgType == NULL) {
222 MSG_DEBUG("pMsgType is NULL");
223 return MSG_ERR_NULL_POINTER;
228 char sqlQuery[MAX_QUERY_LEN+1];
229 memset(sqlQuery, 0x00, sizeof(sqlQuery));
231 if ((pMsgType->mainType == MSG_SMS_TYPE) && (pMsgType->subType == MSG_WAP_SI_SMS ||pMsgType->subType == MSG_WAP_SL_SMS)) { /* PUSH */
232 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s WHERE MAIN_TYPE = %d AND SUB_TYPE IN (%d, %d) AND FOLDER_ID = %d;",
233 MSGFW_MESSAGE_TABLE_NAME, pMsgType->mainType, MSG_WAP_SI_SMS, MSG_WAP_SL_SMS, MSG_INBOX_ID);
234 } else if ((pMsgType->mainType == MSG_SMS_TYPE) && (pMsgType->subType == MSG_CB_SMS)) { /* CB */
235 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s WHERE MAIN_TYPE = %d AND SUB_TYPE IN (%d) AND FOLDER_ID = %d;",
236 MSGFW_MESSAGE_TABLE_NAME, pMsgType->mainType, MSG_CB_SMS, MSG_CBMSGBOX_ID);
237 } else if ((pMsgType->mainType == MSG_SMS_TYPE) && (pMsgType->subType == MSG_SYNCML_CP)) { /* Provision */
238 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s WHERE MAIN_TYPE = %d AND SUB_TYPE IN (%d) AND FOLDER_ID = %d;",
239 MSGFW_MESSAGE_TABLE_NAME, pMsgType->mainType, MSG_SYNCML_CP, MSG_INBOX_ID);
240 } else if ((pMsgType->mainType == MSG_SMS_TYPE)) { /* SMS */
241 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;",
242 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 */
243 } else if ((pMsgType->mainType == MSG_MMS_TYPE) &&
244 (pMsgType->subType == MSG_SENDREQ_MMS || pMsgType->subType == MSG_SENDCONF_MMS || pMsgType->subType == MSG_RETRIEVE_AUTOCONF_MMS ||
245 pMsgType->subType == MSG_RETRIEVE_MANUALCONF_MMS || pMsgType->subType == MSG_NOTIFICATIONIND_MMS)) { /* MMS */
246 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;",
247 MSGFW_MESSAGE_TABLE_NAME, pMsgType->mainType, MSG_SENDREQ_MMS, MSG_SENDCONF_MMS, MSG_RETRIEVE_AUTOCONF_MMS, MSG_RETRIEVE_MANUALCONF_MMS, MSG_NOTIFICATIONIND_MMS, folderId);
249 return MSG_ERR_INVALID_PARAMETER;
252 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
253 return MSG_ERR_DB_PREPARE;
255 if (pDbHandle->stepQuery() == MSG_ERR_DB_ROW) {
256 *pMsgCount = pDbHandle->columnInt(0);
258 pDbHandle->finalizeQuery();
259 return MSG_ERR_DB_STEP;
262 pDbHandle->finalizeQuery();
268 int MsgStoCheckMsgCntLimit(const MSG_MESSAGE_TYPE_S* pMsgType, msg_folder_id_t folderId)
275 msgboxType = MSG_COUNT_LIMIT_INBOX_TYPE;
279 msgboxType = MSG_COUNT_LIMIT_OUTBOX_TYPE;
282 case MSG_SENTBOX_ID :
283 msgboxType = MSG_COUNT_LIMIT_SENTBOX_TYPE;
287 msgboxType = MSG_COUNT_LIMIT_DRAFTBOX_TYPE;
290 case MSG_CBMSGBOX_ID :
291 msgboxType = MSG_COUNT_LIMIT_CBMSGBOX_TYPE;
295 MSG_DEBUG("Unknown mailbox Type [%d]", folderId);
299 switch (pMsgType->subType) {
301 case MSG_REPLACE_TYPE1_SMS:
302 case MSG_REPLACE_TYPE2_SMS:
303 case MSG_REPLACE_TYPE3_SMS:
304 case MSG_REPLACE_TYPE4_SMS:
305 case MSG_REPLACE_TYPE5_SMS:
306 case MSG_REPLACE_TYPE6_SMS:
307 case MSG_REPLACE_TYPE7_SMS:
308 case MSG_MWI_VOICE_SMS:
309 case MSG_MWI_FAX_SMS:
310 case MSG_MWI_EMAIL_SMS:
311 case MSG_MWI_OTHER_SMS:
312 case MSG_STATUS_REPORT_SMS:
313 msgType = MSG_COUNT_LIMIT_SMS_TYPE;
317 msgType = MSG_COUNT_LIMIT_CB_TYPE;
322 msgType = MSG_COUNT_LIMIT_WAPPUSH_TYPE;
326 msgType = MSG_COUNT_LIMIT_PROVISION_TYPE;
329 case MSG_SENDREQ_MMS:
330 case MSG_SENDCONF_MMS:
331 case MSG_NOTIFICATIONIND_MMS:
332 case MSG_RETRIEVE_AUTOCONF_MMS:
333 case MSG_RETRIEVE_MANUALCONF_MMS:
334 msgType = MSG_COUNT_LIMIT_MMS_TYPE;
338 MSG_DEBUG("Unknown Message Type [%d]", pMsgType->subType);
342 return msgCntLimit[msgboxType][msgType];
346 msg_error_t MsgStocheckMemoryStatus()
348 msg_error_t err = MSG_SUCCESS;
349 boost::system::error_code ec;
350 boost::filesystem::space_info si = boost::filesystem::space(TZ_SYS_HOME_PATH, ec);
353 MSG_ERR("Faile to get space info [%s]", ec.message().c_str());
354 return MSG_ERR_STORAGE_ERROR;
357 MSG_DEBUG("Free space of storage is [%llu] Bytes.", si.available);
359 if (si.available < SMS_MINIMUM_SPACE)
360 err = MSG_ERR_MESSAGE_COUNT_FULL;
362 MSG_DEBUG("Memory status =[%d]", err);
368 msg_error_t MsgStoAddAddress(MsgDbHandler *pDbHandle, const MSG_MESSAGE_INFO_S *pMsg, msg_thread_id_t *pConvId)
370 msg_error_t err = MSG_SUCCESS;
372 char sqlQuery[MAX_QUERY_LEN+1];
374 /* Check if new address or not */
375 if (MsgExistAddress(pDbHandle, pMsg, pConvId) == true) {
376 MSG_DEBUG("The address already exists. Conversation ID : [%d]", *pConvId);
377 MsgStoUpdateAddress(pDbHandle, pMsg, *pConvId);
382 *pConvId = pMsg->threadId;
384 /* conversation insert */
385 err = MsgStoAddConversation(pDbHandle, pConvId);
386 if (err != MSG_SUCCESS) {
387 MSG_DEBUG("MsgStoAddConversation() fail [%d]", err);
391 /* insert address in loop */
392 for (int i = 0; i < pMsg->nAddressCnt; i++) {
394 MSG_CONTACT_INFO_S contactInfo;
395 memset(&contactInfo, 0x00, sizeof(MSG_CONTACT_INFO_S));
397 /* Get Contact Info */
399 if (MsgGetContactInfo(&(pMsg->addressList[i]), &contactInfo) != MSG_SUCCESS) {
400 MSG_DEBUG("MsgGetContactInfo() fail.");
404 err = pDbHandle->getRowId(MSGFW_ADDRESS_TABLE_NAME, &addrId);
405 if (err != MSG_SUCCESS) {
406 MSG_DEBUG("pDbHandle->getRowId fail. [%d]", err);
411 memset(sqlQuery, 0x00, sizeof(sqlQuery));
412 snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, %d, %d, %d, '%s', %d, %d, ?, ?, ?, ?, ?, '%s', 0);",
413 MSGFW_ADDRESS_TABLE_NAME, addrId, *pConvId, pMsg->addressList[i].addressType, pMsg->addressList[i].recipientType, pMsg->addressList[i].addressVal,
414 contactInfo.contactId, contactInfo.addrbookId, contactInfo.imagePath);
416 MSG_SEC_DEBUG("Add Address Info. [%s]", sqlQuery);
418 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
419 return MSG_ERR_DB_PREPARE;
421 pDbHandle->bindText(contactInfo.firstName, 1);
422 pDbHandle->bindText(contactInfo.lastName, 2);
423 pDbHandle->bindText(contactInfo.middleName, 3);
424 pDbHandle->bindText(contactInfo.prefix, 4);
425 pDbHandle->bindText(contactInfo.suffix, 5);
427 if (pDbHandle->stepQuery() != MSG_ERR_DB_DONE) {
428 pDbHandle->finalizeQuery();
429 return MSG_ERR_DB_STEP;
432 pDbHandle->finalizeQuery();
436 /* set conversation display name by conv id */
437 MsgStoSetConversationDisplayName(pDbHandle, *pConvId);
442 msg_error_t MsgStoGetAddressByMsgId(MsgDbHandler *pDbHandle, msg_message_id_t msgId, int *nAddressCnt, MSG_ADDRESS_INFO_S **pAddress)
444 char sqlQuery[MAX_QUERY_LEN+1];
445 int rowCnt = 0, index = 0;
449 memset(sqlQuery, 0x00, sizeof(sqlQuery));
450 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT "
455 "WHERE A.CONV_ID = B.CONV_ID "
456 "AND B.MSG_ID = %d;",
457 MSGFW_ADDRESS_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME,
460 msg_error_t err = pDbHandle->getTable(sqlQuery, &rowCnt, &index);
462 if (err == MSG_ERR_DB_NORECORD) {
463 pDbHandle->freeTable();
465 } else if (err != MSG_SUCCESS) {
466 MSG_DEBUG("Fail to getTable().");
467 pDbHandle->freeTable();
471 *nAddressCnt = rowCnt;
473 MSG_DEBUG("*nAddressCnt [%d]", *nAddressCnt);
475 MSG_ADDRESS_INFO_S *tmpAddressList = (MSG_ADDRESS_INFO_S *)new char[sizeof(MSG_ADDRESS_INFO_S) * rowCnt];
476 memset(tmpAddressList, 0x00, sizeof(MSG_ADDRESS_INFO_S) * rowCnt);
477 *pAddress = tmpAddressList;
479 for (int i = 0; i < rowCnt; i++) {
480 tmpAddressList[i].addressType = pDbHandle->getColumnToInt(index++);
481 tmpAddressList[i].recipientType = pDbHandle->getColumnToInt(index++);
482 pDbHandle->getColumnToString(index++, MAX_ADDRESS_VAL_LEN, tmpAddressList[i].addressVal);
484 strncpy(tmpAddressList[i].displayName, tmpAddressList[i].addressVal, MAX_DISPLAY_NAME_LEN);
486 pDbHandle->freeTable();
491 msg_error_t MsgStoGetAddressByMsgId(MsgDbHandler *pDbHandle, msg_message_id_t msgId, msg_struct_list_s *pAddress)
493 char sqlQuery[MAX_QUERY_LEN+1];
495 int rowCnt = 0, index = 0;
497 pAddress->nCount = 0;
498 pAddress->msg_struct_info = NULL;
500 msg_struct_s *pTmp = NULL;
501 MSG_ADDRESS_INFO_S *pAddr = NULL;
503 pAddress->msg_struct_info = (msg_struct_t *)calloc(MAX_TO_ADDRESS_CNT, sizeof(msg_struct_t));
504 if (pAddress->msg_struct_info == NULL)
505 return MSG_ERR_MEMORY_ERROR;
507 for (int i = 0; i < MAX_TO_ADDRESS_CNT; i++) {
508 pAddress->msg_struct_info[i] = (msg_struct_t)new msg_struct_s;
509 pTmp = (msg_struct_s *)pAddress->msg_struct_info[i];
510 pTmp->type = MSG_STRUCT_ADDRESS_INFO;
511 pTmp->data = new MSG_ADDRESS_INFO_S;
512 memset(pTmp->data, 0x00, sizeof(MSG_ADDRESS_INFO_S));
515 memset(sqlQuery, 0x00, sizeof(sqlQuery));
516 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT "
521 "WHERE A.CONV_ID = B.CONV_ID "
522 "AND B.MSG_ID = %d;",
523 MSGFW_ADDRESS_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME,
526 msg_error_t err = pDbHandle->getTable(sqlQuery, &rowCnt, &index);
528 if (err == MSG_ERR_DB_NORECORD) {
529 pDbHandle->freeTable();
531 } else if (err != MSG_SUCCESS) {
532 MSG_DEBUG("Fail to getTable().");
533 pDbHandle->freeTable();
537 rowCnt = (rowCnt > 10)? MAX_TO_ADDRESS_CNT: rowCnt;
538 pAddress->nCount = rowCnt;
540 for (int i = 0; i < rowCnt; i++) {
541 pTmp = (msg_struct_s *)pAddress->msg_struct_info[i];
542 pAddr = (MSG_ADDRESS_INFO_S *)pTmp->data;
544 pAddr->addressType = pDbHandle->getColumnToInt(index++);
545 pAddr->recipientType = pDbHandle->getColumnToInt(index++);
547 pDbHandle->getColumnToString(index++, MAX_ADDRESS_VAL_LEN, pAddr->addressVal);
549 strncpy(pAddr->displayName, pAddr->addressVal, MAX_DISPLAY_NAME_LEN);
552 pDbHandle->freeTable();
558 msg_error_t MsgStoGetAddressByConvId(MsgDbHandler *pDbHandle, msg_thread_id_t convId, msg_struct_list_s *pAddrlist)
560 char sqlQuery[MAX_QUERY_LEN+1];
562 int rowCnt = 0, index = 0;
564 pAddrlist->nCount = 0;
565 pAddrlist->msg_struct_info = NULL;
567 memset(sqlQuery, 0x00, sizeof(sqlQuery));
568 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT "
572 "FROM %s WHERE CONV_ID = %d;",
573 MSGFW_ADDRESS_TABLE_NAME, convId);
575 msg_error_t err = pDbHandle->getTable(sqlQuery, &rowCnt, &index);
577 if (err == MSG_ERR_DB_NORECORD) {
578 pDbHandle->freeTable();
580 } else if (err != MSG_SUCCESS) {
581 MSG_DEBUG("Fail to getTable().");
582 pDbHandle->freeTable();
586 pAddrlist->nCount = rowCnt;
588 MSG_DEBUG("pAddrlist->nCount [%d]", pAddrlist->nCount);
590 msg_struct_s *pTmp = NULL;
591 MSG_ADDRESS_INFO_S *pAddr = NULL;
593 pAddrlist->msg_struct_info = (msg_struct_t *)calloc(rowCnt, sizeof(msg_struct_t));
595 for (int i = 0; i < rowCnt; i++) {
596 pAddrlist->msg_struct_info[i] = (msg_struct_t)new msg_struct_s;
597 pTmp = (msg_struct_s *)pAddrlist->msg_struct_info[i];
598 pTmp->type = MSG_STRUCT_ADDRESS_INFO;
599 pTmp->data = new MSG_ADDRESS_INFO_S;
600 memset(pTmp->data, 0x00, sizeof(MSG_ADDRESS_INFO_S));
603 /* rowCnt = (rowCnt > 10)? MAX_TO_ADDRESS_CNT: rowCnt; */
605 for (int i = 0; i < rowCnt; i++) {
606 pTmp = (msg_struct_s *)pAddrlist->msg_struct_info[i];
607 pAddr = (MSG_ADDRESS_INFO_S *)pTmp->data;
609 pAddr->addressType = pDbHandle->getColumnToInt(index++);
610 pAddr->recipientType = pDbHandle->getColumnToInt(index++);
611 pDbHandle->getColumnToString(index++, MAX_ADDRESS_VAL_LEN, pAddr->addressVal);
613 strncpy(pAddr->displayName, pAddr->addressVal, MAX_DISPLAY_NAME_LEN);
615 pDbHandle->freeTable();
620 /* Have to use trigger for this function. */
621 msg_error_t MsgStoUpdateConversation(MsgDbHandler *pDbHandle, msg_thread_id_t convId)
625 char sqlQuery[MAX_QUERY_LEN];
626 unsigned int tmpSize = 0;
628 #ifdef MSG_NOTI_INTEGRATION
629 memset(sqlQuery, 0x00, MAX_QUERY_LEN);
630 snprintf(sqlQuery, sizeof(sqlQuery),
633 "WHERE CONV_ID = %d "
634 "AND FOLDER_ID > %d AND FOLDER_ID < %d "
635 "AND STORAGE_ID = %d;",
636 MSGFW_MESSAGE_TABLE_NAME,
638 MSG_ALLBOX_ID, MSG_SPAMBOX_ID,
641 memset(sqlQuery, 0x00, MAX_QUERY_LEN);
642 snprintf(sqlQuery, sizeof(sqlQuery),
645 "WHERE CONV_ID = %d "
646 "AND FOLDER_ID > %d AND FOLDER_ID < %d "
647 "AND STORAGE_ID = %d;",
648 MSGFW_MESSAGE_TABLE_NAME,
650 MSG_ALLBOX_ID, MSG_CBMSGBOX_ID,
654 msg_error_t err = pDbHandle->prepareQuery(sqlQuery);
655 if (err != MSG_SUCCESS) {
656 MSG_DEBUG("Fail to prepareQuery().");
657 pDbHandle->finalizeQuery();
661 if (pDbHandle->stepQuery() == MSG_ERR_DB_ROW) {
662 pDbHandle->finalizeQuery();
664 memset(sqlQuery, 0x00, MAX_QUERY_LEN);
665 snprintf(sqlQuery, sizeof(sqlQuery),
666 "SELECT MAIN_TYPE, SUB_TYPE, MSG_DIRECTION, DISPLAY_TIME, LENGTH(SUBJECT), SUBJECT, MSG_TEXT "
668 "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;",
669 MSGFW_MESSAGE_TABLE_NAME,
670 convId, MSG_ALLBOX_ID, MSG_SPAMBOX_ID, MSG_STORAGE_PHONE);
672 err = pDbHandle->prepareQuery(sqlQuery);
673 if (err != MSG_SUCCESS) {
674 MSG_DEBUG("Fail to prepareQuery().");
678 err = pDbHandle->stepQuery();
679 if (err != MSG_ERR_DB_ROW) {
680 MSG_DEBUG("Fail to stepQuery().");
681 pDbHandle->finalizeQuery();
685 int main_type = pDbHandle->columnInt(0);
686 int sub_type = pDbHandle->columnInt(1);
687 int msg_direction = pDbHandle->columnInt(2);
688 time_t disp_time = (time_t)pDbHandle->columnInt(3);
689 int subject_length = pDbHandle->columnInt(4);
690 char subject[MAX_SUBJECT_LEN+1] = {0, };
691 snprintf(subject, sizeof(subject), "%s", pDbHandle->columnText(5));
692 char msg_text[MAX_MSG_TEXT_LEN+1] = {0, };
693 snprintf(msg_text, sizeof(msg_text), "%s", pDbHandle->columnText(6));
695 pDbHandle->finalizeQuery();
696 memset(sqlQuery, 0x00, MAX_QUERY_LEN);
697 snprintf(sqlQuery, sizeof(sqlQuery),
699 MSGFW_CONVERSATION_TABLE_NAME);
701 tmpSize = strlen(sqlQuery);
702 #ifdef MSG_NOTI_INTEGRATION
703 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
704 "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), ",
705 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_INBOX_ID, MSG_CBMSGBOX_ID, MSG_STORAGE_PHONE);
707 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
708 "UNREAD_CNT = (SELECT COUNT(MSG_ID) FROM %s WHERE CONV_ID = %d AND FOLDER_ID = %d AND STORAGE_ID = %d AND READ_STATUS = 0), ",
709 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_INBOX_ID, MSG_STORAGE_PHONE);
712 tmpSize = strlen(sqlQuery);
713 #ifdef MSG_NOTI_INTEGRATION
714 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
715 "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), ",
716 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_SMS_TYPE, MSG_ALLBOX_ID, MSG_SPAMBOX_ID, MSG_STORAGE_PHONE);
718 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
719 "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), ",
720 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_SMS_TYPE, MSG_ALLBOX_ID, MSG_CBMSGBOX_ID, MSG_STORAGE_PHONE);
723 tmpSize = strlen(sqlQuery);
724 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
725 "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), ",
726 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);
729 tmpSize = strlen(sqlQuery);
730 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
731 "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), ",
732 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_ALLBOX_ID, MSG_SPAMBOX_ID, MSG_STORAGE_PHONE);
734 tmpSize = strlen(sqlQuery);
735 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
736 "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), ",
737 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_ALLBOX_ID, MSG_SPAMBOX_ID, MSG_STORAGE_PHONE);
739 tmpSize = strlen(sqlQuery);
740 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
741 "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), ",
742 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_ALLBOX_ID, MSG_SPAMBOX_ID, MSG_STORAGE_PHONE);
744 tmpSize = strlen(sqlQuery);
746 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
747 "DISPLAY_TIME = CASE "
748 "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 "
749 "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) "
752 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_ALLBOX_ID, MSG_SPAMBOX_ID, MSG_STORAGE_PHONE,
753 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_ALLBOX_ID, MSG_SPAMBOX_ID, MSG_STORAGE_PHONE);
755 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
756 "DISPLAY_TIME = CASE "
757 "WHEN (SELECT COUNT(MSG_ID) FROM %s WHERE CONV_ID = %d AND FOLDER_ID = %d AND STORAGE_ID = %d AND READ_STATUS = 0) > 0 "
758 "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) "
759 "WHEN (SELECT COUNT(MSG_ID) FROM %s WHERE CONV_ID = %d AND FOLDER_ID = %d AND STORAGE_ID = %d) > 0 "
760 "THEN (SELECT DISPLAY_TIME FROM %s WHERE CONV_ID = %d AND FOLDER_ID = %d AND STORAGE_ID = %d ORDER BY DISPLAY_TIME DESC) "
761 "WHEN (SELECT COUNT(MSG_ID) FROM %s WHERE CONV_ID = %d AND FOLDER_ID = %d AND STORAGE_ID = %d AND NETWORK_STATUS = %d) > 0 "
762 "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) "
763 "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) "
765 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_INBOX_ID, MSG_STORAGE_PHONE,
766 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_INBOX_ID, MSG_STORAGE_PHONE,
767 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_DRAFT_ID, MSG_STORAGE_PHONE,
768 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_DRAFT_ID, MSG_STORAGE_PHONE,
769 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_OUTBOX_ID, MSG_STORAGE_PHONE, MSG_NETWORK_SEND_FAIL,
770 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_OUTBOX_ID, MSG_STORAGE_PHONE, MSG_NETWORK_SEND_FAIL,
771 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_ALLBOX_ID, MSG_SPAMBOX_ID, MSG_STORAGE_PHONE);
775 tmpSize = strlen(sqlQuery);
776 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
778 "WHEN %d > 0 THEN ? ELSE ? "
782 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
784 "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 "
786 "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 "
787 "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) "
788 "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) "
791 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_ALLBOX_ID, MSG_SPAMBOX_ID, MSG_STORAGE_PHONE,
792 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_ALLBOX_ID, MSG_SPAMBOX_ID, MSG_STORAGE_PHONE,
793 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_ALLBOX_ID, MSG_SPAMBOX_ID, MSG_STORAGE_PHONE,
794 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_ALLBOX_ID, MSG_SPAMBOX_ID, MSG_STORAGE_PHONE);
796 tmpSize = strlen(sqlQuery);
797 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
798 "MAIN_TYPE = %d, SUB_TYPE = %d, MSG_DIRECTION = %d, DISPLAY_TIME = %lu ",
799 main_type, sub_type, msg_direction, disp_time);
801 tmpSize = strlen(sqlQuery);
802 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
803 "WHERE CONV_ID = %d;",
805 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
806 MSG_DEBUG("Query Failed [%s]", sqlQuery);
807 return MSG_ERR_DB_PREPARE;
810 pDbHandle->bindText(subject, 1);
811 pDbHandle->bindText(msg_text, 2);
813 if (pDbHandle->stepQuery() != MSG_ERR_DB_DONE) {
814 MSG_DEBUG("stepQuery() Failed");
815 pDbHandle->finalizeQuery();
816 return MSG_ERR_DB_STEP;
819 pDbHandle->finalizeQuery();
821 pDbHandle->finalizeQuery();
823 memset(sqlQuery, 0x00, MAX_QUERY_LEN);
824 snprintf(sqlQuery, sizeof(sqlQuery),
825 "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 = '' "
826 "WHERE CONV_ID = %d;",
827 MSGFW_CONVERSATION_TABLE_NAME, convId);
829 if (pDbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
830 MSG_DEBUG("Query Failed [%s]", sqlQuery);
831 return MSG_ERR_DB_EXEC;
841 /* consider to replcae this function to trigger. */
842 msg_error_t MsgStoClearConversationTable(MsgDbHandler *pDbHandle)
844 msg_error_t err = MSG_SUCCESS;
846 char sqlQuery[MAX_QUERY_LEN+1];
848 memset(sqlQuery, 0x00, sizeof(sqlQuery));
850 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s \
851 WHERE CONV_ID NOT IN (SELECT CONV_ID FROM %s) AND CONV_ID <> 0;",
852 MSGFW_CONVERSATION_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME);
854 err = pDbHandle->execQuery(sqlQuery);
856 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE CONV_ID NOT IN (SELECT CONV_ID FROM %s);",
857 MSGFW_ADDRESS_TABLE_NAME, MSGFW_CONVERSATION_TABLE_NAME);
859 err = pDbHandle->execQuery(sqlQuery);
865 msg_thread_id_t MsgGetThreadId(MsgDbHandler *pDbHandle, msg_message_id_t msgId)
867 msg_thread_id_t conv_id = 0;
869 char sqlQuery[MAX_QUERY_LEN+1];
870 memset(sqlQuery, 0x00, sizeof(sqlQuery));
871 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT CONV_ID FROM %s WHERE MSG_ID = %d;",
872 MSGFW_MESSAGE_TABLE_NAME, msgId);
874 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
877 if (pDbHandle->stepQuery() == MSG_ERR_DB_ROW) {
878 conv_id = pDbHandle->columnInt(0);
881 pDbHandle->finalizeQuery();
886 /* Change the function name to conversation related. */
887 bool MsgExistAddress(MsgDbHandler *pDbHandle, const MSG_MESSAGE_INFO_S *pMsg, msg_thread_id_t *pConvId)
889 msg_error_t err = MSG_SUCCESS;
891 char sqlQuery[MAX_QUERY_LEN+1];
892 unsigned int tmpSize = 0;
896 memset(sqlQuery, 0x00, sizeof(sqlQuery));
897 snprintf(sqlQuery, sizeof(sqlQuery),
898 "SELECT CONV_ID FROM ( SELECT CONV_ID FROM %s WHERE ( ",
899 MSGFW_ADDRESS_TABLE_NAME);
901 for (int i = 0; i < pMsg->nAddressCnt; i++) {
902 if (strlen(pMsg->addressList[i].addressVal) >= (unsigned int)MsgContactGetMinMatchDigit()
903 && pMsg->addressList[i].addressType != MSG_ADDRESS_TYPE_EMAIL
904 && MsgIsNumber(pMsg->addressList[i].addressVal)) {
905 int addrSize = strlen(pMsg->addressList[i].addressVal);
906 char newPhoneNum[addrSize+1];
907 memset(newPhoneNum, 0x00, sizeof(newPhoneNum));
908 MsgConvertNumber(pMsg->addressList[i].addressVal, newPhoneNum, addrSize);
910 tmpSize = strlen(sqlQuery);
911 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
912 "ADDRESS_VAL LIKE '%%%%%s' ",
915 if ((pMsg->nAddressCnt-1) == i) break;
917 tmpSize = strlen(sqlQuery);
918 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize, " OR ");
921 tmpSize = strlen(sqlQuery);
922 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
923 "ADDRESS_VAL LIKE '%s' ",
924 pMsg->addressList[i].addressVal);
926 if ((pMsg->nAddressCnt-1) == i) break;
928 tmpSize = strlen(sqlQuery);
929 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize, " OR ");
933 tmpSize = strlen(sqlQuery);
934 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
935 ") AND CONV_ID IN (SELECT CONV_ID FROM %s GROUP BY CONV_ID HAVING COUNT(CONV_ID)=%d) ",
936 MSGFW_ADDRESS_TABLE_NAME, pMsg->nAddressCnt);
939 tmpSize = strlen(sqlQuery);
940 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
941 ") GROUP BY CONV_ID HAVING COUNT(CONV_ID)=%d;",
947 err = pDbHandle->getTable(sqlQuery, &rowCnt, NULL);
949 /* No record or other error */
950 if (err != MSG_SUCCESS) {
951 MSG_DEBUG("Fail to getTable().");
952 pDbHandle->freeTable();
956 convId = pDbHandle->getColumnToInt(1);
959 MSG_DEBUG("Success to get convId [%d]", convId);
961 pDbHandle->freeTable();
965 pDbHandle->freeTable();
971 int MsgStoGetUnreadCnt(MsgDbHandler *pDbHandle, MSG_MAIN_TYPE_T msgType)
975 char sqlQuery[MAX_QUERY_LEN+1];
977 memset(sqlQuery, 0x00, sizeof(sqlQuery));
979 if (msgType == MSG_SMS_TYPE) {
980 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s "
981 "WHERE MAIN_TYPE = %d "
982 "AND (SUB_TYPE IN (%d, %d, %d, %d, %d, %d, %d) OR (SUB_TYPE >= %d AND SUB_TYPE <= %d)) "
983 "AND FOLDER_ID = %d AND READ_STATUS = 0 AND STORAGE_ID = %d;",
984 MSGFW_MESSAGE_TABLE_NAME,
986 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,
987 MSG_REPLACE_TYPE1_SMS, MSG_REPLACE_TYPE7_SMS,
988 MSG_INBOX_ID, MSG_STORAGE_PHONE);
989 } else if (msgType == MSG_MMS_TYPE) {
990 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s "
991 "WHERE MAIN_TYPE = %d AND SUB_TYPE IN (%d, %d, %d) "
992 "AND FOLDER_ID = %d AND READ_STATUS = 0 AND STORAGE_ID = %d;",
993 MSGFW_MESSAGE_TABLE_NAME,
995 MSG_RETRIEVE_AUTOCONF_MMS, MSG_RETRIEVE_MANUALCONF_MMS, MSG_NOTIFICATIONIND_MMS,
996 MSG_INBOX_ID, MSG_STORAGE_PHONE);
999 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
1002 if (pDbHandle->stepQuery() == MSG_ERR_DB_ROW) {
1003 msgCnt = pDbHandle->columnInt(0);
1005 pDbHandle->finalizeQuery();
1009 pDbHandle->finalizeQuery();
1015 msg_error_t MsgStoGetMmsRawFilePath(MsgDbHandler *pDbHandle, msg_message_id_t msgId, char *pFilePath)
1017 char sqlQuery[MAX_QUERY_LEN+1];
1019 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1021 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.FILE_PATH FROM %s A, %s B \
1022 WHERE A.MSG_ID = B.MSG_ID AND B.MSG_ID = %d;",
1023 MMS_PLUGIN_MESSAGE_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME, msgId);
1025 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
1026 return MSG_ERR_DB_PREPARE;
1028 if (pDbHandle->stepQuery() == MSG_ERR_DB_ROW) {
1029 if (pDbHandle->columnText(0) != NULL)
1030 strncpy(pFilePath, (char*)pDbHandle->columnText(0), MSG_FILEPATH_LEN_MAX);
1032 pDbHandle->finalizeQuery();
1033 return MSG_ERR_DB_STEP;
1036 pDbHandle->finalizeQuery();
1042 bool MsgStoCheckReadReportRequested(MsgDbHandler *pDbHandle, msg_message_id_t msgId)
1044 msg_error_t err = MSG_SUCCESS;
1046 char sqlQuery[MAX_QUERY_LEN+1];
1048 bool bReadReportRequested = false;
1050 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1052 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.ASK_READ_REPLY FROM %s A, %s B \
1053 WHERE A.MSG_ID = B.MSG_ID AND B.MSG_ID = %d;",
1054 MMS_PLUGIN_MESSAGE_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME, msgId);
1056 err = pDbHandle->getTable(sqlQuery, &rowCnt, NULL);
1058 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
1059 pDbHandle->freeTable();
1060 MSG_DEBUG("[Error]Failed to Get Table");
1061 return bReadReportRequested;
1065 pDbHandle->freeTable();
1066 MSG_DEBUG("[Error]MSG_ERR_DB_NORECORD");
1067 return bReadReportRequested;
1070 bReadReportRequested = pDbHandle->getColumnToInt(1);
1072 pDbHandle->freeTable();
1074 return bReadReportRequested;
1078 bool MsgStoCheckReadReportIsSent(MsgDbHandler *pDbHandle, msg_message_id_t msgId)
1080 msg_error_t err = MSG_SUCCESS;
1082 char sqlQuery[MAX_QUERY_LEN+1];
1085 bool bReadReportIsSent = true;
1087 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1089 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.READ_REPORT_SENT FROM %s A, %s B \
1090 WHERE A.MSG_ID = B.MSG_ID AND B.MSG_ID = %d;",
1091 MMS_PLUGIN_MESSAGE_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME, msgId);
1093 err = pDbHandle->getTable(sqlQuery, &rowCnt, NULL);
1095 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
1096 pDbHandle->freeTable();
1097 MSG_DEBUG("[Error]Failed to Get Table");
1098 return bReadReportIsSent;
1102 pDbHandle->freeTable();
1103 MSG_DEBUG("[Error]MSG_ERR_DB_NORECORD");
1104 return bReadReportIsSent;
1107 bReadReportIsSent = (bool)pDbHandle->getColumnToInt(1);
1109 pDbHandle->freeTable();
1111 return bReadReportIsSent;
1115 msg_error_t MsgStoAddConversation(MsgDbHandler *pDbHandle, msg_thread_id_t *pConvId)
1117 char sqlQuery[MAX_QUERY_LEN+1];
1120 if (pDbHandle->getRowId(MSGFW_CONVERSATION_TABLE_NAME, pConvId) != MSG_SUCCESS) {
1121 return MSG_ERR_DB_EXEC;
1124 /* Add Conversation */
1125 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1126 snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, 0, 0, 0, 0, 0, 0, 0, '', '');",
1127 MSGFW_CONVERSATION_TABLE_NAME, *pConvId);
1129 if (pDbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
1130 MSG_DEBUG("Query Failed. [%s]", sqlQuery);
1131 return MSG_ERR_DB_EXEC;
1138 msg_error_t MsgStoSetConversationDisplayName(MsgDbHandler *pDbHandle, int contactId)
1140 msg_error_t err = MSG_SUCCESS;
1142 char displayName[MAX_DISPLAY_NAME_LEN+1];
1143 char sqlQuery[MAX_QUERY_LEN+1];
1145 MSG_DEBUG("contactId [%d]", contactId);
1147 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1148 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT DISTINCT(CONV_ID) FROM %s WHERE CONTACT_ID = %d;",
1149 MSGFW_ADDRESS_TABLE_NAME, contactId);
1151 err = pDbHandle->getTable(sqlQuery, &rowCnt, NULL);
1153 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
1154 pDbHandle->freeTable();
1155 MSG_DEBUG("Fail to getTable().");
1159 msg_struct_s *pAddrInfo = NULL;
1160 MSG_ADDRESS_INFO_S *address = NULL;
1162 for (int i = 1; i <= rowCnt; i++) {
1163 memset(displayName, 0x00, sizeof(displayName));
1164 MsgDbHandler tmpDbHandle;
1165 msg_struct_list_s addressList = {0, };
1166 MsgStoGetAddressByConvId(&tmpDbHandle, (msg_thread_id_t)pDbHandle->getColumnToInt(i), &addressList);
1168 for (int j = 0; j < addressList.nCount; j++) {
1170 strncat(displayName, ", ", MAX_DISPLAY_NAME_LEN-strlen(displayName));
1172 pAddrInfo = (msg_struct_s *)addressList.msg_struct_info[j];
1173 address = (MSG_ADDRESS_INFO_S *)pAddrInfo->data;
1175 if (address->displayName[0] == '\0')
1176 strncat(displayName, address->addressVal, MAX_DISPLAY_NAME_LEN-strlen(displayName));
1178 strncat(displayName, address->displayName, MAX_DISPLAY_NAME_LEN-strlen(displayName));
1181 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1182 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET DISPLAY_NAME = ? WHERE CONV_ID = %d;",
1183 MSGFW_CONVERSATION_TABLE_NAME, pDbHandle->getColumnToInt(i));
1185 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
1186 pDbHandle->freeTable();
1187 MSG_DEBUG("Query Failed [%s]", sqlQuery);
1188 return MSG_ERR_DB_PREPARE;
1191 pDbHandle->bindText(displayName, 1);
1193 if (pDbHandle->stepQuery() != MSG_ERR_DB_DONE) {
1194 pDbHandle->freeTable();
1195 pDbHandle->finalizeQuery();
1196 MSG_SEC_DEBUG("Update Conversation disply name. Fail [%s]", sqlQuery);
1197 return MSG_ERR_DB_STEP;
1200 pDbHandle->finalizeQuery();
1202 /* free address list */
1203 for (int j = 0; j < addressList.nCount; j++) {
1204 msg_struct_s *pStruct = (msg_struct_s *)addressList.msg_struct_info[j];
1205 delete (MSG_ADDRESS_INFO_S *)pStruct->data;
1206 delete (msg_struct_s *)pStruct;
1209 if (addressList.msg_struct_info != NULL) {
1210 g_free((msg_struct_t *)addressList.msg_struct_info);
1214 pDbHandle->freeTable();
1220 msg_error_t MsgStoSetConversationDisplayName(MsgDbHandler *pDbHandle, msg_thread_id_t convId)
1222 msg_error_t err = MSG_SUCCESS;
1224 char displayName[MAX_DISPLAY_NAME_LEN+1];
1225 char sqlQuery[MAX_QUERY_LEN+1];
1227 msg_struct_list_s addressList = {0, };
1229 msg_struct_s *pAddrInfo = NULL;
1230 MSG_ADDRESS_INFO_S *address = NULL;
1232 memset(displayName, 0x00, sizeof(displayName));
1234 MsgStoGetAddressByConvId(pDbHandle, convId, &addressList);
1236 for (int j = 0; j < addressList.nCount; j++) {
1238 strncat(displayName, ", ", MAX_DISPLAY_NAME_LEN-strlen(displayName));
1240 pAddrInfo = (msg_struct_s *)addressList.msg_struct_info[j];
1241 address = (MSG_ADDRESS_INFO_S *)pAddrInfo->data;
1243 if (address->displayName[0] == '\0')
1244 strncat(displayName, address->addressVal, MAX_DISPLAY_NAME_LEN-strlen(displayName));
1246 strncat(displayName, address->displayName, MAX_DISPLAY_NAME_LEN-strlen(displayName));
1249 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1250 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET DISPLAY_NAME = ? WHERE CONV_ID = %d;",
1251 MSGFW_CONVERSATION_TABLE_NAME, convId);
1253 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
1254 MSG_DEBUG("Query Failed [%s]", sqlQuery);
1255 return MSG_ERR_DB_PREPARE;
1258 pDbHandle->bindText(displayName, 1);
1260 if (pDbHandle->stepQuery() != MSG_ERR_DB_DONE) {
1261 pDbHandle->finalizeQuery();
1262 MSG_SEC_DEBUG("Update Conversation disply name. Fail [%s]", sqlQuery);
1263 return MSG_ERR_DB_STEP;
1266 pDbHandle->finalizeQuery();
1268 for (int j = 0; j < addressList.nCount; j++) {
1269 msg_struct_s *pStruct = (msg_struct_s *)addressList.msg_struct_info[j];
1270 delete (MSG_ADDRESS_INFO_S *)pStruct->data;
1271 delete (msg_struct_s *)pStruct;
1274 if (addressList.msg_struct_info != NULL) {
1275 g_free((msg_struct_t *)addressList.msg_struct_info);
1281 msg_error_t MsgStoUpdateNetworkStatus(MsgDbHandler *pDbHandle, MSG_MESSAGE_INFO_S *pMsgInfo, msg_network_status_t status)
1283 msg_error_t err = MSG_SUCCESS;
1285 char sqlQuery[MAX_QUERY_LEN+1];
1287 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1289 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET NETWORK_STATUS = %d WHERE MSG_ID = %d;",
1290 MSGFW_MESSAGE_TABLE_NAME, status, pMsgInfo->msgId);
1292 if (pDbHandle->execQuery(sqlQuery) != MSG_SUCCESS)
1293 err = MSG_ERR_DB_EXEC;
1295 pDbHandle->finalizeQuery();
1300 bool MsgExistConversation(MsgDbHandler *pDbHandle, msg_thread_id_t convId)
1302 msg_error_t err = MSG_SUCCESS;
1304 char sqlQuery[MAX_QUERY_LEN+1];
1308 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1310 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT CONV_ID FROM %s WHERE CONV_ID = %d;",
1311 MSGFW_CONVERSATION_TABLE_NAME, convId);
1313 err = pDbHandle->getTable(sqlQuery, &rowCnt, NULL);
1315 if (err == MSG_ERR_DB_NORECORD) {
1316 pDbHandle->freeTable();
1318 } else if (err != MSG_SUCCESS) {
1319 pDbHandle->freeTable();
1322 pDbHandle->freeTable();
1327 bool MsgExistMessage(MsgDbHandler *pDbHandle, MSG_MESSAGE_INFO_S *pMsg)
1329 msg_error_t err = MSG_SUCCESS;
1331 char sqlQuery[MAX_QUERY_LEN+1];
1336 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1338 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s WHERE CONV_ID = %ud AND DISPLAY_TIME = %ud;",
1339 MSGFW_MESSAGE_TABLE_NAME, pMsg->threadId, (int)pMsg->displayTime);
1341 err = pDbHandle->getTable(sqlQuery, &rowCnt, NULL);
1344 if (err != MSG_SUCCESS) {
1345 pDbHandle->freeTable();
1350 pMsg->msgId = pDbHandle->getColumnToInt(1);
1352 pDbHandle->freeTable();
1358 bool MsgExistAddress(MsgDbHandler *pDbHandle, MSG_MESSAGE_INFO_S *pMsg, msg_thread_id_t convId, int index)
1360 msg_error_t err = MSG_SUCCESS;
1362 char sqlQuery[MAX_QUERY_LEN+1];
1367 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1369 if (strlen(pMsg->addressList[index].addressVal) > (unsigned int)MsgContactGetMinMatchDigit()) {
1370 int addrSize = strlen(pMsg->addressList[index].addressVal);
1371 char newPhoneNum[addrSize+1];
1372 memset(newPhoneNum, 0x00, sizeof(newPhoneNum));
1373 MsgConvertNumber(pMsg->addressList[index].addressVal, newPhoneNum, addrSize);
1375 snprintf(sqlQuery, sizeof(sqlQuery),
1376 "SELECT ADDRESS_ID FROM %s WHERE ADDRESS_VAL LIKE '%%%%%s' AND CONV_ID= %d;",
1377 MSGFW_ADDRESS_TABLE_NAME, newPhoneNum, convId);
1379 snprintf(sqlQuery, sizeof(sqlQuery),
1380 "SELECT ADDRESS_ID FROM %s WHERE ADDRESS_VAL = '%s' AND CONV_ID= %d;",
1381 MSGFW_ADDRESS_TABLE_NAME, pMsg->addressList[index].addressVal, convId);
1384 err = pDbHandle->getTable(sqlQuery, &rowCnt, NULL);
1386 if (err == MSG_ERR_DB_NORECORD) {
1387 pDbHandle->freeTable();
1390 else if (err != MSG_SUCCESS) {
1391 pDbHandle->freeTable();
1394 pDbHandle->freeTable();
1400 void MsgStoUpdateAddress(MsgDbHandler *pDbHandle, const MSG_MESSAGE_INFO_S *pMsg, msg_thread_id_t convId)
1403 msg_error_t err = MSG_SUCCESS;
1405 char sqlQuery[MAX_QUERY_LEN+1];
1407 for (int i = 0; i < pMsg->nAddressCnt; i++) {
1408 if (strlen(pMsg->addressList[i].addressVal) > (unsigned int)MsgContactGetMinMatchDigit() && pMsg->addressList[i].addressType == MSG_ADDRESS_TYPE_PLMN) {
1409 int addrSize = strlen(pMsg->addressList[i].addressVal);
1410 char newPhoneNum[addrSize+1];
1411 memset(newPhoneNum, 0x00, sizeof(newPhoneNum));
1412 MsgConvertNumber(pMsg->addressList[i].addressVal, newPhoneNum, addrSize);
1414 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1415 snprintf(sqlQuery, sizeof(sqlQuery),
1417 "ADDRESS_VAL = '%s', "
1418 "ADDRESS_TYPE = %d, "
1419 "RECIPIENT_TYPE = %d "
1420 "WHERE CONV_ID = %d "
1421 "AND ADDRESS_VAL LIKE '%%%%%s';",
1422 MSGFW_ADDRESS_TABLE_NAME, pMsg->addressList[i].addressVal,
1423 pMsg->addressList[i].addressType, pMsg->addressList[i].recipientType, convId, newPhoneNum);
1425 err = pDbHandle->execQuery(sqlQuery);
1426 if (err != MSG_SUCCESS) MSG_DEBUG("Fail to execQuery(). [%s]", sqlQuery);
1428 pDbHandle->finalizeQuery();
1435 msg_error_t MsgStoAddCBChannelInfo(MsgDbHandler *pDbHandle, MSG_CB_CHANNEL_S *pCBChannel, msg_sim_slot_id_t simIndex)
1437 #ifndef FEATURE_SMS_CDMA
1440 char sqlQuery[MAX_QUERY_LEN] = {0, };
1442 pDbHandle->beginTrans();
1444 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1445 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE SIM_INDEX = %d;", MSGFW_CB_CHANNEL_INFO_TABLE_NAME, simIndex);
1447 if (pDbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
1448 pDbHandle->endTrans(false);
1449 return MSG_ERR_DB_EXEC;
1452 for (int i = 0; i < pCBChannel->channelCnt; i++) {
1454 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1455 snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s(CHANNEL_ACTIVATION, CHANNEL_FROM, CHANNEL_TO, CHANNEL_NAME, SIM_INDEX) VALUES (?, ?, ?, ?, ?);",
1456 MSGFW_CB_CHANNEL_INFO_TABLE_NAME);
1458 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
1459 pDbHandle->endTrans(false);
1460 return MSG_ERR_DB_PREPARE;
1462 pDbHandle->bindInt(pCBChannel->channelInfo[i].bActivate, index++);
1463 pDbHandle->bindInt(pCBChannel->channelInfo[i].from, index++);
1464 pDbHandle->bindInt(pCBChannel->channelInfo[i].to, index++);
1465 pDbHandle->bindText(pCBChannel->channelInfo[i].name, index++);
1466 pDbHandle->bindInt(simIndex, index++);
1468 if (pDbHandle->stepQuery() != MSG_ERR_DB_DONE) {
1469 pDbHandle->finalizeQuery();
1470 pDbHandle->endTrans(false);
1471 return MSG_ERR_DB_STEP;
1474 pDbHandle->finalizeQuery();
1477 pDbHandle->endTrans(true);
1482 #else /* TODO: Add multisim for CDMA */
1485 char sqlQuery[MAX_QUERY_LEN] = {0, };
1487 pDbHandle->beginTrans();
1489 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1490 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s;", MSGFW_CDMA_CB_CHANNEL_INFO_TABLE_NAME);
1492 if (pDbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
1493 pDbHandle->endTrans(false);
1494 return MSG_ERR_DB_EXEC;
1497 for (int i = 0; i < pCBChannel->channelCnt; i++) {
1498 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1499 snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, %d, %d, %d, '%s');", MSGFW_CDMA_CB_CHANNEL_INFO_TABLE_NAME,
1500 i, pCBChannel->channelInfo[i].bActivate, pCBChannel->channelInfo[i].ctg,
1501 pCBChannel->channelInfo[i].lang, pCBChannel->channelInfo[i].name);
1503 if (pDbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
1504 pDbHandle->endTrans(false);
1505 return MSG_ERR_DB_EXEC;
1509 pDbHandle->endTrans(true);
1518 msg_error_t MsgStoGetCBChannelInfo(MsgDbHandler *pDbHandle, MSG_CB_CHANNEL_S *pCBChannel, msg_sim_slot_id_t simIndex)
1520 #ifndef FEATURE_SMS_CDMA
1523 int rowCnt = 0, index = 0;
1525 char sqlQuery[MAX_QUERY_LEN] = {0, };
1527 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1528 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);
1530 msg_error_t err = pDbHandle->getTable(sqlQuery, &rowCnt, &index);
1532 pCBChannel->channelCnt = rowCnt;
1534 if (err == MSG_ERR_DB_NORECORD) {
1535 pDbHandle->freeTable();
1536 return MSG_ERR_DB_NORECORD;
1537 } else if (err != MSG_SUCCESS) {
1538 MSG_DEBUG("Fail to getTable().");
1539 pDbHandle->freeTable();
1540 return MSG_ERR_DB_GETTABLE;
1543 for (int i = 0; i < rowCnt; i++) {
1544 pCBChannel->channelInfo[i].bActivate = pDbHandle->getColumnToInt(index++);
1545 pCBChannel->channelInfo[i].from = pDbHandle->getColumnToInt(index++);
1546 pCBChannel->channelInfo[i].to = pDbHandle->getColumnToInt(index++);
1547 pDbHandle->getColumnToString(index++, CB_CHANNEL_NAME_MAX, pCBChannel->channelInfo[i].name);
1549 MSG_DEBUG("CH_ACT = %d", pCBChannel->channelInfo[i].bActivate);
1550 MSG_DEBUG("CH_FROM = %d", pCBChannel->channelInfo[i].from);
1551 MSG_DEBUG("CH_TO = %d", pCBChannel->channelInfo[i].to);
1552 MSG_DEBUG("CH_NAME = %s", pCBChannel->channelInfo[i].name);
1555 pDbHandle->freeTable();
1560 #else /* TODO: Add multisim for CDMA */
1563 int rowCnt = 0, index = 0;
1565 char sqlQuery[MAX_QUERY_LEN] = {0, };
1567 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1568 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT CHANNEL_ACTIVATION, CHANNEL_CATEGORY, CHANNEL_LANGUAGE, CHANNEL_NAME FROM %s;", MSGFW_CDMA_CB_CHANNEL_INFO_TABLE_NAME);
1570 msg_error_t err = pDbHandle->getTable(sqlQuery, &rowCnt, &index);
1572 pCBChannel->channelCnt = rowCnt;
1574 if (err == MSG_ERR_DB_NORECORD) {
1575 pDbHandle->freeTable();
1576 return MSG_ERR_DB_NORECORD;
1577 } else if (err != MSG_SUCCESS) {
1578 MSG_DEBUG("Fail to getTable().");
1579 pDbHandle->freeTable();
1580 return MSG_ERR_DB_GETTABLE;
1583 for (int i = 0; i < rowCnt; i++) {
1584 pCBChannel->channelInfo[i].bActivate = pDbHandle->getColumnToInt(index++);
1585 pCBChannel->channelInfo[i].ctg = pDbHandle->getColumnToInt(index++);
1586 pCBChannel->channelInfo[i].lang = pDbHandle->getColumnToInt(index++);
1587 pDbHandle->getColumnToString(index++, CB_CHANNEL_NAME_MAX, pCBChannel->channelInfo[i].name);
1589 MSG_DEBUG("CH_ACT = %d", pCBChannel->channelInfo[i].bActivate);
1590 MSG_DEBUG("CH_CTG = %d", pCBChannel->channelInfo[i].ctg);
1591 MSG_DEBUG("CH_LANG = %d", pCBChannel->channelInfo[i].lang);
1592 MSG_DEBUG("CH_NAME = %s", pCBChannel->channelInfo[i].name);
1595 pDbHandle->freeTable();
1603 msg_error_t MsgStoGetThreadViewList(const MSG_SORT_RULE_S *pSortRule, msg_struct_list_s *pThreadViewList)
1605 MsgDbHandler *dbHandle = getDbHandle();
1606 dbHandle->connectReadOnly();
1608 pThreadViewList->nCount = 0;
1609 pThreadViewList->msg_struct_info = NULL;
1611 int rowCnt = 0, index = 0;
1613 char sqlQuery[MAX_QUERY_LEN+1];
1614 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1616 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.CONV_ID, A.UNREAD_CNT, A.SMS_CNT, A.MMS_CNT, A.MAIN_TYPE, A.SUB_TYPE, "
1617 "A.MSG_DIRECTION, A.DISPLAY_TIME, A.DISPLAY_NAME, A.MSG_TEXT, "
1618 "(COUNT(CASE WHEN B.PROTECTED = 1 THEN 1 END)) AS PROTECTED, "
1619 "(COUNT(CASE WHEN B.FOLDER_ID = %d THEN 1 END)) AS DRAFT, "
1620 "(COUNT(CASE WHEN B.NETWORK_STATUS = %d THEN 1 END)) AS FAILED, "
1621 "(COUNT(CASE WHEN B.NETWORK_STATUS = %d THEN 1 END)) AS SENDING "
1622 "FROM %s A, %s B ON A.SMS_CNT + A.MMS_CNT > 0 AND B.CONV_ID = A.CONV_ID "
1623 "GROUP BY A.CONV_ID ORDER BY A.DISPLAY_TIME DESC;",
1625 MSG_NETWORK_SEND_FAIL,
1626 MSG_NETWORK_SENDING,
1627 MSGFW_CONVERSATION_TABLE_NAME,
1628 MSGFW_MESSAGE_TABLE_NAME);
1630 msg_error_t err = dbHandle->getTable(sqlQuery, &rowCnt, &index);
1632 if (err == MSG_ERR_DB_NORECORD) {
1633 dbHandle->freeTable();
1635 } else if (err != MSG_SUCCESS) {
1636 MSG_DEBUG("Fail to getTable().");
1637 dbHandle->freeTable();
1642 MSG_DEBUG("rowCnt is %d", rowCnt);
1643 dbHandle->freeTable();
1647 pThreadViewList->nCount = rowCnt;
1649 MSG_DEBUG("pThreadViewList->nCount [%d]", pThreadViewList->nCount);
1651 pThreadViewList->msg_struct_info = (msg_struct_t *)calloc(rowCnt, sizeof(msg_struct_t));
1653 MSG_THREAD_VIEW_S *pTmp = NULL;
1654 msg_struct_s *thread_t = NULL;
1656 for (int i = 0; i < rowCnt; i++) {
1657 thread_t = (msg_struct_s *)new msg_struct_s;
1658 pThreadViewList->msg_struct_info[i] = (msg_struct_t)thread_t;
1660 thread_t->type = MSG_STRUCT_THREAD_INFO;
1661 thread_t->data = new MSG_THREAD_VIEW_S;
1663 pTmp = (MSG_THREAD_VIEW_S *)thread_t->data;
1664 memset(pTmp, 0x00, sizeof(MSG_THREAD_VIEW_S));
1666 pTmp->threadId = dbHandle->getColumnToInt(index++);
1668 pTmp->unreadCnt = dbHandle->getColumnToInt(index++);
1669 pTmp->smsCnt = dbHandle->getColumnToInt(index++);
1670 pTmp->mmsCnt = dbHandle->getColumnToInt(index++);
1672 pTmp->mainType = dbHandle->getColumnToInt(index++);
1673 pTmp->subType = dbHandle->getColumnToInt(index++);
1675 pTmp->direction = dbHandle->getColumnToInt(index++);
1676 pTmp->threadTime = (time_t)dbHandle->getColumnToInt(index++);
1678 memset(pTmp->threadName, 0x00, sizeof(pTmp->threadName));
1679 dbHandle->getColumnToString(index++, MAX_THREAD_NAME_LEN, pTmp->threadName);
1681 memset(pTmp->threadData, 0x00, sizeof(pTmp->threadData));
1682 dbHandle->getColumnToString(index++, MAX_THREAD_DATA_LEN, pTmp->threadData);
1684 int protectedCnt = dbHandle->getColumnToInt(index++);
1685 if (protectedCnt > 0)
1686 pTmp->bProtected = true;
1688 int draftCnt = dbHandle->getColumnToInt(index++);
1690 pTmp->bDraft = true;
1692 int failedCnt = dbHandle->getColumnToInt(index++);
1694 pTmp->bSendFailed = true;
1696 int sendingCnt = dbHandle->getColumnToInt(index++);
1698 pTmp->bSending = true;
1701 dbHandle->freeTable();
1707 msg_error_t MsgStoGetConversationPreview(MsgDbHandler *pDbHandle, MSG_CONVERSATION_VIEW_S *pConv)
1709 char sqlQuery[MAX_QUERY_LEN + 1];
1710 int rowCnt = 0, index = 0;
1711 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1714 return MSG_ERR_NULL_POINTER;
1716 pConv->tcs_bc_level = -1; /* init */
1718 /*(MSG_ID INTEGER, TYPE INTEGER, VALUE TEXT, COUNT INTEGER) */
1719 snprintf(sqlQuery, sizeof(sqlQuery),
1720 "SELECT TYPE, VALUE, COUNT "
1721 "FROM %s WHERE MSG_ID=%d;",
1722 MSGFW_MMS_PREVIEW_TABLE_NAME, pConv->msgId);
1724 msg_error_t err = pDbHandle->getTable(sqlQuery, &rowCnt, &index);
1725 if (err == MSG_SUCCESS) {
1726 for (int i = 0; i < rowCnt; i++) {
1727 int type = pDbHandle->getColumnToInt(index++);
1728 if (type == MSG_MMS_ITEM_TYPE_IMG) {
1729 pDbHandle->getColumnToString(index++, MSG_FILEPATH_LEN_MAX, pConv->imageThumbPath);
1730 pDbHandle->getColumnToInt(index++);
1731 } else if (type == MSG_MMS_ITEM_TYPE_VIDEO) {
1732 pDbHandle->getColumnToString(index++, MSG_FILEPATH_LEN_MAX, pConv->videoThumbPath);
1733 pDbHandle->getColumnToInt(index++);
1734 } else if (type == MSG_MMS_ITEM_TYPE_AUDIO) {
1735 pDbHandle->getColumnToString(index++, MSG_FILENAME_LEN_MAX, pConv->audioFileName);
1736 pDbHandle->getColumnToInt(index++);
1737 } else if (type == MSG_MMS_ITEM_TYPE_ATTACH) {
1738 pDbHandle->getColumnToString(index++, MSG_FILENAME_LEN_MAX, pConv->attachFileName);
1739 pConv->attachCount = pDbHandle->getColumnToInt(index++);
1740 } else if (type == MSG_MMS_ITEM_TYPE_PAGE) {
1742 pConv->pageCount = pDbHandle->getColumnToInt(index++);
1743 } else if (type == MSG_MMS_ITEM_TYPE_MALWARE) {
1745 pConv->tcs_bc_level = pDbHandle->getColumnToInt(index++);
1746 } else if (type == MSG_MMS_ITEM_TYPE_1ST_MEDIA) {
1747 pDbHandle->getColumnToString(index++, MSG_FILEPATH_LEN_MAX, pConv->firstMediaPath);
1748 pDbHandle->getColumnToInt(index++);
1750 MSG_DEBUG("Unknown item type [%d]", type);
1756 pDbHandle->freeTable();
1760 msg_error_t MsgStoGetConversationMultipart(MsgDbHandler *pDbHandle, MSG_CONVERSATION_VIEW_S *pConv)
1762 char sqlQuery[MAX_QUERY_LEN + 1];
1763 int rowCnt = 0, index = 0;
1764 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1767 return MSG_ERR_NULL_POINTER;
1769 snprintf(sqlQuery, sizeof(sqlQuery),
1770 "SELECT CONTENT_TYPE, NAME, FILE_PATH, CONTENT_ID, CONTENT_LOCATION, TCS_LEVEL, MALWARE_ALLOW, THUMB_FILE_PATH "
1771 "FROM %s WHERE MSG_ID=%d;",
1772 MSGFW_MMS_MULTIPART_TABLE_NAME, pConv->msgId);
1774 msg_error_t err = pDbHandle->getTable(sqlQuery, &rowCnt, &index);
1775 if (err == MSG_SUCCESS) {
1776 GList *multipart_list = NULL;
1777 for (int i = 0; i < rowCnt; i++) {
1778 msg_struct_s *multipart_struct_s = new msg_struct_s;
1779 multipart_struct_s->type = MSG_STRUCT_MULTIPART_INFO;
1780 multipart_struct_s->data = new MMS_MULTIPART_DATA_S;
1781 memset(multipart_struct_s->data, 0x00, sizeof(MMS_MULTIPART_DATA_S));
1783 MMS_MULTIPART_DATA_S *multipart = (MMS_MULTIPART_DATA_S *)multipart_struct_s->data;
1785 pDbHandle->getColumnToString(index++, sizeof(multipart->szContentType), multipart->szContentType);
1786 pDbHandle->getColumnToString(index++, sizeof(multipart->szFileName), multipart->szFileName);
1787 pDbHandle->getColumnToString(index++, sizeof(multipart->szFilePath), multipart->szFilePath);
1788 pDbHandle->getColumnToString(index++, sizeof(multipart->szContentID), multipart->szContentID);
1789 pDbHandle->getColumnToString(index++, sizeof(multipart->szContentLocation), multipart->szContentLocation);
1791 multipart->tcs_bc_level = pDbHandle->getColumnToInt(index++);
1792 multipart->malware_allow = pDbHandle->getColumnToInt(index++);
1793 pDbHandle->getColumnToString(index++, sizeof(multipart->szThumbFilePath), multipart->szThumbFilePath);
1795 multipart_list = g_list_append(multipart_list, multipart_struct_s);
1797 pConv->multipart_list = (msg_list_handle_t)multipart_list;
1800 pDbHandle->freeTable();
1804 msg_error_t MsgStoGetConversationViewItem(msg_message_id_t msgId, MSG_CONVERSATION_VIEW_S *pConv)
1806 MsgDbHandler *dbHandle = getDbHandle();
1807 dbHandle->connectReadOnly();
1809 int rowCnt = 0, index = 0;
1811 char sqlQuery[MAX_QUERY_LEN+1];
1813 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1815 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID, CONV_ID, FOLDER_ID, STORAGE_ID, MAIN_TYPE, SUB_TYPE, \
1816 DISPLAY_TIME, DATA_SIZE, NETWORK_STATUS, READ_STATUS, PROTECTED, \
1817 MSG_DIRECTION, SCHEDULED_TIME, SUBJECT, MSG_TEXT, ATTACHMENT_COUNT, SIM_INDEX\
1818 FROM %s WHERE MSG_ID = %d;",
1819 MSGFW_MESSAGE_TABLE_NAME, msgId);
1821 msg_error_t err = dbHandle->getTable(sqlQuery, &rowCnt, &index);
1823 if (err == MSG_ERR_DB_NORECORD) {
1824 dbHandle->freeTable();
1826 } else if (err != MSG_SUCCESS) {
1827 MSG_DEBUG("Fail to getTable().");
1828 dbHandle->freeTable();
1832 memset(pConv, 0x00, sizeof(MSG_CONVERSATION_VIEW_S));
1833 pConv->pText = NULL;
1835 pConv->msgId = dbHandle->getColumnToInt(index++);
1836 pConv->threadId = dbHandle->getColumnToInt(index++);
1837 pConv->folderId = dbHandle->getColumnToInt(index++);
1838 pConv->storageId = dbHandle->getColumnToInt(index++);
1839 pConv->mainType = dbHandle->getColumnToInt(index++);
1840 pConv->subType = dbHandle->getColumnToInt(index++);
1841 pConv->displayTime = (time_t)dbHandle->getColumnToInt(index++);
1842 pConv->textSize = dbHandle->getColumnToInt(index++);
1843 pConv->networkStatus = dbHandle->getColumnToInt(index++);
1844 pConv->bRead = dbHandle->getColumnToInt(index++);
1845 pConv->bProtected = dbHandle->getColumnToInt(index++);
1846 pConv->direction = dbHandle->getColumnToInt(index++);
1847 pConv->scheduledTime = (time_t)dbHandle->getColumnToInt(index++);
1849 dbHandle->getColumnToString(index++, MAX_SUBJECT_LEN, pConv->subject);
1850 char *tmpText = g_strdup(dbHandle->getColumnToString(index++));
1852 /*It does Not need to Get attach count in MSG_MESSAGE_TABLE. see MsgStoGetConversationPreview */
1853 /*pConv->attachCount = dbHandle->getColumnToInt(index++); */
1855 pConv->simIndex = dbHandle->getColumnToInt(index++);
1857 dbHandle->freeTable();
1859 if (pConv->mainType == MSG_MMS_TYPE &&
1860 (pConv->networkStatus == MSG_NETWORK_RETRIEVING || pConv->networkStatus == MSG_NETWORK_RETRIEVE_FAIL || pConv->subType == MSG_NOTIFICATIONIND_MMS)) {
1861 pConv->pText = NULL;
1862 pConv->textSize = 0;
1864 if (pConv->mainType == MSG_SMS_TYPE) {
1865 pConv->pText = new char[pConv->textSize+2];
1866 memset(pConv->pText, 0x00, pConv->textSize+2);
1867 snprintf(pConv->pText, pConv->textSize+1, "%s", tmpText);
1868 } else if (pConv->mainType == MSG_MMS_TYPE) {
1870 pConv->textSize = strlen(tmpText);
1872 pConv->pText = new char[pConv->textSize+1];
1873 memset(pConv->pText, 0x00, pConv->textSize+1);
1875 strncpy(pConv->pText, tmpText, pConv->textSize);
1878 MsgStoGetConversationPreview(dbHandle, pConv);
1879 MsgStoGetConversationMultipart(dbHandle, pConv);
1894 msg_error_t MsgStoGetConversationViewList(msg_thread_id_t threadId, msg_struct_list_s *pConvViewList)
1898 MsgDbHandler *dbHandle = getDbHandle();
1899 dbHandle->connectReadOnly();
1901 pConvViewList->nCount = 0;
1902 pConvViewList->msg_struct_info = NULL;
1904 int rowCnt = 0, index = 0;
1906 char sqlQuery[MAX_QUERY_LEN+1];
1908 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1910 #ifdef MSG_NOTI_INTEGRATION
1911 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID, CONV_ID, FOLDER_ID, STORAGE_ID, MAIN_TYPE, SUB_TYPE, \
1912 DISPLAY_TIME, DATA_SIZE, NETWORK_STATUS, READ_STATUS, PROTECTED, \
1913 MSG_DIRECTION, SCHEDULED_TIME, SUBJECT, MSG_TEXT, ATTACHMENT_COUNT, SIM_INDEX \
1914 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;",
1915 MSGFW_MESSAGE_TABLE_NAME, threadId, MSG_ALLBOX_ID, MSG_SPAMBOX_ID, MSG_STORAGE_PHONE);
1917 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID, CONV_ID, FOLDER_ID, STORAGE_ID, MAIN_TYPE, SUB_TYPE, \
1918 DISPLAY_TIME, DATA_SIZE, NETWORK_STATUS, READ_STATUS, PROTECTED, \
1919 MSG_DIRECTION, SCHEDULED_TIME, SUBJECT, MSG_TEXT, ATTACHMENT_COUNT \
1920 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;",
1921 MSGFW_MESSAGE_TABLE_NAME, threadId, MSG_ALLBOX_ID, MSG_CBMSGBOX_ID, MSG_STORAGE_PHONE);
1924 msg_error_t err = dbHandle->getTable(sqlQuery, &rowCnt, &index);
1926 if (err == MSG_ERR_DB_NORECORD) {
1927 dbHandle->freeTable();
1929 } else if (err != MSG_SUCCESS) {
1930 MSG_DEBUG("Fail to getTable().");
1931 dbHandle->freeTable();
1935 pConvViewList->nCount = rowCnt;
1936 char *tmpText[rowCnt] = {NULL};
1938 MSG_DEBUG("pConvViewList->nCount [%d]", pConvViewList->nCount);
1940 pConvViewList->msg_struct_info = (msg_struct_t *)calloc(rowCnt, sizeof(msg_struct_t));
1941 memset(pConvViewList->msg_struct_info, 0x00, sizeof(msg_struct_t) * rowCnt);
1943 msg_struct_s *conv = NULL;
1944 MSG_CONVERSATION_VIEW_S *pTmp = NULL;
1946 for (int i = 0; i < rowCnt; i++) {
1947 pConvViewList->msg_struct_info[i] = (msg_struct_t)new msg_struct_s;
1948 memset(pConvViewList->msg_struct_info[i], 0x00, sizeof(msg_struct_s));
1950 conv = (msg_struct_s *)pConvViewList->msg_struct_info[i];
1952 conv->type = MSG_STRUCT_CONV_INFO;
1953 conv->data = new MSG_CONVERSATION_VIEW_S;
1954 memset(conv->data, 0x00, sizeof(MSG_CONVERSATION_VIEW_S));
1956 pTmp = (MSG_CONVERSATION_VIEW_S *)conv->data;
1960 pTmp->msgId = dbHandle->getColumnToInt(index++);
1961 pTmp->threadId = dbHandle->getColumnToInt(index++);
1962 pTmp->folderId = dbHandle->getColumnToInt(index++);
1963 pTmp->storageId = dbHandle->getColumnToInt(index++);
1964 pTmp->mainType = dbHandle->getColumnToInt(index++);
1965 pTmp->subType = dbHandle->getColumnToInt(index++);
1966 pTmp->displayTime = (time_t)dbHandle->getColumnToInt(index++);
1967 pTmp->textSize = dbHandle->getColumnToInt(index++);
1968 pTmp->networkStatus = dbHandle->getColumnToInt(index++);
1969 pTmp->bRead = dbHandle->getColumnToInt(index++);
1970 pTmp->bProtected = dbHandle->getColumnToInt(index++);
1971 pTmp->direction = dbHandle->getColumnToInt(index++);
1972 index++; /* This field is reserved. */
1974 dbHandle->getColumnToString(index++, MAX_SUBJECT_LEN, pTmp->subject);
1975 tmpText[i] = g_strdup(dbHandle->getColumnToString(index++));
1977 /*It does Not need to Get attach count in MSG_MESSAGE_TABLE. see MsgStoGetConversationPreview */
1978 /*pTmp->attachCount = dbHandle->getColumnToInt(index++); */
1980 pTmp->simIndex = dbHandle->getColumnToInt(index++);
1982 dbHandle->freeTable();
1984 for (int i = 0; i < pConvViewList->nCount; i++) {
1985 conv = (msg_struct_s *)pConvViewList->msg_struct_info[i];
1986 pTmp = (MSG_CONVERSATION_VIEW_S *)conv->data;
1988 if (pTmp->mainType == MSG_MMS_TYPE &&
1989 (pTmp->networkStatus == MSG_NETWORK_RETRIEVING || pTmp->networkStatus == MSG_NETWORK_RETRIEVE_FAIL || pTmp->subType == MSG_NOTIFICATIONIND_MMS)) {
1993 if (pTmp->mainType == MSG_SMS_TYPE) {
1994 pTmp->pText = new char[pTmp->textSize+2];
1995 memset(pTmp->pText, 0x00, pTmp->textSize+2);
1996 snprintf(pTmp->pText, pTmp->textSize+1, "%s", tmpText[i]);
1997 } else if (pTmp->mainType == MSG_MMS_TYPE) {
1999 pTmp->textSize = strlen(tmpText[i]);
2001 pTmp->pText = new char[pTmp->textSize+1];
2002 memset(pTmp->pText, 0x00, pTmp->textSize+1);
2004 strncpy(pTmp->pText, tmpText[i], pTmp->textSize);
2007 MsgStoGetConversationPreview(dbHandle, pTmp);
2008 MsgStoGetConversationMultipart(dbHandle, pTmp);
2023 msg_error_t MsgStoSearchMessage(const char *pSearchString, msg_struct_list_s *pThreadViewList, int contactCount)
2026 return MSG_ERR_NULL_POINTER;
2028 MsgDbHandler *dbHandle = getDbHandle();
2029 dbHandle->connectReadOnly();
2030 char *escapeAddressStr = NULL;
2032 /* Clear Out Parameter */
2033 pThreadViewList->nCount = 0;
2034 pThreadViewList->msg_struct_info = NULL;
2036 tr1::unordered_set<msg_thread_id_t> IdList;
2037 queue<MSG_THREAD_VIEW_S> searchList;
2039 MSG_THREAD_VIEW_S threadView;
2041 char sqlQuery[MAX_QUERY_LEN+1];
2043 /* Search - Address, Name */
2044 memset(sqlQuery, 0x00, MAX_QUERY_LEN+1);
2045 snprintf(sqlQuery, MAX_QUERY_LEN, "SELECT A.CONV_ID, A.UNREAD_CNT, A.SMS_CNT, A.MMS_CNT, A.DISPLAY_NAME, "
2046 "A.MAIN_TYPE, A.SUB_TYPE, A.MSG_DIRECTION, A.DISPLAY_TIME, A.MSG_TEXT, "
2047 "(SELECT COUNT(*) FROM %s B WHERE B.CONV_ID = A.CONV_ID AND B.PROTECTED = 1) AS PROTECTED, "
2048 "(SELECT COUNT(*) FROM %s B WHERE B.CONV_ID = A.CONV_ID AND B.FOLDER_ID = %d) AS DRAFT, "
2049 "(SELECT COUNT(*) FROM %s B WHERE B.CONV_ID = A.CONV_ID AND B.NETWORK_STATUS = %d) AS FAILED, "
2050 "(SELECT COUNT(*) FROM %s B WHERE B.CONV_ID = A.CONV_ID AND B.NETWORK_STATUS = %d) AS SENDING "
2051 "FROM %s A WHERE (A.SMS_CNT > 0 OR A.MMS_CNT > 0) "
2053 "(SELECT DISTINCT(CONV_ID) FROM %s WHERE "
2054 "ADDRESS_VAL LIKE ? ESCAPE '%c' ",
2055 MSGFW_MESSAGE_TABLE_NAME,
2056 MSGFW_MESSAGE_TABLE_NAME, MSG_DRAFT_ID,
2057 MSGFW_MESSAGE_TABLE_NAME, MSG_NETWORK_SEND_FAIL,
2058 MSGFW_MESSAGE_TABLE_NAME, MSG_NETWORK_SENDING,
2059 MSGFW_CONVERSATION_TABLE_NAME,
2060 MSGFW_ADDRESS_TABLE_NAME,
2061 MSGFW_DB_ESCAPE_CHAR);
2063 unsigned int tmpSize = 0;
2064 if (contactCount > 0) {
2065 tmpSize = strlen(sqlQuery);
2066 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
2067 "OR ADDRESS_VAL IN (SELECT C.ADDRESS_VAL FROM %s C JOIN %s D ON (C.ADDRESS_VAL LIKE D.ADDRESS_VAL))"
2068 , MSGFW_ADDRESS_TABLE_NAME, MSGFW_ADDRESS_TEMP_TABLE_NAME);
2071 tmpSize = strlen(sqlQuery);
2072 snprintf(sqlQuery+tmpSize, MAX_QUERY_LEN-tmpSize,
2073 ") ORDER BY A.DISPLAY_TIME DESC;");
2075 MSG_DEBUG("sqlQuery=[%s]", sqlQuery);
2077 if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
2078 MSG_DEBUG("Prepare query fail.");
2079 return MSG_ERR_DB_PREPARE;
2082 MsgConvertStrWithEscape(pSearchString, &escapeAddressStr);
2083 MSG_DEBUG("escapeAddressStr [%s]", escapeAddressStr);
2084 dbHandle->bindText(escapeAddressStr, 1);
2085 /*dbHandle->bindText(escapeAddressStr, 2); */
2086 /*dbHandle->bindText(escapeAddressStr, 3); */
2087 /*dbHandle->bindText(escapeAddressStr, 4); */
2089 while (dbHandle->stepQuery() == MSG_ERR_DB_ROW) {
2090 memset(&threadView, 0x00, sizeof(threadView));
2092 threadView.threadId = dbHandle->columnInt(0);
2093 threadView.unreadCnt = dbHandle->columnInt(1);
2094 threadView.smsCnt = dbHandle->columnInt(2);
2095 threadView.mmsCnt = dbHandle->columnInt(3);
2097 if (dbHandle->columnText(4))
2098 strncpy(threadView.threadName, (char *)dbHandle->columnText(4), MAX_THREAD_NAME_LEN);
2100 threadView.mainType = dbHandle->columnInt(5);
2101 threadView.subType = dbHandle->columnInt(6);
2103 threadView.direction = dbHandle->columnInt(7);
2104 threadView.threadTime = (time_t)dbHandle->columnInt(8);
2106 if (dbHandle->columnText(9))
2107 strncpy(threadView.threadData, (char *)dbHandle->columnText(9), MAX_THREAD_DATA_LEN);
2109 int protectedCnt = dbHandle->columnInt(10);
2110 if (protectedCnt > 0)
2111 threadView.bProtected = true;
2113 int draftCnt = dbHandle->columnInt(11);
2115 threadView.bDraft = true;
2117 int failedCnt = dbHandle->columnInt(12);
2119 threadView.bSendFailed = true;
2121 int sendingCnt = dbHandle->columnInt(13);
2123 threadView.bSending = true;
2125 tr1::unordered_set<msg_thread_id_t>::iterator it;
2127 it = IdList.find(threadView.threadId);
2129 if (it == IdList.end()) {
2130 IdList.insert(threadView.threadId);
2131 searchList.push(threadView);
2135 dbHandle->finalizeQuery();
2137 if (escapeAddressStr) {
2138 free(escapeAddressStr);
2139 escapeAddressStr = NULL;
2143 /* Add data to Out Parameter */
2144 pThreadViewList->nCount = searchList.size();
2145 pThreadViewList->msg_struct_info = (msg_struct_t *)calloc(searchList.size(), sizeof(msg_struct_t));
2146 if (pThreadViewList->msg_struct_info == NULL)
2147 return MSG_ERR_MEMORY_ERROR;
2149 MSG_THREAD_VIEW_S *pTmp = NULL;
2150 msg_struct_s *thread_t = NULL;
2154 while (!searchList.empty()) {
2155 thread_t = (msg_struct_s *)new msg_struct_s;
2156 pThreadViewList->msg_struct_info[index] = (msg_struct_t)thread_t;
2158 thread_t->type = MSG_STRUCT_THREAD_INFO;
2159 thread_t->data = new MSG_THREAD_VIEW_S;
2161 pTmp = (MSG_THREAD_VIEW_S *)thread_t->data;
2162 memset(pTmp, 0x00, sizeof(MSG_THREAD_VIEW_S));
2164 memcpy(pTmp, &(searchList.front()), sizeof(MSG_THREAD_VIEW_S));
2175 msg_error_t MsgStoGetRejectMsgList(const char *pNumber, msg_struct_list_s *pRejectMsgList)
2177 MsgDbHandler *dbHandle = getDbHandle();
2178 dbHandle->connectReadOnly();
2180 /* Clear Out Parameter */
2181 pRejectMsgList->nCount = 0;
2182 pRejectMsgList->msg_struct_info = NULL;
2184 int rowCnt = 0, index = 0;
2186 char sqlQuery[MAX_QUERY_LEN+1];
2188 /* Search Reject Msg */
2189 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2191 if (pNumber != NULL) {
2192 int addrSize = strlen(pNumber);
2193 char phoneNumber[addrSize+1];
2194 memset(phoneNumber, 0x00, sizeof(phoneNumber));
2196 if (addrSize > MsgContactGetMinMatchDigit())
2197 MsgConvertNumber(pNumber, phoneNumber, addrSize);
2199 strncpy(phoneNumber, pNumber, addrSize);
2201 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT "
2206 "WHERE A.CONV_ID = B.CONV_ID "
2207 "AND B.MAIN_TYPE = %d "
2208 "AND B.SUB_TYPE = %d "
2209 "AND A.ADDRESS_VAL LIKE '%%%s' "
2210 "ORDER BY B.DISPLAY_TIME DESC;",
2211 MSGFW_ADDRESS_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME,
2216 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT "
2221 "WHERE A.CONV_ID = B.CONV_ID "
2222 "AND B.MAIN_TYPE = %d "
2223 "AND B.SUB_TYPE = %d "
2224 "ORDER BY B.DISPLAY_TIME DESC;",
2225 MSGFW_ADDRESS_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME,
2230 msg_error_t err = dbHandle->getTable(sqlQuery, &rowCnt, &index);
2232 if (err != MSG_SUCCESS) {
2233 MSG_DEBUG("Fail to getTable().");
2234 dbHandle->freeTable();
2238 pRejectMsgList->nCount = rowCnt;
2240 MSG_DEBUG("pRejectMsgList->nCount [%d]", pRejectMsgList->nCount);
2242 pRejectMsgList->msg_struct_info = (msg_struct_t *)calloc(rowCnt, sizeof(MSG_REJECT_MSG_INFO_S *));
2244 msg_struct_s* pTmp = NULL;
2246 for (int i = 0; i < rowCnt; i++) {
2247 pRejectMsgList->msg_struct_info[i] = (msg_struct_t)new msg_struct_s;
2249 pTmp = (msg_struct_s *)pRejectMsgList->msg_struct_info[i];
2250 pTmp->type = MSG_STRUCT_REJECT_MSG_INFO;
2251 pTmp->data = new MSG_REJECT_MSG_INFO_S;
2252 MSG_REJECT_MSG_INFO_S * pMsg = (MSG_REJECT_MSG_INFO_S *)pTmp->data;
2253 memset(pMsg, 0x00, sizeof(MSG_REJECT_MSG_INFO_S));
2255 pMsg->msgId = dbHandle->getColumnToInt(index++);
2256 memset(pMsg->msgText, 0x00, sizeof(pMsg->msgText));
2257 dbHandle->getColumnToString(index++, MAX_MSG_TEXT_LEN, pMsg->msgText);
2259 pMsg->displayTime = (time_t)dbHandle->getColumnToInt(index++);
2262 dbHandle->freeTable();
2268 msg_error_t MsgStoGetAddressList(const msg_thread_id_t threadId, msg_struct_list_s *pAddrList)
2270 MsgDbHandler *dbHandle = getDbHandle();
2271 dbHandle->connectReadOnly();
2273 msg_error_t err = MSG_SUCCESS;
2275 err = MsgStoGetAddressByConvId(dbHandle, threadId, pAddrList);
2281 msg_error_t MsgStoGetMessageList(const MSG_LIST_CONDITION_S *pListCond, msg_struct_list_s *pMsgList, int contactCount)
2283 MsgDbHandler *dbHandle = getDbHandle();
2284 dbHandle->connectReadOnly();
2286 /* Clear Out Parameter */
2287 pMsgList->nCount = 0;
2288 pMsgList->msg_struct_info = NULL;
2291 int multipartCnt = 0;
2293 char sqlQuery[MAX_QUERY_LEN+1];
2294 char sqlQuerySubset[(MAX_QUERY_LEN/5)+1];
2296 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2297 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(*) FROM %s;", MSGFW_MMS_MULTIPART_TABLE_NAME);
2299 if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
2300 return MSG_ERR_DB_PREPARE;
2302 if (dbHandle->stepQuery() == MSG_ERR_DB_ROW) {
2303 multipartCnt = dbHandle->columnInt(0);
2305 dbHandle->finalizeQuery();
2306 return MSG_ERR_DB_STEP;
2309 dbHandle->finalizeQuery();
2311 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2312 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT DISTINCT "
2321 "A.NETWORK_STATUS, "
2327 "A.SCHEDULED_TIME, "
2330 "A.ATTACHMENT_COUNT, "
2334 "B.RECIPIENT_TYPE, "
2337 if (pListCond->pTextVal != NULL && multipartCnt > 0) {
2338 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2339 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "FROM %s C, %s B, %s A WHERE A.CONV_ID > 0 AND A.CONV_ID = B.CONV_ID AND ",
2340 MSGFW_MMS_MULTIPART_TABLE_NAME, MSGFW_ADDRESS_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME);
2343 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2344 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "FROM %s B, %s A WHERE A.CONV_ID > 0 AND A.CONV_ID = B.CONV_ID AND ",
2345 MSGFW_ADDRESS_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME);
2348 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2351 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2353 if (pListCond->folderId == MSG_ALLBOX_ID)
2354 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "A.FOLDER_ID > 0 AND A.FOLDER_ID < %d ", MSG_SPAMBOX_ID);
2355 else if (pListCond->folderId == MSG_IOSBOX_ID)
2356 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "A.FOLDER_ID > 0 AND A.FOLDER_ID < %d ", MSG_DRAFT_ID);
2358 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "A.FOLDER_ID = %d ", pListCond->folderId);
2360 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2364 if (pListCond->threadId > 0) {
2365 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2366 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.CONV_ID = %d ", pListCond->threadId);
2367 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2372 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2374 switch (pListCond->msgType) {
2376 if (pListCond->pAddressVal == NULL)
2377 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.MAIN_TYPE = %d ", MSG_SMS_TYPE);
2379 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.MAIN_TYPE = %d AND A.SUB_TYPE = %d ", MSG_SMS_TYPE, MSG_NORMAL_SMS);
2383 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.MAIN_TYPE = %d ", MSG_MMS_TYPE);
2386 case MSG_TYPE_MMS_JAVA:
2387 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.MAIN_TYPE = %d AND A.SUB_TYPE = %d ", MSG_MMS_TYPE, MSG_SENDREQ_JAVA_MMS);
2390 case MSG_TYPE_SMS_SYNCML:
2391 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.MAIN_TYPE = %d AND A.SUB_TYPE = %d ", MSG_SMS_TYPE, MSG_SYNCML_CP);
2393 case MSG_TYPE_SMS_REJECT:
2394 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.MAIN_TYPE = %d AND A.SUB_TYPE = %d ", MSG_SMS_TYPE, MSG_REJECT_SMS);
2398 MSG_DEBUG("msg type is not set.");
2402 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2406 if (pListCond->storageId > MSG_STORAGE_UNKNOWN) {
2407 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2408 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.STORAGE_ID = %d ", pListCond->storageId);
2409 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2414 if (pListCond->bProtected) {
2415 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2416 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.PROTECTED = %d ", pListCond->bProtected);
2417 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2422 if (pListCond->bScheduled) {
2423 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2424 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.SCHEDULED_TIME > 0 ");
2425 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2430 if (pListCond->simIndex > 0) {
2431 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2432 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.SIM_INDEX = %d ", pListCond->simIndex);
2433 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2438 if (pListCond->fromTime > 0) {
2439 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2440 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.DISPLAY_TIME >= %u ", (unsigned int)pListCond->fromTime);
2441 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2444 if (pListCond->toTime > 0) {
2445 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2446 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND A.DISPLAY_TIME <= %u ", (unsigned int)pListCond->toTime);
2447 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2450 if (pListCond->pAddressVal == NULL) {
2452 if (pListCond->pTextVal != NULL) {
2453 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2454 if (multipartCnt > 0) {
2455 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset),
2456 "AND ((A.MSG_TEXT LIKE ? ESCAPE '%c' OR A.SUBJECT LIKE ? ESCAPE '%c' OR (C.NAME LIKE ? ESCAPE '%c' AND A.MSG_ID = C.MSG_ID AND C.CONTENT_TYPE <> 'application/smil'))) ",
2457 MSGFW_DB_ESCAPE_CHAR, MSGFW_DB_ESCAPE_CHAR, MSGFW_DB_ESCAPE_CHAR);
2460 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset),
2461 "AND ((A.MSG_TEXT LIKE ? ESCAPE '%c' OR A.SUBJECT LIKE ? ESCAPE '%c')) ",
2462 MSGFW_DB_ESCAPE_CHAR, MSGFW_DB_ESCAPE_CHAR);
2464 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2468 if (pListCond->pTextVal != NULL) {
2469 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2470 if (multipartCnt > 0) {
2471 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset),
2472 "AND ((A.MSG_TEXT LIKE ? ESCAPE '%c' OR A.SUBJECT LIKE ? ESCAPE '%c' OR (C.NAME LIKE ? ESCAPE '%c' AND A.MSG_ID = C.MSG_ID AND C.CONTENT_TYPE <> 'application/smil')) ",
2473 MSGFW_DB_ESCAPE_CHAR, MSGFW_DB_ESCAPE_CHAR, MSGFW_DB_ESCAPE_CHAR);
2476 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset),
2477 "AND ((A.MSG_TEXT LIKE ? ESCAPE '%c' OR A.SUBJECT LIKE ? ESCAPE '%c') ",
2478 MSGFW_DB_ESCAPE_CHAR, MSGFW_DB_ESCAPE_CHAR);
2480 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2482 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2483 if (pListCond->bAnd) {
2484 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "AND ");
2486 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "OR ");
2488 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2491 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2492 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset),
2493 "(B.ADDRESS_VAL LIKE ? ESCAPE '%c' ", MSGFW_DB_ESCAPE_CHAR);
2494 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2496 if (contactCount > 0) {
2497 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2498 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset),
2499 "OR B.ADDRESS_VAL IN (SELECT D.ADDRESS_VAL FROM %s D JOIN %s E ON (D.ADDRESS_VAL LIKE E.ADDRESS_VAL)) "
2500 , MSGFW_ADDRESS_TABLE_NAME, MSGFW_ADDRESS_TEMP_TABLE_NAME);
2501 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2504 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2505 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), ")) ");
2506 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2509 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2510 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset),
2511 "AND (B.ADDRESS_VAL LIKE ? ESCAPE '%c' ", MSGFW_DB_ESCAPE_CHAR);
2512 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2514 if (contactCount > 0) {
2515 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2516 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset),
2517 "OR B.ADDRESS_VAL IN (SELECT D.ADDRESS_VAL FROM %s D JOIN %s E ON (D.ADDRESS_VAL LIKE E.ADDRESS_VAL)) "
2518 , MSGFW_ADDRESS_TABLE_NAME, MSGFW_ADDRESS_TEMP_TABLE_NAME);
2519 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2522 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2523 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), ") ");
2524 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2528 msg_struct_s *pSortRule = (msg_struct_s *)pListCond->sortRule;
2530 if (pSortRule->type != MSG_STRUCT_SORT_RULE) {
2532 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2533 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "ORDER BY A.DISPLAY_TIME ");
2535 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2538 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2539 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "DESC ");
2541 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2543 MSG_SORT_RULE_S *pTmp = (MSG_SORT_RULE_S *)pSortRule->data;
2544 /* order : TODO: have to finish this */
2545 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2546 switch (pTmp->sortType) {
2547 case MSG_SORT_BY_MSG_TYPE:
2548 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "ORDER BY A.MAIN_TYPE ");
2550 case MSG_SORT_BY_READ_STATUS:
2551 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "ORDER BY A.READ_STATUS ");
2553 case MSG_SORT_BY_STORAGE_TYPE:
2554 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "ORDER BY A.STORAGE_ID ");
2557 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "ORDER BY A.DISPLAY_TIME ");
2560 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2563 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2564 if (pTmp->bAscending)
2565 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "ASC ");
2567 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "DESC ");
2569 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2572 /* offset & limit */
2573 memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset));
2574 if (pListCond->offset >= 0 && pListCond->limit > 0)
2575 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "LIMIT %d OFFSET %d;", pListCond->limit, pListCond->offset);
2577 snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), ";");
2579 strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery));
2582 /* 'til here sqlQuery is complete. */
2584 queue<MSG_MESSAGE_HIDDEN_S*> searchList;
2586 MSG_DEBUG("[%s]", sqlQuery);
2588 if (dbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
2589 MSG_DEBUG("Prepare query fail.");
2590 return MSG_ERR_DB_PREPARE;
2593 char *escapeTextStr = NULL;
2594 char *escapeAddressStr = NULL;
2596 if (pListCond->pAddressVal == NULL) {
2598 if (pListCond->pTextVal != NULL) {
2599 MsgConvertStrWithEscape(pListCond->pTextVal, &escapeTextStr);
2600 MSG_DEBUG("escapeTextStr [%s]", escapeTextStr);
2601 dbHandle->bindText(escapeTextStr, 1);
2602 dbHandle->bindText(escapeTextStr, 2);
2603 if (multipartCnt > 0) dbHandle->bindText(escapeTextStr, 3);
2607 if (pListCond->pTextVal != NULL) {
2608 MsgConvertStrWithEscape(pListCond->pTextVal, &escapeTextStr);
2609 MSG_DEBUG("escapeTestStr [%s]", escapeTextStr);
2612 MsgConvertStrWithEscape(pListCond->pAddressVal, &escapeAddressStr);
2613 MSG_DEBUG("escapeAddressStr [%s]", escapeAddressStr);
2615 dbHandle->bindText(escapeTextStr, 1);
2616 dbHandle->bindText(escapeTextStr, 2);
2617 if (multipartCnt > 0) {
2618 dbHandle->bindText(escapeTextStr, 3);
2619 dbHandle->bindText(escapeAddressStr, 4);
2621 dbHandle->bindText(escapeAddressStr, 3);
2626 MsgConvertStrWithEscape(pListCond->pAddressVal, &escapeAddressStr);
2627 MSG_DEBUG("escapeAddressStr [%s]", escapeAddressStr);
2628 dbHandle->bindText(escapeAddressStr, 1);
2633 MSG_MESSAGE_HIDDEN_S *pTmp = NULL;
2634 int lastMsgId = 0; /* for comparing same msg id. */
2636 while (dbHandle->stepQuery() == MSG_ERR_DB_ROW) {
2639 int msgid = dbHandle->columnInt(index++);
2640 MSG_DEBUG("msgid [%d]", msgid);
2642 if (lastMsgId != msgid) {
2643 MSG_DEBUG("lastMsgId != msgid");
2647 pTmp = new MSG_MESSAGE_HIDDEN_S;
2650 memset(pTmp, 0x00, sizeof(MSG_MESSAGE_HIDDEN_S));
2653 pTmp->pMmsData = NULL;
2654 pTmp->addressList = NULL;
2656 pTmp->msgId = msgid;
2658 pTmp->threadId = dbHandle->columnInt(index++);
2659 pTmp->folderId = dbHandle->columnInt(index++);
2660 pTmp->storageId = dbHandle->columnInt(index++);
2661 pTmp->mainType = dbHandle->columnInt(index++);
2662 pTmp->subType = dbHandle->columnInt(index++);
2663 pTmp->displayTime = (time_t)dbHandle->columnInt(index++);
2664 pTmp->dataSize = dbHandle->columnInt(index++);
2665 pTmp->networkStatus = dbHandle->columnInt(index++);
2666 pTmp->bRead = dbHandle->columnInt(index++);
2667 pTmp->bProtected = dbHandle->columnInt(index++);
2668 pTmp->bBackup = dbHandle->columnInt(index++);
2669 pTmp->priority = dbHandle->columnInt(index++);
2670 pTmp->direction = dbHandle->columnInt(index++);
2671 index++; /* This field is reserved. */
2673 strncpy(pTmp->subject, (char *)dbHandle->columnText(index++), MAX_SUBJECT_LEN);
2675 if (pTmp->mainType == MSG_MMS_TYPE &&
2676 (pTmp->networkStatus == MSG_NETWORK_RETRIEVING || pTmp->networkStatus == MSG_NETWORK_RETRIEVE_FAIL || pTmp->subType == MSG_NOTIFICATIONIND_MMS)) {
2680 pTmp->pData = (void *)new char[pTmp->dataSize+2];
2681 memset(pTmp->pData, 0x00, pTmp->dataSize+2);
2683 strncpy((char *)pTmp->pData, (char *)dbHandle->columnText(index++), pTmp->dataSize+1);
2686 pTmp->attachCount = dbHandle->columnInt(index++);
2688 strncpy(pTmp->thumbPath, (char *)dbHandle->columnText(index++), MSG_FILEPATH_LEN_MAX);
2690 pTmp->simIndex = dbHandle->columnInt(index++);
2692 pTmp->addr_list = (msg_struct_list_s *)new msg_struct_list_s;
2693 pTmp->addr_list->nCount = 0;
2694 pTmp->addr_list->msg_struct_info = (msg_struct_t *)calloc(MAX_TO_ADDRESS_CNT, sizeof(msg_struct_t));
2695 for (int i = 0; i < MAX_TO_ADDRESS_CNT; i++) {
2696 pTmp->addr_list->msg_struct_info[i] = (msg_struct_t)new msg_struct_s;
2697 memset(pTmp->addr_list->msg_struct_info[i], 0x00, sizeof(msg_struct_s));
2700 searchList.push(pTmp);
2704 MSG_DEBUG("lastMsgId == msgid");
2709 MSG_ADDRESS_INFO_S *pAddr = new MSG_ADDRESS_INFO_S;
2710 memset(pAddr, 0x00, sizeof(MSG_ADDRESS_INFO_S));
2712 pAddr->addressType = dbHandle->columnInt(index++);
2713 pAddr->recipientType = dbHandle->columnInt(index++);
2715 strncpy(pAddr->addressVal, (char *)dbHandle->columnText(index++), MAX_ADDRESS_VAL_LEN);
2717 strncpy(pAddr->displayName, pAddr->addressVal, MAX_DISPLAY_NAME_LEN);
2719 /* For GList *addressList */
2720 msg_struct_s *addr_info_s = new msg_struct_s;
2721 memset(addr_info_s, 0x00, sizeof(msg_struct_s));
2722 addr_info_s->type = MSG_STRUCT_ADDRESS_INFO;
2723 addr_info_s->data = new MSG_ADDRESS_INFO_S;
2724 memset(addr_info_s->data, 0x00, sizeof(MSG_ADDRESS_INFO_S));
2725 MSG_ADDRESS_INFO_S *addr_info = (MSG_ADDRESS_INFO_S *)addr_info_s->data;
2726 addr_info->addressType = pAddr->addressType;
2727 addr_info->recipientType = pAddr->recipientType;
2728 addr_info->contactId = pAddr->contactId;
2729 strncpy(addr_info->addressVal, pAddr->addressVal, MAX_ADDRESS_VAL_LEN);
2730 strncpy(addr_info->displayName, pAddr->displayName, MAX_DISPLAY_NAME_LEN);
2731 addr_info->displayName[MAX_DISPLAY_NAME_LEN] = '\0';
2733 pTmp->addressList = g_list_append(pTmp->addressList, addr_info_s);
2735 if (pTmp->addr_list->nCount >= MAX_TO_ADDRESS_CNT) {
2739 msg_struct_s *pStruct = (msg_struct_s *)pTmp->addr_list->msg_struct_info[pTmp->addr_list->nCount];
2740 pTmp->addr_list->nCount++;
2741 pStruct->type = MSG_STRUCT_ADDRESS_INFO;
2742 pStruct->data = pAddr;
2747 dbHandle->finalizeQuery();
2749 pMsgList->nCount = searchList.size();
2750 MSG_DEBUG("pMsgList->nCount [%d]", pMsgList->nCount);
2752 pMsgList->msg_struct_info = (msg_struct_t *)calloc(pMsgList->nCount, sizeof(msg_struct_t));
2753 if (pMsgList->msg_struct_info == NULL)
2754 return MSG_ERR_MEMORY_ERROR;
2757 while (!searchList.empty()) {
2758 msg_struct_s *msg = new msg_struct_s;
2760 pMsgList->msg_struct_info[offset++] = (msg_struct_t)msg;
2762 msg->type = MSG_STRUCT_MESSAGE_INFO;
2763 msg->data = searchList.front();
2770 free(escapeTextStr);
2772 if (escapeAddressStr)
2773 free(escapeAddressStr);
2779 msg_error_t MsgStoGetMediaList(const msg_thread_id_t threadId, msg_list_handle_t *pMediaList)
2782 msg_error_t err = MSG_SUCCESS;
2783 MsgDbHandler *dbHandle = getDbHandle();
2784 dbHandle->connectReadOnly();
2785 char sqlQuery[MAX_QUERY_LEN+1];
2788 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2789 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s WHERE MAIN_TYPE = %d AND CONV_ID = %d;",
2790 MSGFW_MESSAGE_TABLE_NAME, MSG_MMS_TYPE, threadId);
2792 MSG_DEBUG("sqlQuery = [%s]", sqlQuery);
2794 err = dbHandle->getTable(sqlQuery, &msgIdCnt, NULL);
2795 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
2796 dbHandle->freeTable();
2798 } else if (err == MSG_ERR_DB_NORECORD) {
2799 dbHandle->freeTable();
2803 msg_message_id_t msgIds[msgIdCnt];
2805 for (int i = 1; i <= msgIdCnt; i++) {
2806 msgIds[i-1] = dbHandle->getColumnToInt(i);
2809 dbHandle->freeTable();
2811 GList *media_list = NULL;
2813 for (int i = 0; i < msgIdCnt; i++) {
2814 memset(sqlQuery, 0x00, sizeof(sqlQuery));
2815 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID, CONTENT_TYPE, FILE_PATH, THUMB_FILE_PATH "
2816 "FROM %s WHERE MSG_ID = %d AND SEQ <> -1 AND (TCS_LEVEL = -1 OR MALWARE_ALLOW = 1);",
2817 MSGFW_MMS_MULTIPART_TABLE_NAME, msgIds[i]);
2819 int rowCnt = 0, msg_id = 0, index = 0;
2821 err = dbHandle->getTable(sqlQuery, &rowCnt, &index);
2823 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
2824 dbHandle->freeTable();
2828 MSG_MEDIA_INFO_S *pMedia = NULL;
2829 char mime_type[MAX_MIME_TYPE_LEN+1], media_item[MSG_FILEPATH_LEN_MAX+1], thumb_path[MSG_FILEPATH_LEN_MAX+1];
2831 for (int j = 0; j < rowCnt; j++) {
2832 msg_id = dbHandle->getColumnToInt(index++);
2833 memset(mime_type, 0x00, sizeof(mime_type));
2834 dbHandle->getColumnToString(index++, MAX_MIME_TYPE_LEN, mime_type);
2835 memset(media_item, 0x00, sizeof(media_item));
2836 dbHandle->getColumnToString(index++, MSG_FILEPATH_LEN_MAX, media_item);
2837 memset(thumb_path, 0x00, sizeof(thumb_path));
2838 dbHandle->getColumnToString(index++, MSG_FILEPATH_LEN_MAX, thumb_path);
2840 if (strstr(mime_type, "image") || strstr(mime_type, "video")) {
2841 msg_struct_s *media_struct_s = new msg_struct_s;
2842 media_struct_s->type = MSG_STRUCT_MEDIA_INFO;
2843 media_struct_s->data = new MSG_MEDIA_INFO_S;
2844 memset(media_struct_s->data, 0x00, sizeof(MSG_MEDIA_INFO_S));
2846 pMedia = (MSG_MEDIA_INFO_S *)media_struct_s->data;
2848 pMedia->msg_id = msg_id;
2849 snprintf(pMedia->mime_type, MAX_MIME_TYPE_LEN, "%s", mime_type);
2850 snprintf(pMedia->media_item, MSG_FILEPATH_LEN_MAX, "%s", media_item);
2851 snprintf(pMedia->thumb_path, MSG_FILEPATH_LEN_MAX, "%s", thumb_path);
2853 media_list = g_list_append(media_list, media_struct_s);
2857 dbHandle->freeTable();
2859 *pMediaList = (msg_list_handle_t)media_list;
2867 msg_error_t MsgStoDbSelectWithQuery(const char *szQuery, char ***db_res, int *row_count, int *col_count)
2871 msg_error_t err = MSG_SUCCESS;
2873 MsgDbHandler *dbHandle = getDbHandle();
2874 err = dbHandle->connectReadOnly();
2875 if (err != MSG_SUCCESS) {
2876 MSG_ERR("db connect (read only) is failed [%d]", err);
2880 char *zSQL = sqlite3_mprintf("SELECT %q;", szQuery);
2883 err = dbHandle->getTableWithResult((const char *)zSQL, db_res, row_count, col_count);
2887 THROW(MsgException::INVALID_RESULT, "sqlite3_mprintf() is failed");
2890 MSG_DEBUG("getTableWithResult :: row_count=[%d], col_count=[%d]", *row_count, *col_count);
2892 if (err == MSG_ERR_DB_NORECORD) {
2893 dbHandle->freeTable(*db_res);
2896 } else if (err != MSG_SUCCESS) {
2897 MSG_DEBUG("Fail to getTable().");
2898 dbHandle->freeTable(*db_res);
2906 void MsgStoDbFree(char **db_res)
2908 MsgDbHandler *dbHandle = getDbHandle();
2909 dbHandle->freeTable(db_res);
2913 #ifdef FEATURE_SMS_CDMA
2914 msg_error_t MsgStoClearUniquenessTable()
2918 msg_error_t err = MSG_SUCCESS;
2920 MsgDbHandler *dbHandle = getDbHandle();
2922 char sqlQuery[MAX_QUERY_LEN+1] = {0, };
2923 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE MSG_ID = 0", MSGFW_UNIQUENESS_INFO_TABLE_NAME);
2925 err = dbHandle->execQuery(sqlQuery);