3 * Copyright (c) 2000-2012 Samsung Electronics Co., Ltd. All Rights Reserved.
5 * This file is part of msg-service.
7 * Contact: Jaeyun Jeong <jyjeong@samsung.com>
8 * Sangkoo Kim <sangkoo.kim@samsung.com>
9 * Seunghwan Lee <sh.cat.lee@samsung.com>
10 * SoonMin Jung <sm0415.jung@samsung.com>
11 * Jae-Young Lee <jy4710.lee@samsung.com>
12 * KeeBum Kim <keebum.kim@samsung.com>
14 * PROPRIETARY/CONFIDENTIAL
16 * This software is the confidential and proprietary information of
17 * SAMSUNG ELECTRONICS ("Confidential Information"). You shall not
18 * disclose such Confidential Information and shall use it only in
19 * accordance with the terms of the license agreement you entered
20 * into with SAMSUNG ELECTRONICS.
22 * SAMSUNG make no representations or warranties about the suitability
23 * of the software, either express or implied, including but not limited
24 * to the implied warranties of merchantability, fitness for a particular
25 * purpose, or non-infringement. SAMSUNG shall not be liable for any
26 * damages suffered by licensee as a result of using, modifying or
27 * distributing this software or its derivatives.
32 #include "MsgUtilFile.h"
33 #include "MsgContact.h"
34 #include "MsgCppTypes.h"
35 #include "MsgGconfWrapper.h"
36 #include "MsgNotificationWrapper.h"
37 #include "MsgUtilStorage.h"
43 static int msgCntLimit[MSG_COUNT_LIMIT_MAILBOX_TYPE_MAX][MSG_COUNT_LIMIT_MSG_TYPE_MAX] = {{1500, 500, 0, 50, 50}, {50, 50, 0, 0, 0}, {1000, 250, 0, 0, 0}, {50, 50, 0, 0, 0}, {0, 0, 200, 0, 0}};
46 /*==================================================================================================
47 FUNCTION IMPLEMENTATION
48 ==================================================================================================*/
49 unsigned int MsgStoAddMessageTable(MsgDbHandler *pDbHandle, const MSG_MESSAGE_INFO_S *pMsgInfo, unsigned int AddrId)
53 MSG_ERROR_T err = MSG_SUCCESS;
55 unsigned int msgId = 0;
57 err = pDbHandle->getRowId(MSGFW_MESSAGE_TABLE_NAME, &msgId);
59 if (err != MSG_SUCCESS)
66 char* pFileData = NULL;
67 AutoPtr<char> buf(&pFileData);
70 if (pMsgInfo->bTextSms == false)
72 if (MsgOpenAndReadFile(pMsgInfo->msgData, &pFileData, &fileSize) == false)
75 MSG_DEBUG("file size [%d]", fileSize);
79 char sqlQuery[MAX_QUERY_LEN+1];
81 memset(sqlQuery, 0x00, sizeof(sqlQuery));
83 snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, %d, %d, %d, %d, %d, %d, %ld, %d, %d, %d, %d, %d, %d, %ld, %d, ?, ?, ?, ?, %d, 0, %d, 0, 0);",
84 MSGFW_MESSAGE_TABLE_NAME, msgId, AddrId, pMsgInfo->folderId, msgId, pMsgInfo->storageId,
85 pMsgInfo->msgType.mainType, pMsgInfo->msgType.subType, pMsgInfo->displayTime, pMsgInfo->dataSize,
86 pMsgInfo->networkStatus, pMsgInfo->bRead, pMsgInfo->bProtected, pMsgInfo->priority,
87 pMsgInfo->direction, pMsgInfo->scheduledTime, pMsgInfo->bBackup, MSG_DELIVERY_REPORT_NONE, MSG_READ_REPORT_NONE);
89 MSG_DEBUG("QUERY : %s", sqlQuery);
91 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
96 pDbHandle->bindText(pMsgInfo->subject, 1);
98 pDbHandle->bindText(pMsgInfo->msgData, 2);
100 pDbHandle->bindText(pMsgInfo->thumbPath, 3);
102 if (pMsgInfo->bTextSms == false)
103 pDbHandle->bindText(pFileData, 4);
105 pDbHandle->bindText(pMsgInfo->msgText, 4);
107 if (pDbHandle->stepQuery() != MSG_ERR_DB_DONE)
109 pDbHandle->finalizeQuery();
113 pDbHandle->finalizeQuery();
119 MSG_ERROR_T MsgStoSetReadStatus(MsgDbHandler *pDbHandle, MSG_MESSAGE_ID_T MsgId, bool bRead)
121 char sqlQuery[MAX_QUERY_LEN+1];
123 memset(sqlQuery, 0x00, sizeof(sqlQuery));
124 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET READ_STATUS = %d WHERE MSG_ID = %d;",
125 MSGFW_MESSAGE_TABLE_NAME, (int)bRead, MsgId);
127 if (pDbHandle->execQuery(sqlQuery) != MSG_SUCCESS)
128 return MSG_ERR_DB_EXEC;
130 // Get MAIN_TYPE, SUB_TYPE, STORAGE_ID
131 memset(sqlQuery, 0x00, sizeof(sqlQuery));
132 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.MAIN_TYPE, A.SUB_TYPE, B.CONTACT_ID, B.ADDRESS_ID \
134 WHERE A.MSG_ID = %d AND A.ADDRESS_ID = B.ADDRESS_ID;",
135 MSGFW_MESSAGE_TABLE_NAME, MSGFW_ADDRESS_TABLE_NAME, MsgId);
137 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
138 return MSG_ERR_DB_PREPARE;
140 MSG_MESSAGE_TYPE_S msgType;
141 MSG_CONTACT_ID_T contactId;
144 if (pDbHandle->stepQuery() == MSG_ERR_DB_ROW)
146 msgType.mainType = pDbHandle->columnInt(0);
147 msgType.subType = pDbHandle->columnInt(1);
148 contactId = pDbHandle->columnInt(2);
149 addrId = pDbHandle->columnInt(3);
153 pDbHandle->finalizeQuery();
154 return MSG_ERR_DB_STEP;
157 pDbHandle->finalizeQuery();
159 MSG_DEBUG("Main Type:[%d] SubType:[%d] ContactId:[%d] AddrId:[%d]", msgType.mainType, msgType.subType, contactId, addrId);
161 if (MsgStoUpdateAddress(pDbHandle, addrId) != MSG_SUCCESS)
163 MSG_DEBUG("MsgStoUpdateAddress() Error");
164 return MSG_ERR_STORAGE_ERROR;
167 int smsCnt = 0, mmsCnt = 0;
169 smsCnt = MsgStoGetUnreadCnt(pDbHandle, MSG_SMS_TYPE);
170 mmsCnt = MsgStoGetUnreadCnt(pDbHandle, MSG_MMS_TYPE);
172 MsgSettingSetIndicator(smsCnt, mmsCnt);
174 MsgDeleteNotiByMsgId(MsgId);
180 MSG_ERROR_T MsgStoGetOldestMessage(MsgDbHandler *pDbHandle, const MSG_MESSAGE_INFO_S *pMsgInfo, MSG_MESSAGE_ID_T *pMsgId)
182 char sqlQuery[MAX_QUERY_LEN+1];
184 memset(sqlQuery, 0x00, sizeof(sqlQuery));
186 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID \
188 WHERE SUB_TYPE = %d AND FOLDER_ID = %d AND STORAGE_ID = %d AND PROTECTED = 0 \
189 ORDER BY DISPLAY_TIME ASC",
190 MSGFW_MESSAGE_TABLE_NAME, pMsgInfo->msgType.subType, pMsgInfo->folderId, MSG_STORAGE_PHONE);
192 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
193 return MSG_ERR_DB_PREPARE;
195 if (pDbHandle->stepQuery() == MSG_ERR_DB_ROW)
197 *pMsgId = pDbHandle->columnInt(0);
201 pDbHandle->finalizeQuery();
202 return MSG_ERR_DB_STEP;
205 pDbHandle->finalizeQuery();
211 MSG_ERROR_T MsgStoCheckMsgCntFull(MsgDbHandler *pDbHandle, const MSG_MESSAGE_TYPE_S* pMsgType, MSG_FOLDER_ID_T FolderId)
215 MSG_ERROR_T err = MSG_SUCCESS;
217 struct statfs buf = {0};
219 if (statfs(MSG_DATA_ROOT_PATH, &buf) == -1)
221 MSG_DEBUG("statfs(\"%s\") failed - %d", MSG_DATA_ROOT_PATH);
222 return MSG_ERR_STORAGE_ERROR;
225 unsigned long freeSpace = (buf.f_bfree * buf.f_bsize);
227 MSG_DEBUG("f_bfree [%d] f_bsize [%d]", buf.f_bfree, buf.f_bsize);
228 MSG_DEBUG("Free space of storage is [%ul] MB.", freeSpace);
230 if (freeSpace < SMS_MINIMUM_SPACE && pMsgType->mainType == MSG_SMS_TYPE)
231 err = MSG_ERR_MESSAGE_COUNT_FULL;
232 else if(freeSpace < MMS_MINIMUM_SPACE && pMsgType->mainType == MSG_MMS_TYPE)
233 err = MSG_ERR_MESSAGE_COUNT_FULL;
243 MSG_ERROR_T MsgStoCountMsgByLimitCategory(MsgDbHandler *pDbHandle, const MSG_MESSAGE_TYPE_S *pMsgType, int *pMsgCount, MSG_FOLDER_ID_T folderId )
245 if (pMsgType == NULL)
247 MSG_DEBUG("pMsgType is NULL");
248 return MSG_ERR_NULL_POINTER;
253 char sqlQuery[MAX_QUERY_LEN+1];
254 memset(sqlQuery, 0x00, sizeof(sqlQuery));
256 if ((pMsgType->mainType == MSG_SMS_TYPE) && (pMsgType->subType == MSG_WAP_SI_SMS ||pMsgType->subType == MSG_WAP_SL_SMS)) // PUSH
258 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s WHERE MAIN_TYPE = %d AND SUB_TYPE IN (%d, %d) AND FOLDER_ID = %d;",
259 MSGFW_MESSAGE_TABLE_NAME, pMsgType->mainType, MSG_WAP_SI_SMS, MSG_WAP_SL_SMS, MSG_INBOX_ID);
261 else if ((pMsgType->mainType == MSG_SMS_TYPE) && (pMsgType->subType == MSG_CB_SMS)) // CB
263 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s WHERE MAIN_TYPE = %d AND SUB_TYPE IN (%d) AND FOLDER_ID = %d;",
264 MSGFW_MESSAGE_TABLE_NAME, pMsgType->mainType, MSG_CB_SMS, MSG_CBMSGBOX_ID);
266 else if ((pMsgType->mainType == MSG_SMS_TYPE) && (pMsgType->subType == MSG_SYNCML_CP)) // Provision
268 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s WHERE MAIN_TYPE = %d AND SUB_TYPE IN (%d) AND FOLDER_ID = %d;",
269 MSGFW_MESSAGE_TABLE_NAME, pMsgType->mainType, MSG_SYNCML_CP, MSG_INBOX_ID);
271 else if ((pMsgType->mainType == MSG_SMS_TYPE)) // SMS
273 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;",
274 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
276 else if ((pMsgType->mainType == MSG_MMS_TYPE) && (pMsgType->subType == MSG_SENDREQ_MMS || pMsgType->subType == MSG_SENDCONF_MMS || pMsgType->subType == MSG_RETRIEVE_AUTOCONF_MMS || pMsgType->subType == MSG_RETRIEVE_MANUALCONF_MMS || pMsgType->subType == MSG_NOTIFICATIONIND_MMS)) // MMS
278 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;",
279 MSGFW_MESSAGE_TABLE_NAME, pMsgType->mainType, MSG_SENDREQ_MMS, MSG_SENDCONF_MMS, MSG_RETRIEVE_AUTOCONF_MMS, MSG_RETRIEVE_MANUALCONF_MMS, MSG_NOTIFICATIONIND_MMS, folderId);
283 return MSG_ERR_INVALID_PARAMETER;
286 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
287 return MSG_ERR_DB_PREPARE;
289 if (pDbHandle->stepQuery() == MSG_ERR_DB_ROW)
291 *pMsgCount = pDbHandle->columnInt(0);
295 pDbHandle->finalizeQuery();
296 return MSG_ERR_DB_STEP;
299 pDbHandle->finalizeQuery();
305 int MsgStoCheckMsgCntLimit(const MSG_MESSAGE_TYPE_S* pMsgType, MSG_FOLDER_ID_T FolderId)
313 msgboxType = MSG_COUNT_LIMIT_INBOX_TYPE;
317 msgboxType = MSG_COUNT_LIMIT_OUTBOX_TYPE;
320 case MSG_SENTBOX_ID :
321 msgboxType = MSG_COUNT_LIMIT_SENTBOX_TYPE;
325 msgboxType = MSG_COUNT_LIMIT_DRAFTBOX_TYPE;
328 case MSG_CBMSGBOX_ID :
329 msgboxType = MSG_COUNT_LIMIT_CBMSGBOX_TYPE;
333 MSG_DEBUG("Unknown mailbox Type [%d]", FolderId);
337 switch (pMsgType->subType)
340 case MSG_REPLACE_TYPE1_SMS:
341 case MSG_REPLACE_TYPE2_SMS:
342 case MSG_REPLACE_TYPE3_SMS:
343 case MSG_REPLACE_TYPE4_SMS:
344 case MSG_REPLACE_TYPE5_SMS:
345 case MSG_REPLACE_TYPE6_SMS:
346 case MSG_REPLACE_TYPE7_SMS:
347 case MSG_MWI_VOICE_SMS:
348 case MSG_MWI_FAX_SMS:
349 case MSG_MWI_EMAIL_SMS:
350 case MSG_MWI_OTHER_SMS:
351 case MSG_STATUS_REPORT_SMS:
352 msgType = MSG_COUNT_LIMIT_SMS_TYPE;
356 msgType = MSG_COUNT_LIMIT_CB_TYPE;
361 msgType = MSG_COUNT_LIMIT_WAPPUSH_TYPE;
365 msgType = MSG_COUNT_LIMIT_PROVISION_TYPE;
368 case MSG_SENDREQ_MMS:
369 case MSG_SENDCONF_MMS:
370 case MSG_NOTIFICATIONIND_MMS:
371 case MSG_RETRIEVE_AUTOCONF_MMS:
372 case MSG_RETRIEVE_MANUALCONF_MMS:
373 msgType = MSG_COUNT_LIMIT_MMS_TYPE;
377 MSG_DEBUG("Unknown Message Type [%d]", pMsgType->subType);
381 return msgCntLimit[msgboxType][msgType];
385 MSG_ERROR_T MsgStoAddAddress(MsgDbHandler *pDbHandle, const MSG_ADDRESS_INFO_S *pAddrInfo, unsigned int *pAddrId)
387 MSG_ERROR_T err = MSG_SUCCESS;
389 char sqlQuery[MAX_QUERY_LEN+1];
391 // Check if new address or not
392 if (MsgExistAddress(pDbHandle, pAddrInfo->addressVal, pAddrId) == true)
394 MSG_DEBUG("The address already exists. ID : [%d], Value : [%s]", *pAddrId, pAddrInfo->addressVal);
399 MSG_CONTACT_INFO_S contactInfo = {0};
401 err = MsgGetContactInfo(pAddrInfo, &contactInfo);
403 if (err != MSG_SUCCESS)
405 MSG_DEBUG("MsgGetContactInfo() fail [%d]", err);
409 if (pDbHandle->getRowId(MSGFW_ADDRESS_TABLE_NAME, pAddrId) != MSG_SUCCESS)
415 memset(sqlQuery, 0x00, sizeof(sqlQuery));
416 snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, %d, %d, '%s', %d, ?, ?, ?, '%s', 0, 0, 0, 0, 0, 0, 0, 0, '');",
417 MSGFW_ADDRESS_TABLE_NAME, *pAddrId, pAddrInfo->addressType, pAddrInfo->recipientType, pAddrInfo->addressVal,
418 contactInfo.contactId, contactInfo.imagePath);
420 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
421 return MSG_ERR_DB_PREPARE;
423 pDbHandle->bindText(contactInfo.displayName, 1);
424 pDbHandle->bindText(contactInfo.firstName, 2);
425 pDbHandle->bindText(contactInfo.lastName, 3);
427 if (pDbHandle->stepQuery() != MSG_ERR_DB_DONE)
429 pDbHandle->finalizeQuery();
430 MSG_DEBUG("Add Address Info. Fail [%s]", sqlQuery);
431 return MSG_ERR_DB_STEP;
434 pDbHandle->finalizeQuery();
440 MSG_ERROR_T MsgStoUpdateAddress(MsgDbHandler *pDbHandle, unsigned int AddrId)
444 MSG_ERROR_T err = MSG_SUCCESS;
446 int unreadCnt = 0, smsCnt = 0, mmsCnt = 0;
448 char msgText[MAX_THREAD_DATA_LEN+1];
449 char sqlQuery[MAX_QUERY_LEN+1];
452 memset(sqlQuery, 0x00, sizeof(sqlQuery));
454 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s \
455 WHERE ADDRESS_ID = %d \
457 AND READ_STATUS = 0;",
458 MSGFW_MESSAGE_TABLE_NAME, AddrId, MSG_INBOX_ID);
460 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
461 return MSG_ERR_DB_PREPARE;
463 err = pDbHandle->stepQuery();
465 if (err == MSG_ERR_DB_ROW)
467 unreadCnt = pDbHandle->columnInt(0);
469 else if (err != MSG_ERR_DB_DONE)
471 pDbHandle->finalizeQuery();
472 return MSG_ERR_DB_STEP;
475 pDbHandle->finalizeQuery();
478 memset(sqlQuery, 0x00, sizeof(sqlQuery));
480 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s \
481 WHERE ADDRESS_ID = %d \
483 AND FOLDER_ID > 0 AND FOLDER_ID < %d;",
484 MSGFW_MESSAGE_TABLE_NAME, AddrId, MSG_SMS_TYPE, MSG_CBMSGBOX_ID);
486 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
487 return MSG_ERR_DB_PREPARE;
489 err = pDbHandle->stepQuery();
491 if (err == MSG_ERR_DB_ROW)
493 smsCnt = pDbHandle->columnInt(0);
495 else if (err != MSG_ERR_DB_DONE)
497 pDbHandle->finalizeQuery();
498 return MSG_ERR_DB_STEP;
501 pDbHandle->finalizeQuery();
504 memset(sqlQuery, 0x00, sizeof(sqlQuery));
506 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s \
507 WHERE ADDRESS_ID = %d \
509 AND SUB_TYPE NOT IN (%d, %d, %d) \
510 AND FOLDER_ID > 0 AND FOLDER_ID < %d;",
511 MSGFW_MESSAGE_TABLE_NAME, AddrId, MSG_MMS_TYPE, MSG_DELIVERYIND_MMS,
512 MSG_READRECIND_MMS, MSG_READORGIND_MMS, MSG_CBMSGBOX_ID);
514 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
515 return MSG_ERR_DB_PREPARE;
517 err = pDbHandle->stepQuery();
519 if (err == MSG_ERR_DB_ROW)
521 mmsCnt = pDbHandle->columnInt(0);
523 else if (err != MSG_ERR_DB_DONE)
525 pDbHandle->finalizeQuery();
526 return MSG_ERR_DB_STEP;
529 pDbHandle->finalizeQuery();
531 // Get Latest Msg Data
532 MSG_MAIN_TYPE_T mainType = MSG_UNKNOWN_TYPE;
533 MSG_SUB_TYPE_T subType = MSG_NORMAL_SMS;
534 MSG_DIRECTION_TYPE_T direction = MSG_DIRECTION_TYPE_MO;
537 memset(sqlQuery, 0x00, sizeof(sqlQuery));
539 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MAIN_TYPE, SUB_TYPE, MSG_DIRECTION, DISPLAY_TIME, SUBJECT, MSG_TEXT FROM %s \
540 WHERE ADDRESS_ID = %d \
541 AND FOLDER_ID > 0 AND FOLDER_ID < %d \
542 ORDER BY DISPLAY_TIME DESC;",
543 MSGFW_MESSAGE_TABLE_NAME, AddrId, MSG_CBMSGBOX_ID);
545 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
546 return MSG_ERR_DB_PREPARE;
548 err = pDbHandle->stepQuery();
550 if (err == MSG_ERR_DB_ROW)
552 mainType = pDbHandle->columnInt(0);
553 subType = pDbHandle->columnInt(1);
554 direction = pDbHandle->columnInt(2);
556 msgTime = (time_t)pDbHandle->columnInt(3);
558 memset(msgText, 0x00, sizeof(msgText));
560 if (mainType == MSG_SMS_TYPE)
562 if (pDbHandle->columnText(5) != NULL)
563 strncpy(msgText, (char*)pDbHandle->columnText(5), MAX_THREAD_DATA_LEN);
565 else if (mainType == MSG_MMS_TYPE)
567 if (pDbHandle->columnText(4) != NULL)
569 strncpy(msgText, (char*)pDbHandle->columnText(4), MAX_THREAD_DATA_LEN);
572 if ((strlen(msgText) <= 0) && (pDbHandle->columnText(5) != NULL) && (subType != MSG_NOTIFICATIONIND_MMS))
574 memset(msgText, 0x00, sizeof(msgText));
575 strncpy(msgText, (char*)pDbHandle->columnText(5), MAX_THREAD_DATA_LEN);
579 else if (err != MSG_ERR_DB_DONE)
581 pDbHandle->finalizeQuery();
582 return MSG_ERR_DB_STEP;
585 pDbHandle->finalizeQuery();
587 // Update Address Table
588 memset(sqlQuery, 0x00, sizeof(sqlQuery));
590 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET UNREAD_CNT = %d, SMS_CNT = %d, MMS_CNT = %d, MAIN_TYPE = %d, SUB_TYPE = %d, MSG_DIRECTION = %d, MSG_TIME = %ld, MSG_TEXT = ? \
591 WHERE ADDRESS_ID = %d;",
592 MSGFW_ADDRESS_TABLE_NAME, unreadCnt, smsCnt, mmsCnt, mainType, subType, direction, msgTime, AddrId);
594 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
595 return MSG_ERR_DB_PREPARE;
597 pDbHandle->bindText(msgText, 1);
599 if (pDbHandle->stepQuery() != MSG_ERR_DB_DONE)
601 pDbHandle->finalizeQuery();
602 MSG_DEBUG("Update Address Info. Fail [%d] [%s]", err, sqlQuery);
603 return MSG_ERR_DB_STEP;
606 pDbHandle->finalizeQuery();
614 MSG_ERROR_T MsgStoClearAddressTable(MsgDbHandler *pDbHandle)
616 MSG_ERROR_T err = MSG_SUCCESS;
618 char sqlQuery[MAX_QUERY_LEN+1];
620 memset(sqlQuery, 0x00, sizeof(sqlQuery));
622 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s \
623 WHERE ADDRESS_ID NOT IN (SELECT ADDRESS_ID FROM %s) \
624 AND ADDRESS_ID <> 0;",
625 MSGFW_ADDRESS_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME);
627 err = pDbHandle->execQuery(sqlQuery);
633 void MsgConvertNumber(const char* pSrcNum, char* pDestNum)
638 overLen = strlen(pSrcNum) - MAX_PRECONFIG_NUM;
640 for (i = 0; i < MAX_PRECONFIG_NUM; i++)
641 pDestNum[i] = pSrcNum[i+overLen];
647 bool MsgExistAddress(MsgDbHandler *pDbHandle, const char *pAddress, unsigned int *pAddrId)
649 MSG_ERROR_T err = MSG_SUCCESS;
651 char sqlQuery[MAX_QUERY_LEN+1];
655 if (strlen(pAddress) > MAX_PRECONFIG_NUM)
657 char newPhoneNum[MAX_PRECONFIG_NUM+1];
659 memset(newPhoneNum, 0x00, sizeof(newPhoneNum));
661 MsgConvertNumber(pAddress, newPhoneNum);
663 memset(sqlQuery, 0x00, sizeof(sqlQuery));
665 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT ADDRESS_ID FROM %s WHERE ADDRESS_VAL LIKE '%%%%%s';",
666 MSGFW_ADDRESS_TABLE_NAME, newPhoneNum);
670 memset(sqlQuery, 0x00, sizeof(sqlQuery));
672 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT ADDRESS_ID FROM %s WHERE ADDRESS_VAL = '%s';",
673 MSGFW_ADDRESS_TABLE_NAME, pAddress);
676 int rowCnt = 0, addrId = 0;
678 err = pDbHandle->getTable(sqlQuery, &rowCnt);
680 // No record or other error
681 if (err != MSG_SUCCESS)
683 pDbHandle->freeTable();
687 addrId = pDbHandle->getColumnToInt(1);
689 MSG_DEBUG("AddressId : [%d]", addrId);
695 pDbHandle->freeTable();
700 pDbHandle->freeTable();
704 pDbHandle->freeTable();
710 int MsgStoGetUnreadCnt(MsgDbHandler *pDbHandle, MSG_MAIN_TYPE_T MsgType)
714 char sqlQuery[MAX_QUERY_LEN+1];
716 memset(sqlQuery, 0x00, sizeof(sqlQuery));
718 if (MsgType == MSG_SMS_TYPE)
720 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s \
721 WHERE MAIN_TYPE = %d AND SUB_TYPE IN (%d, %d, %d, %d, %d, %d, %d) AND \
722 FOLDER_ID = %d AND READ_STATUS = 0;",
723 MSGFW_MESSAGE_TABLE_NAME, MSG_SMS_TYPE, 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, MSG_INBOX_ID);
725 else if (MsgType == MSG_MMS_TYPE)
727 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s \
728 WHERE MAIN_TYPE = %d AND SUB_TYPE IN (%d, %d, %d) AND \
729 FOLDER_ID = %d AND READ_STATUS = 0;",
730 MSGFW_MESSAGE_TABLE_NAME, MSG_MMS_TYPE, MSG_RETRIEVE_AUTOCONF_MMS, MSG_RETRIEVE_MANUALCONF_MMS, MSG_NOTIFICATIONIND_MMS, MSG_INBOX_ID);
733 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
736 if (pDbHandle->stepQuery() == MSG_ERR_DB_ROW)
738 msgCnt = pDbHandle->columnInt(0);
742 pDbHandle->finalizeQuery();
746 pDbHandle->finalizeQuery();
752 MSG_ERROR_T MsgStoAddContactInfo(MsgDbHandler *pDbHandle, MSG_CONTACT_INFO_S *pContactInfo, const char *pNumber)
754 char newPhoneNum[MAX_PRECONFIG_NUM+1];
755 char sqlQuery[MAX_QUERY_LEN+1];
757 if (strlen(pNumber) > MAX_PRECONFIG_NUM)
759 memset(newPhoneNum, 0x00, sizeof(newPhoneNum));
760 MsgConvertNumber(pNumber, newPhoneNum);
762 MSG_DEBUG("Phone Number to Compare : [%s]", newPhoneNum);
764 memset(sqlQuery, 0x00, sizeof(sqlQuery));
765 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE MSG_ADDRESS_TABLE SET CONTACT_ID = %d, DISPLAY_NAME = ?, FIRST_NAME = ?, LAST_NAME = ?, IMAGE_PATH = '%s' \
766 WHERE ADDRESS_VAL LIKE '%%%%%s';",
767 pContactInfo->contactId,
768 pContactInfo->imagePath,
773 memset(sqlQuery, 0x00, sizeof(sqlQuery));
774 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE MSG_ADDRESS_TABLE SET CONTACT_ID = %d, DISPLAY_NAME = ?, FIRST_NAME = ?, LAST_NAME = ?, IMAGE_PATH = '%s' \
775 WHERE ADDRESS_VAL = '%s';",
776 pContactInfo->contactId,
777 pContactInfo->imagePath,
781 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
782 return MSG_ERR_DB_PREPARE;
784 pDbHandle->bindText(pContactInfo->displayName, 1);
786 pDbHandle->bindText(pContactInfo->firstName, 2);
788 pDbHandle->bindText(pContactInfo->lastName, 3);
790 if (pDbHandle->stepQuery() != MSG_ERR_DB_DONE)
792 pDbHandle->finalizeQuery();
793 MSG_DEBUG("Update contact Info. Fail [%s]", sqlQuery);
794 return MSG_ERR_DB_STEP;
797 pDbHandle->finalizeQuery();
803 MSG_ERROR_T MsgStoClearContactInfo(MsgDbHandler *pDbHandle, int ContactId)
805 char sqlQuery[MAX_QUERY_LEN+1];
807 memset(sqlQuery, 0x00, sizeof(sqlQuery));
809 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE MSG_ADDRESS_TABLE SET CONTACT_ID = 0, DISPLAY_NAME = '', FIRST_NAME = '', LAST_NAME = '', IMAGE_PATH = '' \
810 WHERE CONTACT_ID = %d;", ContactId);
812 if (pDbHandle->execQuery(sqlQuery) != MSG_SUCCESS)
814 MSG_DEBUG("Fail to execute query");
815 return MSG_ERR_DB_EXEC;
822 MSG_ERROR_T MsgStoClearContactInfo(MsgDbHandler *pDbHandle, int ContactId, const char *pNumber)
824 char newPhoneNum[MAX_PRECONFIG_NUM+1];
825 char sqlQuery[MAX_QUERY_LEN+1];
827 memset(newPhoneNum, 0x00, sizeof(newPhoneNum));
828 memset(sqlQuery, 0x00, sizeof(sqlQuery));
830 if (strlen(pNumber) > MAX_PRECONFIG_NUM)
832 MsgConvertNumber(pNumber, newPhoneNum);
834 MSG_DEBUG("Phone Number to Compare : [%s]", newPhoneNum);
836 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE MSG_ADDRESS_TABLE SET CONTACT_ID = 0, DISPLAY_NAME = '', FIRST_NAME = '', LAST_NAME = '', IMAGE_PATH = '' \
837 WHERE CONTACT_ID = %d AND ADDRESS_VAL NOT LIKE '%%%s';", ContactId, newPhoneNum);
841 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE MSG_ADDRESS_TABLE SET CONTACT_ID = 0, DISPLAY_NAME = '', FIRST_NAME = '', LAST_NAME = '', IMAGE_PATH = '' \
842 WHERE CONTACT_ID = %d AND ADDRESS_VAL <> '%s';", ContactId, pNumber);
845 if (pDbHandle->execQuery(sqlQuery) != MSG_SUCCESS)
847 MSG_DEBUG("Fail to execute query");
848 return MSG_ERR_DB_EXEC;
855 MSG_ERROR_T MsgStoGetMmsRawFilePath(MsgDbHandler *pDbHandle, MSG_MESSAGE_ID_T msgId, char *pFilePath)
857 char sqlQuery[MAX_QUERY_LEN+1];
859 memset(sqlQuery, 0x00, sizeof(sqlQuery));
861 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT FILE_PATH FROM %s WHERE REFERENCE_ID IN \
862 (SELECT REFERENCE_ID FROM %s WHERE MSG_ID = %d);",
863 MMS_PLUGIN_MESSAGE_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME, msgId);
865 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
866 return MSG_ERR_DB_PREPARE;
868 if (pDbHandle->stepQuery() == MSG_ERR_DB_ROW)
870 if (pDbHandle->columnText(0) != NULL)
872 strncpy(pFilePath, (char*)pDbHandle->columnText(0), MSG_FILEPATH_LEN_MAX);
877 pDbHandle->finalizeQuery();
878 return MSG_ERR_DB_STEP;
881 pDbHandle->finalizeQuery();
887 bool MsgStoCheckReadReportRequested(MsgDbHandler *pDbHandle, MSG_MESSAGE_ID_T MsgId)
889 MSG_ERROR_T err = MSG_SUCCESS;
891 char sqlQuery[MAX_QUERY_LEN+1];
893 bool bReadReportRequested = false;
895 memset(sqlQuery, 0x00, sizeof(sqlQuery));
897 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT ASK_READ_REPLY FROM %s WHERE REFERENCE_ID IN \
898 (SELECT REFERENCE_ID FROM %s WHERE MSG_ID = %d);",
899 MMS_PLUGIN_ATTRIBUTE_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME, MsgId);
901 err = pDbHandle->getTable(sqlQuery, &rowCnt);
903 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD)
905 pDbHandle->freeTable();
906 MSG_DEBUG("[Error]Failed to Get Table");
907 return bReadReportRequested;
912 pDbHandle->freeTable();
913 MSG_DEBUG("[Error]MSG_ERR_DB_NORECORD");
914 return bReadReportRequested;
917 bReadReportRequested = pDbHandle->getColumnToInt(1);
919 pDbHandle->freeTable();
921 return bReadReportRequested;
925 bool MsgStoCheckReadReportIsSent(MsgDbHandler *pDbHandle, MSG_MESSAGE_ID_T MsgId)
927 MSG_ERROR_T err = MSG_SUCCESS;
929 char sqlQuery[MAX_QUERY_LEN+1];
932 bool bReadReportIsSent = true;
934 memset(sqlQuery, 0x00, sizeof(sqlQuery));
936 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT READ_REPORT_SENT FROM %s WHERE REFERENCE_ID IN \
937 (SELECT REFERENCE_ID FROM %s WHERE MSG_ID = %d);",
938 MMS_PLUGIN_ATTRIBUTE_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME, MsgId);
940 err = pDbHandle->getTable(sqlQuery, &rowCnt);
942 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD)
944 pDbHandle->freeTable();
945 MSG_DEBUG("[Error]Failed to Get Table");
946 return bReadReportIsSent;
951 pDbHandle->freeTable();
952 MSG_DEBUG("[Error]MSG_ERR_DB_NORECORD");
953 return bReadReportIsSent;
956 bReadReportIsSent = (bool)pDbHandle->getColumnToInt(1);
958 pDbHandle->freeTable();
960 return bReadReportIsSent;
963 char *MsgStoReplaceString(const char *origStr, const char *oldStr, const char *newStr)
968 char *replaceStr = NULL;
976 if (g_strcmp0(oldStr, newStr) != 0) {
977 oldStrLen = strlen(oldStr);
978 newStrLen = strlen(newStr);
980 for (i = 0; origStr[i] != '\0';) {
981 if (memcmp(&origStr[i], oldStr, oldStrLen) == 0) {
989 return g_strdup(origStr);
992 replaceStr = (char *)calloc(1, i + sizeof(char) * (matchedCnt * (newStrLen - oldStrLen) + 1));
993 if (replaceStr == NULL)
999 if (memcmp(origStr, oldStr, oldStrLen) == 0) {
1000 memcpy(pTemp, newStr, newStrLen);
1002 origStr += oldStrLen;
1004 *pTemp++ = *origStr++;