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>
33 #include <tzplatform_config.h>
34 #include <system_info.h>
36 #include "pkgmgr-info.h"
37 #include "pkgmgrinfo_basic.h"
38 #include "pkgmgr_parser.h"
39 #include "pkgmgr_parser_db_queries.h"
40 #include "pkgmgr_parser_debug.h"
41 #include "pkgmgr_parser_internal.h"
47 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
50 #define APPFW_USER "app_fw"
59 #define XXHDPI "xxhdpi"
69 #define XXHDPI_MIN 481
70 #define XXHDPI_MAX 600
72 /* app background category value */
73 #define APP_BG_CATEGORY_USER_DISABLE_FALSE_VAL 0x00000
74 #define APP_BG_CATEGORY_USER_DISABLE_TRUE_VAL 0x00001
75 #define APP_BG_CATEGORY_MEDIA_VAL 0x00002
76 #define APP_BG_CATEGORY_DOWNLOAD_VAL 0x00004
77 #define APP_BG_CATEGORY_BGNETWORK_VAL 0x00008
78 #define APP_BG_CATEGORY_LOCATION_VAL 0x00010
79 #define APP_BG_CATEGORY_SENSOR_VAL 0x00020
80 #define APP_BG_CATEGORY_IOTCOMM_VAL 0x00040
81 #define APP_BG_CATEGORY_SYSTEM_VAL 0x00080
83 #define APP_BG_CATEGORY_USER_DISABLE_FALSE_STR "enable"
84 #define APP_BG_CATEGORY_USER_DISABLE_TRUE_STR "disable"
85 #define APP_BG_CATEGORY_MEDIA_STR "media"
86 #define APP_BG_CATEGORY_DOWNLOAD_STR "download"
87 #define APP_BG_CATEGORY_BGNETWORK_STR "background-network"
88 #define APP_BG_CATEGORY_LOCATION_STR "location"
89 #define APP_BG_CATEGORY_SENSOR_STR "sensor"
90 #define APP_BG_CATEGORY_IOTCOMM_STR "iot-communication"
91 #define APP_BG_CATEGORY_SYSTEM "system"
93 #define REGULAR_USER 5000
94 static inline uid_t __getuid(void)
98 if (uid < REGULAR_USER)
99 return tzplatform_getuid(TZ_SYS_GLOBALAPP_USER);
104 static const char *__get_bool(char *value, bool is_true)
107 if (!strcmp(value, ""))
108 return (is_true) ? "true" : "false";
112 return (is_true) ? "true" : "false";
115 #define __BEGIN_TRANSACTION(db) \
117 if (sqlite3_exec(db, "BEGIN DEFERRED", NULL, NULL, NULL) != \
119 _LOGE("begin transaction failed: %s", sqlite3_errmsg(db)); \
120 sqlite3_close_v2(db); \
121 return PM_PARSER_R_ERROR; \
125 #define __DO_TRANSACTION(db, func) \
128 _LOGE("transaction failed: %s, rollback", sqlite3_errmsg(db)); \
129 if (sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL) != \
131 _LOGE("roll back transaction failed: %s", \
132 sqlite3_errmsg(db)); \
133 sqlite3_close_v2(db); \
134 return PM_PARSER_R_ERROR; \
138 #define __END_TRANSACTION(db) \
140 if (sqlite3_exec(db, "COMMIT", NULL, NULL, NULL) != \
142 _LOGE("commit failed: %s, rollback", sqlite3_errmsg(db)); \
143 if (sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL) != \
145 _LOGE("roll back transaction failed: %s", \
146 sqlite3_errmsg(db)); \
147 sqlite3_close_v2(db); \
148 return PM_PARSER_R_ERROR; \
152 #define __BIND_TEXT(db, stmt, i, text) \
154 if (sqlite3_bind_text(stmt, i, text, -1, SQLITE_STATIC) != SQLITE_OK) {\
155 _LOGE("bind error(index %d): %s", i, sqlite3_errmsg(db)); \
156 sqlite3_finalize(stmt); \
161 #define __BIND_INT(db, stmt, i, int) \
163 if (sqlite3_bind_int(stmt, i, int) != SQLITE_OK) { \
164 _LOGE("bind error(index %d): %s", i, sqlite3_errmsg(db)); \
165 sqlite3_finalize(stmt); \
170 static const char *__get_parser_db_path(uid_t uid)
175 if (uid == GLOBAL_USER || uid == OWNER_ROOT) {
176 path = tzplatform_mkpath(TZ_SYS_DB, ".pkgmgr_parser.db");
178 snprintf(buf, sizeof(buf), "user/%d/.pkgmgr_parser.db", uid);
179 path = tzplatform_mkpath(TZ_SYS_DB, buf);
185 static const char *__get_cert_db_path(void)
187 return tzplatform_mkpath(TZ_SYS_DB, ".pkgmgr_cert.db");
190 #define DB_VERSION_PATH SYSCONFDIR "/package-manager/pkg_db_version.txt"
191 static int __set_db_version(sqlite3 *db)
195 char version[PKG_STRING_LEN_MAX] = { 0 };
198 fp = fopen(DB_VERSION_PATH, "r");
199 retvm_if(fp == NULL, -1, "Failed to open db version file");
200 if (fgets(version, sizeof(version), fp) == NULL) {
201 _LOGE("Failed to get version information");
207 query = sqlite3_mprintf("PRAGMA user_version=%Q", version);
209 _LOGE("Out of memory");
213 ret = sqlite3_exec(db, query, NULL, NULL, NULL);
214 if (ret != SQLITE_OK) {
215 _LOGE("exec failed: %s", sqlite3_errmsg(db));
224 /* TODO: Do not labeling directly */
225 #define DB_LABEL "User::Home"
226 #define SET_SMACK_LABEL(x) \
228 if (smack_setlabel((x), DB_LABEL, SMACK_LABEL_ACCESS)) \
229 _LOGE("failed chsmack -a %s %s", DB_LABEL, x); \
231 _LOGD("chsmack -a %s %s", DB_LABEL, x); \
234 static int __set_db_permission(const char *path, uid_t uid)
237 const char *files[2];
238 char journal_file[BUFSIZE];
242 struct passwd *result;
247 if (getuid() != OWNER_ROOT)
250 if (uid == OWNER_ROOT || uid == GLOBAL_USER) {
251 ret = getpwnam_r(APPFW_USER, &pwd, buf, sizeof(buf), &result);
252 if (result == NULL) {
254 _LOGE("no such user: %d", uid);
256 _LOGE("getpwuid_r failed: %d", errno);
262 snprintf(journal_file, sizeof(journal_file), "%s-journal", path);
264 files[1] = journal_file;
266 ret = getpwuid_r(uid, &pwd, buf, sizeof(buf), &result);
267 if (result == NULL) {
269 _LOGE("no such user: %d", uid);
271 _LOGE("getpwuid_r failed: %d", errno);
275 for (i = 0; i < 2; i++) {
276 fd = open(files[i], O_RDONLY);
278 _LOGE("open %s failed: %d", files[i], errno);
281 ret = fstat(fd, &sb);
283 _LOGE("stat %s failed: %d", files[i], errno);
287 if (S_ISLNK(sb.st_mode)) {
288 _LOGE("%s is symlink!", files[i]);
292 ret = fchown(fd, uid, pwd.pw_gid);
294 _LOGE("fchown %s failed: %d", files[i], errno);
299 mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH;
300 if (!strcmp(path, __get_cert_db_path()))
302 ret = fchmod(fd, mode);
304 _LOGD("fchmod %s failed: %d", files[i], errno);
309 SET_SMACK_LABEL(files[i]);
315 static const char *parser_init_queries[] = {
316 QUERY_CREATE_TABLE_PACKAGE_INFO,
317 QUERY_CREATE_TABLE_PACKAGE_LOCALIZED_INFO,
318 QUERY_CREATE_TABLE_PACKAGE_PRIVILEGE_INFO,
319 QUERY_CREATE_TABLE_PACKAGE_APPDEFINED_PRIVILEGE_INFO,
320 QUERY_CREATE_TABLE_PACKAGE_UPDATE_INFO,
321 QUERY_CREATE_TABLE_PACKAGE_APP_INFO,
322 QUERY_CREATE_TABLE_PACKAGE_APP_LOCALIZED_INFO,
323 QUERY_CREATE_TABLE_PACKAGE_APP_APP_CONTROL,
324 QUERY_CREATE_TABLE_PACKAGE_APP_APP_CONTROL_PRIVILEGE,
325 QUERY_CREATE_TABLE_PACKAGE_APP_APP_CATEGORY,
326 QUERY_CREATE_TABLE_PACKAGE_APP_APP_METADATA,
327 QUERY_CREATE_TABLE_PACKAGE_APP_DATA_CONTROL,
328 QUERY_CREATE_TABLE_PACKAGE_APP_DATA_CONTROL_PRIVILEGE,
329 QUERY_CREATE_TABLE_PACKAGE_APP_INFO_FOR_UID,
330 QUERY_CREATE_TRIGGER_UPDATE_PACKAGE_APP_INFO_FOR_UID,
331 QUERY_CREATE_TABLE_PACKAGE_APP_SPLASH_SCREEN,
335 static const char *cert_init_queries[] = {
336 QUERY_CREATE_TABLE_PACKAGE_CERT_INFO,
337 QUERY_CREATE_TABLE_PACKAGE_CERT_INDEX_INFO,
338 QUERY_CREATE_TRIGGER_UPDATE_CERT_INFO,
339 QUERY_CREATE_TRIGGER_UPDATE_CERT_INFO2,
340 QUERY_CREATE_TRIGGER_DELETE_CERT_INFO,
341 QUERY_CREATE_TRIGGER_UPDATE_CERT_INDEX_INFO,
345 static int __initialize_db(sqlite3 *db, const char *dbpath, uid_t uid)
348 const char **queries;
351 if (__set_db_version(db))
354 if (strstr(dbpath, ".pkgmgr_parser.db")) {
355 queries = parser_init_queries;
356 } else if (strstr(dbpath, ".pkgmgr_cert.db")) {
357 queries = cert_init_queries;
359 _LOGE("unexpected dbpath: %s", dbpath);
363 for (i = 0; queries[i] != NULL; i++) {
364 ret = sqlite3_exec(db, queries[i], NULL, NULL, NULL);
365 if (ret != SQLITE_OK) {
366 _LOGE("exec failed: %s", sqlite3_errmsg(db));
371 if (__set_db_permission(dbpath, uid))
372 _LOGE("failed to set db permission");
377 #define RESOURCED_BUS_NAME "org.tizen.resourced"
378 #define RESOURCED_PROC_PATH "/Org/Tizen/ResourceD/Process"
379 #define RESOURCED_PROC_INTERFACE "org.tizen.resourced.process"
380 #define RESOURCED_PROC_METHOD "ProcExclude"
381 static void __send_wakeup_signal_to_resourced(pid_t pid)
383 GError *error = NULL;
384 GDBusConnection *conn;
388 conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
390 _LOGE("Failed to connect to dbus: %s", error->message);
395 proxy = g_dbus_proxy_new_sync(conn,
396 G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
397 NULL, RESOURCED_BUS_NAME,
398 RESOURCED_PROC_PATH, RESOURCED_PROC_INTERFACE,
401 _LOGE("failed to get proxy object: %s", error->message);
403 g_object_unref(conn);
407 reply = g_dbus_proxy_call_sync(proxy, RESOURCED_PROC_METHOD,
408 g_variant_new("(si)", "wakeup", pid),
409 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
411 _LOGE("failed to get reply from resourced");
413 _LOGE("failed to send request: %s", error->message);
417 g_object_unref(proxy);
418 g_object_unref(conn);
421 static void __check_db_lock(const char *dbpath)
430 char cmdline[BUFSIZE];
434 if (stat(dbpath, &sb) == -1) {
435 _LOGE("get db file(%s) status failed: %d", dbpath, errno);
439 fp = fopen("/proc/locks", "r");
441 _LOGE("Failed to open lock info: %d", errno);
445 while (fscanf(fp, "%*s %*s %*s %*s %d %x:%x:%lu %*s %*s",
446 &pid, &maj, &min, &ino) != EOF) {
447 if (maj != major(sb.st_dev) || min != minor(sb.st_dev) ||
448 ino != sb.st_ino || pid == getpid())
451 snprintf(cmdline, sizeof(cmdline), "/proc/%d/cmdline", pid);
452 fp_cmdline = fopen(cmdline, "r");
454 if (fp_cmdline != NULL) {
455 len = fread(name, sizeof(char), sizeof(name) - 1,
458 if (name[len - 1] == '\n')
459 name[len - 1] = '\0';
466 _LOGE("%s (%d) has lock on pkgmgr db(%s)!", name, pid, dbpath);
467 __send_wakeup_signal_to_resourced(pid);
473 #define BUSY_WAITING_USEC (1000000 / 10 / 2) /* 0.05 sec */
474 #define BUSY_WAITING_MAX 40 /* wait for max 2 sec */
475 static int __db_busy_handler(void *data, int count)
477 if (count < (BUSY_WAITING_MAX / 2)) {
478 usleep(BUSY_WAITING_USEC);
480 } else if (count == (BUSY_WAITING_MAX / 2)) {
481 __check_db_lock((const char *)data);
482 usleep(BUSY_WAITING_USEC);
484 } else if (count < BUSY_WAITING_MAX) {
485 usleep(BUSY_WAITING_USEC);
488 /* sqlite3_prepare_v2 will return SQLITE_BUSY */
493 API int pkgmgr_parser_initialize_parser_db(uid_t uid)
499 dbpath = __get_parser_db_path(uid);
500 if (access(dbpath, F_OK) != -1) {
501 _LOGE("Manifest db for user %d is already exists", uid);
502 return PM_PARSER_R_ERROR;
505 ret = sqlite3_open_v2(dbpath, &db,
506 SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
507 if (ret != SQLITE_OK) {
508 _LOGE("open db failed: %d", ret);
509 return PM_PARSER_R_ERROR;
512 ret = sqlite3_busy_handler(db, __db_busy_handler, NULL);
513 if (ret != SQLITE_OK) {
514 _LOGE("failed to register busy handler: %s",
516 sqlite3_close_v2(db);
520 if (__initialize_db(db, dbpath, uid)) {
521 sqlite3_close_v2(db);
522 return PM_PARSER_R_ERROR;
524 sqlite3_close_v2(db);
526 return PM_PARSER_R_OK;
529 API int pkgmgr_parser_initialize_cert_db(void)
535 dbpath = __get_cert_db_path();
536 if (access(dbpath, F_OK) != -1) {
537 _LOGE("Cert db is already exists");
538 return PM_PARSER_R_ERROR;
541 ret = sqlite3_open_v2(dbpath, &db,
542 SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
543 if (ret != SQLITE_OK) {
544 _LOGE("open db failed: %d", ret);
545 return PM_PARSER_R_ERROR;
548 ret = sqlite3_busy_handler(db, __db_busy_handler, NULL);
549 if (ret != SQLITE_OK) {
550 _LOGE("failed to register busy handler: %s",
552 sqlite3_close_v2(db);
556 if (__initialize_db(db, dbpath, GLOBAL_USER)) {
557 sqlite3_close_v2(db);
558 return PM_PARSER_R_ERROR;
560 sqlite3_close_v2(db);
562 return PM_PARSER_R_OK;
565 API int pkgmgr_parser_create_and_initialize_db(uid_t uid)
569 struct passwd *result;
572 ret = getpwnam_r(APPFW_USER, &pwd, buf, sizeof(buf), &result);
573 if (result == NULL) {
575 _LOGE("no such user: %s", APPFW_USER);
577 _LOGE("getpwnam_r failed: %d", errno);
578 return PM_PARSER_R_ERROR;
581 if (getuid() != OWNER_ROOT && getuid() != pwd.pw_uid) {
582 _LOGE("Only root or app_fw user is allowed");
583 return PM_PARSER_R_EINVAL;
586 if (pkgmgr_parser_initialize_parser_db(uid))
587 return PM_PARSER_R_ERROR;
589 if (uid == OWNER_ROOT || uid == GLOBAL_USER)
590 if (pkgmgr_parser_initialize_cert_db())
591 return PM_PARSER_R_ERROR;
593 return PM_PARSER_R_OK;
596 static int __open_db(uid_t uid, const char *path, sqlite3 **db, int flags)
600 /* FIXME: always open with OPEN_CREATE flag for keeping previous
603 if (flags & SQLITE_OPEN_READWRITE)
604 flags = flags | SQLITE_OPEN_CREATE;
606 ret = sqlite3_open_v2(path, db, flags, NULL);
607 if (ret != SQLITE_OK)
610 ret = sqlite3_busy_handler(*db, __db_busy_handler, (void *)path);
611 if (ret != SQLITE_OK) {
612 _LOGE("failed to register busy handler: %s",
613 sqlite3_errmsg(*db));
614 sqlite3_close_v2(*db);
618 if (flags & SQLITE_OPEN_CREATE) {
619 ret = __initialize_db(*db, path, uid);
621 _LOGE("failed to initialize db: %s", path);
622 sqlite3_close_v2(*db);
627 ret = sqlite3_exec(*db, "PRAGMA foreign_keys=ON", NULL, NULL, NULL);
628 if (ret != SQLITE_OK) {
629 _LOGE("failed to enable foreign key support: %s",
630 sqlite3_errmsg(*db));
631 sqlite3_close_v2(*db);
639 static int __convert_background_category(GList *category_list)
645 if (category_list == NULL)
648 for (tmp = category_list; tmp; tmp = tmp->next) {
649 category_data = (char *)tmp->data;
650 if (category_data == NULL)
652 if (!strcmp(category_data, APP_BG_CATEGORY_MEDIA_STR))
653 ret |= APP_BG_CATEGORY_MEDIA_VAL;
654 else if (!strcmp(category_data, APP_BG_CATEGORY_DOWNLOAD_STR))
655 ret |= APP_BG_CATEGORY_DOWNLOAD_VAL;
656 else if (!strcmp(category_data, APP_BG_CATEGORY_BGNETWORK_STR))
657 ret |= APP_BG_CATEGORY_BGNETWORK_VAL;
658 else if (!strcmp(category_data, APP_BG_CATEGORY_LOCATION_STR))
659 ret |= APP_BG_CATEGORY_LOCATION_VAL;
660 else if (!strcmp(category_data, APP_BG_CATEGORY_SENSOR_STR))
661 ret |= APP_BG_CATEGORY_SENSOR_VAL;
662 else if (!strcmp(category_data, APP_BG_CATEGORY_IOTCOMM_STR))
663 ret |= APP_BG_CATEGORY_IOTCOMM_VAL;
664 else if (!strcmp(category_data, APP_BG_CATEGORY_SYSTEM))
665 ret |= APP_BG_CATEGORY_SYSTEM_VAL;
667 _LOGE("Unidentified category [%s]", category_data);
673 #define EFFECTIVE_APPID_KEY "http://tizen.org/metadata/effective-appid"
674 static const char *__find_effective_appid(GList *metadata_list)
679 for (tmp = metadata_list; tmp; tmp = tmp->next) {
680 md = (metadata_x *)tmp->data;
681 if (md == NULL || md->key == NULL)
684 if (strcmp(md->key, EFFECTIVE_APPID_KEY) == 0) {
693 static int __insert_appcontrol_privilege_info(sqlite3 *db, const char *appid,
696 static const char query[] =
697 "INSERT INTO package_app_app_control_privilege (app_id,"
698 " app_control, privilege) VALUES (?, ?, ?)";
702 char app_control[BUFSIZE];
709 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
710 if (ret != SQLITE_OK) {
711 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
715 for (tmp = ac->privileges; tmp; tmp = tmp->next) {
716 privilege = (char *)tmp->data;
717 if (privilege == NULL || !strlen(privilege))
721 snprintf(app_control, sizeof(app_control), "%s|%s|%s",
722 ac->operation ? (strlen(ac->operation) > 0 ?
723 ac->operation : "NULL") : "NULL",
724 ac->uri ? (strlen(ac->uri) > 0 ?
725 ac->uri : "NULL") : "NULL",
726 ac->mime ? (strlen(ac->mime) > 0 ?
727 ac->mime : "NULL") : "NULL");
728 __BIND_TEXT(db, stmt, idx++, appid);
729 __BIND_TEXT(db, stmt, idx++, app_control);
730 __BIND_TEXT(db, stmt, idx++, privilege);
732 ret = sqlite3_step(stmt);
733 if (ret != SQLITE_DONE) {
734 _LOGE("step failed: %s", sqlite3_errmsg(db));
735 sqlite3_finalize(stmt);
742 sqlite3_finalize(stmt);
747 static int __insert_appcontrol_info(sqlite3 *db, application_x *app)
749 static const char query[] =
750 "INSERT INTO package_app_app_control (app_id, app_control,"
756 char app_control[BUFSIZE];
760 if (app->appcontrol == NULL)
763 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
764 if (ret != SQLITE_OK) {
765 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
769 for (tmp = app->appcontrol; tmp; tmp = tmp->next) {
770 ac = (appcontrol_x *)tmp->data;
774 snprintf(app_control, sizeof(app_control), "%s|%s|%s",
775 ac->operation ? (strlen(ac->operation) > 0 ?
776 ac->operation : "NULL") : "NULL",
777 ac->uri ? (strlen(ac->uri) > 0 ?
778 ac->uri : "NULL") : "NULL",
779 ac->mime ? (strlen(ac->mime) > 0 ?
780 ac->mime : "NULL") : "NULL");
781 __BIND_TEXT(db, stmt, idx++, app->appid);
782 __BIND_TEXT(db, stmt, idx++, app_control);
783 __BIND_TEXT(db, stmt, idx++, ac->visibility);
785 ret = sqlite3_step(stmt);
786 if (ret != SQLITE_DONE) {
787 _LOGE("step failed: %s", sqlite3_errmsg(db));
788 sqlite3_finalize(stmt);
792 if (__insert_appcontrol_privilege_info(db, app->appid, ac)) {
793 sqlite3_finalize(stmt);
800 sqlite3_finalize(stmt);
805 static int __insert_category_info(sqlite3 *db, application_x *app)
807 static const char query[] =
808 "INSERT INTO package_app_app_category (app_id, category) "
814 const char *category;
816 if (app->category == NULL)
819 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
820 if (ret != SQLITE_OK) {
821 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
825 for (tmp = app->category; tmp; tmp = tmp->next) {
826 category = (const char *)tmp->data;
827 if (category == NULL)
830 __BIND_TEXT(db, stmt, idx++, app->appid);
831 __BIND_TEXT(db, stmt, idx++, category);
833 ret = sqlite3_step(stmt);
834 if (ret != SQLITE_DONE) {
835 _LOGE("step failed: %s", sqlite3_errmsg(db));
836 sqlite3_finalize(stmt);
843 sqlite3_finalize(stmt);
848 static int __insert_metadata_info(sqlite3 *db, application_x *app)
850 static const char query[] =
851 "INSERT INTO package_app_app_metadata (app_id,"
852 " md_key, md_value) VALUES (?, ?, ?)";
859 if (app->metadata == NULL)
862 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
863 if (ret != SQLITE_OK) {
864 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
868 for (tmp = app->metadata; tmp; tmp = tmp->next) {
869 md = (metadata_x *)tmp->data;
873 __BIND_TEXT(db, stmt, idx++, app->appid);
874 __BIND_TEXT(db, stmt, idx++, md->key);
875 __BIND_TEXT(db, stmt, idx++, md->value);
877 ret = sqlite3_step(stmt);
878 if (ret != SQLITE_DONE) {
879 _LOGE("step failed: %s", sqlite3_errmsg(db));
880 sqlite3_finalize(stmt);
887 sqlite3_finalize(stmt);
892 static int __insert_app_data_control_privilege_info(sqlite3 *db,
893 datacontrol_x *datacontrol)
895 static const char query[] =
896 "INSERT INTO package_app_data_control_privilege (providerid,"
897 " privilege, type) VALUES (?, ?, ?)";
905 if (datacontrol == NULL)
908 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
909 if (ret != SQLITE_OK) {
910 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
914 for (privileges = datacontrol->privileges; privileges;
915 privileges = privileges->next) {
916 priv = (char *)privileges->data;
921 __BIND_TEXT(db, stmt, idx++, datacontrol->providerid);
922 __BIND_TEXT(db, stmt, idx++, priv);
923 __BIND_TEXT(db, stmt, idx++, datacontrol->type);
925 ret = sqlite3_step(stmt);
926 if (ret != SQLITE_DONE) {
927 _LOGE("step failed: %s", sqlite3_errmsg(db));
928 sqlite3_finalize(stmt);
935 sqlite3_finalize(stmt);
939 static int __insert_datacontrol_info(sqlite3 *db, application_x *app)
941 static const char query[] =
942 "INSERT INTO package_app_data_control (app_id, providerid,"
943 " access, type, trusted) VALUES (?, ?, ?, ?, ?)";
950 if (app->datacontrol == NULL)
953 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
954 if (ret != SQLITE_OK) {
955 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
959 for (tmp = app->datacontrol; tmp; tmp = tmp->next) {
960 dc = (datacontrol_x *)tmp->data;
964 __BIND_TEXT(db, stmt, idx++, app->appid);
965 __BIND_TEXT(db, stmt, idx++, dc->providerid);
966 __BIND_TEXT(db, stmt, idx++, dc->access);
967 __BIND_TEXT(db, stmt, idx++, dc->type);
968 __BIND_TEXT(db, stmt, idx++, dc->trusted);
970 ret = sqlite3_step(stmt);
971 if (ret != SQLITE_DONE) {
972 _LOGE("step failed: %s", sqlite3_errmsg(db));
973 sqlite3_finalize(stmt);
977 if (dc->privileges &&
978 __insert_app_data_control_privilege_info(db, dc)) {
979 sqlite3_finalize(stmt);
986 sqlite3_finalize(stmt);
991 /* TODO: move to installer */
992 static int __check_dpi(const char *dpi_char, int dpi_int)
994 if (dpi_char == NULL)
997 if (strcasecmp(dpi_char, LDPI) == 0) {
998 if (dpi_int >= LDPI_MIN && dpi_int <= LDPI_MAX)
1002 } else if (strcasecmp(dpi_char, MDPI) == 0) {
1003 if (dpi_int >= MDPI_MIN && dpi_int <= MDPI_MAX)
1007 } else if (strcasecmp(dpi_char, HDPI) == 0) {
1008 if (dpi_int >= HDPI_MIN && dpi_int <= HDPI_MAX)
1012 } else if (strcasecmp(dpi_char, XHDPI) == 0) {
1013 if (dpi_int >= XHDPI_MIN && dpi_int <= XHDPI_MAX)
1017 } else if (strcasecmp(dpi_char, XXHDPI) == 0) {
1018 if (dpi_int >= XXHDPI_MIN && dpi_int <= XXHDPI_MAX)
1026 static gint __compare_splashscreen_with_orientation_dpi(gconstpointer a,
1029 splashscreen_x *ss = (splashscreen_x *)a;
1030 const char *orientation = (const char *)b;
1034 if (ss->operation || ss->dpi == NULL)
1037 ret = system_info_get_platform_int(
1038 "http://tizen.org/feature/screen.dpi", &dpi);
1039 if (ret != SYSTEM_INFO_ERROR_NONE)
1042 if (strcasecmp(ss->orientation, orientation) == 0 &&
1043 __check_dpi(ss->dpi, dpi) == 0)
1049 static gint __compare_splashscreen_with_orientation(gconstpointer a,
1052 splashscreen_x *ss = (splashscreen_x *)a;
1053 const char *orientation = (const char *)b;
1055 if (ss->operation || ss->dpi)
1058 if (strcasecmp(ss->orientation, orientation) == 0)
1064 static splashscreen_x *__find_default_splashscreen(GList *splashscreens,
1065 const char *orientation)
1069 tmp = g_list_find_custom(splashscreens, orientation,
1071 __compare_splashscreen_with_orientation_dpi);
1073 return (splashscreen_x *)tmp->data;
1075 tmp = g_list_find_custom(splashscreens, orientation,
1076 (GCompareFunc)__compare_splashscreen_with_orientation);
1078 return (splashscreen_x *)tmp->data;
1083 static void __find_appcontrol_splashscreen_with_dpi(gpointer data,
1086 splashscreen_x *ss = (splashscreen_x *)data;
1087 GList **list = (GList **)user_data;
1091 if (ss->operation == NULL || ss->dpi == NULL)
1094 ret = system_info_get_platform_int(
1095 "http://tizen.org/feature/screen.dpi", &dpi);
1096 if (ret != SYSTEM_INFO_ERROR_NONE)
1099 if (__check_dpi(ss->dpi, dpi) != 0)
1102 *list = g_list_append(*list, ss);
1105 static void __find_appcontrol_splashscreen(gpointer data, gpointer user_data)
1107 splashscreen_x *ss = (splashscreen_x *)data;
1108 GList **list = (GList **)user_data;
1109 splashscreen_x *ss_tmp;
1112 if (ss->operation == NULL || ss->dpi)
1115 for (tmp = *list; tmp; tmp = tmp->next) {
1116 ss_tmp = (splashscreen_x *)tmp->data;
1117 if (ss_tmp->operation
1118 && strcmp(ss_tmp->operation, ss->operation) == 0
1119 && strcmp(ss_tmp->orientation, ss->orientation) == 0)
1123 *list = g_list_append(*list, ss);
1126 static GList *__find_splashscreens(GList *splashscreens)
1131 if (splashscreens == NULL)
1134 g_list_foreach(splashscreens,
1135 __find_appcontrol_splashscreen_with_dpi, &list);
1136 g_list_foreach(splashscreens,
1137 __find_appcontrol_splashscreen, &list);
1139 ss = __find_default_splashscreen(splashscreens, "portrait");
1141 list = g_list_append(list, ss);
1142 ss = __find_default_splashscreen(splashscreens, "landscape");
1144 list = g_list_append(list, ss);
1149 static int __insert_splashscreen_info(sqlite3 *db, application_x *app,
1152 static const char query[] =
1153 "INSERT INTO package_app_splash_screen (app_id, src, type,"
1154 " orientation, indicatordisplay, operation, color_depth) "
1155 "VALUES (?, ?, ?, ?, ?, ?, ?)";
1162 if (app->splashscreens == NULL)
1165 if (ss_list == NULL)
1168 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1169 if (ret != SQLITE_OK) {
1170 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1174 for (tmp = ss_list; tmp; tmp = tmp->next) {
1175 ss = (splashscreen_x *)tmp->data;
1179 __BIND_TEXT(db, stmt, idx++, app->appid);
1180 __BIND_TEXT(db, stmt, idx++, ss->src);
1181 __BIND_TEXT(db, stmt, idx++, ss->type);
1182 __BIND_TEXT(db, stmt, idx++, ss->orientation);
1183 __BIND_TEXT(db, stmt, idx++, ss->indicatordisplay);
1184 __BIND_TEXT(db, stmt, idx++, ss->operation);
1185 __BIND_TEXT(db, stmt, idx++, ss->color_depth);
1187 ret = sqlite3_step(stmt);
1188 if (ret != SQLITE_DONE) {
1189 _LOGE("step failed: %s", sqlite3_errmsg(db));
1190 sqlite3_finalize(stmt);
1194 sqlite3_reset(stmt);
1197 sqlite3_finalize(stmt);
1202 static void __trimfunc(GList *trim_list)
1206 GList *list = g_list_first(trim_list);
1209 trim_data = (char *)list->data;
1212 if (strcmp(trim_data, prev) == 0) {
1213 trim_list = g_list_remove(trim_list,
1215 list = g_list_first(trim_list);
1224 list = g_list_next(list);
1228 static gint __comparefunc(gconstpointer a, gconstpointer b, gpointer userdata)
1230 if (a == NULL || b == NULL)
1232 if (strcmp((char *)a, (char *)b) == 0)
1234 if (strcmp((char *)a, (char *)b) < 0)
1236 if (strcmp((char *)a, (char *)b) > 0)
1241 /* TODO: refactor inserting localized info */
1242 static GList *__create_locale_list(GList *lbls, GList *lcns, GList *icns,
1243 GList *dcns, GList *aths)
1245 GList *locale = NULL;
1253 for (tmp = lbls; tmp; tmp = tmp->next) {
1254 lbl = (label_x *)tmp->data;
1258 locale = g_list_insert_sorted_with_data(
1259 locale, (gpointer)lbl->lang,
1260 __comparefunc, NULL);
1262 for (tmp = lcns; tmp; tmp = tmp->next) {
1263 lcn = (license_x *)tmp->data;
1267 locale = g_list_insert_sorted_with_data(
1268 locale, (gpointer)lcn->lang,
1269 __comparefunc, NULL);
1271 for (tmp = icns; tmp; tmp = tmp->next) {
1272 icn = (icon_x *)tmp->data;
1276 locale = g_list_insert_sorted_with_data(
1277 locale, (gpointer)icn->lang,
1278 __comparefunc, NULL);
1280 for (tmp = dcns; tmp; tmp = tmp->next) {
1281 dcn = (description_x *)tmp->data;
1285 locale = g_list_insert_sorted_with_data(
1286 locale, (gpointer)dcn->lang,
1287 __comparefunc, NULL);
1289 for (tmp = aths; tmp; tmp = tmp->next) {
1290 ath = (author_x *)tmp->data;
1294 locale = g_list_insert_sorted_with_data(
1295 locale, (gpointer)ath->lang,
1296 __comparefunc, NULL);
1302 static gint __check_icon_resolution(const char *orig_icon_path,
1303 char **new_icon_path)
1307 char *icon_filename;
1308 char modified_iconpath[BUFSIZE];
1309 char icon_path[BUFSIZE];
1313 if (orig_icon_path == NULL)
1316 ret = system_info_get_platform_int(
1317 "http://tizen.org/feature/screen.dpi", &dpi);
1318 if (ret != SYSTEM_INFO_ERROR_NONE)
1321 if (dpi >= LDPI_MIN && dpi <= LDPI_MAX) {
1322 dpi_path[0] = "LDPI";
1323 dpi_path[1] = "ldpi";
1324 } else if (dpi >= MDPI_MIN && dpi <= MDPI_MAX) {
1325 dpi_path[0] = "MDPI";
1326 dpi_path[1] = "mdpi";
1327 } else if (dpi >= HDPI_MIN && dpi <= HDPI_MAX) {
1328 dpi_path[0] = "HDPI";
1329 dpi_path[1] = "hdpi";
1330 } else if (dpi >= XHDPI_MIN && dpi <= XHDPI_MAX) {
1331 dpi_path[0] = "XHDPI";
1332 dpi_path[1] = "xhdpi";
1333 } else if (dpi >= XXHDPI_MIN && dpi <= XXHDPI_MAX) {
1334 dpi_path[0] = "XXHDPI";
1335 dpi_path[1] = "xxhdpi";
1337 _LOGE("Unidentified dpi[%d]", dpi);
1341 icon_filename = strrchr(orig_icon_path, '/');
1342 if (icon_filename == NULL)
1346 strlen(orig_icon_path) - (strlen(icon_filename) - 1),
1347 "%s", orig_icon_path);
1348 for (i = 0; i < 2; i++) {
1349 snprintf(modified_iconpath, BUFSIZE - 1, "%s/%s%s",
1350 icon_path, dpi_path[i], icon_filename);
1351 if (access(modified_iconpath, F_OK) != -1) {
1352 /* if exists, return modified icon path */
1353 *new_icon_path = strdup(modified_iconpath);
1361 static gint __compare_icon(gconstpointer a, gconstpointer b)
1363 icon_x *icon = (icon_x *)a;
1366 if (icon->lang != NULL && strcasecmp(icon->lang, DEFAULT_LOCALE) != 0)
1369 if (icon->dpi != NULL)
1372 if (__check_icon_resolution(icon->text, &icon_path) == 0) {
1374 icon->text = icon_path;
1380 static gint __compare_icon_with_dpi(gconstpointer a, gconstpointer b)
1382 icon_x *icon = (icon_x *)a;
1383 int dpi = GPOINTER_TO_INT(b);
1385 if (icon->lang != NULL && strcasecmp(icon->lang, DEFAULT_LOCALE) != 0)
1388 if (icon->dpi == NULL)
1391 if (__check_dpi(icon->dpi, dpi) == 0)
1397 static gint __compare_icon_with_lang(gconstpointer a, gconstpointer b)
1399 icon_x *icon = (icon_x *)a;
1400 char *lang = (char *)b;
1403 if (icon->dpi != NULL)
1406 if (strcasecmp(icon->lang, lang) == 0) {
1407 if (strcasecmp(icon->lang, DEFAULT_LOCALE) == 0) {
1408 /* icon for no locale. check existance of
1409 * folder-hierachied default icons
1411 if (__check_icon_resolution(icon->text,
1414 icon->text = icon_path;
1423 static gint __compare_icon_with_lang_dpi(gconstpointer a, gconstpointer b)
1426 icon_x *icon = (icon_x *)a;
1427 char *lang = (char *)b;
1430 ret = system_info_get_platform_int(
1431 "http://tizen.org/feature/screen.dpi", &dpi);
1432 if (ret != SYSTEM_INFO_ERROR_NONE)
1435 if (strcasecmp(icon->lang, lang) == 0 &&
1436 __check_dpi(icon->dpi, dpi) == 0)
1442 static char *__find_icon(GList *icons, const char *lang)
1449 /* first, find icon whose locale and dpi with given lang and
1450 * system's dpi has matched
1452 tmp = g_list_find_custom(icons, lang,
1453 (GCompareFunc)__compare_icon_with_lang_dpi);
1455 icon = (icon_x *)tmp->data;
1456 return (char *)icon->text;
1459 /* if first has failed, find icon whose locale has matched */
1460 tmp = g_list_find_custom(icons, lang,
1461 (GCompareFunc)__compare_icon_with_lang);
1463 icon = (icon_x *)tmp->data;
1464 return (char *)icon->text;
1467 /* if second has failed, find icon whose dpi has matched with
1470 ret = system_info_get_platform_int(
1471 "http://tizen.org/feature/screen.dpi", &dpi);
1472 if (ret == SYSTEM_INFO_ERROR_NONE) {
1473 tmp = g_list_find_custom(icons, GINT_TO_POINTER(dpi),
1474 (GCompareFunc)__compare_icon_with_dpi);
1476 icon = (icon_x *)tmp->data;
1477 return (char *)icon->text;
1481 /* last, find default icon marked as "No Locale" */
1482 tmp = g_list_find_custom(icons, NULL, (GCompareFunc)__compare_icon);
1484 icon = (icon_x *)tmp->data;
1485 return (char *)icon->text;
1491 static void __extract_data(const char *locale, GList *lbls, GList *lcns,
1492 GList *icns, GList *dcns, GList *aths, char **label,
1493 char **license, char **icon, char **description, char **author)
1501 for (tmp = lbls; tmp; tmp = tmp->next) {
1502 lbl = (label_x *)tmp->data;
1506 if (strcmp(lbl->lang, locale) == 0) {
1507 *label = (char *)lbl->text;
1512 for (tmp = lcns; tmp; tmp = tmp->next) {
1513 lcn = (license_x *)tmp->data;
1517 if (strcmp(lcn->lang, locale) == 0) {
1518 *license = (char *)lcn->text;
1524 *icon = __find_icon(icns, locale);
1526 for (tmp = dcns; tmp; tmp = tmp->next) {
1527 dcn = (description_x *)tmp->data;
1531 if (strcmp(dcn->lang, locale) == 0) {
1532 *description = (char *)dcn->text;
1537 for (tmp = aths; tmp; tmp = tmp->next) {
1538 ath = (author_x *)tmp->data;
1542 if (strcmp(ath->lang, locale) == 0) {
1543 *author = (char *)ath->text;
1550 static int __insert_mainapp_localized_info(sqlite3 *db, application_x *app,
1551 const char *locale, const char *label, const char *icon)
1553 static const char query[] =
1554 "INSERT OR REPLACE INTO package_localized_info ("
1555 " package, package_locale, package_label, package_icon,"
1556 " package_description, package_license, package_author) "
1558 " COALESCE((SELECT package_label FROM package_localized_info"
1559 " WHERE package=? AND package_locale=?), ?),"
1560 " COALESCE((SELECT package_icon FROM package_localized_info"
1561 " WHERE package=? AND package_icon=?), ?),"
1562 " (SELECT package_description FROM package_localized_info"
1563 " WHERE package=? AND package_locale=?),"
1564 " (SELECT package_description FROM package_localized_info"
1565 " WHERE package=? AND package_locale=?),"
1566 " (SELECT package_description FROM package_localized_info"
1567 " WHERE package=? AND package_locale=?))";
1572 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1573 if (ret != SQLITE_OK) {
1574 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1578 __BIND_TEXT(db, stmt, idx++, app->package);
1579 __BIND_TEXT(db, stmt, idx++, locale);
1580 __BIND_TEXT(db, stmt, idx++, app->package);
1581 __BIND_TEXT(db, stmt, idx++, locale);
1582 __BIND_TEXT(db, stmt, idx++, label);
1583 __BIND_TEXT(db, stmt, idx++, app->package);
1584 __BIND_TEXT(db, stmt, idx++, locale);
1585 __BIND_TEXT(db, stmt, idx++, icon);
1586 __BIND_TEXT(db, stmt, idx++, app->package);
1587 __BIND_TEXT(db, stmt, idx++, locale);
1588 __BIND_TEXT(db, stmt, idx++, app->package);
1589 __BIND_TEXT(db, stmt, idx++, locale);
1590 __BIND_TEXT(db, stmt, idx++, app->package);
1591 __BIND_TEXT(db, stmt, idx++, locale);
1593 ret = sqlite3_step(stmt);
1594 if (ret != SQLITE_DONE) {
1595 _LOGE("step failed: %s", sqlite3_errmsg(db));
1596 sqlite3_finalize(stmt);
1600 sqlite3_finalize(stmt);
1605 static int __insert_app_localized_info(sqlite3 *db, application_x *app)
1607 static const char query[] =
1608 "INSERT INTO package_app_localized_info (app_id, app_locale,"
1609 " app_label, app_icon) "
1610 "VALUES (?, ?, ?, ?)";
1620 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1621 if (ret != SQLITE_OK) {
1622 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1626 locales = __create_locale_list(app->label, NULL, app->icon, NULL, NULL);
1627 for (tmp = locales; tmp; tmp = tmp->next) {
1628 locale = (const char *)tmp->data;
1631 __extract_data(locale, app->label, NULL, app->icon, NULL, NULL,
1632 &label, NULL, &icon, NULL, NULL);
1633 if (!label && !icon)
1637 __BIND_TEXT(db, stmt, idx++, app->appid);
1638 __BIND_TEXT(db, stmt, idx++, locale);
1639 __BIND_TEXT(db, stmt, idx++, label);
1640 __BIND_TEXT(db, stmt, idx++, icon);
1642 ret = sqlite3_step(stmt);
1643 if (ret != SQLITE_DONE) {
1644 _LOGE("step failed: %s", sqlite3_errmsg(db));
1645 g_list_free(locales);
1646 sqlite3_finalize(stmt);
1650 sqlite3_reset(stmt);
1652 if (strcasecmp(app->mainapp, "true") == 0) {
1653 if (__insert_mainapp_localized_info(db, app, locale,
1655 _LOGE("insert mainapp localized info failed");
1659 g_list_free(locales);
1660 sqlite3_finalize(stmt);
1665 static int __insert_package_privilege_info(sqlite3 *db, manifest_x *mfx)
1667 static const char query[] =
1668 "INSERT INTO package_privilege_info (package, privilege, type) "
1676 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1677 if (ret != SQLITE_OK) {
1678 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1682 for (tmp = mfx->privileges; tmp; tmp = tmp->next) {
1683 priv = (privilege_x *)tmp->data;
1688 __BIND_TEXT(db, stmt, idx++, mfx->package);
1689 __BIND_TEXT(db, stmt, idx++, priv->value);
1690 __BIND_TEXT(db, stmt, idx++, priv->type);
1692 ret = sqlite3_step(stmt);
1693 if (ret != SQLITE_DONE) {
1694 _LOGE("step failed: %s", sqlite3_errmsg(db));
1695 sqlite3_finalize(stmt);
1698 sqlite3_reset(stmt);
1701 sqlite3_finalize(stmt);
1706 static int __insert_package_appdefined_privilege_info(sqlite3 *db,
1709 static const char query[] =
1710 "INSERT INTO package_appdefined_privilege_info "
1711 "(package, privilege, license, type) "
1712 "VALUES (?, ?, ?, ?)";
1717 appdefined_privilege_x *priv;
1719 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1720 if (ret != SQLITE_OK) {
1721 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1725 for (tmp = mfx->appdefined_privileges; tmp; tmp = tmp->next) {
1726 priv = (appdefined_privilege_x *)tmp->data;
1731 __BIND_TEXT(db, stmt, idx++, mfx->package);
1732 __BIND_TEXT(db, stmt, idx++, priv->value);
1733 __BIND_TEXT(db, stmt, idx++, priv->license);
1734 __BIND_TEXT(db, stmt, idx++, priv->type);
1736 ret = sqlite3_step(stmt);
1737 if (ret != SQLITE_DONE) {
1738 _LOGE("step failed: %s", sqlite3_errmsg(db));
1739 sqlite3_finalize(stmt);
1742 sqlite3_reset(stmt);
1745 sqlite3_finalize(stmt);
1750 /* _PRODUCT_LAUNCHING_ENHANCED_
1751 * app->indicatordisplay, app->portraitimg, app->landscapeimg,
1752 * app->guestmode_appstatus
1754 static int __insert_application_info(sqlite3 *db, manifest_x *mfx)
1756 static const char query[] =
1757 "INSERT INTO package_app_info (app_id, app_component,"
1758 " app_exec, app_nodisplay, app_type, app_onboot, app_multiple,"
1759 " app_autorestart, app_taskmanage, app_hwacceleration,"
1760 " app_screenreader, app_mainapp, app_recentimage,"
1761 " app_launchcondition, app_indicatordisplay, app_portraitimg,"
1762 " app_landscapeimg, app_guestmodevisibility,"
1763 " app_permissiontype, app_preload, app_submode,"
1764 " app_submode_mainid, app_installed_storage, app_process_pool,"
1765 " app_launch_mode, app_ui_gadget, app_support_mode,"
1766 " app_support_disable, component_type, package, app_tep_name,"
1767 " app_zip_mount_file, app_background_category,"
1768 " app_package_type, app_root_path, app_api_version,"
1769 " app_effective_appid, app_splash_screen_display,"
1770 " app_package_system, app_removable,"
1771 " app_package_installed_time, app_support_ambient,"
1772 " app_external_path, app_setup_appid) "
1774 " ?, LOWER(?), ?, LOWER(?), LOWER(?),"
1775 " LOWER(?), LOWER(?), ?,"
1779 " ?, LOWER(?), LOWER(?),"
1781 " COALESCE(?, 'single'), LOWER(?), ?,"
1782 " LOWER(?), ?, ?, ?,"
1786 " LOWER(?), LOWER(?),"
1795 const char *effective_appid;
1798 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1799 if (ret != SQLITE_OK) {
1800 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1804 for (tmp = mfx->application; tmp; tmp = tmp->next) {
1805 app = (application_x *)tmp->data;
1809 bg_category = __convert_background_category(
1810 app->background_category);
1811 effective_appid = __find_effective_appid(app->metadata);
1814 __BIND_TEXT(db, stmt, idx++, app->appid);
1815 __BIND_TEXT(db, stmt, idx++, app->component_type);
1816 __BIND_TEXT(db, stmt, idx++, app->exec);
1817 __BIND_TEXT(db, stmt, idx++, __get_bool(app->nodisplay, false));
1818 __BIND_TEXT(db, stmt, idx++, app->type);
1819 __BIND_TEXT(db, stmt, idx++, __get_bool(app->onboot, false));
1820 __BIND_TEXT(db, stmt, idx++, __get_bool(app->multiple, false));
1821 __BIND_TEXT(db, stmt, idx++,
1822 __get_bool(app->autorestart, false));
1823 __BIND_TEXT(db, stmt, idx++,
1824 __get_bool(app->taskmanage, false));
1825 __BIND_TEXT(db, stmt, idx++, app->hwacceleration);
1826 __BIND_TEXT(db, stmt, idx++, app->screenreader);
1827 __BIND_TEXT(db, stmt, idx++, __get_bool(app->mainapp, false));
1828 __BIND_TEXT(db, stmt, idx++, app->recentimage);
1829 __BIND_TEXT(db, stmt, idx++, app->launchcondition);
1830 __BIND_TEXT(db, stmt, idx++,
1831 __get_bool(app->indicatordisplay, true));
1832 __BIND_TEXT(db, stmt, idx++, app->portraitimg);
1833 __BIND_TEXT(db, stmt, idx++, app->landscapeimg);
1834 __BIND_TEXT(db, stmt, idx++,
1835 __get_bool(app->guestmode_visibility, true));
1836 __BIND_TEXT(db, stmt, idx++, app->permission_type);
1837 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->preload, false));
1838 __BIND_TEXT(db, stmt, idx++, __get_bool(app->submode, false));
1839 __BIND_TEXT(db, stmt, idx++, app->submode_mainid);
1840 __BIND_TEXT(db, stmt, idx++, mfx->installed_storage);
1841 __BIND_TEXT(db, stmt, idx++,
1842 __get_bool(app->process_pool, false));
1843 __BIND_TEXT(db, stmt, idx++, app->launch_mode);
1844 __BIND_TEXT(db, stmt, idx++, __get_bool(app->ui_gadget, false));
1845 __BIND_TEXT(db, stmt, idx++, app->support_mode);
1846 __BIND_TEXT(db, stmt, idx++,
1847 __get_bool(mfx->support_disable, false));
1848 __BIND_TEXT(db, stmt, idx++, app->component_type);
1849 __BIND_TEXT(db, stmt, idx++, mfx->package);
1850 __BIND_TEXT(db, stmt, idx++, mfx->tep_name);
1851 __BIND_TEXT(db, stmt, idx++, mfx->zip_mount_file);
1852 __BIND_INT(db, stmt, idx++, bg_category);
1853 __BIND_TEXT(db, stmt, idx++, mfx->type ? mfx->type : "tpk");
1854 __BIND_TEXT(db, stmt, idx++, mfx->root_path);
1855 __BIND_TEXT(db, stmt, idx++, mfx->api_version);
1856 __BIND_TEXT(db, stmt, idx++, effective_appid);
1857 __BIND_TEXT(db, stmt, idx++,
1858 __get_bool(app->splash_screen_display, true));
1859 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->system, false));
1860 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->removable, false));
1861 __BIND_TEXT(db, stmt, idx++, mfx->installed_time);
1862 __BIND_TEXT(db, stmt, idx++,
1863 __get_bool(app->support_ambient, false));
1864 __BIND_TEXT(db, stmt, idx++, mfx->external_path);
1865 __BIND_TEXT(db, stmt, idx++, app->setup_appid);
1867 ret = sqlite3_step(stmt);
1868 if (ret != SQLITE_DONE) {
1869 _LOGE("step failed: %s", sqlite3_errmsg(db));
1870 sqlite3_finalize(stmt);
1874 sqlite3_reset(stmt);
1876 if (__insert_appcontrol_info(db, app)) {
1877 sqlite3_finalize(stmt);
1880 if (__insert_category_info(db, app)) {
1881 sqlite3_finalize(stmt);
1884 if (__insert_metadata_info(db, app)) {
1885 sqlite3_finalize(stmt);
1888 if (__insert_datacontrol_info(db, app)) {
1889 sqlite3_finalize(stmt);
1892 ss_list = __find_splashscreens(app->splashscreens);
1893 if (__insert_splashscreen_info(db, app, ss_list)) {
1894 g_list_free(ss_list);
1895 sqlite3_finalize(stmt);
1898 g_list_free(ss_list);
1899 if (__insert_app_localized_info(db, app)) {
1900 sqlite3_finalize(stmt);
1905 sqlite3_finalize(stmt);
1910 static int __insert_package_update_info(sqlite3 *db, manifest_x *mfx)
1912 static const char query[] =
1913 "INSERT INTO package_update_info (package, update_version) "
1919 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1920 if (ret != SQLITE_OK) {
1921 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1926 __BIND_TEXT(db, stmt, idx++, mfx->package);
1927 __BIND_TEXT(db, stmt, idx, mfx->version);
1928 ret = sqlite3_step(stmt);
1929 if (ret != SQLITE_DONE) {
1930 _LOGE("step failed: %s", sqlite3_errmsg(db));
1931 sqlite3_finalize(stmt);
1934 sqlite3_finalize(stmt);
1939 static int __insert_package_localized_info(sqlite3 *db, manifest_x *mfx)
1941 static const char query[] =
1942 "INSERT INTO package_localized_info (package, package_locale,"
1943 " package_label, package_icon, package_description,"
1944 " package_license, package_author) "
1945 "VALUES (?, ?, ?, ?, ?, ?, ?)";
1958 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1959 if (ret != SQLITE_OK) {
1960 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1964 locales = __create_locale_list(mfx->label, mfx->license, mfx->icon,
1965 mfx->description, mfx->author);
1966 for (tmp = locales; tmp; tmp = tmp->next) {
1967 locale = (const char *)tmp->data;
1973 __extract_data(locale, mfx->label, mfx->license, mfx->icon,
1974 mfx->description, mfx->author,
1975 &label, &license, &icon, &description, &author);
1976 if (!label && !license && !icon && !description && !author)
1980 __BIND_TEXT(db, stmt, idx++, mfx->package);
1981 __BIND_TEXT(db, stmt, idx++, locale);
1982 __BIND_TEXT(db, stmt, idx++, label);
1983 __BIND_TEXT(db, stmt, idx++, icon);
1984 __BIND_TEXT(db, stmt, idx++, description);
1985 __BIND_TEXT(db, stmt, idx++, license);
1986 __BIND_TEXT(db, stmt, idx++, author);
1988 ret = sqlite3_step(stmt);
1989 if (ret != SQLITE_DONE) {
1990 _LOGE("step failed: %s", sqlite3_errmsg(db));
1991 g_list_free(locales);
1992 sqlite3_finalize(stmt);
1996 sqlite3_reset(stmt);
1999 g_list_free(locales);
2000 sqlite3_finalize(stmt);
2005 static int __insert_package_info(sqlite3 *db, manifest_x *mfx)
2007 static const char query[] =
2008 "INSERT INTO package_info (package, package_type,"
2009 " package_version, package_api_version, package_tep_name,"
2010 " package_zip_mount_file, install_location, package_size,"
2011 " package_removable, package_preload, package_readonly,"
2012 " package_update, package_appsetting, package_nodisplay,"
2013 " package_system, author_name, author_email, author_href,"
2014 " installed_time, installed_storage, storeclient_id,"
2015 " mainapp_id, package_url, root_path, external_path,"
2016 " csc_path, package_support_mode, package_support_disable) "
2020 " LOWER(?), LOWER(?), LOWER(?),"
2021 " LOWER(?), LOWER(?), LOWER(?),"
2022 " LOWER(?), ?, ?, ?,"
2029 const char *author_name = NULL;
2030 const char *author_email = NULL;
2031 const char *author_href = NULL;
2033 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2034 if (ret != SQLITE_OK) {
2035 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2039 if (mfx->author && mfx->author->data) {
2040 author_name = ((author_x *)mfx->author->data)->text;
2041 author_email = ((author_x *)mfx->author->data)->email;
2042 author_href = ((author_x *)mfx->author->data)->href;
2045 __BIND_TEXT(db, stmt, idx++, mfx->package);
2046 __BIND_TEXT(db, stmt, idx++, mfx->type);
2047 __BIND_TEXT(db, stmt, idx++, mfx->version);
2048 __BIND_TEXT(db, stmt, idx++, mfx->api_version);
2049 __BIND_TEXT(db, stmt, idx++, mfx->tep_name);
2050 __BIND_TEXT(db, stmt, idx++, mfx->zip_mount_file);
2051 __BIND_TEXT(db, stmt, idx++, mfx->installlocation);
2052 __BIND_TEXT(db, stmt, idx++, mfx->package_size);
2053 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->removable, true));
2054 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->preload, false));
2055 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->readonly, false));
2056 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->update, false));
2057 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->appsetting, false));
2058 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->nodisplay_setting, false));
2059 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->system, false));
2060 __BIND_TEXT(db, stmt, idx++, author_name);
2061 __BIND_TEXT(db, stmt, idx++, author_email);
2062 __BIND_TEXT(db, stmt, idx++, author_href);
2063 __BIND_TEXT(db, stmt, idx++, mfx->installed_time);
2064 __BIND_TEXT(db, stmt, idx++, mfx->installed_storage);
2065 __BIND_TEXT(db, stmt, idx++, mfx->storeclient_id);
2066 __BIND_TEXT(db, stmt, idx++, mfx->mainapp_id);
2067 __BIND_TEXT(db, stmt, idx++, mfx->package_url);
2068 __BIND_TEXT(db, stmt, idx++, mfx->root_path);
2069 __BIND_TEXT(db, stmt, idx++, mfx->external_path);
2070 __BIND_TEXT(db, stmt, idx++, mfx->csc_path);
2071 __BIND_TEXT(db, stmt, idx++, mfx->support_mode);
2072 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->support_disable, false));
2074 ret = sqlite3_step(stmt);
2075 if (ret != SQLITE_DONE) {
2076 _LOGE("step failed: %s", sqlite3_errmsg(db));
2077 sqlite3_finalize(stmt);
2081 sqlite3_finalize(stmt);
2083 if (__insert_package_update_info(db, mfx))
2085 if (__insert_package_localized_info(db, mfx))
2087 if (__insert_application_info(db, mfx))
2089 if (__insert_package_privilege_info(db, mfx))
2091 if (__insert_package_appdefined_privilege_info(db, mfx))
2097 API int pkgmgr_parser_insert_manifest_info_in_usr_db(manifest_x *mfx, uid_t uid)
2104 _LOGE("invalid parameter");
2105 return PM_PARSER_R_EINVAL;
2108 dbpath = __get_parser_db_path(uid);
2110 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2111 if (ret != SQLITE_OK) {
2112 _LOGE("open db failed: %d", ret);
2113 return PM_PARSER_R_ERROR;
2116 __BEGIN_TRANSACTION(db);
2117 __DO_TRANSACTION(db, __insert_package_info(db, mfx));
2118 __END_TRANSACTION(db);
2120 sqlite3_close_v2(db);
2122 return PM_PARSER_R_OK;
2125 API int pkgmgr_parser_insert_manifest_info_in_db(manifest_x *mfx)
2127 return pkgmgr_parser_insert_manifest_info_in_usr_db(mfx, __getuid());
2130 static int __delete_package_info(sqlite3 *db, const char *pkgid)
2132 static const char query[] =
2133 "DELETE FROM package_info WHERE package=?";
2137 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2138 if (ret != SQLITE_OK) {
2139 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2143 __BIND_TEXT(db, stmt, 1, pkgid);
2145 ret = sqlite3_step(stmt);
2146 if (ret != SQLITE_DONE) {
2147 _LOGE("step failed: %s", sqlite3_errmsg(db));
2148 sqlite3_finalize(stmt);
2152 sqlite3_finalize(stmt);
2157 API int pkgmgr_parser_delete_manifest_info_from_usr_db(manifest_x *mfx,
2165 _LOGE("invalid parameter");
2166 return PM_PARSER_R_EINVAL;
2169 dbpath = __get_parser_db_path(uid);
2171 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2172 if (ret != SQLITE_OK) {
2173 _LOGE("open db failed: %d", ret);
2174 return PM_PARSER_R_ERROR;
2177 __BEGIN_TRANSACTION(db);
2178 __DO_TRANSACTION(db, __delete_package_info(db, mfx->package));
2179 __END_TRANSACTION(db);
2181 sqlite3_close_v2(db);
2183 return PM_PARSER_R_OK;
2186 API int pkgmgr_parser_delete_manifest_info_from_db(manifest_x *mfx)
2188 return pkgmgr_parser_delete_manifest_info_from_usr_db(mfx, __getuid());
2191 API int pkgmgr_parser_update_manifest_info_in_usr_db(manifest_x *mfx, uid_t uid)
2198 _LOGE("invalid parameter");
2199 return PM_PARSER_R_EINVAL;
2202 dbpath = __get_parser_db_path(uid);
2204 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2205 if (ret != SQLITE_OK) {
2206 _LOGE("open db failed: %d", ret);
2207 return PM_PARSER_R_ERROR;
2210 __BEGIN_TRANSACTION(db);
2211 __DO_TRANSACTION(db, __delete_package_info(db, mfx->package));
2212 __DO_TRANSACTION(db, __insert_package_info(db, mfx));
2213 __END_TRANSACTION(db);
2215 sqlite3_close_v2(db);
2217 return PM_PARSER_R_OK;
2220 API int pkgmgr_parser_update_manifest_info_in_db(manifest_x *mfx)
2222 return pkgmgr_parser_update_manifest_info_in_usr_db(mfx, __getuid());
2225 static int __set_global_app_disable_for_uid(sqlite3 *db, const char *appid,
2226 uid_t uid, bool is_disable)
2228 static const char query[] =
2229 "INSERT OR REPLACE INTO package_app_info_for_uid ("
2230 " app_id, uid, is_disabled, is_splash_screen_enabled) "
2232 " (SELECT app_splash_screen_display FROM package_app_info"
2233 " WHERE app_id=?))";
2238 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2239 if (ret != SQLITE_OK) {
2240 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2244 __BIND_TEXT(db, stmt, idx++, appid);
2245 __BIND_INT(db, stmt, idx++, uid);
2246 __BIND_TEXT(db, stmt, idx++, is_disable ? "true" : "false");
2247 __BIND_TEXT(db, stmt, idx++, appid);
2249 ret = sqlite3_step(stmt);
2250 if (ret != SQLITE_DONE) {
2251 _LOGE("step failed: %s", sqlite3_errmsg(db));
2252 sqlite3_finalize(stmt);
2256 sqlite3_finalize(stmt);
2261 API int pkgmgr_parser_update_global_app_disable_for_uid_info_in_db(
2262 const char *appid, uid_t uid, int is_disable)
2268 if (appid == NULL) {
2269 _LOGE("invalid parameter");
2270 return PM_PARSER_R_EINVAL;
2273 dbpath = __get_parser_db_path(GLOBAL_USER);
2275 ret = __open_db(GLOBAL_USER, dbpath, &db, SQLITE_OPEN_READWRITE);
2276 if (ret != SQLITE_OK) {
2277 _LOGE("open db failed: %d", ret);
2278 return PM_PARSER_R_ERROR;
2281 __BEGIN_TRANSACTION(db);
2282 __DO_TRANSACTION(db, __set_global_app_disable_for_uid(db, appid,
2283 uid, (bool)is_disable));
2284 __END_TRANSACTION(db);
2286 sqlite3_close_v2(db);
2288 return PM_PARSER_R_OK;
2291 static int __set_app_disable(sqlite3 *db, const char *appid, uid_t uid,
2294 static const char query[] =
2295 "UPDATE package_app_info SET app_disable=? "
2301 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2302 if (ret != SQLITE_OK) {
2303 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2307 __BIND_TEXT(db, stmt, idx++, is_disable ? "true" : "false");
2308 __BIND_TEXT(db, stmt, idx++, appid);
2310 ret = sqlite3_step(stmt);
2311 if (ret != SQLITE_DONE) {
2312 _LOGE("step failed: %s", sqlite3_errmsg(db));
2313 sqlite3_finalize(stmt);
2317 sqlite3_finalize(stmt);
2322 API int pkgmgr_parser_update_app_disable_info_in_usr_db(const char *appid,
2323 uid_t uid, int is_disable)
2329 if (appid == NULL) {
2330 _LOGE("invalid parameter");
2331 return PM_PARSER_R_EINVAL;
2334 dbpath = __get_parser_db_path(uid);
2336 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2337 if (ret != SQLITE_OK) {
2338 _LOGE("open db failed: %d", ret);
2339 return PM_PARSER_R_ERROR;
2342 __BEGIN_TRANSACTION(db);
2343 __DO_TRANSACTION(db, __set_app_disable(db, appid, uid,
2345 __END_TRANSACTION(db);
2347 sqlite3_close_v2(db);
2349 return PM_PARSER_R_OK;
2352 API int pkgmgr_parser_update_app_disable_info_in_db(const char *appid,
2355 return pkgmgr_parser_update_app_disable_info_in_usr_db(appid,
2356 __getuid(), is_disable);
2359 static int __set_pkg_disable(sqlite3 *db, const char *pkgid, uid_t uid,
2362 static const char query[] =
2363 "UPDATE package_info SET package_disable=? "
2369 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2370 if (ret != SQLITE_OK) {
2371 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2375 __BIND_TEXT(db, stmt, idx++, is_disable ? "true" : "false");
2376 __BIND_TEXT(db, stmt, idx++, pkgid);
2378 ret = sqlite3_step(stmt);
2379 if (ret != SQLITE_DONE) {
2380 _LOGE("step failed: %s", sqlite3_errmsg(db));
2381 sqlite3_finalize(stmt);
2385 sqlite3_finalize(stmt);
2390 API int pkgmgr_parser_update_pkg_disable_info_in_usr_db(const char *pkgid,
2391 uid_t uid, int is_disable)
2397 if (pkgid == NULL) {
2398 _LOGE("invalid parameter");
2399 return PM_PARSER_R_EINVAL;
2402 dbpath = __get_parser_db_path(uid);
2404 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2405 if (ret != SQLITE_OK) {
2406 _LOGE("open db failed: %d", ret);
2407 return PM_PARSER_R_ERROR;
2410 __BEGIN_TRANSACTION(db);
2411 __DO_TRANSACTION(db, __set_pkg_disable(db, pkgid, uid,
2413 __END_TRANSACTION(db);
2415 sqlite3_close_v2(db);
2417 return PM_PARSER_R_OK;
2420 API int pkgmgr_parser_update_pkg_disable_info_in_db(const char *pkgid,
2423 return pkgmgr_parser_update_pkg_disable_info_in_usr_db(pkgid,
2424 __getuid(), is_disable);
2427 static int __set_global_app_splash_screen_for_uid(sqlite3 *db,
2428 const char *appid, uid_t uid, bool is_enabled)
2430 static const char query[] =
2431 "INSERT OR REPLACE INTO package_app_info_for_uid("
2432 " appid, uid, is_splash_screen_enabled) "
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++, appid);
2445 __BIND_INT(db, stmt, idx++, uid);
2446 __BIND_TEXT(db, stmt, idx++, is_enabled ? "true" : "false");
2448 ret = sqlite3_step(stmt);
2449 if (ret != SQLITE_DONE) {
2450 _LOGE("step failed: %s", sqlite3_errmsg(db));
2451 sqlite3_finalize(stmt);
2455 sqlite3_finalize(stmt);
2460 API int pkgmgr_parser_update_global_app_splash_screen_display_info_in_usr_db(
2461 const char *appid, uid_t uid, int flag)
2467 if (appid == NULL) {
2468 _LOGE("invalid parameter");
2469 return PM_PARSER_R_EINVAL;
2472 dbpath = __get_parser_db_path(GLOBAL_USER);
2474 ret = __open_db(GLOBAL_USER, dbpath, &db, SQLITE_OPEN_READWRITE);
2475 if (ret != SQLITE_OK) {
2476 _LOGE("open db failed: %d", ret);
2477 return PM_PARSER_R_ERROR;
2480 __BEGIN_TRANSACTION(db);
2481 __DO_TRANSACTION(db, __set_global_app_splash_screen_for_uid(db,
2482 appid, uid, (bool)flag));
2483 __END_TRANSACTION(db);
2485 sqlite3_close_v2(db);
2487 return PM_PARSER_R_OK;
2490 static int __set_app_splash_screen(sqlite3 *db, const char *appid,
2493 static const char query[] =
2494 "UPDATE package_app_info SET app_splash_screen_display=? "
2500 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2501 if (ret != SQLITE_OK) {
2502 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2506 __BIND_TEXT(db, stmt, idx++, is_enabled ? "true" : "false");
2507 __BIND_TEXT(db, stmt, idx++, appid);
2509 ret = sqlite3_step(stmt);
2510 if (ret != SQLITE_DONE) {
2511 _LOGE("step failed: %s", sqlite3_errmsg(db));
2512 sqlite3_finalize(stmt);
2516 sqlite3_finalize(stmt);
2521 API int pkgmgr_parser_update_app_splash_screen_display_info_in_usr_db(
2522 const char *appid, uid_t uid, int flag)
2528 if (appid == NULL) {
2529 _LOGE("invalid parameter");
2530 return PM_PARSER_R_EINVAL;
2533 dbpath = __get_parser_db_path(uid);
2535 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2536 if (ret != SQLITE_OK) {
2537 _LOGE("open db failed: %d", ret);
2538 return PM_PARSER_R_ERROR;
2541 __BEGIN_TRANSACTION(db);
2542 __DO_TRANSACTION(db, __set_app_splash_screen(db, appid, (bool)flag));
2543 __END_TRANSACTION(db);
2545 sqlite3_close_v2(db);
2547 return PM_PARSER_R_OK;
2550 API int pkgmgr_parser_update_app_splash_screen_display_info_in_db(
2551 const char *appid, int flag)
2553 return pkgmgr_parser_update_app_splash_screen_display_info_in_usr_db(
2554 appid, __getuid(), flag);
2557 static int __set_app_label(sqlite3 *db, const char *appid, const char *label)
2559 static const char query[] =
2560 "UPDATE package_app_localized_info SET app_label=? "
2561 "WHERE app_id=? AND app_label IS NOT NULL";
2566 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2567 if (ret != SQLITE_OK) {
2568 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2572 __BIND_TEXT(db, stmt, idx++, label);
2573 __BIND_TEXT(db, stmt, idx++, appid);
2575 ret = sqlite3_step(stmt);
2576 if (ret != SQLITE_DONE) {
2577 _LOGE("step failed: %s", sqlite3_errmsg(db));
2578 sqlite3_finalize(stmt);
2582 sqlite3_finalize(stmt);
2587 API int pkgmgr_parser_update_app_label_info_in_usr_db(const char *appid,
2588 uid_t uid, const char *label)
2594 if (appid == NULL) {
2595 _LOGE("invalid parameter");
2596 return PM_PARSER_R_EINVAL;
2599 dbpath = __get_parser_db_path(uid);
2601 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2602 if (ret != SQLITE_OK) {
2603 _LOGE("open db failed: %d", ret);
2604 return PM_PARSER_R_ERROR;
2607 __BEGIN_TRANSACTION(db);
2608 __DO_TRANSACTION(db, __set_app_label(db, appid, label));
2609 __END_TRANSACTION(db);
2611 sqlite3_close_v2(db);
2613 return PM_PARSER_R_OK;
2616 API int pkgmgr_parser_update_app_label_info_in_db(const char *appid,
2619 return pkgmgr_parser_update_app_label_info_in_usr_db(appid, __getuid(),
2623 static int __set_app_icon(sqlite3 *db, const char *appid, const char *icon_path)
2625 static const char query[] =
2626 "UPDATE package_app_localized_info SET app_icon=? "
2627 "WHERE app_id=? AND app_icon IS NOT NULL";
2632 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2633 if (ret != SQLITE_OK) {
2634 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2638 __BIND_TEXT(db, stmt, idx++, icon_path);
2639 __BIND_TEXT(db, stmt, idx++, appid);
2641 ret = sqlite3_step(stmt);
2642 if (ret != SQLITE_DONE) {
2643 _LOGE("step failed: %s", sqlite3_errmsg(db));
2644 sqlite3_finalize(stmt);
2648 sqlite3_finalize(stmt);
2653 API int pkgmgr_parser_update_app_icon_info_in_usr_db(const char *appid,
2654 uid_t uid, const char *icon_path)
2660 if (appid == NULL) {
2661 _LOGE("invalid parameter");
2662 return PM_PARSER_R_EINVAL;
2665 dbpath = __get_parser_db_path(uid);
2667 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2668 if (ret != SQLITE_OK) {
2669 _LOGE("open db failed: %d", ret);
2670 return PM_PARSER_R_ERROR;
2673 __BEGIN_TRANSACTION(db);
2674 __DO_TRANSACTION(db, __set_app_icon(db, appid, icon_path));
2675 __END_TRANSACTION(db);
2677 sqlite3_close_v2(db);
2679 return PM_PARSER_R_OK;
2682 API int pkgmgr_parser_update_app_icon_info_in_db(const char *appid,
2683 const char *icon_path)
2685 return pkgmgr_parser_update_app_icon_info_in_usr_db(appid, __getuid(),
2689 static int __set_tep_path(sqlite3 *db, const char *pkgid, const char *tep_path)
2691 static const char query[] =
2692 "UPDATE package_info SET package_tep_name=? "
2698 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2699 if (ret != SQLITE_OK) {
2700 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2704 __BIND_TEXT(db, stmt, idx++, tep_path);
2705 __BIND_TEXT(db, stmt, idx++, pkgid);
2707 ret = sqlite3_step(stmt);
2708 if (ret != SQLITE_DONE) {
2709 _LOGE("step failed: %s", sqlite3_errmsg(db));
2710 sqlite3_finalize(stmt);
2714 sqlite3_finalize(stmt);
2719 API int pkgmgr_parser_update_tep_info_in_usr_db(const char *pkgid,
2720 const char *tep_path, uid_t uid)
2726 if (pkgid == NULL) {
2727 _LOGE("invalid parameter");
2728 return PM_PARSER_R_EINVAL;
2731 dbpath = __get_parser_db_path(uid);
2733 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2734 if (ret != SQLITE_OK) {
2735 _LOGE("open db failed: %d", ret);
2736 return PM_PARSER_R_ERROR;
2739 __BEGIN_TRANSACTION(db);
2740 __DO_TRANSACTION(db, __set_tep_path(db, pkgid, tep_path));
2741 __END_TRANSACTION(db);
2743 sqlite3_close_v2(db);
2745 return PM_PARSER_R_OK;
2748 API int pkgmgr_parser_update_tep_info_in_db(const char *pkgid,
2749 const char *tep_path)
2751 return pkgmgr_parser_update_tep_info_in_usr_db(pkgid, tep_path,
2755 static int __convert_update_type(pkgmgrinfo_updateinfo_update_type type,
2756 const char **update_type)
2758 if (type == PMINFO_UPDATEINFO_NONE)
2759 *update_type = PMINFO_UPDATEINFO_TYPE_NONE;
2760 else if (type == PMINFO_UPDATEINFO_FORCE)
2761 *update_type = PMINFO_UPDATEINFO_TYPE_FORCE;
2762 else if (type == PMINFO_UPDATEINFO_OPTIONAL)
2763 *update_type = PMINFO_UPDATEINFO_TYPE_OPTIONAL;
2769 static int __register_pkg_update_info(sqlite3 *db, updateinfo_x *info,
2770 const char *update_type)
2772 static const char query[] =
2773 "UPDATE package_update_info "
2774 "SET update_version=?, update_type=? "
2780 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2781 if (ret != SQLITE_OK) {
2782 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2786 __BIND_TEXT(db, stmt, idx++, info->version);
2787 __BIND_TEXT(db, stmt, idx++, update_type);
2788 __BIND_TEXT(db, stmt, idx++, info->pkgid);
2790 ret = sqlite3_step(stmt);
2791 if (ret != SQLITE_DONE) {
2792 _LOGE("step failed: %s", sqlite3_errmsg(db));
2793 sqlite3_finalize(stmt);
2797 sqlite3_finalize(stmt);
2802 API int pkgmgr_parser_register_pkg_update_info_in_usr_db(
2803 pkgmgrinfo_updateinfo_h handle, uid_t uid)
2806 updateinfo_x *update_info;
2807 updateinfo_x *prev_update_info;
2808 pkgmgrinfo_updateinfo_h prev_update_handle;
2809 pkgmgrinfo_pkginfo_h pkginfo;
2810 pkgmgrinfo_version_compare_type compare_result;
2812 const char *update_type;
2816 if (handle == NULL) {
2817 _LOGE("invalid parameter");
2818 return PM_PARSER_R_EINVAL;
2821 update_info = (updateinfo_x *)handle;
2822 if (update_info->pkgid == NULL || update_info->version == NULL)
2823 return PM_PARSER_R_EINVAL;
2824 if (__convert_update_type(update_info->type, &update_type) != 0)
2825 return PM_PARSER_R_EINVAL;
2827 ret = pkgmgrinfo_updateinfo_get_usr_updateinfo(update_info->pkgid,
2828 &prev_update_handle, uid);
2829 if (ret != PMINFO_R_OK)
2830 return PM_PARSER_R_ERROR;
2832 prev_update_info = (updateinfo_x *)prev_update_handle;
2833 ret = pkgmgrinfo_compare_package_version(update_info->version,
2834 prev_update_info->version, &compare_result);
2835 if (ret != PMINFO_R_OK) {
2836 pkgmgrinfo_updateinfo_destroy(prev_update_handle);
2837 return PM_PARSER_R_ERROR;
2840 if (compare_result == PMINFO_VERSION_SAME &&
2841 prev_update_info->type == PMINFO_UPDATEINFO_NONE) {
2842 _LOGI("Given update info version[%s] of pkgid[%s] "
2844 update_info->version, update_info->pkgid);
2845 pkgmgrinfo_updateinfo_destroy(prev_update_handle);
2846 return PM_PARSER_R_OK;
2848 pkgmgrinfo_updateinfo_destroy(prev_update_handle);
2850 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(update_info->pkgid, uid,
2852 if (ret != PMINFO_R_OK)
2853 return PM_PARSER_R_ERROR;
2855 ret = pkgmgrinfo_pkginfo_is_global(pkginfo, &is_global_pkg);
2856 if (ret != PMINFO_R_OK) {
2857 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
2858 return PM_PARSER_R_ERROR;
2860 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
2862 dbpath = __get_parser_db_path(is_global_pkg ? GLOBAL_USER : uid);
2864 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2865 if (ret != SQLITE_OK) {
2866 _LOGE("open db failed: %d", ret);
2867 return PM_PARSER_R_ERROR;
2870 __BEGIN_TRANSACTION(db);
2871 __DO_TRANSACTION(db, __register_pkg_update_info(db, update_info,
2873 __END_TRANSACTION(db);
2875 sqlite3_close_v2(db);
2877 return PM_PARSER_R_OK;
2880 API int pkgmgr_parser_register_pkg_update_info_in_db(
2881 pkgmgrinfo_updateinfo_h handle)
2883 return pkgmgr_parser_register_pkg_update_info_in_usr_db(handle,
2887 static int __unregister_pkg_update_info(sqlite3 *db, const char *pkgid)
2889 static const char query[] =
2890 "UPDATE package_update_info SET update_type='none' "
2896 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2897 if (ret != SQLITE_OK) {
2898 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2902 __BIND_TEXT(db, stmt, idx++, pkgid);
2904 ret = sqlite3_step(stmt);
2905 if (ret != SQLITE_DONE) {
2906 _LOGE("step failed: %s", sqlite3_errmsg(db));
2907 sqlite3_finalize(stmt);
2911 sqlite3_finalize(stmt);
2916 API int pkgmgr_parser_unregister_pkg_update_info_in_usr_db(const char *pkgid,
2922 pkgmgrinfo_pkginfo_h pkginfo;
2925 if (pkgid == NULL) {
2926 _LOGE("invalid parameter");
2927 return PM_PARSER_R_EINVAL;
2930 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &pkginfo);
2931 if (ret != PMINFO_R_OK)
2932 return PM_PARSER_R_EINVAL;
2934 ret = pkgmgrinfo_pkginfo_is_global(pkginfo, &is_global_pkg);
2935 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
2936 if (ret != PMINFO_R_OK)
2937 return PM_PARSER_R_ERROR;
2939 dbpath = __get_parser_db_path(is_global_pkg ? GLOBAL_USER : uid);
2941 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2942 if (ret != SQLITE_OK) {
2943 _LOGE("open db failed: %d", ret);
2944 return PM_PARSER_R_ERROR;
2947 __BEGIN_TRANSACTION(db);
2948 __DO_TRANSACTION(db, __unregister_pkg_update_info(db, pkgid));
2949 __END_TRANSACTION(db);
2951 sqlite3_close_v2(db);
2953 return PM_PARSER_R_OK;
2956 API int pkgmgr_parser_unregister_pkg_update_info_in_db(const char *pkgid)
2958 return pkgmgr_parser_unregister_pkg_update_info_in_usr_db(pkgid,
2962 static int __unregister_all_pkg_update_info(sqlite3 *db)
2964 static const char query[] =
2965 "UPDATE package_update_info SET update_type='none'";
2969 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2970 if (ret != SQLITE_OK) {
2971 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2975 ret = sqlite3_step(stmt);
2976 if (ret != SQLITE_DONE) {
2977 _LOGE("step failed: %s", sqlite3_errmsg(db));
2978 sqlite3_finalize(stmt);
2982 sqlite3_finalize(stmt);
2987 API int pkgmgr_parser_unregister_all_pkg_update_info_in_usr_db(uid_t uid)
2993 dbpath = __get_parser_db_path(uid);
2995 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2996 if (ret != SQLITE_OK) {
2997 _LOGE("open db failed: %d", ret);
2998 return PM_PARSER_R_ERROR;
3001 __BEGIN_TRANSACTION(db);
3002 __DO_TRANSACTION(db, __unregister_all_pkg_update_info(db));
3003 __END_TRANSACTION(db);
3005 sqlite3_close_v2(db);
3007 return PM_PARSER_R_OK;
3010 API int pkgmgr_parser_unregister_all_pkg_update_info_in_db(void)
3012 return pkgmgr_parser_unregister_all_pkg_update_info_in_usr_db(