2 * Copyright 2012 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.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.tizenopensource.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"
29 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}};
32 /*==================================================================================================
33 FUNCTION IMPLEMENTATION
34 ==================================================================================================*/
35 unsigned int MsgStoAddMessageTable(MsgDbHandler *pDbHandle, const MSG_MESSAGE_INFO_S *pMsgInfo)
39 msg_error_t err = MSG_SUCCESS;
41 msg_message_id_t msgId = 0;
43 err = pDbHandle->getRowId(MSGFW_MESSAGE_TABLE_NAME, &msgId);
45 if (err != MSG_SUCCESS)
50 char* pFileData = NULL;
51 AutoPtr<char> buf(&pFileData);
54 if (pMsgInfo->bTextSms == false) {
55 if (MsgOpenAndReadFile(pMsgInfo->msgData, &pFileData, &fileSize) == false)
58 MSG_DEBUG("file size [%d]", fileSize);
62 char sqlQuery[MAX_QUERY_LEN+1];
64 memset(sqlQuery, 0x00, sizeof(sqlQuery));
66 snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, %d, %d, %d, %d, %d, %ld, %d, %d, %d, %d, %d, %d, %ld, %d, ?, ?, ?, ?, 0);",
67 MSGFW_MESSAGE_TABLE_NAME, msgId, pMsgInfo->threadId, pMsgInfo->folderId, pMsgInfo->storageId, pMsgInfo->msgType.mainType,
68 pMsgInfo->msgType.subType, pMsgInfo->displayTime, pMsgInfo->dataSize, pMsgInfo->networkStatus, pMsgInfo->bRead, pMsgInfo->bProtected,
69 pMsgInfo->priority, pMsgInfo->direction, 0, pMsgInfo->bBackup);
71 MSG_DEBUG("QUERY : %s", sqlQuery);
73 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
76 pDbHandle->bindText(pMsgInfo->subject, 1);
78 pDbHandle->bindText(pMsgInfo->msgData, 2);
80 pDbHandle->bindText(pMsgInfo->thumbPath, 3);
82 if (pMsgInfo->bTextSms == false)
83 pDbHandle->bindText(pFileData, 4);
85 pDbHandle->bindText(pMsgInfo->msgText, 4);
87 if (pDbHandle->stepQuery() != MSG_ERR_DB_DONE) {
88 pDbHandle->finalizeQuery();
92 pDbHandle->finalizeQuery();
98 msg_error_t MsgStoSetReadStatus(MsgDbHandler *pDbHandle, msg_message_id_t msgId, bool bRead)
100 char sqlQuery[MAX_QUERY_LEN+1];
102 memset(sqlQuery, 0x00, sizeof(sqlQuery));
103 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET READ_STATUS = %d WHERE MSG_ID = %d;",
104 MSGFW_MESSAGE_TABLE_NAME, (int)bRead, msgId);
106 if (pDbHandle->execQuery(sqlQuery) != MSG_SUCCESS)
107 return MSG_ERR_DB_EXEC;
109 // Get MAIN_TYPE, SUB_TYPE, STORAGE_ID
110 memset(sqlQuery, 0x00, sizeof(sqlQuery));
111 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.MAIN_TYPE, A.SUB_TYPE, B.CONV_ID \
112 FROM %s A, %s B WHERE A.MSG_ID = %d AND A.CONV_ID = B.CONV_ID;",
113 MSGFW_MESSAGE_TABLE_NAME, MSGFW_CONVERSATION_TABLE_NAME, msgId);
115 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
116 return MSG_ERR_DB_PREPARE;
118 MSG_MESSAGE_TYPE_S msgType;
119 msg_thread_id_t convId;
121 if (pDbHandle->stepQuery() == MSG_ERR_DB_ROW) {
122 msgType.mainType = pDbHandle->columnInt(0);
123 msgType.subType = pDbHandle->columnInt(1);
124 convId = pDbHandle->columnInt(2);
126 pDbHandle->finalizeQuery();
127 return MSG_ERR_DB_STEP;
130 pDbHandle->finalizeQuery();
132 MSG_DEBUG("Main Type:[%d] SubType:[%d] ConvId:[%d]", msgType.mainType, msgType.subType, convId);
134 if (MsgStoUpdateConversation(pDbHandle, convId) != MSG_SUCCESS) {
135 MSG_DEBUG("MsgStoUpdateConversation() Error");
136 return MSG_ERR_STORAGE_ERROR;
139 int smsCnt = 0, mmsCnt = 0;
141 smsCnt = MsgStoGetUnreadCnt(pDbHandle, MSG_SMS_TYPE);
142 mmsCnt = MsgStoGetUnreadCnt(pDbHandle, MSG_MMS_TYPE);
144 MsgSettingSetIndicator(smsCnt, mmsCnt);
146 // MsgDeleteNotiByMsgId(msgId);
153 msg_error_t MsgStoGetOldestMessage(MsgDbHandler *pDbHandle, const MSG_MESSAGE_INFO_S *pMsgInfo, msg_message_id_t *pMsgId)
155 char sqlQuery[MAX_QUERY_LEN+1];
157 memset(sqlQuery, 0x00, sizeof(sqlQuery));
159 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s \
160 WHERE SUB_TYPE = %d AND FOLDER_ID = %d AND STORAGE_ID = %d AND PROTECTED = 0 \
161 ORDER BY DISPLAY_TIME ASC",
162 MSGFW_MESSAGE_TABLE_NAME, pMsgInfo->msgType.subType, pMsgInfo->folderId, MSG_STORAGE_PHONE);
164 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
165 return MSG_ERR_DB_PREPARE;
167 if (pDbHandle->stepQuery() == MSG_ERR_DB_ROW) {
168 *pMsgId = pDbHandle->columnInt(0);
170 pDbHandle->finalizeQuery();
171 return MSG_ERR_DB_STEP;
174 pDbHandle->finalizeQuery();
180 msg_error_t MsgStoCheckMsgCntFull(MsgDbHandler *pDbHandle, const MSG_MESSAGE_TYPE_S* pMsgType, msg_folder_id_t folderId)
184 msg_error_t err = MSG_SUCCESS;
185 struct statfs buf = {0};
187 if (statfs(MSG_DATA_ROOT_PATH, &buf) == -1) {
188 MSG_DEBUG("statfs(\"%s\") failed - %d", MSG_DATA_ROOT_PATH);
189 return MSG_ERR_STORAGE_ERROR;
192 unsigned long freeSpace = (buf.f_bfree * buf.f_bsize);
194 MSG_DEBUG("f_bfree [%d] f_bsize [%d]", buf.f_bfree, buf.f_bsize);
195 MSG_DEBUG("Free space of storage is [%ul] MB.", freeSpace);
197 if (freeSpace < SMS_MINIMUM_SPACE && pMsgType->mainType == MSG_SMS_TYPE)
198 err = MSG_ERR_MESSAGE_COUNT_FULL;
199 else if(freeSpace < MMS_MINIMUM_SPACE && pMsgType->mainType == MSG_MMS_TYPE)
200 err = MSG_ERR_MESSAGE_COUNT_FULL;
208 msg_error_t MsgStoCountMsgByLimitCategory(MsgDbHandler *pDbHandle, const MSG_MESSAGE_TYPE_S *pMsgType, int *pMsgCount, msg_folder_id_t folderId)
210 if (pMsgType == NULL) {
211 MSG_DEBUG("pMsgType is NULL");
212 return MSG_ERR_NULL_POINTER;
217 char sqlQuery[MAX_QUERY_LEN+1];
218 memset(sqlQuery, 0x00, sizeof(sqlQuery));
220 if ((pMsgType->mainType == MSG_SMS_TYPE) && (pMsgType->subType == MSG_WAP_SI_SMS ||pMsgType->subType == MSG_WAP_SL_SMS)) { // PUSH
221 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s WHERE MAIN_TYPE = %d AND SUB_TYPE IN (%d, %d) AND FOLDER_ID = %d;",
222 MSGFW_MESSAGE_TABLE_NAME, pMsgType->mainType, MSG_WAP_SI_SMS, MSG_WAP_SL_SMS, MSG_INBOX_ID);
223 } else if ((pMsgType->mainType == MSG_SMS_TYPE) && (pMsgType->subType == MSG_CB_SMS)) { // CB
224 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s WHERE MAIN_TYPE = %d AND SUB_TYPE IN (%d) AND FOLDER_ID = %d;",
225 MSGFW_MESSAGE_TABLE_NAME, pMsgType->mainType, MSG_CB_SMS, MSG_CBMSGBOX_ID);
226 } else if ((pMsgType->mainType == MSG_SMS_TYPE) && (pMsgType->subType == MSG_SYNCML_CP)) { // Provision
227 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s WHERE MAIN_TYPE = %d AND SUB_TYPE IN (%d) AND FOLDER_ID = %d;",
228 MSGFW_MESSAGE_TABLE_NAME, pMsgType->mainType, MSG_SYNCML_CP, MSG_INBOX_ID);
229 } else if ((pMsgType->mainType == MSG_SMS_TYPE)) { // SMS
230 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;",
231 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
232 } else if ((pMsgType->mainType == MSG_MMS_TYPE) &&
233 (pMsgType->subType == MSG_SENDREQ_MMS || pMsgType->subType == MSG_SENDCONF_MMS || pMsgType->subType == MSG_RETRIEVE_AUTOCONF_MMS ||
234 pMsgType->subType == MSG_RETRIEVE_MANUALCONF_MMS || pMsgType->subType == MSG_NOTIFICATIONIND_MMS)) { // MMS
235 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;",
236 MSGFW_MESSAGE_TABLE_NAME, pMsgType->mainType, MSG_SENDREQ_MMS, MSG_SENDCONF_MMS, MSG_RETRIEVE_AUTOCONF_MMS, MSG_RETRIEVE_MANUALCONF_MMS, MSG_NOTIFICATIONIND_MMS, folderId);
238 return MSG_ERR_INVALID_PARAMETER;
241 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
242 return MSG_ERR_DB_PREPARE;
244 if (pDbHandle->stepQuery() == MSG_ERR_DB_ROW) {
245 *pMsgCount = pDbHandle->columnInt(0);
247 pDbHandle->finalizeQuery();
248 return MSG_ERR_DB_STEP;
251 pDbHandle->finalizeQuery();
257 int MsgStoCheckMsgCntLimit(const MSG_MESSAGE_TYPE_S* pMsgType, msg_folder_id_t folderId)
265 msgboxType = MSG_COUNT_LIMIT_INBOX_TYPE;
269 msgboxType = MSG_COUNT_LIMIT_OUTBOX_TYPE;
272 case MSG_SENTBOX_ID :
273 msgboxType = MSG_COUNT_LIMIT_SENTBOX_TYPE;
277 msgboxType = MSG_COUNT_LIMIT_DRAFTBOX_TYPE;
280 case MSG_CBMSGBOX_ID :
281 msgboxType = MSG_COUNT_LIMIT_CBMSGBOX_TYPE;
285 MSG_DEBUG("Unknown mailbox Type [%d]", folderId);
289 switch (pMsgType->subType)
292 case MSG_REPLACE_TYPE1_SMS:
293 case MSG_REPLACE_TYPE2_SMS:
294 case MSG_REPLACE_TYPE3_SMS:
295 case MSG_REPLACE_TYPE4_SMS:
296 case MSG_REPLACE_TYPE5_SMS:
297 case MSG_REPLACE_TYPE6_SMS:
298 case MSG_REPLACE_TYPE7_SMS:
299 case MSG_MWI_VOICE_SMS:
300 case MSG_MWI_FAX_SMS:
301 case MSG_MWI_EMAIL_SMS:
302 case MSG_MWI_OTHER_SMS:
303 case MSG_STATUS_REPORT_SMS:
304 msgType = MSG_COUNT_LIMIT_SMS_TYPE;
308 msgType = MSG_COUNT_LIMIT_CB_TYPE;
313 msgType = MSG_COUNT_LIMIT_WAPPUSH_TYPE;
317 msgType = MSG_COUNT_LIMIT_PROVISION_TYPE;
320 case MSG_SENDREQ_MMS:
321 case MSG_SENDCONF_MMS:
322 case MSG_NOTIFICATIONIND_MMS:
323 case MSG_RETRIEVE_AUTOCONF_MMS:
324 case MSG_RETRIEVE_MANUALCONF_MMS:
325 msgType = MSG_COUNT_LIMIT_MMS_TYPE;
329 MSG_DEBUG("Unknown Message Type [%d]", pMsgType->subType);
333 return msgCntLimit[msgboxType][msgType];
337 msg_error_t MsgStoAddAddress(MsgDbHandler *pDbHandle, const MSG_MESSAGE_INFO_S *pMsg, msg_thread_id_t *pConvId)
339 msg_error_t err = MSG_SUCCESS;
341 char sqlQuery[MAX_QUERY_LEN+1];
343 // Check if new address or not
344 if (MsgExistAddress(pDbHandle, pMsg, pConvId) == true) {
345 MSG_DEBUG("The address already exists. Conversation ID : [%d]", *pConvId);
349 MSG_DEBUG("Conversation ID : [%d]", *pConvId);
351 /* conversation insert */
352 err = MsgStoAddConversation(pDbHandle, pConvId);
353 if (err != MSG_SUCCESS) {
354 MSG_DEBUG("MsgStoAddConversation() fail [%d]", err);
358 /* insert address in loop */
359 for (int i=0; i<pMsg->nAddressCnt; i++) {
362 MSG_CONTACT_INFO_S contactInfo = {0};
365 err = MsgGetContactInfo(&(pMsg->addressList[i]), &contactInfo);
367 if (err != MSG_SUCCESS) {
368 MSG_DEBUG("MsgGetContactInfo() fail [%d]", err);
372 if (pDbHandle->getRowId(MSGFW_ADDRESS_TABLE_NAME, &addrId) != MSG_SUCCESS) {
377 memset(sqlQuery, 0x00, sizeof(sqlQuery));
378 snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, %d, %d, %d, '%s', %d, '', ?, ?, '%s', 0);",
379 MSGFW_ADDRESS_TABLE_NAME, addrId, *pConvId, pMsg->addressList[i].addressType, pMsg->addressList[i].recipientType, pMsg->addressList[i].addressVal,
380 contactInfo.contactId, contactInfo.imagePath);
382 MSG_DEBUG("Add Address Info. [%s]", sqlQuery);
384 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
385 return MSG_ERR_DB_PREPARE;
387 pDbHandle->bindText(contactInfo.firstName, 1);
388 pDbHandle->bindText(contactInfo.lastName, 2);
390 if (pDbHandle->stepQuery() != MSG_ERR_DB_DONE) {
391 pDbHandle->finalizeQuery();
392 return MSG_ERR_DB_STEP;
395 pDbHandle->finalizeQuery();
397 // set conversation display name by conv id
398 MsgStoSetConversationDisplayName(pDbHandle, *pConvId);
405 msg_error_t MsgStoGetAddressByMsgId(MsgDbHandler *pDbHandle, msg_message_id_t msgId, int contactNameOrder, int *nAddressCnt, MSG_ADDRESS_INFO_S *pAddress)
407 char sqlQuery[MAX_QUERY_LEN+1];
408 char firstName[MAX_DISPLAY_NAME_LEN+1];
409 char lastName[MAX_DISPLAY_NAME_LEN+1];
413 memset(sqlQuery, 0x00, sizeof(sqlQuery));
414 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.ADDRESS_TYPE, A.RECIPIENT_TYPE, \
415 A.CONTACT_ID, A.ADDRESS_VAL, A.DISPLAY_NAME, A.FIRST_NAME, A.LAST_NAME \
416 FROM %s A, %s B WHERE A.CONV_ID = B.CONV_ID AND B.MSG_ID = %d;",
417 MSGFW_ADDRESS_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME, msgId);
419 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
420 MSG_DEBUG("Query Failed [%s]", sqlQuery);
421 return MSG_ERR_DB_PREPARE;
424 while (pDbHandle->stepQuery() == MSG_ERR_DB_ROW) {
425 memset(firstName, 0x00, sizeof(firstName));
426 memset(lastName, 0x00, sizeof(lastName));
428 pAddress[*nAddressCnt].addressType = pDbHandle->columnInt(0);
429 pAddress[*nAddressCnt].recipientType = pDbHandle->columnInt(1);
430 pAddress[*nAddressCnt].contactId = pDbHandle->columnInt(2);
432 if (pDbHandle->columnText(3) != NULL)
433 strncpy(pAddress[*nAddressCnt].addressVal, (char *)pDbHandle->columnText(3), MAX_ADDRESS_VAL_LEN);
435 if (pDbHandle->columnText(4) != NULL && ((char *)pDbHandle->columnText(4))[0]!='\0') {
436 MSG_DEBUG("displayName : [%s]", pDbHandle->columnText(4));
437 strncpy(pAddress[*nAddressCnt].displayName, (char *)pDbHandle->columnText(4), MAX_DISPLAY_NAME_LEN);
439 if (pDbHandle->columnText(5) != NULL)
440 strncpy(firstName, (char *)pDbHandle->columnText(5), MAX_DISPLAY_NAME_LEN);
442 if (pDbHandle->columnText(6) != NULL)
443 strncpy(lastName, (char *)pDbHandle->columnText(6), MAX_DISPLAY_NAME_LEN);
445 if (contactNameOrder == 0) {
446 if (strlen(firstName) > 0) {
447 strncpy(pAddress[*nAddressCnt].displayName, firstName, MAX_DISPLAY_NAME_LEN);
449 if (strlen(lastName) > 0) {
450 strncat(pAddress[*nAddressCnt].displayName, " ", MAX_DISPLAY_NAME_LEN-strlen(pAddress[*nAddressCnt].displayName));
451 strncat(pAddress[*nAddressCnt].displayName, lastName, MAX_DISPLAY_NAME_LEN-strlen(pAddress[*nAddressCnt].displayName));
453 } else if (contactNameOrder == 1) {
454 if (strlen(lastName) > 0) {
455 strncpy(pAddress[*nAddressCnt].displayName, lastName, MAX_DISPLAY_NAME_LEN);
456 strncat(pAddress[*nAddressCnt].displayName, " ", MAX_DISPLAY_NAME_LEN-strlen(pAddress[*nAddressCnt].displayName));
459 if (strlen(firstName) > 0) {
460 strncat(pAddress[*nAddressCnt].displayName, firstName, MAX_DISPLAY_NAME_LEN-strlen(pAddress[*nAddressCnt].displayName));
468 pDbHandle->finalizeQuery();
473 msg_error_t MsgStoGetAddressByMsgId(MsgDbHandler *pDbHandle, msg_message_id_t msgId, int contactNameOrder, msg_struct_list_s *pAddress)
475 char sqlQuery[MAX_QUERY_LEN+1];
476 char firstName[MAX_DISPLAY_NAME_LEN+1];
477 char lastName[MAX_DISPLAY_NAME_LEN+1];
479 pAddress->nCount = 0;
480 pAddress->msg_struct_info = NULL;
482 memset(sqlQuery, 0x00, sizeof(sqlQuery));
483 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.ADDRESS_TYPE, A.RECIPIENT_TYPE, \
484 A.CONTACT_ID, A.ADDRESS_VAL, A.DISPLAY_NAME, A.FIRST_NAME, A.LAST_NAME \
485 FROM %s A, %s B WHERE A.CONV_ID = B.CONV_ID AND B.MSG_ID = %d;",
486 MSGFW_ADDRESS_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME, msgId);
488 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
489 MSG_DEBUG("Query Failed [%s]", sqlQuery);
490 return MSG_ERR_DB_PREPARE;
493 msg_struct_s *pTmp = NULL;
494 MSG_ADDRESS_INFO_S *pAddr = NULL;
496 pAddress->msg_struct_info = (msg_struct_t *)new char[sizeof(msg_struct_t) * MAX_TO_ADDRESS_CNT];
498 for (int i = 0; i < MAX_TO_ADDRESS_CNT; i++) {
499 pAddress->msg_struct_info[i] = (msg_struct_t)new char[sizeof(msg_struct_s)];
500 pTmp = (msg_struct_s *)pAddress->msg_struct_info[i];
501 pTmp->type = MSG_STRUCT_ADDRESS_INFO;
502 pTmp->data = new char[sizeof(MSG_ADDRESS_INFO_S)];
503 memset(pTmp->data, 0x00, sizeof(MSG_ADDRESS_INFO_S));
507 while (pDbHandle->stepQuery() == MSG_ERR_DB_ROW) {
508 memset(firstName, 0x00, sizeof(firstName));
509 memset(lastName, 0x00, sizeof(lastName));
511 pTmp = (msg_struct_s *)pAddress->msg_struct_info[pAddress->nCount];
512 pAddr = (MSG_ADDRESS_INFO_S *)pTmp->data;
514 pAddr->addressType = pDbHandle->columnInt(0);
515 pAddr->recipientType = pDbHandle->columnInt(1);
516 pAddr->contactId = pDbHandle->columnInt(2);
518 if (pDbHandle->columnText(3) != NULL)
519 strncpy(pAddr->addressVal, (char *)pDbHandle->columnText(3), MAX_ADDRESS_VAL_LEN);
521 if (pDbHandle->columnText(4) != NULL && ((char *)pDbHandle->columnText(4))[0]!='\0') {
522 MSG_DEBUG("displayName : [%s]", pDbHandle->columnText(4));
523 strncpy(pAddr->displayName, (char *)pDbHandle->columnText(4), MAX_DISPLAY_NAME_LEN);
525 if (pDbHandle->columnText(5) != NULL)
526 strncpy(firstName, (char *)pDbHandle->columnText(5), MAX_DISPLAY_NAME_LEN);
528 if (pDbHandle->columnText(6) != NULL)
529 strncpy(lastName, (char *)pDbHandle->columnText(6), MAX_DISPLAY_NAME_LEN);
531 if (contactNameOrder == 0) {
532 if (strlen(firstName) > 0) {
533 strncpy(pAddr->displayName, firstName, MAX_DISPLAY_NAME_LEN);
536 if (strlen(lastName) > 0) {
537 strncat(pAddr->displayName, " ", MAX_DISPLAY_NAME_LEN-strlen(pAddr->displayName));
538 strncat(pAddr->displayName, lastName, MAX_DISPLAY_NAME_LEN-strlen(pAddr->displayName));
540 } else if (contactNameOrder == 1) {
541 if (strlen(lastName) > 0) {
542 strncpy(pAddr->displayName, lastName, MAX_DISPLAY_NAME_LEN);
543 strncat(pAddr->displayName, " ", MAX_DISPLAY_NAME_LEN-strlen(pAddr->displayName));
546 if (strlen(firstName) > 0) {
547 strncat(pAddr->displayName, firstName, MAX_DISPLAY_NAME_LEN-strlen(pAddr->displayName));
555 pDbHandle->finalizeQuery();
561 msg_error_t MsgStoGetAddressByConvId(MsgDbHandler *pDbHandle, msg_thread_id_t convId, int contactNameOrder, msg_struct_list_s *pAddrlist)
563 char sqlQuery[MAX_QUERY_LEN+1];
564 char firstName[MAX_DISPLAY_NAME_LEN+1];
565 char lastName[MAX_DISPLAY_NAME_LEN+1];
569 pAddrlist->nCount = 0;
570 pAddrlist->msg_struct_info = NULL;
572 memset(sqlQuery, 0x00, sizeof(sqlQuery));
573 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT ADDRESS_TYPE, RECIPIENT_TYPE, \
574 CONTACT_ID, ADDRESS_VAL, DISPLAY_NAME, FIRST_NAME, LAST_NAME \
575 FROM %s WHERE CONV_ID = %d;",
576 MSGFW_ADDRESS_TABLE_NAME, convId);
578 msg_error_t err = pDbHandle->getTable(sqlQuery, &rowCnt);
580 if (err == MSG_ERR_DB_NORECORD) {
581 pDbHandle->freeTable();
583 } else if (err != MSG_SUCCESS) {
584 MSG_DEBUG("sqlQuery is - %s", sqlQuery);
585 pDbHandle->freeTable();
589 pAddrlist->nCount = rowCnt;
591 MSG_DEBUG("pAddrlist->nCount [%d]", pAddrlist->nCount);
593 msg_struct_s *pTmp = NULL;
594 MSG_ADDRESS_INFO_S *pAddr = NULL;
596 pAddrlist->msg_struct_info = (msg_struct_t *)new char[sizeof(msg_struct_t) * MAX_TO_ADDRESS_CNT];
598 for (int i = 0; i < MAX_TO_ADDRESS_CNT; i++) {
599 pAddrlist->msg_struct_info[i] = (msg_struct_t)new char[sizeof(msg_struct_s)];
600 pTmp = (msg_struct_s *)pAddrlist->msg_struct_info[i];
601 pTmp->type = MSG_STRUCT_ADDRESS_INFO;
602 pTmp->data = new char[sizeof(MSG_ADDRESS_INFO_S)];
603 memset(pTmp->data, 0x00, sizeof(MSG_ADDRESS_INFO_S));
606 for (int i = 0; i < rowCnt; i++) {
607 pTmp = (msg_struct_s *)pAddrlist->msg_struct_info[i];
608 pAddr = (MSG_ADDRESS_INFO_S *)pTmp->data;
610 pAddr->addressType = pDbHandle->getColumnToInt(index++);
611 pAddr->recipientType = pDbHandle->getColumnToInt(index++);
612 pAddr->contactId = pDbHandle->getColumnToInt(index++);
613 pDbHandle->getColumnToString(index++, MAX_ADDRESS_VAL_LEN, pAddr->addressVal);
614 pDbHandle->getColumnToString(index++, MAX_DISPLAY_NAME_LEN, pAddr->displayName);
615 if(!strlen(pAddr->displayName))
617 pDbHandle->getColumnToString(index++,MAX_DISPLAY_NAME_LEN, firstName);
618 pDbHandle->getColumnToString(index++,MAX_DISPLAY_NAME_LEN, lastName);
620 if (contactNameOrder == 0) {
621 if (strlen(firstName) > 0) {
622 strncpy(pAddr->displayName, firstName, MAX_DISPLAY_NAME_LEN);
625 if (strlen(lastName) > 0) {
626 strncat(pAddr->displayName, " ", MAX_DISPLAY_NAME_LEN-strlen(pAddr->displayName));
627 strncat(pAddr->displayName, lastName, MAX_DISPLAY_NAME_LEN-strlen(pAddr->displayName));
629 } else if (contactNameOrder == 1) {
630 if (strlen(lastName) > 0) {
631 strncpy(pAddr->displayName, lastName, MAX_DISPLAY_NAME_LEN);
632 strncat(pAddr->displayName, " ", MAX_DISPLAY_NAME_LEN-strlen(pAddr->displayName));
635 if (strlen(firstName) > 0) {
636 strncat(pAddr->displayName, firstName, MAX_DISPLAY_NAME_LEN-strlen(pAddr->displayName));
642 pDbHandle->freeTable();
648 /* Have to use trigger for this function. */
649 msg_error_t MsgStoUpdateConversation(MsgDbHandler *pDbHandle, msg_thread_id_t convId)
653 msg_error_t err = MSG_SUCCESS;
659 char msgText[MAX_THREAD_DATA_LEN+1];
660 char sqlQuery[MAX_QUERY_LEN+1];
662 memset(msgText, 0x00, sizeof(msgText));
665 memset(sqlQuery, 0x00, sizeof(sqlQuery));
667 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;",
668 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_INBOX_ID, MSG_STORAGE_PHONE);
670 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
671 return MSG_ERR_DB_PREPARE;
673 err = pDbHandle->stepQuery();
675 if (err == MSG_ERR_DB_ROW) {
676 unreadCnt = pDbHandle->columnInt(0);
677 } else if (err != MSG_ERR_DB_DONE) {
678 pDbHandle->finalizeQuery();
679 return MSG_ERR_DB_STEP;
682 pDbHandle->finalizeQuery();
685 memset(sqlQuery, 0x00, sizeof(sqlQuery));
687 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;",
688 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_SMS_TYPE, MSG_ALLBOX_ID, MSG_CBMSGBOX_ID, MSG_STORAGE_PHONE);
690 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
691 return MSG_ERR_DB_PREPARE;
693 err = pDbHandle->stepQuery();
695 if (err == MSG_ERR_DB_ROW) {
696 smsCnt = pDbHandle->columnInt(0);
698 else if (err != MSG_ERR_DB_DONE) {
699 pDbHandle->finalizeQuery();
700 return MSG_ERR_DB_STEP;
703 pDbHandle->finalizeQuery();
706 memset(sqlQuery, 0x00, sizeof(sqlQuery));
708 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s \
709 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;",
710 MSGFW_MESSAGE_TABLE_NAME, convId, MSG_MMS_TYPE, MSG_DELIVERYIND_MMS, MSG_READRECIND_MMS, MSG_READORGIND_MMS,
711 MSG_ALLBOX_ID, MSG_CBMSGBOX_ID, MSG_STORAGE_PHONE);
713 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
714 return MSG_ERR_DB_PREPARE;
716 err = pDbHandle->stepQuery();
718 if (err == MSG_ERR_DB_ROW) {
719 mmsCnt = pDbHandle->columnInt(0);
720 } else if (err != MSG_ERR_DB_DONE) {
721 pDbHandle->finalizeQuery();
722 return MSG_ERR_DB_STEP;
725 pDbHandle->finalizeQuery();
727 // Get Latest Msg Data
728 MSG_MAIN_TYPE_T mainType = MSG_UNKNOWN_TYPE;
729 MSG_SUB_TYPE_T subType = MSG_NORMAL_SMS;
730 msg_direction_type_t direction = MSG_DIRECTION_TYPE_MO;
733 memset(sqlQuery, 0x00, sizeof(sqlQuery));
735 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MAIN_TYPE, SUB_TYPE, MSG_DIRECTION, DISPLAY_TIME, SUBJECT, MSG_TEXT FROM %s \
736 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 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
740 return MSG_ERR_DB_PREPARE;
742 err = pDbHandle->stepQuery();
744 if (err == MSG_ERR_DB_ROW) {
745 mainType = pDbHandle->columnInt(0);
746 subType = pDbHandle->columnInt(1);
747 direction = pDbHandle->columnInt(2);
749 msgTime = (time_t)pDbHandle->columnInt(3);
751 memset(msgText, 0x00, sizeof(msgText));
753 if (mainType == MSG_SMS_TYPE) {
754 if (pDbHandle->columnText(5) != NULL)
755 strncpy(msgText, (char*)pDbHandle->columnText(5), MAX_THREAD_DATA_LEN);
756 } else if (mainType == MSG_MMS_TYPE) {
757 if (pDbHandle->columnText(4) != NULL) {
758 strncpy(msgText, (char*)pDbHandle->columnText(4), MAX_THREAD_DATA_LEN);
761 if ((strlen(msgText) <= 0) && (pDbHandle->columnText(5) != NULL) && (subType != MSG_NOTIFICATIONIND_MMS)) {
762 memset(msgText, 0x00, sizeof(msgText));
763 strncpy(msgText, (char*)pDbHandle->columnText(5), MAX_THREAD_DATA_LEN);
766 } else if (err != MSG_ERR_DB_DONE) {
767 pDbHandle->finalizeQuery();
768 return MSG_ERR_DB_STEP;
771 pDbHandle->finalizeQuery();
773 // Update Address Table
774 memset(sqlQuery, 0x00, sizeof(sqlQuery));
776 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET \
777 UNREAD_CNT = %d, SMS_CNT = %d, MMS_CNT = %d, MAIN_TYPE = %d, SUB_TYPE = %d, MSG_DIRECTION = %d, DISPLAY_TIME = %ld, MSG_TEXT = ? \
778 WHERE CONV_ID = %d;", MSGFW_CONVERSATION_TABLE_NAME, unreadCnt, smsCnt, mmsCnt, mainType, subType, direction, msgTime, convId);
780 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
781 MSG_DEBUG("Query Failed [%s]", sqlQuery);
782 return MSG_ERR_DB_PREPARE;
785 pDbHandle->bindText(msgText, 1);
787 if (pDbHandle->stepQuery() != MSG_ERR_DB_DONE) {
788 pDbHandle->finalizeQuery();
789 MSG_DEBUG("Update Address Info. Fail [%d] [%s]", err, sqlQuery);
790 return MSG_ERR_DB_STEP;
793 pDbHandle->finalizeQuery();
801 /* consider to replcae this function to trigger. */
802 msg_error_t MsgStoClearConversationTable(MsgDbHandler *pDbHandle)
804 msg_error_t err = MSG_SUCCESS;
806 char sqlQuery[MAX_QUERY_LEN+1];
808 memset(sqlQuery, 0x00, sizeof(sqlQuery));
810 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s \
811 WHERE CONV_ID NOT IN (SELECT CONV_ID FROM %s) AND CONV_ID <> 0;",
812 MSGFW_CONVERSATION_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME);
814 err = pDbHandle->execQuery(sqlQuery);
816 snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE CONV_ID NOT IN (SELECT CONV_ID FROM %s);",
817 MSGFW_ADDRESS_TABLE_NAME, MSGFW_CONVERSATION_TABLE_NAME);
819 err = pDbHandle->execQuery(sqlQuery);
825 void MsgConvertNumber(const char* pSrcNum, char* pDestNum)
830 overLen = strlen(pSrcNum) - MAX_PRECONFIG_NUM;
832 for (i = 0; i < MAX_PRECONFIG_NUM; i++)
833 pDestNum[i] = pSrcNum[i+overLen];
838 /* Change the function name to conversation related. */
839 bool MsgExistAddress(MsgDbHandler *pDbHandle, const MSG_MESSAGE_INFO_S *pMsg, msg_thread_id_t *pConvId)
841 msg_error_t err = MSG_SUCCESS;
843 char sqlQuery[MAX_QUERY_LEN+1];
847 if(pMsg->nAddressCnt == 1) {
848 if (strlen(pMsg->addressList[0].addressVal) > MAX_PRECONFIG_NUM) {
849 char newPhoneNum[MAX_PRECONFIG_NUM+1];
851 memset(newPhoneNum, 0x00, sizeof(newPhoneNum));
853 MsgConvertNumber(pMsg->addressList[0].addressVal, newPhoneNum);
855 memset(sqlQuery, 0x00, sizeof(sqlQuery));
857 snprintf(sqlQuery, sizeof(sqlQuery),
858 "SELECT CONV_ID FROM (SELECT B.CONV_ID FROM %s A, %s B WHERE A.ADDRESS_VAL LIKE '%%%%%s' AND A.CONV_ID=B.CONV_ID) GROUP BY CONV_ID HAVING COUNT(CONV_ID)=1;",
859 MSGFW_ADDRESS_TABLE_NAME, MSGFW_ADDRESS_TABLE_NAME, newPhoneNum);
861 memset(sqlQuery, 0x00, sizeof(sqlQuery));
863 snprintf(sqlQuery, sizeof(sqlQuery),
864 "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;",
865 MSGFW_ADDRESS_TABLE_NAME, MSGFW_ADDRESS_TABLE_NAME, pMsg->addressList[0].addressVal);
869 msg_thread_id_t convId = 0;
870 err = pDbHandle->getTable(sqlQuery, &rowCnt);
872 /* No record or other error */
873 if (err != MSG_SUCCESS) {
874 MSG_DEBUG("Query Failed [%s]", sqlQuery);
875 pDbHandle->freeTable();
880 convId = pDbHandle->getColumnToInt(1);
882 MSG_DEBUG("CONV_ID : [%d]", convId);
886 pDbHandle->freeTable();
889 pDbHandle->freeTable();
894 } else { /* multiple address */
895 if (strlen(pMsg->addressList[0].addressVal) > MAX_PRECONFIG_NUM) {
896 char newPhoneNum[MAX_PRECONFIG_NUM+1];
898 memset(newPhoneNum, 0x00, sizeof(newPhoneNum));
900 MsgConvertNumber(pMsg->addressList[0].addressVal, newPhoneNum);
902 memset(sqlQuery, 0x00, sizeof(sqlQuery));
904 snprintf(sqlQuery, sizeof(sqlQuery),
905 "SELECT CONV_ID FROM (SELECT B.CONV_ID FROM %s A, %s B WHERE A.ADDRESS_VAL LIKE '%%%%%s' AND A.CONV_ID=B.CONV_ID) GROUP BY CONV_ID HAVING COUNT(CONV_ID)=%d;",
906 MSGFW_ADDRESS_TABLE_NAME, MSGFW_ADDRESS_TABLE_NAME, newPhoneNum, pMsg->nAddressCnt);
908 memset(sqlQuery, 0x00, sizeof(sqlQuery));
910 snprintf(sqlQuery, sizeof(sqlQuery),
911 "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;",
912 MSGFW_ADDRESS_TABLE_NAME, MSGFW_ADDRESS_TABLE_NAME, pMsg->addressList[0].addressVal, pMsg->nAddressCnt);
918 MSG_DEBUG("Query [%s]", sqlQuery);
920 err = pDbHandle->getTable(sqlQuery, &rowCnt);
922 /* No record or other error */
923 if (err != MSG_SUCCESS) {
924 MSG_DEBUG("Query Failed [%s]", sqlQuery);
925 pDbHandle->freeTable();
929 for (int i = 1; i <= rowCnt; i++) {
930 convId = pDbHandle->getColumnToInt(i);
932 memset(sqlQuery, 0x00, sizeof(sqlQuery));
934 snprintf(sqlQuery, sizeof(sqlQuery),
935 "SELECT COUNT(*) FROM %s WHERE CONV_ID=%d AND (",
936 MSGFW_ADDRESS_TABLE_NAME, convId);
938 for (int j = 0; j<(pMsg->nAddressCnt); j++ ) {
941 strncat(sqlQuery, "OR ", MAX_QUERY_LEN-strlen(sqlQuery));
943 if (strlen(pMsg->addressList[j].addressVal) > MAX_PRECONFIG_NUM) {
945 strncat(sqlQuery, "ADDRESS_VAL LIKE '%%%%", MAX_QUERY_LEN-strlen(sqlQuery));
947 char newPhoneNum[MAX_PRECONFIG_NUM+1];
948 memset(newPhoneNum, 0x00, sizeof(newPhoneNum));
949 MsgConvertNumber(pMsg->addressList[j].addressVal, newPhoneNum);
951 strncat(sqlQuery, newPhoneNum, MAX_QUERY_LEN-strlen(sqlQuery));
953 strncat(sqlQuery, "' ", MAX_QUERY_LEN-strlen(sqlQuery));
955 strncat(sqlQuery, "ADDRESS_VAL = '", MAX_QUERY_LEN-strlen(sqlQuery));
957 strncat(sqlQuery, pMsg->addressList[j].addressVal, MAX_QUERY_LEN-strlen(sqlQuery));
959 strncat(sqlQuery, "' ", MAX_QUERY_LEN-strlen(sqlQuery));
962 strncat(sqlQuery, ");", MAX_QUERY_LEN-strlen(sqlQuery));
963 MSG_DEBUG("Query [%s]", sqlQuery);
964 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
965 MSG_DEBUG("Query Failed [%s]", sqlQuery);
966 pDbHandle->freeTable();
967 pDbHandle->finalizeQuery();
971 if (pDbHandle->stepQuery() == MSG_ERR_DB_ROW) {
972 if (pMsg->nAddressCnt == pDbHandle->columnInt(0)) {
974 pDbHandle->finalizeQuery();
975 pDbHandle->freeTable();
979 pDbHandle->finalizeQuery();
981 pDbHandle->freeTable();
988 int MsgStoGetUnreadCnt(MsgDbHandler *pDbHandle, MSG_MAIN_TYPE_T msgType)
992 char sqlQuery[MAX_QUERY_LEN+1];
994 memset(sqlQuery, 0x00, sizeof(sqlQuery));
996 if (msgType == MSG_SMS_TYPE) {
997 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s \
998 WHERE MAIN_TYPE = %d AND SUB_TYPE IN (%d, %d, %d, %d, %d, %d, %d) AND FOLDER_ID = %d AND READ_STATUS = 0;",
999 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);
1000 } else if (msgType == MSG_MMS_TYPE) {
1001 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT COUNT(MSG_ID) FROM %s \
1002 WHERE MAIN_TYPE = %d AND SUB_TYPE IN (%d, %d, %d) AND FOLDER_ID = %d AND READ_STATUS = 0;",
1003 MSGFW_MESSAGE_TABLE_NAME, MSG_MMS_TYPE, MSG_RETRIEVE_AUTOCONF_MMS, MSG_RETRIEVE_MANUALCONF_MMS, MSG_NOTIFICATIONIND_MMS, MSG_INBOX_ID);
1006 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
1009 if (pDbHandle->stepQuery() == MSG_ERR_DB_ROW) {
1010 msgCnt = pDbHandle->columnInt(0);
1012 pDbHandle->finalizeQuery();
1016 pDbHandle->finalizeQuery();
1022 msg_error_t MsgStoAddContactInfo(MsgDbHandler *pDbHandle, MSG_CONTACT_INFO_S *pContactInfo, const char *pNumber)
1024 char newPhoneNum[MAX_PRECONFIG_NUM+1];
1025 char sqlQuery[MAX_QUERY_LEN+1];
1027 if (strlen(pNumber) > MAX_PRECONFIG_NUM) {
1028 memset(newPhoneNum, 0x00, sizeof(newPhoneNum));
1029 MsgConvertNumber(pNumber, newPhoneNum);
1031 MSG_DEBUG("Phone Number to Compare : [%s]", newPhoneNum);
1033 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1034 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET \
1035 CONTACT_ID = %d, FIRST_NAME = ?, LAST_NAME = ?, IMAGE_PATH = '%s' \
1036 WHERE ADDRESS_VAL LIKE '%%%%%s';",
1037 MSGFW_ADDRESS_TABLE_NAME, pContactInfo->contactId, pContactInfo->imagePath, newPhoneNum);
1039 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1040 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET \
1041 CONTACT_ID = %d, FIRST_NAME = ?, LAST_NAME = ?, IMAGE_PATH = '%s' \
1042 WHERE ADDRESS_VAL = '%s';",
1043 MSGFW_ADDRESS_TABLE_NAME, pContactInfo->contactId, pContactInfo->imagePath, pNumber);
1046 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
1047 MSG_DEBUG("sqlQuery [%s]", sqlQuery);
1048 return MSG_ERR_DB_PREPARE;
1051 pDbHandle->bindText(pContactInfo->firstName, 1);
1053 pDbHandle->bindText(pContactInfo->lastName, 2);
1055 if (pDbHandle->stepQuery() != MSG_ERR_DB_DONE) {
1056 pDbHandle->finalizeQuery();
1057 MSG_DEBUG("Update contact Info. Fail [%s]", sqlQuery);
1058 return MSG_ERR_DB_STEP;
1061 pDbHandle->finalizeQuery();
1067 msg_error_t MsgStoClearContactInfo(MsgDbHandler *pDbHandle, int contactId)
1069 msg_error_t err = MSG_SUCCESS;
1071 char sqlQuery[MAX_QUERY_LEN+1];
1074 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1076 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT DISTINCT(CONV_ID) FROM %s WHERE CONTACT_ID = %d;",
1077 MSGFW_ADDRESS_TABLE_NAME, contactId);
1079 err = pDbHandle->getTable(sqlQuery, &rowCnt);
1081 if (err != MSG_SUCCESS) {
1082 pDbHandle->freeTable();
1083 MSG_DEBUG("[Error]Failed to Get Table");
1087 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1088 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET \
1089 CONTACT_ID = 0, DISPLAY_NAME = '', FIRST_NAME = '', LAST_NAME = '', IMAGE_PATH = '' \
1090 WHERE CONTACT_ID = %d;",
1091 MSGFW_ADDRESS_TABLE_NAME, contactId);
1093 if (pDbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
1094 MSG_DEBUG("Fail to execute query");
1095 return MSG_ERR_DB_EXEC;
1098 MsgDbHandler tmpDbHandle;
1099 for (int i=1; i<=rowCnt; i++)
1100 MsgStoSetConversationDisplayName(&tmpDbHandle, (msg_thread_id_t)pDbHandle->getColumnToInt(i));
1102 pDbHandle->freeTable();
1108 msg_error_t MsgStoClearContactInfo(MsgDbHandler *pDbHandle, int contactId, const char *pNumber)
1110 char newPhoneNum[MAX_PRECONFIG_NUM+1];
1111 char sqlQuery[MAX_QUERY_LEN+1];
1113 memset(newPhoneNum, 0x00, sizeof(newPhoneNum));
1114 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1116 if (strlen(pNumber) > MAX_PRECONFIG_NUM) {
1117 MsgConvertNumber(pNumber, newPhoneNum);
1119 MSG_DEBUG("Phone Number to Compare : [%s]", newPhoneNum);
1121 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET \
1122 CONTACT_ID = 0, DISPLAY_NAME = '', FIRST_NAME = '', LAST_NAME = '', IMAGE_PATH = '' \
1123 WHERE CONTACT_ID = %d AND ADDRESS_VAL NOT LIKE '%%%s';",
1124 MSGFW_ADDRESS_TABLE_NAME, contactId, newPhoneNum);
1126 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET \
1127 CONTACT_ID = 0, DISPLAY_NAME = '', FIRST_NAME = '', LAST_NAME = '', IMAGE_PATH = '' \
1128 WHERE CONTACT_ID = %d AND ADDRESS_VAL <> '%s';",
1129 MSGFW_ADDRESS_TABLE_NAME, contactId, pNumber);
1132 if (pDbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
1133 MSG_DEBUG("Fail to execute query");
1134 return MSG_ERR_DB_EXEC;
1141 msg_error_t MsgStoGetMmsRawFilePath(MsgDbHandler *pDbHandle, msg_message_id_t msgId, char *pFilePath)
1143 char sqlQuery[MAX_QUERY_LEN+1];
1145 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1147 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.FILE_PATH FROM %s A, %s B \
1148 WHERE A.MSG_ID = B.MSG_ID AND B.MSG_ID = %d;",
1149 MMS_PLUGIN_MESSAGE_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME, msgId);
1151 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS)
1152 return MSG_ERR_DB_PREPARE;
1154 if (pDbHandle->stepQuery() == MSG_ERR_DB_ROW) {
1155 if (pDbHandle->columnText(0) != NULL)
1156 strncpy(pFilePath, (char*)pDbHandle->columnText(0), MSG_FILEPATH_LEN_MAX);
1158 pDbHandle->finalizeQuery();
1159 return MSG_ERR_DB_STEP;
1162 pDbHandle->finalizeQuery();
1168 bool MsgStoCheckReadReportRequested(MsgDbHandler *pDbHandle, msg_message_id_t msgId)
1170 msg_error_t err = MSG_SUCCESS;
1172 char sqlQuery[MAX_QUERY_LEN+1];
1174 bool bReadReportRequested = false;
1176 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1178 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.ASK_READ_REPLY FROM %s A, %s B \
1179 WHERE A.MSG_ID = B.MSG_ID AND B.MSG_ID = %d;",
1180 MMS_PLUGIN_MESSAGE_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME, msgId);
1182 err = pDbHandle->getTable(sqlQuery, &rowCnt);
1184 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
1185 pDbHandle->freeTable();
1186 MSG_DEBUG("[Error]Failed to Get Table");
1187 return bReadReportRequested;
1191 pDbHandle->freeTable();
1192 MSG_DEBUG("[Error]MSG_ERR_DB_NORECORD");
1193 return bReadReportRequested;
1196 bReadReportRequested = pDbHandle->getColumnToInt(1);
1198 pDbHandle->freeTable();
1200 return bReadReportRequested;
1204 bool MsgStoCheckReadReportIsSent(MsgDbHandler *pDbHandle, msg_message_id_t msgId)
1206 msg_error_t err = MSG_SUCCESS;
1208 char sqlQuery[MAX_QUERY_LEN+1];
1211 bool bReadReportIsSent = true;
1213 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1215 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.READ_REPORT_SENT FROM %s A, %s B \
1216 WHERE A.MSG_ID = B.MSG_ID AND B.MSG_ID = %d;",
1217 MMS_PLUGIN_MESSAGE_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME, msgId);
1219 err = pDbHandle->getTable(sqlQuery, &rowCnt);
1221 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
1222 pDbHandle->freeTable();
1223 MSG_DEBUG("[Error]Failed to Get Table");
1224 return bReadReportIsSent;
1228 pDbHandle->freeTable();
1229 MSG_DEBUG("[Error]MSG_ERR_DB_NORECORD");
1230 return bReadReportIsSent;
1233 bReadReportIsSent = (bool)pDbHandle->getColumnToInt(1);
1235 pDbHandle->freeTable();
1237 return bReadReportIsSent;
1241 msg_error_t MsgStoAddConversation(MsgDbHandler *pDbHandle, msg_thread_id_t *pConvId)
1243 char sqlQuery[MAX_QUERY_LEN+1];
1245 if (pDbHandle->getRowId(MSGFW_CONVERSATION_TABLE_NAME, pConvId) != MSG_SUCCESS) {
1246 return MSG_ERR_DB_EXEC;
1250 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1251 snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, 0, 0, 0, 0, 0, 0, 0, '', '');",
1252 MSGFW_CONVERSATION_TABLE_NAME, *pConvId);
1254 if (pDbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
1255 MSG_DEBUG("Query Failed. [%s]", sqlQuery);
1256 return MSG_ERR_DB_EXEC;
1263 msg_error_t MsgStoSetConversationDisplayName(MsgDbHandler *pDbHandle, int contactId)
1265 msg_error_t err = MSG_SUCCESS;
1267 char displayName[MAX_DISPLAY_NAME_LEN+1];
1268 char sqlQuery[MAX_QUERY_LEN+1];
1270 MSG_DEBUG("contactId [%d]", contactId);
1272 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1273 snprintf(sqlQuery, sizeof(sqlQuery), "SELECT DISTINCT(CONV_ID) FROM %s WHERE CONTACT_ID = %d;",
1274 MSGFW_ADDRESS_TABLE_NAME, contactId);
1276 err = pDbHandle->getTable(sqlQuery, &rowCnt);
1278 if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) {
1279 pDbHandle->freeTable();
1280 MSG_DEBUG("Query Failed [%s]", sqlQuery);
1284 int order = MsgGetContactNameOrder();
1285 msg_struct_s *pAddrInfo = NULL;
1286 MSG_ADDRESS_INFO_S *address = NULL;
1288 for (int i = 1; i <= rowCnt; i++)
1290 memset(displayName, 0x00, sizeof(displayName));
1291 MsgDbHandler tmpDbHandle;
1292 msg_struct_list_s addressList = {0,};
1293 MsgStoGetAddressByConvId(&tmpDbHandle, (msg_thread_id_t)pDbHandle->getColumnToInt(i), order, &addressList);
1295 for (int j = 0; j < addressList.nCount; j++)
1298 strncat(displayName, ", ", MAX_DISPLAY_NAME_LEN-strlen(displayName));
1300 pAddrInfo = (msg_struct_s *)addressList.msg_struct_info[j];
1301 address = (MSG_ADDRESS_INFO_S *)pAddrInfo->data;
1303 if (address->displayName[0] == '\0')
1304 strncat(displayName, address->addressVal, MAX_DISPLAY_NAME_LEN-strlen(displayName));
1306 strncat(displayName, address->displayName, MAX_DISPLAY_NAME_LEN-strlen(displayName));
1309 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1310 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET DISPLAY_NAME = ? WHERE CONV_ID = %d;",
1311 MSGFW_CONVERSATION_TABLE_NAME, pDbHandle->getColumnToInt(i));
1313 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
1314 MSG_DEBUG("Query Failed [%s]", sqlQuery);
1315 return MSG_ERR_DB_PREPARE;
1318 pDbHandle->bindText(displayName, 1);
1320 if (pDbHandle->stepQuery() != MSG_ERR_DB_DONE) {
1321 pDbHandle->finalizeQuery();
1322 MSG_DEBUG("Update Conversation disply name. Fail [%s]", sqlQuery);
1323 return MSG_ERR_DB_STEP;
1326 pDbHandle->finalizeQuery();
1328 // free address list
1329 for(int j = 0; j < MAX_TO_ADDRESS_CNT; j++){
1330 msg_struct_s *pStruct = (msg_struct_s *)addressList.msg_struct_info[j];
1331 delete [] (MSG_ADDRESS_INFO_S *)pStruct->data;
1332 delete [] (msg_struct_s *)pStruct;
1336 pDbHandle->freeTable();
1342 msg_error_t MsgStoSetConversationDisplayName(MsgDbHandler *pDbHandle, msg_thread_id_t convId)
1344 msg_error_t err = MSG_SUCCESS;
1346 char displayName[MAX_DISPLAY_NAME_LEN+1];
1347 char sqlQuery[MAX_QUERY_LEN+1];
1349 msg_struct_list_s addressList = {0,};
1351 int order = MsgGetContactNameOrder();
1352 msg_struct_s *pAddrInfo = NULL;
1353 MSG_ADDRESS_INFO_S *address = NULL;
1355 memset(displayName, 0x00, sizeof(displayName));
1357 MsgStoGetAddressByConvId(pDbHandle, convId, order, &addressList);
1359 for (int j = 0; j < addressList.nCount; j++)
1362 strncat(displayName, ", ", MAX_DISPLAY_NAME_LEN-strlen(displayName));
1364 pAddrInfo = (msg_struct_s *)addressList.msg_struct_info[j];
1365 address = (MSG_ADDRESS_INFO_S *)pAddrInfo->data;
1367 if (address->displayName[0] == '\0')
1368 strncat(displayName, address->addressVal, MAX_DISPLAY_NAME_LEN-strlen(displayName));
1370 strncat(displayName, address->displayName, MAX_DISPLAY_NAME_LEN-strlen(displayName));
1373 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1374 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET DISPLAY_NAME = ? WHERE CONV_ID = %d;",
1375 MSGFW_CONVERSATION_TABLE_NAME, convId);
1377 if (pDbHandle->prepareQuery(sqlQuery) != MSG_SUCCESS) {
1378 MSG_DEBUG("Query Failed [%s]", sqlQuery);
1379 return MSG_ERR_DB_PREPARE;
1382 pDbHandle->bindText(displayName, 1);
1384 if (pDbHandle->stepQuery() != MSG_ERR_DB_DONE) {
1385 pDbHandle->finalizeQuery();
1386 MSG_DEBUG("Update Conversation disply name. Fail [%s]", sqlQuery);
1387 return MSG_ERR_DB_STEP;
1390 pDbHandle->finalizeQuery();
1392 for(int j = 0; j < MAX_TO_ADDRESS_CNT; j++){
1393 msg_struct_s *pStruct = (msg_struct_s *)addressList.msg_struct_info[j];
1394 delete [] (MSG_ADDRESS_INFO_S *)pStruct->data;
1395 delete [] (msg_struct_s *)pStruct;
1401 msg_error_t MsgStoUpdateNetworkStatus(MsgDbHandler *pDbHandle, MSG_MESSAGE_INFO_S *pMsgInfo, msg_network_status_t status)
1403 msg_error_t err = MSG_SUCCESS;
1405 char sqlQuery[MAX_QUERY_LEN+1];
1407 memset(sqlQuery, 0x00, sizeof(sqlQuery));
1409 snprintf(sqlQuery, sizeof(sqlQuery), "UPDATE %s SET NETWORK_STATUS = %d WHERE MSG_ID = %d;",
1410 MSGFW_MESSAGE_TABLE_NAME, status, pMsgInfo->msgId);
1412 if (pDbHandle->execQuery(sqlQuery) != MSG_SUCCESS)
1413 err = MSG_ERR_DB_EXEC;
1418 char *MsgStoReplaceString(const char *origStr, const char *oldStr, const char *newStr)
1420 if (origStr == NULL)
1423 char *replaceStr = NULL;
1430 if (g_strcmp0(oldStr, newStr) != 0) {
1431 oldStrLen = strlen(oldStr);
1432 newStrLen = strlen(newStr);
1434 for (i = 0; origStr[i] != '\0';) {
1435 if (memcmp(&origStr[i], oldStr, oldStrLen) == 0) {
1443 return g_strdup(origStr);
1446 replaceStr = (char *)calloc(1, i + sizeof(char) * (matchedCnt * (newStrLen - oldStrLen) + 1));
1447 if (replaceStr == NULL)
1453 if (memcmp(origStr, oldStr, oldStrLen) == 0) {
1454 memcpy(pTemp, newStr, newStrLen);
1456 origStr += oldStrLen;
1458 *pTemp++ = *origStr++;