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,
332 QUERY_CREATE_TABLE_PACKAGE_DEPENDENCY_INFO,
333 QUERY_CREATE_TABLE_PACKAGE_PLUGIN_INFO,
337 static const char *cert_init_queries[] = {
338 QUERY_CREATE_TABLE_PACKAGE_CERT_INFO,
339 QUERY_CREATE_TABLE_PACKAGE_CERT_INDEX_INFO,
340 QUERY_CREATE_TRIGGER_UPDATE_CERT_INFO,
341 QUERY_CREATE_TRIGGER_UPDATE_CERT_INFO2,
342 QUERY_CREATE_TRIGGER_DELETE_CERT_INFO,
343 QUERY_CREATE_TRIGGER_UPDATE_CERT_INDEX_INFO,
347 static int __create_tables(sqlite3 *db, const char **queries)
351 for (i = 0; queries[i] != NULL; i++) {
352 ret = sqlite3_exec(db, queries[i], NULL, NULL, NULL);
353 if (ret != SQLITE_OK) {
354 _LOGE("exec failed: %s", sqlite3_errmsg(db));
361 static int __initialize_db(sqlite3 *db, const char *dbpath, uid_t uid)
363 const char **queries;
365 if (__set_db_version(db))
368 if (strstr(dbpath, ".pkgmgr_parser.db")) {
369 queries = parser_init_queries;
370 } else if (strstr(dbpath, ".pkgmgr_cert.db")) {
371 queries = cert_init_queries;
373 _LOGE("unexpected dbpath: %s", dbpath);
377 __BEGIN_TRANSACTION(db);
378 __DO_TRANSACTION(db, __create_tables(db, queries));
379 __END_TRANSACTION(db);
381 if (__set_db_permission(dbpath, uid))
382 _LOGE("failed to set db permission");
387 #define RESOURCED_BUS_NAME "org.tizen.resourced"
388 #define RESOURCED_PROC_PATH "/Org/Tizen/ResourceD/Process"
389 #define RESOURCED_PROC_INTERFACE "org.tizen.resourced.process"
390 #define RESOURCED_PROC_METHOD "ProcExclude"
391 static void __send_wakeup_signal_to_resourced(pid_t pid)
393 GError *error = NULL;
394 GDBusConnection *conn;
398 conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
400 _LOGE("Failed to connect to dbus: %s", error->message);
405 proxy = g_dbus_proxy_new_sync(conn,
406 G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
407 NULL, RESOURCED_BUS_NAME,
408 RESOURCED_PROC_PATH, RESOURCED_PROC_INTERFACE,
411 _LOGE("failed to get proxy object: %s", error->message);
413 g_object_unref(conn);
417 reply = g_dbus_proxy_call_sync(proxy, RESOURCED_PROC_METHOD,
418 g_variant_new("(si)", "wakeup", pid),
419 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
421 _LOGE("failed to get reply from resourced");
423 _LOGE("failed to send request: %s", error->message);
427 g_object_unref(proxy);
428 g_object_unref(conn);
431 static void __check_db_lock(const char *dbpath)
440 char cmdline[BUFSIZE];
444 if (stat(dbpath, &sb) == -1) {
445 _LOGE("get db file(%s) status failed: %d", dbpath, errno);
449 fp = fopen("/proc/locks", "r");
451 _LOGE("Failed to open lock info: %d", errno);
455 while (fscanf(fp, "%*s %*s %*s %*s %d %x:%x:%lu %*s %*s",
456 &pid, &maj, &min, &ino) != EOF) {
457 if (maj != major(sb.st_dev) || min != minor(sb.st_dev) ||
458 ino != sb.st_ino || pid == getpid())
461 snprintf(cmdline, sizeof(cmdline), "/proc/%d/cmdline", pid);
462 fp_cmdline = fopen(cmdline, "r");
464 if (fp_cmdline != NULL) {
465 len = fread(name, sizeof(char), sizeof(name) - 1,
468 if (name[len - 1] == '\n')
469 name[len - 1] = '\0';
476 _LOGE("%s (%d) has lock on pkgmgr db(%s)!", name, pid, dbpath);
477 __send_wakeup_signal_to_resourced(pid);
483 #define BUSY_WAITING_USEC (1000000 / 10 / 2) /* 0.05 sec */
484 #define BUSY_WAITING_MAX 40 /* wait for max 2 sec */
485 static int __db_busy_handler(void *data, int count)
487 if (count < (BUSY_WAITING_MAX / 2)) {
488 usleep(BUSY_WAITING_USEC);
490 } else if (count == (BUSY_WAITING_MAX / 2)) {
491 __check_db_lock((const char *)data);
492 usleep(BUSY_WAITING_USEC);
494 } else if (count < BUSY_WAITING_MAX) {
495 usleep(BUSY_WAITING_USEC);
498 /* sqlite3_prepare_v2 will return SQLITE_BUSY */
503 API int pkgmgr_parser_initialize_parser_db(uid_t uid)
509 dbpath = __get_parser_db_path(uid);
510 if (access(dbpath, F_OK) != -1) {
511 _LOGE("Manifest db for user %d is already exists", uid);
512 return PM_PARSER_R_ERROR;
515 ret = sqlite3_open_v2(dbpath, &db,
516 SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
517 if (ret != SQLITE_OK) {
518 _LOGE("open db failed: %d", ret);
519 return PM_PARSER_R_ERROR;
522 ret = sqlite3_busy_handler(db, __db_busy_handler, NULL);
523 if (ret != SQLITE_OK) {
524 _LOGE("failed to register busy handler: %s",
526 sqlite3_close_v2(db);
530 if (__initialize_db(db, dbpath, uid)) {
531 sqlite3_close_v2(db);
532 return PM_PARSER_R_ERROR;
534 sqlite3_close_v2(db);
536 return PM_PARSER_R_OK;
539 API int pkgmgr_parser_initialize_cert_db(void)
545 dbpath = __get_cert_db_path();
546 if (access(dbpath, F_OK) != -1) {
547 _LOGE("Cert db is already exists");
548 return PM_PARSER_R_ERROR;
551 ret = sqlite3_open_v2(dbpath, &db,
552 SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
553 if (ret != SQLITE_OK) {
554 _LOGE("open db failed: %d", ret);
555 return PM_PARSER_R_ERROR;
558 ret = sqlite3_busy_handler(db, __db_busy_handler, NULL);
559 if (ret != SQLITE_OK) {
560 _LOGE("failed to register busy handler: %s",
562 sqlite3_close_v2(db);
566 if (__initialize_db(db, dbpath, GLOBAL_USER)) {
567 sqlite3_close_v2(db);
568 return PM_PARSER_R_ERROR;
570 sqlite3_close_v2(db);
572 return PM_PARSER_R_OK;
575 API int pkgmgr_parser_create_and_initialize_db(uid_t uid)
579 struct passwd *result;
582 ret = getpwnam_r(APPFW_USER, &pwd, buf, sizeof(buf), &result);
583 if (result == NULL) {
585 _LOGE("no such user: %s", APPFW_USER);
587 _LOGE("getpwnam_r failed: %d", errno);
588 return PM_PARSER_R_ERROR;
591 if (getuid() != OWNER_ROOT && getuid() != pwd.pw_uid) {
592 _LOGE("Only root or app_fw user is allowed");
593 return PM_PARSER_R_EINVAL;
596 if (pkgmgr_parser_initialize_parser_db(uid))
597 return PM_PARSER_R_ERROR;
599 if (uid == OWNER_ROOT || uid == GLOBAL_USER)
600 if (pkgmgr_parser_initialize_cert_db())
601 return PM_PARSER_R_ERROR;
603 return PM_PARSER_R_OK;
606 static int __open_db(uid_t uid, const char *path, sqlite3 **db, int flags)
610 /* FIXME: always open with OPEN_CREATE flag for keeping previous
613 if (flags & SQLITE_OPEN_READWRITE)
614 flags = flags | SQLITE_OPEN_CREATE;
616 ret = sqlite3_open_v2(path, db, flags, NULL);
617 if (ret != SQLITE_OK)
620 ret = sqlite3_busy_handler(*db, __db_busy_handler, (void *)path);
621 if (ret != SQLITE_OK) {
622 _LOGE("failed to register busy handler: %s",
623 sqlite3_errmsg(*db));
624 sqlite3_close_v2(*db);
628 if (flags & SQLITE_OPEN_CREATE) {
629 ret = __initialize_db(*db, path, uid);
631 _LOGE("failed to initialize db: %s", path);
632 sqlite3_close_v2(*db);
637 ret = sqlite3_exec(*db, "PRAGMA foreign_keys=ON", NULL, NULL, NULL);
638 if (ret != SQLITE_OK) {
639 _LOGE("failed to enable foreign key support: %s",
640 sqlite3_errmsg(*db));
641 sqlite3_close_v2(*db);
649 static int __convert_background_category(GList *category_list)
655 if (category_list == NULL)
658 for (tmp = category_list; tmp; tmp = tmp->next) {
659 category_data = (char *)tmp->data;
660 if (category_data == NULL)
662 if (!strcmp(category_data, APP_BG_CATEGORY_MEDIA_STR))
663 ret |= APP_BG_CATEGORY_MEDIA_VAL;
664 else if (!strcmp(category_data, APP_BG_CATEGORY_DOWNLOAD_STR))
665 ret |= APP_BG_CATEGORY_DOWNLOAD_VAL;
666 else if (!strcmp(category_data, APP_BG_CATEGORY_BGNETWORK_STR))
667 ret |= APP_BG_CATEGORY_BGNETWORK_VAL;
668 else if (!strcmp(category_data, APP_BG_CATEGORY_LOCATION_STR))
669 ret |= APP_BG_CATEGORY_LOCATION_VAL;
670 else if (!strcmp(category_data, APP_BG_CATEGORY_SENSOR_STR))
671 ret |= APP_BG_CATEGORY_SENSOR_VAL;
672 else if (!strcmp(category_data, APP_BG_CATEGORY_IOTCOMM_STR))
673 ret |= APP_BG_CATEGORY_IOTCOMM_VAL;
674 else if (!strcmp(category_data, APP_BG_CATEGORY_SYSTEM))
675 ret |= APP_BG_CATEGORY_SYSTEM_VAL;
677 _LOGE("Unidentified category [%s]", category_data);
683 #define EFFECTIVE_APPID_KEY "http://tizen.org/metadata/effective-appid"
684 static const char *__find_effective_appid(GList *metadata_list)
689 for (tmp = metadata_list; tmp; tmp = tmp->next) {
690 md = (metadata_x *)tmp->data;
691 if (md == NULL || md->key == NULL)
694 if (strcmp(md->key, EFFECTIVE_APPID_KEY) == 0) {
703 static int __insert_appcontrol_privilege_info(sqlite3 *db, const char *appid,
706 static const char query[] =
707 "INSERT INTO package_app_app_control_privilege (app_id,"
708 " app_control, privilege) VALUES (?, ?, ?)";
712 char app_control[BUFSIZE];
719 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
720 if (ret != SQLITE_OK) {
721 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
725 for (tmp = ac->privileges; tmp; tmp = tmp->next) {
726 privilege = (char *)tmp->data;
727 if (privilege == NULL || !strlen(privilege))
731 snprintf(app_control, sizeof(app_control), "%s|%s|%s",
732 ac->operation ? (strlen(ac->operation) > 0 ?
733 ac->operation : "NULL") : "NULL",
734 ac->uri ? (strlen(ac->uri) > 0 ?
735 ac->uri : "NULL") : "NULL",
736 ac->mime ? (strlen(ac->mime) > 0 ?
737 ac->mime : "NULL") : "NULL");
738 __BIND_TEXT(db, stmt, idx++, appid);
739 __BIND_TEXT(db, stmt, idx++, app_control);
740 __BIND_TEXT(db, stmt, idx++, privilege);
742 ret = sqlite3_step(stmt);
743 if (ret != SQLITE_DONE) {
744 _LOGE("step failed: %s", sqlite3_errmsg(db));
745 sqlite3_finalize(stmt);
752 sqlite3_finalize(stmt);
757 static int __insert_appcontrol_info(sqlite3 *db, application_x *app)
759 static const char query[] =
760 "INSERT INTO package_app_app_control (app_id, app_control,"
761 " visibility, app_control_id) "
762 "VALUES (?, ?, ?, ?)";
766 char app_control[BUFSIZE];
770 if (app->appcontrol == NULL)
773 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
774 if (ret != SQLITE_OK) {
775 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
779 for (tmp = app->appcontrol; tmp; tmp = tmp->next) {
780 ac = (appcontrol_x *)tmp->data;
784 snprintf(app_control, sizeof(app_control), "%s|%s|%s",
785 ac->operation ? (strlen(ac->operation) > 0 ?
786 ac->operation : "NULL") : "NULL",
787 ac->uri ? (strlen(ac->uri) > 0 ?
788 ac->uri : "NULL") : "NULL",
789 ac->mime ? (strlen(ac->mime) > 0 ?
790 ac->mime : "NULL") : "NULL");
791 __BIND_TEXT(db, stmt, idx++, app->appid);
792 __BIND_TEXT(db, stmt, idx++, app_control);
793 __BIND_TEXT(db, stmt, idx++, ac->visibility);
794 __BIND_TEXT(db, stmt, idx++, ac->id);
796 ret = sqlite3_step(stmt);
797 if (ret != SQLITE_DONE) {
798 _LOGE("step failed: %s", sqlite3_errmsg(db));
799 sqlite3_finalize(stmt);
803 if (__insert_appcontrol_privilege_info(db, app->appid, ac)) {
804 sqlite3_finalize(stmt);
811 sqlite3_finalize(stmt);
816 static int __insert_category_info(sqlite3 *db, application_x *app)
818 static const char query[] =
819 "INSERT INTO package_app_app_category (app_id, category) "
825 const char *category;
827 if (app->category == NULL)
830 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
831 if (ret != SQLITE_OK) {
832 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
836 for (tmp = app->category; tmp; tmp = tmp->next) {
837 category = (const char *)tmp->data;
838 if (category == NULL)
841 __BIND_TEXT(db, stmt, idx++, app->appid);
842 __BIND_TEXT(db, stmt, idx++, category);
844 ret = sqlite3_step(stmt);
845 if (ret != SQLITE_DONE) {
846 _LOGE("step failed: %s", sqlite3_errmsg(db));
847 sqlite3_finalize(stmt);
854 sqlite3_finalize(stmt);
859 static int __insert_metadata_info(sqlite3 *db, application_x *app)
861 static const char query[] =
862 "INSERT INTO package_app_app_metadata (app_id,"
863 " md_key, md_value) VALUES (?, ?, ?)";
870 if (app->metadata == NULL)
873 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
874 if (ret != SQLITE_OK) {
875 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
879 for (tmp = app->metadata; tmp; tmp = tmp->next) {
880 md = (metadata_x *)tmp->data;
884 __BIND_TEXT(db, stmt, idx++, app->appid);
885 __BIND_TEXT(db, stmt, idx++, md->key);
886 __BIND_TEXT(db, stmt, idx++, md->value);
888 ret = sqlite3_step(stmt);
889 if (ret != SQLITE_DONE) {
890 _LOGE("step failed: %s", sqlite3_errmsg(db));
891 sqlite3_finalize(stmt);
898 sqlite3_finalize(stmt);
903 static int __insert_app_data_control_privilege_info(sqlite3 *db,
904 datacontrol_x *datacontrol)
906 static const char query[] =
907 "INSERT INTO package_app_data_control_privilege (providerid,"
908 " privilege, type) VALUES (?, ?, ?)";
916 if (datacontrol == NULL)
919 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
920 if (ret != SQLITE_OK) {
921 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
925 for (privileges = datacontrol->privileges; privileges;
926 privileges = privileges->next) {
927 priv = (char *)privileges->data;
932 __BIND_TEXT(db, stmt, idx++, datacontrol->providerid);
933 __BIND_TEXT(db, stmt, idx++, priv);
934 __BIND_TEXT(db, stmt, idx++, datacontrol->type);
936 ret = sqlite3_step(stmt);
937 if (ret != SQLITE_DONE) {
938 _LOGE("step failed: %s", sqlite3_errmsg(db));
939 sqlite3_finalize(stmt);
946 sqlite3_finalize(stmt);
950 static int __insert_datacontrol_info(sqlite3 *db, application_x *app)
952 static const char query[] =
953 "INSERT INTO package_app_data_control (app_id, providerid,"
954 " access, type, trusted) VALUES (?, ?, ?, ?, ?)";
961 if (app->datacontrol == NULL)
964 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
965 if (ret != SQLITE_OK) {
966 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
970 for (tmp = app->datacontrol; tmp; tmp = tmp->next) {
971 dc = (datacontrol_x *)tmp->data;
975 __BIND_TEXT(db, stmt, idx++, app->appid);
976 __BIND_TEXT(db, stmt, idx++, dc->providerid);
977 __BIND_TEXT(db, stmt, idx++, dc->access);
978 __BIND_TEXT(db, stmt, idx++, dc->type);
979 __BIND_TEXT(db, stmt, idx++, dc->trusted);
981 ret = sqlite3_step(stmt);
982 if (ret != SQLITE_DONE) {
983 _LOGE("step failed: %s", sqlite3_errmsg(db));
984 sqlite3_finalize(stmt);
988 if (dc->privileges &&
989 __insert_app_data_control_privilege_info(db, dc)) {
990 sqlite3_finalize(stmt);
997 sqlite3_finalize(stmt);
1002 /* TODO: move to installer */
1003 static int __check_dpi(const char *dpi_char, int dpi_int)
1005 if (dpi_char == NULL)
1008 if (strcasecmp(dpi_char, LDPI) == 0) {
1009 if (dpi_int >= LDPI_MIN && dpi_int <= LDPI_MAX)
1013 } else if (strcasecmp(dpi_char, MDPI) == 0) {
1014 if (dpi_int >= MDPI_MIN && dpi_int <= MDPI_MAX)
1018 } else if (strcasecmp(dpi_char, HDPI) == 0) {
1019 if (dpi_int >= HDPI_MIN && dpi_int <= HDPI_MAX)
1023 } else if (strcasecmp(dpi_char, XHDPI) == 0) {
1024 if (dpi_int >= XHDPI_MIN && dpi_int <= XHDPI_MAX)
1028 } else if (strcasecmp(dpi_char, XXHDPI) == 0) {
1029 if (dpi_int >= XXHDPI_MIN && dpi_int <= XXHDPI_MAX)
1037 static gint __compare_splashscreen_with_orientation_dpi(gconstpointer a,
1040 splashscreen_x *ss = (splashscreen_x *)a;
1041 const char *orientation = (const char *)b;
1045 if (ss->operation || ss->dpi == NULL)
1048 ret = system_info_get_platform_int(
1049 "http://tizen.org/feature/screen.dpi", &dpi);
1050 if (ret != SYSTEM_INFO_ERROR_NONE)
1053 if (strcasecmp(ss->orientation, orientation) == 0 &&
1054 __check_dpi(ss->dpi, dpi) == 0)
1060 static gint __compare_splashscreen_with_orientation(gconstpointer a,
1063 splashscreen_x *ss = (splashscreen_x *)a;
1064 const char *orientation = (const char *)b;
1066 if (ss->operation || ss->dpi)
1069 if (strcasecmp(ss->orientation, orientation) == 0)
1075 static splashscreen_x *__find_default_splashscreen(GList *splashscreens,
1076 const char *orientation)
1080 tmp = g_list_find_custom(splashscreens, orientation,
1082 __compare_splashscreen_with_orientation_dpi);
1084 return (splashscreen_x *)tmp->data;
1086 tmp = g_list_find_custom(splashscreens, orientation,
1087 (GCompareFunc)__compare_splashscreen_with_orientation);
1089 return (splashscreen_x *)tmp->data;
1094 static void __find_appcontrol_splashscreen_with_dpi(gpointer data,
1097 splashscreen_x *ss = (splashscreen_x *)data;
1098 GList **list = (GList **)user_data;
1102 if (ss->operation == NULL || ss->dpi == NULL)
1105 ret = system_info_get_platform_int(
1106 "http://tizen.org/feature/screen.dpi", &dpi);
1107 if (ret != SYSTEM_INFO_ERROR_NONE)
1110 if (__check_dpi(ss->dpi, dpi) != 0)
1113 *list = g_list_append(*list, ss);
1116 static void __find_appcontrol_splashscreen(gpointer data, gpointer user_data)
1118 splashscreen_x *ss = (splashscreen_x *)data;
1119 GList **list = (GList **)user_data;
1120 splashscreen_x *ss_tmp;
1123 if (ss->operation == NULL || ss->dpi)
1126 for (tmp = *list; tmp; tmp = tmp->next) {
1127 ss_tmp = (splashscreen_x *)tmp->data;
1128 if (ss_tmp->operation
1129 && strcmp(ss_tmp->operation, ss->operation) == 0
1130 && strcmp(ss_tmp->orientation, ss->orientation) == 0)
1134 *list = g_list_append(*list, ss);
1137 static GList *__find_splashscreens(GList *splashscreens)
1142 if (splashscreens == NULL)
1145 g_list_foreach(splashscreens,
1146 __find_appcontrol_splashscreen_with_dpi, &list);
1147 g_list_foreach(splashscreens,
1148 __find_appcontrol_splashscreen, &list);
1150 ss = __find_default_splashscreen(splashscreens, "portrait");
1152 list = g_list_append(list, ss);
1153 ss = __find_default_splashscreen(splashscreens, "landscape");
1155 list = g_list_append(list, ss);
1160 static int __insert_splashscreen_info(sqlite3 *db, application_x *app,
1163 static const char query[] =
1164 "INSERT INTO package_app_splash_screen (app_id, src, type,"
1165 " orientation, indicatordisplay, operation, color_depth) "
1166 "VALUES (?, ?, ?, ?, ?, ?, ?)";
1173 if (app->splashscreens == NULL)
1176 if (ss_list == NULL)
1179 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1180 if (ret != SQLITE_OK) {
1181 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1185 for (tmp = ss_list; tmp; tmp = tmp->next) {
1186 ss = (splashscreen_x *)tmp->data;
1190 __BIND_TEXT(db, stmt, idx++, app->appid);
1191 __BIND_TEXT(db, stmt, idx++, ss->src);
1192 __BIND_TEXT(db, stmt, idx++, ss->type);
1193 __BIND_TEXT(db, stmt, idx++, ss->orientation);
1194 __BIND_TEXT(db, stmt, idx++, ss->indicatordisplay);
1195 __BIND_TEXT(db, stmt, idx++, ss->operation);
1196 __BIND_TEXT(db, stmt, idx++, ss->color_depth);
1198 ret = sqlite3_step(stmt);
1199 if (ret != SQLITE_DONE) {
1200 _LOGE("step failed: %s", sqlite3_errmsg(db));
1201 sqlite3_finalize(stmt);
1205 sqlite3_reset(stmt);
1208 sqlite3_finalize(stmt);
1213 static void __trimfunc(GList *trim_list)
1217 GList *list = g_list_first(trim_list);
1220 trim_data = (char *)list->data;
1223 if (strcmp(trim_data, prev) == 0) {
1224 trim_list = g_list_remove(trim_list,
1226 list = g_list_first(trim_list);
1235 list = g_list_next(list);
1239 static gint __comparefunc(gconstpointer a, gconstpointer b, gpointer userdata)
1241 if (a == NULL || b == NULL)
1243 if (strcmp((char *)a, (char *)b) == 0)
1245 if (strcmp((char *)a, (char *)b) < 0)
1247 if (strcmp((char *)a, (char *)b) > 0)
1252 /* TODO: refactor inserting localized info */
1253 static GList *__create_locale_list(GList *lbls, GList *lcns, GList *icns,
1254 GList *dcns, GList *aths)
1256 GList *locale = NULL;
1264 for (tmp = lbls; tmp; tmp = tmp->next) {
1265 lbl = (label_x *)tmp->data;
1269 locale = g_list_insert_sorted_with_data(
1270 locale, (gpointer)lbl->lang,
1271 __comparefunc, NULL);
1273 for (tmp = lcns; tmp; tmp = tmp->next) {
1274 lcn = (license_x *)tmp->data;
1278 locale = g_list_insert_sorted_with_data(
1279 locale, (gpointer)lcn->lang,
1280 __comparefunc, NULL);
1282 for (tmp = icns; tmp; tmp = tmp->next) {
1283 icn = (icon_x *)tmp->data;
1287 locale = g_list_insert_sorted_with_data(
1288 locale, (gpointer)icn->lang,
1289 __comparefunc, NULL);
1291 for (tmp = dcns; tmp; tmp = tmp->next) {
1292 dcn = (description_x *)tmp->data;
1296 locale = g_list_insert_sorted_with_data(
1297 locale, (gpointer)dcn->lang,
1298 __comparefunc, NULL);
1300 for (tmp = aths; tmp; tmp = tmp->next) {
1301 ath = (author_x *)tmp->data;
1305 locale = g_list_insert_sorted_with_data(
1306 locale, (gpointer)ath->lang,
1307 __comparefunc, NULL);
1313 static gint __check_icon_resolution(const char *orig_icon_path,
1314 char **new_icon_path)
1318 char *icon_filename;
1319 char modified_iconpath[BUFSIZE];
1320 char icon_path[BUFSIZE];
1324 if (orig_icon_path == NULL)
1327 ret = system_info_get_platform_int(
1328 "http://tizen.org/feature/screen.dpi", &dpi);
1329 if (ret != SYSTEM_INFO_ERROR_NONE)
1332 if (dpi >= LDPI_MIN && dpi <= LDPI_MAX) {
1333 dpi_path[0] = "LDPI";
1334 dpi_path[1] = "ldpi";
1335 } else if (dpi >= MDPI_MIN && dpi <= MDPI_MAX) {
1336 dpi_path[0] = "MDPI";
1337 dpi_path[1] = "mdpi";
1338 } else if (dpi >= HDPI_MIN && dpi <= HDPI_MAX) {
1339 dpi_path[0] = "HDPI";
1340 dpi_path[1] = "hdpi";
1341 } else if (dpi >= XHDPI_MIN && dpi <= XHDPI_MAX) {
1342 dpi_path[0] = "XHDPI";
1343 dpi_path[1] = "xhdpi";
1344 } else if (dpi >= XXHDPI_MIN && dpi <= XXHDPI_MAX) {
1345 dpi_path[0] = "XXHDPI";
1346 dpi_path[1] = "xxhdpi";
1348 _LOGE("Unidentified dpi[%d]", dpi);
1352 icon_filename = strrchr(orig_icon_path, '/');
1353 if (icon_filename == NULL)
1357 strlen(orig_icon_path) - (strlen(icon_filename) - 1),
1358 "%s", orig_icon_path);
1359 for (i = 0; i < 2; i++) {
1360 snprintf(modified_iconpath, BUFSIZE - 1, "%s/%s%s",
1361 icon_path, dpi_path[i], icon_filename);
1362 if (access(modified_iconpath, F_OK) != -1) {
1363 /* if exists, return modified icon path */
1364 *new_icon_path = strdup(modified_iconpath);
1372 static gint __compare_icon(gconstpointer a, gconstpointer b)
1374 icon_x *icon = (icon_x *)a;
1377 if (icon->lang != NULL && strcasecmp(icon->lang, DEFAULT_LOCALE) != 0)
1380 if (icon->dpi != NULL)
1383 if (__check_icon_resolution(icon->text, &icon_path) == 0) {
1385 icon->text = icon_path;
1391 static gint __compare_icon_with_dpi(gconstpointer a, gconstpointer b)
1393 icon_x *icon = (icon_x *)a;
1394 int dpi = GPOINTER_TO_INT(b);
1396 if (icon->lang != NULL && strcasecmp(icon->lang, DEFAULT_LOCALE) != 0)
1399 if (icon->dpi == NULL)
1402 if (__check_dpi(icon->dpi, dpi) == 0)
1408 static gint __compare_icon_with_lang(gconstpointer a, gconstpointer b)
1410 icon_x *icon = (icon_x *)a;
1411 char *lang = (char *)b;
1414 if (icon->dpi != NULL)
1417 if (strcasecmp(icon->lang, lang) == 0) {
1418 if (strcasecmp(icon->lang, DEFAULT_LOCALE) == 0) {
1419 /* icon for no locale. check existance of
1420 * folder-hierachied default icons
1422 if (__check_icon_resolution(icon->text,
1425 icon->text = icon_path;
1434 static gint __compare_icon_with_lang_dpi(gconstpointer a, gconstpointer b)
1437 icon_x *icon = (icon_x *)a;
1438 char *lang = (char *)b;
1441 ret = system_info_get_platform_int(
1442 "http://tizen.org/feature/screen.dpi", &dpi);
1443 if (ret != SYSTEM_INFO_ERROR_NONE)
1446 if (strcasecmp(icon->lang, lang) == 0 &&
1447 __check_dpi(icon->dpi, dpi) == 0)
1453 static char *__find_icon(GList *icons, const char *lang)
1460 /* first, find icon whose locale and dpi with given lang and
1461 * system's dpi has matched
1463 tmp = g_list_find_custom(icons, lang,
1464 (GCompareFunc)__compare_icon_with_lang_dpi);
1466 icon = (icon_x *)tmp->data;
1467 return (char *)icon->text;
1470 /* if first has failed, find icon whose locale has matched */
1471 tmp = g_list_find_custom(icons, lang,
1472 (GCompareFunc)__compare_icon_with_lang);
1474 icon = (icon_x *)tmp->data;
1475 return (char *)icon->text;
1478 /* if second has failed, find icon whose dpi has matched with
1481 ret = system_info_get_platform_int(
1482 "http://tizen.org/feature/screen.dpi", &dpi);
1483 if (ret == SYSTEM_INFO_ERROR_NONE) {
1484 tmp = g_list_find_custom(icons, GINT_TO_POINTER(dpi),
1485 (GCompareFunc)__compare_icon_with_dpi);
1487 icon = (icon_x *)tmp->data;
1488 return (char *)icon->text;
1492 /* last, find default icon marked as "No Locale" */
1493 tmp = g_list_find_custom(icons, NULL, (GCompareFunc)__compare_icon);
1495 icon = (icon_x *)tmp->data;
1496 return (char *)icon->text;
1502 static void __extract_data(const char *locale, GList *lbls, GList *lcns,
1503 GList *icns, GList *dcns, GList *aths, char **label,
1504 char **license, char **icon, char **description, char **author)
1512 for (tmp = lbls; tmp; tmp = tmp->next) {
1513 lbl = (label_x *)tmp->data;
1517 if (strcmp(lbl->lang, locale) == 0) {
1518 *label = (char *)lbl->text;
1523 for (tmp = lcns; tmp; tmp = tmp->next) {
1524 lcn = (license_x *)tmp->data;
1528 if (strcmp(lcn->lang, locale) == 0) {
1529 *license = (char *)lcn->text;
1535 *icon = __find_icon(icns, locale);
1537 for (tmp = dcns; tmp; tmp = tmp->next) {
1538 dcn = (description_x *)tmp->data;
1542 if (strcmp(dcn->lang, locale) == 0) {
1543 *description = (char *)dcn->text;
1548 for (tmp = aths; tmp; tmp = tmp->next) {
1549 ath = (author_x *)tmp->data;
1553 if (strcmp(ath->lang, locale) == 0) {
1554 *author = (char *)ath->text;
1561 static int __insert_mainapp_localized_info(sqlite3 *db, application_x *app,
1562 const char *locale, const char *label, const char *icon)
1564 static const char query[] =
1565 "INSERT OR REPLACE INTO package_localized_info ("
1566 " package, package_locale, package_label, package_icon,"
1567 " package_description, package_license, package_author) "
1569 " COALESCE((SELECT package_label FROM package_localized_info"
1570 " WHERE package=? AND package_locale=?), ?),"
1571 " COALESCE((SELECT package_icon FROM package_localized_info"
1572 " WHERE package=? AND package_icon=?), ?),"
1573 " (SELECT package_description FROM package_localized_info"
1574 " WHERE package=? AND package_locale=?),"
1575 " (SELECT package_description FROM package_localized_info"
1576 " WHERE package=? AND package_locale=?),"
1577 " (SELECT package_description FROM package_localized_info"
1578 " WHERE package=? AND package_locale=?))";
1583 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1584 if (ret != SQLITE_OK) {
1585 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1589 __BIND_TEXT(db, stmt, idx++, app->package);
1590 __BIND_TEXT(db, stmt, idx++, locale);
1591 __BIND_TEXT(db, stmt, idx++, app->package);
1592 __BIND_TEXT(db, stmt, idx++, locale);
1593 __BIND_TEXT(db, stmt, idx++, label);
1594 __BIND_TEXT(db, stmt, idx++, app->package);
1595 __BIND_TEXT(db, stmt, idx++, locale);
1596 __BIND_TEXT(db, stmt, idx++, icon);
1597 __BIND_TEXT(db, stmt, idx++, app->package);
1598 __BIND_TEXT(db, stmt, idx++, locale);
1599 __BIND_TEXT(db, stmt, idx++, app->package);
1600 __BIND_TEXT(db, stmt, idx++, locale);
1601 __BIND_TEXT(db, stmt, idx++, app->package);
1602 __BIND_TEXT(db, stmt, idx++, locale);
1604 ret = sqlite3_step(stmt);
1605 if (ret != SQLITE_DONE) {
1606 _LOGE("step failed: %s", sqlite3_errmsg(db));
1607 sqlite3_finalize(stmt);
1611 sqlite3_finalize(stmt);
1616 static int __insert_app_localized_info(sqlite3 *db, application_x *app)
1618 static const char query[] =
1619 "INSERT INTO package_app_localized_info (app_id, app_locale,"
1620 " app_label, app_icon) "
1621 "VALUES (?, ?, ?, ?)";
1631 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1632 if (ret != SQLITE_OK) {
1633 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1637 locales = __create_locale_list(app->label, NULL, app->icon, NULL, NULL);
1638 for (tmp = locales; tmp; tmp = tmp->next) {
1639 locale = (const char *)tmp->data;
1642 __extract_data(locale, app->label, NULL, app->icon, NULL, NULL,
1643 &label, NULL, &icon, NULL, NULL);
1644 if (!label && !icon)
1648 __BIND_TEXT(db, stmt, idx++, app->appid);
1649 __BIND_TEXT(db, stmt, idx++, locale);
1650 __BIND_TEXT(db, stmt, idx++, label);
1651 __BIND_TEXT(db, stmt, idx++, icon);
1653 ret = sqlite3_step(stmt);
1654 if (ret != SQLITE_DONE) {
1655 _LOGE("step failed: %s", sqlite3_errmsg(db));
1656 g_list_free(locales);
1657 sqlite3_finalize(stmt);
1661 sqlite3_reset(stmt);
1663 if (strcasecmp(app->mainapp, "true") == 0) {
1664 if (__insert_mainapp_localized_info(db, app, locale,
1666 _LOGE("insert mainapp localized info failed");
1670 g_list_free(locales);
1671 sqlite3_finalize(stmt);
1676 static int __insert_package_privilege_info(sqlite3 *db, manifest_x *mfx)
1678 static const char query[] =
1679 "INSERT INTO package_privilege_info (package, privilege, type) "
1687 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1688 if (ret != SQLITE_OK) {
1689 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1693 for (tmp = mfx->privileges; tmp; tmp = tmp->next) {
1694 priv = (privilege_x *)tmp->data;
1699 __BIND_TEXT(db, stmt, idx++, mfx->package);
1700 __BIND_TEXT(db, stmt, idx++, priv->value);
1701 __BIND_TEXT(db, stmt, idx++, priv->type);
1703 ret = sqlite3_step(stmt);
1704 if (ret != SQLITE_DONE) {
1705 _LOGE("step failed: %s", sqlite3_errmsg(db));
1706 sqlite3_finalize(stmt);
1709 sqlite3_reset(stmt);
1712 sqlite3_finalize(stmt);
1717 static int __insert_package_plugin_execution_info(sqlite3 *db,
1720 static const char query[] =
1721 "INSERT INTO package_plugin_info "
1722 "(pkgid, appid, plugin_type, plugin_name) "
1723 "VALUES (?, ?, ?, ?)";
1733 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1734 if (ret != SQLITE_OK) {
1735 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1739 for (tmp = mfx->plugin; tmp; tmp = tmp->next) {
1740 plugin = (plugin_x *)tmp->data;
1745 __BIND_TEXT(db, stmt, idx++, plugin->pkgid);
1746 __BIND_TEXT(db, stmt, idx++, plugin->appid);
1747 __BIND_TEXT(db, stmt, idx++, plugin->plugin_type);
1748 __BIND_TEXT(db, stmt, idx++, plugin->plugin_name);
1750 ret = sqlite3_step(stmt);
1751 if (ret != SQLITE_DONE) {
1752 _LOGE("step failed: %s", sqlite3_errmsg(db));
1753 sqlite3_finalize(stmt);
1756 sqlite3_reset(stmt);
1759 sqlite3_finalize(stmt);
1764 static int __delete_package_plugin_execution_info(sqlite3 *db,
1767 static const char query[] =
1768 "DELETE FROM package_plugin_info WHERE pkgid=?";
1772 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1773 if (ret != SQLITE_OK) {
1774 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1778 __BIND_TEXT(db, stmt, 1, pkgid);
1780 ret = sqlite3_step(stmt);
1781 if (ret != SQLITE_DONE) {
1782 _LOGE("step failed: %s", sqlite3_errmsg(db));
1783 sqlite3_finalize(stmt);
1787 sqlite3_finalize(stmt);
1792 static int __insert_package_appdefined_privilege_info(sqlite3 *db,
1795 static const char query[] =
1796 "INSERT INTO package_appdefined_privilege_info "
1797 "(package, privilege, license, type) "
1798 "VALUES (?, ?, ?, ?)";
1803 appdefined_privilege_x *priv;
1805 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1806 if (ret != SQLITE_OK) {
1807 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1811 for (tmp = mfx->appdefined_privileges; tmp; tmp = tmp->next) {
1812 priv = (appdefined_privilege_x *)tmp->data;
1817 __BIND_TEXT(db, stmt, idx++, mfx->package);
1818 __BIND_TEXT(db, stmt, idx++, priv->value);
1819 __BIND_TEXT(db, stmt, idx++, priv->license);
1820 __BIND_TEXT(db, stmt, idx++, priv->type);
1822 ret = sqlite3_step(stmt);
1823 if (ret != SQLITE_DONE) {
1824 _LOGE("step failed: %s", sqlite3_errmsg(db));
1825 sqlite3_finalize(stmt);
1828 sqlite3_reset(stmt);
1831 sqlite3_finalize(stmt);
1836 static int __insert_package_dependency_info(sqlite3 *db, manifest_x *mfx)
1838 static const char query[] =
1839 "INSERT INTO package_dependency_info"
1840 " (package, depends_on, type, required_version) "
1841 "VALUES (?, ?, ?, ?)";
1848 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1849 if (ret != SQLITE_OK) {
1850 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1854 for (tmp = mfx->dependencies; tmp; tmp = tmp->next) {
1855 dep = (dependency_x *)tmp->data;
1860 __BIND_TEXT(db, stmt, idx++, mfx->package);
1861 __BIND_TEXT(db, stmt, idx++, dep->depends_on);
1862 __BIND_TEXT(db, stmt, idx++, dep->type);
1863 __BIND_TEXT(db, stmt, idx++, dep->required_version);
1865 ret = sqlite3_step(stmt);
1866 if (ret != SQLITE_DONE) {
1867 _LOGE("step failed: %s", sqlite3_errmsg(db));
1868 sqlite3_finalize(stmt);
1871 sqlite3_reset(stmt);
1874 sqlite3_finalize(stmt);
1879 /* _PRODUCT_LAUNCHING_ENHANCED_
1880 * app->indicatordisplay, app->portraitimg, app->landscapeimg,
1881 * app->guestmode_appstatus
1883 static int __insert_application_info(sqlite3 *db, manifest_x *mfx)
1885 static const char query[] =
1886 "INSERT INTO package_app_info (app_id, app_component,"
1887 " app_exec, app_nodisplay, app_type, app_onboot, app_multiple,"
1888 " app_autorestart, app_taskmanage, app_hwacceleration,"
1889 " app_screenreader, app_mainapp, app_recentimage,"
1890 " app_launchcondition, app_indicatordisplay, app_portraitimg,"
1891 " app_landscapeimg, app_guestmodevisibility,"
1892 " app_permissiontype, app_preload, app_submode,"
1893 " app_submode_mainid, app_installed_storage, app_process_pool,"
1894 " app_launch_mode, app_ui_gadget, app_support_mode,"
1895 " app_support_disable, component_type, package, app_tep_name,"
1896 " app_zip_mount_file, app_background_category,"
1897 " app_package_type, app_root_path, app_api_version,"
1898 " app_effective_appid, app_splash_screen_display,"
1899 " app_package_system, app_removable,"
1900 " app_package_installed_time, app_support_ambient,"
1901 " app_external_path, app_setup_appid) "
1903 " ?, LOWER(?), ?, LOWER(?), LOWER(?),"
1904 " LOWER(?), LOWER(?), ?,"
1908 " ?, LOWER(?), LOWER(?),"
1910 " COALESCE(?, 'single'), LOWER(?), ?,"
1911 " LOWER(?), ?, ?, ?,"
1915 " LOWER(?), LOWER(?),"
1924 const char *effective_appid;
1927 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1928 if (ret != SQLITE_OK) {
1929 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1933 for (tmp = mfx->application; tmp; tmp = tmp->next) {
1934 app = (application_x *)tmp->data;
1938 bg_category = __convert_background_category(
1939 app->background_category);
1940 effective_appid = __find_effective_appid(app->metadata);
1943 __BIND_TEXT(db, stmt, idx++, app->appid);
1944 __BIND_TEXT(db, stmt, idx++, app->component_type);
1945 __BIND_TEXT(db, stmt, idx++, app->exec);
1946 __BIND_TEXT(db, stmt, idx++, __get_bool(app->nodisplay, false));
1947 __BIND_TEXT(db, stmt, idx++, app->type);
1948 __BIND_TEXT(db, stmt, idx++, __get_bool(app->onboot, false));
1949 __BIND_TEXT(db, stmt, idx++, __get_bool(app->multiple, false));
1950 __BIND_TEXT(db, stmt, idx++,
1951 __get_bool(app->autorestart, false));
1952 __BIND_TEXT(db, stmt, idx++,
1953 __get_bool(app->taskmanage, false));
1954 __BIND_TEXT(db, stmt, idx++, app->hwacceleration);
1955 __BIND_TEXT(db, stmt, idx++, app->screenreader);
1956 __BIND_TEXT(db, stmt, idx++, __get_bool(app->mainapp, false));
1957 __BIND_TEXT(db, stmt, idx++, app->recentimage);
1958 __BIND_TEXT(db, stmt, idx++, app->launchcondition);
1959 __BIND_TEXT(db, stmt, idx++,
1960 __get_bool(app->indicatordisplay, true));
1961 __BIND_TEXT(db, stmt, idx++, app->portraitimg);
1962 __BIND_TEXT(db, stmt, idx++, app->landscapeimg);
1963 __BIND_TEXT(db, stmt, idx++,
1964 __get_bool(app->guestmode_visibility, true));
1965 __BIND_TEXT(db, stmt, idx++, app->permission_type);
1966 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->preload, false));
1967 __BIND_TEXT(db, stmt, idx++, __get_bool(app->submode, false));
1968 __BIND_TEXT(db, stmt, idx++, app->submode_mainid);
1969 __BIND_TEXT(db, stmt, idx++, mfx->installed_storage);
1970 __BIND_TEXT(db, stmt, idx++,
1971 __get_bool(app->process_pool, false));
1972 __BIND_TEXT(db, stmt, idx++, app->launch_mode);
1973 __BIND_TEXT(db, stmt, idx++, __get_bool(app->ui_gadget, false));
1974 __BIND_TEXT(db, stmt, idx++,
1975 app->support_mode ? app->support_mode : "0");
1976 __BIND_TEXT(db, stmt, idx++,
1977 __get_bool(mfx->support_disable, false));
1978 __BIND_TEXT(db, stmt, idx++, app->component_type);
1979 __BIND_TEXT(db, stmt, idx++, mfx->package);
1980 __BIND_TEXT(db, stmt, idx++, mfx->tep_name);
1981 __BIND_TEXT(db, stmt, idx++, mfx->zip_mount_file);
1982 __BIND_INT(db, stmt, idx++, bg_category);
1983 __BIND_TEXT(db, stmt, idx++, mfx->type ? mfx->type : "tpk");
1984 __BIND_TEXT(db, stmt, idx++, mfx->root_path);
1985 __BIND_TEXT(db, stmt, idx++, app->api_version);
1986 __BIND_TEXT(db, stmt, idx++, effective_appid);
1987 __BIND_TEXT(db, stmt, idx++,
1988 __get_bool(app->splash_screen_display, true));
1989 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->system, false));
1990 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->removable, false));
1991 __BIND_TEXT(db, stmt, idx++, mfx->installed_time);
1992 __BIND_TEXT(db, stmt, idx++,
1993 __get_bool(app->support_ambient, false));
1994 __BIND_TEXT(db, stmt, idx++, mfx->external_path);
1995 __BIND_TEXT(db, stmt, idx++, app->setup_appid);
1997 ret = sqlite3_step(stmt);
1998 if (ret != SQLITE_DONE) {
1999 _LOGE("step failed: %s", sqlite3_errmsg(db));
2000 sqlite3_finalize(stmt);
2004 sqlite3_reset(stmt);
2006 if (__insert_appcontrol_info(db, app)) {
2007 sqlite3_finalize(stmt);
2010 if (__insert_category_info(db, app)) {
2011 sqlite3_finalize(stmt);
2014 if (__insert_metadata_info(db, app)) {
2015 sqlite3_finalize(stmt);
2018 if (__insert_datacontrol_info(db, app)) {
2019 sqlite3_finalize(stmt);
2022 ss_list = __find_splashscreens(app->splashscreens);
2023 if (__insert_splashscreen_info(db, app, ss_list)) {
2024 g_list_free(ss_list);
2025 sqlite3_finalize(stmt);
2028 g_list_free(ss_list);
2029 if (__insert_app_localized_info(db, app)) {
2030 sqlite3_finalize(stmt);
2035 sqlite3_finalize(stmt);
2040 static int __insert_package_update_info(sqlite3 *db, manifest_x *mfx)
2042 static const char query[] =
2043 "INSERT INTO package_update_info (package, update_version) "
2049 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2050 if (ret != SQLITE_OK) {
2051 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2056 __BIND_TEXT(db, stmt, idx++, mfx->package);
2057 __BIND_TEXT(db, stmt, idx, mfx->version);
2058 ret = sqlite3_step(stmt);
2059 if (ret != SQLITE_DONE) {
2060 _LOGE("step failed: %s", sqlite3_errmsg(db));
2061 sqlite3_finalize(stmt);
2064 sqlite3_finalize(stmt);
2069 static int __insert_package_localized_info(sqlite3 *db, manifest_x *mfx)
2071 static const char query[] =
2072 "INSERT INTO package_localized_info (package, package_locale,"
2073 " package_label, package_icon, package_description,"
2074 " package_license, package_author) "
2075 "VALUES (?, ?, ?, ?, ?, ?, ?)";
2088 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2089 if (ret != SQLITE_OK) {
2090 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2094 locales = __create_locale_list(mfx->label, mfx->license, mfx->icon,
2095 mfx->description, mfx->author);
2096 for (tmp = locales; tmp; tmp = tmp->next) {
2097 locale = (const char *)tmp->data;
2103 __extract_data(locale, mfx->label, mfx->license, mfx->icon,
2104 mfx->description, mfx->author,
2105 &label, &license, &icon, &description, &author);
2106 if (!label && !license && !icon && !description && !author)
2110 __BIND_TEXT(db, stmt, idx++, mfx->package);
2111 __BIND_TEXT(db, stmt, idx++, locale);
2112 __BIND_TEXT(db, stmt, idx++, label);
2113 __BIND_TEXT(db, stmt, idx++, icon);
2114 __BIND_TEXT(db, stmt, idx++, description);
2115 __BIND_TEXT(db, stmt, idx++, license);
2116 __BIND_TEXT(db, stmt, idx++, author);
2118 ret = sqlite3_step(stmt);
2119 if (ret != SQLITE_DONE) {
2120 _LOGE("step failed: %s", sqlite3_errmsg(db));
2121 g_list_free(locales);
2122 sqlite3_finalize(stmt);
2126 sqlite3_reset(stmt);
2129 g_list_free(locales);
2130 sqlite3_finalize(stmt);
2135 static int __insert_package_info(sqlite3 *db, manifest_x *mfx)
2137 static const char query[] =
2138 "INSERT INTO package_info (package, package_type,"
2139 " package_version, package_api_version, package_tep_name,"
2140 " package_zip_mount_file, install_location, package_size,"
2141 " package_removable, package_preload, package_readonly,"
2142 " package_update, package_appsetting, package_nodisplay,"
2143 " package_system, author_name, author_email, author_href,"
2144 " installed_time, installed_storage, storeclient_id,"
2145 " mainapp_id, package_url, root_path, external_path,"
2146 " csc_path, package_support_mode, package_support_disable) "
2150 " LOWER(?), LOWER(?), LOWER(?),"
2151 " LOWER(?), LOWER(?), LOWER(?),"
2152 " LOWER(?), ?, ?, ?,"
2159 const char *author_name = NULL;
2160 const char *author_email = NULL;
2161 const char *author_href = NULL;
2163 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2164 if (ret != SQLITE_OK) {
2165 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2169 if (mfx->author && mfx->author->data) {
2170 author_name = ((author_x *)mfx->author->data)->text;
2171 author_email = ((author_x *)mfx->author->data)->email;
2172 author_href = ((author_x *)mfx->author->data)->href;
2175 __BIND_TEXT(db, stmt, idx++, mfx->package);
2176 __BIND_TEXT(db, stmt, idx++, mfx->type);
2177 __BIND_TEXT(db, stmt, idx++, mfx->version);
2178 __BIND_TEXT(db, stmt, idx++, mfx->api_version);
2179 __BIND_TEXT(db, stmt, idx++, mfx->tep_name);
2180 __BIND_TEXT(db, stmt, idx++, mfx->zip_mount_file);
2181 __BIND_TEXT(db, stmt, idx++, mfx->installlocation);
2182 __BIND_TEXT(db, stmt, idx++, mfx->package_size);
2183 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->removable, true));
2184 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->preload, false));
2185 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->readonly, false));
2186 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->update, false));
2187 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->appsetting, false));
2188 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->nodisplay_setting, false));
2189 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->system, false));
2190 __BIND_TEXT(db, stmt, idx++, author_name);
2191 __BIND_TEXT(db, stmt, idx++, author_email);
2192 __BIND_TEXT(db, stmt, idx++, author_href);
2193 __BIND_TEXT(db, stmt, idx++, mfx->installed_time);
2194 __BIND_TEXT(db, stmt, idx++, mfx->installed_storage);
2195 __BIND_TEXT(db, stmt, idx++, mfx->storeclient_id);
2196 __BIND_TEXT(db, stmt, idx++, mfx->mainapp_id);
2197 __BIND_TEXT(db, stmt, idx++, mfx->package_url);
2198 __BIND_TEXT(db, stmt, idx++, mfx->root_path);
2199 __BIND_TEXT(db, stmt, idx++, mfx->external_path);
2200 __BIND_TEXT(db, stmt, idx++, mfx->csc_path);
2201 __BIND_TEXT(db, stmt, idx++,
2202 mfx->support_mode ? mfx->support_mode : "0");
2203 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->support_disable, false));
2205 ret = sqlite3_step(stmt);
2206 if (ret != SQLITE_DONE) {
2207 _LOGE("step failed: %s", sqlite3_errmsg(db));
2208 sqlite3_finalize(stmt);
2212 sqlite3_finalize(stmt);
2214 if (__insert_package_update_info(db, mfx))
2216 if (__insert_package_localized_info(db, mfx))
2218 if (__insert_application_info(db, mfx))
2220 if (__insert_package_privilege_info(db, mfx))
2222 if (__insert_package_appdefined_privilege_info(db, mfx))
2224 if (__insert_package_dependency_info(db, mfx))
2230 API int pkgmgr_parser_insert_manifest_info_in_usr_db(manifest_x *mfx, uid_t uid)
2237 _LOGE("invalid parameter");
2238 return PM_PARSER_R_EINVAL;
2241 dbpath = __get_parser_db_path(uid);
2243 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2244 if (ret != SQLITE_OK) {
2245 _LOGE("open db failed: %d", ret);
2246 return PM_PARSER_R_ERROR;
2249 __BEGIN_TRANSACTION(db);
2250 __DO_TRANSACTION(db, __insert_package_info(db, mfx));
2251 __END_TRANSACTION(db);
2253 sqlite3_close_v2(db);
2255 return PM_PARSER_R_OK;
2258 API int pkgmgr_parser_insert_manifest_info_in_db(manifest_x *mfx)
2260 return pkgmgr_parser_insert_manifest_info_in_usr_db(mfx, __getuid());
2263 static int __delete_package_info(sqlite3 *db, const char *pkgid)
2265 static const char query[] =
2266 "DELETE FROM package_info WHERE package=?";
2270 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2271 if (ret != SQLITE_OK) {
2272 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2276 __BIND_TEXT(db, stmt, 1, pkgid);
2278 ret = sqlite3_step(stmt);
2279 if (ret != SQLITE_DONE) {
2280 _LOGE("step failed: %s", sqlite3_errmsg(db));
2281 sqlite3_finalize(stmt);
2285 sqlite3_finalize(stmt);
2290 API int pkgmgr_parser_delete_manifest_info_from_usr_db(manifest_x *mfx,
2298 _LOGE("invalid parameter");
2299 return PM_PARSER_R_EINVAL;
2302 dbpath = __get_parser_db_path(uid);
2304 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2305 if (ret != SQLITE_OK) {
2306 _LOGE("open db failed: %d", ret);
2307 return PM_PARSER_R_ERROR;
2310 __BEGIN_TRANSACTION(db);
2311 __DO_TRANSACTION(db, __delete_package_info(db, mfx->package));
2312 __END_TRANSACTION(db);
2314 sqlite3_close_v2(db);
2316 return PM_PARSER_R_OK;
2319 API int pkgmgr_parser_delete_manifest_info_from_db(manifest_x *mfx)
2321 return pkgmgr_parser_delete_manifest_info_from_usr_db(mfx, __getuid());
2324 API int pkgmgr_parser_update_manifest_info_in_usr_db(manifest_x *mfx, uid_t uid)
2331 _LOGE("invalid parameter");
2332 return PM_PARSER_R_EINVAL;
2335 dbpath = __get_parser_db_path(uid);
2337 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2338 if (ret != SQLITE_OK) {
2339 _LOGE("open db failed: %d", ret);
2340 return PM_PARSER_R_ERROR;
2343 __BEGIN_TRANSACTION(db);
2344 __DO_TRANSACTION(db, __delete_package_info(db, mfx->package));
2345 __DO_TRANSACTION(db, __insert_package_info(db, mfx));
2346 __END_TRANSACTION(db);
2348 sqlite3_close_v2(db);
2350 return PM_PARSER_R_OK;
2353 API int pkgmgr_parser_update_manifest_info_in_db(manifest_x *mfx)
2355 return pkgmgr_parser_update_manifest_info_in_usr_db(mfx, __getuid());
2358 static int __set_global_app_disable_for_uid(sqlite3 *db, const char *appid,
2359 uid_t uid, bool is_disable)
2361 static const char query[] =
2362 "INSERT OR REPLACE INTO package_app_info_for_uid ("
2363 " app_id, uid, is_disabled, is_splash_screen_enabled) "
2365 " (SELECT app_splash_screen_display FROM package_app_info"
2366 " WHERE app_id=?))";
2371 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2372 if (ret != SQLITE_OK) {
2373 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2377 __BIND_TEXT(db, stmt, idx++, appid);
2378 __BIND_INT(db, stmt, idx++, uid);
2379 __BIND_TEXT(db, stmt, idx++, is_disable ? "true" : "false");
2380 __BIND_TEXT(db, stmt, idx++, appid);
2382 ret = sqlite3_step(stmt);
2383 if (ret != SQLITE_DONE) {
2384 _LOGE("step failed: %s", sqlite3_errmsg(db));
2385 sqlite3_finalize(stmt);
2389 sqlite3_finalize(stmt);
2394 API int pkgmgr_parser_update_global_app_disable_for_uid_info_in_db(
2395 const char *appid, uid_t uid, int is_disable)
2401 if (appid == NULL) {
2402 _LOGE("invalid parameter");
2403 return PM_PARSER_R_EINVAL;
2406 dbpath = __get_parser_db_path(GLOBAL_USER);
2408 ret = __open_db(GLOBAL_USER, dbpath, &db, SQLITE_OPEN_READWRITE);
2409 if (ret != SQLITE_OK) {
2410 _LOGE("open db failed: %d", ret);
2411 return PM_PARSER_R_ERROR;
2414 __BEGIN_TRANSACTION(db);
2415 __DO_TRANSACTION(db, __set_global_app_disable_for_uid(db, appid,
2416 uid, (bool)is_disable));
2417 __END_TRANSACTION(db);
2419 sqlite3_close_v2(db);
2421 return PM_PARSER_R_OK;
2424 static int __set_app_disable(sqlite3 *db, const char *appid, uid_t uid,
2427 static const char query[] =
2428 "UPDATE package_app_info SET app_disable=? "
2434 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2435 if (ret != SQLITE_OK) {
2436 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2440 __BIND_TEXT(db, stmt, idx++, is_disable ? "true" : "false");
2441 __BIND_TEXT(db, stmt, idx++, appid);
2443 ret = sqlite3_step(stmt);
2444 if (ret != SQLITE_DONE) {
2445 _LOGE("step failed: %s", sqlite3_errmsg(db));
2446 sqlite3_finalize(stmt);
2450 sqlite3_finalize(stmt);
2455 API int pkgmgr_parser_update_app_disable_info_in_usr_db(const char *appid,
2456 uid_t uid, int is_disable)
2462 if (appid == NULL) {
2463 _LOGE("invalid parameter");
2464 return PM_PARSER_R_EINVAL;
2467 dbpath = __get_parser_db_path(uid);
2469 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2470 if (ret != SQLITE_OK) {
2471 _LOGE("open db failed: %d", ret);
2472 return PM_PARSER_R_ERROR;
2475 __BEGIN_TRANSACTION(db);
2476 __DO_TRANSACTION(db, __set_app_disable(db, appid, uid,
2478 __END_TRANSACTION(db);
2480 sqlite3_close_v2(db);
2482 return PM_PARSER_R_OK;
2485 API int pkgmgr_parser_update_app_disable_info_in_db(const char *appid,
2488 return pkgmgr_parser_update_app_disable_info_in_usr_db(appid,
2489 __getuid(), is_disable);
2492 static int __set_pkg_disable(sqlite3 *db, const char *pkgid, uid_t uid,
2495 static const char query[] =
2496 "UPDATE package_info SET package_disable=? "
2502 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2503 if (ret != SQLITE_OK) {
2504 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2508 __BIND_TEXT(db, stmt, idx++, is_disable ? "true" : "false");
2509 __BIND_TEXT(db, stmt, idx++, pkgid);
2511 ret = sqlite3_step(stmt);
2512 if (ret != SQLITE_DONE) {
2513 _LOGE("step failed: %s", sqlite3_errmsg(db));
2514 sqlite3_finalize(stmt);
2518 sqlite3_finalize(stmt);
2523 API int pkgmgr_parser_update_pkg_disable_info_in_usr_db(const char *pkgid,
2524 uid_t uid, int is_disable)
2530 if (pkgid == NULL) {
2531 _LOGE("invalid parameter");
2532 return PM_PARSER_R_EINVAL;
2535 dbpath = __get_parser_db_path(uid);
2537 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2538 if (ret != SQLITE_OK) {
2539 _LOGE("open db failed: %d", ret);
2540 return PM_PARSER_R_ERROR;
2543 __BEGIN_TRANSACTION(db);
2544 __DO_TRANSACTION(db, __set_pkg_disable(db, pkgid, uid,
2546 __END_TRANSACTION(db);
2548 sqlite3_close_v2(db);
2550 return PM_PARSER_R_OK;
2553 API int pkgmgr_parser_update_pkg_disable_info_in_db(const char *pkgid,
2556 return pkgmgr_parser_update_pkg_disable_info_in_usr_db(pkgid,
2557 __getuid(), is_disable);
2560 static int __set_global_app_splash_screen_for_uid(sqlite3 *db,
2561 const char *appid, uid_t uid, bool is_enabled)
2563 static const char query[] =
2564 "INSERT OR REPLACE INTO package_app_info_for_uid("
2565 " appid, uid, is_splash_screen_enabled) "
2571 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2572 if (ret != SQLITE_OK) {
2573 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2577 __BIND_TEXT(db, stmt, idx++, appid);
2578 __BIND_INT(db, stmt, idx++, uid);
2579 __BIND_TEXT(db, stmt, idx++, is_enabled ? "true" : "false");
2581 ret = sqlite3_step(stmt);
2582 if (ret != SQLITE_DONE) {
2583 _LOGE("step failed: %s", sqlite3_errmsg(db));
2584 sqlite3_finalize(stmt);
2588 sqlite3_finalize(stmt);
2593 API int pkgmgr_parser_update_global_app_splash_screen_display_info_in_usr_db(
2594 const char *appid, uid_t uid, int flag)
2600 if (appid == NULL) {
2601 _LOGE("invalid parameter");
2602 return PM_PARSER_R_EINVAL;
2605 dbpath = __get_parser_db_path(GLOBAL_USER);
2607 ret = __open_db(GLOBAL_USER, dbpath, &db, SQLITE_OPEN_READWRITE);
2608 if (ret != SQLITE_OK) {
2609 _LOGE("open db failed: %d", ret);
2610 return PM_PARSER_R_ERROR;
2613 __BEGIN_TRANSACTION(db);
2614 __DO_TRANSACTION(db, __set_global_app_splash_screen_for_uid(db,
2615 appid, uid, (bool)flag));
2616 __END_TRANSACTION(db);
2618 sqlite3_close_v2(db);
2620 return PM_PARSER_R_OK;
2623 static int __set_app_splash_screen(sqlite3 *db, const char *appid,
2626 static const char query[] =
2627 "UPDATE package_app_info SET app_splash_screen_display=? "
2633 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2634 if (ret != SQLITE_OK) {
2635 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2639 __BIND_TEXT(db, stmt, idx++, is_enabled ? "true" : "false");
2640 __BIND_TEXT(db, stmt, idx++, appid);
2642 ret = sqlite3_step(stmt);
2643 if (ret != SQLITE_DONE) {
2644 _LOGE("step failed: %s", sqlite3_errmsg(db));
2645 sqlite3_finalize(stmt);
2649 sqlite3_finalize(stmt);
2654 API int pkgmgr_parser_update_app_splash_screen_display_info_in_usr_db(
2655 const char *appid, uid_t uid, int flag)
2661 if (appid == NULL) {
2662 _LOGE("invalid parameter");
2663 return PM_PARSER_R_EINVAL;
2666 dbpath = __get_parser_db_path(uid);
2668 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2669 if (ret != SQLITE_OK) {
2670 _LOGE("open db failed: %d", ret);
2671 return PM_PARSER_R_ERROR;
2674 __BEGIN_TRANSACTION(db);
2675 __DO_TRANSACTION(db, __set_app_splash_screen(db, appid, (bool)flag));
2676 __END_TRANSACTION(db);
2678 sqlite3_close_v2(db);
2680 return PM_PARSER_R_OK;
2683 API int pkgmgr_parser_update_app_splash_screen_display_info_in_db(
2684 const char *appid, int flag)
2686 return pkgmgr_parser_update_app_splash_screen_display_info_in_usr_db(
2687 appid, __getuid(), flag);
2690 static int __set_app_label(sqlite3 *db, const char *appid, const char *label)
2692 static const char query[] =
2693 "UPDATE package_app_localized_info SET app_label=? "
2694 "WHERE app_id=? AND app_label IS NOT NULL";
2699 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2700 if (ret != SQLITE_OK) {
2701 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2705 __BIND_TEXT(db, stmt, idx++, label);
2706 __BIND_TEXT(db, stmt, idx++, appid);
2708 ret = sqlite3_step(stmt);
2709 if (ret != SQLITE_DONE) {
2710 _LOGE("step failed: %s", sqlite3_errmsg(db));
2711 sqlite3_finalize(stmt);
2715 sqlite3_finalize(stmt);
2720 API int pkgmgr_parser_update_app_label_info_in_usr_db(const char *appid,
2721 uid_t uid, const char *label)
2727 if (appid == NULL) {
2728 _LOGE("invalid parameter");
2729 return PM_PARSER_R_EINVAL;
2732 dbpath = __get_parser_db_path(uid);
2734 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2735 if (ret != SQLITE_OK) {
2736 _LOGE("open db failed: %d", ret);
2737 return PM_PARSER_R_ERROR;
2740 __BEGIN_TRANSACTION(db);
2741 __DO_TRANSACTION(db, __set_app_label(db, appid, label));
2742 __END_TRANSACTION(db);
2744 sqlite3_close_v2(db);
2746 return PM_PARSER_R_OK;
2749 API int pkgmgr_parser_update_app_label_info_in_db(const char *appid,
2752 return pkgmgr_parser_update_app_label_info_in_usr_db(appid, __getuid(),
2756 static int __set_app_icon(sqlite3 *db, const char *appid, const char *icon_path)
2758 static const char query[] =
2759 "UPDATE package_app_localized_info SET app_icon=? "
2760 "WHERE app_id=? AND app_icon IS NOT NULL";
2765 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2766 if (ret != SQLITE_OK) {
2767 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2771 __BIND_TEXT(db, stmt, idx++, icon_path);
2772 __BIND_TEXT(db, stmt, idx++, appid);
2774 ret = sqlite3_step(stmt);
2775 if (ret != SQLITE_DONE) {
2776 _LOGE("step failed: %s", sqlite3_errmsg(db));
2777 sqlite3_finalize(stmt);
2781 sqlite3_finalize(stmt);
2786 API int pkgmgr_parser_update_app_icon_info_in_usr_db(const char *appid,
2787 uid_t uid, const char *icon_path)
2793 if (appid == NULL) {
2794 _LOGE("invalid parameter");
2795 return PM_PARSER_R_EINVAL;
2798 dbpath = __get_parser_db_path(uid);
2800 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2801 if (ret != SQLITE_OK) {
2802 _LOGE("open db failed: %d", ret);
2803 return PM_PARSER_R_ERROR;
2806 __BEGIN_TRANSACTION(db);
2807 __DO_TRANSACTION(db, __set_app_icon(db, appid, icon_path));
2808 __END_TRANSACTION(db);
2810 sqlite3_close_v2(db);
2812 return PM_PARSER_R_OK;
2815 API int pkgmgr_parser_update_app_icon_info_in_db(const char *appid,
2816 const char *icon_path)
2818 return pkgmgr_parser_update_app_icon_info_in_usr_db(appid, __getuid(),
2822 static int __set_tep_path(sqlite3 *db, const char *pkgid, const char *tep_path)
2824 static const char query[] =
2825 "UPDATE package_info SET package_tep_name=? "
2831 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2832 if (ret != SQLITE_OK) {
2833 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2837 __BIND_TEXT(db, stmt, idx++, tep_path);
2838 __BIND_TEXT(db, stmt, idx++, pkgid);
2840 ret = sqlite3_step(stmt);
2841 if (ret != SQLITE_DONE) {
2842 _LOGE("step failed: %s", sqlite3_errmsg(db));
2843 sqlite3_finalize(stmt);
2847 sqlite3_finalize(stmt);
2852 API int pkgmgr_parser_update_tep_info_in_usr_db(const char *pkgid,
2853 const char *tep_path, uid_t uid)
2859 if (pkgid == NULL) {
2860 _LOGE("invalid parameter");
2861 return PM_PARSER_R_EINVAL;
2864 dbpath = __get_parser_db_path(uid);
2866 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2867 if (ret != SQLITE_OK) {
2868 _LOGE("open db failed: %d", ret);
2869 return PM_PARSER_R_ERROR;
2872 __BEGIN_TRANSACTION(db);
2873 __DO_TRANSACTION(db, __set_tep_path(db, pkgid, tep_path));
2874 __END_TRANSACTION(db);
2876 sqlite3_close_v2(db);
2878 return PM_PARSER_R_OK;
2881 API int pkgmgr_parser_update_tep_info_in_db(const char *pkgid,
2882 const char *tep_path)
2884 return pkgmgr_parser_update_tep_info_in_usr_db(pkgid, tep_path,
2888 static int __convert_update_type(pkgmgrinfo_updateinfo_update_type type,
2889 const char **update_type)
2891 if (type == PMINFO_UPDATEINFO_NONE)
2892 *update_type = PMINFO_UPDATEINFO_TYPE_NONE;
2893 else if (type == PMINFO_UPDATEINFO_FORCE)
2894 *update_type = PMINFO_UPDATEINFO_TYPE_FORCE;
2895 else if (type == PMINFO_UPDATEINFO_OPTIONAL)
2896 *update_type = PMINFO_UPDATEINFO_TYPE_OPTIONAL;
2902 static int __register_pkg_update_info(sqlite3 *db, updateinfo_x *info,
2903 const char *update_type)
2905 static const char query[] =
2906 "UPDATE package_update_info "
2907 "SET update_version=?, update_type=? "
2913 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2914 if (ret != SQLITE_OK) {
2915 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2919 __BIND_TEXT(db, stmt, idx++, info->version);
2920 __BIND_TEXT(db, stmt, idx++, update_type);
2921 __BIND_TEXT(db, stmt, idx++, info->pkgid);
2923 ret = sqlite3_step(stmt);
2924 if (ret != SQLITE_DONE) {
2925 _LOGE("step failed: %s", sqlite3_errmsg(db));
2926 sqlite3_finalize(stmt);
2930 sqlite3_finalize(stmt);
2935 API int pkgmgr_parser_register_pkg_update_info_in_usr_db(
2936 pkgmgrinfo_updateinfo_h handle, uid_t uid)
2939 updateinfo_x *update_info;
2940 updateinfo_x *prev_update_info;
2941 pkgmgrinfo_updateinfo_h prev_update_handle;
2942 pkgmgrinfo_pkginfo_h pkginfo;
2943 pkgmgrinfo_version_compare_type compare_result;
2945 const char *update_type;
2949 if (handle == NULL) {
2950 _LOGE("invalid parameter");
2951 return PM_PARSER_R_EINVAL;
2954 update_info = (updateinfo_x *)handle;
2955 if (update_info->pkgid == NULL || update_info->version == NULL)
2956 return PM_PARSER_R_EINVAL;
2957 if (__convert_update_type(update_info->type, &update_type) != 0)
2958 return PM_PARSER_R_EINVAL;
2960 ret = pkgmgrinfo_updateinfo_get_usr_updateinfo(update_info->pkgid,
2961 &prev_update_handle, uid);
2962 if (ret != PMINFO_R_OK)
2963 return PM_PARSER_R_ERROR;
2965 prev_update_info = (updateinfo_x *)prev_update_handle;
2966 ret = pkgmgrinfo_compare_package_version(update_info->version,
2967 prev_update_info->version, &compare_result);
2968 if (ret != PMINFO_R_OK) {
2969 pkgmgrinfo_updateinfo_destroy(prev_update_handle);
2970 return PM_PARSER_R_ERROR;
2973 if (compare_result == PMINFO_VERSION_SAME &&
2974 prev_update_info->type == PMINFO_UPDATEINFO_NONE) {
2975 _LOGI("Given update info version[%s] of pkgid[%s] "
2977 update_info->version, update_info->pkgid);
2978 pkgmgrinfo_updateinfo_destroy(prev_update_handle);
2979 return PM_PARSER_R_OK;
2981 pkgmgrinfo_updateinfo_destroy(prev_update_handle);
2983 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(update_info->pkgid, uid,
2985 if (ret != PMINFO_R_OK)
2986 return PM_PARSER_R_ERROR;
2988 ret = pkgmgrinfo_pkginfo_is_global(pkginfo, &is_global_pkg);
2989 if (ret != PMINFO_R_OK) {
2990 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
2991 return PM_PARSER_R_ERROR;
2993 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
2995 dbpath = __get_parser_db_path(is_global_pkg ? GLOBAL_USER : uid);
2997 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2998 if (ret != SQLITE_OK) {
2999 _LOGE("open db failed: %d", ret);
3000 return PM_PARSER_R_ERROR;
3003 __BEGIN_TRANSACTION(db);
3004 __DO_TRANSACTION(db, __register_pkg_update_info(db, update_info,
3006 __END_TRANSACTION(db);
3008 sqlite3_close_v2(db);
3010 return PM_PARSER_R_OK;
3013 API int pkgmgr_parser_register_pkg_update_info_in_db(
3014 pkgmgrinfo_updateinfo_h handle)
3016 return pkgmgr_parser_register_pkg_update_info_in_usr_db(handle,
3020 static int __unregister_pkg_update_info(sqlite3 *db, const char *pkgid)
3022 static const char query[] =
3023 "UPDATE package_update_info SET update_type='none' "
3029 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
3030 if (ret != SQLITE_OK) {
3031 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
3035 __BIND_TEXT(db, stmt, idx++, pkgid);
3037 ret = sqlite3_step(stmt);
3038 if (ret != SQLITE_DONE) {
3039 _LOGE("step failed: %s", sqlite3_errmsg(db));
3040 sqlite3_finalize(stmt);
3044 sqlite3_finalize(stmt);
3049 API int pkgmgr_parser_unregister_pkg_update_info_in_usr_db(const char *pkgid,
3055 pkgmgrinfo_pkginfo_h pkginfo;
3058 if (pkgid == NULL) {
3059 _LOGE("invalid parameter");
3060 return PM_PARSER_R_EINVAL;
3063 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &pkginfo);
3064 if (ret != PMINFO_R_OK)
3065 return PM_PARSER_R_EINVAL;
3067 ret = pkgmgrinfo_pkginfo_is_global(pkginfo, &is_global_pkg);
3068 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
3069 if (ret != PMINFO_R_OK)
3070 return PM_PARSER_R_ERROR;
3072 dbpath = __get_parser_db_path(is_global_pkg ? GLOBAL_USER : uid);
3074 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
3075 if (ret != SQLITE_OK) {
3076 _LOGE("open db failed: %d", ret);
3077 return PM_PARSER_R_ERROR;
3080 __BEGIN_TRANSACTION(db);
3081 __DO_TRANSACTION(db, __unregister_pkg_update_info(db, pkgid));
3082 __END_TRANSACTION(db);
3084 sqlite3_close_v2(db);
3086 return PM_PARSER_R_OK;
3089 API int pkgmgr_parser_unregister_pkg_update_info_in_db(const char *pkgid)
3091 return pkgmgr_parser_unregister_pkg_update_info_in_usr_db(pkgid,
3095 static int __unregister_all_pkg_update_info(sqlite3 *db)
3097 static const char query[] =
3098 "UPDATE package_update_info SET update_type='none'";
3102 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
3103 if (ret != SQLITE_OK) {
3104 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
3108 ret = sqlite3_step(stmt);
3109 if (ret != SQLITE_DONE) {
3110 _LOGE("step failed: %s", sqlite3_errmsg(db));
3111 sqlite3_finalize(stmt);
3115 sqlite3_finalize(stmt);
3120 API int pkgmgr_parser_unregister_all_pkg_update_info_in_usr_db(uid_t uid)
3126 dbpath = __get_parser_db_path(uid);
3128 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
3129 if (ret != SQLITE_OK) {
3130 _LOGE("open db failed: %d", ret);
3131 return PM_PARSER_R_ERROR;
3134 __BEGIN_TRANSACTION(db);
3135 __DO_TRANSACTION(db, __unregister_all_pkg_update_info(db));
3136 __END_TRANSACTION(db);
3138 sqlite3_close_v2(db);
3140 return PM_PARSER_R_OK;
3143 API int pkgmgr_parser_unregister_all_pkg_update_info_in_db(void)
3145 return pkgmgr_parser_unregister_all_pkg_update_info_in_usr_db(
3149 API int pkgmgr_parser_register_pkg_plugin_info_in_usr_db(
3150 manifest_x *mfx, uid_t uid)
3157 return PM_PARSER_R_EINVAL;
3158 dbpath = __get_parser_db_path(uid);
3159 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
3160 if (ret != SQLITE_OK) {
3161 _LOGE("open db failed: %d", ret);
3162 return PM_PARSER_R_ERROR;
3165 __BEGIN_TRANSACTION(db);
3166 __DO_TRANSACTION(db, __insert_package_plugin_execution_info(db, mfx));
3167 __END_TRANSACTION(db);
3169 sqlite3_close_v2(db);
3171 return PM_PARSER_R_OK;
3174 API int pkgmgr_parser_register_pkg_plugin_info_in_db(manifest_x *mfx)
3176 return pkgmgr_parser_register_pkg_plugin_info_in_usr_db(mfx, __getuid());
3179 API int pkgmgr_parser_update_pkg_plugin_info_in_usr_db(
3180 manifest_x *mfx, uid_t uid)
3187 return PM_PARSER_R_EINVAL;
3188 dbpath = __get_parser_db_path(uid);
3189 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
3190 if (ret != SQLITE_OK) {
3191 _LOGE("open db failed: %d", ret);
3192 return PM_PARSER_R_ERROR;
3195 __BEGIN_TRANSACTION(db);
3196 __DO_TRANSACTION(db, __delete_package_plugin_execution_info(db, mfx->package));
3197 __DO_TRANSACTION(db, __insert_package_plugin_execution_info(db, mfx));
3198 __END_TRANSACTION(db);
3200 sqlite3_close_v2(db);
3202 return PM_PARSER_R_OK;
3205 API int pkgmgr_parser_update_pkg_plugin_info_in_db(manifest_x *mfx)
3207 return pkgmgr_parser_update_pkg_plugin_info_in_usr_db(mfx, __getuid());
3210 API int pkgmgr_parser_unregister_pkg_plugin_info_in_usr_db(
3211 const char *pkgid, uid_t uid)
3217 dbpath = __get_parser_db_path(uid);
3218 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
3219 if (ret != SQLITE_OK) {
3220 _LOGE("open db failed: %d", ret);
3221 return PM_PARSER_R_ERROR;
3224 __BEGIN_TRANSACTION(db);
3225 __DO_TRANSACTION(db, __delete_package_plugin_execution_info(db, pkgid));
3226 __END_TRANSACTION(db);
3228 sqlite3_close_v2(db);
3230 return PM_PARSER_R_OK;
3233 API int pkgmgr_parser_unregister_pkg_plugin_info_in_db(const char *pkgid)
3235 return pkgmgr_parser_unregister_pkg_plugin_info_in_usr_db(pkgid, __getuid());