2 * Copyright (c) 2000 - 2017 Samsung Electronics Co., Ltd. All rights reserved.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
22 #include <sys/types.h>
24 #include <sys/smack.h>
25 #include <linux/limits.h>
32 #include <tzplatform_config.h>
33 #include <system_info.h>
35 #include "pkgmgr-info.h"
36 #include "pkgmgrinfo_basic.h"
37 #include "pkgmgr_parser.h"
38 #include "pkgmgr_parser_db_queries.h"
39 #include "pkgmgr_parser_debug.h"
40 #include "pkgmgr_parser_internal.h"
46 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
49 #define APPFW_USER "app_fw"
58 #define XXHDPI "xxhdpi"
68 #define XXHDPI_MIN 481
69 #define XXHDPI_MAX 600
71 /* app background category value */
72 #define APP_BG_CATEGORY_USER_DISABLE_FALSE_VAL 0x00000
73 #define APP_BG_CATEGORY_USER_DISABLE_TRUE_VAL 0x00001
74 #define APP_BG_CATEGORY_MEDIA_VAL 0x00002
75 #define APP_BG_CATEGORY_DOWNLOAD_VAL 0x00004
76 #define APP_BG_CATEGORY_BGNETWORK_VAL 0x00008
77 #define APP_BG_CATEGORY_LOCATION_VAL 0x00010
78 #define APP_BG_CATEGORY_SENSOR_VAL 0x00020
79 #define APP_BG_CATEGORY_IOTCOMM_VAL 0x00040
80 #define APP_BG_CATEGORY_SYSTEM_VAL 0x00080
82 #define APP_BG_CATEGORY_USER_DISABLE_FALSE_STR "enable"
83 #define APP_BG_CATEGORY_USER_DISABLE_TRUE_STR "disable"
84 #define APP_BG_CATEGORY_MEDIA_STR "media"
85 #define APP_BG_CATEGORY_DOWNLOAD_STR "download"
86 #define APP_BG_CATEGORY_BGNETWORK_STR "background-network"
87 #define APP_BG_CATEGORY_LOCATION_STR "location"
88 #define APP_BG_CATEGORY_SENSOR_STR "sensor"
89 #define APP_BG_CATEGORY_IOTCOMM_STR "iot-communication"
90 #define APP_BG_CATEGORY_SYSTEM "system"
92 #define REGULAR_USER 5000
93 static inline uid_t __getuid(void)
97 if (uid < REGULAR_USER)
98 return tzplatform_getuid(TZ_SYS_GLOBALAPP_USER);
103 static const char *__get_bool(char *value, bool is_true)
106 if (!strcmp(value, ""))
107 return (is_true) ? "true" : "false";
111 return (is_true) ? "true" : "false";
114 #define __BEGIN_TRANSACTION(db) \
116 if (sqlite3_exec(db, "BEGIN EXCLUSIVE", NULL, NULL, NULL) != \
118 _LOGE("begin transaction failed: %s", sqlite3_errmsg(db)); \
119 sqlite3_close_v2(db); \
120 return PM_PARSER_R_ERROR; \
124 #define __DO_TRANSACTION(db, func) \
127 _LOGE("transaction failed: %s, rollback", sqlite3_errmsg(db)); \
128 if (sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL) != \
130 _LOGE("roll back transaction failed: %s", \
131 sqlite3_errmsg(db)); \
132 sqlite3_close_v2(db); \
133 return PM_PARSER_R_ERROR; \
137 #define __END_TRANSACTION(db) \
139 if (sqlite3_exec(db, "COMMIT", NULL, NULL, NULL) != \
141 _LOGE("commit failed: %s, rollback", sqlite3_errmsg(db)); \
142 if (sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL) != \
144 _LOGE("roll back transaction failed: %s", \
145 sqlite3_errmsg(db)); \
146 sqlite3_close_v2(db); \
147 return PM_PARSER_R_ERROR; \
151 #define __BIND_TEXT(db, stmt, i, text) \
153 if (sqlite3_bind_text(stmt, i, text, -1, SQLITE_STATIC) != SQLITE_OK) {\
154 _LOGE("bind error(index %d): %s", i, sqlite3_errmsg(db)); \
155 sqlite3_finalize(stmt); \
160 #define __BIND_INT(db, stmt, i, int) \
162 if (sqlite3_bind_int(stmt, i, int) != SQLITE_OK) { \
163 _LOGE("bind error(index %d): %s", i, sqlite3_errmsg(db)); \
164 sqlite3_finalize(stmt); \
169 static const char *__get_parser_db_path(uid_t uid)
174 if (uid == GLOBAL_USER || uid == OWNER_ROOT) {
175 path = tzplatform_mkpath(TZ_SYS_DB, ".pkgmgr_parser.db");
177 snprintf(buf, sizeof(buf), "user/%d/.pkgmgr_parser.db", uid);
178 path = tzplatform_mkpath(TZ_SYS_DB, buf);
184 static const char *__get_cert_db_path(void)
186 return tzplatform_mkpath(TZ_SYS_DB, ".pkgmgr_cert.db");
189 static int __set_db_version(sqlite3 *db)
191 static const char query_raw[] = "PRAGMA user_version=";
195 snprintf(query, sizeof(query), "%s%d", query_raw, PKG_DB_VERSION);
197 ret = sqlite3_exec(db, query, NULL, NULL, NULL);
198 if (ret != SQLITE_OK) {
199 _LOGE("exec failed: %s", sqlite3_errmsg(db));
206 /* TODO: Do not labeling directly */
207 #define DB_LABEL "User::Home"
208 #define SET_SMACK_LABEL(x) \
210 if (smack_setlabel((x), DB_LABEL, SMACK_LABEL_ACCESS)) \
211 _LOGE("failed chsmack -a %s %s", DB_LABEL, x); \
213 _LOGD("chsmack -a %s %s", DB_LABEL, x); \
216 static int __set_db_permission(const char *path, uid_t uid)
219 const char *files[2];
220 char journal_file[BUFSIZE];
224 struct passwd *result;
229 if (getuid() != OWNER_ROOT)
232 if (uid == OWNER_ROOT || uid == GLOBAL_USER) {
233 ret = getpwnam_r(APPFW_USER, &pwd, buf, sizeof(buf), &result);
234 if (result == NULL) {
236 _LOGE("no such user: %d", uid);
238 _LOGE("getpwuid_r failed: %d", errno);
244 snprintf(journal_file, sizeof(journal_file), "%s-journal", path);
246 files[1] = journal_file;
248 ret = getpwuid_r(uid, &pwd, buf, sizeof(buf), &result);
249 if (result == NULL) {
251 _LOGE("no such user: %d", uid);
253 _LOGE("getpwuid_r failed: %d", errno);
257 for (i = 0; i < 2; i++) {
258 fd = open(files[i], O_RDONLY);
260 _LOGE("open %s failed: %d", files[i], errno);
263 ret = fstat(fd, &sb);
265 _LOGE("stat %s failed: %d", files[i], errno);
269 if (S_ISLNK(sb.st_mode)) {
270 _LOGE("%s is symlink!", files[i]);
274 ret = fchown(fd, uid, pwd.pw_gid);
276 _LOGE("fchown %s failed: %d", files[i], errno);
281 mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH;
282 if (!strcmp(path, __get_cert_db_path()))
284 ret = fchmod(fd, mode);
286 _LOGD("fchmod %s failed: %d", files[i], errno);
291 SET_SMACK_LABEL(files[i]);
297 static const char *parser_init_queries[] = {
298 QUERY_CREATE_TABLE_PACKAGE_INFO,
299 QUERY_CREATE_TABLE_PACKAGE_LOCALIZED_INFO,
300 QUERY_CREATE_TABLE_PACKAGE_PRIVILEGE_INFO,
301 QUERY_CREATE_TABLE_PACKAGE_UPDATE_INFO,
302 QUERY_CREATE_TABLE_PACKAGE_APP_INFO,
303 QUERY_CREATE_TABLE_PACKAGE_APP_LOCALIZED_INFO,
304 QUERY_CREATE_TABLE_PACKAGE_APP_APP_CONTROL,
305 QUERY_CREATE_TABLE_PACKAGE_APP_APP_CONTROL_PRIVILEGE,
306 QUERY_CREATE_TABLE_PACKAGE_APP_APP_CATEGORY,
307 QUERY_CREATE_TABLE_PACKAGE_APP_APP_METADATA,
308 QUERY_CREATE_TABLE_PACKAGE_APP_DATA_CONTROL,
309 QUERY_CREATE_TABLE_PACKAGE_APP_DATA_CONTROL_PRIVILEGE,
310 QUERY_CREATE_TABLE_PACKAGE_APP_INFO_FOR_UID,
311 QUERY_CREATE_TRIGGER_UPDATE_PACKAGE_APP_INFO_FOR_UID,
312 QUERY_CREATE_TABLE_PACKAGE_APP_SPLASH_SCREEN,
316 static const char *cert_init_queries[] = {
317 QUERY_CREATE_TABLE_PACKAGE_CERT_INFO,
318 QUERY_CREATE_TABLE_PACKAGE_CERT_INDEX_INFO,
319 QUERY_CREATE_TRIGGER_UPDATE_CERT_INFO,
320 QUERY_CREATE_TRIGGER_UPDATE_CERT_INFO2,
321 QUERY_CREATE_TRIGGER_DELETE_CERT_INFO,
322 QUERY_CREATE_TRIGGER_UPDATE_CERT_INDEX_INFO,
326 static int __initialize_db(sqlite3 *db, const char *dbpath, uid_t uid)
329 const char **queries;
332 if (__set_db_version(db))
335 if (strstr(dbpath, ".pkgmgr_parser.db")) {
336 queries = parser_init_queries;
337 } else if (strstr(dbpath, ".pkgmgr_cert.db")) {
338 queries = cert_init_queries;
340 _LOGE("unexpected dbpath: %s", dbpath);
344 for (i = 0; queries[i] != NULL; i++) {
345 ret = sqlite3_exec(db, queries[i], NULL, NULL, NULL);
346 if (ret != SQLITE_OK) {
347 _LOGE("exec failed: %s", sqlite3_errmsg(db));
352 if (__set_db_permission(dbpath, uid))
353 _LOGE("failed to set db permission");
358 API int pkgmgr_parser_initialize_parser_db(uid_t uid)
364 dbpath = __get_parser_db_path(uid);
365 if (access(dbpath, F_OK) != -1) {
366 _LOGE("Manifest db for user %d is already exists", uid);
367 return PM_PARSER_R_ERROR;
370 ret = sqlite3_open_v2(dbpath, &db,
371 SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
372 if (ret != SQLITE_OK) {
373 _LOGE("open db failed: %d", ret);
374 return PM_PARSER_R_ERROR;
377 if (__initialize_db(db, dbpath, uid)) {
378 sqlite3_close_v2(db);
379 return PM_PARSER_R_ERROR;
381 sqlite3_close_v2(db);
383 return PM_PARSER_R_OK;
386 API int pkgmgr_parser_initialize_cert_db(void)
392 dbpath = __get_cert_db_path();
393 if (access(dbpath, F_OK) != -1) {
394 _LOGE("Cert db is already exists");
395 return PM_PARSER_R_ERROR;
398 ret = sqlite3_open_v2(dbpath, &db,
399 SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
400 if (ret != SQLITE_OK) {
401 _LOGE("open db failed: %d", ret);
402 return PM_PARSER_R_ERROR;
405 if (__initialize_db(db, dbpath, GLOBAL_USER)) {
406 sqlite3_close_v2(db);
407 return PM_PARSER_R_ERROR;
409 sqlite3_close_v2(db);
411 return PM_PARSER_R_OK;
414 API int pkgmgr_parser_create_and_initialize_db(uid_t uid)
418 struct passwd *result;
421 ret = getpwnam_r(APPFW_USER, &pwd, buf, sizeof(buf), &result);
422 if (result == NULL) {
424 _LOGE("no such user: %s", APPFW_USER);
426 _LOGE("getpwnam_r failed: %d", errno);
427 return PM_PARSER_R_ERROR;
430 if (getuid() != OWNER_ROOT && getuid() != pwd.pw_uid) {
431 _LOGE("Only root or app_fw user is allowed");
432 return PM_PARSER_R_EINVAL;
435 if (pkgmgr_parser_initialize_parser_db(uid))
436 return PM_PARSER_R_ERROR;
438 if (pkgmgr_parser_initialize_cert_db())
439 return PM_PARSER_R_ERROR;
441 return PM_PARSER_R_OK;
444 #define BUSY_WAITING_USEC (1000000 / 10 / 2) /* 0.05 sec */
445 #define BUSY_WAITING_MAX 20 /* wait for max 1 sec */
446 static int __db_busy_handler(void *data, int count)
448 if (count < BUSY_WAITING_MAX) {
449 usleep(BUSY_WAITING_USEC);
452 /* sqlite3_prepare_v2 will return SQLITE_BUSY */
457 static int __open_db(uid_t uid, const char *path, sqlite3 **db, int flags)
461 /* FIXME: always open with OPEN_CREATE flag for keeping previous
464 if (flags & SQLITE_OPEN_READWRITE)
465 flags = flags | SQLITE_OPEN_CREATE;
467 ret = sqlite3_open_v2(path, db, flags, NULL);
468 if (ret != SQLITE_OK)
471 ret = sqlite3_busy_handler(*db, __db_busy_handler, NULL);
472 if (ret != SQLITE_OK) {
473 _LOGE("failed to register busy handler: %s",
474 sqlite3_errmsg(*db));
475 sqlite3_close_v2(*db);
479 if (flags & SQLITE_OPEN_CREATE) {
480 ret = __initialize_db(*db, path, uid);
482 _LOGE("failed to initialize db: %s\n");
483 sqlite3_close_v2(*db);
488 ret = sqlite3_exec(*db, "PRAGMA foreign_keys=ON", NULL, NULL, NULL);
489 if (ret != SQLITE_OK) {
490 _LOGE("failed to enable foreign key support: %s",
491 sqlite3_errmsg(*db));
492 sqlite3_close_v2(*db);
500 static int __convert_background_category(GList *category_list)
506 if (category_list == NULL)
509 for (tmp = category_list; tmp; tmp = tmp->next) {
510 category_data = (char *)tmp->data;
511 if (category_data == NULL)
513 if (!strcmp(category_data, APP_BG_CATEGORY_MEDIA_STR))
514 ret |= APP_BG_CATEGORY_MEDIA_VAL;
515 else if (!strcmp(category_data, APP_BG_CATEGORY_DOWNLOAD_STR))
516 ret |= APP_BG_CATEGORY_DOWNLOAD_VAL;
517 else if (!strcmp(category_data, APP_BG_CATEGORY_BGNETWORK_STR))
518 ret |= APP_BG_CATEGORY_BGNETWORK_VAL;
519 else if (!strcmp(category_data, APP_BG_CATEGORY_LOCATION_STR))
520 ret |= APP_BG_CATEGORY_LOCATION_VAL;
521 else if (!strcmp(category_data, APP_BG_CATEGORY_SENSOR_STR))
522 ret |= APP_BG_CATEGORY_SENSOR_VAL;
523 else if (!strcmp(category_data, APP_BG_CATEGORY_IOTCOMM_STR))
524 ret |= APP_BG_CATEGORY_IOTCOMM_VAL;
525 else if (!strcmp(category_data, APP_BG_CATEGORY_SYSTEM))
526 ret |= APP_BG_CATEGORY_SYSTEM_VAL;
528 _LOGE("Unidentified category [%s]", category_data);
534 #define EFFECTIVE_APPID_KEY "http://tizen.org/metadata/effective-appid"
535 static const char *__find_effective_appid(GList *metadata_list)
540 for (tmp = metadata_list; tmp; tmp = tmp->next) {
541 md = (metadata_x *)tmp->data;
542 if (md == NULL || md->key == NULL)
545 if (strcmp(md->key, EFFECTIVE_APPID_KEY) == 0) {
554 static int __insert_appcontrol_privilege_info(sqlite3 *db, const char *appid,
557 static const char query[] =
558 "INSERT INTO package_app_app_control_privilege (app_id,"
559 " app_control, privilege) VALUES (?, ?, ?)";
563 char app_control[BUFSIZE];
570 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
571 if (ret != SQLITE_OK) {
572 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
576 for (tmp = ac->privileges; tmp; tmp = tmp->next) {
577 privilege = (char *)tmp->data;
578 if (privilege == NULL || !strlen(privilege))
582 snprintf(app_control, sizeof(app_control), "%s|%s|%s",
583 ac->operation ? (strlen(ac->operation) > 0 ?
584 ac->operation : "NULL") : "NULL",
585 ac->uri ? (strlen(ac->uri) > 0 ?
586 ac->uri : "NULL") : "NULL",
587 ac->mime ? (strlen(ac->mime) > 0 ?
588 ac->mime : "NULL") : "NULL");
589 __BIND_TEXT(db, stmt, idx++, appid);
590 __BIND_TEXT(db, stmt, idx++, app_control);
591 __BIND_TEXT(db, stmt, idx++, privilege);
593 ret = sqlite3_step(stmt);
594 if (ret != SQLITE_DONE) {
595 _LOGE("step failed: %s", sqlite3_errmsg(db));
596 sqlite3_finalize(stmt);
603 sqlite3_finalize(stmt);
608 static int __insert_appcontrol_info(sqlite3 *db, application_x *app)
610 static const char query[] =
611 "INSERT INTO package_app_app_control (app_id, app_control) "
616 char app_control[BUFSIZE];
620 if (app->appcontrol == NULL)
623 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
624 if (ret != SQLITE_OK) {
625 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
629 for (tmp = app->appcontrol; tmp; tmp = tmp->next) {
630 ac = (appcontrol_x *)tmp->data;
634 snprintf(app_control, sizeof(app_control), "%s|%s|%s",
635 ac->operation ? (strlen(ac->operation) > 0 ?
636 ac->operation : "NULL") : "NULL",
637 ac->uri ? (strlen(ac->uri) > 0 ?
638 ac->uri : "NULL") : "NULL",
639 ac->mime ? (strlen(ac->mime) > 0 ?
640 ac->mime : "NULL") : "NULL");
641 __BIND_TEXT(db, stmt, idx++, app->appid);
642 __BIND_TEXT(db, stmt, idx++, app_control);
644 ret = sqlite3_step(stmt);
645 if (ret != SQLITE_DONE) {
646 _LOGE("step failed: %s", sqlite3_errmsg(db));
647 sqlite3_finalize(stmt);
651 if (__insert_appcontrol_privilege_info(db, app->appid, ac)) {
652 sqlite3_finalize(stmt);
659 sqlite3_finalize(stmt);
664 static int __insert_category_info(sqlite3 *db, application_x *app)
666 static const char query[] =
667 "INSERT INTO package_app_app_category (app_id, category) "
673 const char *category;
675 if (app->category == NULL)
678 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
679 if (ret != SQLITE_OK) {
680 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
684 for (tmp = app->category; tmp; tmp = tmp->next) {
685 category = (const char *)tmp->data;
686 if (category == NULL)
689 __BIND_TEXT(db, stmt, idx++, app->appid);
690 __BIND_TEXT(db, stmt, idx++, category);
692 ret = sqlite3_step(stmt);
693 if (ret != SQLITE_DONE) {
694 _LOGE("step failed: %s", sqlite3_errmsg(db));
695 sqlite3_finalize(stmt);
702 sqlite3_finalize(stmt);
707 static int __insert_metadata_info(sqlite3 *db, application_x *app)
709 static const char query[] =
710 "INSERT INTO package_app_app_metadata (app_id,"
711 " md_key, md_value) VALUES (?, ?, ?)";
718 if (app->metadata == NULL)
721 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
722 if (ret != SQLITE_OK) {
723 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
727 for (tmp = app->metadata; tmp; tmp = tmp->next) {
728 md = (metadata_x *)tmp->data;
732 __BIND_TEXT(db, stmt, idx++, app->appid);
733 __BIND_TEXT(db, stmt, idx++, md->key);
734 __BIND_TEXT(db, stmt, idx++, md->value);
736 ret = sqlite3_step(stmt);
737 if (ret != SQLITE_DONE) {
738 _LOGE("step failed: %s", sqlite3_errmsg(db));
739 sqlite3_finalize(stmt);
746 sqlite3_finalize(stmt);
751 static int __insert_app_data_control_privilege_info(sqlite3 *db,
752 datacontrol_x *datacontrol)
754 static const char query[] =
755 "INSERT INTO package_app_data_control_privilege (providerid,"
756 " privilege, type) VALUES (?, ?, ?)";
764 if (datacontrol == NULL)
767 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
768 if (ret != SQLITE_OK) {
769 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
773 for (privileges = datacontrol->privileges; privileges;
774 privileges = privileges->next) {
775 priv = (char *)privileges->data;
780 __BIND_TEXT(db, stmt, idx++, datacontrol->providerid);
781 __BIND_TEXT(db, stmt, idx++, priv);
782 __BIND_TEXT(db, stmt, idx++, datacontrol->type);
784 ret = sqlite3_step(stmt);
785 if (ret != SQLITE_DONE) {
786 _LOGE("step failed: %s", sqlite3_errmsg(db));
787 sqlite3_finalize(stmt);
794 sqlite3_finalize(stmt);
798 static int __insert_datacontrol_info(sqlite3 *db, application_x *app)
800 static const char query[] =
801 "INSERT INTO package_app_data_control (app_id, providerid,"
802 " access, type, trusted) VALUES (?, ?, ?, ?, ?)";
809 if (app->datacontrol == NULL)
812 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
813 if (ret != SQLITE_OK) {
814 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
818 for (tmp = app->datacontrol; tmp; tmp = tmp->next) {
819 dc = (datacontrol_x *)tmp->data;
823 __BIND_TEXT(db, stmt, idx++, app->appid);
824 __BIND_TEXT(db, stmt, idx++, dc->providerid);
825 __BIND_TEXT(db, stmt, idx++, dc->access);
826 __BIND_TEXT(db, stmt, idx++, dc->type);
827 __BIND_TEXT(db, stmt, idx++, dc->trusted);
829 ret = sqlite3_step(stmt);
830 if (ret != SQLITE_DONE) {
831 _LOGE("step failed: %s", sqlite3_errmsg(db));
832 sqlite3_finalize(stmt);
836 if (dc->privileges &&
837 __insert_app_data_control_privilege_info(db, dc)) {
838 sqlite3_finalize(stmt);
845 sqlite3_finalize(stmt);
850 /* TODO: move to installer */
851 static int __check_dpi(const char *dpi_char, int dpi_int)
853 if (dpi_char == NULL)
856 if (strcasecmp(dpi_char, LDPI) == 0) {
857 if (dpi_int >= LDPI_MIN && dpi_int <= LDPI_MAX)
861 } else if (strcasecmp(dpi_char, MDPI) == 0) {
862 if (dpi_int >= MDPI_MIN && dpi_int <= MDPI_MAX)
866 } else if (strcasecmp(dpi_char, HDPI) == 0) {
867 if (dpi_int >= HDPI_MIN && dpi_int <= HDPI_MAX)
871 } else if (strcasecmp(dpi_char, XHDPI) == 0) {
872 if (dpi_int >= XHDPI_MIN && dpi_int <= XHDPI_MAX)
876 } else if (strcasecmp(dpi_char, XXHDPI) == 0) {
877 if (dpi_int >= XXHDPI_MIN && dpi_int <= XXHDPI_MAX)
885 static gint __compare_splashscreen_with_orientation_dpi(gconstpointer a,
888 splashscreen_x *ss = (splashscreen_x *)a;
889 const char *orientation = (const char *)b;
893 if (ss->operation || ss->dpi == NULL)
896 ret = system_info_get_platform_int(
897 "http://tizen.org/feature/screen.dpi", &dpi);
898 if (ret != SYSTEM_INFO_ERROR_NONE)
901 if (strcasecmp(ss->orientation, orientation) == 0 &&
902 __check_dpi(ss->dpi, dpi) == 0)
908 static gint __compare_splashscreen_with_orientation(gconstpointer a,
911 splashscreen_x *ss = (splashscreen_x *)a;
912 const char *orientation = (const char *)b;
914 if (ss->operation || ss->dpi)
917 if (strcasecmp(ss->orientation, orientation) == 0)
923 static splashscreen_x *__find_default_splashscreen(GList *splashscreens,
924 const char *orientation)
928 tmp = g_list_find_custom(splashscreens, orientation,
930 __compare_splashscreen_with_orientation_dpi);
932 return (splashscreen_x *)tmp->data;
934 tmp = g_list_find_custom(splashscreens, orientation,
935 (GCompareFunc)__compare_splashscreen_with_orientation);
937 return (splashscreen_x *)tmp->data;
942 static void __find_appcontrol_splashscreen_with_dpi(gpointer data,
945 splashscreen_x *ss = (splashscreen_x *)data;
946 GList **list = (GList **)user_data;
950 if (ss->operation == NULL || ss->dpi == NULL)
953 ret = system_info_get_platform_int(
954 "http://tizen.org/feature/screen.dpi", &dpi);
955 if (ret != SYSTEM_INFO_ERROR_NONE)
958 if (__check_dpi(ss->dpi, dpi) != 0)
961 *list = g_list_append(*list, ss);
964 static void __find_appcontrol_splashscreen(gpointer data, gpointer user_data)
966 splashscreen_x *ss = (splashscreen_x *)data;
967 GList **list = (GList **)user_data;
968 splashscreen_x *ss_tmp;
971 if (ss->operation == NULL || ss->dpi)
974 for (tmp = *list; tmp; tmp = tmp->next) {
975 ss_tmp = (splashscreen_x *)tmp->data;
976 if (ss_tmp->operation
977 && strcmp(ss_tmp->operation, ss->operation) == 0
978 && strcmp(ss_tmp->orientation, ss->orientation) == 0)
982 *list = g_list_append(*list, ss);
985 static GList *__find_splashscreens(GList *splashscreens)
990 g_list_foreach(splashscreens,
991 __find_appcontrol_splashscreen_with_dpi, &list);
992 g_list_foreach(splashscreens,
993 __find_appcontrol_splashscreen, &list);
995 ss = __find_default_splashscreen(splashscreens, "portrait");
997 list = g_list_append(list, ss);
998 ss = __find_default_splashscreen(splashscreens, "landscape");
1000 list = g_list_append(list, ss);
1005 static int __insert_splashscreen_info(sqlite3 *db, application_x *app)
1007 static const char query[] =
1008 "INSERT INTO package_app_splash_screen (app_id, src, type,"
1009 " orientation, indicatordisplay, operation, color_depth) "
1010 "VALUES (?, ?, ?, ?, ?, ?, ?)";
1018 if (app->splashscreens == NULL)
1021 ss_list = __find_splashscreens(app->splashscreens);
1022 if (ss_list == NULL)
1025 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1026 if (ret != SQLITE_OK) {
1027 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1031 for (tmp = ss_list; tmp; tmp = tmp->next) {
1032 ss = (splashscreen_x *)tmp->data;
1036 __BIND_TEXT(db, stmt, idx++, app->appid);
1037 __BIND_TEXT(db, stmt, idx++, ss->src);
1038 __BIND_TEXT(db, stmt, idx++, ss->type);
1039 __BIND_TEXT(db, stmt, idx++, ss->orientation);
1040 __BIND_TEXT(db, stmt, idx++, ss->indicatordisplay);
1041 __BIND_TEXT(db, stmt, idx++, ss->operation);
1042 __BIND_TEXT(db, stmt, idx++, ss->color_depth);
1044 ret = sqlite3_step(stmt);
1045 if (ret != SQLITE_DONE) {
1046 _LOGE("step failed: %s", sqlite3_errmsg(db));
1047 sqlite3_finalize(stmt);
1051 sqlite3_reset(stmt);
1054 sqlite3_finalize(stmt);
1059 static void __trimfunc(GList *trim_list)
1063 GList *list = g_list_first(trim_list);
1066 trim_data = (char *)list->data;
1069 if (strcmp(trim_data, prev) == 0) {
1070 trim_list = g_list_remove(trim_list,
1072 list = g_list_first(trim_list);
1081 list = g_list_next(list);
1085 static gint __comparefunc(gconstpointer a, gconstpointer b, gpointer userdata)
1087 if (a == NULL || b == NULL)
1089 if (strcmp((char *)a, (char *)b) == 0)
1091 if (strcmp((char *)a, (char *)b) < 0)
1093 if (strcmp((char *)a, (char *)b) > 0)
1098 /* TODO: refactor inserting localized info */
1099 static GList *__create_locale_list(GList *lbls, GList *lcns, GList *icns,
1100 GList *dcns, GList *aths)
1102 GList *locale = NULL;
1110 for (tmp = lbls; tmp; tmp = tmp->next) {
1111 lbl = (label_x *)tmp->data;
1115 locale = g_list_insert_sorted_with_data(
1116 locale, (gpointer)lbl->lang,
1117 __comparefunc, NULL);
1119 for (tmp = lcns; tmp; tmp = tmp->next) {
1120 lcn = (license_x *)tmp->data;
1124 locale = g_list_insert_sorted_with_data(
1125 locale, (gpointer)lcn->lang,
1126 __comparefunc, NULL);
1128 for (tmp = icns; tmp; tmp = tmp->next) {
1129 icn = (icon_x *)tmp->data;
1133 locale = g_list_insert_sorted_with_data(
1134 locale, (gpointer)icn->lang,
1135 __comparefunc, NULL);
1137 for (tmp = dcns; tmp; tmp = tmp->next) {
1138 dcn = (description_x *)tmp->data;
1142 locale = g_list_insert_sorted_with_data(
1143 locale, (gpointer)dcn->lang,
1144 __comparefunc, NULL);
1146 for (tmp = aths; tmp; tmp = tmp->next) {
1147 ath = (author_x *)tmp->data;
1151 locale = g_list_insert_sorted_with_data(
1152 locale, (gpointer)ath->lang,
1153 __comparefunc, NULL);
1159 static gint __check_icon_resolution(const char *orig_icon_path,
1160 char **new_icon_path)
1164 char *icon_filename;
1165 char modified_iconpath[BUFSIZE];
1166 char icon_path[BUFSIZE];
1170 if (orig_icon_path == NULL)
1173 ret = system_info_get_platform_int(
1174 "http://tizen.org/feature/screen.dpi", &dpi);
1175 if (ret != SYSTEM_INFO_ERROR_NONE)
1178 if (dpi >= LDPI_MIN && dpi <= LDPI_MAX) {
1179 dpi_path[0] = "LDPI";
1180 dpi_path[1] = "ldpi";
1181 } else if (dpi >= MDPI_MIN && dpi <= MDPI_MAX) {
1182 dpi_path[0] = "MDPI";
1183 dpi_path[1] = "mdpi";
1184 } else if (dpi >= HDPI_MIN && dpi <= HDPI_MAX) {
1185 dpi_path[0] = "HDPI";
1186 dpi_path[1] = "hdpi";
1187 } else if (dpi >= XHDPI_MIN && dpi <= XHDPI_MAX) {
1188 dpi_path[0] = "XHDPI";
1189 dpi_path[1] = "xhdpi";
1190 } else if (dpi >= XXHDPI_MIN && dpi <= XXHDPI_MAX) {
1191 dpi_path[0] = "XXHDPI";
1192 dpi_path[1] = "xxhdpi";
1194 _LOGE("Unidentified dpi[%d]", dpi);
1198 icon_filename = strrchr(orig_icon_path, '/');
1199 if (icon_filename == NULL)
1203 strlen(orig_icon_path) - (strlen(icon_filename) - 1),
1204 "%s", orig_icon_path);
1205 for (i = 0; i < 2; i++) {
1206 snprintf(modified_iconpath, BUFSIZE - 1, "%s/%s%s",
1207 icon_path, dpi_path[i], icon_filename);
1208 if (access(modified_iconpath, F_OK) != -1) {
1209 /* if exists, return modified icon path */
1210 *new_icon_path = strdup(modified_iconpath);
1218 static gint __compare_icon(gconstpointer a, gconstpointer b)
1220 icon_x *icon = (icon_x *)a;
1223 if (icon->lang != NULL && strcasecmp(icon->lang, DEFAULT_LOCALE) != 0)
1226 if (icon->dpi != NULL)
1229 if (__check_icon_resolution(icon->text, &icon_path) == 0) {
1231 icon->text = icon_path;
1237 static gint __compare_icon_with_dpi(gconstpointer a, gconstpointer b)
1239 icon_x *icon = (icon_x *)a;
1240 int dpi = GPOINTER_TO_INT(b);
1242 if (icon->lang != NULL && strcasecmp(icon->lang, DEFAULT_LOCALE) != 0)
1245 if (icon->dpi == NULL)
1248 if (__check_dpi(icon->dpi, dpi) == 0)
1254 static gint __compare_icon_with_lang(gconstpointer a, gconstpointer b)
1256 icon_x *icon = (icon_x *)a;
1257 char *lang = (char *)b;
1260 if (icon->dpi != NULL)
1263 if (strcasecmp(icon->lang, lang) == 0) {
1264 if (strcasecmp(icon->lang, DEFAULT_LOCALE) == 0) {
1265 /* icon for no locale. check existance of
1266 * folder-hierachied default icons
1268 if (__check_icon_resolution(icon->text,
1271 icon->text = icon_path;
1280 static gint __compare_icon_with_lang_dpi(gconstpointer a, gconstpointer b)
1283 icon_x *icon = (icon_x *)a;
1284 char *lang = (char *)b;
1287 ret = system_info_get_platform_int(
1288 "http://tizen.org/feature/screen.dpi", &dpi);
1289 if (ret != SYSTEM_INFO_ERROR_NONE)
1292 if (strcasecmp(icon->lang, lang) == 0 &&
1293 __check_dpi(icon->dpi, dpi) == 0)
1299 static char *__find_icon(GList *icons, const char *lang)
1306 /* first, find icon whose locale and dpi with given lang and
1307 * system's dpi has matched
1309 tmp = g_list_find_custom(icons, lang,
1310 (GCompareFunc)__compare_icon_with_lang_dpi);
1312 icon = (icon_x *)tmp->data;
1313 return (char *)icon->text;
1316 /* if first has failed, find icon whose locale has matched */
1317 tmp = g_list_find_custom(icons, lang,
1318 (GCompareFunc)__compare_icon_with_lang);
1320 icon = (icon_x *)tmp->data;
1321 return (char *)icon->text;
1324 /* if second has failed, find icon whose dpi has matched with
1327 ret = system_info_get_platform_int(
1328 "http://tizen.org/feature/screen.dpi", &dpi);
1329 if (ret == SYSTEM_INFO_ERROR_NONE) {
1330 tmp = g_list_find_custom(icons, GINT_TO_POINTER(dpi),
1331 (GCompareFunc)__compare_icon_with_dpi);
1333 icon = (icon_x *)tmp->data;
1334 return (char *)icon->text;
1338 /* last, find default icon marked as "No Locale" */
1339 tmp = g_list_find_custom(icons, NULL, (GCompareFunc)__compare_icon);
1341 icon = (icon_x *)tmp->data;
1342 return (char *)icon->text;
1348 static void __extract_data(const char *locale, GList *lbls, GList *lcns,
1349 GList *icns, GList *dcns, GList *aths, char **label,
1350 char **license, char **icon, char **description, char **author)
1358 for (tmp = lbls; tmp; tmp = tmp->next) {
1359 lbl = (label_x *)tmp->data;
1363 if (strcmp(lbl->lang, locale) == 0) {
1364 *label = (char *)lbl->text;
1369 for (tmp = lcns; tmp; tmp = tmp->next) {
1370 lcn = (license_x *)tmp->data;
1374 if (strcmp(lcn->lang, locale) == 0) {
1375 *license = (char *)lcn->text;
1381 *icon = __find_icon(icns, locale);
1383 for (tmp = dcns; tmp; tmp = tmp->next) {
1384 dcn = (description_x *)tmp->data;
1388 if (strcmp(dcn->lang, locale) == 0) {
1389 *description = (char *)dcn->text;
1394 for (tmp = aths; tmp; tmp = tmp->next) {
1395 ath = (author_x *)tmp->data;
1399 if (strcmp(ath->lang, locale) == 0) {
1400 *author = (char *)ath->text;
1407 static int __insert_mainapp_localized_info(sqlite3 *db, application_x *app,
1408 const char *locale, const char *label, const char *icon)
1410 static const char query[] =
1411 "INSERT OR REPLACE INTO package_localized_info ("
1412 " package, package_locale, package_label, package_icon,"
1413 " package_description, package_license, package_author) "
1415 " COALESCE((SELECT package_label FROM package_localized_info"
1416 " WHERE package=? AND package_locale=?), ?),"
1417 " COALESCE((SELECT package_icon FROM package_localized_info"
1418 " WHERE package=? AND package_icon=?), ?),"
1419 " (SELECT package_description FROM package_localized_info"
1420 " WHERE package=? AND package_locale=?),"
1421 " (SELECT package_description FROM package_localized_info"
1422 " WHERE package=? AND package_locale=?),"
1423 " (SELECT package_description FROM package_localized_info"
1424 " WHERE package=? AND package_locale=?))";
1429 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1430 if (ret != SQLITE_OK) {
1431 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1435 __BIND_TEXT(db, stmt, idx++, app->package);
1436 __BIND_TEXT(db, stmt, idx++, locale);
1437 __BIND_TEXT(db, stmt, idx++, app->package);
1438 __BIND_TEXT(db, stmt, idx++, locale);
1439 __BIND_TEXT(db, stmt, idx++, label);
1440 __BIND_TEXT(db, stmt, idx++, app->package);
1441 __BIND_TEXT(db, stmt, idx++, locale);
1442 __BIND_TEXT(db, stmt, idx++, icon);
1443 __BIND_TEXT(db, stmt, idx++, app->package);
1444 __BIND_TEXT(db, stmt, idx++, locale);
1445 __BIND_TEXT(db, stmt, idx++, app->package);
1446 __BIND_TEXT(db, stmt, idx++, locale);
1447 __BIND_TEXT(db, stmt, idx++, app->package);
1448 __BIND_TEXT(db, stmt, idx++, locale);
1450 ret = sqlite3_step(stmt);
1451 if (ret != SQLITE_DONE) {
1452 _LOGE("step failed: %s", sqlite3_errmsg(db));
1453 sqlite3_finalize(stmt);
1457 sqlite3_finalize(stmt);
1462 static int __insert_app_localized_info(sqlite3 *db, application_x *app)
1464 static const char query[] =
1465 "INSERT INTO package_app_localized_info (app_id, app_locale,"
1466 " app_label, app_icon) "
1467 "VALUES (?, ?, ?, ?)";
1477 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1478 if (ret != SQLITE_OK) {
1479 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1483 locales = __create_locale_list(app->label, NULL, app->icon, NULL, NULL);
1484 for (tmp = locales; tmp; tmp = tmp->next) {
1485 locale = (const char *)tmp->data;
1488 __extract_data(locale, app->label, NULL, app->icon, NULL, NULL,
1489 &label, NULL, &icon, NULL, NULL);
1490 if (!label && !icon)
1494 __BIND_TEXT(db, stmt, idx++, app->appid);
1495 __BIND_TEXT(db, stmt, idx++, locale);
1496 __BIND_TEXT(db, stmt, idx++, label);
1497 __BIND_TEXT(db, stmt, idx++, icon);
1499 ret = sqlite3_step(stmt);
1500 if (ret != SQLITE_DONE) {
1501 _LOGE("step failed: %s", sqlite3_errmsg(db));
1502 g_list_free(locales);
1503 sqlite3_finalize(stmt);
1507 sqlite3_reset(stmt);
1509 if (strcasecmp(app->mainapp, "true") == 0) {
1510 if (__insert_mainapp_localized_info(db, app, locale,
1512 _LOGE("insert mainapp localized info failed");
1516 g_list_free(locales);
1517 sqlite3_finalize(stmt);
1522 static int __insert_package_privilege_info(sqlite3 *db, manifest_x *mfx)
1524 static const char query[] =
1525 "INSERT INTO package_privilege_info (package, privilege, type) "
1533 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1534 if (ret != SQLITE_OK) {
1535 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1539 for (tmp = mfx->privileges; tmp; tmp = tmp->next) {
1540 priv = (privilege_x *)tmp->data;
1545 __BIND_TEXT(db, stmt, idx++, mfx->package);
1546 __BIND_TEXT(db, stmt, idx++, priv->value);
1547 __BIND_TEXT(db, stmt, idx++, priv->type);
1549 ret = sqlite3_step(stmt);
1550 if (ret != SQLITE_DONE) {
1551 _LOGE("step failed: %s", sqlite3_errmsg(db));
1552 sqlite3_finalize(stmt);
1555 sqlite3_reset(stmt);
1558 sqlite3_finalize(stmt);
1563 /* _PRODUCT_LAUNCHING_ENHANCED_
1564 * app->indicatordisplay, app->portraitimg, app->landscapeimg,
1565 * app->guestmode_appstatus
1567 static int __insert_application_info(sqlite3 *db, manifest_x *mfx)
1569 static const char query[] =
1570 "INSERT INTO package_app_info (app_id, app_component,"
1571 " app_exec, app_nodisplay, app_type, app_onboot, app_multiple,"
1572 " app_autorestart, app_taskmanage, app_hwacceleration,"
1573 " app_screenreader, app_mainapp, app_recentimage,"
1574 " app_launchcondition, app_indicatordisplay, app_portraitimg,"
1575 " app_landscapeimg, app_guestmodevisibility,"
1576 " app_permissiontype, app_preload, app_submode,"
1577 " app_submode_mainid, app_installed_storage, app_process_pool,"
1578 " app_launch_mode, app_ui_gadget, app_support_mode,"
1579 " app_support_disable, component_type, package, app_tep_name,"
1580 " app_zip_mount_file, app_background_category,"
1581 " app_package_type, app_root_path, app_api_version,"
1582 " app_effective_appid, app_splash_screen_display,"
1583 " app_package_system, app_removable,"
1584 " app_package_installed_time, app_support_ambient,"
1585 " app_setup_appid) "
1587 " ?, LOWER(?), ?, LOWER(?), LOWER(?),"
1588 " LOWER(?), LOWER(?), ?,"
1592 " ?, LOWER(?), LOWER(?),"
1594 " COALESCE(?, 'single'), LOWER(?), ?,"
1595 " LOWER(?), ?, ?, ?,"
1599 " LOWER(?), LOWER(?),"
1608 const char *effective_appid;
1610 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1611 if (ret != SQLITE_OK) {
1612 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1616 for (tmp = mfx->application; tmp; tmp = tmp->next) {
1617 app = (application_x *)tmp->data;
1621 bg_category = __convert_background_category(
1622 app->background_category);
1623 effective_appid = __find_effective_appid(app->metadata);
1626 __BIND_TEXT(db, stmt, idx++, app->appid);
1627 __BIND_TEXT(db, stmt, idx++, app->component_type);
1628 __BIND_TEXT(db, stmt, idx++, app->exec);
1629 __BIND_TEXT(db, stmt, idx++, __get_bool(app->nodisplay, false));
1630 __BIND_TEXT(db, stmt, idx++, app->type);
1631 __BIND_TEXT(db, stmt, idx++, __get_bool(app->onboot, false));
1632 __BIND_TEXT(db, stmt, idx++, __get_bool(app->multiple, false));
1633 __BIND_TEXT(db, stmt, idx++,
1634 __get_bool(app->autorestart, false));
1635 __BIND_TEXT(db, stmt, idx++,
1636 __get_bool(app->taskmanage, false));
1637 __BIND_TEXT(db, stmt, idx++, app->hwacceleration);
1638 __BIND_TEXT(db, stmt, idx++, app->screenreader);
1639 __BIND_TEXT(db, stmt, idx++, __get_bool(app->mainapp, false));
1640 __BIND_TEXT(db, stmt, idx++, app->recentimage);
1641 __BIND_TEXT(db, stmt, idx++, app->launchcondition);
1642 __BIND_TEXT(db, stmt, idx++,
1643 __get_bool(app->indicatordisplay, true));
1644 __BIND_TEXT(db, stmt, idx++, app->portraitimg);
1645 __BIND_TEXT(db, stmt, idx++, app->landscapeimg);
1646 __BIND_TEXT(db, stmt, idx++,
1647 __get_bool(app->guestmode_visibility, true));
1648 __BIND_TEXT(db, stmt, idx++, app->permission_type);
1649 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->preload, false));
1650 __BIND_TEXT(db, stmt, idx++, __get_bool(app->submode, false));
1651 __BIND_TEXT(db, stmt, idx++, app->submode_mainid);
1652 __BIND_TEXT(db, stmt, idx++, mfx->installed_storage);
1653 __BIND_TEXT(db, stmt, idx++,
1654 __get_bool(app->process_pool, false));
1655 __BIND_TEXT(db, stmt, idx++, app->launch_mode);
1656 __BIND_TEXT(db, stmt, idx++, __get_bool(app->ui_gadget, false));
1657 __BIND_TEXT(db, stmt, idx++, app->support_mode);
1658 __BIND_TEXT(db, stmt, idx++,
1659 __get_bool(mfx->support_disable, false));
1660 __BIND_TEXT(db, stmt, idx++, app->component_type);
1661 __BIND_TEXT(db, stmt, idx++, mfx->package);
1662 __BIND_TEXT(db, stmt, idx++, mfx->tep_name);
1663 __BIND_TEXT(db, stmt, idx++, mfx->zip_mount_file);
1664 __BIND_INT(db, stmt, idx++, bg_category);
1665 __BIND_TEXT(db, stmt, idx++, mfx->type ? mfx->type : "tpk");
1666 __BIND_TEXT(db, stmt, idx++, mfx->root_path);
1667 __BIND_TEXT(db, stmt, idx++, mfx->api_version);
1668 __BIND_TEXT(db, stmt, idx++, effective_appid);
1669 __BIND_TEXT(db, stmt, idx++,
1670 __get_bool(app->splash_screen_display, true));
1671 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->system, false));
1672 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->removable, false));
1673 __BIND_TEXT(db, stmt, idx++, mfx->installed_time);
1674 __BIND_TEXT(db, stmt, idx++,
1675 __get_bool(app->support_ambient, false));
1676 __BIND_TEXT(db, stmt, idx++, app->setup_appid);
1678 ret = sqlite3_step(stmt);
1679 if (ret != SQLITE_DONE) {
1680 _LOGE("step failed: %s", sqlite3_errmsg(db));
1681 sqlite3_finalize(stmt);
1685 sqlite3_reset(stmt);
1687 if (__insert_appcontrol_info(db, app)) {
1688 sqlite3_finalize(stmt);
1691 if (__insert_category_info(db, app)) {
1692 sqlite3_finalize(stmt);
1695 if (__insert_metadata_info(db, app)) {
1696 sqlite3_finalize(stmt);
1699 if (__insert_datacontrol_info(db, app)) {
1700 sqlite3_finalize(stmt);
1703 if (__insert_splashscreen_info(db, app)) {
1704 sqlite3_finalize(stmt);
1707 if (__insert_app_localized_info(db, app)) {
1708 sqlite3_finalize(stmt);
1713 sqlite3_finalize(stmt);
1718 static int __insert_package_update_info(sqlite3 *db, manifest_x *mfx)
1720 static const char query[] =
1721 "INSERT INTO package_update_info (package, update_version) "
1727 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1728 if (ret != SQLITE_OK) {
1729 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1734 __BIND_TEXT(db, stmt, idx++, mfx->package);
1735 __BIND_TEXT(db, stmt, idx, mfx->version);
1736 ret = sqlite3_step(stmt);
1737 if (ret != SQLITE_DONE) {
1738 _LOGE("step failed: %s", sqlite3_errmsg(db));
1739 sqlite3_finalize(stmt);
1742 sqlite3_finalize(stmt);
1747 static int __insert_package_localized_info(sqlite3 *db, manifest_x *mfx)
1749 static const char query[] =
1750 "INSERT INTO package_localized_info (package, package_locale,"
1751 " package_label, package_icon, package_description,"
1752 " package_license, package_author) "
1753 "VALUES (?, ?, ?, ?, ?, ?, ?)";
1766 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1767 if (ret != SQLITE_OK) {
1768 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1772 locales = __create_locale_list(mfx->label, mfx->license, mfx->icon,
1773 mfx->description, mfx->author);
1774 for (tmp = locales; tmp; tmp = tmp->next) {
1775 locale = (const char *)tmp->data;
1781 __extract_data(locale, mfx->label, mfx->license, mfx->icon,
1782 mfx->description, mfx->author,
1783 &label, &license, &icon, &description, &author);
1784 if (!label && !license && !icon && !description && !author)
1788 __BIND_TEXT(db, stmt, idx++, mfx->package);
1789 __BIND_TEXT(db, stmt, idx++, locale);
1790 __BIND_TEXT(db, stmt, idx++, label);
1791 __BIND_TEXT(db, stmt, idx++, icon);
1792 __BIND_TEXT(db, stmt, idx++, description);
1793 __BIND_TEXT(db, stmt, idx++, license);
1794 __BIND_TEXT(db, stmt, idx++, author);
1796 ret = sqlite3_step(stmt);
1797 if (ret != SQLITE_DONE) {
1798 _LOGE("step failed: %s", sqlite3_errmsg(db));
1799 g_list_free(locales);
1800 sqlite3_finalize(stmt);
1804 sqlite3_reset(stmt);
1807 g_list_free(locales);
1808 sqlite3_finalize(stmt);
1813 static int __insert_package_info(sqlite3 *db, manifest_x *mfx)
1815 static const char query[] =
1816 "INSERT INTO package_info (package, package_type,"
1817 " package_version, package_api_version, package_tep_name,"
1818 " package_zip_mount_file, install_location, package_size,"
1819 " package_removable, package_preload, package_readonly,"
1820 " package_update, package_appsetting, package_nodisplay,"
1821 " package_system, author_name, author_email, author_href,"
1822 " installed_time, installed_storage, storeclient_id,"
1823 " mainapp_id, package_url, root_path, external_path,"
1824 " csc_path, package_support_mode, package_support_disable) "
1828 " LOWER(?), LOWER(?), LOWER(?),"
1829 " LOWER(?), LOWER(?), LOWER(?),"
1830 " LOWER(?), ?, ?, ?,"
1837 const char *author_name = NULL;
1838 const char *author_email = NULL;
1839 const char *author_href = NULL;
1841 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1842 if (ret != SQLITE_OK) {
1843 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1847 if (mfx->author && mfx->author->data) {
1848 author_name = ((author_x *)mfx->author->data)->text;
1849 author_email = ((author_x *)mfx->author->data)->email;
1850 author_href = ((author_x *)mfx->author->data)->href;
1853 __BIND_TEXT(db, stmt, idx++, mfx->package);
1854 __BIND_TEXT(db, stmt, idx++, mfx->type);
1855 __BIND_TEXT(db, stmt, idx++, mfx->version);
1856 __BIND_TEXT(db, stmt, idx++, mfx->api_version);
1857 __BIND_TEXT(db, stmt, idx++, mfx->tep_name);
1858 __BIND_TEXT(db, stmt, idx++, mfx->zip_mount_file);
1859 __BIND_TEXT(db, stmt, idx++, mfx->installlocation);
1860 __BIND_TEXT(db, stmt, idx++, mfx->package_size);
1861 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->removable, true));
1862 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->preload, false));
1863 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->readonly, false));
1864 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->update, false));
1865 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->appsetting, false));
1866 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->nodisplay_setting, false));
1867 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->system, false));
1868 __BIND_TEXT(db, stmt, idx++, author_name);
1869 __BIND_TEXT(db, stmt, idx++, author_email);
1870 __BIND_TEXT(db, stmt, idx++, author_href);
1871 __BIND_TEXT(db, stmt, idx++, mfx->installed_time);
1872 __BIND_TEXT(db, stmt, idx++, mfx->installed_storage);
1873 __BIND_TEXT(db, stmt, idx++, mfx->storeclient_id);
1874 __BIND_TEXT(db, stmt, idx++, mfx->mainapp_id);
1875 __BIND_TEXT(db, stmt, idx++, mfx->package_url);
1876 __BIND_TEXT(db, stmt, idx++, mfx->root_path);
1877 __BIND_TEXT(db, stmt, idx++, mfx->external_path);
1878 __BIND_TEXT(db, stmt, idx++, mfx->csc_path);
1879 __BIND_TEXT(db, stmt, idx++, mfx->support_mode);
1880 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->support_disable, false));
1882 ret = sqlite3_step(stmt);
1883 if (ret != SQLITE_DONE) {
1884 _LOGE("step failed: %s", sqlite3_errmsg(db));
1885 sqlite3_finalize(stmt);
1889 sqlite3_finalize(stmt);
1891 if (__insert_package_update_info(db, mfx))
1893 if (__insert_package_localized_info(db, mfx))
1895 if (__insert_application_info(db, mfx))
1897 if (__insert_package_privilege_info(db, mfx))
1903 API int pkgmgr_parser_insert_manifest_info_in_usr_db(manifest_x *mfx, uid_t uid)
1910 _LOGE("invalid parameter");
1911 return PM_PARSER_R_EINVAL;
1914 dbpath = __get_parser_db_path(uid);
1916 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
1917 if (ret != SQLITE_OK) {
1918 _LOGE("open db failed: %d", ret);
1919 return PM_PARSER_R_ERROR;
1922 __BEGIN_TRANSACTION(db);
1923 __DO_TRANSACTION(db, __insert_package_info(db, mfx));
1924 __END_TRANSACTION(db);
1926 sqlite3_close_v2(db);
1928 return PM_PARSER_R_OK;
1931 API int pkgmgr_parser_insert_manifest_info_in_db(manifest_x *mfx)
1933 return pkgmgr_parser_insert_manifest_info_in_usr_db(mfx, __getuid());
1936 static int __delete_package_info(sqlite3 *db, const char *pkgid)
1938 static const char query[] =
1939 "DELETE FROM package_info WHERE package=?";
1943 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1944 if (ret != SQLITE_OK) {
1945 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1949 __BIND_TEXT(db, stmt, 1, pkgid);
1951 ret = sqlite3_step(stmt);
1952 if (ret != SQLITE_DONE) {
1953 _LOGE("step failed: %s", sqlite3_errmsg(db));
1954 sqlite3_finalize(stmt);
1958 sqlite3_finalize(stmt);
1963 API int pkgmgr_parser_delete_manifest_info_from_usr_db(manifest_x *mfx,
1971 _LOGE("invalid parameter");
1972 return PM_PARSER_R_EINVAL;
1975 dbpath = __get_parser_db_path(uid);
1977 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
1978 if (ret != SQLITE_OK) {
1979 _LOGE("open db failed: %d", ret);
1980 return PM_PARSER_R_ERROR;
1983 __BEGIN_TRANSACTION(db);
1984 __DO_TRANSACTION(db, __delete_package_info(db, mfx->package));
1985 __END_TRANSACTION(db);
1987 sqlite3_close_v2(db);
1989 return PM_PARSER_R_OK;
1992 API int pkgmgr_parser_delete_manifest_info_from_db(manifest_x *mfx)
1994 return pkgmgr_parser_delete_manifest_info_from_usr_db(mfx, __getuid());
1997 API int pkgmgr_parser_update_manifest_info_in_usr_db(manifest_x *mfx, uid_t uid)
2004 _LOGE("invalid parameter");
2005 return PM_PARSER_R_EINVAL;
2008 dbpath = __get_parser_db_path(uid);
2010 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2011 if (ret != SQLITE_OK) {
2012 _LOGE("open db failed: %d", ret);
2013 return PM_PARSER_R_ERROR;
2016 __BEGIN_TRANSACTION(db);
2017 __DO_TRANSACTION(db, __delete_package_info(db, mfx->package));
2018 __DO_TRANSACTION(db, __insert_package_info(db, mfx));
2019 __END_TRANSACTION(db);
2021 sqlite3_close_v2(db);
2023 return PM_PARSER_R_OK;
2026 API int pkgmgr_parser_update_manifest_info_in_db(manifest_x *mfx)
2028 return pkgmgr_parser_update_manifest_info_in_usr_db(mfx, __getuid());
2031 static int __set_global_app_disable_for_uid(sqlite3 *db, const char *appid,
2032 uid_t uid, bool is_disable)
2034 static const char query[] =
2035 "INSERT OR REPLACE INTO package_app_info_for_uid ("
2036 " app_id, uid, is_disabled, is_splash_screen_enabled) "
2038 " (SELECT app_splash_screen_display FROM package_app_info"
2039 " WHERE app_id=?))";
2044 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2045 if (ret != SQLITE_OK) {
2046 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2050 __BIND_TEXT(db, stmt, idx++, appid);
2051 __BIND_INT(db, stmt, idx++, uid);
2052 __BIND_TEXT(db, stmt, idx++, is_disable ? "true" : "false");
2053 __BIND_TEXT(db, stmt, idx++, appid);
2055 ret = sqlite3_step(stmt);
2056 if (ret != SQLITE_DONE) {
2057 _LOGE("step failed: %s", sqlite3_errmsg(db));
2058 sqlite3_finalize(stmt);
2062 sqlite3_finalize(stmt);
2067 API int pkgmgr_parser_update_global_app_disable_for_uid_info_in_db(
2068 const char *appid, uid_t uid, int is_disable)
2074 if (appid == NULL) {
2075 _LOGE("invalid parameter");
2076 return PM_PARSER_R_EINVAL;
2079 dbpath = __get_parser_db_path(GLOBAL_USER);
2081 ret = __open_db(GLOBAL_USER, dbpath, &db, SQLITE_OPEN_READWRITE);
2082 if (ret != SQLITE_OK) {
2083 _LOGE("open db failed: %d", ret);
2084 return PM_PARSER_R_ERROR;
2087 __BEGIN_TRANSACTION(db);
2088 __DO_TRANSACTION(db, __set_global_app_disable_for_uid(db, appid,
2089 uid, (bool)is_disable));
2090 __END_TRANSACTION(db);
2092 sqlite3_close_v2(db);
2094 return PM_PARSER_R_OK;
2097 static int __set_app_disable(sqlite3 *db, const char *appid, uid_t uid,
2100 static const char query[] =
2101 "UPDATE package_app_info SET app_disable=? "
2107 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2108 if (ret != SQLITE_OK) {
2109 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2113 __BIND_TEXT(db, stmt, idx++, is_disable ? "true" : "false");
2114 __BIND_TEXT(db, stmt, idx++, appid);
2116 ret = sqlite3_step(stmt);
2117 if (ret != SQLITE_DONE) {
2118 _LOGE("step failed: %s", sqlite3_errmsg(db));
2119 sqlite3_finalize(stmt);
2123 sqlite3_finalize(stmt);
2128 API int pkgmgr_parser_update_app_disable_info_in_usr_db(const char *appid,
2129 uid_t uid, int is_disable)
2135 if (appid == NULL) {
2136 _LOGE("invalid parameter");
2137 return PM_PARSER_R_EINVAL;
2140 dbpath = __get_parser_db_path(uid);
2142 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2143 if (ret != SQLITE_OK) {
2144 _LOGE("open db failed: %d", ret);
2145 return PM_PARSER_R_ERROR;
2148 __BEGIN_TRANSACTION(db);
2149 __DO_TRANSACTION(db, __set_app_disable(db, appid, uid,
2151 __END_TRANSACTION(db);
2153 sqlite3_close_v2(db);
2155 return PM_PARSER_R_OK;
2158 API int pkgmgr_parser_update_app_disable_info_in_db(const char *appid,
2161 return pkgmgr_parser_update_app_disable_info_in_usr_db(appid,
2162 __getuid(), is_disable);
2165 static int __set_pkg_disable(sqlite3 *db, const char *pkgid, uid_t uid,
2168 static const char query[] =
2169 "UPDATE package_info SET package_disable=? "
2175 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2176 if (ret != SQLITE_OK) {
2177 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2181 __BIND_TEXT(db, stmt, idx++, is_disable ? "true" : "false");
2182 __BIND_TEXT(db, stmt, idx++, pkgid);
2184 ret = sqlite3_step(stmt);
2185 if (ret != SQLITE_DONE) {
2186 _LOGE("step failed: %s", sqlite3_errmsg(db));
2187 sqlite3_finalize(stmt);
2191 sqlite3_finalize(stmt);
2196 API int pkgmgr_parser_update_pkg_disable_info_in_usr_db(const char *pkgid,
2197 uid_t uid, int is_disable)
2203 if (pkgid == NULL) {
2204 _LOGE("invalid parameter");
2205 return PM_PARSER_R_EINVAL;
2208 dbpath = __get_parser_db_path(uid);
2210 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2211 if (ret != SQLITE_OK) {
2212 _LOGE("open db failed: %d", ret);
2213 return PM_PARSER_R_ERROR;
2216 __BEGIN_TRANSACTION(db);
2217 __DO_TRANSACTION(db, __set_pkg_disable(db, pkgid, uid,
2219 __END_TRANSACTION(db);
2221 sqlite3_close_v2(db);
2223 return PM_PARSER_R_OK;
2226 API int pkgmgr_parser_update_pkg_disable_info_in_db(const char *pkgid,
2229 return pkgmgr_parser_update_pkg_disable_info_in_usr_db(pkgid,
2230 __getuid(), is_disable);
2233 static int __set_global_app_splash_screen_for_uid(sqlite3 *db,
2234 const char *appid, uid_t uid, bool is_enabled)
2236 static const char query[] =
2237 "INSERT OR REPLACE INTO package_app_info_for_uid("
2238 " appid, uid, is_splash_screen_enabled) "
2244 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2245 if (ret != SQLITE_OK) {
2246 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2250 __BIND_TEXT(db, stmt, idx++, appid);
2251 __BIND_INT(db, stmt, idx++, uid);
2252 __BIND_TEXT(db, stmt, idx++, is_enabled ? "true" : "false");
2254 ret = sqlite3_step(stmt);
2255 if (ret != SQLITE_DONE) {
2256 _LOGE("step failed: %s", sqlite3_errmsg(db));
2257 sqlite3_finalize(stmt);
2261 sqlite3_finalize(stmt);
2266 API int pkgmgr_parser_update_global_app_splash_screen_display_info_in_usr_db(
2267 const char *appid, uid_t uid, int flag)
2273 if (appid == NULL) {
2274 _LOGE("invalid parameter");
2275 return PM_PARSER_R_EINVAL;
2278 dbpath = __get_parser_db_path(GLOBAL_USER);
2280 ret = __open_db(GLOBAL_USER, dbpath, &db, SQLITE_OPEN_READWRITE);
2281 if (ret != SQLITE_OK) {
2282 _LOGE("open db failed: %d", ret);
2283 return PM_PARSER_R_ERROR;
2286 __BEGIN_TRANSACTION(db);
2287 __DO_TRANSACTION(db, __set_global_app_splash_screen_for_uid(db,
2288 appid, uid, (bool)flag));
2289 __END_TRANSACTION(db);
2291 sqlite3_close_v2(db);
2293 return PM_PARSER_R_OK;
2296 static int __set_app_splash_screen(sqlite3 *db, const char *appid,
2299 static const char query[] =
2300 "UPDATE package_app_info SET app_splash_screen_display=? "
2306 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2307 if (ret != SQLITE_OK) {
2308 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2312 __BIND_TEXT(db, stmt, idx++, is_enabled ? "true" : "false");
2313 __BIND_TEXT(db, stmt, idx++, appid);
2315 ret = sqlite3_step(stmt);
2316 if (ret != SQLITE_DONE) {
2317 _LOGE("step failed: %s", sqlite3_errmsg(db));
2318 sqlite3_finalize(stmt);
2322 sqlite3_finalize(stmt);
2327 API int pkgmgr_parser_update_app_splash_screen_display_info_in_usr_db(
2328 const char *appid, uid_t uid, int flag)
2334 if (appid == NULL) {
2335 _LOGE("invalid parameter");
2336 return PM_PARSER_R_EINVAL;
2339 dbpath = __get_parser_db_path(uid);
2341 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2342 if (ret != SQLITE_OK) {
2343 _LOGE("open db failed: %d", ret);
2344 return PM_PARSER_R_ERROR;
2347 __BEGIN_TRANSACTION(db);
2348 __DO_TRANSACTION(db, __set_app_splash_screen(db, appid, (bool)flag));
2349 __END_TRANSACTION(db);
2351 sqlite3_close_v2(db);
2353 return PM_PARSER_R_OK;
2356 API int pkgmgr_parser_update_app_splash_screen_display_info_in_db(
2357 const char *appid, int flag)
2359 return pkgmgr_parser_update_app_splash_screen_display_info_in_usr_db(
2360 appid, __getuid(), flag);
2363 static int __set_app_label(sqlite3 *db, const char *appid, const char *label)
2365 static const char query[] =
2366 "UPDATE package_app_localized_info SET app_label=? "
2367 "WHERE app_id=? AND app_label IS NOT NULL";
2372 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2373 if (ret != SQLITE_OK) {
2374 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2378 __BIND_TEXT(db, stmt, idx++, label);
2379 __BIND_TEXT(db, stmt, idx++, appid);
2381 ret = sqlite3_step(stmt);
2382 if (ret != SQLITE_DONE) {
2383 _LOGE("step failed: %s", sqlite3_errmsg(db));
2384 sqlite3_finalize(stmt);
2388 sqlite3_finalize(stmt);
2393 API int pkgmgr_parser_update_app_label_info_in_usr_db(const char *appid,
2394 uid_t uid, const char *label)
2400 if (appid == NULL) {
2401 _LOGE("invalid parameter");
2402 return PM_PARSER_R_EINVAL;
2405 dbpath = __get_parser_db_path(uid);
2407 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2408 if (ret != SQLITE_OK) {
2409 _LOGE("open db failed: %d", ret);
2410 return PM_PARSER_R_ERROR;
2413 __BEGIN_TRANSACTION(db);
2414 __DO_TRANSACTION(db, __set_app_label(db, appid, label));
2415 __END_TRANSACTION(db);
2417 sqlite3_close_v2(db);
2419 return PM_PARSER_R_OK;
2422 API int pkgmgr_parser_update_app_label_info_in_db(const char *appid,
2425 return pkgmgr_parser_update_app_label_info_in_usr_db(appid, __getuid(),
2429 static int __set_tep_path(sqlite3 *db, const char *pkgid, const char *tep_path)
2431 static const char query[] =
2432 "UPDATE package_info SET package_tep_name=? "
2438 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2439 if (ret != SQLITE_OK) {
2440 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2444 __BIND_TEXT(db, stmt, idx++, tep_path);
2445 __BIND_TEXT(db, stmt, idx++, pkgid);
2447 ret = sqlite3_step(stmt);
2448 if (ret != SQLITE_DONE) {
2449 _LOGE("step failed: %s", sqlite3_errmsg(db));
2450 sqlite3_finalize(stmt);
2454 sqlite3_finalize(stmt);
2459 API int pkgmgr_parser_update_tep_info_in_usr_db(const char *pkgid,
2460 const char *tep_path, uid_t uid)
2466 if (pkgid == NULL) {
2467 _LOGE("invalid parameter");
2468 return PM_PARSER_R_EINVAL;
2471 dbpath = __get_parser_db_path(uid);
2473 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2474 if (ret != SQLITE_OK) {
2475 _LOGE("open db failed: %d", ret);
2476 return PM_PARSER_R_ERROR;
2479 __BEGIN_TRANSACTION(db);
2480 __DO_TRANSACTION(db, __set_tep_path(db, pkgid, tep_path));
2481 __END_TRANSACTION(db);
2483 sqlite3_close_v2(db);
2485 return PM_PARSER_R_OK;
2488 API int pkgmgr_parser_update_tep_info_in_db(const char *pkgid,
2489 const char *tep_path)
2491 return pkgmgr_parser_update_tep_info_in_usr_db(pkgid, tep_path,
2495 static int __convert_update_type(pkgmgrinfo_updateinfo_update_type type,
2496 const char **update_type)
2498 if (type == PMINFO_UPDATEINFO_NONE)
2499 *update_type = PMINFO_UPDATEINFO_TYPE_NONE;
2500 else if (type == PMINFO_UPDATEINFO_FORCE)
2501 *update_type = PMINFO_UPDATEINFO_TYPE_FORCE;
2502 else if (type == PMINFO_UPDATEINFO_OPTIONAL)
2503 *update_type = PMINFO_UPDATEINFO_TYPE_OPTIONAL;
2509 static int __register_pkg_update_info(sqlite3 *db, updateinfo_x *info,
2510 const char *update_type)
2512 static const char query[] =
2513 "UPDATE package_update_info "
2514 "SET update_version=?, update_type=? "
2520 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2521 if (ret != SQLITE_OK) {
2522 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2526 __BIND_TEXT(db, stmt, idx++, info->version);
2527 __BIND_TEXT(db, stmt, idx++, update_type);
2528 __BIND_TEXT(db, stmt, idx++, info->pkgid);
2530 ret = sqlite3_step(stmt);
2531 if (ret != SQLITE_DONE) {
2532 _LOGE("step failed: %s", sqlite3_errmsg(db));
2533 sqlite3_finalize(stmt);
2537 sqlite3_finalize(stmt);
2542 API int pkgmgr_parser_register_pkg_update_info_in_usr_db(
2543 pkgmgrinfo_updateinfo_h handle, uid_t uid)
2546 updateinfo_x *update_info;
2547 updateinfo_x *prev_update_info;
2548 pkgmgrinfo_updateinfo_h prev_update_handle;
2549 pkgmgrinfo_pkginfo_h pkginfo;
2550 pkgmgrinfo_version_compare_type compare_result;
2552 const char *update_type;
2556 if (handle == NULL) {
2557 _LOGE("invalid parameter");
2558 return PM_PARSER_R_EINVAL;
2561 update_info = (updateinfo_x *)handle;
2562 if (update_info->pkgid == NULL || update_info->version == NULL)
2563 return PM_PARSER_R_EINVAL;
2564 if (__convert_update_type(update_info->type, &update_type) != 0)
2565 return PM_PARSER_R_EINVAL;
2567 ret = pkgmgrinfo_updateinfo_get_usr_updateinfo(update_info->pkgid,
2568 &prev_update_handle, uid);
2569 if (ret != PMINFO_R_OK)
2570 return PM_PARSER_R_ERROR;
2572 prev_update_info = (updateinfo_x *)prev_update_handle;
2573 ret = pkgmgrinfo_compare_package_version(update_info->version,
2574 prev_update_info->version, &compare_result);
2575 if (ret != PMINFO_R_OK) {
2576 pkgmgrinfo_updateinfo_destroy(prev_update_handle);
2577 return PM_PARSER_R_ERROR;
2580 if (compare_result == PMINFO_VERSION_SAME &&
2581 prev_update_info->type == PMINFO_UPDATEINFO_NONE) {
2582 _LOGI("Given update info version[%s] of pkgid[%s] "
2584 update_info->version, update_info->pkgid);
2585 pkgmgrinfo_updateinfo_destroy(prev_update_handle);
2586 return PM_PARSER_R_OK;
2588 pkgmgrinfo_updateinfo_destroy(prev_update_handle);
2590 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(update_info->pkgid, uid,
2592 if (ret != PMINFO_R_OK)
2593 return PM_PARSER_R_ERROR;
2595 ret = pkgmgrinfo_pkginfo_is_global(pkginfo, &is_global_pkg);
2596 if (ret != PMINFO_R_OK) {
2597 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
2598 return PM_PARSER_R_ERROR;
2600 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
2602 dbpath = __get_parser_db_path(is_global_pkg ? GLOBAL_USER : uid);
2604 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2605 if (ret != SQLITE_OK) {
2606 _LOGE("open db failed: %d", ret);
2607 return PM_PARSER_R_ERROR;
2610 __BEGIN_TRANSACTION(db);
2611 __DO_TRANSACTION(db, __register_pkg_update_info(db, update_info,
2613 __END_TRANSACTION(db);
2615 sqlite3_close_v2(db);
2617 return PM_PARSER_R_OK;
2620 API int pkgmgr_parser_register_pkg_update_info_in_db(
2621 pkgmgrinfo_updateinfo_h handle)
2623 return pkgmgr_parser_register_pkg_update_info_in_usr_db(handle,
2627 static int __unregister_pkg_update_info(sqlite3 *db, const char *pkgid)
2629 static const char query[] =
2630 "UPDATE package_update_info SET update_type='none' "
2636 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2637 if (ret != SQLITE_OK) {
2638 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2642 __BIND_TEXT(db, stmt, idx++, pkgid);
2644 ret = sqlite3_step(stmt);
2645 if (ret != SQLITE_DONE) {
2646 _LOGE("step failed: %s", sqlite3_errmsg(db));
2647 sqlite3_finalize(stmt);
2651 sqlite3_finalize(stmt);
2656 API int pkgmgr_parser_unregister_pkg_update_info_in_usr_db(const char *pkgid,
2662 pkgmgrinfo_pkginfo_h pkginfo;
2665 if (pkgid == NULL) {
2666 _LOGE("invalid parameter");
2667 return PM_PARSER_R_EINVAL;
2670 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &pkginfo);
2671 if (ret != PMINFO_R_OK)
2672 return PM_PARSER_R_EINVAL;
2674 ret = pkgmgrinfo_pkginfo_is_global(pkginfo, &is_global_pkg);
2675 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
2676 if (ret != PMINFO_R_OK)
2677 return PM_PARSER_R_ERROR;
2679 dbpath = __get_parser_db_path(is_global_pkg ? GLOBAL_USER : uid);
2681 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2682 if (ret != SQLITE_OK) {
2683 _LOGE("open db failed: %d", ret);
2684 return PM_PARSER_R_ERROR;
2687 __BEGIN_TRANSACTION(db);
2688 __DO_TRANSACTION(db, __unregister_pkg_update_info(db, pkgid));
2689 __END_TRANSACTION(db);
2691 sqlite3_close_v2(db);
2693 return PM_PARSER_R_OK;
2696 API int pkgmgr_parser_unregister_pkg_update_info_in_db(const char *pkgid)
2698 return pkgmgr_parser_unregister_pkg_update_info_in_usr_db(pkgid,
2702 static int __unregister_all_pkg_update_info(sqlite3 *db)
2704 static const char query[] =
2705 "UPDATE package_update_info SET update_type='none'";
2709 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2710 if (ret != SQLITE_OK) {
2711 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2715 ret = sqlite3_step(stmt);
2716 if (ret != SQLITE_DONE) {
2717 _LOGE("step failed: %s", sqlite3_errmsg(db));
2718 sqlite3_finalize(stmt);
2722 sqlite3_finalize(stmt);
2727 API int pkgmgr_parser_unregister_all_pkg_update_info_in_usr_db(uid_t uid)
2733 dbpath = __get_parser_db_path(uid);
2735 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2736 if (ret != SQLITE_OK) {
2737 _LOGE("open db failed: %d", ret);
2738 return PM_PARSER_R_ERROR;
2741 __BEGIN_TRANSACTION(db);
2742 __DO_TRANSACTION(db, __unregister_all_pkg_update_info(db));
2743 __END_TRANSACTION(db);
2745 sqlite3_close_v2(db);
2747 return PM_PARSER_R_OK;
2750 API int pkgmgr_parser_unregister_all_pkg_update_info_in_db(void)
2752 return pkgmgr_parser_unregister_all_pkg_update_info_in_usr_db(