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 <sys/sysmacros.h>
26 #include <linux/limits.h>
34 #include <tzplatform_config.h>
35 #include <system_info.h>
37 #include "pkgmgr-info.h"
38 #include "pkgmgrinfo_basic.h"
39 #include "pkgmgr_parser.h"
40 #include "pkgmgr_parser_db_queries.h"
41 #include "pkgmgr_parser_debug.h"
42 #include "pkgmgr_parser_internal.h"
48 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
51 #define APPFW_USER "app_fw"
60 #define XXHDPI "xxhdpi"
70 #define XXHDPI_MIN 481
71 #define XXHDPI_MAX 600
73 /* app background category value */
74 #define APP_BG_CATEGORY_USER_DISABLE_FALSE_VAL 0x00000
75 #define APP_BG_CATEGORY_USER_DISABLE_TRUE_VAL 0x00001
76 #define APP_BG_CATEGORY_MEDIA_VAL 0x00002
77 #define APP_BG_CATEGORY_DOWNLOAD_VAL 0x00004
78 #define APP_BG_CATEGORY_BGNETWORK_VAL 0x00008
79 #define APP_BG_CATEGORY_LOCATION_VAL 0x00010
80 #define APP_BG_CATEGORY_SENSOR_VAL 0x00020
81 #define APP_BG_CATEGORY_IOTCOMM_VAL 0x00040
82 #define APP_BG_CATEGORY_SYSTEM_VAL 0x00080
84 #define APP_BG_CATEGORY_USER_DISABLE_FALSE_STR "enable"
85 #define APP_BG_CATEGORY_USER_DISABLE_TRUE_STR "disable"
86 #define APP_BG_CATEGORY_MEDIA_STR "media"
87 #define APP_BG_CATEGORY_DOWNLOAD_STR "download"
88 #define APP_BG_CATEGORY_BGNETWORK_STR "background-network"
89 #define APP_BG_CATEGORY_LOCATION_STR "location"
90 #define APP_BG_CATEGORY_SENSOR_STR "sensor"
91 #define APP_BG_CATEGORY_IOTCOMM_STR "iot-communication"
92 #define APP_BG_CATEGORY_SYSTEM "system"
94 #define REGULAR_USER 5000
95 static inline uid_t __getuid(void)
99 if (uid < REGULAR_USER)
100 return tzplatform_getuid(TZ_SYS_GLOBALAPP_USER);
105 static const char *__get_bool(char *value, bool is_true)
108 if (!strcmp(value, ""))
109 return (is_true) ? "true" : "false";
113 return (is_true) ? "true" : "false";
116 #define __BEGIN_TRANSACTION(db) \
118 if (sqlite3_exec(db, "BEGIN DEFERRED", NULL, NULL, NULL) != \
120 _LOGE("begin transaction failed: %s", sqlite3_errmsg(db)); \
121 sqlite3_close_v2(db); \
122 return PM_PARSER_R_ERROR; \
126 #define __DO_TRANSACTION(db, func) \
129 _LOGE("transaction failed: %s, rollback", sqlite3_errmsg(db)); \
130 if (sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL) != \
132 _LOGE("roll back transaction failed: %s", \
133 sqlite3_errmsg(db)); \
134 sqlite3_close_v2(db); \
135 return PM_PARSER_R_ERROR; \
139 #define __END_TRANSACTION(db) \
141 if (sqlite3_exec(db, "COMMIT", NULL, NULL, NULL) != \
143 _LOGE("commit failed: %s, rollback", sqlite3_errmsg(db)); \
144 if (sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL) != \
146 _LOGE("roll back transaction failed: %s", \
147 sqlite3_errmsg(db)); \
148 sqlite3_close_v2(db); \
149 return PM_PARSER_R_ERROR; \
153 #define __BIND_TEXT(db, stmt, i, text) \
155 if (sqlite3_bind_text(stmt, i, text, -1, SQLITE_STATIC) != SQLITE_OK) {\
156 _LOGE("bind error(index %d): %s", i, sqlite3_errmsg(db)); \
157 sqlite3_finalize(stmt); \
162 #define __BIND_INT(db, stmt, i, int) \
164 if (sqlite3_bind_int(stmt, i, int) != SQLITE_OK) { \
165 _LOGE("bind error(index %d): %s", i, sqlite3_errmsg(db)); \
166 sqlite3_finalize(stmt); \
171 static const char *__get_parser_db_path(uid_t uid)
176 if (uid == GLOBAL_USER || uid == OWNER_ROOT) {
177 path = tzplatform_mkpath(TZ_SYS_DB, ".pkgmgr_parser.db");
179 snprintf(buf, sizeof(buf), "user/%d/.pkgmgr_parser.db", uid);
180 path = tzplatform_mkpath(TZ_SYS_DB, buf);
186 static const char *__get_cert_db_path(void)
188 return tzplatform_mkpath(TZ_SYS_DB, ".pkgmgr_cert.db");
191 #define DB_VERSION_PATH SYSCONFDIR "/package-manager/pkg_db_version.txt"
192 static int __set_db_version(sqlite3 *db)
196 char version[PKG_STRING_LEN_MAX] = { 0 };
199 fp = fopen(DB_VERSION_PATH, "r");
200 retvm_if(fp == NULL, -1, "Failed to open db version file");
201 if (fgets(version, sizeof(version), fp) == NULL) {
202 _LOGE("Failed to get version information");
208 query = sqlite3_mprintf("PRAGMA user_version=%Q", version);
210 _LOGE("Out of memory");
214 ret = sqlite3_exec(db, query, NULL, NULL, NULL);
215 if (ret != SQLITE_OK) {
216 _LOGE("exec failed: %s", sqlite3_errmsg(db));
225 /* TODO: Do not labeling directly */
226 #define DB_LABEL "User::Home"
227 #define SET_SMACK_LABEL(x) \
229 if (smack_setlabel((x), DB_LABEL, SMACK_LABEL_ACCESS)) \
230 _LOGE("failed chsmack -a %s %s", DB_LABEL, x); \
232 _LOGD("chsmack -a %s %s", DB_LABEL, x); \
235 static int __set_db_permission(const char *path, uid_t uid)
238 const char *files[2];
239 char journal_file[BUFSIZE];
243 struct passwd *result;
248 if (getuid() != OWNER_ROOT)
251 if (uid == OWNER_ROOT || uid == GLOBAL_USER) {
252 ret = getpwnam_r(APPFW_USER, &pwd, buf, sizeof(buf), &result);
253 if (result == NULL) {
255 _LOGE("no such user: %d", uid);
257 _LOGE("getpwuid_r failed: %d", errno);
263 snprintf(journal_file, sizeof(journal_file), "%s-journal", path);
265 files[1] = journal_file;
267 ret = getpwuid_r(uid, &pwd, buf, sizeof(buf), &result);
268 if (result == NULL) {
270 _LOGE("no such user: %d", uid);
272 _LOGE("getpwuid_r failed: %d", errno);
276 for (i = 0; i < 2; i++) {
277 fd = open(files[i], O_RDONLY);
279 _LOGE("open %s failed: %d", files[i], errno);
282 ret = fstat(fd, &sb);
284 _LOGE("stat %s failed: %d", files[i], errno);
288 if (S_ISLNK(sb.st_mode)) {
289 _LOGE("%s is symlink!", files[i]);
293 ret = fchown(fd, uid, pwd.pw_gid);
295 _LOGE("fchown %s failed: %d", files[i], errno);
300 mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH;
301 if (!strcmp(path, __get_cert_db_path()))
303 ret = fchmod(fd, mode);
305 _LOGD("fchmod %s failed: %d", files[i], errno);
310 SET_SMACK_LABEL(files[i]);
316 static const char *parser_init_queries[] = {
317 QUERY_CREATE_TABLE_PACKAGE_INFO,
318 QUERY_CREATE_TABLE_PACKAGE_LOCALIZED_INFO,
319 QUERY_CREATE_TABLE_PACKAGE_PRIVILEGE_INFO,
320 QUERY_CREATE_TABLE_PACKAGE_APPDEFINED_PRIVILEGE_INFO,
321 QUERY_CREATE_TABLE_PACKAGE_UPDATE_INFO,
322 QUERY_CREATE_TABLE_PACKAGE_APP_INFO,
323 QUERY_CREATE_TABLE_PACKAGE_APP_LOCALIZED_INFO,
324 QUERY_CREATE_TABLE_PACKAGE_APP_APP_CONTROL,
325 QUERY_CREATE_TABLE_PACKAGE_APP_APP_CONTROL_PRIVILEGE,
326 QUERY_CREATE_TABLE_PACKAGE_APP_APP_CATEGORY,
327 QUERY_CREATE_TABLE_PACKAGE_APP_APP_METADATA,
328 QUERY_CREATE_TABLE_PACKAGE_APP_DATA_CONTROL,
329 QUERY_CREATE_TABLE_PACKAGE_APP_DATA_CONTROL_PRIVILEGE,
330 QUERY_CREATE_TABLE_PACKAGE_APP_INFO_FOR_UID,
331 QUERY_CREATE_TRIGGER_UPDATE_PACKAGE_APP_INFO_FOR_UID,
332 QUERY_CREATE_TABLE_PACKAGE_APP_SPLASH_SCREEN,
333 QUERY_CREATE_TABLE_PACKAGE_DEPENDENCY_INFO,
334 QUERY_CREATE_TABLE_PACKAGE_PLUGIN_INFO,
338 static const char *cert_init_queries[] = {
339 QUERY_CREATE_TABLE_PACKAGE_CERT_INFO,
340 QUERY_CREATE_TABLE_PACKAGE_CERT_INDEX_INFO,
341 QUERY_CREATE_TRIGGER_UPDATE_CERT_INFO,
342 QUERY_CREATE_TRIGGER_UPDATE_CERT_INFO2,
343 QUERY_CREATE_TRIGGER_DELETE_CERT_INFO,
344 QUERY_CREATE_TRIGGER_UPDATE_CERT_INDEX_INFO,
348 static int __create_tables(sqlite3 *db, const char **queries)
352 for (i = 0; queries[i] != NULL; i++) {
353 ret = sqlite3_exec(db, queries[i], NULL, NULL, NULL);
354 if (ret != SQLITE_OK) {
355 _LOGE("exec failed: %s", sqlite3_errmsg(db));
362 static int __initialize_db(sqlite3 *db, const char *dbpath, uid_t uid)
364 const char **queries;
366 if (__set_db_version(db))
369 if (strstr(dbpath, ".pkgmgr_parser.db")) {
370 queries = parser_init_queries;
371 } else if (strstr(dbpath, ".pkgmgr_cert.db")) {
372 queries = cert_init_queries;
374 _LOGE("unexpected dbpath: %s", dbpath);
378 __BEGIN_TRANSACTION(db);
379 __DO_TRANSACTION(db, __create_tables(db, queries));
380 __END_TRANSACTION(db);
382 if (__set_db_permission(dbpath, uid))
383 _LOGE("failed to set db permission");
388 #define RESOURCED_BUS_NAME "org.tizen.resourced"
389 #define RESOURCED_PROC_PATH "/Org/Tizen/ResourceD/Process"
390 #define RESOURCED_PROC_INTERFACE "org.tizen.resourced.process"
391 #define RESOURCED_PROC_METHOD "ProcExclude"
392 static void __send_wakeup_signal_to_resourced(pid_t pid)
394 GError *error = NULL;
395 GDBusConnection *conn;
399 conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
401 _LOGE("Failed to connect to dbus: %s", error->message);
406 proxy = g_dbus_proxy_new_sync(conn,
407 G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
408 NULL, RESOURCED_BUS_NAME,
409 RESOURCED_PROC_PATH, RESOURCED_PROC_INTERFACE,
412 _LOGE("failed to get proxy object: %s", error->message);
414 g_object_unref(conn);
418 reply = g_dbus_proxy_call_sync(proxy, RESOURCED_PROC_METHOD,
419 g_variant_new("(si)", "wakeup", pid),
420 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
422 _LOGE("failed to get reply from resourced");
424 _LOGE("failed to send request: %s", error->message);
428 g_object_unref(proxy);
429 g_object_unref(conn);
432 static void __check_db_lock(const char *dbpath)
442 char cmdline[BUFSIZE];
446 if (stat(dbpath, &sb) == -1) {
447 _LOGE("get db file(%s) status failed: %d", dbpath, errno);
451 fp = fopen("/proc/locks", "r");
453 _LOGE("Failed to open lock info: %d", errno);
457 while (fscanf(fp, "%*s %*s %*s %5s %d %x:%x:%lu %*s %*s",
458 type, &pid, &maj, &min, &ino) != EOF) {
459 if (maj != major(sb.st_dev) || min != minor(sb.st_dev) ||
460 ino != sb.st_ino || pid == getpid() ||
461 strcasecmp(type, "WRITE"))
464 snprintf(cmdline, sizeof(cmdline), "/proc/%d/cmdline", pid);
465 fp_cmdline = fopen(cmdline, "r");
467 if (fp_cmdline != NULL) {
468 len = fread(name, sizeof(char), sizeof(name) - 1,
471 if (name[len - 1] == '\n')
472 name[len - 1] = '\0';
479 _LOGE("%s (%d) has lock on pkgmgr db(%s)!", name, pid, dbpath);
480 __send_wakeup_signal_to_resourced(pid);
486 #define BUSY_WAITING_USEC (1000000 / 10 / 2) /* 0.05 sec */
487 #define BUSY_WAITING_MAX 40 /* wait for max 2 sec */
488 static int __db_busy_handler(void *data, int count)
490 if (count < (BUSY_WAITING_MAX / 2)) {
491 usleep(BUSY_WAITING_USEC);
493 } else if (count == (BUSY_WAITING_MAX / 2)) {
494 __check_db_lock((const char *)data);
495 usleep(BUSY_WAITING_USEC);
497 } else if (count < BUSY_WAITING_MAX) {
498 usleep(BUSY_WAITING_USEC);
501 /* sqlite3_prepare_v2 will return SQLITE_BUSY */
506 API int pkgmgr_parser_initialize_parser_db(uid_t uid)
512 dbpath = __get_parser_db_path(uid);
513 if (access(dbpath, F_OK) != -1) {
514 _LOGE("Manifest db for user %d is already exists", uid);
515 return PM_PARSER_R_ERROR;
518 ret = sqlite3_open_v2(dbpath, &db,
519 SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
520 if (ret != SQLITE_OK) {
521 _LOGE("open db failed: %d", ret);
522 sqlite3_close_v2(db);
523 return PM_PARSER_R_ERROR;
526 ret = sqlite3_busy_handler(db, __db_busy_handler, NULL);
527 if (ret != SQLITE_OK) {
528 _LOGE("failed to register busy handler: %s",
530 sqlite3_close_v2(db);
534 if (__initialize_db(db, dbpath, uid)) {
535 sqlite3_close_v2(db);
536 return PM_PARSER_R_ERROR;
538 sqlite3_close_v2(db);
540 return PM_PARSER_R_OK;
543 API int pkgmgr_parser_initialize_cert_db(void)
549 dbpath = __get_cert_db_path();
550 if (access(dbpath, F_OK) != -1) {
551 _LOGE("Cert db is already exists");
552 return PM_PARSER_R_ERROR;
555 ret = sqlite3_open_v2(dbpath, &db,
556 SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
557 if (ret != SQLITE_OK) {
558 _LOGE("open db failed: %d", ret);
559 sqlite3_close_v2(db);
560 return PM_PARSER_R_ERROR;
563 ret = sqlite3_busy_handler(db, __db_busy_handler, NULL);
564 if (ret != SQLITE_OK) {
565 _LOGE("failed to register busy handler: %s",
567 sqlite3_close_v2(db);
571 if (__initialize_db(db, dbpath, GLOBAL_USER)) {
572 sqlite3_close_v2(db);
573 return PM_PARSER_R_ERROR;
575 sqlite3_close_v2(db);
577 return PM_PARSER_R_OK;
580 API int pkgmgr_parser_create_and_initialize_db(uid_t uid)
584 struct passwd *result;
587 ret = getpwnam_r(APPFW_USER, &pwd, buf, sizeof(buf), &result);
588 if (result == NULL) {
590 _LOGE("no such user: %s", APPFW_USER);
592 _LOGE("getpwnam_r failed: %d", errno);
593 return PM_PARSER_R_ERROR;
596 if (getuid() != OWNER_ROOT && getuid() != pwd.pw_uid) {
597 _LOGE("Only root or app_fw user is allowed");
598 return PM_PARSER_R_EINVAL;
601 if (pkgmgr_parser_initialize_parser_db(uid))
602 return PM_PARSER_R_ERROR;
604 if (uid == OWNER_ROOT || uid == GLOBAL_USER)
605 if (pkgmgr_parser_initialize_cert_db())
606 return PM_PARSER_R_ERROR;
608 return PM_PARSER_R_OK;
611 static int __open_db(uid_t uid, const char *path, sqlite3 **db, int flags)
615 /* FIXME: always open with OPEN_CREATE flag for keeping previous
618 if (flags & SQLITE_OPEN_READWRITE)
619 flags = flags | SQLITE_OPEN_CREATE;
621 ret = sqlite3_open_v2(path, db, flags, NULL);
622 if (ret != SQLITE_OK) {
623 sqlite3_close_v2(*db);
627 ret = sqlite3_busy_handler(*db, __db_busy_handler, (void *)path);
628 if (ret != SQLITE_OK) {
629 _LOGE("failed to register busy handler: %s",
630 sqlite3_errmsg(*db));
631 sqlite3_close_v2(*db);
635 if (flags & SQLITE_OPEN_CREATE) {
636 ret = __initialize_db(*db, path, uid);
638 _LOGE("failed to initialize db: %s", path);
639 sqlite3_close_v2(*db);
644 ret = sqlite3_exec(*db, "PRAGMA foreign_keys=ON", NULL, NULL, NULL);
645 if (ret != SQLITE_OK) {
646 _LOGE("failed to enable foreign key support: %s",
647 sqlite3_errmsg(*db));
648 sqlite3_close_v2(*db);
656 static int __convert_background_category(GList *category_list)
662 if (category_list == NULL)
665 for (tmp = category_list; tmp; tmp = tmp->next) {
666 category_data = (char *)tmp->data;
667 if (category_data == NULL)
669 if (!strcmp(category_data, APP_BG_CATEGORY_MEDIA_STR))
670 ret |= APP_BG_CATEGORY_MEDIA_VAL;
671 else if (!strcmp(category_data, APP_BG_CATEGORY_DOWNLOAD_STR))
672 ret |= APP_BG_CATEGORY_DOWNLOAD_VAL;
673 else if (!strcmp(category_data, APP_BG_CATEGORY_BGNETWORK_STR))
674 ret |= APP_BG_CATEGORY_BGNETWORK_VAL;
675 else if (!strcmp(category_data, APP_BG_CATEGORY_LOCATION_STR))
676 ret |= APP_BG_CATEGORY_LOCATION_VAL;
677 else if (!strcmp(category_data, APP_BG_CATEGORY_SENSOR_STR))
678 ret |= APP_BG_CATEGORY_SENSOR_VAL;
679 else if (!strcmp(category_data, APP_BG_CATEGORY_IOTCOMM_STR))
680 ret |= APP_BG_CATEGORY_IOTCOMM_VAL;
681 else if (!strcmp(category_data, APP_BG_CATEGORY_SYSTEM))
682 ret |= APP_BG_CATEGORY_SYSTEM_VAL;
684 _LOGE("Unidentified category [%s]", category_data);
690 #define EFFECTIVE_APPID_KEY "http://tizen.org/metadata/effective-appid"
691 static const char *__find_effective_appid(GList *metadata_list)
696 for (tmp = metadata_list; tmp; tmp = tmp->next) {
697 md = (metadata_x *)tmp->data;
698 if (md == NULL || md->key == NULL)
701 if (strcmp(md->key, EFFECTIVE_APPID_KEY) == 0) {
710 static int __insert_appcontrol_privilege_info(sqlite3 *db, const char *appid,
713 static const char query[] =
714 "INSERT INTO package_app_app_control_privilege (app_id,"
715 " app_control, privilege) VALUES (?, ?, ?)";
719 char app_control[BUFSIZE];
726 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
727 if (ret != SQLITE_OK) {
728 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
732 for (tmp = ac->privileges; tmp; tmp = tmp->next) {
733 privilege = (char *)tmp->data;
734 if (privilege == NULL || !strlen(privilege))
738 snprintf(app_control, sizeof(app_control), "%s|%s|%s",
739 ac->operation ? (strlen(ac->operation) > 0 ?
740 ac->operation : "NULL") : "NULL",
741 ac->uri ? (strlen(ac->uri) > 0 ?
742 ac->uri : "NULL") : "NULL",
743 ac->mime ? (strlen(ac->mime) > 0 ?
744 ac->mime : "NULL") : "NULL");
745 __BIND_TEXT(db, stmt, idx++, appid);
746 __BIND_TEXT(db, stmt, idx++, app_control);
747 __BIND_TEXT(db, stmt, idx++, privilege);
749 ret = sqlite3_step(stmt);
750 if (ret != SQLITE_DONE) {
751 _LOGE("step failed: %s", sqlite3_errmsg(db));
752 sqlite3_finalize(stmt);
759 sqlite3_finalize(stmt);
764 static int __insert_appcontrol_info(sqlite3 *db, application_x *app)
766 static const char query[] =
767 "INSERT INTO package_app_app_control (app_id, app_control,"
768 " visibility, app_control_id) "
769 "VALUES (?, ?, ?, ?)";
773 char app_control[BUFSIZE];
777 if (app->appcontrol == NULL)
780 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
781 if (ret != SQLITE_OK) {
782 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
786 for (tmp = app->appcontrol; tmp; tmp = tmp->next) {
787 ac = (appcontrol_x *)tmp->data;
791 snprintf(app_control, sizeof(app_control), "%s|%s|%s",
792 ac->operation ? (strlen(ac->operation) > 0 ?
793 ac->operation : "NULL") : "NULL",
794 ac->uri ? (strlen(ac->uri) > 0 ?
795 ac->uri : "NULL") : "NULL",
796 ac->mime ? (strlen(ac->mime) > 0 ?
797 ac->mime : "NULL") : "NULL");
798 __BIND_TEXT(db, stmt, idx++, app->appid);
799 __BIND_TEXT(db, stmt, idx++, app_control);
800 __BIND_TEXT(db, stmt, idx++, ac->visibility);
801 __BIND_TEXT(db, stmt, idx++, ac->id);
803 ret = sqlite3_step(stmt);
804 if (ret != SQLITE_DONE) {
805 _LOGE("step failed: %s", sqlite3_errmsg(db));
806 sqlite3_finalize(stmt);
810 if (__insert_appcontrol_privilege_info(db, app->appid, ac)) {
811 sqlite3_finalize(stmt);
818 sqlite3_finalize(stmt);
823 static int __insert_category_info(sqlite3 *db, application_x *app)
825 static const char query[] =
826 "INSERT INTO package_app_app_category (app_id, category) "
832 const char *category;
834 if (app->category == NULL)
837 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
838 if (ret != SQLITE_OK) {
839 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
843 for (tmp = app->category; tmp; tmp = tmp->next) {
844 category = (const char *)tmp->data;
845 if (category == NULL)
848 __BIND_TEXT(db, stmt, idx++, app->appid);
849 __BIND_TEXT(db, stmt, idx++, category);
851 ret = sqlite3_step(stmt);
852 if (ret != SQLITE_DONE) {
853 _LOGE("step failed: %s", sqlite3_errmsg(db));
854 sqlite3_finalize(stmt);
861 sqlite3_finalize(stmt);
866 static int __insert_metadata_info(sqlite3 *db, application_x *app)
868 static const char query[] =
869 "INSERT INTO package_app_app_metadata (app_id,"
870 " md_key, md_value) VALUES (?, ?, ?)";
877 if (app->metadata == NULL)
880 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
881 if (ret != SQLITE_OK) {
882 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
886 for (tmp = app->metadata; tmp; tmp = tmp->next) {
887 md = (metadata_x *)tmp->data;
891 __BIND_TEXT(db, stmt, idx++, app->appid);
892 __BIND_TEXT(db, stmt, idx++, md->key);
893 __BIND_TEXT(db, stmt, idx++, md->value);
895 ret = sqlite3_step(stmt);
896 if (ret != SQLITE_DONE) {
897 _LOGE("step failed: %s", sqlite3_errmsg(db));
898 sqlite3_finalize(stmt);
905 sqlite3_finalize(stmt);
910 static int __insert_app_data_control_privilege_info(sqlite3 *db,
911 datacontrol_x *datacontrol)
913 static const char query[] =
914 "INSERT INTO package_app_data_control_privilege (providerid,"
915 " privilege, type) VALUES (?, ?, ?)";
923 if (datacontrol == NULL)
926 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
927 if (ret != SQLITE_OK) {
928 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
932 for (privileges = datacontrol->privileges; privileges;
933 privileges = privileges->next) {
934 priv = (char *)privileges->data;
939 __BIND_TEXT(db, stmt, idx++, datacontrol->providerid);
940 __BIND_TEXT(db, stmt, idx++, priv);
941 __BIND_TEXT(db, stmt, idx++, datacontrol->type);
943 ret = sqlite3_step(stmt);
944 if (ret != SQLITE_DONE) {
945 _LOGE("step failed: %s", sqlite3_errmsg(db));
946 sqlite3_finalize(stmt);
953 sqlite3_finalize(stmt);
957 static int __insert_datacontrol_info(sqlite3 *db, application_x *app)
959 static const char query[] =
960 "INSERT INTO package_app_data_control (app_id, providerid,"
961 " access, type, trusted) VALUES (?, ?, ?, ?, ?)";
968 if (app->datacontrol == NULL)
971 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
972 if (ret != SQLITE_OK) {
973 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
977 for (tmp = app->datacontrol; tmp; tmp = tmp->next) {
978 dc = (datacontrol_x *)tmp->data;
982 __BIND_TEXT(db, stmt, idx++, app->appid);
983 __BIND_TEXT(db, stmt, idx++, dc->providerid);
984 __BIND_TEXT(db, stmt, idx++, dc->access);
985 __BIND_TEXT(db, stmt, idx++, dc->type);
986 __BIND_TEXT(db, stmt, idx++, dc->trusted);
988 ret = sqlite3_step(stmt);
989 if (ret != SQLITE_DONE) {
990 _LOGE("step failed: %s", sqlite3_errmsg(db));
991 sqlite3_finalize(stmt);
995 if (dc->privileges &&
996 __insert_app_data_control_privilege_info(db, dc)) {
997 sqlite3_finalize(stmt);
1001 sqlite3_reset(stmt);
1004 sqlite3_finalize(stmt);
1009 /* TODO: move to installer */
1010 static int __check_dpi(const char *dpi_char, int dpi_int)
1012 if (dpi_char == NULL)
1015 if (strcasecmp(dpi_char, LDPI) == 0) {
1016 if (dpi_int >= LDPI_MIN && dpi_int <= LDPI_MAX)
1020 } else if (strcasecmp(dpi_char, MDPI) == 0) {
1021 if (dpi_int >= MDPI_MIN && dpi_int <= MDPI_MAX)
1025 } else if (strcasecmp(dpi_char, HDPI) == 0) {
1026 if (dpi_int >= HDPI_MIN && dpi_int <= HDPI_MAX)
1030 } else if (strcasecmp(dpi_char, XHDPI) == 0) {
1031 if (dpi_int >= XHDPI_MIN && dpi_int <= XHDPI_MAX)
1035 } else if (strcasecmp(dpi_char, XXHDPI) == 0) {
1036 if (dpi_int >= XXHDPI_MIN && dpi_int <= XXHDPI_MAX)
1044 static gint __compare_splashscreen_with_orientation_dpi(gconstpointer a,
1047 splashscreen_x *ss = (splashscreen_x *)a;
1048 const char *orientation = (const char *)b;
1052 if (ss->operation || ss->dpi == NULL)
1055 ret = system_info_get_platform_int(
1056 "http://tizen.org/feature/screen.dpi", &dpi);
1057 if (ret != SYSTEM_INFO_ERROR_NONE)
1060 if (strcasecmp(ss->orientation, orientation) == 0 &&
1061 __check_dpi(ss->dpi, dpi) == 0)
1067 static gint __compare_splashscreen_with_orientation(gconstpointer a,
1070 splashscreen_x *ss = (splashscreen_x *)a;
1071 const char *orientation = (const char *)b;
1073 if (ss->operation || ss->dpi)
1076 if (strcasecmp(ss->orientation, orientation) == 0)
1082 static splashscreen_x *__find_default_splashscreen(GList *splashscreens,
1083 const char *orientation)
1087 tmp = g_list_find_custom(splashscreens, orientation,
1089 __compare_splashscreen_with_orientation_dpi);
1091 return (splashscreen_x *)tmp->data;
1093 tmp = g_list_find_custom(splashscreens, orientation,
1094 (GCompareFunc)__compare_splashscreen_with_orientation);
1096 return (splashscreen_x *)tmp->data;
1101 static void __find_appcontrol_splashscreen_with_dpi(gpointer data,
1104 splashscreen_x *ss = (splashscreen_x *)data;
1105 GList **list = (GList **)user_data;
1109 if (ss->operation == NULL || ss->dpi == NULL)
1112 ret = system_info_get_platform_int(
1113 "http://tizen.org/feature/screen.dpi", &dpi);
1114 if (ret != SYSTEM_INFO_ERROR_NONE)
1117 if (__check_dpi(ss->dpi, dpi) != 0)
1120 *list = g_list_append(*list, ss);
1123 static void __find_appcontrol_splashscreen(gpointer data, gpointer user_data)
1125 splashscreen_x *ss = (splashscreen_x *)data;
1126 GList **list = (GList **)user_data;
1127 splashscreen_x *ss_tmp;
1130 if (ss->operation == NULL || ss->dpi)
1133 for (tmp = *list; tmp; tmp = tmp->next) {
1134 ss_tmp = (splashscreen_x *)tmp->data;
1135 if (ss_tmp->operation
1136 && strcmp(ss_tmp->operation, ss->operation) == 0
1137 && strcmp(ss_tmp->orientation, ss->orientation) == 0)
1141 *list = g_list_append(*list, ss);
1144 static GList *__find_splashscreens(GList *splashscreens)
1149 if (splashscreens == NULL)
1152 g_list_foreach(splashscreens,
1153 __find_appcontrol_splashscreen_with_dpi, &list);
1154 g_list_foreach(splashscreens,
1155 __find_appcontrol_splashscreen, &list);
1157 ss = __find_default_splashscreen(splashscreens, "portrait");
1159 list = g_list_append(list, ss);
1160 ss = __find_default_splashscreen(splashscreens, "landscape");
1162 list = g_list_append(list, ss);
1167 static int __insert_splashscreen_info(sqlite3 *db, application_x *app,
1170 static const char query[] =
1171 "INSERT INTO package_app_splash_screen (app_id, src, type,"
1172 " orientation, indicatordisplay, operation, color_depth) "
1173 "VALUES (?, ?, ?, ?, ?, ?, ?)";
1180 if (app->splashscreens == NULL)
1183 if (ss_list == NULL)
1186 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1187 if (ret != SQLITE_OK) {
1188 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1192 for (tmp = ss_list; tmp; tmp = tmp->next) {
1193 ss = (splashscreen_x *)tmp->data;
1197 __BIND_TEXT(db, stmt, idx++, app->appid);
1198 __BIND_TEXT(db, stmt, idx++, ss->src);
1199 __BIND_TEXT(db, stmt, idx++, ss->type);
1200 __BIND_TEXT(db, stmt, idx++, ss->orientation);
1201 __BIND_TEXT(db, stmt, idx++, ss->indicatordisplay);
1202 __BIND_TEXT(db, stmt, idx++, ss->operation);
1203 __BIND_TEXT(db, stmt, idx++, ss->color_depth);
1205 ret = sqlite3_step(stmt);
1206 if (ret != SQLITE_DONE) {
1207 _LOGE("step failed: %s", sqlite3_errmsg(db));
1208 sqlite3_finalize(stmt);
1212 sqlite3_reset(stmt);
1215 sqlite3_finalize(stmt);
1220 static void __trimfunc(GList *trim_list)
1224 GList *list = g_list_first(trim_list);
1227 trim_data = (char *)list->data;
1230 if (strcmp(trim_data, prev) == 0) {
1231 trim_list = g_list_remove(trim_list,
1233 list = g_list_first(trim_list);
1242 list = g_list_next(list);
1246 static gint __comparefunc(gconstpointer a, gconstpointer b, gpointer userdata)
1248 if (a == NULL || b == NULL)
1250 if (strcmp((char *)a, (char *)b) == 0)
1252 if (strcmp((char *)a, (char *)b) < 0)
1254 if (strcmp((char *)a, (char *)b) > 0)
1259 /* TODO: refactor inserting localized info */
1260 static GList *__create_locale_list(GList *lbls, GList *lcns, GList *icns,
1261 GList *dcns, GList *aths)
1263 GList *locale = NULL;
1271 for (tmp = lbls; tmp; tmp = tmp->next) {
1272 lbl = (label_x *)tmp->data;
1276 locale = g_list_insert_sorted_with_data(
1277 locale, (gpointer)lbl->lang,
1278 __comparefunc, NULL);
1280 for (tmp = lcns; tmp; tmp = tmp->next) {
1281 lcn = (license_x *)tmp->data;
1285 locale = g_list_insert_sorted_with_data(
1286 locale, (gpointer)lcn->lang,
1287 __comparefunc, NULL);
1289 for (tmp = icns; tmp; tmp = tmp->next) {
1290 icn = (icon_x *)tmp->data;
1294 locale = g_list_insert_sorted_with_data(
1295 locale, (gpointer)icn->lang,
1296 __comparefunc, NULL);
1298 for (tmp = dcns; tmp; tmp = tmp->next) {
1299 dcn = (description_x *)tmp->data;
1303 locale = g_list_insert_sorted_with_data(
1304 locale, (gpointer)dcn->lang,
1305 __comparefunc, NULL);
1307 for (tmp = aths; tmp; tmp = tmp->next) {
1308 ath = (author_x *)tmp->data;
1312 locale = g_list_insert_sorted_with_data(
1313 locale, (gpointer)ath->lang,
1314 __comparefunc, NULL);
1320 static gint __check_icon_resolution(const char *orig_icon_path,
1321 char **new_icon_path)
1325 char *icon_filename;
1326 char modified_iconpath[BUFSIZE];
1327 char icon_path[BUFSIZE];
1331 if (orig_icon_path == NULL)
1334 ret = system_info_get_platform_int(
1335 "http://tizen.org/feature/screen.dpi", &dpi);
1336 if (ret != SYSTEM_INFO_ERROR_NONE)
1339 if (dpi >= LDPI_MIN && dpi <= LDPI_MAX) {
1340 dpi_path[0] = "LDPI";
1341 dpi_path[1] = "ldpi";
1342 } else if (dpi >= MDPI_MIN && dpi <= MDPI_MAX) {
1343 dpi_path[0] = "MDPI";
1344 dpi_path[1] = "mdpi";
1345 } else if (dpi >= HDPI_MIN && dpi <= HDPI_MAX) {
1346 dpi_path[0] = "HDPI";
1347 dpi_path[1] = "hdpi";
1348 } else if (dpi >= XHDPI_MIN && dpi <= XHDPI_MAX) {
1349 dpi_path[0] = "XHDPI";
1350 dpi_path[1] = "xhdpi";
1351 } else if (dpi >= XXHDPI_MIN && dpi <= XXHDPI_MAX) {
1352 dpi_path[0] = "XXHDPI";
1353 dpi_path[1] = "xxhdpi";
1355 _LOGE("Unidentified dpi[%d]", dpi);
1359 icon_filename = strrchr(orig_icon_path, '/');
1360 if (icon_filename == NULL)
1364 strlen(orig_icon_path) - (strlen(icon_filename) - 1),
1365 "%s", orig_icon_path);
1366 for (i = 0; i < 2; i++) {
1367 ret = snprintf(modified_iconpath, BUFSIZE - 1, "%s/%s%s",
1368 icon_path, dpi_path[i], icon_filename);
1369 if (ret < 0 || ret > BUFSIZE -1) {
1370 _LOGE("snprintf fail");
1373 if (access(modified_iconpath, F_OK) != -1) {
1374 /* if exists, return modified icon path */
1375 *new_icon_path = strdup(modified_iconpath);
1383 static gint __compare_icon(gconstpointer a, gconstpointer b)
1385 icon_x *icon = (icon_x *)a;
1388 if (icon->lang != NULL && strcasecmp(icon->lang, DEFAULT_LOCALE) != 0)
1391 if (icon->dpi != NULL)
1394 if (__check_icon_resolution(icon->text, &icon_path) == 0) {
1396 icon->text = icon_path;
1402 static gint __compare_icon_with_dpi(gconstpointer a, gconstpointer b)
1404 icon_x *icon = (icon_x *)a;
1405 int dpi = GPOINTER_TO_INT(b);
1407 if (icon->lang != NULL && strcasecmp(icon->lang, DEFAULT_LOCALE) != 0)
1410 if (icon->dpi == NULL)
1413 if (__check_dpi(icon->dpi, dpi) == 0)
1419 static gint __compare_icon_with_lang(gconstpointer a, gconstpointer b)
1421 icon_x *icon = (icon_x *)a;
1422 char *lang = (char *)b;
1425 if (icon->dpi != NULL)
1428 if (strcasecmp(icon->lang, lang) == 0) {
1429 if (strcasecmp(icon->lang, DEFAULT_LOCALE) == 0) {
1430 /* icon for no locale. check existance of
1431 * folder-hierachied default icons
1433 if (__check_icon_resolution(icon->text,
1436 icon->text = icon_path;
1445 static gint __compare_icon_with_lang_dpi(gconstpointer a, gconstpointer b)
1448 icon_x *icon = (icon_x *)a;
1449 char *lang = (char *)b;
1452 ret = system_info_get_platform_int(
1453 "http://tizen.org/feature/screen.dpi", &dpi);
1454 if (ret != SYSTEM_INFO_ERROR_NONE)
1457 if (strcasecmp(icon->lang, lang) == 0 &&
1458 __check_dpi(icon->dpi, dpi) == 0)
1464 static char *__find_icon(GList *icons, const char *lang)
1471 /* first, find icon whose locale and dpi with given lang and
1472 * system's dpi has matched
1474 tmp = g_list_find_custom(icons, lang,
1475 (GCompareFunc)__compare_icon_with_lang_dpi);
1477 icon = (icon_x *)tmp->data;
1478 return (char *)icon->text;
1481 /* if first has failed, find icon whose locale has matched */
1482 tmp = g_list_find_custom(icons, lang,
1483 (GCompareFunc)__compare_icon_with_lang);
1485 icon = (icon_x *)tmp->data;
1486 return (char *)icon->text;
1489 /* if second has failed, find icon whose dpi has matched with
1492 ret = system_info_get_platform_int(
1493 "http://tizen.org/feature/screen.dpi", &dpi);
1494 if (ret == SYSTEM_INFO_ERROR_NONE) {
1495 tmp = g_list_find_custom(icons, GINT_TO_POINTER(dpi),
1496 (GCompareFunc)__compare_icon_with_dpi);
1498 icon = (icon_x *)tmp->data;
1499 return (char *)icon->text;
1503 /* last, find default icon marked as "No Locale" */
1504 tmp = g_list_find_custom(icons, NULL, (GCompareFunc)__compare_icon);
1506 icon = (icon_x *)tmp->data;
1507 return (char *)icon->text;
1513 static void __extract_data(const char *locale, GList *lbls, GList *lcns,
1514 GList *icns, GList *dcns, GList *aths, char **label,
1515 char **license, char **icon, char **description, char **author)
1523 for (tmp = lbls; tmp; tmp = tmp->next) {
1524 lbl = (label_x *)tmp->data;
1528 if (strcmp(lbl->lang, locale) == 0) {
1529 *label = (char *)lbl->text;
1534 for (tmp = lcns; tmp; tmp = tmp->next) {
1535 lcn = (license_x *)tmp->data;
1539 if (strcmp(lcn->lang, locale) == 0) {
1540 *license = (char *)lcn->text;
1546 *icon = __find_icon(icns, locale);
1548 for (tmp = dcns; tmp; tmp = tmp->next) {
1549 dcn = (description_x *)tmp->data;
1553 if (strcmp(dcn->lang, locale) == 0) {
1554 *description = (char *)dcn->text;
1559 for (tmp = aths; tmp; tmp = tmp->next) {
1560 ath = (author_x *)tmp->data;
1564 if (strcmp(ath->lang, locale) == 0) {
1565 *author = (char *)ath->text;
1572 static int __insert_mainapp_localized_info(sqlite3 *db, application_x *app,
1573 const char *locale, const char *label, const char *icon)
1575 static const char query[] =
1576 "INSERT OR REPLACE INTO package_localized_info ("
1577 " package, package_locale, package_label, package_icon,"
1578 " package_description, package_license, package_author) "
1580 " COALESCE((SELECT package_label FROM package_localized_info"
1581 " WHERE package=? AND package_locale=?), ?),"
1582 " COALESCE((SELECT package_icon FROM package_localized_info"
1583 " WHERE package=? AND package_icon=?), ?),"
1584 " (SELECT package_description FROM package_localized_info"
1585 " WHERE package=? AND package_locale=?),"
1586 " (SELECT package_description FROM package_localized_info"
1587 " WHERE package=? AND package_locale=?),"
1588 " (SELECT package_description FROM package_localized_info"
1589 " WHERE package=? AND package_locale=?))";
1594 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1595 if (ret != SQLITE_OK) {
1596 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1600 __BIND_TEXT(db, stmt, idx++, app->package);
1601 __BIND_TEXT(db, stmt, idx++, locale);
1602 __BIND_TEXT(db, stmt, idx++, app->package);
1603 __BIND_TEXT(db, stmt, idx++, locale);
1604 __BIND_TEXT(db, stmt, idx++, label);
1605 __BIND_TEXT(db, stmt, idx++, app->package);
1606 __BIND_TEXT(db, stmt, idx++, locale);
1607 __BIND_TEXT(db, stmt, idx++, icon);
1608 __BIND_TEXT(db, stmt, idx++, app->package);
1609 __BIND_TEXT(db, stmt, idx++, locale);
1610 __BIND_TEXT(db, stmt, idx++, app->package);
1611 __BIND_TEXT(db, stmt, idx++, locale);
1612 __BIND_TEXT(db, stmt, idx++, app->package);
1613 __BIND_TEXT(db, stmt, idx++, locale);
1615 ret = sqlite3_step(stmt);
1616 if (ret != SQLITE_DONE) {
1617 _LOGE("step failed: %s", sqlite3_errmsg(db));
1618 sqlite3_finalize(stmt);
1622 sqlite3_finalize(stmt);
1627 static int __insert_app_localized_info(sqlite3 *db, application_x *app)
1629 static const char query[] =
1630 "INSERT INTO package_app_localized_info (app_id, app_locale,"
1631 " app_label, app_icon) "
1632 "VALUES (?, ?, ?, ?)";
1642 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1643 if (ret != SQLITE_OK) {
1644 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1648 locales = __create_locale_list(app->label, NULL, app->icon, NULL, NULL);
1649 for (tmp = locales; tmp; tmp = tmp->next) {
1650 locale = (const char *)tmp->data;
1653 __extract_data(locale, app->label, NULL, app->icon, NULL, NULL,
1654 &label, NULL, &icon, NULL, NULL);
1655 if (!label && !icon)
1659 __BIND_TEXT(db, stmt, idx++, app->appid);
1660 __BIND_TEXT(db, stmt, idx++, locale);
1661 __BIND_TEXT(db, stmt, idx++, label);
1662 __BIND_TEXT(db, stmt, idx++, icon);
1664 ret = sqlite3_step(stmt);
1665 if (ret != SQLITE_DONE) {
1666 _LOGE("step failed: %s", sqlite3_errmsg(db));
1667 g_list_free(locales);
1668 sqlite3_finalize(stmt);
1672 sqlite3_reset(stmt);
1674 if (strcasecmp(app->mainapp, "true") == 0) {
1675 if (__insert_mainapp_localized_info(db, app, locale,
1677 _LOGE("insert mainapp localized info failed");
1681 g_list_free(locales);
1682 sqlite3_finalize(stmt);
1687 static int __insert_package_privilege_info(sqlite3 *db, manifest_x *mfx)
1689 static const char query[] =
1690 "INSERT INTO package_privilege_info (package, privilege, type) "
1698 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1699 if (ret != SQLITE_OK) {
1700 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1704 for (tmp = mfx->privileges; tmp; tmp = tmp->next) {
1705 priv = (privilege_x *)tmp->data;
1710 __BIND_TEXT(db, stmt, idx++, mfx->package);
1711 __BIND_TEXT(db, stmt, idx++, priv->value);
1712 __BIND_TEXT(db, stmt, idx++, priv->type);
1714 ret = sqlite3_step(stmt);
1715 if (ret != SQLITE_DONE) {
1716 _LOGE("step failed: %s", sqlite3_errmsg(db));
1717 sqlite3_finalize(stmt);
1720 sqlite3_reset(stmt);
1723 sqlite3_finalize(stmt);
1728 static int __insert_package_plugin_execution_info(sqlite3 *db,
1731 static const char query[] =
1732 "INSERT INTO package_plugin_info "
1733 "(pkgid, appid, plugin_type, plugin_name) "
1734 "VALUES (?, ?, ?, ?)";
1744 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1745 if (ret != SQLITE_OK) {
1746 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1750 for (tmp = mfx->plugin; tmp; tmp = tmp->next) {
1751 plugin = (plugin_x *)tmp->data;
1756 __BIND_TEXT(db, stmt, idx++, plugin->pkgid);
1757 __BIND_TEXT(db, stmt, idx++, plugin->appid);
1758 __BIND_TEXT(db, stmt, idx++, plugin->plugin_type);
1759 __BIND_TEXT(db, stmt, idx++, plugin->plugin_name);
1761 ret = sqlite3_step(stmt);
1762 if (ret != SQLITE_DONE) {
1763 _LOGE("step failed: %s", sqlite3_errmsg(db));
1764 sqlite3_finalize(stmt);
1767 sqlite3_reset(stmt);
1770 sqlite3_finalize(stmt);
1775 static int __delete_package_plugin_execution_info(sqlite3 *db,
1778 static const char query[] =
1779 "DELETE FROM package_plugin_info WHERE pkgid=?";
1783 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1784 if (ret != SQLITE_OK) {
1785 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1789 __BIND_TEXT(db, stmt, 1, pkgid);
1791 ret = sqlite3_step(stmt);
1792 if (ret != SQLITE_DONE) {
1793 _LOGE("step failed: %s", sqlite3_errmsg(db));
1794 sqlite3_finalize(stmt);
1798 sqlite3_finalize(stmt);
1803 static int __insert_package_appdefined_privilege_info(sqlite3 *db,
1806 static const char query[] =
1807 "INSERT INTO package_appdefined_privilege_info "
1808 "(package, privilege, license, type) "
1809 "VALUES (?, ?, ?, ?)";
1814 appdefined_privilege_x *priv;
1816 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1817 if (ret != SQLITE_OK) {
1818 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1822 for (tmp = mfx->appdefined_privileges; tmp; tmp = tmp->next) {
1823 priv = (appdefined_privilege_x *)tmp->data;
1828 __BIND_TEXT(db, stmt, idx++, mfx->package);
1829 __BIND_TEXT(db, stmt, idx++, priv->value);
1830 __BIND_TEXT(db, stmt, idx++, priv->license);
1831 __BIND_TEXT(db, stmt, idx++, priv->type);
1833 ret = sqlite3_step(stmt);
1834 if (ret != SQLITE_DONE) {
1835 _LOGE("step failed: %s", sqlite3_errmsg(db));
1836 sqlite3_finalize(stmt);
1839 sqlite3_reset(stmt);
1842 sqlite3_finalize(stmt);
1847 static int __insert_package_dependency_info(sqlite3 *db, manifest_x *mfx)
1849 static const char query[] =
1850 "INSERT INTO package_dependency_info"
1851 " (package, depends_on, type, required_version) "
1852 "VALUES (?, ?, ?, ?)";
1859 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1860 if (ret != SQLITE_OK) {
1861 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1865 for (tmp = mfx->dependencies; tmp; tmp = tmp->next) {
1866 dep = (dependency_x *)tmp->data;
1871 __BIND_TEXT(db, stmt, idx++, mfx->package);
1872 __BIND_TEXT(db, stmt, idx++, dep->depends_on);
1873 __BIND_TEXT(db, stmt, idx++, dep->type);
1874 __BIND_TEXT(db, stmt, idx++, dep->required_version);
1876 ret = sqlite3_step(stmt);
1877 if (ret != SQLITE_DONE) {
1878 _LOGE("step failed: %s", sqlite3_errmsg(db));
1879 sqlite3_finalize(stmt);
1882 sqlite3_reset(stmt);
1885 sqlite3_finalize(stmt);
1890 /* _PRODUCT_LAUNCHING_ENHANCED_
1891 * app->indicatordisplay, app->portraitimg, app->landscapeimg,
1892 * app->guestmode_appstatus
1894 static int __insert_application_info(sqlite3 *db, manifest_x *mfx)
1896 static const char query[] =
1897 "INSERT INTO package_app_info (app_id, app_component,"
1898 " app_exec, app_nodisplay, app_type, app_onboot, app_multiple,"
1899 " app_autorestart, app_taskmanage, app_hwacceleration,"
1900 " app_screenreader, app_mainapp, app_recentimage,"
1901 " app_launchcondition, app_indicatordisplay, app_portraitimg,"
1902 " app_landscapeimg, app_guestmodevisibility,"
1903 " app_permissiontype, app_preload, app_submode,"
1904 " app_submode_mainid, app_installed_storage, app_process_pool,"
1905 " app_launch_mode, app_ui_gadget, app_support_mode,"
1906 " app_support_disable, component_type, package, app_tep_name,"
1907 " app_zip_mount_file, app_background_category,"
1908 " app_package_type, app_root_path, app_api_version,"
1909 " app_effective_appid, app_splash_screen_display,"
1910 " app_package_system, app_removable,"
1911 " app_package_installed_time, app_support_ambient,"
1912 " app_external_path, app_setup_appid) "
1914 " ?, LOWER(?), ?, LOWER(?), LOWER(?),"
1915 " LOWER(?), LOWER(?), ?,"
1919 " ?, LOWER(?), LOWER(?),"
1921 " COALESCE(?, 'single'), LOWER(?), ?,"
1922 " LOWER(?), ?, ?, ?,"
1926 " LOWER(?), LOWER(?),"
1935 const char *effective_appid;
1938 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1939 if (ret != SQLITE_OK) {
1940 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1944 for (tmp = mfx->application; tmp; tmp = tmp->next) {
1945 app = (application_x *)tmp->data;
1949 bg_category = __convert_background_category(
1950 app->background_category);
1951 effective_appid = __find_effective_appid(app->metadata);
1954 __BIND_TEXT(db, stmt, idx++, app->appid);
1955 __BIND_TEXT(db, stmt, idx++, app->component_type);
1956 __BIND_TEXT(db, stmt, idx++, app->exec);
1957 __BIND_TEXT(db, stmt, idx++, __get_bool(app->nodisplay, false));
1958 __BIND_TEXT(db, stmt, idx++, app->type);
1959 __BIND_TEXT(db, stmt, idx++, __get_bool(app->onboot, false));
1960 __BIND_TEXT(db, stmt, idx++, __get_bool(app->multiple, false));
1961 __BIND_TEXT(db, stmt, idx++,
1962 __get_bool(app->autorestart, false));
1963 __BIND_TEXT(db, stmt, idx++,
1964 __get_bool(app->taskmanage, false));
1965 __BIND_TEXT(db, stmt, idx++, app->hwacceleration);
1966 __BIND_TEXT(db, stmt, idx++, app->screenreader);
1967 __BIND_TEXT(db, stmt, idx++, __get_bool(app->mainapp, false));
1968 __BIND_TEXT(db, stmt, idx++, app->recentimage);
1969 __BIND_TEXT(db, stmt, idx++, app->launchcondition);
1970 __BIND_TEXT(db, stmt, idx++,
1971 __get_bool(app->indicatordisplay, true));
1972 __BIND_TEXT(db, stmt, idx++, app->portraitimg);
1973 __BIND_TEXT(db, stmt, idx++, app->landscapeimg);
1974 __BIND_TEXT(db, stmt, idx++,
1975 __get_bool(app->guestmode_visibility, true));
1976 __BIND_TEXT(db, stmt, idx++, app->permission_type);
1977 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->preload, false));
1978 __BIND_TEXT(db, stmt, idx++, __get_bool(app->submode, false));
1979 __BIND_TEXT(db, stmt, idx++, app->submode_mainid);
1980 __BIND_TEXT(db, stmt, idx++, mfx->installed_storage);
1981 __BIND_TEXT(db, stmt, idx++,
1982 __get_bool(app->process_pool, false));
1983 __BIND_TEXT(db, stmt, idx++, app->launch_mode);
1984 __BIND_TEXT(db, stmt, idx++, __get_bool(app->ui_gadget, false));
1985 __BIND_TEXT(db, stmt, idx++,
1986 app->support_mode ? app->support_mode : "0");
1987 __BIND_TEXT(db, stmt, idx++,
1988 __get_bool(mfx->support_disable, false));
1989 __BIND_TEXT(db, stmt, idx++, app->component_type);
1990 __BIND_TEXT(db, stmt, idx++, mfx->package);
1991 __BIND_TEXT(db, stmt, idx++, mfx->tep_name);
1992 __BIND_TEXT(db, stmt, idx++, mfx->zip_mount_file);
1993 __BIND_INT(db, stmt, idx++, bg_category);
1994 __BIND_TEXT(db, stmt, idx++, mfx->type ? mfx->type : "tpk");
1995 __BIND_TEXT(db, stmt, idx++, mfx->root_path);
1996 __BIND_TEXT(db, stmt, idx++, app->api_version);
1997 __BIND_TEXT(db, stmt, idx++, effective_appid);
1998 __BIND_TEXT(db, stmt, idx++,
1999 __get_bool(app->splash_screen_display, true));
2000 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->system, false));
2001 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->removable, false));
2002 __BIND_TEXT(db, stmt, idx++, mfx->installed_time);
2003 __BIND_TEXT(db, stmt, idx++,
2004 __get_bool(app->support_ambient, false));
2005 __BIND_TEXT(db, stmt, idx++, mfx->external_path);
2006 __BIND_TEXT(db, stmt, idx++, app->setup_appid);
2008 ret = sqlite3_step(stmt);
2009 if (ret != SQLITE_DONE) {
2010 _LOGE("step failed: %s", sqlite3_errmsg(db));
2011 sqlite3_finalize(stmt);
2015 sqlite3_reset(stmt);
2017 if (__insert_appcontrol_info(db, app)) {
2018 sqlite3_finalize(stmt);
2021 if (__insert_category_info(db, app)) {
2022 sqlite3_finalize(stmt);
2025 if (__insert_metadata_info(db, app)) {
2026 sqlite3_finalize(stmt);
2029 if (__insert_datacontrol_info(db, app)) {
2030 sqlite3_finalize(stmt);
2033 ss_list = __find_splashscreens(app->splashscreens);
2034 if (__insert_splashscreen_info(db, app, ss_list)) {
2035 g_list_free(ss_list);
2036 sqlite3_finalize(stmt);
2039 g_list_free(ss_list);
2040 if (__insert_app_localized_info(db, app)) {
2041 sqlite3_finalize(stmt);
2046 sqlite3_finalize(stmt);
2051 static int __insert_package_update_info(sqlite3 *db, manifest_x *mfx)
2053 static const char query[] =
2054 "INSERT INTO package_update_info (package, update_version) "
2060 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2061 if (ret != SQLITE_OK) {
2062 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2067 __BIND_TEXT(db, stmt, idx++, mfx->package);
2068 __BIND_TEXT(db, stmt, idx, mfx->version);
2069 ret = sqlite3_step(stmt);
2070 if (ret != SQLITE_DONE) {
2071 _LOGE("step failed: %s", sqlite3_errmsg(db));
2072 sqlite3_finalize(stmt);
2075 sqlite3_finalize(stmt);
2080 static int __insert_package_localized_info(sqlite3 *db, manifest_x *mfx)
2082 static const char query[] =
2083 "INSERT INTO package_localized_info (package, package_locale,"
2084 " package_label, package_icon, package_description,"
2085 " package_license, package_author) "
2086 "VALUES (?, ?, ?, ?, ?, ?, ?)";
2099 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2100 if (ret != SQLITE_OK) {
2101 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2105 locales = __create_locale_list(mfx->label, mfx->license, mfx->icon,
2106 mfx->description, mfx->author);
2107 for (tmp = locales; tmp; tmp = tmp->next) {
2108 locale = (const char *)tmp->data;
2114 __extract_data(locale, mfx->label, mfx->license, mfx->icon,
2115 mfx->description, mfx->author,
2116 &label, &license, &icon, &description, &author);
2117 if (!label && !license && !icon && !description && !author)
2121 __BIND_TEXT(db, stmt, idx++, mfx->package);
2122 __BIND_TEXT(db, stmt, idx++, locale);
2123 __BIND_TEXT(db, stmt, idx++, label);
2124 __BIND_TEXT(db, stmt, idx++, icon);
2125 __BIND_TEXT(db, stmt, idx++, description);
2126 __BIND_TEXT(db, stmt, idx++, license);
2127 __BIND_TEXT(db, stmt, idx++, author);
2129 ret = sqlite3_step(stmt);
2130 if (ret != SQLITE_DONE) {
2131 _LOGE("step failed: %s", sqlite3_errmsg(db));
2132 g_list_free(locales);
2133 sqlite3_finalize(stmt);
2137 sqlite3_reset(stmt);
2140 g_list_free(locales);
2141 sqlite3_finalize(stmt);
2146 static int __insert_package_info(sqlite3 *db, manifest_x *mfx)
2148 static const char query[] =
2149 "INSERT INTO package_info (package, package_type,"
2150 " package_version, package_api_version, package_tep_name,"
2151 " package_zip_mount_file, install_location, package_size,"
2152 " package_removable, package_preload, package_readonly,"
2153 " package_update, package_appsetting, package_nodisplay,"
2154 " package_system, author_name, author_email, author_href,"
2155 " installed_time, installed_storage, storeclient_id,"
2156 " mainapp_id, package_url, root_path, external_path,"
2157 " csc_path, package_support_mode, package_support_disable) "
2161 " LOWER(?), LOWER(?), LOWER(?),"
2162 " LOWER(?), LOWER(?), LOWER(?),"
2163 " LOWER(?), ?, ?, ?,"
2170 const char *author_name = NULL;
2171 const char *author_email = NULL;
2172 const char *author_href = NULL;
2174 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2175 if (ret != SQLITE_OK) {
2176 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2180 if (mfx->author && mfx->author->data) {
2181 author_name = ((author_x *)mfx->author->data)->text;
2182 author_email = ((author_x *)mfx->author->data)->email;
2183 author_href = ((author_x *)mfx->author->data)->href;
2186 __BIND_TEXT(db, stmt, idx++, mfx->package);
2187 __BIND_TEXT(db, stmt, idx++, mfx->type);
2188 __BIND_TEXT(db, stmt, idx++, mfx->version);
2189 __BIND_TEXT(db, stmt, idx++, mfx->api_version);
2190 __BIND_TEXT(db, stmt, idx++, mfx->tep_name);
2191 __BIND_TEXT(db, stmt, idx++, mfx->zip_mount_file);
2192 __BIND_TEXT(db, stmt, idx++, mfx->installlocation);
2193 __BIND_TEXT(db, stmt, idx++, mfx->package_size);
2194 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->removable, true));
2195 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->preload, false));
2196 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->readonly, false));
2197 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->update, false));
2198 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->appsetting, false));
2199 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->nodisplay_setting, false));
2200 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->system, false));
2201 __BIND_TEXT(db, stmt, idx++, author_name);
2202 __BIND_TEXT(db, stmt, idx++, author_email);
2203 __BIND_TEXT(db, stmt, idx++, author_href);
2204 __BIND_TEXT(db, stmt, idx++, mfx->installed_time);
2205 __BIND_TEXT(db, stmt, idx++, mfx->installed_storage);
2206 __BIND_TEXT(db, stmt, idx++, mfx->storeclient_id);
2207 __BIND_TEXT(db, stmt, idx++, mfx->mainapp_id);
2208 __BIND_TEXT(db, stmt, idx++, mfx->package_url);
2209 __BIND_TEXT(db, stmt, idx++, mfx->root_path);
2210 __BIND_TEXT(db, stmt, idx++, mfx->external_path);
2211 __BIND_TEXT(db, stmt, idx++, mfx->csc_path);
2212 __BIND_TEXT(db, stmt, idx++,
2213 mfx->support_mode ? mfx->support_mode : "0");
2214 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->support_disable, false));
2216 ret = sqlite3_step(stmt);
2217 if (ret != SQLITE_DONE) {
2218 _LOGE("step failed: %s", sqlite3_errmsg(db));
2219 sqlite3_finalize(stmt);
2223 sqlite3_finalize(stmt);
2225 if (__insert_package_update_info(db, mfx))
2227 if (__insert_package_localized_info(db, mfx))
2229 if (__insert_application_info(db, mfx))
2231 if (__insert_package_privilege_info(db, mfx))
2233 if (__insert_package_appdefined_privilege_info(db, mfx))
2235 if (__insert_package_dependency_info(db, mfx))
2241 API int pkgmgr_parser_insert_manifest_info_in_usr_db(manifest_x *mfx, uid_t uid)
2248 _LOGE("invalid parameter");
2249 return PM_PARSER_R_EINVAL;
2252 dbpath = __get_parser_db_path(uid);
2254 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2255 if (ret != SQLITE_OK) {
2256 _LOGE("open db failed: %d", ret);
2257 return PM_PARSER_R_ERROR;
2260 __BEGIN_TRANSACTION(db);
2261 __DO_TRANSACTION(db, __insert_package_info(db, mfx));
2262 __END_TRANSACTION(db);
2264 sqlite3_close_v2(db);
2266 return PM_PARSER_R_OK;
2269 API int pkgmgr_parser_insert_manifest_info_in_db(manifest_x *mfx)
2271 return pkgmgr_parser_insert_manifest_info_in_usr_db(mfx, __getuid());
2274 static int __delete_package_info(sqlite3 *db, const char *pkgid)
2276 static const char query[] =
2277 "DELETE FROM package_info WHERE package=?";
2281 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2282 if (ret != SQLITE_OK) {
2283 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2287 __BIND_TEXT(db, stmt, 1, pkgid);
2289 ret = sqlite3_step(stmt);
2290 if (ret != SQLITE_DONE) {
2291 _LOGE("step failed: %s", sqlite3_errmsg(db));
2292 sqlite3_finalize(stmt);
2296 sqlite3_finalize(stmt);
2301 API int pkgmgr_parser_delete_manifest_info_from_usr_db(manifest_x *mfx,
2309 _LOGE("invalid parameter");
2310 return PM_PARSER_R_EINVAL;
2313 dbpath = __get_parser_db_path(uid);
2315 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2316 if (ret != SQLITE_OK) {
2317 _LOGE("open db failed: %d", ret);
2318 return PM_PARSER_R_ERROR;
2321 __BEGIN_TRANSACTION(db);
2322 __DO_TRANSACTION(db, __delete_package_info(db, mfx->package));
2323 __END_TRANSACTION(db);
2325 sqlite3_close_v2(db);
2327 return PM_PARSER_R_OK;
2330 API int pkgmgr_parser_delete_manifest_info_from_db(manifest_x *mfx)
2332 return pkgmgr_parser_delete_manifest_info_from_usr_db(mfx, __getuid());
2335 API int pkgmgr_parser_update_manifest_info_in_usr_db(manifest_x *mfx, uid_t uid)
2342 _LOGE("invalid parameter");
2343 return PM_PARSER_R_EINVAL;
2346 dbpath = __get_parser_db_path(uid);
2348 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2349 if (ret != SQLITE_OK) {
2350 _LOGE("open db failed: %d", ret);
2351 return PM_PARSER_R_ERROR;
2354 __BEGIN_TRANSACTION(db);
2355 __DO_TRANSACTION(db, __delete_package_info(db, mfx->package));
2356 __DO_TRANSACTION(db, __insert_package_info(db, mfx));
2357 __END_TRANSACTION(db);
2359 sqlite3_close_v2(db);
2361 return PM_PARSER_R_OK;
2364 API int pkgmgr_parser_update_manifest_info_in_db(manifest_x *mfx)
2366 return pkgmgr_parser_update_manifest_info_in_usr_db(mfx, __getuid());
2369 static int __set_global_app_disable_for_uid(sqlite3 *db, const char *appid,
2370 uid_t uid, bool is_disable)
2372 static const char query[] =
2373 "INSERT OR REPLACE INTO package_app_info_for_uid ("
2374 " app_id, uid, is_disabled, is_splash_screen_enabled) "
2376 " (SELECT app_splash_screen_display FROM package_app_info"
2377 " WHERE app_id=?))";
2382 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2383 if (ret != SQLITE_OK) {
2384 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2388 __BIND_TEXT(db, stmt, idx++, appid);
2389 __BIND_INT(db, stmt, idx++, uid);
2390 __BIND_TEXT(db, stmt, idx++, is_disable ? "true" : "false");
2391 __BIND_TEXT(db, stmt, idx++, appid);
2393 ret = sqlite3_step(stmt);
2394 if (ret != SQLITE_DONE) {
2395 _LOGE("step failed: %s", sqlite3_errmsg(db));
2396 sqlite3_finalize(stmt);
2400 sqlite3_finalize(stmt);
2405 API int pkgmgr_parser_update_global_app_disable_for_uid_info_in_db(
2406 const char *appid, uid_t uid, int is_disable)
2412 if (appid == NULL) {
2413 _LOGE("invalid parameter");
2414 return PM_PARSER_R_EINVAL;
2417 dbpath = __get_parser_db_path(GLOBAL_USER);
2419 ret = __open_db(GLOBAL_USER, dbpath, &db, SQLITE_OPEN_READWRITE);
2420 if (ret != SQLITE_OK) {
2421 _LOGE("open db failed: %d", ret);
2422 return PM_PARSER_R_ERROR;
2425 __BEGIN_TRANSACTION(db);
2426 __DO_TRANSACTION(db, __set_global_app_disable_for_uid(db, appid,
2427 uid, (bool)is_disable));
2428 __END_TRANSACTION(db);
2430 sqlite3_close_v2(db);
2432 return PM_PARSER_R_OK;
2435 static int __set_app_disable(sqlite3 *db, const char *appid, uid_t uid,
2438 static const char query[] =
2439 "UPDATE package_app_info SET app_disable=? "
2445 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2446 if (ret != SQLITE_OK) {
2447 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2451 __BIND_TEXT(db, stmt, idx++, is_disable ? "true" : "false");
2452 __BIND_TEXT(db, stmt, idx++, appid);
2454 ret = sqlite3_step(stmt);
2455 if (ret != SQLITE_DONE) {
2456 _LOGE("step failed: %s", sqlite3_errmsg(db));
2457 sqlite3_finalize(stmt);
2461 sqlite3_finalize(stmt);
2466 API int pkgmgr_parser_update_app_disable_info_in_usr_db(const char *appid,
2467 uid_t uid, int is_disable)
2473 if (appid == NULL) {
2474 _LOGE("invalid parameter");
2475 return PM_PARSER_R_EINVAL;
2478 dbpath = __get_parser_db_path(uid);
2480 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2481 if (ret != SQLITE_OK) {
2482 _LOGE("open db failed: %d", ret);
2483 return PM_PARSER_R_ERROR;
2486 __BEGIN_TRANSACTION(db);
2487 __DO_TRANSACTION(db, __set_app_disable(db, appid, uid,
2489 __END_TRANSACTION(db);
2491 sqlite3_close_v2(db);
2493 return PM_PARSER_R_OK;
2496 API int pkgmgr_parser_update_app_disable_info_in_db(const char *appid,
2499 return pkgmgr_parser_update_app_disable_info_in_usr_db(appid,
2500 __getuid(), is_disable);
2503 static int __set_pkg_disable(sqlite3 *db, const char *pkgid, uid_t uid,
2506 static const char query[] =
2507 "UPDATE package_info SET package_disable=? "
2513 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2514 if (ret != SQLITE_OK) {
2515 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2519 __BIND_TEXT(db, stmt, idx++, is_disable ? "true" : "false");
2520 __BIND_TEXT(db, stmt, idx++, pkgid);
2522 ret = sqlite3_step(stmt);
2523 if (ret != SQLITE_DONE) {
2524 _LOGE("step failed: %s", sqlite3_errmsg(db));
2525 sqlite3_finalize(stmt);
2529 sqlite3_finalize(stmt);
2534 API int pkgmgr_parser_update_pkg_disable_info_in_usr_db(const char *pkgid,
2535 uid_t uid, int is_disable)
2541 if (pkgid == NULL) {
2542 _LOGE("invalid parameter");
2543 return PM_PARSER_R_EINVAL;
2546 dbpath = __get_parser_db_path(uid);
2548 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2549 if (ret != SQLITE_OK) {
2550 _LOGE("open db failed: %d", ret);
2551 return PM_PARSER_R_ERROR;
2554 __BEGIN_TRANSACTION(db);
2555 __DO_TRANSACTION(db, __set_pkg_disable(db, pkgid, uid,
2557 __END_TRANSACTION(db);
2559 sqlite3_close_v2(db);
2561 return PM_PARSER_R_OK;
2564 API int pkgmgr_parser_update_pkg_disable_info_in_db(const char *pkgid,
2567 return pkgmgr_parser_update_pkg_disable_info_in_usr_db(pkgid,
2568 __getuid(), is_disable);
2571 static int __set_global_app_splash_screen_for_uid(sqlite3 *db,
2572 const char *appid, uid_t uid, bool is_enabled)
2574 static const char query[] =
2575 "INSERT OR REPLACE INTO package_app_info_for_uid("
2576 " appid, uid, is_splash_screen_enabled) "
2582 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2583 if (ret != SQLITE_OK) {
2584 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2588 __BIND_TEXT(db, stmt, idx++, appid);
2589 __BIND_INT(db, stmt, idx++, uid);
2590 __BIND_TEXT(db, stmt, idx++, is_enabled ? "true" : "false");
2592 ret = sqlite3_step(stmt);
2593 if (ret != SQLITE_DONE) {
2594 _LOGE("step failed: %s", sqlite3_errmsg(db));
2595 sqlite3_finalize(stmt);
2599 sqlite3_finalize(stmt);
2604 API int pkgmgr_parser_update_global_app_splash_screen_display_info_in_usr_db(
2605 const char *appid, uid_t uid, int flag)
2611 if (appid == NULL) {
2612 _LOGE("invalid parameter");
2613 return PM_PARSER_R_EINVAL;
2616 dbpath = __get_parser_db_path(GLOBAL_USER);
2618 ret = __open_db(GLOBAL_USER, dbpath, &db, SQLITE_OPEN_READWRITE);
2619 if (ret != SQLITE_OK) {
2620 _LOGE("open db failed: %d", ret);
2621 return PM_PARSER_R_ERROR;
2624 __BEGIN_TRANSACTION(db);
2625 __DO_TRANSACTION(db, __set_global_app_splash_screen_for_uid(db,
2626 appid, uid, (bool)flag));
2627 __END_TRANSACTION(db);
2629 sqlite3_close_v2(db);
2631 return PM_PARSER_R_OK;
2634 static int __set_app_splash_screen(sqlite3 *db, const char *appid,
2637 static const char query[] =
2638 "UPDATE package_app_info SET app_splash_screen_display=? "
2644 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2645 if (ret != SQLITE_OK) {
2646 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2650 __BIND_TEXT(db, stmt, idx++, is_enabled ? "true" : "false");
2651 __BIND_TEXT(db, stmt, idx++, appid);
2653 ret = sqlite3_step(stmt);
2654 if (ret != SQLITE_DONE) {
2655 _LOGE("step failed: %s", sqlite3_errmsg(db));
2656 sqlite3_finalize(stmt);
2660 sqlite3_finalize(stmt);
2665 API int pkgmgr_parser_update_app_splash_screen_display_info_in_usr_db(
2666 const char *appid, uid_t uid, int flag)
2672 if (appid == NULL) {
2673 _LOGE("invalid parameter");
2674 return PM_PARSER_R_EINVAL;
2677 dbpath = __get_parser_db_path(uid);
2679 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2680 if (ret != SQLITE_OK) {
2681 _LOGE("open db failed: %d", ret);
2682 return PM_PARSER_R_ERROR;
2685 __BEGIN_TRANSACTION(db);
2686 __DO_TRANSACTION(db, __set_app_splash_screen(db, appid, (bool)flag));
2687 __END_TRANSACTION(db);
2689 sqlite3_close_v2(db);
2691 return PM_PARSER_R_OK;
2694 API int pkgmgr_parser_update_app_splash_screen_display_info_in_db(
2695 const char *appid, int flag)
2697 return pkgmgr_parser_update_app_splash_screen_display_info_in_usr_db(
2698 appid, __getuid(), flag);
2701 static int __set_app_label(sqlite3 *db, const char *appid, const char *label)
2703 static const char query[] =
2704 "UPDATE package_app_localized_info SET app_label=? "
2705 "WHERE app_id=? AND app_label IS NOT NULL";
2710 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2711 if (ret != SQLITE_OK) {
2712 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2716 __BIND_TEXT(db, stmt, idx++, label);
2717 __BIND_TEXT(db, stmt, idx++, appid);
2719 ret = sqlite3_step(stmt);
2720 if (ret != SQLITE_DONE) {
2721 _LOGE("step failed: %s", sqlite3_errmsg(db));
2722 sqlite3_finalize(stmt);
2726 sqlite3_finalize(stmt);
2731 API int pkgmgr_parser_update_app_label_info_in_usr_db(const char *appid,
2732 uid_t uid, const char *label)
2738 if (appid == NULL) {
2739 _LOGE("invalid parameter");
2740 return PM_PARSER_R_EINVAL;
2743 dbpath = __get_parser_db_path(uid);
2745 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2746 if (ret != SQLITE_OK) {
2747 _LOGE("open db failed: %d", ret);
2748 return PM_PARSER_R_ERROR;
2751 __BEGIN_TRANSACTION(db);
2752 __DO_TRANSACTION(db, __set_app_label(db, appid, label));
2753 __END_TRANSACTION(db);
2755 sqlite3_close_v2(db);
2757 return PM_PARSER_R_OK;
2760 API int pkgmgr_parser_update_app_label_info_in_db(const char *appid,
2763 return pkgmgr_parser_update_app_label_info_in_usr_db(appid, __getuid(),
2767 static int __set_app_icon(sqlite3 *db, const char *appid, const char *icon_path)
2769 static const char query[] =
2770 "UPDATE package_app_localized_info SET app_icon=? "
2771 "WHERE app_id=? AND app_icon IS NOT NULL";
2776 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2777 if (ret != SQLITE_OK) {
2778 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2782 __BIND_TEXT(db, stmt, idx++, icon_path);
2783 __BIND_TEXT(db, stmt, idx++, appid);
2785 ret = sqlite3_step(stmt);
2786 if (ret != SQLITE_DONE) {
2787 _LOGE("step failed: %s", sqlite3_errmsg(db));
2788 sqlite3_finalize(stmt);
2792 sqlite3_finalize(stmt);
2797 API int pkgmgr_parser_update_app_icon_info_in_usr_db(const char *appid,
2798 uid_t uid, const char *icon_path)
2804 if (appid == NULL) {
2805 _LOGE("invalid parameter");
2806 return PM_PARSER_R_EINVAL;
2809 dbpath = __get_parser_db_path(uid);
2811 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2812 if (ret != SQLITE_OK) {
2813 _LOGE("open db failed: %d", ret);
2814 return PM_PARSER_R_ERROR;
2817 __BEGIN_TRANSACTION(db);
2818 __DO_TRANSACTION(db, __set_app_icon(db, appid, icon_path));
2819 __END_TRANSACTION(db);
2821 sqlite3_close_v2(db);
2823 return PM_PARSER_R_OK;
2826 API int pkgmgr_parser_update_app_icon_info_in_db(const char *appid,
2827 const char *icon_path)
2829 return pkgmgr_parser_update_app_icon_info_in_usr_db(appid, __getuid(),
2833 static int __set_tep_path(sqlite3 *db, const char *pkgid, const char *tep_path)
2835 static const char query[] =
2836 "UPDATE package_info SET package_tep_name=? "
2842 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2843 if (ret != SQLITE_OK) {
2844 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2848 __BIND_TEXT(db, stmt, idx++, tep_path);
2849 __BIND_TEXT(db, stmt, idx++, pkgid);
2851 ret = sqlite3_step(stmt);
2852 if (ret != SQLITE_DONE) {
2853 _LOGE("step failed: %s", sqlite3_errmsg(db));
2854 sqlite3_finalize(stmt);
2858 sqlite3_finalize(stmt);
2863 API int pkgmgr_parser_update_tep_info_in_usr_db(const char *pkgid,
2864 const char *tep_path, uid_t uid)
2870 if (pkgid == NULL) {
2871 _LOGE("invalid parameter");
2872 return PM_PARSER_R_EINVAL;
2875 dbpath = __get_parser_db_path(uid);
2877 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2878 if (ret != SQLITE_OK) {
2879 _LOGE("open db failed: %d", ret);
2880 return PM_PARSER_R_ERROR;
2883 __BEGIN_TRANSACTION(db);
2884 __DO_TRANSACTION(db, __set_tep_path(db, pkgid, tep_path));
2885 __END_TRANSACTION(db);
2887 sqlite3_close_v2(db);
2889 return PM_PARSER_R_OK;
2892 API int pkgmgr_parser_update_tep_info_in_db(const char *pkgid,
2893 const char *tep_path)
2895 return pkgmgr_parser_update_tep_info_in_usr_db(pkgid, tep_path,
2899 static int __convert_update_type(pkgmgrinfo_updateinfo_update_type type,
2900 const char **update_type)
2902 if (type == PMINFO_UPDATEINFO_NONE)
2903 *update_type = PMINFO_UPDATEINFO_TYPE_NONE;
2904 else if (type == PMINFO_UPDATEINFO_FORCE)
2905 *update_type = PMINFO_UPDATEINFO_TYPE_FORCE;
2906 else if (type == PMINFO_UPDATEINFO_OPTIONAL)
2907 *update_type = PMINFO_UPDATEINFO_TYPE_OPTIONAL;
2913 static int __register_pkg_update_info(sqlite3 *db, updateinfo_x *info,
2914 const char *update_type)
2916 static const char query[] =
2917 "UPDATE package_update_info "
2918 "SET update_version=?, update_type=? "
2924 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2925 if (ret != SQLITE_OK) {
2926 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2930 __BIND_TEXT(db, stmt, idx++, info->version);
2931 __BIND_TEXT(db, stmt, idx++, update_type);
2932 __BIND_TEXT(db, stmt, idx++, info->pkgid);
2934 ret = sqlite3_step(stmt);
2935 if (ret != SQLITE_DONE) {
2936 _LOGE("step failed: %s", sqlite3_errmsg(db));
2937 sqlite3_finalize(stmt);
2941 sqlite3_finalize(stmt);
2946 API int pkgmgr_parser_register_pkg_update_info_in_usr_db(
2947 pkgmgrinfo_updateinfo_h handle, uid_t uid)
2950 updateinfo_x *update_info;
2951 updateinfo_x *prev_update_info;
2952 pkgmgrinfo_updateinfo_h prev_update_handle;
2953 pkgmgrinfo_pkginfo_h pkginfo;
2954 pkgmgrinfo_version_compare_type compare_result;
2956 const char *update_type;
2960 if (handle == NULL) {
2961 _LOGE("invalid parameter");
2962 return PM_PARSER_R_EINVAL;
2965 update_info = (updateinfo_x *)handle;
2966 if (update_info->pkgid == NULL || update_info->version == NULL)
2967 return PM_PARSER_R_EINVAL;
2968 if (__convert_update_type(update_info->type, &update_type) != 0)
2969 return PM_PARSER_R_EINVAL;
2971 ret = pkgmgrinfo_updateinfo_get_usr_updateinfo(update_info->pkgid,
2972 &prev_update_handle, uid);
2973 if (ret != PMINFO_R_OK)
2974 return PM_PARSER_R_ERROR;
2976 prev_update_info = (updateinfo_x *)prev_update_handle;
2977 ret = pkgmgrinfo_compare_package_version(update_info->version,
2978 prev_update_info->version, &compare_result);
2979 if (ret != PMINFO_R_OK) {
2980 pkgmgrinfo_updateinfo_destroy(prev_update_handle);
2981 return PM_PARSER_R_ERROR;
2984 if (compare_result == PMINFO_VERSION_SAME &&
2985 prev_update_info->type == PMINFO_UPDATEINFO_NONE) {
2986 _LOGI("Given update info version[%s] of pkgid[%s] "
2988 update_info->version, update_info->pkgid);
2989 pkgmgrinfo_updateinfo_destroy(prev_update_handle);
2990 return PM_PARSER_R_OK;
2992 pkgmgrinfo_updateinfo_destroy(prev_update_handle);
2994 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(update_info->pkgid, uid,
2996 if (ret != PMINFO_R_OK)
2997 return PM_PARSER_R_ERROR;
2999 ret = pkgmgrinfo_pkginfo_is_global(pkginfo, &is_global_pkg);
3000 if (ret != PMINFO_R_OK) {
3001 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
3002 return PM_PARSER_R_ERROR;
3004 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
3006 dbpath = __get_parser_db_path(is_global_pkg ? GLOBAL_USER : uid);
3008 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
3009 if (ret != SQLITE_OK) {
3010 _LOGE("open db failed: %d", ret);
3011 return PM_PARSER_R_ERROR;
3014 __BEGIN_TRANSACTION(db);
3015 __DO_TRANSACTION(db, __register_pkg_update_info(db, update_info,
3017 __END_TRANSACTION(db);
3019 sqlite3_close_v2(db);
3021 return PM_PARSER_R_OK;
3024 API int pkgmgr_parser_register_pkg_update_info_in_db(
3025 pkgmgrinfo_updateinfo_h handle)
3027 return pkgmgr_parser_register_pkg_update_info_in_usr_db(handle,
3031 static int __unregister_pkg_update_info(sqlite3 *db, const char *pkgid)
3033 static const char query[] =
3034 "UPDATE package_update_info SET update_type='none' "
3040 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
3041 if (ret != SQLITE_OK) {
3042 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
3046 __BIND_TEXT(db, stmt, idx++, pkgid);
3048 ret = sqlite3_step(stmt);
3049 if (ret != SQLITE_DONE) {
3050 _LOGE("step failed: %s", sqlite3_errmsg(db));
3051 sqlite3_finalize(stmt);
3055 sqlite3_finalize(stmt);
3060 API int pkgmgr_parser_unregister_pkg_update_info_in_usr_db(const char *pkgid,
3066 pkgmgrinfo_pkginfo_h pkginfo;
3069 if (pkgid == NULL) {
3070 _LOGE("invalid parameter");
3071 return PM_PARSER_R_EINVAL;
3074 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &pkginfo);
3075 if (ret != PMINFO_R_OK)
3076 return PM_PARSER_R_EINVAL;
3078 ret = pkgmgrinfo_pkginfo_is_global(pkginfo, &is_global_pkg);
3079 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
3080 if (ret != PMINFO_R_OK)
3081 return PM_PARSER_R_ERROR;
3083 dbpath = __get_parser_db_path(is_global_pkg ? GLOBAL_USER : uid);
3085 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
3086 if (ret != SQLITE_OK) {
3087 _LOGE("open db failed: %d", ret);
3088 return PM_PARSER_R_ERROR;
3091 __BEGIN_TRANSACTION(db);
3092 __DO_TRANSACTION(db, __unregister_pkg_update_info(db, pkgid));
3093 __END_TRANSACTION(db);
3095 sqlite3_close_v2(db);
3097 return PM_PARSER_R_OK;
3100 API int pkgmgr_parser_unregister_pkg_update_info_in_db(const char *pkgid)
3102 return pkgmgr_parser_unregister_pkg_update_info_in_usr_db(pkgid,
3106 static int __unregister_all_pkg_update_info(sqlite3 *db)
3108 static const char query[] =
3109 "UPDATE package_update_info SET update_type='none'";
3113 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
3114 if (ret != SQLITE_OK) {
3115 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
3119 ret = sqlite3_step(stmt);
3120 if (ret != SQLITE_DONE) {
3121 _LOGE("step failed: %s", sqlite3_errmsg(db));
3122 sqlite3_finalize(stmt);
3126 sqlite3_finalize(stmt);
3131 API int pkgmgr_parser_unregister_all_pkg_update_info_in_usr_db(uid_t uid)
3137 dbpath = __get_parser_db_path(uid);
3139 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
3140 if (ret != SQLITE_OK) {
3141 _LOGE("open db failed: %d", ret);
3142 return PM_PARSER_R_ERROR;
3145 __BEGIN_TRANSACTION(db);
3146 __DO_TRANSACTION(db, __unregister_all_pkg_update_info(db));
3147 __END_TRANSACTION(db);
3149 sqlite3_close_v2(db);
3151 return PM_PARSER_R_OK;
3154 API int pkgmgr_parser_unregister_all_pkg_update_info_in_db(void)
3156 return pkgmgr_parser_unregister_all_pkg_update_info_in_usr_db(
3160 API int pkgmgr_parser_register_pkg_plugin_info_in_usr_db(
3161 manifest_x *mfx, uid_t uid)
3168 return PM_PARSER_R_EINVAL;
3169 dbpath = __get_parser_db_path(uid);
3170 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
3171 if (ret != SQLITE_OK) {
3172 _LOGE("open db failed: %d", ret);
3173 return PM_PARSER_R_ERROR;
3176 __BEGIN_TRANSACTION(db);
3177 __DO_TRANSACTION(db, __insert_package_plugin_execution_info(db, mfx));
3178 __END_TRANSACTION(db);
3180 sqlite3_close_v2(db);
3182 return PM_PARSER_R_OK;
3185 API int pkgmgr_parser_register_pkg_plugin_info_in_db(manifest_x *mfx)
3187 return pkgmgr_parser_register_pkg_plugin_info_in_usr_db(mfx, __getuid());
3190 API int pkgmgr_parser_update_pkg_plugin_info_in_usr_db(
3191 manifest_x *mfx, uid_t uid)
3198 return PM_PARSER_R_EINVAL;
3199 dbpath = __get_parser_db_path(uid);
3200 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
3201 if (ret != SQLITE_OK) {
3202 _LOGE("open db failed: %d", ret);
3203 return PM_PARSER_R_ERROR;
3206 __BEGIN_TRANSACTION(db);
3207 __DO_TRANSACTION(db, __delete_package_plugin_execution_info(db, mfx->package));
3208 __DO_TRANSACTION(db, __insert_package_plugin_execution_info(db, mfx));
3209 __END_TRANSACTION(db);
3211 sqlite3_close_v2(db);
3213 return PM_PARSER_R_OK;
3216 API int pkgmgr_parser_update_pkg_plugin_info_in_db(manifest_x *mfx)
3218 return pkgmgr_parser_update_pkg_plugin_info_in_usr_db(mfx, __getuid());
3221 API int pkgmgr_parser_unregister_pkg_plugin_info_in_usr_db(
3222 const char *pkgid, uid_t uid)
3228 dbpath = __get_parser_db_path(uid);
3229 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
3230 if (ret != SQLITE_OK) {
3231 _LOGE("open db failed: %d", ret);
3232 return PM_PARSER_R_ERROR;
3235 __BEGIN_TRANSACTION(db);
3236 __DO_TRANSACTION(db, __delete_package_plugin_execution_info(db, pkgid));
3237 __END_TRANSACTION(db);
3239 sqlite3_close_v2(db);
3241 return PM_PARSER_R_OK;
3244 API int pkgmgr_parser_unregister_pkg_plugin_info_in_db(const char *pkgid)
3246 return pkgmgr_parser_unregister_pkg_plugin_info_in_usr_db(pkgid, __getuid());