2 * Copyright 2012-2013 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.1 (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://floralicense.org/license/
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.
18 #include "MsgUtilFile.h"
19 #include "MsgContact.h"
20 #include "MsgCppTypes.h"
21 #include "MsgGconfWrapper.h"
22 #include "MsgNotificationWrapper.h"
23 #include "MsgUtilStorage.h"
30 #define DB_MSG_SERVICE_GROUPE 6011
32 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}};
35 /*==================================================================================================
36 FUNCTION IMPLEMENTATION
37 ==================================================================================================*/
38 unsigned int MsgStoAddMessageTable(MsgDbHandler *pDbHandle, const MSG_MESSAGE_INFO_S *pMsgInfo)
42 msg_error_t err = MSG_SUCCESS;
44 msg_message_id_t msgId = 0;
46 err = pDbHandle->getRowId(MSGFW_MESSAGE_TABLE_NAME, &msgId);
48 if (err != MSG_SUCCESS)
53 char* pFileData = NULL;
54 AutoPtr<char> buf(&pFileData);
57 if (pMsgInfo->bTextSms == false) {
58 if (MsgOpenAndReadFile(pMsgInfo->msgData, &pFileData, &fileSize) == false)
61 MSG_DEBUG("file size [%d]", fileSize);
65 char sqlQuery[MAX_QUERY_LEN+1];
67 memset(sqlQuery, 0x00, sizeof(sqlQuery));
69 snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, %d, %d, %d, %d, %d, %ld, %d, %d, %d, %d, %d, %d, %ld, %d, ?, ?, ?, ?, 0);",
70 MSGFW_MESSAGE_TABLE_NAME, msgId, pMsgInfo->threadId, pMsgInfo->folderId, pMsgInfo->storageId, pMsgInfo->msgType.mainType,
71 pMsgInfo->msgType.subType, pMsgInfo->displayTime, pMsgInfo->dataSize, pMsgInfo->networkStatus, pMsgInfo->bRead, pMsgInfo->bProtected,
72 pMsgInfo->priority, pMsgInfo->direction, 0, pMsgInfo->bBackup);
74 MSG_DEBUG("QUERY : %s", sqlQuery);
76 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
79 pDbHandle->bindText(pMsgInfo->subject, 1);
81 pDbHandle->bindText(pMsgInfo->msgData, 2);
83 pDbHandle->bindText(pMsgInfo->thumbPath, 3);
85 if (pMsgInfo->bTextSms == false)
86 pDbHandle->bindText(pFileData, 4);
88 pDbHandle->bindText(pMsgInfo->msgText, 4);
90 if (pDbHandle->stepQuery() != MSG_ERR_DB_DONE) {
91 pDbHandle->finalizeQuery();
95 pDbHandle->finalizeQuery();
101 msg_error_t MsgStoSetReadStatus(MsgDbHandler *pDbHandle, msg_message_id_t msgId, bool bRead)
103 char sqlQuery[MAX_QUERY_LEN+1];
105 memset(sqlQuery, 0x00, sizeof(sqlQuery));
106 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET READ_STATUS = %d WHERE MSG_ID = %d;",
107 MSGFW_MESSAGE_TABLE_NAME, (int)bRead, msgId);
109 if (pDbHandle->execQuery(sqlQuery) != MSG_SUCCESS)
110 return MSG_ERR_DB_EXEC;
112 // Get MAIN_TYPE, SUB_TYPE, STORAGE_ID
113 memset(sqlQuery, 0x00, sizeof(sqlQuery));
114 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.MAIN_TYPE, A.SUB_TYPE, B.CONV_ID \
115 FROM %s A, %s B WHERE A.MSG_ID = %d AND A.CONV_ID = B.CONV_ID;",
116 MSGFW_MESSAGE_TABLE_NAME, MSGFW_CONVERSATION_TABLE_NAME, msgId);
118 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
119 return MSG_ERR_DB_PREPARE;
121 MSG_MESSAGE_TYPE_S msgType;
122 msg_thread_id_t convId;
124 if (pDbHandle->stepQuery() == MSG_ERR_DB_ROW) {
125 msgType.mainType = pDbHandle->columnInt(0);
126 msgType.subType = pDbHandle->columnInt(1);
127 convId = pDbHandle->columnInt(2);
129 pDbHandle->finalizeQuery();
130 return MSG_ERR_DB_STEP;
133 pDbHandle->finalizeQuery();
135 MSG_DEBUG("Main Type:[%d] SubType:[%d] ConvId:[%d]", msgType.mainType, msgType.subType, convId);
137 if (MsgStoUpdateConversation(pDbHandle, convId) != MSG_SUCCESS) {
138 MSG_DEBUG("MsgStoUpdateConversation() Error");
139 return MSG_ERR_STORAGE_ERROR;
142 int smsCnt = 0, mmsCnt = 0;
144 smsCnt = MsgStoGetUnreadCnt(pDbHandle, MSG_SMS_TYPE);
145 mmsCnt = MsgStoGetUnreadCnt(pDbHandle, MSG_MMS_TYPE);
147 MsgSettingSetIndicator(smsCnt, mmsCnt);
149 MsgRefreshNoti(false);
155 msg_error_t MsgStoGetOldestMessage(MsgDbHandler *pDbHandle, const MSG_MESSAGE_INFO_S *pMsgInfo, msg_message_id_t *pMsgId)
157 char sqlQuery[MAX_QUERY_LEN+1];
159 memset(sqlQuery, 0x00, sizeof(sqlQuery));
161 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s \
162 WHERE SUB_TYPE = %d AND FOLDER_ID = %d AND STORAGE_ID = %d AND PROTECTED = 0 \
163 ORDER BY DISPLAY_TIME ASC",
164 MSGFW_MESSAGE_TABLE_NAME, pMsgInfo->msgType.subType, pMsgInfo->folderId, MSG_STORAGE_PHONE);
166 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
167 return MSG_ERR_DB_PREPARE;
169 if (pDbHandle->stepQuery() == MSG_ERR_DB_ROW) {
170 *pMsgId = pDbHandle->columnInt(0);
172 pDbHandle->finalizeQuery();
173 return MSG_ERR_DB_STEP;
176 pDbHandle->finalizeQuery();
182 msg_error_t MsgStoCheckMsgCntFull(MsgDbHandler *pDbHandle, const MSG_MESSAGE_TYPE_S* pMsgType, msg_folder_id_t folderId)
186 msg_error_t err = MSG_SUCCESS;
187 struct statfs buf = {0};
190 if (statfs(MSG_DATA_ROOT_PATH, &buf) == -1) {
191 MSG_DEBUG("statfs(\"%s\") failed - %d", MSG_DATA_ROOT_PATH);
192 if (mkdir(MSG_DATA_ROOT_PATH, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) < 0) {
193 MSG_DEBUG("Error while mkdir %s", MSG_DATA_ROOT_PATH);
194 return MSG_ERR_STORAGE_ERROR;
196 fd = creat(MSG_DATA_ROOT_PATH, 0755);
198 ret = fchown(fd, -1, DB_MSG_SERVICE_GROUPE);
200 MSG_DEBUG("Failed to fchown on %s",MSG_DATA_ROOT_PATH);
207 unsigned long freeSpace = (buf.f_bfree * buf.f_bsize);
209 MSG_DEBUG("f_bfree [%d] f_bsize [%d]", buf.f_bfree, buf.f_bsize);
210 MSG_DEBUG("Free space of storage is [%ul] MB.", freeSpace);
212 if (freeSpace < SMS_MINIMUM_SPACE && pMsgType->mainType == MSG_SMS_TYPE)
213 err = MSG_ERR_MESSAGE_COUNT_FULL;
214 else if(freeSpace < MMS_MINIMUM_SPACE && pMsgType->mainType == MSG_MMS_TYPE)
215 err = MSG_ERR_MESSAGE_COUNT_FULL;
223 msg_error_t MsgStoCountMsgByLimitCategory(MsgDbHandler *pDbHandle, const MSG_MESSAGE_TYPE_S *pMsgType, int *pMsgCount, msg_folder_id_t folderId)
225 if (pMsgType == NULL) {
226 MSG_DEBUG("pMsgType is NULL");
227 return MSG_ERR_NULL_POINTER;
232 char sqlQuery[MAX_QUERY_LEN+1];
233 memset(sqlQuery, 0x00, sizeof(sqlQuery));
235 if ((pMsgType->mainType == MSG_SMS_TYPE) && (pMsgType->subType == MSG_WAP_SI_SMS ||pMsgType->subType == MSG_WAP_SL_SMS)) { // PUSH
236 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s WHERE MAIN_TYPE = %d AND SUB_TYPE IN (%d, %d) AND FOLDER_ID = %d;",
237 MSGFW_MESSAGE_TABLE_NAME, pMsgType->mainType, MSG_WAP_SI_SMS, MSG_WAP_SL_SMS, MSG_INBOX_ID);
238 } else if ((pMsgType->mainType == MSG_SMS_TYPE) && (pMsgType->subType == MSG_CB_SMS)) { // CB
239 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s WHERE MAIN_TYPE = %d AND SUB_TYPE IN (%d) AND FOLDER_ID = %d;",
240 MSGFW_MESSAGE_TABLE_NAME, pMsgType->mainType, MSG_CB_SMS, MSG_CBMSGBOX_ID);
241 } else if ((pMsgType->mainType == MSG_SMS_TYPE) && (pMsgType->subType == MSG_SYNCML_CP)) { // Provision
242 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s WHERE MAIN_TYPE = %d AND SUB_TYPE IN (%d) AND FOLDER_ID = %d;",
243 MSGFW_MESSAGE_TABLE_NAME, pMsgType->mainType, MSG_SYNCML_CP, MSG_INBOX_ID);
244 } else if ((pMsgType->mainType == MSG_SMS_TYPE)) { // SMS
245 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;",
246 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
247 } else if ((pMsgType->mainType == MSG_MMS_TYPE) &&
248 (pMsgType->subType == MSG_SENDREQ_MMS || pMsgType->subType == MSG_SENDCONF_MMS || pMsgType->subType == MSG_RETRIEVE_AUTOCONF_MMS ||
249 pMsgType->subType == MSG_RETRIEVE_MANUALCONF_MMS || pMsgType->subType == MSG_NOTIFICATIONIND_MMS)) { // MMS
250 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;",
251 MSGFW_MESSAGE_TABLE_NAME, pMsgType->mainType, MSG_SENDREQ_MMS, MSG_SENDCONF_MMS, MSG_RETRIEVE_AUTOCONF_MMS, MSG_RETRIEVE_MANUALCONF_MMS, MSG_NOTIFICATIONIND_MMS, folderId);
253 return MSG_ERR_INVALID_PARAMETER;
256 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
257 return MSG_ERR_DB_PREPARE;
259 if (pDbHandle->stepQuery() == MSG_ERR_DB_ROW) {
260 *pMsgCount = pDbHandle->columnInt(0);
262 pDbHandle->finalizeQuery();
263 return MSG_ERR_DB_STEP;
266 pDbHandle->finalizeQuery();
272 int MsgStoCheckMsgCntLimit(const MSG_MESSAGE_TYPE_S* pMsgType, msg_folder_id_t folderId)
280 msgboxType = MSG_COUNT_LIMIT_INBOX_TYPE;
284 msgboxType = MSG_COUNT_LIMIT_OUTBOX_TYPE;
287 case MSG_SENTBOX_ID :
288 msgboxType = MSG_COUNT_LIMIT_SENTBOX_TYPE;
292 msgboxType = MSG_COUNT_LIMIT_DRAFTBOX_TYPE;
295 case MSG_CBMSGBOX_ID :
296 msgboxType = MSG_COUNT_LIMIT_CBMSGBOX_TYPE;
300 MSG_DEBUG("Unknown mailbox Type [%d]", folderId);
304 switch (pMsgType->subType)
307 case MSG_REPLACE_TYPE1_SMS:
308 case MSG_REPLACE_TYPE2_SMS:
309 case MSG_REPLACE_TYPE3_SMS:
310 case MSG_REPLACE_TYPE4_SMS:
311 case MSG_REPLACE_TYPE5_SMS:
312 case MSG_REPLACE_TYPE6_SMS:
313 case MSG_REPLACE_TYPE7_SMS:
314 case MSG_MWI_VOICE_SMS:
315 case MSG_MWI_FAX_SMS:
316 case MSG_MWI_EMAIL_SMS:
317 case MSG_MWI_OTHER_SMS:
318 case MSG_STATUS_REPORT_SMS:
319 msgType = MSG_COUNT_LIMIT_SMS_TYPE;
323 msgType = MSG_COUNT_LIMIT_CB_TYPE;
328 msgType = MSG_COUNT_LIMIT_WAPPUSH_TYPE;
332 msgType = MSG_COUNT_LIMIT_PROVISION_TYPE;
335 case MSG_SENDREQ_MMS:
336 case MSG_SENDCONF_MMS:
337 case MSG_NOTIFICATIONIND_MMS:
338 case MSG_RETRIEVE_AUTOCONF_MMS:
339 case MSG_RETRIEVE_MANUALCONF_MMS:
340 msgType = MSG_COUNT_LIMIT_MMS_TYPE;
344 MSG_DEBUG("Unknown Message Type [%d]", pMsgType->subType);
348 return msgCntLimit[msgboxType][msgType];
352 msg_error_t MsgStoAddAddress(MsgDbHandler *pDbHandle, const MSG_MESSAGE_INFO_S *pMsg, msg_thread_id_t *pConvId)
354 msg_error_t err = MSG_SUCCESS;
356 char sqlQuery[MAX_QUERY_LEN+1];
358 // Check if new address or not
359 if (MsgExistAddress(pDbHandle, pMsg, pConvId) == true) {
360 MSG_DEBUG("The address already exists. Conversation ID : [%d]", *pConvId);
364 MSG_DEBUG("Conversation ID : [%d]", *pConvId);
366 /* conversation insert */
367 err = MsgStoAddConversation(pDbHandle, pConvId);
368 if (err != MSG_SUCCESS) {
369 MSG_DEBUG("MsgStoAddConversation() fail [%d]", err);
373 /* insert address in loop */
374 for (int i=0; i<pMsg->nAddressCnt; i++) {
377 MSG_CONTACT_INFO_S contactInfo;
378 memset(&contactInfo, 0x00, sizeof(MSG_CONTACT_INFO_S));
381 if (MsgGetContactInfo(&(pMsg->addressList[i]), &contactInfo) != MSG_SUCCESS) {
382 MSG_DEBUG("MsgGetContactInfo() fail.");
385 err = pDbHandle->getRowId(MSGFW_ADDRESS_TABLE_NAME, &addrId);
386 if (err != MSG_SUCCESS) {
387 MSG_DEBUG("pDbHandle->getRowId fail. [%d]", err);
392 memset(sqlQuery, 0x00, sizeof(sqlQuery));
393 snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, %d, %d, %d, '%s', %d, ?, ?, ?, '%s', 0);",
394 MSGFW_ADDRESS_TABLE_NAME, addrId, *pConvId, pMsg->addressList[i].addressType, pMsg->addressList[i].recipientType, pMsg->addressList[i].addressVal,
395 contactInfo.contactId, contactInfo.imagePath);
397 MSG_DEBUG("Add Address Info. [%s]", sqlQuery);
399 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
400 return MSG_ERR_DB_PREPARE;
402 pDbHandle->bindText(contactInfo.displayName, 1);
403 pDbHandle->bindText(contactInfo.firstName, 2);
404 pDbHandle->bindText(contactInfo.lastName, 3);
406 if (pDbHandle->stepQuery() != MSG_ERR_DB_DONE) {
407 pDbHandle->finalizeQuery();
408 return MSG_ERR_DB_STEP;
411 pDbHandle->finalizeQuery();
413 // set conversation display name by conv id
414 MsgStoSetConversationDisplayName(pDbHandle, *pConvId);
421 msg_error_t MsgStoGetAddressByMsgId(MsgDbHandler *pDbHandle, msg_message_id_t msgId, int contactNameOrder, int *nAddressCnt, MSG_ADDRESS_INFO_S *pAddress)
423 char sqlQuery[MAX_QUERY_LEN+1];
424 char firstName[MAX_DISPLAY_NAME_LEN+1];
425 char lastName[MAX_DISPLAY_NAME_LEN+1];
429 memset(sqlQuery, 0x00, sizeof(sqlQuery));
430 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.ADDRESS_TYPE, A.RECIPIENT_TYPE, \
431 A.CONTACT_ID, A.ADDRESS_VAL, A.DISPLAY_NAME, A.FIRST_NAME, A.LAST_NAME \
432 FROM %s A, %s B WHERE A.CONV_ID = B.CONV_ID AND B.MSG_ID = %d;",
433 MSGFW_ADDRESS_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME, msgId);
435 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
436 MSG_DEBUG("Query Failed [%s]", sqlQuery);
437 return MSG_ERR_DB_PREPARE;
440 while (pDbHandle->stepQuery() == MSG_ERR_DB_ROW) {
441 memset(firstName, 0x00, sizeof(firstName));
442 memset(lastName, 0x00, sizeof(lastName));
444 pAddress[*nAddressCnt].addressType = pDbHandle->columnInt(0);
445 pAddress[*nAddressCnt].recipientType = pDbHandle->columnInt(1);
446 pAddress[*nAddressCnt].contactId = pDbHandle->columnInt(2);
448 if (pDbHandle->columnText(3) != NULL)
449 strncpy(pAddress[*nAddressCnt].addressVal, (char *)pDbHandle->columnText(3), MAX_ADDRESS_VAL_LEN);
451 if (pDbHandle->columnText(4) != NULL && ((char *)pDbHandle->columnText(4))[0]!='\0') {
452 MSG_DEBUG("displayName : [%s]", pDbHandle->columnText(4));
453 strncpy(pAddress[*nAddressCnt].displayName, (char *)pDbHandle->columnText(4), MAX_DISPLAY_NAME_LEN);
455 if (pDbHandle->columnText(5) != NULL)
456 strncpy(firstName, (char *)pDbHandle->columnText(5), MAX_DISPLAY_NAME_LEN);
458 if (pDbHandle->columnText(6) != NULL)
459 strncpy(lastName, (char *)pDbHandle->columnText(6), MAX_DISPLAY_NAME_LEN);
461 if (contactNameOrder == 0) {
462 if (strlen(firstName) > 0) {
463 strncpy(pAddress[*nAddressCnt].displayName, firstName, MAX_DISPLAY_NAME_LEN);
465 if (strlen(lastName) > 0) {
466 strncat(pAddress[*nAddressCnt].displayName, " ", MAX_DISPLAY_NAME_LEN-strlen(pAddress[*nAddressCnt].displayName));
467 strncat(pAddress[*nAddressCnt].displayName, lastName, MAX_DISPLAY_NAME_LEN-strlen(pAddress[*nAddressCnt].displayName));
469 } else if (contactNameOrder == 1) {
470 if (strlen(lastName) > 0) {
471 strncpy(pAddress[*nAddressCnt].displayName, lastName, MAX_DISPLAY_NAME_LEN);
472 strncat(pAddress[*nAddressCnt].displayName, " ", MAX_DISPLAY_NAME_LEN-strlen(pAddress[*nAddressCnt].displayName));
475 if (strlen(firstName) > 0) {
476 strncat(pAddress[*nAddressCnt].displayName, firstName, MAX_DISPLAY_NAME_LEN-strlen(pAddress[*nAddressCnt].displayName));
484 pDbHandle->finalizeQuery();
489 msg_error_t MsgStoGetAddressByMsgId(MsgDbHandler *pDbHandle, msg_message_id_t msgId, int contactNameOrder, msg_struct_list_s *pAddress)
491 char sqlQuery[MAX_QUERY_LEN+1];
492 char firstName[MAX_DISPLAY_NAME_LEN+1];
493 char lastName[MAX_DISPLAY_NAME_LEN+1];
495 pAddress->nCount = 0;
496 pAddress->msg_struct_info = NULL;
498 memset(sqlQuery, 0x00, sizeof(sqlQuery));
499 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.ADDRESS_TYPE, A.RECIPIENT_TYPE, \
500 A.CONTACT_ID, A.ADDRESS_VAL, A.DISPLAY_NAME, A.FIRST_NAME, A.LAST_NAME \
501 FROM %s A, %s B WHERE A.CONV_ID = B.CONV_ID AND B.MSG_ID = %d;",
502 MSGFW_ADDRESS_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME, msgId);
504 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
505 MSG_DEBUG("Query Failed [%s]", sqlQuery);
506 return MSG_ERR_DB_PREPARE;
509 msg_struct_s *pTmp = NULL;
510 MSG_ADDRESS_INFO_S *pAddr = NULL;
512 pAddress->msg_struct_info = (msg_struct_t *)new char[sizeof(msg_struct_t) * MAX_TO_ADDRESS_CNT];
514 for (int i = 0; i < MAX_TO_ADDRESS_CNT; i++) {
515 pAddress->msg_struct_info[i] = (msg_struct_t)new char[sizeof(msg_struct_s)];
516 pTmp = (msg_struct_s *)pAddress->msg_struct_info[i];
517 pTmp->type = MSG_STRUCT_ADDRESS_INFO;
518 pTmp->data = new char[sizeof(MSG_ADDRESS_INFO_S)];
519 memset(pTmp->data, 0x00, sizeof(MSG_ADDRESS_INFO_S));
523 while (pDbHandle->stepQuery() == MSG_ERR_DB_ROW) {
524 memset(firstName, 0x00, sizeof(firstName));
525 memset(lastName, 0x00, sizeof(lastName));
527 pTmp = (msg_struct_s *)pAddress->msg_struct_info[pAddress->nCount];
528 pAddr = (MSG_ADDRESS_INFO_S *)pTmp->data;
530 pAddr->addressType = pDbHandle->columnInt(0);
531 pAddr->recipientType = pDbHandle->columnInt(1);
532 pAddr->contactId = pDbHandle->columnInt(2);
534 if (pDbHandle->columnText(3) != NULL)
535 strncpy(pAddr->addressVal, (char *)pDbHandle->columnText(3), MAX_ADDRESS_VAL_LEN);
537 if (pDbHandle->columnText(4) != NULL && ((char *)pDbHandle->columnText(4))[0]!='\0') {
538 MSG_DEBUG("displayName : [%s]", pDbHandle->columnText(4));
539 strncpy(pAddr->displayName, (char *)pDbHandle->columnText(4), MAX_DISPLAY_NAME_LEN);
541 if (pDbHandle->columnText(5) != NULL)
542 strncpy(firstName, (char *)pDbHandle->columnText(5), MAX_DISPLAY_NAME_LEN);
544 if (pDbHandle->columnText(6) != NULL)
545 strncpy(lastName, (char *)pDbHandle->columnText(6), MAX_DISPLAY_NAME_LEN);
547 if (contactNameOrder == 0) {
548 if (strlen(firstName) > 0) {
549 strncpy(pAddr->displayName, firstName, MAX_DISPLAY_NAME_LEN);
552 if (strlen(lastName) > 0) {
553 strncat(pAddr->displayName, " ", MAX_DISPLAY_NAME_LEN-strlen(pAddr->displayName));
554 strncat(pAddr->displayName, lastName, MAX_DISPLAY_NAME_LEN-strlen(pAddr->displayName));
556 } else if (contactNameOrder == 1) {
557 if (strlen(lastName) > 0) {
558 strncpy(pAddr->displayName, lastName, MAX_DISPLAY_NAME_LEN);
559 strncat(pAddr->displayName, " ", MAX_DISPLAY_NAME_LEN-strlen(pAddr->displayName));
562 if (strlen(firstName) > 0) {
563 strncat(pAddr->displayName, firstName, MAX_DISPLAY_NAME_LEN-strlen(pAddr->displayName));
571 pDbHandle->finalizeQuery();
577 msg_error_t MsgStoGetAddressByConvId(MsgDbHandler *pDbHandle, msg_thread_id_t convId, int contactNameOrder, msg_struct_list_s *pAddrlist)
579 char sqlQuery[MAX_QUERY_LEN+1];
580 char firstName[MAX_DISPLAY_NAME_LEN+1];
581 char lastName[MAX_DISPLAY_NAME_LEN+1];
585 pAddrlist->nCount = 0;
586 pAddrlist->msg_struct_info = NULL;
588 memset(sqlQuery, 0x00, sizeof(sqlQuery));
589 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT ADDRESS_TYPE, RECIPIENT_TYPE, \
590 CONTACT_ID, ADDRESS_VAL, DISPLAY_NAME, FIRST_NAME, LAST_NAME \
591 FROM %s WHERE CONV_ID = %d;",
592 MSGFW_ADDRESS_TABLE_NAME, convId);
594 msg_error_t err = pDbHandle->getTable(sqlQuery, &rowCnt);
596 if (err == MSG_ERR_DB_NORECORD) {
597 pDbHandle->freeTable();
599 } else if (err != MSG_SUCCESS) {
600 MSG_DEBUG("sqlQuery is - %s", sqlQuery);
601 pDbHandle->freeTable();
605 pAddrlist->nCount = rowCnt;
607 MSG_DEBUG("pAddrlist->nCount [%d]", pAddrlist->nCount);
609 msg_struct_s *pTmp = NULL;
610 MSG_ADDRESS_INFO_S *pAddr = NULL;
612 pAddrlist->msg_struct_info = (msg_struct_t *)new char[sizeof(msg_struct_t) * MAX_TO_ADDRESS_CNT];
614 for (int i = 0; i < MAX_TO_ADDRESS_CNT; i++) {
615 pAddrlist->msg_struct_info[i] = (msg_struct_t)new char[sizeof(msg_struct_s)];
616 pTmp = (msg_struct_s *)pAddrlist->msg_struct_info[i];
617 pTmp->type = MSG_STRUCT_ADDRESS_INFO;
618 pTmp->data = new char[sizeof(MSG_ADDRESS_INFO_S)];
619 memset(pTmp->data, 0x00, sizeof(MSG_ADDRESS_INFO_S));
622 for (int i = 0; i < rowCnt; i++) {
623 pTmp = (msg_struct_s *)pAddrlist->msg_struct_info[i];
624 pAddr = (MSG_ADDRESS_INFO_S *)pTmp->data;
626 pAddr->addressType = pDbHandle->getColumnToInt(index++);
627 pAddr->recipientType = pDbHandle->getColumnToInt(index++);
628 pAddr->contactId = pDbHandle->getColumnToInt(index++);
629 pDbHandle->getColumnToString(index++, MAX_ADDRESS_VAL_LEN, pAddr->addressVal);
630 pDbHandle->getColumnToString(index++, MAX_DISPLAY_NAME_LEN, pAddr->displayName);
631 if(!strlen(pAddr->displayName)) {
632 pDbHandle->getColumnToString(index++,MAX_DISPLAY_NAME_LEN, firstName);
633 pDbHandle->getColumnToString(index++,MAX_DISPLAY_NAME_LEN, lastName);
635 if (contactNameOrder == 0) {
636 if (strlen(firstName) > 0) {
637 strncpy(pAddr->displayName, firstName, MAX_DISPLAY_NAME_LEN);
640 if (strlen(lastName) > 0) {
641 strncat(pAddr->displayName, " ", MAX_DISPLAY_NAME_LEN-strlen(pAddr->displayName));
642 strncat(pAddr->displayName, lastName, MAX_DISPLAY_NAME_LEN-strlen(pAddr->displayName));
644 } else if (contactNameOrder == 1) {
645 if (strlen(lastName) > 0) {
646 strncpy(pAddr->displayName, lastName, MAX_DISPLAY_NAME_LEN);
647 strncat(pAddr->displayName, " ", MAX_DISPLAY_NAME_LEN-strlen(pAddr->displayName));
650 if (strlen(firstName) > 0) {
651 strncat(pAddr->displayName, firstName, MAX_DISPLAY_NAME_LEN-strlen(pAddr->displayName));
655 index++; // firstname
660 pDbHandle->freeTable();
665 /* Have to use trigger for this function. */
666 msg_error_t MsgStoUpdateConversation(MsgDbHandler *pDbHandle, msg_thread_id_t convId)
670 msg_error_t err = MSG_SUCCESS;
676 char msgText[MAX_THREAD_DATA_LEN+1];
677 char sqlQuery[MAX_QUERY_LEN+1];
679 memset(msgText, 0x00, sizeof(msgText));
682 memset(sqlQuery, 0x00, sizeof(sqlQuery));
684 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s WHERE CONV_ID = %d AND FOLDER_ID = %d AND STORAGE_ID = %d AND READ_STATUS = 0;",
685 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_INBOX_ID, MSG_STORAGE_PHONE);
687 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
688 return MSG_ERR_DB_PREPARE;
690 err = pDbHandle->stepQuery();
692 if (err == MSG_ERR_DB_ROW) {
693 unreadCnt = pDbHandle->columnInt(0);
694 } else if (err != MSG_ERR_DB_DONE) {
695 pDbHandle->finalizeQuery();
696 return MSG_ERR_DB_STEP;
699 pDbHandle->finalizeQuery();
702 memset(sqlQuery, 0x00, sizeof(sqlQuery));
704 snprintf(sqlQuery, sizeof(sqlQuery), "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;",
705 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_SMS_TYPE, MSG_ALLBOX_ID, MSG_CBMSGBOX_ID, MSG_STORAGE_PHONE);
707 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
708 return MSG_ERR_DB_PREPARE;
710 err = pDbHandle->stepQuery();
712 if (err == MSG_ERR_DB_ROW) {
713 smsCnt = pDbHandle->columnInt(0);
715 else if (err != MSG_ERR_DB_DONE) {
716 pDbHandle->finalizeQuery();
717 return MSG_ERR_DB_STEP;
720 pDbHandle->finalizeQuery();
723 memset(sqlQuery, 0x00, sizeof(sqlQuery));
725 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s \
726 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;",
727 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_MMS_TYPE, MSG_DELIVERYIND_MMS, MSG_READRECIND_MMS, MSG_READORGIND_MMS,
728 MSG_ALLBOX_ID, MSG_CBMSGBOX_ID, MSG_STORAGE_PHONE);
730 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
731 return MSG_ERR_DB_PREPARE;
733 err = pDbHandle->stepQuery();
735 if (err == MSG_ERR_DB_ROW) {
736 mmsCnt = pDbHandle->columnInt(0);
737 } else if (err != MSG_ERR_DB_DONE) {
738 pDbHandle->finalizeQuery();
739 return MSG_ERR_DB_STEP;
742 pDbHandle->finalizeQuery();
744 // Get Latest Msg Data
745 MSG_MAIN_TYPE_T mainType = MSG_UNKNOWN_TYPE;
746 MSG_SUB_TYPE_T subType = MSG_NORMAL_SMS;
747 msg_direction_type_t direction = MSG_DIRECTION_TYPE_MO;
750 memset(sqlQuery, 0x00, sizeof(sqlQuery));
752 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MAIN_TYPE, SUB_TYPE, MSG_DIRECTION, DISPLAY_TIME, SUBJECT, MSG_TEXT FROM %s \
753 WHERE CONV_ID = %d AND FOLDER_ID > %d AND FOLDER_ID < %d AND STORAGE_ID = %d ORDER BY DISPLAY_TIME DESC;",
754 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_ALLBOX_ID, MSG_SPAMBOX_ID, MSG_STORAGE_PHONE);
756 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
757 return MSG_ERR_DB_PREPARE;
759 err = pDbHandle->stepQuery();
761 if (err == MSG_ERR_DB_ROW) {
762 mainType = pDbHandle->columnInt(0);
763 subType = pDbHandle->columnInt(1);
764 direction = pDbHandle->columnInt(2);
766 msgTime = (time_t)pDbHandle->columnInt(3);
768 memset(msgText, 0x00, sizeof(msgText));
770 if (mainType == MSG_SMS_TYPE) {
771 if (pDbHandle->columnText(5) != NULL)
772 strncpy(msgText, (char*)pDbHandle->columnText(5), MAX_THREAD_DATA_LEN);
773 } else if (mainType == MSG_MMS_TYPE) {
774 if (pDbHandle->columnText(4) != NULL) {
775 strncpy(msgText, (char*)pDbHandle->columnText(4), MAX_THREAD_DATA_LEN);
778 if ((strlen(msgText) <= 0) && (pDbHandle->columnText(5) != NULL) && (subType != MSG_NOTIFICATIONIND_MMS)) {
779 memset(msgText, 0x00, sizeof(msgText));
780 strncpy(msgText, (char*)pDbHandle->columnText(5), MAX_THREAD_DATA_LEN);
783 } else if (err != MSG_ERR_DB_DONE) {
784 pDbHandle->finalizeQuery();
785 return MSG_ERR_DB_STEP;
788 pDbHandle->finalizeQuery();
790 // Update Address Table
791 memset(sqlQuery, 0x00, sizeof(sqlQuery));
793 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET \
794 UNREAD_CNT = %d, SMS_CNT = %d, MMS_CNT = %d, MAIN_TYPE = %d, SUB_TYPE = %d, MSG_DIRECTION = %d, DISPLAY_TIME = %ld, MSG_TEXT = ? \
795 WHERE CONV_ID = %d;", MSGFW_CONVERSATION_TABLE_NAME, unreadCnt, smsCnt, mmsCnt, mainType, subType, direction, msgTime, convId);
797 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
798 MSG_DEBUG("Query Failed [%s]", sqlQuery);
799 return MSG_ERR_DB_PREPARE;
802 pDbHandle->bindText(msgText, 1);
804 if (pDbHandle->stepQuery() != MSG_ERR_DB_DONE) {
805 pDbHandle->finalizeQuery();
806 MSG_DEBUG("Update Address Info. Fail [%d] [%s]", err, sqlQuery);
807 return MSG_ERR_DB_STEP;
810 pDbHandle->finalizeQuery();
818 /* consider to replcae this function to trigger. */
819 msg_error_t MsgStoClearConversationTable(MsgDbHandler *pDbHandle)
821 msg_error_t err = MSG_SUCCESS;
823 char sqlQuery[MAX_QUERY_LEN+1];
825 memset(sqlQuery, 0x00, sizeof(sqlQuery));
827 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s \
828 WHERE CONV_ID NOT IN (SELECT CONV_ID FROM %s) AND CONV_ID <> 0;",
829 MSGFW_CONVERSATION_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME);
831 err = pDbHandle->execQuery(sqlQuery);
833 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE CONV_ID NOT IN (SELECT CONV_ID FROM %s);",
834 MSGFW_ADDRESS_TABLE_NAME, MSGFW_CONVERSATION_TABLE_NAME);
836 err = pDbHandle->execQuery(sqlQuery);
842 void MsgConvertNumber(const char* pSrcNum, char* pDestNum)
847 overLen = strlen(pSrcNum) - MAX_PRECONFIG_NUM;
849 for (i = 0; i < MAX_PRECONFIG_NUM; i++)
850 pDestNum[i] = pSrcNum[i+overLen];
855 /* Change the function name to conversation related. */
856 bool MsgExistAddress(MsgDbHandler *pDbHandle, const MSG_MESSAGE_INFO_S *pMsg, msg_thread_id_t *pConvId)
858 msg_error_t err = MSG_SUCCESS;
860 char sqlQuery[MAX_QUERY_LEN+1];
864 if(pMsg->nAddressCnt == 1) {
865 memset(sqlQuery, 0x00, sizeof(sqlQuery));
867 snprintf(sqlQuery, sizeof(sqlQuery),
868 "SELECT CONV_ID FROM (SELECT B.CONV_ID FROM %s A, %s B WHERE A.ADDRESS_VAL = '%s' AND A.CONV_ID=B.CONV_ID) GROUP BY CONV_ID HAVING COUNT(CONV_ID)=1;",
869 MSGFW_ADDRESS_TABLE_NAME, MSGFW_ADDRESS_TABLE_NAME, pMsg->addressList[0].addressVal);
872 msg_thread_id_t convId = 0;
873 err = pDbHandle->getTable(sqlQuery, &rowCnt);
875 /* No record or other error */
876 if (err != MSG_SUCCESS) {
877 MSG_DEBUG("Query Failed [%s]", sqlQuery);
878 pDbHandle->freeTable();
883 convId = pDbHandle->getColumnToInt(1);
885 MSG_DEBUG("CONV_ID : [%d]", convId);
889 pDbHandle->freeTable();
892 pDbHandle->freeTable();
897 } else { /* multiple address */
898 memset(sqlQuery, 0x00, sizeof(sqlQuery));
900 snprintf(sqlQuery, sizeof(sqlQuery),
901 "SELECT CONV_ID FROM (SELECT B.CONV_ID FROM %s A, %s B WHERE A.ADDRESS_VAL = '%s' AND A.CONV_ID=B.CONV_ID) GROUP BY CONV_ID HAVING COUNT(CONV_ID)=%d;",
902 MSGFW_ADDRESS_TABLE_NAME, MSGFW_ADDRESS_TABLE_NAME, pMsg->addressList[0].addressVal, pMsg->nAddressCnt);
907 MSG_DEBUG("Query [%s]", sqlQuery);
909 err = pDbHandle->getTable(sqlQuery, &rowCnt);
911 /* No record or other error */
912 if (err != MSG_SUCCESS) {
913 MSG_DEBUG("Query Failed [%s]", sqlQuery);
914 pDbHandle->freeTable();
918 for (int i = 1; i <= rowCnt; i++) {
919 convId = pDbHandle->getColumnToInt(i);
921 memset(sqlQuery, 0x00, sizeof(sqlQuery));
923 snprintf(sqlQuery, sizeof(sqlQuery),
924 "SELECT COUNT(*) FROM %s WHERE CONV_ID=%d AND (",
925 MSGFW_ADDRESS_TABLE_NAME, convId);
927 for (int j = 0; j<(pMsg->nAddressCnt); j++ ) {
930 strncat(sqlQuery, "OR ", MAX_QUERY_LEN-strlen(sqlQuery));
932 strncat(sqlQuery, "ADDRESS_VAL = '", MAX_QUERY_LEN-strlen(sqlQuery));
934 strncat(sqlQuery, pMsg->addressList[j].addressVal, MAX_QUERY_LEN-strlen(sqlQuery));
936 strncat(sqlQuery, "' ", MAX_QUERY_LEN-strlen(sqlQuery));
938 strncat(sqlQuery, ");", MAX_QUERY_LEN-strlen(sqlQuery));
939 MSG_DEBUG("Query [%s]", sqlQuery);
940 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
941 MSG_DEBUG("Query Failed [%s]", sqlQuery);
942 pDbHandle->freeTable();
943 pDbHandle->finalizeQuery();
947 if (pDbHandle->stepQuery() == MSG_ERR_DB_ROW) {
948 if (pMsg->nAddressCnt == pDbHandle->columnInt(0)) {
950 pDbHandle->finalizeQuery();
951 pDbHandle->freeTable();
955 pDbHandle->finalizeQuery();
957 pDbHandle->freeTable();
964 int MsgStoGetUnreadCnt(MsgDbHandler *pDbHandle, MSG_MAIN_TYPE_T msgType)
968 char sqlQuery[MAX_QUERY_LEN+1];
970 memset(sqlQuery, 0x00, sizeof(sqlQuery));
972 if (msgType == MSG_SMS_TYPE) {
973 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s \
974 WHERE MAIN_TYPE = %d AND SUB_TYPE IN (%d, %d, %d, %d, %d, %d, %d) AND FOLDER_ID = %d AND READ_STATUS = 0;",
975 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);
976 } else if (msgType == MSG_MMS_TYPE) {
977 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s \
978 WHERE MAIN_TYPE = %d AND SUB_TYPE IN (%d, %d, %d) AND FOLDER_ID = %d AND READ_STATUS = 0;",
979 MSGFW_MESSAGE_TABLE_NAME, MSG_MMS_TYPE, MSG_RETRIEVE_AUTOCONF_MMS, MSG_RETRIEVE_MANUALCONF_MMS, MSG_NOTIFICATIONIND_MMS, MSG_INBOX_ID);
982 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
985 if (pDbHandle->stepQuery() == MSG_ERR_DB_ROW) {
986 msgCnt = pDbHandle->columnInt(0);
988 pDbHandle->finalizeQuery();
992 pDbHandle->finalizeQuery();
998 msg_error_t MsgStoAddContactInfo(MsgDbHandler *pDbHandle, MSG_CONTACT_INFO_S *pContactInfo, const char *pNumber)
1000 char sqlQuery[MAX_QUERY_LEN+1];
1002 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1003 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET "
1005 "DISPLAY_NAME = ?, "
1008 "IMAGE_PATH = '%s' "
1009 "WHERE ADDRESS_VAL = '%s';",
1010 MSGFW_ADDRESS_TABLE_NAME, pContactInfo->contactId, pContactInfo->imagePath, pNumber);
1012 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
1013 MSG_DEBUG("sqlQuery [%s]", sqlQuery);
1014 return MSG_ERR_DB_PREPARE;
1017 pDbHandle->bindText(pContactInfo->displayName, 1);
1018 pDbHandle->bindText(pContactInfo->firstName, 2);
1019 pDbHandle->bindText(pContactInfo->lastName, 3);
1021 if (pDbHandle->stepQuery() != MSG_ERR_DB_DONE) {
1022 pDbHandle->finalizeQuery();
1023 MSG_DEBUG("Update contact Info. Fail [%s]", sqlQuery);
1024 return MSG_ERR_DB_STEP;
1027 pDbHandle->finalizeQuery();
1033 msg_error_t MsgStoResetContactInfo(MsgDbHandler *pDbHandle, int contactId)
1035 msg_error_t err = MSG_SUCCESS;
1037 char sqlQuery[MAX_QUERY_LEN+1];
1041 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1043 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT ADDRESS_VAL, CONV_ID FROM %s WHERE CONTACT_ID = %d;",
1044 MSGFW_ADDRESS_TABLE_NAME, contactId);
1046 err = pDbHandle->getTable(sqlQuery, &rowCnt);
1048 if (err != MSG_SUCCESS) {
1049 pDbHandle->freeTable();
1050 MSG_DEBUG("[Error]Failed to Get Table");
1054 MsgDbHandler tmpDbHandle;
1055 for (int i=0; i<rowCnt; i++) {
1057 MSG_CONTACT_INFO_S contactInfo;
1058 memset(&contactInfo, 0x00, sizeof(MSG_CONTACT_INFO_S));
1059 MSG_ADDRESS_INFO_S addrInfo;
1060 memset(&addrInfo, 0x00, sizeof(MSG_ADDRESS_INFO_S));
1062 pDbHandle->getColumnToString(index++, MAX_ADDRESS_VAL_LEN, addrInfo.addressVal);
1064 MsgGetContactInfo(&addrInfo, &contactInfo);
1065 MsgStoAddContactInfo(&tmpDbHandle, &contactInfo, addrInfo.addressVal);
1067 MsgStoSetConversationDisplayName(&tmpDbHandle, (msg_thread_id_t)pDbHandle->getColumnToInt(index++));
1070 pDbHandle->freeTable();
1076 msg_error_t MsgStoClearContactInfo(MsgDbHandler *pDbHandle, int contactId, const char *pNumber)
1078 char newPhoneNum[MAX_PRECONFIG_NUM+1];
1079 char sqlQuery[MAX_QUERY_LEN+1];
1081 memset(newPhoneNum, 0x00, sizeof(newPhoneNum));
1082 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1084 if (strlen(pNumber) > MAX_PRECONFIG_NUM) {
1085 MsgConvertNumber(pNumber, newPhoneNum);
1087 MSG_DEBUG("Phone Number to Compare : [%s]", newPhoneNum);
1089 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET \
1090 CONTACT_ID = 0, DISPLAY_NAME = '', FIRST_NAME = '', LAST_NAME = '', IMAGE_PATH = '' \
1091 WHERE CONTACT_ID = %d AND ADDRESS_VAL NOT LIKE '%%%s';",
1092 MSGFW_ADDRESS_TABLE_NAME, contactId, newPhoneNum);
1094 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET \
1095 CONTACT_ID = 0, DISPLAY_NAME = '', FIRST_NAME = '', LAST_NAME = '', IMAGE_PATH = '' \
1096 WHERE CONTACT_ID = %d AND ADDRESS_VAL <> '%s';",
1097 MSGFW_ADDRESS_TABLE_NAME, contactId, pNumber);
1100 if (pDbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
1101 MSG_DEBUG("Fail to execute query");
1102 return MSG_ERR_DB_EXEC;
1109 msg_error_t MsgStoGetMmsRawFilePath(MsgDbHandler *pDbHandle, msg_message_id_t msgId, char *pFilePath)
1111 char sqlQuery[MAX_QUERY_LEN+1];
1113 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1115 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.FILE_PATH FROM %s A, %s B \
1116 WHERE A.MSG_ID = B.MSG_ID AND B.MSG_ID = %d;",
1117 MMS_PLUGIN_MESSAGE_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME, msgId);
1119 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
1120 return MSG_ERR_DB_PREPARE;
1122 if (pDbHandle->stepQuery() == MSG_ERR_DB_ROW) {
1123 if (pDbHandle->columnText(0) != NULL)
1124 strncpy(pFilePath, (char*)pDbHandle->columnText(0), MSG_FILEPATH_LEN_MAX);
1126 pDbHandle->finalizeQuery();
1127 return MSG_ERR_DB_STEP;
1130 pDbHandle->finalizeQuery();
1136 bool MsgStoCheckReadReportRequested(MsgDbHandler *pDbHandle, msg_message_id_t msgId)
1138 msg_error_t err = MSG_SUCCESS;
1140 char sqlQuery[MAX_QUERY_LEN+1];
1142 bool bReadReportRequested = false;
1144 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1146 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.ASK_READ_REPLY FROM %s A, %s B \
1147 WHERE A.MSG_ID = B.MSG_ID AND B.MSG_ID = %d;",
1148 MMS_PLUGIN_MESSAGE_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME, msgId);
1150 err = pDbHandle->getTable(sqlQuery, &rowCnt);
1152 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
1153 pDbHandle->freeTable();
1154 MSG_DEBUG("[Error]Failed to Get Table");
1155 return bReadReportRequested;
1159 pDbHandle->freeTable();
1160 MSG_DEBUG("[Error]MSG_ERR_DB_NORECORD");
1161 return bReadReportRequested;
1164 bReadReportRequested = pDbHandle->getColumnToInt(1);
1166 pDbHandle->freeTable();
1168 return bReadReportRequested;
1172 bool MsgStoCheckReadReportIsSent(MsgDbHandler *pDbHandle, msg_message_id_t msgId)
1174 msg_error_t err = MSG_SUCCESS;
1176 char sqlQuery[MAX_QUERY_LEN+1];
1179 bool bReadReportIsSent = true;
1181 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1183 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.READ_REPORT_SENT FROM %s A, %s B \
1184 WHERE A.MSG_ID = B.MSG_ID AND B.MSG_ID = %d;",
1185 MMS_PLUGIN_MESSAGE_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME, msgId);
1187 err = pDbHandle->getTable(sqlQuery, &rowCnt);
1189 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
1190 pDbHandle->freeTable();
1191 MSG_DEBUG("[Error]Failed to Get Table");
1192 return bReadReportIsSent;
1196 pDbHandle->freeTable();
1197 MSG_DEBUG("[Error]MSG_ERR_DB_NORECORD");
1198 return bReadReportIsSent;
1201 bReadReportIsSent = (bool)pDbHandle->getColumnToInt(1);
1203 pDbHandle->freeTable();
1205 return bReadReportIsSent;
1209 msg_error_t MsgStoAddConversation(MsgDbHandler *pDbHandle, msg_thread_id_t *pConvId)
1211 char sqlQuery[MAX_QUERY_LEN+1];
1213 if (pDbHandle->getRowId(MSGFW_CONVERSATION_TABLE_NAME, pConvId) != MSG_SUCCESS) {
1214 return MSG_ERR_DB_EXEC;
1218 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1219 snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, 0, 0, 0, 0, 0, 0, 0, '', '');",
1220 MSGFW_CONVERSATION_TABLE_NAME, *pConvId);
1222 if (pDbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
1223 MSG_DEBUG("Query Failed. [%s]", sqlQuery);
1224 return MSG_ERR_DB_EXEC;
1231 msg_error_t MsgStoSetConversationDisplayName(MsgDbHandler *pDbHandle, int contactId)
1233 msg_error_t err = MSG_SUCCESS;
1235 char displayName[MAX_DISPLAY_NAME_LEN+1];
1236 char sqlQuery[MAX_QUERY_LEN+1];
1238 MSG_DEBUG("contactId [%d]", contactId);
1240 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1241 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT DISTINCT(CONV_ID) FROM %s WHERE CONTACT_ID = %d;",
1242 MSGFW_ADDRESS_TABLE_NAME, contactId);
1244 err = pDbHandle->getTable(sqlQuery, &rowCnt);
1246 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
1247 pDbHandle->freeTable();
1248 MSG_DEBUG("Query Failed [%s]", sqlQuery);
1252 int order = MsgGetContactNameOrder();
1253 msg_struct_s *pAddrInfo = NULL;
1254 MSG_ADDRESS_INFO_S *address = NULL;
1256 for (int i = 1; i <= rowCnt; i++)
1258 memset(displayName, 0x00, sizeof(displayName));
1259 MsgDbHandler tmpDbHandle;
1260 msg_struct_list_s addressList = {0,};
1261 MsgStoGetAddressByConvId(&tmpDbHandle, (msg_thread_id_t)pDbHandle->getColumnToInt(i), order, &addressList);
1263 for (int j = 0; j < addressList.nCount; j++)
1266 strncat(displayName, ", ", MAX_DISPLAY_NAME_LEN-strlen(displayName));
1268 pAddrInfo = (msg_struct_s *)addressList.msg_struct_info[j];
1269 address = (MSG_ADDRESS_INFO_S *)pAddrInfo->data;
1271 if (address->displayName[0] == '\0')
1272 strncat(displayName, address->addressVal, MAX_DISPLAY_NAME_LEN-strlen(displayName));
1274 strncat(displayName, address->displayName, MAX_DISPLAY_NAME_LEN-strlen(displayName));
1277 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1278 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET DISPLAY_NAME = ? WHERE CONV_ID = %d;",
1279 MSGFW_CONVERSATION_TABLE_NAME, pDbHandle->getColumnToInt(i));
1281 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
1282 MSG_DEBUG("Query Failed [%s]", sqlQuery);
1283 return MSG_ERR_DB_PREPARE;
1286 pDbHandle->bindText(displayName, 1);
1288 if (pDbHandle->stepQuery() != MSG_ERR_DB_DONE) {
1289 pDbHandle->finalizeQuery();
1290 MSG_DEBUG("Update Conversation disply name. Fail [%s]", sqlQuery);
1291 return MSG_ERR_DB_STEP;
1294 pDbHandle->finalizeQuery();
1296 // free address list
1297 for(int j = 0; j < MAX_TO_ADDRESS_CNT; j++){
1298 msg_struct_s *pStruct = (msg_struct_s *)addressList.msg_struct_info[j];
1299 delete [] (MSG_ADDRESS_INFO_S *)pStruct->data;
1300 delete [] (msg_struct_s *)pStruct;
1304 pDbHandle->freeTable();
1310 msg_error_t MsgStoSetConversationDisplayName(MsgDbHandler *pDbHandle, msg_thread_id_t convId)
1312 msg_error_t err = MSG_SUCCESS;
1314 char displayName[MAX_DISPLAY_NAME_LEN+1];
1315 char sqlQuery[MAX_QUERY_LEN+1];
1317 msg_struct_list_s addressList = {0,};
1319 int order = MsgGetContactNameOrder();
1320 msg_struct_s *pAddrInfo = NULL;
1321 MSG_ADDRESS_INFO_S *address = NULL;
1323 memset(displayName, 0x00, sizeof(displayName));
1325 MsgStoGetAddressByConvId(pDbHandle, convId, order, &addressList);
1327 for (int j = 0; j < addressList.nCount; j++)
1330 strncat(displayName, ", ", MAX_DISPLAY_NAME_LEN-strlen(displayName));
1332 pAddrInfo = (msg_struct_s *)addressList.msg_struct_info[j];
1333 address = (MSG_ADDRESS_INFO_S *)pAddrInfo->data;
1335 if (address->displayName[0] == '\0')
1336 strncat(displayName, address->addressVal, MAX_DISPLAY_NAME_LEN-strlen(displayName));
1338 strncat(displayName, address->displayName, MAX_DISPLAY_NAME_LEN-strlen(displayName));
1341 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1342 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET DISPLAY_NAME = ? WHERE CONV_ID = %d;",
1343 MSGFW_CONVERSATION_TABLE_NAME, convId);
1345 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
1346 MSG_DEBUG("Query Failed [%s]", sqlQuery);
1347 return MSG_ERR_DB_PREPARE;
1350 pDbHandle->bindText(displayName, 1);
1352 if (pDbHandle->stepQuery() != MSG_ERR_DB_DONE) {
1353 pDbHandle->finalizeQuery();
1354 MSG_DEBUG("Update Conversation disply name. Fail [%s]", sqlQuery);
1355 return MSG_ERR_DB_STEP;
1358 pDbHandle->finalizeQuery();
1360 for(int j = 0; j < MAX_TO_ADDRESS_CNT; j++){
1361 msg_struct_s *pStruct = (msg_struct_s *)addressList.msg_struct_info[j];
1362 delete [] (MSG_ADDRESS_INFO_S *)pStruct->data;
1363 delete [] (msg_struct_s *)pStruct;
1369 msg_error_t MsgStoUpdateNetworkStatus(MsgDbHandler *pDbHandle, MSG_MESSAGE_INFO_S *pMsgInfo, msg_network_status_t status)
1371 msg_error_t err = MSG_SUCCESS;
1373 char sqlQuery[MAX_QUERY_LEN+1];
1375 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1377 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET NETWORK_STATUS = %d WHERE MSG_ID = %d;",
1378 MSGFW_MESSAGE_TABLE_NAME, status, pMsgInfo->msgId);
1380 if (pDbHandle->execQuery(sqlQuery) != MSG_SUCCESS)
1381 err = MSG_ERR_DB_EXEC;
1386 char *MsgStoReplaceString(const char *origStr, const char *oldStr, const char *newStr)
1388 if (origStr == NULL)
1391 char *replaceStr = NULL;
1398 if (g_strcmp0(oldStr, newStr) != 0) {
1399 oldStrLen = strlen(oldStr);
1400 newStrLen = strlen(newStr);
1402 for (i = 0; origStr[i] != '\0';) {
1403 if (memcmp(&origStr[i], oldStr, oldStrLen) == 0) {
1411 return g_strdup(origStr);
1414 replaceStr = (char *)calloc(1, i + sizeof(char) * (matchedCnt * (newStrLen - oldStrLen) + 1));
1415 if (replaceStr == NULL)
1421 if (memcmp(origStr, oldStr, oldStrLen) == 0) {
1422 memcpy(pTemp, newStr, newStrLen);
1424 origStr += oldStrLen;
1426 *pTemp++ = *origStr++;
1434 msg_error_t MsgStoRefreshConversationDisplayName()
1436 msg_error_t err = MSG_SUCCESS;
1437 MsgDbHandler dbHandle;
1439 char displayName[MAX_DISPLAY_NAME_LEN+1];
1440 char sqlQuery[MAX_QUERY_LEN+1];
1442 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1443 snprintf(sqlQuery, sizeof(sqlQuery),
1444 "SELECT DISTINCT(CONTACT_ID) FROM %s;",
1445 MSGFW_ADDRESS_TABLE_NAME);
1447 err = dbHandle.getTable(sqlQuery, &rowCnt);
1449 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
1450 dbHandle.freeTable();
1451 MSG_DEBUG("Query Failed [%s]", sqlQuery);
1455 for (int i = 1; i <= rowCnt; i++)
1457 MsgUpdateContact(dbHandle.getColumnToInt(i), -1);
1460 dbHandle.freeTable();