Modify flora license version.
[platform/core/messaging/msg-service.git] / framework / storage-handler / MsgStorageUtil.cpp
1 /*
2 * Copyright 2012-2013  Samsung Electronics Co., Ltd
3 *
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
7 *
8 *    http://floralicense.org/license/
9 *
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.
15 */
16
17 #include <stdio.h>
18 #include <string.h>
19 #include <stdlib.h>
20
21 #include "MsgDebug.h"
22 #include "MsgCppTypes.h"
23 #include "MsgUtilFile.h"
24 #include "MsgContact.h"
25 #include "MsgSoundPlayer.h"
26 #include "MsgGconfWrapper.h"
27 #include "MsgSqliteWrapper.h"
28 #include "MsgPluginManager.h"
29 #include "MsgUtilStorage.h"
30 #include "MsgStorageHandler.h"
31
32 /*==================================================================================================
33                                      VARIABLES
34 ==================================================================================================*/
35 extern MsgDbHandler dbHandle;
36
37
38 /*==================================================================================================
39                                      FUNCTION IMPLEMENTATION
40 ==================================================================================================*/
41 msg_error_t MsgMakeSortRule(const MSG_SORT_RULE_S *pSortRule, char *pSqlSort)
42 {
43         char sql[128];
44         char order[6];
45
46         memset(sql, 0x00, sizeof(sql));
47         memset(order, 0x00, sizeof(order));
48
49         if (pSortRule->bAscending == true)
50                 strncpy(order, "ASC", 5);
51         else
52                 strncpy(order, "DESC", 5);
53
54         int nameOrder = MsgGetContactNameOrder();
55
56         switch (pSortRule->sortType)
57         {
58                 case MSG_SORT_BY_DISPLAY_FROM :
59                         if (nameOrder == 0)
60                                 snprintf(sql, sizeof(sql), "ORDER BY B.FIRST_NAME %s, B.LAST_NAME %s, B.ADDRESS_VAL, A.DISPLAY_TIME DESC;", order, order);
61                         else
62                                 snprintf(sql, sizeof(sql), "ORDER BY B.LAST_NAME %s, B.FIRST_NAME %s, B.ADDRESS_VAL, A.DISPLAY_TIME DESC;", order, order);
63                         break;
64                 case MSG_SORT_BY_DISPLAY_TO :
65                         if (nameOrder == 0)
66                                 snprintf(sql, sizeof(sql), "ORDER BY B.FIRST_NAME %s, B.LAST_NAME %s, B.ADDRESS_VAL, A.DISPLAY_TIME DESC;", order, order);
67                         else
68                                 snprintf(sql, sizeof(sql), "ORDER BY B.LAST_NAME %s, B.FIRST_NAME %s, B.ADDRESS_VAL, A.DISPLAY_TIME DESC;", order, order);
69                         break;
70                 case MSG_SORT_BY_DISPLAY_TIME :
71                         snprintf(sql, sizeof(sql), "ORDER BY DISPLAY_TIME %s;", order);
72                         break;
73                 case MSG_SORT_BY_MSG_TYPE :
74                         snprintf(sql, sizeof(sql), "ORDER BY MAIN_TYPE %s, DISPLAY_TIME DESC;", order);
75                         break;
76                 case MSG_SORT_BY_READ_STATUS :
77                         snprintf(sql, sizeof(sql), "ORDER BY READ_STATUS %s, DISPLAY_TIME DESC;", order);
78                         break;
79                 case MSG_SORT_BY_STORAGE_TYPE :
80                         snprintf(sql, sizeof(sql), "ORDER BY A.STORAGE_ID %s, A.DISPLAY_TIME DESC;", order);
81                         break;
82                 case MSG_SORT_BY_THREAD_NAME :
83                         if (nameOrder == 0)
84                                 snprintf(sql, sizeof(sql), "ORDER BY FIRST_NAME %s, LAST_NAME %s;", order, order);
85                         else
86                                 snprintf(sql, sizeof(sql), "ORDER BY LAST_NAME %s, FIRST_NAME %s;", order, order);
87                         break;
88                 case MSG_SORT_BY_THREAD_DATE :
89                         snprintf(sql, sizeof(sql), "ORDER BY MSG_TIME %s;", order);
90                         break;
91                 case MSG_SORT_BY_THREAD_COUNT :
92                         snprintf(sql, sizeof(sql), "ORDER BY UNREAD_CNT %s;", order);
93                         break;
94                 default :
95                         snprintf(sql, sizeof(sql), "ORDER BY A.DISPLAY_TIME %s;", order);
96                         break;
97         }
98
99         memcpy(pSqlSort, sql, strlen(sql));
100
101         return MSG_SUCCESS;
102 }
103
104
105 msg_error_t MsgStoGetSmsSendOpt(msg_message_id_t msgId, MSG_SENDINGOPT_INFO_S* pSendOpt)
106 {
107         char sqlQuery[MAX_QUERY_LEN+1];
108
109         memset(sqlQuery, 0x00, sizeof(sqlQuery));
110
111         snprintf(sqlQuery, sizeof(sqlQuery), "SELECT DELREP_REQ, KEEP_COPY, REPLY_PATH FROM %s WHERE MSG_ID = %d;",
112                         MSGFW_SMS_SENDOPT_TABLE_NAME, msgId);
113
114         if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
115                 return MSG_ERR_DB_PREPARE;
116
117         if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
118                 pSendOpt->bSetting = true;
119                 pSendOpt->bDeliverReq = (bool)dbHandle.columnInt(0);
120                 pSendOpt->bKeepCopy = (bool)dbHandle.columnInt(1);
121                 pSendOpt->option.smsSendOptInfo.bReplyPath = (bool)dbHandle.columnInt(2);
122         } else {
123                 dbHandle.finalizeQuery();
124                 return MSG_ERR_DB_STEP;
125         }
126
127         dbHandle.finalizeQuery();
128
129         return MSG_SUCCESS;
130 }
131
132
133 msg_error_t MsgStoGetMmsSendOpt(msg_message_id_t msgId, MSG_SENDINGOPT_INFO_S* pSendOpt)
134 {
135         char sqlQuery[MAX_QUERY_LEN+1];
136
137         memset(sqlQuery, 0x00, sizeof(sqlQuery));
138
139         snprintf(sqlQuery, sizeof(sqlQuery), "SELECT ASK_DELIVERY_REPORT, KEEP_COPY, ASK_READ_REPLY, EXPIRY_TIME, PRIORITY FROM %s WHERE MSG_ID = %d;",
140                         MMS_PLUGIN_MESSAGE_TABLE_NAME, msgId);
141
142         if (dbHandle.prepareQuery(sqlQuery) != MSG_SUCCESS)
143                 return MSG_ERR_DB_PREPARE;
144
145         if (dbHandle.stepQuery() == MSG_ERR_DB_ROW) {
146                 pSendOpt->bSetting = true;
147                 pSendOpt->bDeliverReq = (bool)dbHandle.columnInt(0);
148                 pSendOpt->bKeepCopy = (bool)dbHandle.columnInt(1);
149                 pSendOpt->option.mmsSendOptInfo.bReadReq = (bool)dbHandle.columnInt(2);
150                 pSendOpt->option.mmsSendOptInfo.expiryTime.time = (unsigned int)dbHandle.columnInt(3);
151                 pSendOpt->option.mmsSendOptInfo.priority = (msg_priority_type_t)dbHandle.columnInt(4);
152         } else {
153                 dbHandle.finalizeQuery();
154                 return MSG_ERR_DB_STEP;
155         }
156
157         dbHandle.finalizeQuery();
158
159         return MSG_SUCCESS;
160 }
161
162 bool MsgStoCheckSyncMLMsgInThread(msg_thread_id_t threadId)
163 {
164         msg_error_t err = MSG_SUCCESS;
165         int rowCnt = 0;
166         bool isSyncMLMsg = false;
167
168         char sqlQuery[MAX_QUERY_LEN+1];
169
170         memset(sqlQuery, 0x00, sizeof(sqlQuery));
171
172         snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s WHERE SUB_TYPE = %d AND CONV_ID = %d;",
173                         MSGFW_MESSAGE_TABLE_NAME, MSG_SYNCML_CP, threadId);
174
175         MSG_DEBUG("sqlQuery [%s]", sqlQuery);
176
177         err = dbHandle.getTable(sqlQuery, &rowCnt);
178
179         if (rowCnt > 0) isSyncMLMsg = true;
180
181         MSG_DEBUG("rowCnt [%d]", rowCnt);
182
183         dbHandle.freeTable();
184
185         return isSyncMLMsg;
186 }
187
188
189 msg_error_t MsgStoResetNetworkStatus()
190 {
191         MSG_BEGIN();
192
193         char sqlQuery[MAX_QUERY_LEN+1];
194
195         memset(sqlQuery, 0x00, sizeof(sqlQuery));
196
197         snprintf(sqlQuery, sizeof(sqlQuery),
198                         "UPDATE %s SET NETWORK_STATUS = %d WHERE NETWORK_STATUS = %d; UPDATE %s SET NETWORK_STATUS = %d WHERE NETWORK_STATUS = %d;",
199                         MSGFW_MESSAGE_TABLE_NAME, MSG_NETWORK_SEND_FAIL, MSG_NETWORK_SENDING,
200                         MSGFW_MESSAGE_TABLE_NAME, MSG_NETWORK_RETRIEVE_FAIL, MSG_NETWORK_RETRIEVING);
201
202         if (dbHandle.execQuery(sqlQuery) != MSG_SUCCESS)
203                 return MSG_ERR_DB_EXEC;
204
205         MSG_END();
206
207         return MSG_SUCCESS;
208 }
209
210
211 msg_error_t MsgStoCleanAbnormalMmsData()
212 {
213         MSG_BEGIN();
214
215         int rowCnt = 0, index = 2; // numbers of index
216
217         msg_message_id_t msgId;
218
219         char sqlQuery[MAX_QUERY_LEN+1];
220         char    filePath[MSG_FILEPATH_LEN_MAX];
221
222         memset(sqlQuery, 0x00, sizeof(sqlQuery));
223
224         snprintf(sqlQuery, sizeof(sqlQuery), "SELECT A.MSG_ID, A.FILE_PATH FROM %s A, %s B WHERE A.MSG_ID = B.MSG_ID AND (B.SUB_TYPE = %d OR B.SUB_TYPE = %d OR B.SUB_TYPE = %d);",
225                         MMS_PLUGIN_MESSAGE_TABLE_NAME, MSGFW_MESSAGE_TABLE_NAME, MSG_SENDCONF_MMS, MSG_RETRIEVE_AUTOCONF_MMS, MSG_RETRIEVE_MANUALCONF_MMS);
226
227         msg_error_t  err = dbHandle.getTable(sqlQuery, &rowCnt);
228
229         if (err == MSG_ERR_DB_NORECORD) {
230                 dbHandle.freeTable();
231                 return MSG_SUCCESS;
232         } else if (err != MSG_SUCCESS) {
233                 MSG_DEBUG("%s", sqlQuery);
234                 dbHandle.freeTable();
235                 return err;
236         }
237
238
239         for (int i = 0; i < rowCnt; i++)
240         {
241                 memset(filePath, 0x00, sizeof(filePath));
242
243                 msgId = dbHandle.getColumnToInt(index++);
244
245                 dbHandle.getColumnToString(index++, MSG_FILEPATH_LEN_MAX, filePath);
246
247                 if(strlen(filePath) > 1) {
248                         MSG_DEBUG("strlen(filePath) [%d]", strlen(filePath));
249                         MSG_DEBUG("filePath [%s]", filePath);
250
251                         if(MsgGetFileSize(filePath) < 0) {
252                                 // abnormal mms message
253                                 MSG_DEBUG("abnormal mms message [%d]", msgId);
254
255                                 // delete mms message
256                                 MsgStoDeleteMessage(msgId, false);
257                         }
258                 }
259
260         }
261         dbHandle.freeTable();
262
263         MSG_END();
264
265         return MSG_SUCCESS;
266 }
267
268 msg_error_t MsgStoCheckReadReportStatus(msg_message_id_t msgId)
269 {
270         MSG_BEGIN();
271
272         bool    bReadReportRequested;
273         bool    bReadReportIsSent;
274
275         bReadReportRequested = MsgStoCheckReadReportRequested(&dbHandle, msgId);
276         if(bReadReportRequested == false)
277                 return MSG_ERR_READREPORT_NOT_REQUESTED;
278
279         bReadReportIsSent = MsgStoCheckReadReportIsSent(&dbHandle, msgId);
280         if(bReadReportIsSent == true)
281                 return MSG_ERR_READREPORT_ALEADY_SENT;
282
283         MSG_END();
284
285         return MSG_SUCCESS;
286 }
287