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 EXCLUSIVE", 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 API int pkgmgr_parser_initialize_parser_db(uid_t uid)
383 dbpath = __get_parser_db_path(uid);
384 if (access(dbpath, F_OK) != -1) {
385 _LOGE("Manifest db for user %d is already exists", uid);
386 return PM_PARSER_R_ERROR;
389 ret = sqlite3_open_v2(dbpath, &db,
390 SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
391 if (ret != SQLITE_OK) {
392 _LOGE("open db failed: %d", ret);
393 return PM_PARSER_R_ERROR;
396 if (__initialize_db(db, dbpath, uid)) {
397 sqlite3_close_v2(db);
398 return PM_PARSER_R_ERROR;
400 sqlite3_close_v2(db);
402 return PM_PARSER_R_OK;
405 API int pkgmgr_parser_initialize_cert_db(void)
411 dbpath = __get_cert_db_path();
412 if (access(dbpath, F_OK) != -1) {
413 _LOGE("Cert db is already exists");
414 return PM_PARSER_R_ERROR;
417 ret = sqlite3_open_v2(dbpath, &db,
418 SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
419 if (ret != SQLITE_OK) {
420 _LOGE("open db failed: %d", ret);
421 return PM_PARSER_R_ERROR;
424 if (__initialize_db(db, dbpath, GLOBAL_USER)) {
425 sqlite3_close_v2(db);
426 return PM_PARSER_R_ERROR;
428 sqlite3_close_v2(db);
430 return PM_PARSER_R_OK;
433 API int pkgmgr_parser_create_and_initialize_db(uid_t uid)
437 struct passwd *result;
440 ret = getpwnam_r(APPFW_USER, &pwd, buf, sizeof(buf), &result);
441 if (result == NULL) {
443 _LOGE("no such user: %s", APPFW_USER);
445 _LOGE("getpwnam_r failed: %d", errno);
446 return PM_PARSER_R_ERROR;
449 if (getuid() != OWNER_ROOT && getuid() != pwd.pw_uid) {
450 _LOGE("Only root or app_fw user is allowed");
451 return PM_PARSER_R_EINVAL;
454 if (pkgmgr_parser_initialize_parser_db(uid))
455 return PM_PARSER_R_ERROR;
457 if (uid == OWNER_ROOT || uid == GLOBAL_USER)
458 if (pkgmgr_parser_initialize_cert_db())
459 return PM_PARSER_R_ERROR;
461 return PM_PARSER_R_OK;
464 #define RESOURCED_BUS_NAME "org.tizen.resourced"
465 #define RESOURCED_PROC_PATH "/Org/Tizen/ResourceD/Process"
466 #define RESOURCED_PROC_INTERFACE "org.tizen.resourced.process"
467 #define RESOURCED_PROC_METHOD "ProcExclude"
468 static void __send_wakeup_signal_to_resourced(pid_t pid)
470 GError *error = NULL;
471 GDBusConnection *conn;
475 conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
477 _LOGE("Failed to connect to dbus: %s", error->message);
482 proxy = g_dbus_proxy_new_sync(conn,
483 G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
484 NULL, RESOURCED_BUS_NAME,
485 RESOURCED_PROC_PATH, RESOURCED_PROC_INTERFACE,
488 _LOGE("failed to get proxy object: %s", error->message);
490 g_object_unref(conn);
494 reply = g_dbus_proxy_call_sync(proxy, RESOURCED_PROC_METHOD,
495 g_variant_new("(si)", "wakeup", pid),
496 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
498 _LOGE("failed to get reply from resourced");
500 _LOGE("failed to send request: %s", error->message);
504 g_object_unref(proxy);
505 g_object_unref(conn);
508 static void __check_db_lock(const char *dbpath)
517 char cmdline[BUFSIZE];
521 if (stat(dbpath, &sb) == -1) {
522 _LOGE("get db file(%s) status failed: %d", dbpath, errno);
526 fp = fopen("/proc/locks", "r");
528 _LOGE("Failed to open lock info: %d", errno);
532 while (fscanf(fp, "%*s %*s %*s %*s %d %x:%x:%lu %*s %*s",
533 &pid, &maj, &min, &ino) != EOF) {
534 if (maj != major(sb.st_dev) || min != minor(sb.st_dev) ||
535 ino != sb.st_ino || pid == getpid())
538 snprintf(cmdline, sizeof(cmdline), "/proc/%d/cmdline", pid);
539 fp_cmdline = fopen(cmdline, "r");
541 if (fp_cmdline != NULL) {
542 len = fread(name, sizeof(char), sizeof(name) - 1,
545 if (name[len - 1] == '\n')
546 name[len - 1] = '\0';
553 _LOGE("%s (%d) has lock on pkgmgr db(%s)!", name, pid, dbpath);
554 __send_wakeup_signal_to_resourced(pid);
560 #define BUSY_WAITING_USEC (1000000 / 10 / 2) /* 0.05 sec */
561 #define BUSY_WAITING_MAX 40 /* wait for max 2 sec */
562 static int __db_busy_handler(void *data, int count)
564 if (count < (BUSY_WAITING_MAX / 2)) {
565 usleep(BUSY_WAITING_USEC);
567 } else if (count == (BUSY_WAITING_MAX / 2)) {
568 __check_db_lock((const char *)data);
569 usleep(BUSY_WAITING_USEC);
571 } else if (count < BUSY_WAITING_MAX) {
572 usleep(BUSY_WAITING_USEC);
575 /* sqlite3_prepare_v2 will return SQLITE_BUSY */
580 static int __open_db(uid_t uid, const char *path, sqlite3 **db, int flags)
584 /* FIXME: always open with OPEN_CREATE flag for keeping previous
587 if (flags & SQLITE_OPEN_READWRITE)
588 flags = flags | SQLITE_OPEN_CREATE;
590 ret = sqlite3_open_v2(path, db, flags, NULL);
591 if (ret != SQLITE_OK)
594 ret = sqlite3_busy_handler(*db, __db_busy_handler, (void *)path);
595 if (ret != SQLITE_OK) {
596 _LOGE("failed to register busy handler: %s",
597 sqlite3_errmsg(*db));
598 sqlite3_close_v2(*db);
602 if (flags & SQLITE_OPEN_CREATE) {
603 ret = __initialize_db(*db, path, uid);
605 _LOGE("failed to initialize db: %s", path);
606 sqlite3_close_v2(*db);
611 ret = sqlite3_exec(*db, "PRAGMA foreign_keys=ON", NULL, NULL, NULL);
612 if (ret != SQLITE_OK) {
613 _LOGE("failed to enable foreign key support: %s",
614 sqlite3_errmsg(*db));
615 sqlite3_close_v2(*db);
623 static int __convert_background_category(GList *category_list)
629 if (category_list == NULL)
632 for (tmp = category_list; tmp; tmp = tmp->next) {
633 category_data = (char *)tmp->data;
634 if (category_data == NULL)
636 if (!strcmp(category_data, APP_BG_CATEGORY_MEDIA_STR))
637 ret |= APP_BG_CATEGORY_MEDIA_VAL;
638 else if (!strcmp(category_data, APP_BG_CATEGORY_DOWNLOAD_STR))
639 ret |= APP_BG_CATEGORY_DOWNLOAD_VAL;
640 else if (!strcmp(category_data, APP_BG_CATEGORY_BGNETWORK_STR))
641 ret |= APP_BG_CATEGORY_BGNETWORK_VAL;
642 else if (!strcmp(category_data, APP_BG_CATEGORY_LOCATION_STR))
643 ret |= APP_BG_CATEGORY_LOCATION_VAL;
644 else if (!strcmp(category_data, APP_BG_CATEGORY_SENSOR_STR))
645 ret |= APP_BG_CATEGORY_SENSOR_VAL;
646 else if (!strcmp(category_data, APP_BG_CATEGORY_IOTCOMM_STR))
647 ret |= APP_BG_CATEGORY_IOTCOMM_VAL;
648 else if (!strcmp(category_data, APP_BG_CATEGORY_SYSTEM))
649 ret |= APP_BG_CATEGORY_SYSTEM_VAL;
651 _LOGE("Unidentified category [%s]", category_data);
657 #define EFFECTIVE_APPID_KEY "http://tizen.org/metadata/effective-appid"
658 static const char *__find_effective_appid(GList *metadata_list)
663 for (tmp = metadata_list; tmp; tmp = tmp->next) {
664 md = (metadata_x *)tmp->data;
665 if (md == NULL || md->key == NULL)
668 if (strcmp(md->key, EFFECTIVE_APPID_KEY) == 0) {
677 static int __insert_appcontrol_privilege_info(sqlite3 *db, const char *appid,
680 static const char query[] =
681 "INSERT INTO package_app_app_control_privilege (app_id,"
682 " app_control, privilege) VALUES (?, ?, ?)";
686 char app_control[BUFSIZE];
693 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
694 if (ret != SQLITE_OK) {
695 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
699 for (tmp = ac->privileges; tmp; tmp = tmp->next) {
700 privilege = (char *)tmp->data;
701 if (privilege == NULL || !strlen(privilege))
705 snprintf(app_control, sizeof(app_control), "%s|%s|%s",
706 ac->operation ? (strlen(ac->operation) > 0 ?
707 ac->operation : "NULL") : "NULL",
708 ac->uri ? (strlen(ac->uri) > 0 ?
709 ac->uri : "NULL") : "NULL",
710 ac->mime ? (strlen(ac->mime) > 0 ?
711 ac->mime : "NULL") : "NULL");
712 __BIND_TEXT(db, stmt, idx++, appid);
713 __BIND_TEXT(db, stmt, idx++, app_control);
714 __BIND_TEXT(db, stmt, idx++, privilege);
716 ret = sqlite3_step(stmt);
717 if (ret != SQLITE_DONE) {
718 _LOGE("step failed: %s", sqlite3_errmsg(db));
719 sqlite3_finalize(stmt);
726 sqlite3_finalize(stmt);
731 static int __insert_appcontrol_info(sqlite3 *db, application_x *app)
733 static const char query[] =
734 "INSERT INTO package_app_app_control (app_id, app_control,"
740 char app_control[BUFSIZE];
744 if (app->appcontrol == NULL)
747 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
748 if (ret != SQLITE_OK) {
749 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
753 for (tmp = app->appcontrol; tmp; tmp = tmp->next) {
754 ac = (appcontrol_x *)tmp->data;
758 snprintf(app_control, sizeof(app_control), "%s|%s|%s",
759 ac->operation ? (strlen(ac->operation) > 0 ?
760 ac->operation : "NULL") : "NULL",
761 ac->uri ? (strlen(ac->uri) > 0 ?
762 ac->uri : "NULL") : "NULL",
763 ac->mime ? (strlen(ac->mime) > 0 ?
764 ac->mime : "NULL") : "NULL");
765 __BIND_TEXT(db, stmt, idx++, app->appid);
766 __BIND_TEXT(db, stmt, idx++, app_control);
767 __BIND_TEXT(db, stmt, idx++, ac->visibility);
769 ret = sqlite3_step(stmt);
770 if (ret != SQLITE_DONE) {
771 _LOGE("step failed: %s", sqlite3_errmsg(db));
772 sqlite3_finalize(stmt);
776 if (__insert_appcontrol_privilege_info(db, app->appid, ac)) {
777 sqlite3_finalize(stmt);
784 sqlite3_finalize(stmt);
789 static int __insert_category_info(sqlite3 *db, application_x *app)
791 static const char query[] =
792 "INSERT INTO package_app_app_category (app_id, category) "
798 const char *category;
800 if (app->category == NULL)
803 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
804 if (ret != SQLITE_OK) {
805 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
809 for (tmp = app->category; tmp; tmp = tmp->next) {
810 category = (const char *)tmp->data;
811 if (category == NULL)
814 __BIND_TEXT(db, stmt, idx++, app->appid);
815 __BIND_TEXT(db, stmt, idx++, category);
817 ret = sqlite3_step(stmt);
818 if (ret != SQLITE_DONE) {
819 _LOGE("step failed: %s", sqlite3_errmsg(db));
820 sqlite3_finalize(stmt);
827 sqlite3_finalize(stmt);
832 static int __insert_metadata_info(sqlite3 *db, application_x *app)
834 static const char query[] =
835 "INSERT INTO package_app_app_metadata (app_id,"
836 " md_key, md_value) VALUES (?, ?, ?)";
843 if (app->metadata == NULL)
846 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
847 if (ret != SQLITE_OK) {
848 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
852 for (tmp = app->metadata; tmp; tmp = tmp->next) {
853 md = (metadata_x *)tmp->data;
857 __BIND_TEXT(db, stmt, idx++, app->appid);
858 __BIND_TEXT(db, stmt, idx++, md->key);
859 __BIND_TEXT(db, stmt, idx++, md->value);
861 ret = sqlite3_step(stmt);
862 if (ret != SQLITE_DONE) {
863 _LOGE("step failed: %s", sqlite3_errmsg(db));
864 sqlite3_finalize(stmt);
871 sqlite3_finalize(stmt);
876 static int __insert_app_data_control_privilege_info(sqlite3 *db,
877 datacontrol_x *datacontrol)
879 static const char query[] =
880 "INSERT INTO package_app_data_control_privilege (providerid,"
881 " privilege, type) VALUES (?, ?, ?)";
889 if (datacontrol == NULL)
892 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
893 if (ret != SQLITE_OK) {
894 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
898 for (privileges = datacontrol->privileges; privileges;
899 privileges = privileges->next) {
900 priv = (char *)privileges->data;
905 __BIND_TEXT(db, stmt, idx++, datacontrol->providerid);
906 __BIND_TEXT(db, stmt, idx++, priv);
907 __BIND_TEXT(db, stmt, idx++, datacontrol->type);
909 ret = sqlite3_step(stmt);
910 if (ret != SQLITE_DONE) {
911 _LOGE("step failed: %s", sqlite3_errmsg(db));
912 sqlite3_finalize(stmt);
919 sqlite3_finalize(stmt);
923 static int __insert_datacontrol_info(sqlite3 *db, application_x *app)
925 static const char query[] =
926 "INSERT INTO package_app_data_control (app_id, providerid,"
927 " access, type, trusted) VALUES (?, ?, ?, ?, ?)";
934 if (app->datacontrol == NULL)
937 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
938 if (ret != SQLITE_OK) {
939 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
943 for (tmp = app->datacontrol; tmp; tmp = tmp->next) {
944 dc = (datacontrol_x *)tmp->data;
948 __BIND_TEXT(db, stmt, idx++, app->appid);
949 __BIND_TEXT(db, stmt, idx++, dc->providerid);
950 __BIND_TEXT(db, stmt, idx++, dc->access);
951 __BIND_TEXT(db, stmt, idx++, dc->type);
952 __BIND_TEXT(db, stmt, idx++, dc->trusted);
954 ret = sqlite3_step(stmt);
955 if (ret != SQLITE_DONE) {
956 _LOGE("step failed: %s", sqlite3_errmsg(db));
957 sqlite3_finalize(stmt);
961 if (dc->privileges &&
962 __insert_app_data_control_privilege_info(db, dc)) {
963 sqlite3_finalize(stmt);
970 sqlite3_finalize(stmt);
975 /* TODO: move to installer */
976 static int __check_dpi(const char *dpi_char, int dpi_int)
978 if (dpi_char == NULL)
981 if (strcasecmp(dpi_char, LDPI) == 0) {
982 if (dpi_int >= LDPI_MIN && dpi_int <= LDPI_MAX)
986 } else if (strcasecmp(dpi_char, MDPI) == 0) {
987 if (dpi_int >= MDPI_MIN && dpi_int <= MDPI_MAX)
991 } else if (strcasecmp(dpi_char, HDPI) == 0) {
992 if (dpi_int >= HDPI_MIN && dpi_int <= HDPI_MAX)
996 } else if (strcasecmp(dpi_char, XHDPI) == 0) {
997 if (dpi_int >= XHDPI_MIN && dpi_int <= XHDPI_MAX)
1001 } else if (strcasecmp(dpi_char, XXHDPI) == 0) {
1002 if (dpi_int >= XXHDPI_MIN && dpi_int <= XXHDPI_MAX)
1010 static gint __compare_splashscreen_with_orientation_dpi(gconstpointer a,
1013 splashscreen_x *ss = (splashscreen_x *)a;
1014 const char *orientation = (const char *)b;
1018 if (ss->operation || ss->dpi == NULL)
1021 ret = system_info_get_platform_int(
1022 "http://tizen.org/feature/screen.dpi", &dpi);
1023 if (ret != SYSTEM_INFO_ERROR_NONE)
1026 if (strcasecmp(ss->orientation, orientation) == 0 &&
1027 __check_dpi(ss->dpi, dpi) == 0)
1033 static gint __compare_splashscreen_with_orientation(gconstpointer a,
1036 splashscreen_x *ss = (splashscreen_x *)a;
1037 const char *orientation = (const char *)b;
1039 if (ss->operation || ss->dpi)
1042 if (strcasecmp(ss->orientation, orientation) == 0)
1048 static splashscreen_x *__find_default_splashscreen(GList *splashscreens,
1049 const char *orientation)
1053 tmp = g_list_find_custom(splashscreens, orientation,
1055 __compare_splashscreen_with_orientation_dpi);
1057 return (splashscreen_x *)tmp->data;
1059 tmp = g_list_find_custom(splashscreens, orientation,
1060 (GCompareFunc)__compare_splashscreen_with_orientation);
1062 return (splashscreen_x *)tmp->data;
1067 static void __find_appcontrol_splashscreen_with_dpi(gpointer data,
1070 splashscreen_x *ss = (splashscreen_x *)data;
1071 GList **list = (GList **)user_data;
1075 if (ss->operation == NULL || ss->dpi == NULL)
1078 ret = system_info_get_platform_int(
1079 "http://tizen.org/feature/screen.dpi", &dpi);
1080 if (ret != SYSTEM_INFO_ERROR_NONE)
1083 if (__check_dpi(ss->dpi, dpi) != 0)
1086 *list = g_list_append(*list, ss);
1089 static void __find_appcontrol_splashscreen(gpointer data, gpointer user_data)
1091 splashscreen_x *ss = (splashscreen_x *)data;
1092 GList **list = (GList **)user_data;
1093 splashscreen_x *ss_tmp;
1096 if (ss->operation == NULL || ss->dpi)
1099 for (tmp = *list; tmp; tmp = tmp->next) {
1100 ss_tmp = (splashscreen_x *)tmp->data;
1101 if (ss_tmp->operation
1102 && strcmp(ss_tmp->operation, ss->operation) == 0
1103 && strcmp(ss_tmp->orientation, ss->orientation) == 0)
1107 *list = g_list_append(*list, ss);
1110 static GList *__find_splashscreens(GList *splashscreens)
1115 if (splashscreens == NULL)
1118 g_list_foreach(splashscreens,
1119 __find_appcontrol_splashscreen_with_dpi, &list);
1120 g_list_foreach(splashscreens,
1121 __find_appcontrol_splashscreen, &list);
1123 ss = __find_default_splashscreen(splashscreens, "portrait");
1125 list = g_list_append(list, ss);
1126 ss = __find_default_splashscreen(splashscreens, "landscape");
1128 list = g_list_append(list, ss);
1133 static int __insert_splashscreen_info(sqlite3 *db, application_x *app,
1136 static const char query[] =
1137 "INSERT INTO package_app_splash_screen (app_id, src, type,"
1138 " orientation, indicatordisplay, operation, color_depth) "
1139 "VALUES (?, ?, ?, ?, ?, ?, ?)";
1146 if (app->splashscreens == NULL)
1149 if (ss_list == NULL)
1152 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1153 if (ret != SQLITE_OK) {
1154 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1158 for (tmp = ss_list; tmp; tmp = tmp->next) {
1159 ss = (splashscreen_x *)tmp->data;
1163 __BIND_TEXT(db, stmt, idx++, app->appid);
1164 __BIND_TEXT(db, stmt, idx++, ss->src);
1165 __BIND_TEXT(db, stmt, idx++, ss->type);
1166 __BIND_TEXT(db, stmt, idx++, ss->orientation);
1167 __BIND_TEXT(db, stmt, idx++, ss->indicatordisplay);
1168 __BIND_TEXT(db, stmt, idx++, ss->operation);
1169 __BIND_TEXT(db, stmt, idx++, ss->color_depth);
1171 ret = sqlite3_step(stmt);
1172 if (ret != SQLITE_DONE) {
1173 _LOGE("step failed: %s", sqlite3_errmsg(db));
1174 sqlite3_finalize(stmt);
1178 sqlite3_reset(stmt);
1181 sqlite3_finalize(stmt);
1186 static void __trimfunc(GList *trim_list)
1190 GList *list = g_list_first(trim_list);
1193 trim_data = (char *)list->data;
1196 if (strcmp(trim_data, prev) == 0) {
1197 trim_list = g_list_remove(trim_list,
1199 list = g_list_first(trim_list);
1208 list = g_list_next(list);
1212 static gint __comparefunc(gconstpointer a, gconstpointer b, gpointer userdata)
1214 if (a == NULL || b == NULL)
1216 if (strcmp((char *)a, (char *)b) == 0)
1218 if (strcmp((char *)a, (char *)b) < 0)
1220 if (strcmp((char *)a, (char *)b) > 0)
1225 /* TODO: refactor inserting localized info */
1226 static GList *__create_locale_list(GList *lbls, GList *lcns, GList *icns,
1227 GList *dcns, GList *aths)
1229 GList *locale = NULL;
1237 for (tmp = lbls; tmp; tmp = tmp->next) {
1238 lbl = (label_x *)tmp->data;
1242 locale = g_list_insert_sorted_with_data(
1243 locale, (gpointer)lbl->lang,
1244 __comparefunc, NULL);
1246 for (tmp = lcns; tmp; tmp = tmp->next) {
1247 lcn = (license_x *)tmp->data;
1251 locale = g_list_insert_sorted_with_data(
1252 locale, (gpointer)lcn->lang,
1253 __comparefunc, NULL);
1255 for (tmp = icns; tmp; tmp = tmp->next) {
1256 icn = (icon_x *)tmp->data;
1260 locale = g_list_insert_sorted_with_data(
1261 locale, (gpointer)icn->lang,
1262 __comparefunc, NULL);
1264 for (tmp = dcns; tmp; tmp = tmp->next) {
1265 dcn = (description_x *)tmp->data;
1269 locale = g_list_insert_sorted_with_data(
1270 locale, (gpointer)dcn->lang,
1271 __comparefunc, NULL);
1273 for (tmp = aths; tmp; tmp = tmp->next) {
1274 ath = (author_x *)tmp->data;
1278 locale = g_list_insert_sorted_with_data(
1279 locale, (gpointer)ath->lang,
1280 __comparefunc, NULL);
1286 static gint __check_icon_resolution(const char *orig_icon_path,
1287 char **new_icon_path)
1291 char *icon_filename;
1292 char modified_iconpath[BUFSIZE];
1293 char icon_path[BUFSIZE];
1297 if (orig_icon_path == NULL)
1300 ret = system_info_get_platform_int(
1301 "http://tizen.org/feature/screen.dpi", &dpi);
1302 if (ret != SYSTEM_INFO_ERROR_NONE)
1305 if (dpi >= LDPI_MIN && dpi <= LDPI_MAX) {
1306 dpi_path[0] = "LDPI";
1307 dpi_path[1] = "ldpi";
1308 } else if (dpi >= MDPI_MIN && dpi <= MDPI_MAX) {
1309 dpi_path[0] = "MDPI";
1310 dpi_path[1] = "mdpi";
1311 } else if (dpi >= HDPI_MIN && dpi <= HDPI_MAX) {
1312 dpi_path[0] = "HDPI";
1313 dpi_path[1] = "hdpi";
1314 } else if (dpi >= XHDPI_MIN && dpi <= XHDPI_MAX) {
1315 dpi_path[0] = "XHDPI";
1316 dpi_path[1] = "xhdpi";
1317 } else if (dpi >= XXHDPI_MIN && dpi <= XXHDPI_MAX) {
1318 dpi_path[0] = "XXHDPI";
1319 dpi_path[1] = "xxhdpi";
1321 _LOGE("Unidentified dpi[%d]", dpi);
1325 icon_filename = strrchr(orig_icon_path, '/');
1326 if (icon_filename == NULL)
1330 strlen(orig_icon_path) - (strlen(icon_filename) - 1),
1331 "%s", orig_icon_path);
1332 for (i = 0; i < 2; i++) {
1333 snprintf(modified_iconpath, BUFSIZE - 1, "%s/%s%s",
1334 icon_path, dpi_path[i], icon_filename);
1335 if (access(modified_iconpath, F_OK) != -1) {
1336 /* if exists, return modified icon path */
1337 *new_icon_path = strdup(modified_iconpath);
1345 static gint __compare_icon(gconstpointer a, gconstpointer b)
1347 icon_x *icon = (icon_x *)a;
1350 if (icon->lang != NULL && strcasecmp(icon->lang, DEFAULT_LOCALE) != 0)
1353 if (icon->dpi != NULL)
1356 if (__check_icon_resolution(icon->text, &icon_path) == 0) {
1358 icon->text = icon_path;
1364 static gint __compare_icon_with_dpi(gconstpointer a, gconstpointer b)
1366 icon_x *icon = (icon_x *)a;
1367 int dpi = GPOINTER_TO_INT(b);
1369 if (icon->lang != NULL && strcasecmp(icon->lang, DEFAULT_LOCALE) != 0)
1372 if (icon->dpi == NULL)
1375 if (__check_dpi(icon->dpi, dpi) == 0)
1381 static gint __compare_icon_with_lang(gconstpointer a, gconstpointer b)
1383 icon_x *icon = (icon_x *)a;
1384 char *lang = (char *)b;
1387 if (icon->dpi != NULL)
1390 if (strcasecmp(icon->lang, lang) == 0) {
1391 if (strcasecmp(icon->lang, DEFAULT_LOCALE) == 0) {
1392 /* icon for no locale. check existance of
1393 * folder-hierachied default icons
1395 if (__check_icon_resolution(icon->text,
1398 icon->text = icon_path;
1407 static gint __compare_icon_with_lang_dpi(gconstpointer a, gconstpointer b)
1410 icon_x *icon = (icon_x *)a;
1411 char *lang = (char *)b;
1414 ret = system_info_get_platform_int(
1415 "http://tizen.org/feature/screen.dpi", &dpi);
1416 if (ret != SYSTEM_INFO_ERROR_NONE)
1419 if (strcasecmp(icon->lang, lang) == 0 &&
1420 __check_dpi(icon->dpi, dpi) == 0)
1426 static char *__find_icon(GList *icons, const char *lang)
1433 /* first, find icon whose locale and dpi with given lang and
1434 * system's dpi has matched
1436 tmp = g_list_find_custom(icons, lang,
1437 (GCompareFunc)__compare_icon_with_lang_dpi);
1439 icon = (icon_x *)tmp->data;
1440 return (char *)icon->text;
1443 /* if first has failed, find icon whose locale has matched */
1444 tmp = g_list_find_custom(icons, lang,
1445 (GCompareFunc)__compare_icon_with_lang);
1447 icon = (icon_x *)tmp->data;
1448 return (char *)icon->text;
1451 /* if second has failed, find icon whose dpi has matched with
1454 ret = system_info_get_platform_int(
1455 "http://tizen.org/feature/screen.dpi", &dpi);
1456 if (ret == SYSTEM_INFO_ERROR_NONE) {
1457 tmp = g_list_find_custom(icons, GINT_TO_POINTER(dpi),
1458 (GCompareFunc)__compare_icon_with_dpi);
1460 icon = (icon_x *)tmp->data;
1461 return (char *)icon->text;
1465 /* last, find default icon marked as "No Locale" */
1466 tmp = g_list_find_custom(icons, NULL, (GCompareFunc)__compare_icon);
1468 icon = (icon_x *)tmp->data;
1469 return (char *)icon->text;
1475 static void __extract_data(const char *locale, GList *lbls, GList *lcns,
1476 GList *icns, GList *dcns, GList *aths, char **label,
1477 char **license, char **icon, char **description, char **author)
1485 for (tmp = lbls; tmp; tmp = tmp->next) {
1486 lbl = (label_x *)tmp->data;
1490 if (strcmp(lbl->lang, locale) == 0) {
1491 *label = (char *)lbl->text;
1496 for (tmp = lcns; tmp; tmp = tmp->next) {
1497 lcn = (license_x *)tmp->data;
1501 if (strcmp(lcn->lang, locale) == 0) {
1502 *license = (char *)lcn->text;
1508 *icon = __find_icon(icns, locale);
1510 for (tmp = dcns; tmp; tmp = tmp->next) {
1511 dcn = (description_x *)tmp->data;
1515 if (strcmp(dcn->lang, locale) == 0) {
1516 *description = (char *)dcn->text;
1521 for (tmp = aths; tmp; tmp = tmp->next) {
1522 ath = (author_x *)tmp->data;
1526 if (strcmp(ath->lang, locale) == 0) {
1527 *author = (char *)ath->text;
1534 static int __insert_mainapp_localized_info(sqlite3 *db, application_x *app,
1535 const char *locale, const char *label, const char *icon)
1537 static const char query[] =
1538 "INSERT OR REPLACE INTO package_localized_info ("
1539 " package, package_locale, package_label, package_icon,"
1540 " package_description, package_license, package_author) "
1542 " COALESCE((SELECT package_label FROM package_localized_info"
1543 " WHERE package=? AND package_locale=?), ?),"
1544 " COALESCE((SELECT package_icon FROM package_localized_info"
1545 " WHERE package=? AND package_icon=?), ?),"
1546 " (SELECT package_description FROM package_localized_info"
1547 " WHERE package=? AND package_locale=?),"
1548 " (SELECT package_description FROM package_localized_info"
1549 " WHERE package=? AND package_locale=?),"
1550 " (SELECT package_description FROM package_localized_info"
1551 " WHERE package=? AND package_locale=?))";
1556 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1557 if (ret != SQLITE_OK) {
1558 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1562 __BIND_TEXT(db, stmt, idx++, app->package);
1563 __BIND_TEXT(db, stmt, idx++, locale);
1564 __BIND_TEXT(db, stmt, idx++, app->package);
1565 __BIND_TEXT(db, stmt, idx++, locale);
1566 __BIND_TEXT(db, stmt, idx++, label);
1567 __BIND_TEXT(db, stmt, idx++, app->package);
1568 __BIND_TEXT(db, stmt, idx++, locale);
1569 __BIND_TEXT(db, stmt, idx++, icon);
1570 __BIND_TEXT(db, stmt, idx++, app->package);
1571 __BIND_TEXT(db, stmt, idx++, locale);
1572 __BIND_TEXT(db, stmt, idx++, app->package);
1573 __BIND_TEXT(db, stmt, idx++, locale);
1574 __BIND_TEXT(db, stmt, idx++, app->package);
1575 __BIND_TEXT(db, stmt, idx++, locale);
1577 ret = sqlite3_step(stmt);
1578 if (ret != SQLITE_DONE) {
1579 _LOGE("step failed: %s", sqlite3_errmsg(db));
1580 sqlite3_finalize(stmt);
1584 sqlite3_finalize(stmt);
1589 static int __insert_app_localized_info(sqlite3 *db, application_x *app)
1591 static const char query[] =
1592 "INSERT INTO package_app_localized_info (app_id, app_locale,"
1593 " app_label, app_icon) "
1594 "VALUES (?, ?, ?, ?)";
1604 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1605 if (ret != SQLITE_OK) {
1606 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1610 locales = __create_locale_list(app->label, NULL, app->icon, NULL, NULL);
1611 for (tmp = locales; tmp; tmp = tmp->next) {
1612 locale = (const char *)tmp->data;
1615 __extract_data(locale, app->label, NULL, app->icon, NULL, NULL,
1616 &label, NULL, &icon, NULL, NULL);
1617 if (!label && !icon)
1621 __BIND_TEXT(db, stmt, idx++, app->appid);
1622 __BIND_TEXT(db, stmt, idx++, locale);
1623 __BIND_TEXT(db, stmt, idx++, label);
1624 __BIND_TEXT(db, stmt, idx++, icon);
1626 ret = sqlite3_step(stmt);
1627 if (ret != SQLITE_DONE) {
1628 _LOGE("step failed: %s", sqlite3_errmsg(db));
1629 g_list_free(locales);
1630 sqlite3_finalize(stmt);
1634 sqlite3_reset(stmt);
1636 if (strcasecmp(app->mainapp, "true") == 0) {
1637 if (__insert_mainapp_localized_info(db, app, locale,
1639 _LOGE("insert mainapp localized info failed");
1643 g_list_free(locales);
1644 sqlite3_finalize(stmt);
1649 static int __insert_package_privilege_info(sqlite3 *db, manifest_x *mfx)
1651 static const char query[] =
1652 "INSERT INTO package_privilege_info (package, privilege, type) "
1660 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1661 if (ret != SQLITE_OK) {
1662 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1666 for (tmp = mfx->privileges; tmp; tmp = tmp->next) {
1667 priv = (privilege_x *)tmp->data;
1672 __BIND_TEXT(db, stmt, idx++, mfx->package);
1673 __BIND_TEXT(db, stmt, idx++, priv->value);
1674 __BIND_TEXT(db, stmt, idx++, priv->type);
1676 ret = sqlite3_step(stmt);
1677 if (ret != SQLITE_DONE) {
1678 _LOGE("step failed: %s", sqlite3_errmsg(db));
1679 sqlite3_finalize(stmt);
1682 sqlite3_reset(stmt);
1685 sqlite3_finalize(stmt);
1690 static int __insert_package_appdefined_privilege_info(sqlite3 *db,
1693 static const char query[] =
1694 "INSERT INTO package_appdefined_privilege_info "
1695 "(package, privilege, license, type) "
1696 "VALUES (?, ?, ?, ?)";
1701 appdefined_privilege_x *priv;
1703 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1704 if (ret != SQLITE_OK) {
1705 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1709 for (tmp = mfx->appdefined_privileges; tmp; tmp = tmp->next) {
1710 priv = (appdefined_privilege_x *)tmp->data;
1715 __BIND_TEXT(db, stmt, idx++, mfx->package);
1716 __BIND_TEXT(db, stmt, idx++, priv->value);
1717 __BIND_TEXT(db, stmt, idx++, priv->license);
1718 __BIND_TEXT(db, stmt, idx++, priv->type);
1720 ret = sqlite3_step(stmt);
1721 if (ret != SQLITE_DONE) {
1722 _LOGE("step failed: %s", sqlite3_errmsg(db));
1723 sqlite3_finalize(stmt);
1726 sqlite3_reset(stmt);
1729 sqlite3_finalize(stmt);
1734 /* _PRODUCT_LAUNCHING_ENHANCED_
1735 * app->indicatordisplay, app->portraitimg, app->landscapeimg,
1736 * app->guestmode_appstatus
1738 static int __insert_application_info(sqlite3 *db, manifest_x *mfx)
1740 static const char query[] =
1741 "INSERT INTO package_app_info (app_id, app_component,"
1742 " app_exec, app_nodisplay, app_type, app_onboot, app_multiple,"
1743 " app_autorestart, app_taskmanage, app_hwacceleration,"
1744 " app_screenreader, app_mainapp, app_recentimage,"
1745 " app_launchcondition, app_indicatordisplay, app_portraitimg,"
1746 " app_landscapeimg, app_guestmodevisibility,"
1747 " app_permissiontype, app_preload, app_submode,"
1748 " app_submode_mainid, app_installed_storage, app_process_pool,"
1749 " app_launch_mode, app_ui_gadget, app_support_mode,"
1750 " app_support_disable, component_type, package, app_tep_name,"
1751 " app_zip_mount_file, app_background_category,"
1752 " app_package_type, app_root_path, app_api_version,"
1753 " app_effective_appid, app_splash_screen_display,"
1754 " app_package_system, app_removable,"
1755 " app_package_installed_time, app_support_ambient,"
1756 " app_external_path, app_setup_appid) "
1758 " ?, LOWER(?), ?, LOWER(?), LOWER(?),"
1759 " LOWER(?), LOWER(?), ?,"
1763 " ?, LOWER(?), LOWER(?),"
1765 " COALESCE(?, 'single'), LOWER(?), ?,"
1766 " LOWER(?), ?, ?, ?,"
1770 " LOWER(?), LOWER(?),"
1779 const char *effective_appid;
1782 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1783 if (ret != SQLITE_OK) {
1784 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1788 for (tmp = mfx->application; tmp; tmp = tmp->next) {
1789 app = (application_x *)tmp->data;
1793 bg_category = __convert_background_category(
1794 app->background_category);
1795 effective_appid = __find_effective_appid(app->metadata);
1798 __BIND_TEXT(db, stmt, idx++, app->appid);
1799 __BIND_TEXT(db, stmt, idx++, app->component_type);
1800 __BIND_TEXT(db, stmt, idx++, app->exec);
1801 __BIND_TEXT(db, stmt, idx++, __get_bool(app->nodisplay, false));
1802 __BIND_TEXT(db, stmt, idx++, app->type);
1803 __BIND_TEXT(db, stmt, idx++, __get_bool(app->onboot, false));
1804 __BIND_TEXT(db, stmt, idx++, __get_bool(app->multiple, false));
1805 __BIND_TEXT(db, stmt, idx++,
1806 __get_bool(app->autorestart, false));
1807 __BIND_TEXT(db, stmt, idx++,
1808 __get_bool(app->taskmanage, false));
1809 __BIND_TEXT(db, stmt, idx++, app->hwacceleration);
1810 __BIND_TEXT(db, stmt, idx++, app->screenreader);
1811 __BIND_TEXT(db, stmt, idx++, __get_bool(app->mainapp, false));
1812 __BIND_TEXT(db, stmt, idx++, app->recentimage);
1813 __BIND_TEXT(db, stmt, idx++, app->launchcondition);
1814 __BIND_TEXT(db, stmt, idx++,
1815 __get_bool(app->indicatordisplay, true));
1816 __BIND_TEXT(db, stmt, idx++, app->portraitimg);
1817 __BIND_TEXT(db, stmt, idx++, app->landscapeimg);
1818 __BIND_TEXT(db, stmt, idx++,
1819 __get_bool(app->guestmode_visibility, true));
1820 __BIND_TEXT(db, stmt, idx++, app->permission_type);
1821 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->preload, false));
1822 __BIND_TEXT(db, stmt, idx++, __get_bool(app->submode, false));
1823 __BIND_TEXT(db, stmt, idx++, app->submode_mainid);
1824 __BIND_TEXT(db, stmt, idx++, mfx->installed_storage);
1825 __BIND_TEXT(db, stmt, idx++,
1826 __get_bool(app->process_pool, false));
1827 __BIND_TEXT(db, stmt, idx++, app->launch_mode);
1828 __BIND_TEXT(db, stmt, idx++, __get_bool(app->ui_gadget, false));
1829 __BIND_TEXT(db, stmt, idx++, app->support_mode);
1830 __BIND_TEXT(db, stmt, idx++,
1831 __get_bool(mfx->support_disable, false));
1832 __BIND_TEXT(db, stmt, idx++, app->component_type);
1833 __BIND_TEXT(db, stmt, idx++, mfx->package);
1834 __BIND_TEXT(db, stmt, idx++, mfx->tep_name);
1835 __BIND_TEXT(db, stmt, idx++, mfx->zip_mount_file);
1836 __BIND_INT(db, stmt, idx++, bg_category);
1837 __BIND_TEXT(db, stmt, idx++, mfx->type ? mfx->type : "tpk");
1838 __BIND_TEXT(db, stmt, idx++, mfx->root_path);
1839 __BIND_TEXT(db, stmt, idx++, mfx->api_version);
1840 __BIND_TEXT(db, stmt, idx++, effective_appid);
1841 __BIND_TEXT(db, stmt, idx++,
1842 __get_bool(app->splash_screen_display, true));
1843 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->system, false));
1844 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->removable, false));
1845 __BIND_TEXT(db, stmt, idx++, mfx->installed_time);
1846 __BIND_TEXT(db, stmt, idx++,
1847 __get_bool(app->support_ambient, false));
1848 __BIND_TEXT(db, stmt, idx++, mfx->external_path);
1849 __BIND_TEXT(db, stmt, idx++, app->setup_appid);
1851 ret = sqlite3_step(stmt);
1852 if (ret != SQLITE_DONE) {
1853 _LOGE("step failed: %s", sqlite3_errmsg(db));
1854 sqlite3_finalize(stmt);
1858 sqlite3_reset(stmt);
1860 if (__insert_appcontrol_info(db, app)) {
1861 sqlite3_finalize(stmt);
1864 if (__insert_category_info(db, app)) {
1865 sqlite3_finalize(stmt);
1868 if (__insert_metadata_info(db, app)) {
1869 sqlite3_finalize(stmt);
1872 if (__insert_datacontrol_info(db, app)) {
1873 sqlite3_finalize(stmt);
1876 ss_list = __find_splashscreens(app->splashscreens);
1877 if (__insert_splashscreen_info(db, app, ss_list)) {
1878 g_list_free(ss_list);
1879 sqlite3_finalize(stmt);
1882 g_list_free(ss_list);
1883 if (__insert_app_localized_info(db, app)) {
1884 sqlite3_finalize(stmt);
1889 sqlite3_finalize(stmt);
1894 static int __insert_package_update_info(sqlite3 *db, manifest_x *mfx)
1896 static const char query[] =
1897 "INSERT INTO package_update_info (package, update_version) "
1903 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1904 if (ret != SQLITE_OK) {
1905 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1910 __BIND_TEXT(db, stmt, idx++, mfx->package);
1911 __BIND_TEXT(db, stmt, idx, mfx->version);
1912 ret = sqlite3_step(stmt);
1913 if (ret != SQLITE_DONE) {
1914 _LOGE("step failed: %s", sqlite3_errmsg(db));
1915 sqlite3_finalize(stmt);
1918 sqlite3_finalize(stmt);
1923 static int __insert_package_localized_info(sqlite3 *db, manifest_x *mfx)
1925 static const char query[] =
1926 "INSERT INTO package_localized_info (package, package_locale,"
1927 " package_label, package_icon, package_description,"
1928 " package_license, package_author) "
1929 "VALUES (?, ?, ?, ?, ?, ?, ?)";
1942 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1943 if (ret != SQLITE_OK) {
1944 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1948 locales = __create_locale_list(mfx->label, mfx->license, mfx->icon,
1949 mfx->description, mfx->author);
1950 for (tmp = locales; tmp; tmp = tmp->next) {
1951 locale = (const char *)tmp->data;
1957 __extract_data(locale, mfx->label, mfx->license, mfx->icon,
1958 mfx->description, mfx->author,
1959 &label, &license, &icon, &description, &author);
1960 if (!label && !license && !icon && !description && !author)
1964 __BIND_TEXT(db, stmt, idx++, mfx->package);
1965 __BIND_TEXT(db, stmt, idx++, locale);
1966 __BIND_TEXT(db, stmt, idx++, label);
1967 __BIND_TEXT(db, stmt, idx++, icon);
1968 __BIND_TEXT(db, stmt, idx++, description);
1969 __BIND_TEXT(db, stmt, idx++, license);
1970 __BIND_TEXT(db, stmt, idx++, author);
1972 ret = sqlite3_step(stmt);
1973 if (ret != SQLITE_DONE) {
1974 _LOGE("step failed: %s", sqlite3_errmsg(db));
1975 g_list_free(locales);
1976 sqlite3_finalize(stmt);
1980 sqlite3_reset(stmt);
1983 g_list_free(locales);
1984 sqlite3_finalize(stmt);
1989 static int __insert_package_info(sqlite3 *db, manifest_x *mfx)
1991 static const char query[] =
1992 "INSERT INTO package_info (package, package_type,"
1993 " package_version, package_api_version, package_tep_name,"
1994 " package_zip_mount_file, install_location, package_size,"
1995 " package_removable, package_preload, package_readonly,"
1996 " package_update, package_appsetting, package_nodisplay,"
1997 " package_system, author_name, author_email, author_href,"
1998 " installed_time, installed_storage, storeclient_id,"
1999 " mainapp_id, package_url, root_path, external_path,"
2000 " csc_path, package_support_mode, package_support_disable) "
2004 " LOWER(?), LOWER(?), LOWER(?),"
2005 " LOWER(?), LOWER(?), LOWER(?),"
2006 " LOWER(?), ?, ?, ?,"
2013 const char *author_name = NULL;
2014 const char *author_email = NULL;
2015 const char *author_href = NULL;
2017 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2018 if (ret != SQLITE_OK) {
2019 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2023 if (mfx->author && mfx->author->data) {
2024 author_name = ((author_x *)mfx->author->data)->text;
2025 author_email = ((author_x *)mfx->author->data)->email;
2026 author_href = ((author_x *)mfx->author->data)->href;
2029 __BIND_TEXT(db, stmt, idx++, mfx->package);
2030 __BIND_TEXT(db, stmt, idx++, mfx->type);
2031 __BIND_TEXT(db, stmt, idx++, mfx->version);
2032 __BIND_TEXT(db, stmt, idx++, mfx->api_version);
2033 __BIND_TEXT(db, stmt, idx++, mfx->tep_name);
2034 __BIND_TEXT(db, stmt, idx++, mfx->zip_mount_file);
2035 __BIND_TEXT(db, stmt, idx++, mfx->installlocation);
2036 __BIND_TEXT(db, stmt, idx++, mfx->package_size);
2037 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->removable, true));
2038 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->preload, false));
2039 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->readonly, false));
2040 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->update, false));
2041 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->appsetting, false));
2042 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->nodisplay_setting, false));
2043 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->system, false));
2044 __BIND_TEXT(db, stmt, idx++, author_name);
2045 __BIND_TEXT(db, stmt, idx++, author_email);
2046 __BIND_TEXT(db, stmt, idx++, author_href);
2047 __BIND_TEXT(db, stmt, idx++, mfx->installed_time);
2048 __BIND_TEXT(db, stmt, idx++, mfx->installed_storage);
2049 __BIND_TEXT(db, stmt, idx++, mfx->storeclient_id);
2050 __BIND_TEXT(db, stmt, idx++, mfx->mainapp_id);
2051 __BIND_TEXT(db, stmt, idx++, mfx->package_url);
2052 __BIND_TEXT(db, stmt, idx++, mfx->root_path);
2053 __BIND_TEXT(db, stmt, idx++, mfx->external_path);
2054 __BIND_TEXT(db, stmt, idx++, mfx->csc_path);
2055 __BIND_TEXT(db, stmt, idx++, mfx->support_mode);
2056 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->support_disable, false));
2058 ret = sqlite3_step(stmt);
2059 if (ret != SQLITE_DONE) {
2060 _LOGE("step failed: %s", sqlite3_errmsg(db));
2061 sqlite3_finalize(stmt);
2065 sqlite3_finalize(stmt);
2067 if (__insert_package_update_info(db, mfx))
2069 if (__insert_package_localized_info(db, mfx))
2071 if (__insert_application_info(db, mfx))
2073 if (__insert_package_privilege_info(db, mfx))
2075 if (__insert_package_appdefined_privilege_info(db, mfx))
2081 API int pkgmgr_parser_insert_manifest_info_in_usr_db(manifest_x *mfx, uid_t uid)
2088 _LOGE("invalid parameter");
2089 return PM_PARSER_R_EINVAL;
2092 dbpath = __get_parser_db_path(uid);
2094 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2095 if (ret != SQLITE_OK) {
2096 _LOGE("open db failed: %d", ret);
2097 return PM_PARSER_R_ERROR;
2100 __BEGIN_TRANSACTION(db);
2101 __DO_TRANSACTION(db, __insert_package_info(db, mfx));
2102 __END_TRANSACTION(db);
2104 sqlite3_close_v2(db);
2106 return PM_PARSER_R_OK;
2109 API int pkgmgr_parser_insert_manifest_info_in_db(manifest_x *mfx)
2111 return pkgmgr_parser_insert_manifest_info_in_usr_db(mfx, __getuid());
2114 static int __delete_package_info(sqlite3 *db, const char *pkgid)
2116 static const char query[] =
2117 "DELETE FROM package_info WHERE package=?";
2121 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2122 if (ret != SQLITE_OK) {
2123 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2127 __BIND_TEXT(db, stmt, 1, pkgid);
2129 ret = sqlite3_step(stmt);
2130 if (ret != SQLITE_DONE) {
2131 _LOGE("step failed: %s", sqlite3_errmsg(db));
2132 sqlite3_finalize(stmt);
2136 sqlite3_finalize(stmt);
2141 API int pkgmgr_parser_delete_manifest_info_from_usr_db(manifest_x *mfx,
2149 _LOGE("invalid parameter");
2150 return PM_PARSER_R_EINVAL;
2153 dbpath = __get_parser_db_path(uid);
2155 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2156 if (ret != SQLITE_OK) {
2157 _LOGE("open db failed: %d", ret);
2158 return PM_PARSER_R_ERROR;
2161 __BEGIN_TRANSACTION(db);
2162 __DO_TRANSACTION(db, __delete_package_info(db, mfx->package));
2163 __END_TRANSACTION(db);
2165 sqlite3_close_v2(db);
2167 return PM_PARSER_R_OK;
2170 API int pkgmgr_parser_delete_manifest_info_from_db(manifest_x *mfx)
2172 return pkgmgr_parser_delete_manifest_info_from_usr_db(mfx, __getuid());
2175 API int pkgmgr_parser_update_manifest_info_in_usr_db(manifest_x *mfx, uid_t uid)
2182 _LOGE("invalid parameter");
2183 return PM_PARSER_R_EINVAL;
2186 dbpath = __get_parser_db_path(uid);
2188 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2189 if (ret != SQLITE_OK) {
2190 _LOGE("open db failed: %d", ret);
2191 return PM_PARSER_R_ERROR;
2194 __BEGIN_TRANSACTION(db);
2195 __DO_TRANSACTION(db, __delete_package_info(db, mfx->package));
2196 __DO_TRANSACTION(db, __insert_package_info(db, mfx));
2197 __END_TRANSACTION(db);
2199 sqlite3_close_v2(db);
2201 return PM_PARSER_R_OK;
2204 API int pkgmgr_parser_update_manifest_info_in_db(manifest_x *mfx)
2206 return pkgmgr_parser_update_manifest_info_in_usr_db(mfx, __getuid());
2209 static int __set_global_app_disable_for_uid(sqlite3 *db, const char *appid,
2210 uid_t uid, bool is_disable)
2212 static const char query[] =
2213 "INSERT OR REPLACE INTO package_app_info_for_uid ("
2214 " app_id, uid, is_disabled, is_splash_screen_enabled) "
2216 " (SELECT app_splash_screen_display FROM package_app_info"
2217 " WHERE app_id=?))";
2222 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2223 if (ret != SQLITE_OK) {
2224 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2228 __BIND_TEXT(db, stmt, idx++, appid);
2229 __BIND_INT(db, stmt, idx++, uid);
2230 __BIND_TEXT(db, stmt, idx++, is_disable ? "true" : "false");
2231 __BIND_TEXT(db, stmt, idx++, appid);
2233 ret = sqlite3_step(stmt);
2234 if (ret != SQLITE_DONE) {
2235 _LOGE("step failed: %s", sqlite3_errmsg(db));
2236 sqlite3_finalize(stmt);
2240 sqlite3_finalize(stmt);
2245 API int pkgmgr_parser_update_global_app_disable_for_uid_info_in_db(
2246 const char *appid, uid_t uid, int is_disable)
2252 if (appid == NULL) {
2253 _LOGE("invalid parameter");
2254 return PM_PARSER_R_EINVAL;
2257 dbpath = __get_parser_db_path(GLOBAL_USER);
2259 ret = __open_db(GLOBAL_USER, dbpath, &db, SQLITE_OPEN_READWRITE);
2260 if (ret != SQLITE_OK) {
2261 _LOGE("open db failed: %d", ret);
2262 return PM_PARSER_R_ERROR;
2265 __BEGIN_TRANSACTION(db);
2266 __DO_TRANSACTION(db, __set_global_app_disable_for_uid(db, appid,
2267 uid, (bool)is_disable));
2268 __END_TRANSACTION(db);
2270 sqlite3_close_v2(db);
2272 return PM_PARSER_R_OK;
2275 static int __set_app_disable(sqlite3 *db, const char *appid, uid_t uid,
2278 static const char query[] =
2279 "UPDATE package_app_info SET app_disable=? "
2285 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2286 if (ret != SQLITE_OK) {
2287 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2291 __BIND_TEXT(db, stmt, idx++, is_disable ? "true" : "false");
2292 __BIND_TEXT(db, stmt, idx++, appid);
2294 ret = sqlite3_step(stmt);
2295 if (ret != SQLITE_DONE) {
2296 _LOGE("step failed: %s", sqlite3_errmsg(db));
2297 sqlite3_finalize(stmt);
2301 sqlite3_finalize(stmt);
2306 API int pkgmgr_parser_update_app_disable_info_in_usr_db(const char *appid,
2307 uid_t uid, int is_disable)
2313 if (appid == NULL) {
2314 _LOGE("invalid parameter");
2315 return PM_PARSER_R_EINVAL;
2318 dbpath = __get_parser_db_path(uid);
2320 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2321 if (ret != SQLITE_OK) {
2322 _LOGE("open db failed: %d", ret);
2323 return PM_PARSER_R_ERROR;
2326 __BEGIN_TRANSACTION(db);
2327 __DO_TRANSACTION(db, __set_app_disable(db, appid, uid,
2329 __END_TRANSACTION(db);
2331 sqlite3_close_v2(db);
2333 return PM_PARSER_R_OK;
2336 API int pkgmgr_parser_update_app_disable_info_in_db(const char *appid,
2339 return pkgmgr_parser_update_app_disable_info_in_usr_db(appid,
2340 __getuid(), is_disable);
2343 static int __set_pkg_disable(sqlite3 *db, const char *pkgid, uid_t uid,
2346 static const char query[] =
2347 "UPDATE package_info SET package_disable=? "
2353 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2354 if (ret != SQLITE_OK) {
2355 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2359 __BIND_TEXT(db, stmt, idx++, is_disable ? "true" : "false");
2360 __BIND_TEXT(db, stmt, idx++, pkgid);
2362 ret = sqlite3_step(stmt);
2363 if (ret != SQLITE_DONE) {
2364 _LOGE("step failed: %s", sqlite3_errmsg(db));
2365 sqlite3_finalize(stmt);
2369 sqlite3_finalize(stmt);
2374 API int pkgmgr_parser_update_pkg_disable_info_in_usr_db(const char *pkgid,
2375 uid_t uid, int is_disable)
2381 if (pkgid == NULL) {
2382 _LOGE("invalid parameter");
2383 return PM_PARSER_R_EINVAL;
2386 dbpath = __get_parser_db_path(uid);
2388 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2389 if (ret != SQLITE_OK) {
2390 _LOGE("open db failed: %d", ret);
2391 return PM_PARSER_R_ERROR;
2394 __BEGIN_TRANSACTION(db);
2395 __DO_TRANSACTION(db, __set_pkg_disable(db, pkgid, uid,
2397 __END_TRANSACTION(db);
2399 sqlite3_close_v2(db);
2401 return PM_PARSER_R_OK;
2404 API int pkgmgr_parser_update_pkg_disable_info_in_db(const char *pkgid,
2407 return pkgmgr_parser_update_pkg_disable_info_in_usr_db(pkgid,
2408 __getuid(), is_disable);
2411 static int __set_global_app_splash_screen_for_uid(sqlite3 *db,
2412 const char *appid, uid_t uid, bool is_enabled)
2414 static const char query[] =
2415 "INSERT OR REPLACE INTO package_app_info_for_uid("
2416 " appid, uid, is_splash_screen_enabled) "
2422 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2423 if (ret != SQLITE_OK) {
2424 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2428 __BIND_TEXT(db, stmt, idx++, appid);
2429 __BIND_INT(db, stmt, idx++, uid);
2430 __BIND_TEXT(db, stmt, idx++, is_enabled ? "true" : "false");
2432 ret = sqlite3_step(stmt);
2433 if (ret != SQLITE_DONE) {
2434 _LOGE("step failed: %s", sqlite3_errmsg(db));
2435 sqlite3_finalize(stmt);
2439 sqlite3_finalize(stmt);
2444 API int pkgmgr_parser_update_global_app_splash_screen_display_info_in_usr_db(
2445 const char *appid, uid_t uid, int flag)
2451 if (appid == NULL) {
2452 _LOGE("invalid parameter");
2453 return PM_PARSER_R_EINVAL;
2456 dbpath = __get_parser_db_path(GLOBAL_USER);
2458 ret = __open_db(GLOBAL_USER, dbpath, &db, SQLITE_OPEN_READWRITE);
2459 if (ret != SQLITE_OK) {
2460 _LOGE("open db failed: %d", ret);
2461 return PM_PARSER_R_ERROR;
2464 __BEGIN_TRANSACTION(db);
2465 __DO_TRANSACTION(db, __set_global_app_splash_screen_for_uid(db,
2466 appid, uid, (bool)flag));
2467 __END_TRANSACTION(db);
2469 sqlite3_close_v2(db);
2471 return PM_PARSER_R_OK;
2474 static int __set_app_splash_screen(sqlite3 *db, const char *appid,
2477 static const char query[] =
2478 "UPDATE package_app_info SET app_splash_screen_display=? "
2484 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2485 if (ret != SQLITE_OK) {
2486 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2490 __BIND_TEXT(db, stmt, idx++, is_enabled ? "true" : "false");
2491 __BIND_TEXT(db, stmt, idx++, appid);
2493 ret = sqlite3_step(stmt);
2494 if (ret != SQLITE_DONE) {
2495 _LOGE("step failed: %s", sqlite3_errmsg(db));
2496 sqlite3_finalize(stmt);
2500 sqlite3_finalize(stmt);
2505 API int pkgmgr_parser_update_app_splash_screen_display_info_in_usr_db(
2506 const char *appid, uid_t uid, int flag)
2512 if (appid == NULL) {
2513 _LOGE("invalid parameter");
2514 return PM_PARSER_R_EINVAL;
2517 dbpath = __get_parser_db_path(uid);
2519 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2520 if (ret != SQLITE_OK) {
2521 _LOGE("open db failed: %d", ret);
2522 return PM_PARSER_R_ERROR;
2525 __BEGIN_TRANSACTION(db);
2526 __DO_TRANSACTION(db, __set_app_splash_screen(db, appid, (bool)flag));
2527 __END_TRANSACTION(db);
2529 sqlite3_close_v2(db);
2531 return PM_PARSER_R_OK;
2534 API int pkgmgr_parser_update_app_splash_screen_display_info_in_db(
2535 const char *appid, int flag)
2537 return pkgmgr_parser_update_app_splash_screen_display_info_in_usr_db(
2538 appid, __getuid(), flag);
2541 static int __set_app_label(sqlite3 *db, const char *appid, const char *label)
2543 static const char query[] =
2544 "UPDATE package_app_localized_info SET app_label=? "
2545 "WHERE app_id=? AND app_label IS NOT NULL";
2550 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2551 if (ret != SQLITE_OK) {
2552 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2556 __BIND_TEXT(db, stmt, idx++, label);
2557 __BIND_TEXT(db, stmt, idx++, appid);
2559 ret = sqlite3_step(stmt);
2560 if (ret != SQLITE_DONE) {
2561 _LOGE("step failed: %s", sqlite3_errmsg(db));
2562 sqlite3_finalize(stmt);
2566 sqlite3_finalize(stmt);
2571 API int pkgmgr_parser_update_app_label_info_in_usr_db(const char *appid,
2572 uid_t uid, const char *label)
2578 if (appid == NULL) {
2579 _LOGE("invalid parameter");
2580 return PM_PARSER_R_EINVAL;
2583 dbpath = __get_parser_db_path(uid);
2585 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2586 if (ret != SQLITE_OK) {
2587 _LOGE("open db failed: %d", ret);
2588 return PM_PARSER_R_ERROR;
2591 __BEGIN_TRANSACTION(db);
2592 __DO_TRANSACTION(db, __set_app_label(db, appid, label));
2593 __END_TRANSACTION(db);
2595 sqlite3_close_v2(db);
2597 return PM_PARSER_R_OK;
2600 API int pkgmgr_parser_update_app_label_info_in_db(const char *appid,
2603 return pkgmgr_parser_update_app_label_info_in_usr_db(appid, __getuid(),
2607 static int __set_app_icon(sqlite3 *db, const char *appid, const char *icon_path)
2609 static const char query[] =
2610 "UPDATE package_app_localized_info SET app_icon=? "
2611 "WHERE app_id=? AND app_icon IS NOT NULL";
2616 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2617 if (ret != SQLITE_OK) {
2618 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2622 __BIND_TEXT(db, stmt, idx++, icon_path);
2623 __BIND_TEXT(db, stmt, idx++, appid);
2625 ret = sqlite3_step(stmt);
2626 if (ret != SQLITE_DONE) {
2627 _LOGE("step failed: %s", sqlite3_errmsg(db));
2628 sqlite3_finalize(stmt);
2632 sqlite3_finalize(stmt);
2637 API int pkgmgr_parser_update_app_icon_info_in_usr_db(const char *appid,
2638 uid_t uid, const char *icon_path)
2644 if (appid == NULL) {
2645 _LOGE("invalid parameter");
2646 return PM_PARSER_R_EINVAL;
2649 dbpath = __get_parser_db_path(uid);
2651 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2652 if (ret != SQLITE_OK) {
2653 _LOGE("open db failed: %d", ret);
2654 return PM_PARSER_R_ERROR;
2657 __BEGIN_TRANSACTION(db);
2658 __DO_TRANSACTION(db, __set_app_icon(db, appid, icon_path));
2659 __END_TRANSACTION(db);
2661 sqlite3_close_v2(db);
2663 return PM_PARSER_R_OK;
2666 API int pkgmgr_parser_update_app_icon_info_in_db(const char *appid,
2667 const char *icon_path)
2669 return pkgmgr_parser_update_app_icon_info_in_usr_db(appid, __getuid(),
2673 static int __set_tep_path(sqlite3 *db, const char *pkgid, const char *tep_path)
2675 static const char query[] =
2676 "UPDATE package_info SET package_tep_name=? "
2682 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2683 if (ret != SQLITE_OK) {
2684 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2688 __BIND_TEXT(db, stmt, idx++, tep_path);
2689 __BIND_TEXT(db, stmt, idx++, pkgid);
2691 ret = sqlite3_step(stmt);
2692 if (ret != SQLITE_DONE) {
2693 _LOGE("step failed: %s", sqlite3_errmsg(db));
2694 sqlite3_finalize(stmt);
2698 sqlite3_finalize(stmt);
2703 API int pkgmgr_parser_update_tep_info_in_usr_db(const char *pkgid,
2704 const char *tep_path, uid_t uid)
2710 if (pkgid == NULL) {
2711 _LOGE("invalid parameter");
2712 return PM_PARSER_R_EINVAL;
2715 dbpath = __get_parser_db_path(uid);
2717 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2718 if (ret != SQLITE_OK) {
2719 _LOGE("open db failed: %d", ret);
2720 return PM_PARSER_R_ERROR;
2723 __BEGIN_TRANSACTION(db);
2724 __DO_TRANSACTION(db, __set_tep_path(db, pkgid, tep_path));
2725 __END_TRANSACTION(db);
2727 sqlite3_close_v2(db);
2729 return PM_PARSER_R_OK;
2732 API int pkgmgr_parser_update_tep_info_in_db(const char *pkgid,
2733 const char *tep_path)
2735 return pkgmgr_parser_update_tep_info_in_usr_db(pkgid, tep_path,
2739 static int __convert_update_type(pkgmgrinfo_updateinfo_update_type type,
2740 const char **update_type)
2742 if (type == PMINFO_UPDATEINFO_NONE)
2743 *update_type = PMINFO_UPDATEINFO_TYPE_NONE;
2744 else if (type == PMINFO_UPDATEINFO_FORCE)
2745 *update_type = PMINFO_UPDATEINFO_TYPE_FORCE;
2746 else if (type == PMINFO_UPDATEINFO_OPTIONAL)
2747 *update_type = PMINFO_UPDATEINFO_TYPE_OPTIONAL;
2753 static int __register_pkg_update_info(sqlite3 *db, updateinfo_x *info,
2754 const char *update_type)
2756 static const char query[] =
2757 "UPDATE package_update_info "
2758 "SET update_version=?, update_type=? "
2764 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2765 if (ret != SQLITE_OK) {
2766 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2770 __BIND_TEXT(db, stmt, idx++, info->version);
2771 __BIND_TEXT(db, stmt, idx++, update_type);
2772 __BIND_TEXT(db, stmt, idx++, info->pkgid);
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_register_pkg_update_info_in_usr_db(
2787 pkgmgrinfo_updateinfo_h handle, uid_t uid)
2790 updateinfo_x *update_info;
2791 updateinfo_x *prev_update_info;
2792 pkgmgrinfo_updateinfo_h prev_update_handle;
2793 pkgmgrinfo_pkginfo_h pkginfo;
2794 pkgmgrinfo_version_compare_type compare_result;
2796 const char *update_type;
2800 if (handle == NULL) {
2801 _LOGE("invalid parameter");
2802 return PM_PARSER_R_EINVAL;
2805 update_info = (updateinfo_x *)handle;
2806 if (update_info->pkgid == NULL || update_info->version == NULL)
2807 return PM_PARSER_R_EINVAL;
2808 if (__convert_update_type(update_info->type, &update_type) != 0)
2809 return PM_PARSER_R_EINVAL;
2811 ret = pkgmgrinfo_updateinfo_get_usr_updateinfo(update_info->pkgid,
2812 &prev_update_handle, uid);
2813 if (ret != PMINFO_R_OK)
2814 return PM_PARSER_R_ERROR;
2816 prev_update_info = (updateinfo_x *)prev_update_handle;
2817 ret = pkgmgrinfo_compare_package_version(update_info->version,
2818 prev_update_info->version, &compare_result);
2819 if (ret != PMINFO_R_OK) {
2820 pkgmgrinfo_updateinfo_destroy(prev_update_handle);
2821 return PM_PARSER_R_ERROR;
2824 if (compare_result == PMINFO_VERSION_SAME &&
2825 prev_update_info->type == PMINFO_UPDATEINFO_NONE) {
2826 _LOGI("Given update info version[%s] of pkgid[%s] "
2828 update_info->version, update_info->pkgid);
2829 pkgmgrinfo_updateinfo_destroy(prev_update_handle);
2830 return PM_PARSER_R_OK;
2832 pkgmgrinfo_updateinfo_destroy(prev_update_handle);
2834 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(update_info->pkgid, uid,
2836 if (ret != PMINFO_R_OK)
2837 return PM_PARSER_R_ERROR;
2839 ret = pkgmgrinfo_pkginfo_is_global(pkginfo, &is_global_pkg);
2840 if (ret != PMINFO_R_OK) {
2841 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
2842 return PM_PARSER_R_ERROR;
2844 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
2846 dbpath = __get_parser_db_path(is_global_pkg ? GLOBAL_USER : uid);
2848 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2849 if (ret != SQLITE_OK) {
2850 _LOGE("open db failed: %d", ret);
2851 return PM_PARSER_R_ERROR;
2854 __BEGIN_TRANSACTION(db);
2855 __DO_TRANSACTION(db, __register_pkg_update_info(db, update_info,
2857 __END_TRANSACTION(db);
2859 sqlite3_close_v2(db);
2861 return PM_PARSER_R_OK;
2864 API int pkgmgr_parser_register_pkg_update_info_in_db(
2865 pkgmgrinfo_updateinfo_h handle)
2867 return pkgmgr_parser_register_pkg_update_info_in_usr_db(handle,
2871 static int __unregister_pkg_update_info(sqlite3 *db, const char *pkgid)
2873 static const char query[] =
2874 "UPDATE package_update_info SET update_type='none' "
2880 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2881 if (ret != SQLITE_OK) {
2882 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2886 __BIND_TEXT(db, stmt, idx++, pkgid);
2888 ret = sqlite3_step(stmt);
2889 if (ret != SQLITE_DONE) {
2890 _LOGE("step failed: %s", sqlite3_errmsg(db));
2891 sqlite3_finalize(stmt);
2895 sqlite3_finalize(stmt);
2900 API int pkgmgr_parser_unregister_pkg_update_info_in_usr_db(const char *pkgid,
2906 pkgmgrinfo_pkginfo_h pkginfo;
2909 if (pkgid == NULL) {
2910 _LOGE("invalid parameter");
2911 return PM_PARSER_R_EINVAL;
2914 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &pkginfo);
2915 if (ret != PMINFO_R_OK)
2916 return PM_PARSER_R_EINVAL;
2918 ret = pkgmgrinfo_pkginfo_is_global(pkginfo, &is_global_pkg);
2919 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
2920 if (ret != PMINFO_R_OK)
2921 return PM_PARSER_R_ERROR;
2923 dbpath = __get_parser_db_path(is_global_pkg ? GLOBAL_USER : uid);
2925 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2926 if (ret != SQLITE_OK) {
2927 _LOGE("open db failed: %d", ret);
2928 return PM_PARSER_R_ERROR;
2931 __BEGIN_TRANSACTION(db);
2932 __DO_TRANSACTION(db, __unregister_pkg_update_info(db, pkgid));
2933 __END_TRANSACTION(db);
2935 sqlite3_close_v2(db);
2937 return PM_PARSER_R_OK;
2940 API int pkgmgr_parser_unregister_pkg_update_info_in_db(const char *pkgid)
2942 return pkgmgr_parser_unregister_pkg_update_info_in_usr_db(pkgid,
2946 static int __unregister_all_pkg_update_info(sqlite3 *db)
2948 static const char query[] =
2949 "UPDATE package_update_info SET update_type='none'";
2953 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2954 if (ret != SQLITE_OK) {
2955 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2959 ret = sqlite3_step(stmt);
2960 if (ret != SQLITE_DONE) {
2961 _LOGE("step failed: %s", sqlite3_errmsg(db));
2962 sqlite3_finalize(stmt);
2966 sqlite3_finalize(stmt);
2971 API int pkgmgr_parser_unregister_all_pkg_update_info_in_usr_db(uid_t uid)
2977 dbpath = __get_parser_db_path(uid);
2979 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2980 if (ret != SQLITE_OK) {
2981 _LOGE("open db failed: %d", ret);
2982 return PM_PARSER_R_ERROR;
2985 __BEGIN_TRANSACTION(db);
2986 __DO_TRANSACTION(db, __unregister_all_pkg_update_info(db));
2987 __END_TRANSACTION(db);
2989 sqlite3_close_v2(db);
2991 return PM_PARSER_R_OK;
2994 API int pkgmgr_parser_unregister_all_pkg_update_info_in_db(void)
2996 return pkgmgr_parser_unregister_all_pkg_update_info_in_usr_db(