4 * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Youngae Kang <youngae.kang@samsung.com>, Minjune Kim <sena06.kim@samsung.com>
7 * Genie Kim <daejins.kim@samsung.com>
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
27 #include <libxml/parser.h>
28 #include <app_manager.h>
29 #include "location-appman.h"
30 #include "location-appman-log.h"
32 #define LOCATION_APPMAN_QUERY_MAX_LEN 1024
34 #define LOCATION_APPMAN_PATH_FILE ".location-appman.db"
35 #define LOCATION_APPMAN_PATH_DBSPACE LOCATION_APPMAN_DBDIR
36 #define LOCATION_APPMAN_PATH_FULL LOCATION_APPMAN_PATH_DBSPACE"/"LOCATION_APPMAN_PATH_FILE
38 #define LOCATION_APPMAN_PKG_NAME "PKG_NAME"
40 sqlite3 *db_handle = NULL;
42 static char *__create_table = "create table if not exists LocationApp(package VARCHAR(64) PRIMARY KEY,\
43 icon VARCHAR(256), app_id INTEGER, installed_date INTEGER, recently_used INTEGER, enable BOOL);";
45 static char *__default_item[] = {
46 "insert into LocationApp (package, app_id, installed_date, recently_used, enable) values (\"org.tizen.setting\", 0, 0, 0, 1);",
47 "insert into LocationApp (package, app_id, installed_date, recently_used, enable) values (\"kmcele1k0n.Internet\", 0, 0, 0, 1);",
50 char *location_column_name[6] = { "package", "icon", "app_id", "installed_date", "recently_used", "enable" };
52 int location_appman_check_developer_mode(void)
57 void location_appman_close(void)
59 sqlite3_close(db_handle);
63 int location_appman_open(void)
68 if (NULL != db_handle) {
69 LOCATION_APPMAN_LOG("location_appman_open & close\n");
70 location_appman_close();
73 rc = sqlite3_open_v2(LOCATION_APPMAN_PATH_FULL, &db_handle, SQLITE_OPEN_FULLMUTEX | SQLITE_OPEN_READWRITE, NULL);
74 if (SQLITE_OK != rc) {
76 if (SQLITE_CANTOPEN == rc) {
77 rc = sqlite3_open_v2(LOCATION_APPMAN_PATH_FULL, &db_handle, SQLITE_OPEN_FULLMUTEX | SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
78 if (SQLITE_OK == rc) {
79 rc = sqlite3_exec (db_handle, __create_table, NULL, NULL, NULL);
80 if (SQLITE_OK != rc) {
81 LOCATION_APPMAN_LOG("Failed to create table : Error[%s]\n", sqlite3_errmsg(db_handle));
82 sqlite3_close (db_handle);
84 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
87 for (idx = 0; idx < sizeof(__default_item) / sizeof(char*); idx++) {
88 rc = sqlite3_exec (db_handle, __default_item[idx], NULL, NULL, NULL);
89 if (SQLITE_OK != rc) {
90 LOCATION_APPMAN_LOG("Failed to insert default item : Error[%s]\n", sqlite3_errmsg(db_handle));
91 sqlite3_close (db_handle);
93 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
96 return LOCATION_APPMAN_ERROR_NONE;
100 LOCATION_APPMAN_LOG("Failed to open : Error[%s]\n", sqlite3_errmsg(db_handle));
101 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
104 return LOCATION_APPMAN_ERROR_NONE;
107 int location_appman_query(char *dest, const char *src)
109 if (NULL == dest || NULL == src) {
110 LOCATION_APPMAN_LOG("location_appman_query : NULL\n");
114 g_strlcat(dest, src, strlen(src) + 1);
118 int location_appman_drop(void)
121 char query[LOCATION_APPMAN_QUERY_MAX_LEN] = { 0, };
123 rc = location_appman_query(query, "DROP TABLE IF EXISTS LocationApp");
125 location_appman_close();
126 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
129 rc = sqlite3_exec(db_handle, query, NULL, NULL, NULL);
130 if (SQLITE_OK != rc) {
131 LOCATION_APPMAN_LOG("Fail to connect to table. Error[%s]\n", sqlite3_errmsg(db_handle));
132 location_appman_close();
133 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
136 return LOCATION_APPMAN_ERROR_NONE;
139 int location_appman_insert(location_appman_s * appman)
141 LOCATION_APPMAN_NULL_ARG_CHECK(appman);
144 int sql_param_index = 1;
145 char query[LOCATION_APPMAN_QUERY_MAX_LEN] = { 0, };
148 if (location_appman_open() != LOCATION_APPMAN_ERROR_NONE)
149 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
151 rc = location_appman_query(query,
152 "INSERT INTO LocationApp(package, icon, app_id, installed_date, recently_used, enable)"
153 "VALUES (?, ?, ?, ?, ?, ?)");
155 location_appman_close();
156 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
159 rc = sqlite3_prepare_v2(db_handle, query, strlen(query), &state, &tail);
160 if (SQLITE_OK != rc) {
161 LOCATION_APPMAN_LOG("sqlite3_prepare_v2 failed : Error[%s]\n", sqlite3_errmsg(db_handle));
162 location_appman_close();
163 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
166 sqlite3_bind_text(state, sql_param_index, appman->package, strlen(appman->package), SQLITE_STATIC);
167 sqlite3_bind_text(state, ++sql_param_index, appman->appicon, strlen(appman->appicon), SQLITE_STATIC);
168 sqlite3_bind_int(state, ++sql_param_index, appman->appid);
169 sqlite3_bind_int(state, ++sql_param_index, appman->installed_date);
170 sqlite3_bind_int(state, ++sql_param_index, appman->recently_used);
171 sqlite3_bind_int(state, ++sql_param_index, appman->enable);
174 sqlite3_reset(state);
176 sqlite3_finalize(state);
177 location_appman_close();
179 return LOCATION_APPMAN_ERROR_NONE;
182 int location_appman_delete(const char *package)
184 LOCATION_APPMAN_NULL_ARG_CHECK(package);
185 sqlite3_stmt *state = NULL;
187 char query[LOCATION_APPMAN_QUERY_MAX_LEN] = { 0, };
189 if (location_appman_open() != LOCATION_APPMAN_ERROR_NONE)
190 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
192 rc = location_appman_query(query, "DELETE from LocationApp where package = ?");
194 LOCATION_APPMAN_LOG("location_app_delete. Error[%d]\n", rc);
195 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
198 rc = sqlite3_prepare_v2(db_handle, query, strlen(query), &state, NULL);
199 if (SQLITE_OK != rc) {
200 LOCATION_APPMAN_LOG("Fail to connect to table. Error[%s]\n", sqlite3_errmsg(db_handle));
201 location_appman_close();
202 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
205 rc = sqlite3_bind_text(state, 1, package, strlen(package), SQLITE_STATIC);
206 if (SQLITE_OK != rc) {
207 LOCATION_APPMAN_LOG("Fail to bind string to query. Error[%s]\n", sqlite3_errmsg(db_handle));
208 sqlite3_finalize(state);
209 location_appman_close();
210 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
213 rc = sqlite3_step(state);
214 if (SQLITE_DONE != rc) {
215 LOCATION_APPMAN_LOG("Fail to step. Error[%d]", rc);
216 sqlite3_finalize(state);
217 location_appman_close();
218 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
220 sqlite3_finalize(state);
221 location_appman_close();
223 return LOCATION_APPMAN_ERROR_NONE;
226 int location_appman_reset(void)
229 char query[LOCATION_APPMAN_QUERY_MAX_LEN] = { 0, };
231 if (location_appman_open() != LOCATION_APPMAN_ERROR_NONE)
232 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
234 if (location_appman_drop() != LOCATION_APPMAN_ERROR_NONE)
235 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
237 rc = location_appman_query(query, "CREATE TABLE LocationApp(\n "
238 "package VARCHAR(64) PRIMARY KEY,\n"
239 "name VARChAR(32),\n"
240 "icon VARCHAR(256),\n"
241 "app_id INTEGER,\n" "installed_date INTEGER,\n" "recently_used INTEGER,\n" "enable BOOL);");
244 LOCATION_APPMAN_LOG("location_appman_reset. Error[%d]\n", rc);
245 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
248 rc = sqlite3_exec(db_handle, query, NULL, NULL, NULL);
249 if (SQLITE_OK != rc) {
250 LOCATION_APPMAN_LOG("Fail to connect to table. Error[%s]\n", sqlite3_errmsg(db_handle));
251 location_appman_close();
252 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
255 location_appman_close();
257 return LOCATION_APPMAN_ERROR_NONE;
260 int location_appman_update(location_appman_s * appman)
262 LOCATION_APPMAN_NULL_ARG_CHECK(appman);
263 sqlite3_stmt *state = NULL;
265 int sql_param_index = 1;
266 char query[LOCATION_APPMAN_QUERY_MAX_LEN] = { 0, };
268 if (location_appman_open() != LOCATION_APPMAN_ERROR_NONE)
269 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
271 rc = location_appman_query(query,
272 "UPDATE LocationApp SET icon = ?, app_id = ?, installed_date = ?, recently_used = ?, enable = ? where package = ? ");
274 location_appman_close();
275 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
278 rc = sqlite3_prepare_v2(db_handle, query, strlen(query), &state, NULL);
279 if (SQLITE_OK != rc) {
280 LOCATION_APPMAN_LOG("Fail to connect to table. Error[%s]\n", sqlite3_errmsg(db_handle));
281 location_appman_close();
282 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
286 rc = sqlite3_bind_text(state, sql_param_index++, appman->appicon, strlen(appman->appicon), SQLITE_STATIC);
287 if (SQLITE_OK != rc) {
288 LOCATION_APPMAN_LOG("Fail to bind string to query. Error[%s]\n", sqlite3_errmsg(db_handle));
289 sqlite3_finalize(state);
290 location_appman_close();
291 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
294 rc = sqlite3_bind_int(state, sql_param_index++, appman->appid);
295 if (SQLITE_OK != rc) {
296 LOCATION_APPMAN_LOG("Fail to bind string to query. Error[%s]\n", sqlite3_errmsg(db_handle));
297 sqlite3_finalize(state);
298 location_appman_close();
299 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
302 rc = sqlite3_bind_int(state, sql_param_index++, appman->installed_date);
303 if (SQLITE_OK != rc) {
304 LOCATION_APPMAN_LOG("Fail to bind string to query. Error[%s]\n", sqlite3_errmsg(db_handle));
305 sqlite3_finalize(state);
306 location_appman_close();
307 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
310 rc = sqlite3_bind_int(state, sql_param_index++, appman->recently_used);
311 if (SQLITE_OK != rc) {
312 LOCATION_APPMAN_LOG("Fail to bind string to query. Error[%s]\n", sqlite3_errmsg(db_handle));
313 sqlite3_finalize(state);
314 location_appman_close();
315 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
318 rc = sqlite3_bind_int(state, sql_param_index++, appman->enable);
319 if (SQLITE_OK != rc) {
320 LOCATION_APPMAN_LOG("Fail to bind string to query. Error[%s]\n", sqlite3_errmsg(db_handle));
321 sqlite3_finalize(state);
322 location_appman_close();
323 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
326 rc = sqlite3_bind_text(state, sql_param_index++, appman->package, strlen(appman->package), SQLITE_STATIC);
327 if (SQLITE_OK != rc) {
328 LOCATION_APPMAN_LOG("Fail to bind string to query. Error[%s]\n", sqlite3_errmsg(db_handle));
329 sqlite3_finalize(state);
330 location_appman_close();
331 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
334 rc = sqlite3_step(state);
335 if (SQLITE_DONE != rc) {
336 LOCATION_APPMAN_LOG("Fail to step. Error[%d]", rc);
337 sqlite3_finalize(state);
338 location_appman_close();
339 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
341 sqlite3_finalize(state);
342 location_appman_close();
344 return LOCATION_APPMAN_ERROR_NONE;
347 int location_appman_get_total_count(int *count)
352 char query[LOCATION_APPMAN_QUERY_MAX_LEN] = { 0, };
355 if (location_appman_open() != LOCATION_APPMAN_ERROR_NONE)
356 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
358 rc = location_appman_query(query, "SELECT count(*) FROM LocationApp");
360 location_appman_close();
362 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
365 rc = sqlite3_prepare_v2(db_handle, query, strlen(query), &state, &tail);
366 if (SQLITE_OK != rc) {
367 LOCATION_APPMAN_LOG("sqlite3_prepare_v2 failed : Error[%s]", sqlite3_errmsg(db_handle));
369 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
372 rc = sqlite3_step(state);
373 if (SQLITE_ROW == rc) {
374 num_data = sqlite3_column_int(state, 0);
378 sqlite3_finalize(state);
379 location_appman_close();
381 return LOCATION_APPMAN_ERROR_NONE;
384 int location_appman_get_app_list(location_appman_column_e sort_by, int *list_count, location_appman_s ** apps)
388 int column_index = 0;
391 char query[LOCATION_APPMAN_QUERY_MAX_LEN] = { 0, };
394 if (location_appman_open() != LOCATION_APPMAN_ERROR_NONE)
395 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
397 if (LOCATION_APPMAN_COLUMN_PACKAGE > sort_by || LOCATION_APPMAN_COLUMN_ENABLE < sort_by) {
398 sort_by = LOCATION_APPMAN_COLUMN_INSTALLED_DATE;
399 g_snprintf(query, LOCATION_APPMAN_QUERY_MAX_LEN, "SELECT * FROM LocationApp ORDER BY %s",
400 location_column_name[sort_by]);
402 g_snprintf(query, LOCATION_APPMAN_QUERY_MAX_LEN, "SELECT * FROM LocationApp ORDER BY %s",
403 location_column_name[sort_by]);
406 if (LOCATION_APPMAN_COLUMN_RECENTLY_USED == sort_by || LOCATION_APPMAN_COLUMN_ENABLE == sort_by) {
408 rc = location_appman_query(query, " DESC");
410 location_appman_close();
411 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
415 rc = sqlite3_prepare_v2(db_handle, query, strlen(query), &state, &tail);
416 if (SQLITE_OK != rc) {
417 LOCATION_APPMAN_LOG("sqlite3_prepare_v2 failed : Error[%s]", sqlite3_errmsg(db_handle));
418 location_appman_close();
419 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
422 location_appman_get_total_count(&count);
423 LOCATION_APPMAN_LOG("count [%d]", count);
424 *apps = (location_appman_s *) g_malloc0(sizeof(location_appman_s) * count);
426 for (i = 0; i < count; i++) {
428 rc = sqlite3_step(state);
429 g_strlcpy((*apps + i)->package, (char *)sqlite3_column_text(state, column_index++), 64);
430 g_strlcpy((*apps + i)->appicon, (char *)sqlite3_column_text(state, column_index++), 256);
432 (*apps + i)->appid = sqlite3_column_int(state, column_index++);
433 (*apps + i)->installed_date = sqlite3_column_int(state, column_index++);
434 (*apps + i)->recently_used = sqlite3_column_int(state, column_index++);
435 (*apps + i)->enable = (gboolean) sqlite3_column_int(state, column_index++);
438 location_appman_get_name((*apps + i)->package, &name);
439 g_strlcpy((*apps + i)->appname, name, 64);
441 if (SQLITE_ROW != rc) {
448 sqlite3_finalize(state);
449 location_appman_close();
451 return LOCATION_APPMAN_ERROR_NONE;
455 int location_appman_get_column_text(const char *package, location_appman_column_e type, char **data)
457 LOCATION_APPMAN_NULL_ARG_CHECK(package);
459 int rc = LOCATION_APPMAN_ERROR_NONE;
461 char query[LOCATION_APPMAN_QUERY_MAX_LEN] = { 0, };
463 if (location_appman_open() != LOCATION_APPMAN_ERROR_NONE)
464 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
466 g_snprintf(query, LOCATION_APPMAN_QUERY_MAX_LEN, "SELECT %s FROM LocationApp WHERE package = ?",
467 location_column_name[type]);
469 rc = sqlite3_prepare_v2(db_handle, query, strlen(query), &state, &tail);
470 if (SQLITE_OK != rc) {
471 LOCATION_APPMAN_LOG("sqlite3_prepare_v2 failed : Error[%s]", sqlite3_errmsg(db_handle));
472 location_appman_close();
474 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
477 rc = sqlite3_bind_text(state, 1, package, strlen(package), SQLITE_STATIC);
478 if (SQLITE_OK != rc) {
479 LOCATION_APPMAN_LOG("Fail to bind string to query. Error[%s]\n", sqlite3_errmsg(db_handle));
480 sqlite3_finalize(state);
481 location_appman_close();
482 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
485 rc = sqlite3_step(state);
487 if (SQLITE_ROW == rc) {
488 *data = g_strdup((char *)sqlite3_column_text(state, 0));
491 sqlite3_finalize(state);
492 location_appman_close();
494 return LOCATION_APPMAN_ERROR_NONE;
497 int location_appman_get_column_int(const char *package, location_appman_column_e type, unsigned int *data)
499 LOCATION_APPMAN_NULL_ARG_CHECK(package);
501 int rc = LOCATION_APPMAN_ERROR_NONE;
504 char query[LOCATION_APPMAN_QUERY_MAX_LEN] = { 0, };
506 if (location_appman_open() != LOCATION_APPMAN_ERROR_NONE)
507 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
509 g_snprintf(query, LOCATION_APPMAN_QUERY_MAX_LEN, "SELECT %s FROM LocationApp WHERE package = ?",
510 location_column_name[type]);
512 rc = sqlite3_prepare_v2(db_handle, query, strlen(query), &state, &tail);
513 if (SQLITE_OK != rc) {
514 LOCATION_APPMAN_LOG("sqlite3_prepare_v2 failed : Error[%s]", sqlite3_errmsg(db_handle));
515 location_appman_close();
517 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
520 rc = sqlite3_bind_text(state, 1, package, strlen(package), SQLITE_STATIC);
521 if (SQLITE_OK != rc) {
522 LOCATION_APPMAN_LOG("Fail to bind string to query. Error[%s]\n", sqlite3_errmsg(db_handle));
523 sqlite3_finalize(state);
524 location_appman_close();
525 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
528 rc = sqlite3_step(state);
530 if (SQLITE_ROW == rc) {
531 num_data = sqlite3_column_int(state, 0);
535 sqlite3_finalize(state);
536 location_appman_close();
538 return LOCATION_APPMAN_ERROR_NONE;
541 int location_appman_get_name(const char *package, char **appname)
543 LOCATION_APPMAN_NULL_ARG_CHECK(package);
548 ret = app_manager_get_app_info(package, &app_info);
549 if (ret != APP_MANAGER_ERROR_NONE) {
551 LOCATION_APPMAN_LOG("Can't get application information: [%s]", package);
552 name = strdup (package);
555 LOCATION_APPMAN_LOG("Can't get application information: [%s]", package);
556 return LOCATION_APPMAN_ERROR_INTERNAL;
561 app_info_get_label(app_info, &name);
562 if (name == NULL || g_strcmp0 (name, "(NULL)") == 0) {
563 LOCATION_APPMAN_LOG("name of application[%s] is NULL", package);
564 name = strdup (package);
568 *appname = (char *) g_malloc0(sizeof(char)*64);
569 g_strlcpy(*appname, name, 64);
572 return LOCATION_APPMAN_ERROR_NONE;
575 int location_appman_get_icon(const char *package, char **appicon)
577 LOCATION_APPMAN_NULL_ARG_CHECK(package);
578 int rc = LOCATION_APPMAN_ERROR_NONE;
580 rc = location_appman_get_column_text(package, LOCATION_APPMAN_COLUMN_APPICON, appicon);
581 if (LOCATION_APPMAN_ERROR_NONE != rc) {
582 LOCATION_APPMAN_LOG("sqlite3_prepare_v2 failed : Error[%s]", sqlite3_errmsg(db_handle));
583 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
586 return LOCATION_APPMAN_ERROR_NONE;
589 int location_appman_get_appid(const char *package, int *appid)
591 LOCATION_APPMAN_NULL_ARG_CHECK(package);
592 int rc = LOCATION_APPMAN_ERROR_NONE;
594 rc = location_appman_get_column_int(package, LOCATION_APPMAN_COLUMN_APPID, (unsigned int *)appid);
595 if (LOCATION_APPMAN_ERROR_NONE != rc) {
596 LOCATION_APPMAN_LOG("sqlite3_prepare_v2 failed : Error[%s]", sqlite3_errmsg(db_handle));
597 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
600 return LOCATION_APPMAN_ERROR_NONE;
603 int location_appman_get_installed_date(const char *package, unsigned int *installed_date)
605 LOCATION_APPMAN_NULL_ARG_CHECK(package);
606 int rc = LOCATION_APPMAN_ERROR_NONE;
608 rc = location_appman_get_column_int(package, LOCATION_APPMAN_COLUMN_INSTALLED_DATE, installed_date);
609 if (LOCATION_APPMAN_ERROR_NONE != rc) {
610 LOCATION_APPMAN_LOG("sqlite3_prepare_v2 failed : Error[%s]", sqlite3_errmsg(db_handle));
611 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
614 return LOCATION_APPMAN_ERROR_NONE;
617 int location_appman_get_recently_used(const char *package, unsigned int *recently_used)
619 LOCATION_APPMAN_NULL_ARG_CHECK(package);
620 int rc = LOCATION_APPMAN_ERROR_NONE;
622 rc = location_appman_get_column_int(package, LOCATION_APPMAN_COLUMN_RECENTLY_USED, recently_used);
623 if (LOCATION_APPMAN_ERROR_NONE != rc) {
624 LOCATION_APPMAN_LOG("sqlite3_prepare_v2 failed : Error[%s]", sqlite3_errmsg(db_handle));
625 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
628 return LOCATION_APPMAN_ERROR_NONE;
631 int location_appman_is_enabled(const char *package, int *enable)
633 LOCATION_APPMAN_NULL_ARG_CHECK(package);
636 rc = location_appman_get_column_int(package, LOCATION_APPMAN_COLUMN_ENABLE, (unsigned int *)enable);
637 if (LOCATION_APPMAN_ERROR_NONE != rc) {
638 LOCATION_APPMAN_LOG("sqlite3_prepare_v2 failed : Error[%s]", sqlite3_errmsg(db_handle));
639 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
642 return LOCATION_APPMAN_ERROR_NONE;
646 int location_appman_set_column_text(const char *package, location_appman_column_e type, char *data)
648 LOCATION_APPMAN_NULL_ARG_CHECK(package);
649 sqlite3_stmt *state = NULL;
651 char query[LOCATION_APPMAN_QUERY_MAX_LEN] = { 0, };
653 if (location_appman_open() != LOCATION_APPMAN_ERROR_NONE)
654 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
656 g_snprintf(query, LOCATION_APPMAN_QUERY_MAX_LEN, "UPDATE LocationApp SET %s = ? WHERE package = ?",
657 location_column_name[type]);
659 rc = sqlite3_prepare_v2(db_handle, query, strlen(query), &state, NULL);
660 if (SQLITE_OK != rc) {
661 LOCATION_APPMAN_LOG("Fail to connect to table. Error[%s]\n", sqlite3_errmsg(db_handle));
662 location_appman_close();
663 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
666 rc = sqlite3_bind_text(state, 1, data, strlen(data), SQLITE_STATIC);
667 if (SQLITE_OK != rc) {
668 LOCATION_APPMAN_LOG("Fail to bind string to query. Error[%s]\n", sqlite3_errmsg(db_handle));
669 sqlite3_finalize(state);
670 location_appman_close();
671 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
674 rc = sqlite3_bind_text(state, 2, package, strlen(package), SQLITE_STATIC);
675 if (SQLITE_OK != rc) {
676 LOCATION_APPMAN_LOG("Fail to bind string to query. Error[%s]\n", sqlite3_errmsg(db_handle));
677 sqlite3_finalize(state);
678 location_appman_close();
679 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
682 rc = sqlite3_step(state);
683 if (SQLITE_DONE != rc) {
684 LOCATION_APPMAN_LOG("Fail to step. rc[%d]", rc);
685 sqlite3_finalize(state);
686 location_appman_close();
687 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
690 sqlite3_finalize(state);
691 location_appman_close();
693 return LOCATION_APPMAN_ERROR_NONE;
697 int location_appman_set_column_int(const char *package, location_appman_column_e type, int data)
699 LOCATION_APPMAN_NULL_ARG_CHECK(package);
700 sqlite3_stmt *state = NULL;
702 char query[LOCATION_APPMAN_QUERY_MAX_LEN] = { 0, };
704 if (location_appman_open() != LOCATION_APPMAN_ERROR_NONE)
705 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
707 g_snprintf(query, LOCATION_APPMAN_QUERY_MAX_LEN, "UPDATE LocationApp SET %s = ? WHERE package = ?",
708 location_column_name[type]);
710 rc = sqlite3_prepare_v2(db_handle, query, strlen(query), &state, NULL);
711 if (SQLITE_OK != rc) {
712 LOCATION_APPMAN_LOG("Fail to connect to table. Error[%s]\n", sqlite3_errmsg(db_handle));
713 location_appman_close();
714 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
717 rc = sqlite3_bind_int(state, 1, data);
718 if (SQLITE_OK != rc) {
719 LOCATION_APPMAN_LOG("Fail to bind int to query. Error[%s]\n", sqlite3_errmsg(db_handle));
720 sqlite3_finalize(state);
721 location_appman_close();
722 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
725 rc = sqlite3_bind_text(state, 2, package, strlen(package), SQLITE_STATIC);
726 if (SQLITE_OK != rc) {
727 LOCATION_APPMAN_LOG("Fail to bind string to query. Error[%s]\n", sqlite3_errmsg(db_handle));
728 sqlite3_finalize(state);
729 location_appman_close();
730 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
733 rc = sqlite3_step(state);
734 if (SQLITE_DONE != rc) {
735 LOCATION_APPMAN_LOG("Fail to step. rc[%d]", rc);
736 sqlite3_finalize(state);
737 location_appman_close();
738 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
741 sqlite3_finalize(state);
742 location_appman_close();
744 return LOCATION_APPMAN_ERROR_NONE;
747 int location_appman_set_icon(const char *package, char *appicon)
749 LOCATION_APPMAN_NULL_ARG_CHECK(package);
750 LOCATION_APPMAN_NULL_ARG_CHECK(appicon);
751 int rc = LOCATION_APPMAN_ERROR_NONE;
753 rc = location_appman_set_column_text(package, LOCATION_APPMAN_COLUMN_APPICON, appicon);
754 if (LOCATION_APPMAN_ERROR_NONE != rc) {
755 LOCATION_APPMAN_LOG("Fail to bind string to query. Error[%s]\n", sqlite3_errmsg(db_handle));
756 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
758 return LOCATION_APPMAN_ERROR_NONE;
761 int location_appman_set_appid(const char *package, int appid)
763 LOCATION_APPMAN_NULL_ARG_CHECK(package);
764 int rc = LOCATION_APPMAN_ERROR_NONE;
766 rc = location_appman_set_column_int(package, LOCATION_APPMAN_COLUMN_APPID, appid);
767 if (LOCATION_APPMAN_ERROR_NONE != rc) {
768 LOCATION_APPMAN_LOG("Fail to bind int to query. Error[%s]\n", sqlite3_errmsg(db_handle));
769 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
771 return LOCATION_APPMAN_ERROR_NONE;
774 int location_appman_set_installed_date(const char *package, unsigned int installed_date)
776 LOCATION_APPMAN_NULL_ARG_CHECK(package);
777 int rc = LOCATION_APPMAN_ERROR_NONE;
779 rc = location_appman_set_column_int(package, LOCATION_APPMAN_COLUMN_INSTALLED_DATE, installed_date);
780 if (LOCATION_APPMAN_ERROR_NONE != rc) {
781 LOCATION_APPMAN_LOG("Fail to bind int to query. Error[%s]\n", sqlite3_errmsg(db_handle));
782 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
784 return LOCATION_APPMAN_ERROR_NONE;
787 int location_appman_set_recently_used(const char *package, unsigned int recently_used)
789 LOCATION_APPMAN_NULL_ARG_CHECK(package);
790 int rc = LOCATION_APPMAN_ERROR_NONE;
792 rc = location_appman_set_column_int(package, LOCATION_APPMAN_COLUMN_RECENTLY_USED, recently_used);
793 if (LOCATION_APPMAN_ERROR_NONE != rc) {
794 LOCATION_APPMAN_LOG("Fail to bind int to query. Error[%s]\n", sqlite3_errmsg(db_handle));
795 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
797 return LOCATION_APPMAN_ERROR_NONE;
800 int location_appman_set_on(const char *package, int onoff)
802 LOCATION_APPMAN_NULL_ARG_CHECK(package);
803 int rc = LOCATION_APPMAN_ERROR_NONE;
805 rc = location_appman_set_column_int(package, LOCATION_APPMAN_COLUMN_ENABLE, onoff);
806 if (LOCATION_APPMAN_ERROR_NONE != rc) {
807 LOCATION_APPMAN_LOG("Fail to bind int to query. Error[%s]\n", sqlite3_errmsg(db_handle));
808 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
810 return LOCATION_APPMAN_ERROR_NONE;
813 int location_appamn_parse_manifest(const char *xml, location_appman_s ** appman)
815 LOCATION_APPMAN_NULL_ARG_CHECK(xml);
820 location_appman_s *tmp;
822 char *element[4] = { "Location", "Package", "Appid", "Enable" };
824 doc = xmlParseDoc(BAD_CAST(xml));
827 LOCATION_APPMAN_LOG("Document not parsed successfully.\n");
828 return LOCATION_APPMAN_ERROR_INVALID_XML;
831 cur = xmlDocGetRootElement(doc);
833 LOCATION_APPMAN_LOG("empty document\n");
835 return LOCATION_APPMAN_ERROR_INVALID_XML;
838 if (xmlStrcmp(cur->name, (const xmlChar *)element[0]) != 0) {
839 LOCATION_APPMAN_LOG("document of the wrong type, root node != LocationApp\n");
841 return LOCATION_APPMAN_ERROR_INVALID_XML;
844 tmp = (location_appman_s *) g_malloc0(sizeof(location_appman_s));
845 cur = cur->xmlChildrenNode;
846 while (NULL != cur) {
847 if (xmlStrcmp(cur->name, (const xmlChar *)element[1]) == 0) {
848 key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
850 g_strlcpy(tmp->package, (char *)key, 64);
851 LOCATION_APPMAN_LOG("tmp->package = [%s]", tmp->package);
853 } else if (xmlStrcmp(cur->name, (const xmlChar *)element[2]) == 0) {
854 key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
856 tmp->appid = atoi((char *)key);
857 LOCATION_APPMAN_LOG("tmp->appid = [%d]", tmp->appid);
859 } else if (xmlStrcmp(cur->name, (const xmlChar *)element[3]) == 0) {
860 key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
862 tmp->enable = atoi((char *)key);
863 LOCATION_APPMAN_LOG("tmp->enable = [%d]", tmp->enable);
872 return LOCATION_APPMAN_ERROR_NONE;
875 int location_appman_get_package_by_pid(pid_t pid, location_appman_s ** appman)
878 LOCATION_APPMAN_LOG("Invalid PID : [%ld]", pid);
879 return LOCATION_APPMAN_ERROR_INVALID_PARAMETER;
882 location_appman_s *tmp = NULL;
883 char *package = NULL;
886 ret = app_manager_get_app_id(pid, &package);
887 if (ret != APP_MANAGER_ERROR_NONE) {
888 const char *pkg_name = g_getenv(LOCATION_APPMAN_PKG_NAME);
890 LOCATION_APPMAN_LOG("Can't find package name : [%ld]", pid);
891 return LOCATION_APPMAN_ERROR_INVALID_PARAMETER;
893 package = g_strdup(pkg_name);
896 tmp = (location_appman_s *) g_malloc0(sizeof(location_appman_s));
897 g_strlcpy(tmp->package, package, 64);
902 return LOCATION_APPMAN_ERROR_NONE;
905 int location_appman_find_package(const char *package, int *findpackage)
907 LOCATION_APPMAN_NULL_ARG_CHECK(package);
909 int rc = LOCATION_APPMAN_ERROR_NONE;
912 char query[LOCATION_APPMAN_QUERY_MAX_LEN] = { 0, };
914 if (location_appman_open() != LOCATION_APPMAN_ERROR_NONE)
915 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
917 g_snprintf(query, LOCATION_APPMAN_QUERY_MAX_LEN, "SELECT enable FROM LocationApp WHERE package = ?");
919 rc = sqlite3_prepare_v2(db_handle, query, strlen(query), &state, &tail);
920 if (SQLITE_OK != rc) {
921 LOCATION_APPMAN_LOG("sqlite3_prepare_v2 failed : Error[%s]", sqlite3_errmsg(db_handle));
922 location_appman_close();
923 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
926 rc = sqlite3_bind_text(state, 1, package, strlen(package), SQLITE_STATIC);
927 if (SQLITE_OK != rc) {
928 LOCATION_APPMAN_LOG("Fail to bind string to query. Error[%s]\n", sqlite3_errmsg(db_handle));
929 sqlite3_finalize(state);
930 location_appman_close();
932 return LOCATION_APPMAN_ERROR_SQLITE_FAIL;
935 rc = sqlite3_step(state);
936 if (SQLITE_ROW == rc) {
937 enable = sqlite3_column_int(state, 0);
939 *findpackage = LOCATION_APPMAN_ENABLE_OFF;
941 *findpackage = LOCATION_APPMAN_ENABLE_ON;
943 } else if (SQLITE_DONE) {
944 *findpackage = LOCATION_APPMAN_PACKAGE_NOTFOUND;
947 sqlite3_finalize(state);
948 location_appman_close();
950 return LOCATION_APPMAN_ERROR_NONE;
953 int location_appman_register_package(location_appman_s * appman)
955 LOCATION_APPMAN_NULL_ARG_CHECK(appman);
956 LOCATION_APPMAN_NULL_ARG_CHECK(appman->package);
963 ret = app_manager_get_app_info(appman->package, &app_info);
964 if (ret == APP_MANAGER_ERROR_NONE) {
965 app_info_get_label(app_info, &name);
967 g_strlcpy(appman->appname, name, 64);
970 app_info_get_icon(app_info, &name);
972 g_strlcpy(appman->appicon, name, 256);
976 LOCATION_APPMAN_LOG("Can't get application information: [%s]", appman->package);
977 return LOCATION_APPMAN_ERROR_INTERNAL;
980 // wait for a new api.
981 //if(0 == appman->appid)
982 // appman->appid = 0;
985 appman->installed_date = timestamp;
986 appman->recently_used = timestamp;
988 location_appman_insert(appman);
990 app_info_destroy(app_info);
992 return LOCATION_APPMAN_ERROR_NONE;