Clean up repository
[platform/core/appfw/librua.git] / src / rua.c
1 /*
2  * Copyright (c) 2000 - 2016 Samsung Electronics Co., Ltd. All rights reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
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 <stdlib.h>
19 #include <string.h>
20 #include <unistd.h>
21
22 #include <db-util.h>
23 #include <aul.h>
24 #include <dlog.h>
25
26 #include "rua_util.h"
27 #include "rua.h"
28 #include "db-schema.h"
29 #include "rua_dbus.h"
30 #include "rua_private.h"
31
32 API int rua_add_history_for_uid(char *pkg_name, char *app_path, char *arg, uid_t uid)
33 {
34         int r;
35         char time_str[32] = {0,};
36         bundle *b = NULL;
37
38         if (pkg_name == NULL || app_path == NULL) {
39                 LOGE("invalid param");
40                 return -1;
41         }
42
43         r = _rua_util_check_uid(uid);
44         if (r == -1)
45                 return r;
46
47         b = bundle_create();
48         if (b == NULL) {
49                 LOGE("bundle_create fail out of memory.");
50                 return -1;
51         }
52         snprintf(time_str, sizeof(time_str), "%d", (int)time(NULL));
53         bundle_add_str(b, AUL_K_RUA_PKGNAME, pkg_name);
54         bundle_add_str(b, AUL_K_RUA_APPPATH, app_path);
55         bundle_add_str(b, AUL_K_RUA_ARG, arg);
56         bundle_add_str(b, AUL_K_RUA_TIME, time_str);
57
58         r = aul_add_rua_history_for_uid(b, uid);
59         LOGI("rua_add_history_for_uid result : %d ", r);
60         bundle_free(b);
61         return r;
62 }
63
64 API int rua_delete_history_with_pkgname_for_uid(char *pkg_name, uid_t uid)
65 {
66         int r;
67         bundle *b;
68
69         r = _rua_util_check_uid(uid);
70         if (r == -1)
71                 return r;
72
73         b = bundle_create();
74         if (b == NULL) {
75                 LOGE("bundle_create fail out of memory.");
76                 return -1;
77         }
78         bundle_add_str(b, AUL_K_RUA_PKGNAME, pkg_name);
79         r = aul_delete_rua_history_for_uid(b, uid);
80         LOGI("rua_delete_history_with_pkgname result : %d ", r);
81         bundle_free(b);
82         return r;
83 }
84
85 API int rua_delete_history_with_pkgname(char *pkg_name)
86 {
87         return rua_delete_history_with_pkgname_for_uid(pkg_name, getuid());
88 }
89
90 API int rua_delete_history_with_apppath_for_uid(char *app_path, uid_t uid)
91 {
92         int r;
93         bundle *b;
94
95         r = _rua_util_check_uid(uid);
96         if (r == -1)
97                 return r;
98
99         b = bundle_create();
100         if (b == NULL) {
101                 LOGE("bundle_create fail out of memory.");
102                 return -1;
103         }
104         bundle_add_str(b, AUL_K_RUA_APPPATH, app_path);
105         r = aul_delete_rua_history_for_uid(b, uid);
106         LOGI("rua_delete_history_with_apppath result : %d ", r);
107         bundle_free(b);
108         return r;
109 }
110
111 API int rua_delete_history_with_apppath(char *app_path)
112 {
113         return rua_delete_history_with_apppath_for_uid(app_path, getuid());
114 }
115
116 API int rua_clear_history_for_uid(uid_t uid)
117 {
118         int r;
119
120         r = _rua_util_check_uid(uid);
121         if (r == -1)
122                 return r;
123
124         r = aul_delete_rua_history_for_uid(NULL, uid);
125         LOGI("rua_clear_history result : %d ", r);
126         return r;
127 }
128
129 API int rua_clear_history(void)
130 {
131         return rua_clear_history_for_uid(getuid());
132 }
133
134 API int rua_history_load_db_for_uid(char ***table, int *nrows, int *ncols, uid_t uid)
135 {
136         int r;
137         char query[QUERY_MAXLEN];
138         char *db_err = NULL;
139         char **db_result = NULL;
140         sqlite3 *db = NULL;
141
142         if (table == NULL)
143                 return -1;
144         if (nrows == NULL)
145                 return -1;
146         if (ncols == NULL)
147                 return -1;
148
149         r = _rua_util_check_uid(uid);
150         if (r == -1)
151                 return r;
152
153         r = _rua_util_open_db(&db, SQLITE_OPEN_READONLY, uid, RUA_DB_NAME);
154         if (r != SQLITE_OK)
155                 return -1;
156
157         snprintf(query, sizeof(query),
158                  "SELECT pkg_name, app_path, arg, launch_time, instance_id, "
159                  "instance_name, icon, uri FROM %s ORDER BY launch_time DESC;",
160                  RUA_HISTORY);
161
162         r = sqlite3_get_table(db, query, &db_result, nrows, ncols, &db_err);
163
164         if (r == SQLITE_OK)
165                 *table = db_result;
166         else
167                 sqlite3_free_table(db_result);
168
169         db_util_close(db);
170
171         return r;
172 }
173
174 API int rua_history_load_db(char ***table, int *nrows, int *ncols)
175 {
176         return rua_history_load_db_for_uid(table, nrows, ncols, getuid());
177 }
178
179 API int rua_register_update_cb_for_uid(rua_history_update_cb callback, void *user_data, int *callback_id, uid_t uid)
180 {
181         int r;
182
183         if (callback == NULL)
184                 return -1;
185
186         r = _rua_util_check_uid(uid);
187         if (r == -1)
188                 return r;
189
190         r = rua_dbus_signal_subscribe(callback, user_data, callback_id);
191
192         return r;
193 }
194
195 API int rua_register_update_cb(rua_history_update_cb callback, void *user_data, int *callback_id)
196 {
197         return rua_register_update_cb_for_uid(callback, user_data, callback_id, getuid());
198 }
199
200 API int rua_unregister_update_cb_for_uid(int callback_id, uid_t uid)
201 {
202         int r;
203
204         r = _rua_util_check_uid(uid);
205         if (r == -1)
206                 return r;
207
208         r = rua_dbus_signal_unsubscribe(callback_id);
209
210         return r;
211 }
212
213 API int rua_unregister_update_cb(int callback_id)
214 {
215         return rua_unregister_update_cb_for_uid(callback_id, getuid());
216 }
217
218 API int rua_history_get_rec(struct rua_rec *rec, char **table, int nrows, int ncols,
219                         int row)
220 {
221         char **db_result = NULL;
222         char *tmp = NULL;
223
224         if (rec == NULL)
225                 return -1;
226         if (table == NULL)
227                 return -1;
228         if (row >= nrows)
229                 return -1;
230
231         db_result = table + ((row + 1) * ncols);
232
233         tmp = db_result[RUA_COL_PKGNAME];
234         if (tmp)
235                 rec->pkg_name = tmp;
236
237         LOGI("get rec pkg_name %s", rec->pkg_name);
238         tmp = db_result[RUA_COL_APPPATH];
239         if (tmp)
240                 rec->app_path = tmp;
241
242         tmp = db_result[RUA_COL_ARG];
243         if (tmp)
244                 rec->arg = tmp;
245
246         tmp = db_result[RUA_COL_LAUNCHTIME];
247         if (tmp)
248                 rec->launch_time = atoi(tmp);
249
250         tmp = db_result[RUA_COL_INSTANCE_ID];
251         if (tmp && tmp[0] != '\0')
252                 rec->instance_id = tmp;
253         else
254                 rec->instance_id = NULL;
255
256         tmp = db_result[RUA_COL_INSTANCE_NAME];
257         if (tmp && tmp[0] != '\0')
258                 rec->instance_name = tmp;
259         else
260                 rec->instance_name = NULL;
261
262         tmp = db_result[RUA_COL_ICON];
263         if (tmp && tmp[0] != '\0')
264                 rec->icon = tmp;
265         else
266                 rec->icon = NULL;
267
268         tmp = db_result[RUA_COL_URI];
269         if (tmp && tmp[0] != '\0')
270                 rec->uri = tmp;
271         else
272                 rec->uri = NULL;
273
274         return 0;
275 }
276
277 API int rua_history_unload_db(char ***table)
278 {
279         if (*table) {
280                 sqlite3_free_table(*table);
281                 *table = NULL;
282                 return 0;
283         }
284         return -1;
285 }
286
287 API int rua_is_latest_app_for_uid(const char *pkg_name, uid_t uid)
288 {
289         int r = -1;
290         sqlite3_stmt *stmt;
291         const unsigned char *ct;
292         sqlite3 *db = NULL;
293         char *query = "select pkg_name from rua_history order by launch_time desc limit 1;";
294
295         if (!pkg_name)
296                 return -1;
297
298         r = _rua_util_check_uid(uid);
299         if (r == -1)
300                 return r;
301
302         r = _rua_util_open_db(&db, SQLITE_OPEN_READONLY, uid, RUA_DB_NAME);
303         if (r != SQLITE_OK)
304                 return -1;
305
306         r = sqlite3_prepare(db, query, sizeof(query), &stmt, NULL);
307         if (r != SQLITE_OK) {
308                 db_util_close(db);
309                 return -1;
310         }
311
312         r = sqlite3_step(stmt);
313         if (r == SQLITE_ROW) {
314                 ct = sqlite3_column_text(stmt, 0);
315                 if (ct == NULL || ct[0] == '\0') {
316                         r = -1;
317                         goto out;
318                 }
319
320                 if (strncmp(pkg_name, (const char *)ct, strlen(pkg_name)) == 0) {
321                         r = 0;
322                         goto out;
323                 }
324         }
325
326 out:
327         if (stmt)
328                 sqlite3_finalize(stmt);
329         if (db)
330                 db_util_close(db);
331
332         return r;
333 }
334
335 API int rua_is_latest_app(const char *pkg_name)
336 {
337         return rua_is_latest_app_for_uid(pkg_name, getuid());
338 }
339
340 API int rua_init(void)
341 {
342         return 0;
343 }
344
345 API int rua_fini(void)
346 {
347         return 0;
348 }
349
350 API int rua_delete_history_with_instance_id(const char *app_id,
351                 const char *instance_id)
352 {
353         int ret;
354         bundle *b;
355
356         if (app_id == NULL) {
357                 LOGE("Invalid parameter");
358                 return -1;
359         }
360
361         b = bundle_create();
362         if (b == NULL) {
363                 LOGE("Out of memory");
364                 return -1;
365         }
366
367         bundle_add_str(b, AUL_K_RUA_PKGNAME, app_id);
368         if (instance_id)
369                 bundle_add_str(b, AUL_K_RUA_INSTANCE_ID, instance_id);
370
371         ret = aul_delete_rua_history_for_uid(b, getuid());
372         bundle_free(b);
373         if (ret < 0) {
374                 LOGE("Failed to delete rua history - result(%d)", ret);
375                 return -1;
376         }
377
378         return 0;
379 }