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 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 return PM_PARSER_R_ERROR; \
137 #define __END_TRANSACTION(db) \
139 if (sqlite3_exec(db, "COMMIT", NULL, NULL, NULL) != \
141 _LOGE("commit failed: %s, rollback", sqlite3_errmsg(db)); \
142 if (sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL) != \
144 _LOGE("roll back transaction failed: %s", \
145 sqlite3_errmsg(db)); \
146 return PM_PARSER_R_ERROR; \
150 #define __BIND_TEXT(db, stmt, i, text) \
152 if (sqlite3_bind_text(stmt, i, text, -1, SQLITE_STATIC) != SQLITE_OK) {\
153 _LOGE("bind error(index %d): %s", i, sqlite3_errmsg(db)); \
154 sqlite3_finalize(stmt); \
159 #define __BIND_INT(db, stmt, i, int) \
161 if (sqlite3_bind_int(stmt, i, int) != SQLITE_OK) { \
162 _LOGE("bind error(index %d): %s", i, sqlite3_errmsg(db)); \
163 sqlite3_finalize(stmt); \
168 static const char *__get_parser_db_path(uid_t uid)
173 if (uid == GLOBAL_USER || uid == OWNER_ROOT) {
174 path = tzplatform_mkpath(TZ_SYS_DB, ".pkgmgr_parser.db");
176 snprintf(buf, sizeof(buf), "user/%d/.pkgmgr_parser.db", uid);
177 path = tzplatform_mkpath(TZ_SYS_DB, buf);
183 static const char *__get_cert_db_path(void)
185 return tzplatform_mkpath(TZ_SYS_DB, ".pkgmgr_cert.db");
188 #define DB_VERSION_PATH SYSCONFDIR "/package-manager/pkg_db_version.txt"
189 static int __set_db_version(sqlite3 *db)
193 char version[PKG_STRING_LEN_MAX] = { 0 };
196 fp = fopen(DB_VERSION_PATH, "r");
197 retvm_if(fp == NULL, -1, "Failed to open db version file");
198 if (fgets(version, sizeof(version), fp) == NULL) {
199 _LOGE("Failed to get version information");
205 query = sqlite3_mprintf("PRAGMA user_version=%Q", version);
207 _LOGE("Out of memory");
211 ret = sqlite3_exec(db, query, NULL, NULL, NULL);
212 if (ret != SQLITE_OK) {
213 _LOGE("exec failed: %s", sqlite3_errmsg(db));
222 /* TODO: Do not labeling directly */
223 #define DB_LABEL "User::Home"
224 #define SET_SMACK_LABEL(x) \
226 if (smack_setlabel((x), DB_LABEL, SMACK_LABEL_ACCESS)) \
227 _LOGE("failed chsmack -a %s %s", DB_LABEL, x); \
229 _LOGD("chsmack -a %s %s", DB_LABEL, x); \
232 static int __set_db_permission(const char *path, uid_t uid)
235 const char *files[2];
236 char journal_file[BUFSIZE];
240 struct passwd *result;
245 if (getuid() != OWNER_ROOT)
248 if (uid == OWNER_ROOT || uid == GLOBAL_USER) {
249 ret = getpwnam_r(APPFW_USER, &pwd, buf, sizeof(buf), &result);
250 if (result == NULL) {
252 _LOGE("no such user: %d", uid);
254 _LOGE("getpwuid_r failed: %d", errno);
260 snprintf(journal_file, sizeof(journal_file), "%s-journal", path);
262 files[1] = journal_file;
264 ret = getpwuid_r(uid, &pwd, buf, sizeof(buf), &result);
265 if (result == NULL) {
267 _LOGE("no such user: %d", uid);
269 _LOGE("getpwuid_r failed: %d", errno);
273 for (i = 0; i < 2; i++) {
274 fd = open(files[i], O_RDONLY);
276 _LOGE("open %s failed: %d", files[i], errno);
279 ret = fstat(fd, &sb);
281 _LOGE("stat %s failed: %d", files[i], errno);
285 if (S_ISLNK(sb.st_mode)) {
286 _LOGE("%s is symlink!", files[i]);
290 ret = fchown(fd, uid, pwd.pw_gid);
292 _LOGE("fchown %s failed: %d", files[i], errno);
297 mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH;
298 if (!strcmp(path, __get_cert_db_path()))
300 ret = fchmod(fd, mode);
302 _LOGD("fchmod %s failed: %d", files[i], errno);
307 SET_SMACK_LABEL(files[i]);
313 static int __create_tables(sqlite3 *db, const char **queries)
317 for (i = 0; queries[i] != NULL; i++) {
318 ret = sqlite3_exec(db, queries[i], NULL, NULL, NULL);
319 if (ret != SQLITE_OK) {
320 _LOGE("exec failed: %s", sqlite3_errmsg(db));
327 static int __initialize_db(sqlite3 *db, const char *dbpath, uid_t uid)
329 const char **queries;
331 if (__set_db_version(db))
334 if (strstr(dbpath, ".pkgmgr_parser.db")) {
335 queries = PARSER_INIT_QUERIES;
336 } else if (strstr(dbpath, ".pkgmgr_cert.db")) {
337 queries = CERT_INIT_QUERIES;
339 _LOGE("unexpected dbpath: %s", dbpath);
343 __BEGIN_TRANSACTION(db);
344 __DO_TRANSACTION(db, __create_tables(db, queries));
345 __END_TRANSACTION(db);
347 if (__set_db_permission(dbpath, uid))
348 _LOGE("failed to set db permission");
353 #define RESOURCED_BUS_NAME "org.tizen.resourced"
354 #define RESOURCED_PROC_PATH "/Org/Tizen/ResourceD/Process"
355 #define RESOURCED_PROC_INTERFACE "org.tizen.resourced.process"
356 #define RESOURCED_PROC_METHOD "ProcExclude"
357 static void __send_wakeup_signal_to_resourced(pid_t pid)
359 GError *error = NULL;
360 GDBusConnection *conn;
364 conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
366 _LOGE("Failed to connect to dbus: %s", error->message);
371 proxy = g_dbus_proxy_new_sync(conn,
372 G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
373 NULL, RESOURCED_BUS_NAME,
374 RESOURCED_PROC_PATH, RESOURCED_PROC_INTERFACE,
377 _LOGE("failed to get proxy object: %s", error->message);
379 g_object_unref(conn);
383 reply = g_dbus_proxy_call_sync(proxy, RESOURCED_PROC_METHOD,
384 g_variant_new("(si)", "wakeup", pid),
385 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
387 _LOGE("failed to get reply from resourced");
389 _LOGE("failed to send request: %s", error->message);
393 g_object_unref(proxy);
394 g_object_unref(conn);
397 static void __check_db_lock(const char *dbpath)
406 unsigned long long ino;
407 char cmdline[BUFSIZE];
411 if (stat(dbpath, &sb) == -1) {
412 _LOGE("get db file(%s) status failed: %d", dbpath, errno);
416 fp = fopen("/proc/locks", "r");
418 _LOGE("Failed to open lock info: %d", errno);
422 while (fscanf(fp, "%*s %*s %*s %5s %d %x:%x:%llu %*s %*s",
423 type, &pid, &maj, &min, &ino) != EOF) {
424 if (maj != major(sb.st_dev) || min != minor(sb.st_dev) ||
425 ino != sb.st_ino || pid == getpid() ||
426 strcasecmp(type, "WRITE"))
429 snprintf(cmdline, sizeof(cmdline), "/proc/%d/cmdline", pid);
430 fp_cmdline = fopen(cmdline, "r");
432 if (fp_cmdline != NULL) {
433 len = fread(name, sizeof(char), sizeof(name) - 1,
436 if (name[len - 1] == '\n')
437 name[len - 1] = '\0';
444 _LOGE("%s (%d) has lock on pkgmgr db(%s)!", name, pid, dbpath);
445 __send_wakeup_signal_to_resourced(pid);
451 #define BUSY_WAITING_USEC (1000000 / 10 / 2) /* 0.05 sec */
452 #define BUSY_WAITING_MAX 100 /* wait for max 5 sec */
453 static int __db_busy_handler(void *data, int count)
455 if (count < (BUSY_WAITING_MAX / 2)) {
456 usleep(BUSY_WAITING_USEC);
458 } else if (count == (BUSY_WAITING_MAX / 2)) {
459 __check_db_lock((const char *)data);
460 usleep(BUSY_WAITING_USEC);
462 } else if (count < BUSY_WAITING_MAX) {
463 usleep(BUSY_WAITING_USEC);
466 /* sqlite3_prepare_v2 will return SQLITE_BUSY */
471 API int pkgmgr_parser_initialize_parser_db(uid_t uid)
477 dbpath = __get_parser_db_path(uid);
478 if (access(dbpath, F_OK) != -1) {
479 _LOGE("Manifest db for user %d is already exists", uid);
480 return PM_PARSER_R_ERROR;
483 ret = sqlite3_open_v2(dbpath, &db,
484 SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
485 if (ret != SQLITE_OK) {
486 _LOGE("open db failed: %d", ret);
487 sqlite3_close_v2(db);
488 return PM_PARSER_R_ERROR;
491 ret = sqlite3_busy_handler(db, __db_busy_handler, NULL);
492 if (ret != SQLITE_OK) {
493 _LOGE("failed to register busy handler: %s",
495 sqlite3_close_v2(db);
499 if (__initialize_db(db, dbpath, uid)) {
500 sqlite3_close_v2(db);
501 return PM_PARSER_R_ERROR;
503 sqlite3_close_v2(db);
505 return PM_PARSER_R_OK;
508 API int pkgmgr_parser_initialize_cert_db(void)
514 dbpath = __get_cert_db_path();
515 if (access(dbpath, F_OK) != -1) {
516 _LOGE("Cert db is already exists");
517 return PM_PARSER_R_ERROR;
520 ret = sqlite3_open_v2(dbpath, &db,
521 SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
522 if (ret != SQLITE_OK) {
523 _LOGE("open db failed: %d", ret);
524 sqlite3_close_v2(db);
525 return PM_PARSER_R_ERROR;
528 ret = sqlite3_busy_handler(db, __db_busy_handler, NULL);
529 if (ret != SQLITE_OK) {
530 _LOGE("failed to register busy handler: %s",
532 sqlite3_close_v2(db);
536 if (__initialize_db(db, dbpath, GLOBAL_USER)) {
537 sqlite3_close_v2(db);
538 return PM_PARSER_R_ERROR;
540 sqlite3_close_v2(db);
542 return PM_PARSER_R_OK;
545 API int pkgmgr_parser_create_and_initialize_db(uid_t uid)
549 struct passwd *result;
552 ret = getpwnam_r(APPFW_USER, &pwd, buf, sizeof(buf), &result);
553 if (result == NULL) {
555 _LOGE("no such user: %s", APPFW_USER);
557 _LOGE("getpwnam_r failed: %d", errno);
558 return PM_PARSER_R_ERROR;
561 if (getuid() != OWNER_ROOT && getuid() != pwd.pw_uid) {
562 _LOGE("Only root or app_fw user is allowed");
563 return PM_PARSER_R_EINVAL;
566 if (pkgmgr_parser_initialize_parser_db(uid))
567 return PM_PARSER_R_ERROR;
569 if (uid == OWNER_ROOT || uid == GLOBAL_USER)
570 if (pkgmgr_parser_initialize_cert_db())
571 return PM_PARSER_R_ERROR;
573 return PM_PARSER_R_OK;
576 static int __convert_background_category(GList *category_list)
582 if (category_list == NULL)
585 for (tmp = category_list; tmp; tmp = tmp->next) {
586 category_data = (char *)tmp->data;
587 if (category_data == NULL)
589 if (!strcmp(category_data, APP_BG_CATEGORY_MEDIA_STR))
590 ret |= APP_BG_CATEGORY_MEDIA_VAL;
591 else if (!strcmp(category_data, APP_BG_CATEGORY_DOWNLOAD_STR))
592 ret |= APP_BG_CATEGORY_DOWNLOAD_VAL;
593 else if (!strcmp(category_data, APP_BG_CATEGORY_BGNETWORK_STR))
594 ret |= APP_BG_CATEGORY_BGNETWORK_VAL;
595 else if (!strcmp(category_data, APP_BG_CATEGORY_LOCATION_STR))
596 ret |= APP_BG_CATEGORY_LOCATION_VAL;
597 else if (!strcmp(category_data, APP_BG_CATEGORY_SENSOR_STR))
598 ret |= APP_BG_CATEGORY_SENSOR_VAL;
599 else if (!strcmp(category_data, APP_BG_CATEGORY_IOTCOMM_STR))
600 ret |= APP_BG_CATEGORY_IOTCOMM_VAL;
601 else if (!strcmp(category_data, APP_BG_CATEGORY_SYSTEM))
602 ret |= APP_BG_CATEGORY_SYSTEM_VAL;
604 _LOGE("Unidentified category [%s]", category_data);
610 #define EFFECTIVE_APPID_KEY "http://tizen.org/metadata/effective-appid"
611 static const char *__find_effective_appid(GList *metadata_list)
616 for (tmp = metadata_list; tmp; tmp = tmp->next) {
617 md = (metadata_x *)tmp->data;
618 if (md == NULL || md->key == NULL)
621 if (strcmp(md->key, EFFECTIVE_APPID_KEY) == 0) {
630 static int __insert_appcontrol_privilege_info(sqlite3 *db, const char *appid,
633 static const char query[] =
634 "INSERT INTO package_app_app_control_privilege (app_id,"
635 " app_control, privilege) VALUES (?, ?, ?)";
639 char app_control[BUFSIZE];
646 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
647 if (ret != SQLITE_OK) {
648 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
652 for (tmp = ac->privileges; tmp; tmp = tmp->next) {
653 privilege = (char *)tmp->data;
654 if (privilege == NULL || !strlen(privilege))
658 snprintf(app_control, sizeof(app_control), "%s|%s|%s",
659 ac->operation ? (strlen(ac->operation) > 0 ?
660 ac->operation : "NULL") : "NULL",
661 ac->uri ? (strlen(ac->uri) > 0 ?
662 ac->uri : "NULL") : "NULL",
663 ac->mime ? (strlen(ac->mime) > 0 ?
664 ac->mime : "NULL") : "NULL");
665 __BIND_TEXT(db, stmt, idx++, appid);
666 __BIND_TEXT(db, stmt, idx++, app_control);
667 __BIND_TEXT(db, stmt, idx++, privilege);
669 ret = sqlite3_step(stmt);
670 if (ret != SQLITE_DONE) {
671 _LOGE("step failed: %s", sqlite3_errmsg(db));
672 sqlite3_finalize(stmt);
679 sqlite3_finalize(stmt);
684 static int __insert_appcontrol_info(sqlite3 *db, application_x *app)
686 static const char query[] =
687 "INSERT INTO package_app_app_control (app_id, app_control,"
688 " visibility, app_control_id) "
689 "VALUES (?, ?, ?, ?)";
693 char app_control[BUFSIZE];
697 if (app->appcontrol == NULL)
700 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
701 if (ret != SQLITE_OK) {
702 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
706 for (tmp = app->appcontrol; tmp; tmp = tmp->next) {
707 ac = (appcontrol_x *)tmp->data;
711 snprintf(app_control, sizeof(app_control), "%s|%s|%s",
712 ac->operation ? (strlen(ac->operation) > 0 ?
713 ac->operation : "NULL") : "NULL",
714 ac->uri ? (strlen(ac->uri) > 0 ?
715 ac->uri : "NULL") : "NULL",
716 ac->mime ? (strlen(ac->mime) > 0 ?
717 ac->mime : "NULL") : "NULL");
718 __BIND_TEXT(db, stmt, idx++, app->appid);
719 __BIND_TEXT(db, stmt, idx++, app_control);
720 __BIND_TEXT(db, stmt, idx++, ac->visibility);
721 __BIND_TEXT(db, stmt, idx++, ac->id);
723 ret = sqlite3_step(stmt);
724 if (ret != SQLITE_DONE) {
725 _LOGE("step failed: %s", sqlite3_errmsg(db));
726 sqlite3_finalize(stmt);
730 if (__insert_appcontrol_privilege_info(db, app->appid, ac)) {
731 sqlite3_finalize(stmt);
738 sqlite3_finalize(stmt);
743 static int __insert_category_info(sqlite3 *db, application_x *app)
745 static const char query[] =
746 "INSERT INTO package_app_app_category (app_id, category) "
752 const char *category;
754 if (app->category == NULL)
757 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
758 if (ret != SQLITE_OK) {
759 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
763 for (tmp = app->category; tmp; tmp = tmp->next) {
764 category = (const char *)tmp->data;
765 if (category == NULL)
768 __BIND_TEXT(db, stmt, idx++, app->appid);
769 __BIND_TEXT(db, stmt, idx++, category);
771 ret = sqlite3_step(stmt);
772 if (ret != SQLITE_DONE) {
773 _LOGE("step failed: %s", sqlite3_errmsg(db));
774 sqlite3_finalize(stmt);
781 sqlite3_finalize(stmt);
786 static int __insert_metadata_info(sqlite3 *db, application_x *app)
788 static const char query[] =
789 "INSERT INTO package_app_app_metadata (app_id,"
790 " md_key, md_value) VALUES (?, ?, ?)";
797 if (app->metadata == NULL)
800 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
801 if (ret != SQLITE_OK) {
802 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
806 for (tmp = app->metadata; tmp; tmp = tmp->next) {
807 md = (metadata_x *)tmp->data;
811 __BIND_TEXT(db, stmt, idx++, app->appid);
812 __BIND_TEXT(db, stmt, idx++, md->key);
813 __BIND_TEXT(db, stmt, idx++, md->value);
815 ret = sqlite3_step(stmt);
816 if (ret != SQLITE_DONE) {
817 _LOGE("step failed: %s", sqlite3_errmsg(db));
818 sqlite3_finalize(stmt);
825 sqlite3_finalize(stmt);
830 static int __insert_app_data_control_privilege_info(sqlite3 *db,
831 datacontrol_x *datacontrol)
833 static const char query[] =
834 "INSERT INTO package_app_data_control_privilege (providerid,"
835 " privilege, type) VALUES (?, ?, ?)";
843 if (datacontrol == 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 (privileges = datacontrol->privileges; privileges;
853 privileges = privileges->next) {
854 priv = (char *)privileges->data;
859 __BIND_TEXT(db, stmt, idx++, datacontrol->providerid);
860 __BIND_TEXT(db, stmt, idx++, priv);
861 __BIND_TEXT(db, stmt, idx++, datacontrol->type);
863 ret = sqlite3_step(stmt);
864 if (ret != SQLITE_DONE) {
865 _LOGE("step failed: %s", sqlite3_errmsg(db));
866 sqlite3_finalize(stmt);
873 sqlite3_finalize(stmt);
877 static int __insert_datacontrol_info(sqlite3 *db, application_x *app)
879 static const char query[] =
880 "INSERT INTO package_app_data_control (app_id, providerid,"
881 " access, type, trusted) VALUES (?, ?, ?, ?, ?)";
888 if (app->datacontrol == NULL)
891 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
892 if (ret != SQLITE_OK) {
893 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
897 for (tmp = app->datacontrol; tmp; tmp = tmp->next) {
898 dc = (datacontrol_x *)tmp->data;
902 __BIND_TEXT(db, stmt, idx++, app->appid);
903 __BIND_TEXT(db, stmt, idx++, dc->providerid);
904 __BIND_TEXT(db, stmt, idx++, dc->access);
905 __BIND_TEXT(db, stmt, idx++, dc->type);
906 __BIND_TEXT(db, stmt, idx++, dc->trusted);
908 ret = sqlite3_step(stmt);
909 if (ret != SQLITE_DONE) {
910 _LOGE("step failed: %s", sqlite3_errmsg(db));
911 sqlite3_finalize(stmt);
915 if (dc->privileges &&
916 __insert_app_data_control_privilege_info(db, dc)) {
917 sqlite3_finalize(stmt);
924 sqlite3_finalize(stmt);
929 /* TODO: move to installer */
930 static int __check_dpi(const char *dpi_char, int dpi_int)
932 if (dpi_char == NULL)
935 if (strcasecmp(dpi_char, LDPI) == 0) {
936 if (dpi_int >= LDPI_MIN && dpi_int <= LDPI_MAX)
940 } else if (strcasecmp(dpi_char, MDPI) == 0) {
941 if (dpi_int >= MDPI_MIN && dpi_int <= MDPI_MAX)
945 } else if (strcasecmp(dpi_char, HDPI) == 0) {
946 if (dpi_int >= HDPI_MIN && dpi_int <= HDPI_MAX)
950 } else if (strcasecmp(dpi_char, XHDPI) == 0) {
951 if (dpi_int >= XHDPI_MIN && dpi_int <= XHDPI_MAX)
955 } else if (strcasecmp(dpi_char, XXHDPI) == 0) {
956 if (dpi_int >= XXHDPI_MIN && dpi_int <= XXHDPI_MAX)
964 static gint __compare_splashscreen_with_orientation_dpi(gconstpointer a,
967 splashscreen_x *ss = (splashscreen_x *)a;
968 const char *orientation = (const char *)b;
972 if (ss->operation || ss->dpi == NULL)
975 ret = system_info_get_platform_int(
976 "http://tizen.org/feature/screen.dpi", &dpi);
977 if (ret != SYSTEM_INFO_ERROR_NONE)
980 if (strcasecmp(ss->orientation, orientation) == 0 &&
981 __check_dpi(ss->dpi, dpi) == 0)
987 static gint __compare_splashscreen_with_orientation(gconstpointer a,
990 splashscreen_x *ss = (splashscreen_x *)a;
991 const char *orientation = (const char *)b;
993 if (ss->operation || ss->dpi)
996 if (strcasecmp(ss->orientation, orientation) == 0)
1002 static splashscreen_x *__find_default_splashscreen(GList *splashscreens,
1003 const char *orientation)
1007 tmp = g_list_find_custom(splashscreens, orientation,
1009 __compare_splashscreen_with_orientation_dpi);
1011 return (splashscreen_x *)tmp->data;
1013 tmp = g_list_find_custom(splashscreens, orientation,
1014 (GCompareFunc)__compare_splashscreen_with_orientation);
1016 return (splashscreen_x *)tmp->data;
1021 static void __find_appcontrol_splashscreen_with_dpi(gpointer data,
1024 splashscreen_x *ss = (splashscreen_x *)data;
1025 GList **list = (GList **)user_data;
1029 if (ss->operation == NULL || ss->dpi == NULL)
1032 ret = system_info_get_platform_int(
1033 "http://tizen.org/feature/screen.dpi", &dpi);
1034 if (ret != SYSTEM_INFO_ERROR_NONE)
1037 if (__check_dpi(ss->dpi, dpi) != 0)
1040 *list = g_list_prepend(*list, ss);
1043 static void __find_appcontrol_splashscreen(gpointer data, gpointer user_data)
1045 splashscreen_x *ss = (splashscreen_x *)data;
1046 GList **list = (GList **)user_data;
1047 splashscreen_x *ss_tmp;
1050 if (ss->operation == NULL || ss->dpi)
1053 for (tmp = *list; tmp; tmp = tmp->next) {
1054 ss_tmp = (splashscreen_x *)tmp->data;
1055 if (ss_tmp->operation
1056 && strcmp(ss_tmp->operation, ss->operation) == 0
1057 && strcmp(ss_tmp->orientation, ss->orientation) == 0)
1061 *list = g_list_prepend(*list, ss);
1064 static GList *__find_splashscreens(GList *splashscreens)
1069 if (splashscreens == NULL)
1072 g_list_foreach(splashscreens,
1073 __find_appcontrol_splashscreen_with_dpi, &list);
1074 g_list_foreach(splashscreens,
1075 __find_appcontrol_splashscreen, &list);
1077 ss = __find_default_splashscreen(splashscreens, "portrait");
1079 list = g_list_prepend(list, ss);
1080 ss = __find_default_splashscreen(splashscreens, "landscape");
1082 list = g_list_prepend(list, ss);
1087 static int __insert_splashscreen_info(sqlite3 *db, application_x *app,
1090 static const char query[] =
1091 "INSERT INTO package_app_splash_screen (app_id, src, type,"
1092 " orientation, indicatordisplay, operation, color_depth) "
1093 "VALUES (?, ?, ?, ?, ?, ?, ?)";
1100 if (app->splashscreens == NULL)
1103 if (ss_list == NULL)
1106 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1107 if (ret != SQLITE_OK) {
1108 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1112 for (tmp = ss_list; tmp; tmp = tmp->next) {
1113 ss = (splashscreen_x *)tmp->data;
1117 __BIND_TEXT(db, stmt, idx++, app->appid);
1118 __BIND_TEXT(db, stmt, idx++, ss->src);
1119 __BIND_TEXT(db, stmt, idx++, ss->type);
1120 __BIND_TEXT(db, stmt, idx++, ss->orientation);
1121 __BIND_TEXT(db, stmt, idx++, ss->indicatordisplay);
1122 __BIND_TEXT(db, stmt, idx++, ss->operation);
1123 __BIND_TEXT(db, stmt, idx++, ss->color_depth);
1125 ret = sqlite3_step(stmt);
1126 if (ret != SQLITE_DONE) {
1127 _LOGE("step failed: %s", sqlite3_errmsg(db));
1128 sqlite3_finalize(stmt);
1132 sqlite3_reset(stmt);
1135 sqlite3_finalize(stmt);
1140 static void __trimfunc(GList *trim_list)
1144 GList *list = g_list_first(trim_list);
1147 trim_data = (char *)list->data;
1150 if (strcmp(trim_data, prev) == 0) {
1151 trim_list = g_list_remove(trim_list,
1153 list = g_list_first(trim_list);
1162 list = g_list_next(list);
1166 static gint __comparefunc(gconstpointer a, gconstpointer b, gpointer userdata)
1168 if (a == NULL || b == NULL)
1170 if (strcmp((char *)a, (char *)b) == 0)
1172 if (strcmp((char *)a, (char *)b) < 0)
1174 if (strcmp((char *)a, (char *)b) > 0)
1179 /* TODO: refactor inserting localized info */
1180 static GList *__create_locale_list(GList *lbls, GList *lcns, GList *icns,
1181 GList *dcns, GList *aths)
1183 GList *locale = NULL;
1191 for (tmp = lbls; tmp; tmp = tmp->next) {
1192 lbl = (label_x *)tmp->data;
1196 locale = g_list_insert_sorted_with_data(
1197 locale, (gpointer)lbl->lang,
1198 __comparefunc, NULL);
1200 for (tmp = lcns; tmp; tmp = tmp->next) {
1201 lcn = (license_x *)tmp->data;
1205 locale = g_list_insert_sorted_with_data(
1206 locale, (gpointer)lcn->lang,
1207 __comparefunc, NULL);
1209 for (tmp = icns; tmp; tmp = tmp->next) {
1210 icn = (icon_x *)tmp->data;
1214 locale = g_list_insert_sorted_with_data(
1215 locale, (gpointer)icn->lang,
1216 __comparefunc, NULL);
1218 for (tmp = dcns; tmp; tmp = tmp->next) {
1219 dcn = (description_x *)tmp->data;
1223 locale = g_list_insert_sorted_with_data(
1224 locale, (gpointer)dcn->lang,
1225 __comparefunc, NULL);
1227 for (tmp = aths; tmp; tmp = tmp->next) {
1228 ath = (author_x *)tmp->data;
1232 locale = g_list_insert_sorted_with_data(
1233 locale, (gpointer)ath->lang,
1234 __comparefunc, NULL);
1240 static gint __check_icon_resolution(const char *orig_icon_path,
1241 char **new_icon_path)
1245 char *icon_filename;
1246 char modified_iconpath[BUFSIZE];
1247 char icon_path[BUFSIZE];
1251 if (orig_icon_path == NULL)
1254 ret = system_info_get_platform_int(
1255 "http://tizen.org/feature/screen.dpi", &dpi);
1256 if (ret != SYSTEM_INFO_ERROR_NONE)
1259 if (dpi >= LDPI_MIN && dpi <= LDPI_MAX) {
1260 dpi_path[0] = "LDPI";
1261 dpi_path[1] = "ldpi";
1262 } else if (dpi >= MDPI_MIN && dpi <= MDPI_MAX) {
1263 dpi_path[0] = "MDPI";
1264 dpi_path[1] = "mdpi";
1265 } else if (dpi >= HDPI_MIN && dpi <= HDPI_MAX) {
1266 dpi_path[0] = "HDPI";
1267 dpi_path[1] = "hdpi";
1268 } else if (dpi >= XHDPI_MIN && dpi <= XHDPI_MAX) {
1269 dpi_path[0] = "XHDPI";
1270 dpi_path[1] = "xhdpi";
1271 } else if (dpi >= XXHDPI_MIN && dpi <= XXHDPI_MAX) {
1272 dpi_path[0] = "XXHDPI";
1273 dpi_path[1] = "xxhdpi";
1275 _LOGE("Unidentified dpi[%d]", dpi);
1279 icon_filename = strrchr(orig_icon_path, '/');
1280 if (icon_filename == NULL)
1284 strlen(orig_icon_path) - (strlen(icon_filename) - 1),
1285 "%s", orig_icon_path);
1286 for (i = 0; i < 2; i++) {
1287 ret = snprintf(modified_iconpath, BUFSIZE - 1, "%s/%s%s",
1288 icon_path, dpi_path[i], icon_filename);
1289 if (ret < 0 || ret > BUFSIZE -1) {
1290 _LOGE("snprintf fail");
1293 if (access(modified_iconpath, F_OK) != -1) {
1294 /* if exists, return modified icon path */
1295 *new_icon_path = strdup(modified_iconpath);
1303 static gint __compare_icon(gconstpointer a, gconstpointer b)
1305 icon_x *icon = (icon_x *)a;
1308 if (icon->lang != NULL && strcasecmp(icon->lang, DEFAULT_LOCALE) != 0)
1311 if (icon->dpi != NULL)
1314 if (__check_icon_resolution(icon->text, &icon_path) == 0) {
1316 icon->text = icon_path;
1322 static gint __compare_icon_with_dpi(gconstpointer a, gconstpointer b)
1324 icon_x *icon = (icon_x *)a;
1325 int dpi = GPOINTER_TO_INT(b);
1327 if (icon->lang != NULL && strcasecmp(icon->lang, DEFAULT_LOCALE) != 0)
1330 if (icon->dpi == NULL)
1333 if (__check_dpi(icon->dpi, dpi) == 0)
1339 static gint __compare_icon_with_lang(gconstpointer a, gconstpointer b)
1341 icon_x *icon = (icon_x *)a;
1342 char *lang = (char *)b;
1345 if (icon->dpi != NULL)
1348 if (strcasecmp(icon->lang, lang) == 0) {
1349 if (strcasecmp(icon->lang, DEFAULT_LOCALE) == 0) {
1350 /* icon for no locale. check existance of
1351 * folder-hierachied default icons
1353 if (__check_icon_resolution(icon->text,
1356 icon->text = icon_path;
1365 static gint __compare_icon_with_lang_dpi(gconstpointer a, gconstpointer b)
1368 icon_x *icon = (icon_x *)a;
1369 char *lang = (char *)b;
1372 ret = system_info_get_platform_int(
1373 "http://tizen.org/feature/screen.dpi", &dpi);
1374 if (ret != SYSTEM_INFO_ERROR_NONE)
1377 if (strcasecmp(icon->lang, lang) == 0 &&
1378 __check_dpi(icon->dpi, dpi) == 0)
1384 static char *__find_icon(GList *icons, const char *lang)
1391 /* first, find icon whose locale and dpi with given lang and
1392 * system's dpi has matched
1394 tmp = g_list_find_custom(icons, lang,
1395 (GCompareFunc)__compare_icon_with_lang_dpi);
1397 icon = (icon_x *)tmp->data;
1398 return (char *)icon->text;
1401 /* if first has failed, find icon whose locale has matched */
1402 tmp = g_list_find_custom(icons, lang,
1403 (GCompareFunc)__compare_icon_with_lang);
1405 icon = (icon_x *)tmp->data;
1406 return (char *)icon->text;
1409 /* if second has failed, find icon whose dpi has matched with
1412 ret = system_info_get_platform_int(
1413 "http://tizen.org/feature/screen.dpi", &dpi);
1414 if (ret == SYSTEM_INFO_ERROR_NONE) {
1415 tmp = g_list_find_custom(icons, GINT_TO_POINTER(dpi),
1416 (GCompareFunc)__compare_icon_with_dpi);
1418 icon = (icon_x *)tmp->data;
1419 return (char *)icon->text;
1423 /* last, find default icon marked as "No Locale" */
1424 tmp = g_list_find_custom(icons, NULL, (GCompareFunc)__compare_icon);
1426 icon = (icon_x *)tmp->data;
1427 return (char *)icon->text;
1433 static void __extract_data(const char *locale, GList *lbls, GList *lcns,
1434 GList *icns, GList *dcns, GList *aths, char **label,
1435 char **license, char **icon, char **description, char **author)
1443 for (tmp = lbls; tmp; tmp = tmp->next) {
1444 lbl = (label_x *)tmp->data;
1448 if (strcmp(lbl->lang, locale) == 0) {
1449 *label = (char *)lbl->text;
1454 for (tmp = lcns; tmp; tmp = tmp->next) {
1455 lcn = (license_x *)tmp->data;
1459 if (strcmp(lcn->lang, locale) == 0) {
1460 *license = (char *)lcn->text;
1466 *icon = __find_icon(icns, locale);
1468 for (tmp = dcns; tmp; tmp = tmp->next) {
1469 dcn = (description_x *)tmp->data;
1473 if (strcmp(dcn->lang, locale) == 0) {
1474 *description = (char *)dcn->text;
1479 for (tmp = aths; tmp; tmp = tmp->next) {
1480 ath = (author_x *)tmp->data;
1484 if (strcmp(ath->lang, locale) == 0) {
1485 *author = (char *)ath->text;
1492 static int __insert_mainapp_localized_info(sqlite3 *db, application_x *app,
1493 const char *locale, const char *label, const char *icon)
1495 static const char query[] =
1496 "INSERT OR REPLACE INTO package_localized_info ("
1497 " package, package_locale, package_label, package_icon,"
1498 " package_description, package_license, package_author) "
1500 " COALESCE((SELECT package_label FROM package_localized_info"
1501 " WHERE package=? AND package_locale=?), ?),"
1502 " COALESCE((SELECT package_icon FROM package_localized_info"
1503 " WHERE package=? AND package_icon=?), ?),"
1504 " (SELECT package_description FROM package_localized_info"
1505 " WHERE package=? AND package_locale=?),"
1506 " (SELECT package_description FROM package_localized_info"
1507 " WHERE package=? AND package_locale=?),"
1508 " (SELECT package_description FROM package_localized_info"
1509 " WHERE package=? AND package_locale=?))";
1514 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1515 if (ret != SQLITE_OK) {
1516 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1520 __BIND_TEXT(db, stmt, idx++, app->package);
1521 __BIND_TEXT(db, stmt, idx++, locale);
1522 __BIND_TEXT(db, stmt, idx++, app->package);
1523 __BIND_TEXT(db, stmt, idx++, locale);
1524 __BIND_TEXT(db, stmt, idx++, label);
1525 __BIND_TEXT(db, stmt, idx++, app->package);
1526 __BIND_TEXT(db, stmt, idx++, locale);
1527 __BIND_TEXT(db, stmt, idx++, icon);
1528 __BIND_TEXT(db, stmt, idx++, app->package);
1529 __BIND_TEXT(db, stmt, idx++, locale);
1530 __BIND_TEXT(db, stmt, idx++, app->package);
1531 __BIND_TEXT(db, stmt, idx++, locale);
1532 __BIND_TEXT(db, stmt, idx++, app->package);
1533 __BIND_TEXT(db, stmt, idx++, locale);
1535 ret = sqlite3_step(stmt);
1536 if (ret != SQLITE_DONE) {
1537 _LOGE("step failed: %s", sqlite3_errmsg(db));
1538 sqlite3_finalize(stmt);
1542 sqlite3_finalize(stmt);
1547 static int __insert_app_localized_info(sqlite3 *db, application_x *app)
1549 static const char query[] =
1550 "INSERT INTO package_app_localized_info (app_id, app_locale,"
1551 " app_label, app_icon) "
1552 "VALUES (?, ?, ?, ?)";
1562 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1563 if (ret != SQLITE_OK) {
1564 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1568 locales = __create_locale_list(app->label, NULL, app->icon, NULL, NULL);
1569 for (tmp = locales; tmp; tmp = tmp->next) {
1570 locale = (const char *)tmp->data;
1573 __extract_data(locale, app->label, NULL, app->icon, NULL, NULL,
1574 &label, NULL, &icon, NULL, NULL);
1575 if (!label && !icon)
1579 __BIND_TEXT(db, stmt, idx++, app->appid);
1580 __BIND_TEXT(db, stmt, idx++, locale);
1581 __BIND_TEXT(db, stmt, idx++, label);
1582 __BIND_TEXT(db, stmt, idx++, icon);
1584 ret = sqlite3_step(stmt);
1585 if (ret != SQLITE_DONE) {
1586 _LOGE("step failed: %s", sqlite3_errmsg(db));
1587 g_list_free(locales);
1588 sqlite3_finalize(stmt);
1592 sqlite3_reset(stmt);
1594 if (strcasecmp(app->mainapp, "true") == 0) {
1595 if (__insert_mainapp_localized_info(db, app, locale,
1597 _LOGE("insert mainapp localized info failed");
1601 g_list_free(locales);
1602 sqlite3_finalize(stmt);
1607 static int __insert_package_privilege_info(sqlite3 *db, manifest_x *mfx)
1609 static const char query[] =
1610 "INSERT INTO package_privilege_info (package, privilege, type) "
1618 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1619 if (ret != SQLITE_OK) {
1620 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1624 for (tmp = mfx->privileges; tmp; tmp = tmp->next) {
1625 priv = (privilege_x *)tmp->data;
1630 __BIND_TEXT(db, stmt, idx++, mfx->package);
1631 __BIND_TEXT(db, stmt, idx++, priv->value);
1632 __BIND_TEXT(db, stmt, idx++, priv->type);
1634 ret = sqlite3_step(stmt);
1635 if (ret != SQLITE_DONE) {
1636 _LOGE("step failed: %s", sqlite3_errmsg(db));
1637 sqlite3_finalize(stmt);
1640 sqlite3_reset(stmt);
1643 sqlite3_finalize(stmt);
1648 static int __insert_package_plugin_execution_info(
1649 manifest_x *mfx, uid_t uid)
1656 return PM_PARSER_R_OK;
1658 for (tmp = mfx->plugin; tmp; tmp = tmp->next) {
1659 plugin = (plugin_x *)tmp->data;
1663 query = sqlite3_mprintf("INSERT INTO package_plugin_info "
1664 "(pkgid, appid, plugin_type, plugin_name) "
1665 "VALUES (%Q, %Q, %Q, %Q)",
1666 plugin->pkgid, plugin->appid,
1667 plugin->plugin_type, plugin->plugin_name);
1668 if (query == NULL) {
1669 _LOGE("Out of memory");
1670 return PM_PARSER_R_ERROR;
1673 // TODO: send query to server
1674 sqlite3_free(query);
1677 return PM_PARSER_R_OK;
1680 static int __delete_package_plugin_execution_info(const char *pkgid, uid_t uid)
1684 query = sqlite3_mprintf(
1685 "DELETE FROM package_plugin_info WHERE pkgid=%Q", pkgid);
1686 if (query == NULL) {
1687 _LOGE("Out of memory");
1688 return PM_PARSER_R_ERROR;
1691 // TODO: send query to server
1692 sqlite3_free(query);
1694 return PM_PARSER_R_OK;
1697 static int __insert_package_appdefined_privilege_info(sqlite3 *db,
1700 static const char query[] =
1701 "INSERT INTO package_appdefined_privilege_info "
1702 "(package, privilege, license, type) "
1703 "VALUES (?, ?, ?, ?)";
1708 appdefined_privilege_x *priv;
1710 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1711 if (ret != SQLITE_OK) {
1712 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1716 for (tmp = mfx->appdefined_privileges; tmp; tmp = tmp->next) {
1717 priv = (appdefined_privilege_x *)tmp->data;
1722 __BIND_TEXT(db, stmt, idx++, mfx->package);
1723 __BIND_TEXT(db, stmt, idx++, priv->value);
1724 __BIND_TEXT(db, stmt, idx++, priv->license);
1725 __BIND_TEXT(db, stmt, idx++, priv->type);
1727 ret = sqlite3_step(stmt);
1728 if (ret != SQLITE_DONE) {
1729 _LOGE("step failed: %s", sqlite3_errmsg(db));
1730 sqlite3_finalize(stmt);
1733 sqlite3_reset(stmt);
1736 sqlite3_finalize(stmt);
1741 static int __insert_package_dependency_info(sqlite3 *db, manifest_x *mfx)
1743 static const char query[] =
1744 "INSERT INTO package_dependency_info"
1745 " (package, depends_on, type, required_version) "
1746 "VALUES (?, ?, ?, ?)";
1753 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1754 if (ret != SQLITE_OK) {
1755 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1759 for (tmp = mfx->dependencies; tmp; tmp = tmp->next) {
1760 dep = (dependency_x *)tmp->data;
1765 __BIND_TEXT(db, stmt, idx++, mfx->package);
1766 __BIND_TEXT(db, stmt, idx++, dep->depends_on);
1767 __BIND_TEXT(db, stmt, idx++, dep->type);
1768 __BIND_TEXT(db, stmt, idx++, dep->required_version);
1770 ret = sqlite3_step(stmt);
1771 if (ret != SQLITE_DONE) {
1772 _LOGE("step failed: %s", sqlite3_errmsg(db));
1773 sqlite3_finalize(stmt);
1776 sqlite3_reset(stmt);
1779 sqlite3_finalize(stmt);
1784 /* _PRODUCT_LAUNCHING_ENHANCED_
1785 * app->indicatordisplay, app->portraitimg, app->landscapeimg,
1786 * app->guestmode_appstatus
1788 static int __insert_application_info(sqlite3 *db, manifest_x *mfx)
1790 static const char query[] =
1791 "INSERT INTO package_app_info (app_id, app_component,"
1792 " app_exec, app_nodisplay, app_type, app_onboot, app_multiple,"
1793 " app_autorestart, app_taskmanage, app_hwacceleration,"
1794 " app_screenreader, app_mainapp, app_recentimage,"
1795 " app_launchcondition, app_indicatordisplay, app_portraitimg,"
1796 " app_landscapeimg, app_guestmodevisibility,"
1797 " app_permissiontype, app_preload, app_submode,"
1798 " app_submode_mainid, app_installed_storage, app_process_pool,"
1799 " app_launch_mode, app_ui_gadget, app_support_mode,"
1800 " app_support_disable, component_type, package, app_tep_name,"
1801 " app_zip_mount_file, app_background_category,"
1802 " app_package_type, app_root_path, app_api_version,"
1803 " app_effective_appid, app_splash_screen_display,"
1804 " app_package_system, app_removable,"
1805 " app_package_installed_time, app_support_ambient,"
1806 " app_external_path, app_setup_appid) "
1808 " ?, LOWER(?), ?, LOWER(?), LOWER(?),"
1809 " LOWER(?), LOWER(?), ?,"
1813 " ?, LOWER(?), LOWER(?),"
1815 " COALESCE(?, 'single'), LOWER(?), ?,"
1816 " LOWER(?), ?, ?, ?,"
1820 " LOWER(?), LOWER(?),"
1829 const char *effective_appid;
1832 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1833 if (ret != SQLITE_OK) {
1834 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1838 for (tmp = mfx->application; tmp; tmp = tmp->next) {
1839 app = (application_x *)tmp->data;
1843 bg_category = __convert_background_category(
1844 app->background_category);
1845 effective_appid = __find_effective_appid(app->metadata);
1848 __BIND_TEXT(db, stmt, idx++, app->appid);
1849 __BIND_TEXT(db, stmt, idx++, app->component_type);
1850 __BIND_TEXT(db, stmt, idx++, app->exec);
1851 __BIND_TEXT(db, stmt, idx++, __get_bool(app->nodisplay, false));
1852 __BIND_TEXT(db, stmt, idx++, app->type);
1853 __BIND_TEXT(db, stmt, idx++, __get_bool(app->onboot, false));
1854 __BIND_TEXT(db, stmt, idx++, __get_bool(app->multiple, false));
1855 __BIND_TEXT(db, stmt, idx++,
1856 __get_bool(app->autorestart, false));
1857 __BIND_TEXT(db, stmt, idx++,
1858 __get_bool(app->taskmanage, false));
1859 __BIND_TEXT(db, stmt, idx++, app->hwacceleration);
1860 __BIND_TEXT(db, stmt, idx++, app->screenreader);
1861 __BIND_TEXT(db, stmt, idx++, __get_bool(app->mainapp, false));
1862 __BIND_TEXT(db, stmt, idx++, app->recentimage);
1863 __BIND_TEXT(db, stmt, idx++, app->launchcondition);
1864 __BIND_TEXT(db, stmt, idx++,
1865 __get_bool(app->indicatordisplay, true));
1866 __BIND_TEXT(db, stmt, idx++, app->portraitimg);
1867 __BIND_TEXT(db, stmt, idx++, app->landscapeimg);
1868 __BIND_TEXT(db, stmt, idx++,
1869 __get_bool(app->guestmode_visibility, true));
1870 __BIND_TEXT(db, stmt, idx++, app->permission_type);
1871 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->preload, false));
1872 __BIND_TEXT(db, stmt, idx++, __get_bool(app->submode, false));
1873 __BIND_TEXT(db, stmt, idx++, app->submode_mainid);
1874 __BIND_TEXT(db, stmt, idx++, mfx->installed_storage);
1875 __BIND_TEXT(db, stmt, idx++,
1876 __get_bool(app->process_pool, false));
1877 __BIND_TEXT(db, stmt, idx++, app->launch_mode);
1878 __BIND_TEXT(db, stmt, idx++, __get_bool(app->ui_gadget, false));
1879 __BIND_TEXT(db, stmt, idx++,
1880 app->support_mode ? app->support_mode : "0");
1881 __BIND_TEXT(db, stmt, idx++,
1882 __get_bool(mfx->support_disable, false));
1883 __BIND_TEXT(db, stmt, idx++, app->component_type);
1884 __BIND_TEXT(db, stmt, idx++, mfx->package);
1885 __BIND_TEXT(db, stmt, idx++, mfx->tep_name);
1886 __BIND_TEXT(db, stmt, idx++, mfx->zip_mount_file);
1887 __BIND_INT(db, stmt, idx++, bg_category);
1888 __BIND_TEXT(db, stmt, idx++, mfx->type ? mfx->type : "tpk");
1889 __BIND_TEXT(db, stmt, idx++, mfx->root_path);
1890 __BIND_TEXT(db, stmt, idx++, app->api_version);
1891 __BIND_TEXT(db, stmt, idx++, effective_appid);
1892 __BIND_TEXT(db, stmt, idx++,
1893 __get_bool(app->splash_screen_display, true));
1894 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->system, false));
1895 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->removable, false));
1896 __BIND_TEXT(db, stmt, idx++, mfx->installed_time);
1897 __BIND_TEXT(db, stmt, idx++,
1898 __get_bool(app->support_ambient, false));
1899 __BIND_TEXT(db, stmt, idx++, mfx->external_path);
1900 __BIND_TEXT(db, stmt, idx++, app->setup_appid);
1902 ret = sqlite3_step(stmt);
1903 if (ret != SQLITE_DONE) {
1904 _LOGE("step failed: %s", sqlite3_errmsg(db));
1905 sqlite3_finalize(stmt);
1909 sqlite3_reset(stmt);
1911 if (__insert_appcontrol_info(db, app)) {
1912 sqlite3_finalize(stmt);
1915 if (__insert_category_info(db, app)) {
1916 sqlite3_finalize(stmt);
1919 if (__insert_metadata_info(db, app)) {
1920 sqlite3_finalize(stmt);
1923 if (__insert_datacontrol_info(db, app)) {
1924 sqlite3_finalize(stmt);
1927 ss_list = __find_splashscreens(app->splashscreens);
1928 if (__insert_splashscreen_info(db, app, ss_list)) {
1929 g_list_free(ss_list);
1930 sqlite3_finalize(stmt);
1933 g_list_free(ss_list);
1934 if (__insert_app_localized_info(db, app)) {
1935 sqlite3_finalize(stmt);
1940 sqlite3_finalize(stmt);
1945 static int __insert_package_update_info(sqlite3 *db, manifest_x *mfx)
1947 static const char query[] =
1948 "INSERT INTO package_update_info (package, update_version) "
1954 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1955 if (ret != SQLITE_OK) {
1956 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1961 __BIND_TEXT(db, stmt, idx++, mfx->package);
1962 __BIND_TEXT(db, stmt, idx, mfx->version);
1963 ret = sqlite3_step(stmt);
1964 if (ret != SQLITE_DONE) {
1965 _LOGE("step failed: %s", sqlite3_errmsg(db));
1966 sqlite3_finalize(stmt);
1969 sqlite3_finalize(stmt);
1974 static int __insert_package_localized_info(sqlite3 *db, manifest_x *mfx)
1976 static const char query[] =
1977 "INSERT INTO package_localized_info (package, package_locale,"
1978 " package_label, package_icon, package_description,"
1979 " package_license, package_author) "
1980 "VALUES (?, ?, ?, ?, ?, ?, ?)";
1993 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1994 if (ret != SQLITE_OK) {
1995 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1999 locales = __create_locale_list(mfx->label, mfx->license, mfx->icon,
2000 mfx->description, mfx->author);
2001 for (tmp = locales; tmp; tmp = tmp->next) {
2002 locale = (const char *)tmp->data;
2008 __extract_data(locale, mfx->label, mfx->license, mfx->icon,
2009 mfx->description, mfx->author,
2010 &label, &license, &icon, &description, &author);
2011 if (!label && !license && !icon && !description && !author)
2015 __BIND_TEXT(db, stmt, idx++, mfx->package);
2016 __BIND_TEXT(db, stmt, idx++, locale);
2017 __BIND_TEXT(db, stmt, idx++, label);
2018 __BIND_TEXT(db, stmt, idx++, icon);
2019 __BIND_TEXT(db, stmt, idx++, description);
2020 __BIND_TEXT(db, stmt, idx++, license);
2021 __BIND_TEXT(db, stmt, idx++, author);
2023 ret = sqlite3_step(stmt);
2024 if (ret != SQLITE_DONE) {
2025 _LOGE("step failed: %s", sqlite3_errmsg(db));
2026 g_list_free(locales);
2027 sqlite3_finalize(stmt);
2031 sqlite3_reset(stmt);
2034 g_list_free(locales);
2035 sqlite3_finalize(stmt);
2040 static int __insert_package_info(sqlite3 *db, manifest_x *mfx)
2042 static const char query[] =
2043 "INSERT INTO package_info (package, package_type,"
2044 " package_version, package_api_version, package_tep_name,"
2045 " package_zip_mount_file, install_location, package_size,"
2046 " package_removable, package_preload, package_readonly,"
2047 " package_update, package_appsetting, package_nodisplay,"
2048 " package_system, author_name, author_email, author_href,"
2049 " installed_time, installed_storage, storeclient_id,"
2050 " mainapp_id, package_url, root_path, external_path,"
2051 " csc_path, package_support_mode, package_support_disable) "
2055 " LOWER(?), LOWER(?), LOWER(?),"
2056 " LOWER(?), LOWER(?), LOWER(?),"
2057 " LOWER(?), ?, ?, ?,"
2064 const char *author_name = NULL;
2065 const char *author_email = NULL;
2066 const char *author_href = NULL;
2068 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2069 if (ret != SQLITE_OK) {
2070 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2074 if (mfx->author && mfx->author->data) {
2075 author_name = ((author_x *)mfx->author->data)->text;
2076 author_email = ((author_x *)mfx->author->data)->email;
2077 author_href = ((author_x *)mfx->author->data)->href;
2080 __BIND_TEXT(db, stmt, idx++, mfx->package);
2081 __BIND_TEXT(db, stmt, idx++, mfx->type);
2082 __BIND_TEXT(db, stmt, idx++, mfx->version);
2083 __BIND_TEXT(db, stmt, idx++, mfx->api_version);
2084 __BIND_TEXT(db, stmt, idx++, mfx->tep_name);
2085 __BIND_TEXT(db, stmt, idx++, mfx->zip_mount_file);
2086 __BIND_TEXT(db, stmt, idx++, mfx->installlocation);
2087 __BIND_TEXT(db, stmt, idx++, mfx->package_size);
2088 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->removable, true));
2089 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->preload, false));
2090 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->readonly, false));
2091 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->update, false));
2092 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->appsetting, false));
2093 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->nodisplay_setting, false));
2094 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->system, false));
2095 __BIND_TEXT(db, stmt, idx++, author_name);
2096 __BIND_TEXT(db, stmt, idx++, author_email);
2097 __BIND_TEXT(db, stmt, idx++, author_href);
2098 __BIND_TEXT(db, stmt, idx++, mfx->installed_time);
2099 __BIND_TEXT(db, stmt, idx++, mfx->installed_storage);
2100 __BIND_TEXT(db, stmt, idx++, mfx->storeclient_id);
2101 __BIND_TEXT(db, stmt, idx++, mfx->mainapp_id);
2102 __BIND_TEXT(db, stmt, idx++, mfx->package_url);
2103 __BIND_TEXT(db, stmt, idx++, mfx->root_path);
2104 __BIND_TEXT(db, stmt, idx++, mfx->external_path);
2105 __BIND_TEXT(db, stmt, idx++, mfx->csc_path);
2106 __BIND_TEXT(db, stmt, idx++,
2107 mfx->support_mode ? mfx->support_mode : "0");
2108 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->support_disable, false));
2110 ret = sqlite3_step(stmt);
2111 if (ret != SQLITE_DONE) {
2112 _LOGE("step failed: %s", sqlite3_errmsg(db));
2113 sqlite3_finalize(stmt);
2117 sqlite3_finalize(stmt);
2119 if (__insert_package_update_info(db, mfx))
2121 if (__insert_package_localized_info(db, mfx))
2123 if (__insert_application_info(db, mfx))
2125 if (__insert_package_privilege_info(db, mfx))
2127 if (__insert_package_appdefined_privilege_info(db, mfx))
2129 if (__insert_package_dependency_info(db, mfx))
2135 static int __open_db(uid_t uid, const char *path, sqlite3 **db, int flags)
2139 ret = sqlite3_open_v2(path, db, flags, NULL);
2140 if (ret != SQLITE_OK) {
2141 sqlite3_close_v2(*db);
2145 ret = sqlite3_busy_handler(*db, __db_busy_handler, (void *)path);
2146 if (ret != SQLITE_OK) {
2147 _LOGE("failed to register busy handler: %s",
2148 sqlite3_errmsg(*db));
2149 sqlite3_close_v2(*db);
2153 ret = sqlite3_exec(*db, "PRAGMA foreign_keys=ON", NULL, NULL, NULL);
2154 if (ret != SQLITE_OK) {
2155 _LOGE("failed to enable foreign key support: %s",
2156 sqlite3_errmsg(*db));
2157 sqlite3_close_v2(*db);
2164 static int __delete_package_info(sqlite3 *db, const char *pkgid)
2166 static const char query[] =
2167 "DELETE FROM package_info WHERE package=?";
2171 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2172 if (ret != SQLITE_OK) {
2173 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2177 __BIND_TEXT(db, stmt, 1, pkgid);
2179 ret = sqlite3_step(stmt);
2180 if (ret != SQLITE_DONE) {
2181 _LOGE("step failed: %s", sqlite3_errmsg(db));
2182 sqlite3_finalize(stmt);
2186 sqlite3_finalize(stmt);
2191 API int pkgmgr_parser_insert_pkg_info(manifest_x *mfx, uid_t uid)
2198 _LOGE("invalid parameter");
2199 return PM_PARSER_R_EINVAL;
2202 dbpath = __get_parser_db_path(uid);
2204 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2205 if (ret != SQLITE_OK) {
2206 _LOGE("open db failed: %d", ret);
2207 return PM_PARSER_R_ERROR;
2210 __BEGIN_TRANSACTION(db);
2211 __DO_TRANSACTION(db, __delete_package_info(db, mfx->package));
2212 __DO_TRANSACTION(db, __insert_package_info(db, mfx));
2213 __END_TRANSACTION(db);
2215 sqlite3_close_v2(db);
2217 return PM_PARSER_R_OK;
2220 API int pkgmgr_parser_insert_manifest_info_in_usr_db(manifest_x *mfx, uid_t uid)
2222 // TODO: use pkginfo-client APIs to send manifest_x to server
2226 API int pkgmgr_parser_insert_manifest_info_in_db(manifest_x *mfx)
2228 return pkgmgr_parser_insert_manifest_info_in_usr_db(mfx, __getuid());
2231 API int pkgmgr_parser_delete_pkg_info(const char *package, uid_t uid)
2237 if (package == NULL) {
2238 _LOGE("invalid parameter");
2239 return PM_PARSER_R_EINVAL;
2242 dbpath = __get_parser_db_path(uid);
2244 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2245 if (ret != SQLITE_OK) {
2246 _LOGE("open db failed: %d", ret);
2247 return PM_PARSER_R_ERROR;
2250 __BEGIN_TRANSACTION(db);
2251 __DO_TRANSACTION(db, __delete_package_info(db, package));
2252 __END_TRANSACTION(db);
2254 return PM_PARSER_R_OK;
2257 API int pkgmgr_parser_delete_manifest_info_from_usr_db(manifest_x *mfx,
2260 // TODO: use pkginfo-client APIs to send package id to server
2264 API int pkgmgr_parser_delete_manifest_info_from_db(manifest_x *mfx)
2266 return pkgmgr_parser_delete_manifest_info_from_usr_db(mfx, __getuid());
2269 API int pkgmgr_parser_update_manifest_info_in_usr_db(manifest_x *mfx, uid_t uid)
2271 return pkgmgr_parser_insert_manifest_info_in_usr_db(mfx, uid);
2274 API int pkgmgr_parser_update_manifest_info_in_db(manifest_x *mfx)
2276 return pkgmgr_parser_update_manifest_info_in_usr_db(mfx, __getuid());
2279 API int pkgmgr_parser_update_global_app_disable_for_uid_info_in_db(
2280 const char *appid, uid_t uid, int is_disable)
2282 // TODO: construct query at here and send it to server
2285 query = sqlite3_mprintf("INSERT OR REPLACE INTO package_app_info_for_uid ("
2286 " app_id, uid, is_disabled, is_splash_screen_enabled) "
2287 "VALUES (%Q, %Q, %Q,"
2288 " (SELECT app_splash_screen_display FROM package_app_info"
2289 " WHERE app_id=%Q))", appid, uid,
2290 (is_disable ? "true" : "false"), appid);
2291 if (query == NULL) {
2292 _LOGE("Out of memory");
2293 return PM_PARSER_R_ERROR;
2296 // TODO: send query to server
2297 sqlite3_free(query);
2299 return PM_PARSER_R_OK;
2302 API int pkgmgr_parser_update_app_disable_info_in_usr_db(const char *appid,
2303 uid_t uid, int is_disable)
2307 query = sqlite3_mprintf("UPDATE package_app_info SET app_disable=%Q "
2308 "WHERE app_id=%Q", (is_disable ? "true" : "false"), appid);
2309 if (query == NULL) {
2310 _LOGE("Out of memory");
2311 return PM_PARSER_R_ERROR;
2314 // TODO: construct query and send it to server
2315 sqlite3_free(query);
2317 return PM_PARSER_R_OK;
2320 API int pkgmgr_parser_update_app_disable_info_in_db(const char *appid,
2323 return pkgmgr_parser_update_app_disable_info_in_usr_db(appid,
2324 __getuid(), is_disable);
2327 API int pkgmgr_parser_update_pkg_disable_info_in_usr_db(const char *pkgid,
2328 uid_t uid, int is_disable)
2332 query = sqlite3_mprintf("UPDATE package_info SET package_disable=%Q "
2333 "WHERE package=%Q", (is_disable ? "true" : "false"), pkgid);
2334 if (query == NULL) {
2335 _LOGE("Out of memory");
2336 return PM_PARSER_R_ERROR;
2339 // TODO: construct query and send it to server
2340 sqlite3_free(query);
2342 return PM_PARSER_R_OK;
2345 API int pkgmgr_parser_update_pkg_disable_info_in_db(const char *pkgid,
2348 return pkgmgr_parser_update_pkg_disable_info_in_usr_db(pkgid,
2349 __getuid(), is_disable);
2352 API int pkgmgr_parser_update_global_app_splash_screen_display_info_in_usr_db(
2353 const char *appid, uid_t uid, int flag)
2357 query = sqlite3_mprintf("INSERT OR REPLACE INTO package_app_info_for_uid("
2358 " appid, uid, is_splash_screen_enabled) "
2359 "VALUES (%Q, %Q, Q%)", appid, uid, (flag == 1 ? "true" : "false"));
2360 if (query == NULL) {
2361 _LOGE("Out of memory");
2362 return PM_PARSER_R_ERROR;
2365 // TODO: construct query and send it to server
2366 sqlite3_free(query);
2368 return PM_PARSER_R_OK;
2371 API int pkgmgr_parser_update_app_splash_screen_display_info_in_usr_db(
2372 const char *appid, uid_t uid, int flag)
2376 query = sqlite3_mprintf("UPDATE package_app_info SET app_splash_screen_display=%Q "
2377 "WHERE app_id=%Q", (flag == 1 ? "true" : "false"), appid);
2378 if (query == NULL) {
2379 _LOGE("Out of memory");
2380 return PM_PARSER_R_ERROR;
2383 // TODO: construct query and send it to server
2384 sqlite3_free(query);
2386 return PM_PARSER_R_OK;
2389 API int pkgmgr_parser_update_app_splash_screen_display_info_in_db(
2390 const char *appid, int flag)
2392 return pkgmgr_parser_update_app_splash_screen_display_info_in_usr_db(
2393 appid, __getuid(), flag);
2396 API int pkgmgr_parser_update_app_label_info_in_usr_db(const char *appid,
2397 uid_t uid, const char *label)
2401 query = sqlite3_mprintf("UPDATE package_app_localized_info SET app_label=%Q "
2402 "WHERE app_id=%Q AND app_label IS NOT NULL", label, appid);
2403 if (query == NULL) {
2404 _LOGE("Out of memory");
2405 return PM_PARSER_R_ERROR;
2408 // TODO: construct query and send it to server
2409 sqlite3_free(query);
2411 return PM_PARSER_R_OK;
2414 API int pkgmgr_parser_update_app_label_info_in_db(const char *appid,
2417 return pkgmgr_parser_update_app_label_info_in_usr_db(appid, __getuid(),
2421 API int pkgmgr_parser_update_app_icon_info_in_usr_db(const char *appid,
2422 uid_t uid, const char *icon_path)
2426 query = sqlite3_mprintf("UPDATE package_app_localized_info SET app_icon=%Q "
2427 "WHERE app_id=TQ AND app_icon IS NOT NULL", icon_path, appid);
2428 if (query == NULL) {
2429 _LOGE("Out of memory");
2430 return PM_PARSER_R_ERROR;
2433 // TODO: construct query and send it to server
2434 sqlite3_free(query);
2436 return PM_PARSER_R_OK;
2439 API int pkgmgr_parser_update_app_icon_info_in_db(const char *appid,
2440 const char *icon_path)
2442 return pkgmgr_parser_update_app_icon_info_in_usr_db(appid, __getuid(),
2446 API int pkgmgr_parser_update_tep_info_in_usr_db(const char *pkgid,
2447 const char *tep_path, uid_t uid)
2451 query = sqlite3_mprintf("UPDATE package_info SET package_tep_name=%Q "
2452 "WHERE package=%Q", tep_path, pkgid);
2453 if (query == NULL) {
2454 _LOGE("Out of memory");
2455 return PM_PARSER_R_ERROR;
2458 // TODO: construct query and send it to server
2459 sqlite3_free(query);
2461 return PM_PARSER_R_OK;
2464 API int pkgmgr_parser_update_tep_info_in_db(const char *pkgid,
2465 const char *tep_path)
2467 return pkgmgr_parser_update_tep_info_in_usr_db(pkgid, tep_path,
2471 static int __convert_update_type(pkgmgrinfo_updateinfo_update_type type,
2472 const char **update_type)
2474 if (type == PMINFO_UPDATEINFO_NONE)
2475 *update_type = PMINFO_UPDATEINFO_TYPE_NONE;
2476 else if (type == PMINFO_UPDATEINFO_FORCE)
2477 *update_type = PMINFO_UPDATEINFO_TYPE_FORCE;
2478 else if (type == PMINFO_UPDATEINFO_OPTIONAL)
2479 *update_type = PMINFO_UPDATEINFO_TYPE_OPTIONAL;
2485 static int __register_pkg_update_info(updateinfo_x *info,
2486 const char *update_type)
2490 query = sqlite3_mprintf("UPDATE package_update_info "
2491 "SET update_version=%Q, update_type=%Q "
2492 "WHERE package=%Q", info->version, update_type, info->pkgid);
2493 if (query == NULL) {
2494 _LOGE("Out of memory");
2495 return PM_PARSER_R_ERROR;
2498 // TODO: send query to server
2499 sqlite3_free(query);
2501 return PM_PARSER_R_OK;
2504 API int pkgmgr_parser_register_pkg_update_info_in_usr_db(
2505 pkgmgrinfo_updateinfo_h handle, uid_t uid)
2508 updateinfo_x *update_info;
2509 updateinfo_x *prev_update_info;
2510 pkgmgrinfo_updateinfo_h prev_update_handle;
2511 pkgmgrinfo_pkginfo_h pkginfo;
2512 pkgmgrinfo_version_compare_type compare_result;
2514 const char *update_type;
2516 if (handle == NULL) {
2517 _LOGE("invalid parameter");
2518 return PM_PARSER_R_EINVAL;
2521 update_info = (updateinfo_x *)handle;
2522 if (update_info->pkgid == NULL || update_info->version == NULL)
2523 return PM_PARSER_R_EINVAL;
2524 if (__convert_update_type(update_info->type, &update_type) != 0)
2525 return PM_PARSER_R_EINVAL;
2527 ret = pkgmgrinfo_updateinfo_get_usr_updateinfo(update_info->pkgid,
2528 &prev_update_handle, uid);
2529 if (ret != PMINFO_R_OK)
2530 return PM_PARSER_R_ERROR;
2532 prev_update_info = (updateinfo_x *)prev_update_handle;
2533 ret = pkgmgrinfo_compare_package_version(update_info->version,
2534 prev_update_info->version, &compare_result);
2535 if (ret != PMINFO_R_OK) {
2536 pkgmgrinfo_updateinfo_destroy(prev_update_handle);
2537 return PM_PARSER_R_ERROR;
2540 if (compare_result == PMINFO_VERSION_SAME &&
2541 prev_update_info->type == PMINFO_UPDATEINFO_NONE) {
2542 _LOGI("Given update info version[%s] of pkgid[%s] "
2544 update_info->version, update_info->pkgid);
2545 pkgmgrinfo_updateinfo_destroy(prev_update_handle);
2546 return PM_PARSER_R_OK;
2548 pkgmgrinfo_updateinfo_destroy(prev_update_handle);
2550 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(update_info->pkgid, uid,
2552 if (ret != PMINFO_R_OK)
2553 return PM_PARSER_R_ERROR;
2555 ret = pkgmgrinfo_pkginfo_is_global(pkginfo, &is_global_pkg);
2556 if (ret != PMINFO_R_OK) {
2557 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
2558 return PM_PARSER_R_ERROR;
2560 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
2562 return __register_pkg_update_info(update_info, update_type);
2565 API int pkgmgr_parser_register_pkg_update_info_in_db(
2566 pkgmgrinfo_updateinfo_h handle)
2568 return pkgmgr_parser_register_pkg_update_info_in_usr_db(handle,
2572 static int __unregister_pkg_update_info(const char *pkgid, uid_t uid)
2576 query = sqlite3_mprintf("UPDATE package_update_info "
2577 "SET update_type='none' WHERE package=%Q", pkgid);
2578 if (query == NULL) {
2579 _LOGE("Out of memory");
2580 return PM_PARSER_R_ERROR;
2583 // TODO: send query to server
2584 sqlite3_free(query);
2586 return PM_PARSER_R_OK;
2589 API int pkgmgr_parser_unregister_pkg_update_info_in_usr_db(const char *pkgid,
2593 pkgmgrinfo_pkginfo_h pkginfo;
2597 if (pkgid == NULL) {
2598 _LOGE("invalid parameter");
2599 return PM_PARSER_R_EINVAL;
2602 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &pkginfo);
2603 if (ret != PMINFO_R_OK)
2604 return PM_PARSER_R_EINVAL;
2606 ret = pkgmgrinfo_pkginfo_is_global(pkginfo, &is_global_pkg);
2607 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
2608 if (ret != PMINFO_R_OK)
2609 return PM_PARSER_R_ERROR;
2611 target_uid = is_global_pkg ? GLOBAL_USER : uid;
2613 // TODO: what we do with is_global_pkg?
2614 return __unregister_pkg_update_info(pkgid, target_uid);
2617 API int pkgmgr_parser_unregister_pkg_update_info_in_db(const char *pkgid)
2619 return pkgmgr_parser_unregister_pkg_update_info_in_usr_db(pkgid,
2623 API int pkgmgr_parser_unregister_all_pkg_update_info_in_usr_db(uid_t uid)
2627 query = sqlite3_mprintf("UPDATE package_update_info "
2628 "SET update_type='none'");
2629 if (query == NULL) {
2630 _LOGE("Out of memory");
2631 return PM_PARSER_R_ERROR;
2634 // TODO: send query to server
2635 sqlite3_free(query);
2637 return PM_PARSER_R_OK;
2640 API int pkgmgr_parser_unregister_all_pkg_update_info_in_db(void)
2642 return pkgmgr_parser_unregister_all_pkg_update_info_in_usr_db(
2646 API int pkgmgr_parser_register_pkg_plugin_info_in_usr_db(
2647 manifest_x *mfx, uid_t uid)
2649 return __insert_package_plugin_execution_info(mfx, uid);
2652 API int pkgmgr_parser_register_pkg_plugin_info_in_db(manifest_x *mfx)
2654 return pkgmgr_parser_register_pkg_plugin_info_in_usr_db(mfx, __getuid());
2657 API int pkgmgr_parser_update_pkg_plugin_info_in_usr_db(
2658 manifest_x *mfx, uid_t uid)
2660 // TODO: construct query and send to server
2663 ret = __delete_package_plugin_execution_info(mfx->package, uid);
2664 if (ret != PM_PARSER_R_OK)
2666 ret = __insert_package_plugin_execution_info(mfx, uid);
2667 if (ret != PM_PARSER_R_OK)
2670 return PM_PARSER_R_OK;
2673 API int pkgmgr_parser_update_pkg_plugin_info_in_db(manifest_x *mfx)
2675 return pkgmgr_parser_update_pkg_plugin_info_in_usr_db(mfx, __getuid());
2678 API int pkgmgr_parser_unregister_pkg_plugin_info_in_usr_db(
2679 const char *pkgid, uid_t uid)
2681 return __delete_package_plugin_execution_info(pkgid, uid);
2684 API int pkgmgr_parser_unregister_pkg_plugin_info_in_db(const char *pkgid)
2686 return pkgmgr_parser_unregister_pkg_plugin_info_in_usr_db(pkgid, __getuid());