2 * Copyright (c) 2000 - 2017 Samsung Electronics Co., Ltd. All rights reserved.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
22 #include <sys/types.h>
24 #include <sys/smack.h>
25 #include <linux/limits.h>
32 #include <tzplatform_config.h>
33 #include <system_info.h>
35 #include "pkgmgr-info.h"
36 #include "pkgmgrinfo_basic.h"
37 #include "pkgmgr_parser.h"
38 #include "pkgmgr_parser_db_queries.h"
39 #include "pkgmgr_parser_debug.h"
40 #include "pkgmgr_parser_internal.h"
46 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
49 #define APPFW_USER "app_fw"
58 #define XXHDPI "xxhdpi"
68 #define XXHDPI_MIN 481
69 #define XXHDPI_MAX 600
71 /* app background category value */
72 #define APP_BG_CATEGORY_USER_DISABLE_FALSE_VAL 0x00000
73 #define APP_BG_CATEGORY_USER_DISABLE_TRUE_VAL 0x00001
74 #define APP_BG_CATEGORY_MEDIA_VAL 0x00002
75 #define APP_BG_CATEGORY_DOWNLOAD_VAL 0x00004
76 #define APP_BG_CATEGORY_BGNETWORK_VAL 0x00008
77 #define APP_BG_CATEGORY_LOCATION_VAL 0x00010
78 #define APP_BG_CATEGORY_SENSOR_VAL 0x00020
79 #define APP_BG_CATEGORY_IOTCOMM_VAL 0x00040
80 #define APP_BG_CATEGORY_SYSTEM_VAL 0x00080
82 #define APP_BG_CATEGORY_USER_DISABLE_FALSE_STR "enable"
83 #define APP_BG_CATEGORY_USER_DISABLE_TRUE_STR "disable"
84 #define APP_BG_CATEGORY_MEDIA_STR "media"
85 #define APP_BG_CATEGORY_DOWNLOAD_STR "download"
86 #define APP_BG_CATEGORY_BGNETWORK_STR "background-network"
87 #define APP_BG_CATEGORY_LOCATION_STR "location"
88 #define APP_BG_CATEGORY_SENSOR_STR "sensor"
89 #define APP_BG_CATEGORY_IOTCOMM_STR "iot-communication"
90 #define APP_BG_CATEGORY_SYSTEM "system"
92 #define REGULAR_USER 5000
93 static inline uid_t __getuid(void)
97 if (uid < REGULAR_USER)
98 return tzplatform_getuid(TZ_SYS_GLOBALAPP_USER);
103 static const char *__get_bool(char *value, bool is_true)
106 if (!strcmp(value, ""))
107 return (is_true) ? "true" : "false";
111 return (is_true) ? "true" : "false";
114 #define __BEGIN_TRANSACTION(db) \
116 if (sqlite3_exec(db, "BEGIN EXCLUSIVE", NULL, NULL, NULL) != \
118 _LOGE("begin transaction failed: %s", sqlite3_errmsg(db)); \
119 sqlite3_close_v2(db); \
120 return PM_PARSER_R_ERROR; \
124 #define __DO_TRANSACTION(db, func) \
127 _LOGE("transaction failed: %s, rollback", sqlite3_errmsg(db)); \
128 if (sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL) != \
130 _LOGE("roll back transaction failed: %s", \
131 sqlite3_errmsg(db)); \
132 sqlite3_close_v2(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 sqlite3_close_v2(db); \
147 return PM_PARSER_R_ERROR; \
151 #define __BIND_TEXT(db, stmt, i, text) \
153 if (sqlite3_bind_text(stmt, i, text, -1, SQLITE_STATIC) != SQLITE_OK) {\
154 _LOGE("bind error(index %d): %s", i, sqlite3_errmsg(db)); \
155 sqlite3_finalize(stmt); \
160 #define __BIND_INT(db, stmt, i, int) \
162 if (sqlite3_bind_int(stmt, i, int) != SQLITE_OK) { \
163 _LOGE("bind error(index %d): %s", i, sqlite3_errmsg(db)); \
164 sqlite3_finalize(stmt); \
169 static const char *__get_parser_db_path(uid_t uid)
174 if (uid == GLOBAL_USER || uid == OWNER_ROOT) {
175 path = tzplatform_mkpath(TZ_SYS_DB, ".pkgmgr_parser.db");
177 snprintf(buf, sizeof(buf), "user/%d/.pkgmgr_parser.db", uid);
178 path = tzplatform_mkpath(TZ_SYS_DB, buf);
184 static const char *__get_cert_db_path(void)
186 return tzplatform_mkpath(TZ_SYS_DB, ".pkgmgr_cert.db");
189 #define DB_VERSION_PATH SYSCONFDIR "/package-manager/pkg_db_version.txt"
190 static int __set_db_version(sqlite3 *db)
194 char version[PKG_STRING_LEN_MAX] = { 0 };
197 fp = fopen(DB_VERSION_PATH, "r");
198 retvm_if(fp == NULL, -1, "Failed to open db version file");
199 if (fgets(version, sizeof(version), fp) == NULL) {
200 _LOGE("Failed to get version information");
206 query = sqlite3_mprintf("PRAGMA user_version=%Q", version);
208 _LOGE("Out of memory");
212 ret = sqlite3_exec(db, query, NULL, NULL, NULL);
213 if (ret != SQLITE_OK) {
214 _LOGE("exec failed: %s", sqlite3_errmsg(db));
223 /* TODO: Do not labeling directly */
224 #define DB_LABEL "User::Home"
225 #define SET_SMACK_LABEL(x) \
227 if (smack_setlabel((x), DB_LABEL, SMACK_LABEL_ACCESS)) \
228 _LOGE("failed chsmack -a %s %s", DB_LABEL, x); \
230 _LOGD("chsmack -a %s %s", DB_LABEL, x); \
233 static int __set_db_permission(const char *path, uid_t uid)
236 const char *files[2];
237 char journal_file[BUFSIZE];
241 struct passwd *result;
246 if (getuid() != OWNER_ROOT)
249 if (uid == OWNER_ROOT || uid == GLOBAL_USER) {
250 ret = getpwnam_r(APPFW_USER, &pwd, buf, sizeof(buf), &result);
251 if (result == NULL) {
253 _LOGE("no such user: %d", uid);
255 _LOGE("getpwuid_r failed: %d", errno);
261 snprintf(journal_file, sizeof(journal_file), "%s-journal", path);
263 files[1] = journal_file;
265 ret = getpwuid_r(uid, &pwd, buf, sizeof(buf), &result);
266 if (result == NULL) {
268 _LOGE("no such user: %d", uid);
270 _LOGE("getpwuid_r failed: %d", errno);
274 for (i = 0; i < 2; i++) {
275 fd = open(files[i], O_RDONLY);
277 _LOGE("open %s failed: %d", files[i], errno);
280 ret = fstat(fd, &sb);
282 _LOGE("stat %s failed: %d", files[i], errno);
286 if (S_ISLNK(sb.st_mode)) {
287 _LOGE("%s is symlink!", files[i]);
291 ret = fchown(fd, uid, pwd.pw_gid);
293 _LOGE("fchown %s failed: %d", files[i], errno);
298 mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH;
299 if (!strcmp(path, __get_cert_db_path()))
301 ret = fchmod(fd, mode);
303 _LOGD("fchmod %s failed: %d", files[i], errno);
308 SET_SMACK_LABEL(files[i]);
314 static const char *parser_init_queries[] = {
315 QUERY_CREATE_TABLE_PACKAGE_INFO,
316 QUERY_CREATE_TABLE_PACKAGE_LOCALIZED_INFO,
317 QUERY_CREATE_TABLE_PACKAGE_PRIVILEGE_INFO,
318 QUERY_CREATE_TABLE_PACKAGE_APPDEFINED_PRIVILEGE_INFO,
319 QUERY_CREATE_TABLE_PACKAGE_UPDATE_INFO,
320 QUERY_CREATE_TABLE_PACKAGE_APP_INFO,
321 QUERY_CREATE_TABLE_PACKAGE_APP_LOCALIZED_INFO,
322 QUERY_CREATE_TABLE_PACKAGE_APP_APP_CONTROL,
323 QUERY_CREATE_TABLE_PACKAGE_APP_APP_CONTROL_PRIVILEGE,
324 QUERY_CREATE_TABLE_PACKAGE_APP_APP_CATEGORY,
325 QUERY_CREATE_TABLE_PACKAGE_APP_APP_METADATA,
326 QUERY_CREATE_TABLE_PACKAGE_APP_DATA_CONTROL,
327 QUERY_CREATE_TABLE_PACKAGE_APP_DATA_CONTROL_PRIVILEGE,
328 QUERY_CREATE_TABLE_PACKAGE_APP_INFO_FOR_UID,
329 QUERY_CREATE_TRIGGER_UPDATE_PACKAGE_APP_INFO_FOR_UID,
330 QUERY_CREATE_TABLE_PACKAGE_APP_SPLASH_SCREEN,
334 static const char *cert_init_queries[] = {
335 QUERY_CREATE_TABLE_PACKAGE_CERT_INFO,
336 QUERY_CREATE_TABLE_PACKAGE_CERT_INDEX_INFO,
337 QUERY_CREATE_TRIGGER_UPDATE_CERT_INFO,
338 QUERY_CREATE_TRIGGER_UPDATE_CERT_INFO2,
339 QUERY_CREATE_TRIGGER_DELETE_CERT_INFO,
340 QUERY_CREATE_TRIGGER_UPDATE_CERT_INDEX_INFO,
344 static int __initialize_db(sqlite3 *db, const char *dbpath, uid_t uid)
347 const char **queries;
350 if (__set_db_version(db))
353 if (strstr(dbpath, ".pkgmgr_parser.db")) {
354 queries = parser_init_queries;
355 } else if (strstr(dbpath, ".pkgmgr_cert.db")) {
356 queries = cert_init_queries;
358 _LOGE("unexpected dbpath: %s", dbpath);
362 for (i = 0; queries[i] != NULL; i++) {
363 ret = sqlite3_exec(db, queries[i], NULL, NULL, NULL);
364 if (ret != SQLITE_OK) {
365 _LOGE("exec failed: %s", sqlite3_errmsg(db));
370 if (__set_db_permission(dbpath, uid))
371 _LOGE("failed to set db permission");
376 API int pkgmgr_parser_initialize_parser_db(uid_t uid)
382 dbpath = __get_parser_db_path(uid);
383 if (access(dbpath, F_OK) != -1) {
384 _LOGE("Manifest db for user %d is already exists", uid);
385 return PM_PARSER_R_ERROR;
388 ret = sqlite3_open_v2(dbpath, &db,
389 SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
390 if (ret != SQLITE_OK) {
391 _LOGE("open db failed: %d", ret);
392 return PM_PARSER_R_ERROR;
395 if (__initialize_db(db, dbpath, uid)) {
396 sqlite3_close_v2(db);
397 return PM_PARSER_R_ERROR;
399 sqlite3_close_v2(db);
401 return PM_PARSER_R_OK;
404 API int pkgmgr_parser_initialize_cert_db(void)
410 dbpath = __get_cert_db_path();
411 if (access(dbpath, F_OK) != -1) {
412 _LOGE("Cert db is already exists");
413 return PM_PARSER_R_ERROR;
416 ret = sqlite3_open_v2(dbpath, &db,
417 SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
418 if (ret != SQLITE_OK) {
419 _LOGE("open db failed: %d", ret);
420 return PM_PARSER_R_ERROR;
423 if (__initialize_db(db, dbpath, GLOBAL_USER)) {
424 sqlite3_close_v2(db);
425 return PM_PARSER_R_ERROR;
427 sqlite3_close_v2(db);
429 return PM_PARSER_R_OK;
432 API int pkgmgr_parser_create_and_initialize_db(uid_t uid)
436 struct passwd *result;
439 ret = getpwnam_r(APPFW_USER, &pwd, buf, sizeof(buf), &result);
440 if (result == NULL) {
442 _LOGE("no such user: %s", APPFW_USER);
444 _LOGE("getpwnam_r failed: %d", errno);
445 return PM_PARSER_R_ERROR;
448 if (getuid() != OWNER_ROOT && getuid() != pwd.pw_uid) {
449 _LOGE("Only root or app_fw user is allowed");
450 return PM_PARSER_R_EINVAL;
453 if (pkgmgr_parser_initialize_parser_db(uid))
454 return PM_PARSER_R_ERROR;
456 if (uid == OWNER_ROOT || uid == GLOBAL_USER)
457 if (pkgmgr_parser_initialize_cert_db())
458 return PM_PARSER_R_ERROR;
460 return PM_PARSER_R_OK;
463 #define BUSY_WAITING_USEC (1000000 / 10 / 2) /* 0.05 sec */
464 #define BUSY_WAITING_MAX 20 /* wait for max 1 sec */
465 static int __db_busy_handler(void *data, int count)
467 if (count < BUSY_WAITING_MAX) {
468 usleep(BUSY_WAITING_USEC);
471 /* sqlite3_prepare_v2 will return SQLITE_BUSY */
476 static int __open_db(uid_t uid, const char *path, sqlite3 **db, int flags)
480 /* FIXME: always open with OPEN_CREATE flag for keeping previous
483 if (flags & SQLITE_OPEN_READWRITE)
484 flags = flags | SQLITE_OPEN_CREATE;
486 ret = sqlite3_open_v2(path, db, flags, NULL);
487 if (ret != SQLITE_OK)
490 ret = sqlite3_busy_handler(*db, __db_busy_handler, NULL);
491 if (ret != SQLITE_OK) {
492 _LOGE("failed to register busy handler: %s",
493 sqlite3_errmsg(*db));
494 sqlite3_close_v2(*db);
498 if (flags & SQLITE_OPEN_CREATE) {
499 ret = __initialize_db(*db, path, uid);
501 _LOGE("failed to initialize db: %s", path);
502 sqlite3_close_v2(*db);
507 ret = sqlite3_exec(*db, "PRAGMA foreign_keys=ON", NULL, NULL, NULL);
508 if (ret != SQLITE_OK) {
509 _LOGE("failed to enable foreign key support: %s",
510 sqlite3_errmsg(*db));
511 sqlite3_close_v2(*db);
519 static int __convert_background_category(GList *category_list)
525 if (category_list == NULL)
528 for (tmp = category_list; tmp; tmp = tmp->next) {
529 category_data = (char *)tmp->data;
530 if (category_data == NULL)
532 if (!strcmp(category_data, APP_BG_CATEGORY_MEDIA_STR))
533 ret |= APP_BG_CATEGORY_MEDIA_VAL;
534 else if (!strcmp(category_data, APP_BG_CATEGORY_DOWNLOAD_STR))
535 ret |= APP_BG_CATEGORY_DOWNLOAD_VAL;
536 else if (!strcmp(category_data, APP_BG_CATEGORY_BGNETWORK_STR))
537 ret |= APP_BG_CATEGORY_BGNETWORK_VAL;
538 else if (!strcmp(category_data, APP_BG_CATEGORY_LOCATION_STR))
539 ret |= APP_BG_CATEGORY_LOCATION_VAL;
540 else if (!strcmp(category_data, APP_BG_CATEGORY_SENSOR_STR))
541 ret |= APP_BG_CATEGORY_SENSOR_VAL;
542 else if (!strcmp(category_data, APP_BG_CATEGORY_IOTCOMM_STR))
543 ret |= APP_BG_CATEGORY_IOTCOMM_VAL;
544 else if (!strcmp(category_data, APP_BG_CATEGORY_SYSTEM))
545 ret |= APP_BG_CATEGORY_SYSTEM_VAL;
547 _LOGE("Unidentified category [%s]", category_data);
553 #define EFFECTIVE_APPID_KEY "http://tizen.org/metadata/effective-appid"
554 static const char *__find_effective_appid(GList *metadata_list)
559 for (tmp = metadata_list; tmp; tmp = tmp->next) {
560 md = (metadata_x *)tmp->data;
561 if (md == NULL || md->key == NULL)
564 if (strcmp(md->key, EFFECTIVE_APPID_KEY) == 0) {
573 static int __insert_appcontrol_privilege_info(sqlite3 *db, const char *appid,
576 static const char query[] =
577 "INSERT INTO package_app_app_control_privilege (app_id,"
578 " app_control, privilege) VALUES (?, ?, ?)";
582 char app_control[BUFSIZE];
589 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
590 if (ret != SQLITE_OK) {
591 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
595 for (tmp = ac->privileges; tmp; tmp = tmp->next) {
596 privilege = (char *)tmp->data;
597 if (privilege == NULL || !strlen(privilege))
601 snprintf(app_control, sizeof(app_control), "%s|%s|%s",
602 ac->operation ? (strlen(ac->operation) > 0 ?
603 ac->operation : "NULL") : "NULL",
604 ac->uri ? (strlen(ac->uri) > 0 ?
605 ac->uri : "NULL") : "NULL",
606 ac->mime ? (strlen(ac->mime) > 0 ?
607 ac->mime : "NULL") : "NULL");
608 __BIND_TEXT(db, stmt, idx++, appid);
609 __BIND_TEXT(db, stmt, idx++, app_control);
610 __BIND_TEXT(db, stmt, idx++, privilege);
612 ret = sqlite3_step(stmt);
613 if (ret != SQLITE_DONE) {
614 _LOGE("step failed: %s", sqlite3_errmsg(db));
615 sqlite3_finalize(stmt);
622 sqlite3_finalize(stmt);
627 static int __insert_appcontrol_info(sqlite3 *db, application_x *app)
629 static const char query[] =
630 "INSERT INTO package_app_app_control (app_id, app_control,"
636 char app_control[BUFSIZE];
640 if (app->appcontrol == NULL)
643 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
644 if (ret != SQLITE_OK) {
645 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
649 for (tmp = app->appcontrol; tmp; tmp = tmp->next) {
650 ac = (appcontrol_x *)tmp->data;
654 snprintf(app_control, sizeof(app_control), "%s|%s|%s",
655 ac->operation ? (strlen(ac->operation) > 0 ?
656 ac->operation : "NULL") : "NULL",
657 ac->uri ? (strlen(ac->uri) > 0 ?
658 ac->uri : "NULL") : "NULL",
659 ac->mime ? (strlen(ac->mime) > 0 ?
660 ac->mime : "NULL") : "NULL");
661 __BIND_TEXT(db, stmt, idx++, app->appid);
662 __BIND_TEXT(db, stmt, idx++, app_control);
663 __BIND_TEXT(db, stmt, idx++, ac->visibility);
665 ret = sqlite3_step(stmt);
666 if (ret != SQLITE_DONE) {
667 _LOGE("step failed: %s", sqlite3_errmsg(db));
668 sqlite3_finalize(stmt);
672 if (__insert_appcontrol_privilege_info(db, app->appid, ac)) {
673 sqlite3_finalize(stmt);
680 sqlite3_finalize(stmt);
685 static int __insert_category_info(sqlite3 *db, application_x *app)
687 static const char query[] =
688 "INSERT INTO package_app_app_category (app_id, category) "
694 const char *category;
696 if (app->category == NULL)
699 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
700 if (ret != SQLITE_OK) {
701 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
705 for (tmp = app->category; tmp; tmp = tmp->next) {
706 category = (const char *)tmp->data;
707 if (category == NULL)
710 __BIND_TEXT(db, stmt, idx++, app->appid);
711 __BIND_TEXT(db, stmt, idx++, category);
713 ret = sqlite3_step(stmt);
714 if (ret != SQLITE_DONE) {
715 _LOGE("step failed: %s", sqlite3_errmsg(db));
716 sqlite3_finalize(stmt);
723 sqlite3_finalize(stmt);
728 static int __insert_metadata_info(sqlite3 *db, application_x *app)
730 static const char query[] =
731 "INSERT INTO package_app_app_metadata (app_id,"
732 " md_key, md_value) VALUES (?, ?, ?)";
739 if (app->metadata == NULL)
742 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
743 if (ret != SQLITE_OK) {
744 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
748 for (tmp = app->metadata; tmp; tmp = tmp->next) {
749 md = (metadata_x *)tmp->data;
753 __BIND_TEXT(db, stmt, idx++, app->appid);
754 __BIND_TEXT(db, stmt, idx++, md->key);
755 __BIND_TEXT(db, stmt, idx++, md->value);
757 ret = sqlite3_step(stmt);
758 if (ret != SQLITE_DONE) {
759 _LOGE("step failed: %s", sqlite3_errmsg(db));
760 sqlite3_finalize(stmt);
767 sqlite3_finalize(stmt);
772 static int __insert_app_data_control_privilege_info(sqlite3 *db,
773 datacontrol_x *datacontrol)
775 static const char query[] =
776 "INSERT INTO package_app_data_control_privilege (providerid,"
777 " privilege, type) VALUES (?, ?, ?)";
785 if (datacontrol == NULL)
788 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
789 if (ret != SQLITE_OK) {
790 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
794 for (privileges = datacontrol->privileges; privileges;
795 privileges = privileges->next) {
796 priv = (char *)privileges->data;
801 __BIND_TEXT(db, stmt, idx++, datacontrol->providerid);
802 __BIND_TEXT(db, stmt, idx++, priv);
803 __BIND_TEXT(db, stmt, idx++, datacontrol->type);
805 ret = sqlite3_step(stmt);
806 if (ret != SQLITE_DONE) {
807 _LOGE("step failed: %s", sqlite3_errmsg(db));
808 sqlite3_finalize(stmt);
815 sqlite3_finalize(stmt);
819 static int __insert_datacontrol_info(sqlite3 *db, application_x *app)
821 static const char query[] =
822 "INSERT INTO package_app_data_control (app_id, providerid,"
823 " access, type, trusted) VALUES (?, ?, ?, ?, ?)";
830 if (app->datacontrol == NULL)
833 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
834 if (ret != SQLITE_OK) {
835 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
839 for (tmp = app->datacontrol; tmp; tmp = tmp->next) {
840 dc = (datacontrol_x *)tmp->data;
844 __BIND_TEXT(db, stmt, idx++, app->appid);
845 __BIND_TEXT(db, stmt, idx++, dc->providerid);
846 __BIND_TEXT(db, stmt, idx++, dc->access);
847 __BIND_TEXT(db, stmt, idx++, dc->type);
848 __BIND_TEXT(db, stmt, idx++, dc->trusted);
850 ret = sqlite3_step(stmt);
851 if (ret != SQLITE_DONE) {
852 _LOGE("step failed: %s", sqlite3_errmsg(db));
853 sqlite3_finalize(stmt);
857 if (dc->privileges &&
858 __insert_app_data_control_privilege_info(db, dc)) {
859 sqlite3_finalize(stmt);
866 sqlite3_finalize(stmt);
871 /* TODO: move to installer */
872 static int __check_dpi(const char *dpi_char, int dpi_int)
874 if (dpi_char == NULL)
877 if (strcasecmp(dpi_char, LDPI) == 0) {
878 if (dpi_int >= LDPI_MIN && dpi_int <= LDPI_MAX)
882 } else if (strcasecmp(dpi_char, MDPI) == 0) {
883 if (dpi_int >= MDPI_MIN && dpi_int <= MDPI_MAX)
887 } else if (strcasecmp(dpi_char, HDPI) == 0) {
888 if (dpi_int >= HDPI_MIN && dpi_int <= HDPI_MAX)
892 } else if (strcasecmp(dpi_char, XHDPI) == 0) {
893 if (dpi_int >= XHDPI_MIN && dpi_int <= XHDPI_MAX)
897 } else if (strcasecmp(dpi_char, XXHDPI) == 0) {
898 if (dpi_int >= XXHDPI_MIN && dpi_int <= XXHDPI_MAX)
906 static gint __compare_splashscreen_with_orientation_dpi(gconstpointer a,
909 splashscreen_x *ss = (splashscreen_x *)a;
910 const char *orientation = (const char *)b;
914 if (ss->operation || ss->dpi == NULL)
917 ret = system_info_get_platform_int(
918 "http://tizen.org/feature/screen.dpi", &dpi);
919 if (ret != SYSTEM_INFO_ERROR_NONE)
922 if (strcasecmp(ss->orientation, orientation) == 0 &&
923 __check_dpi(ss->dpi, dpi) == 0)
929 static gint __compare_splashscreen_with_orientation(gconstpointer a,
932 splashscreen_x *ss = (splashscreen_x *)a;
933 const char *orientation = (const char *)b;
935 if (ss->operation || ss->dpi)
938 if (strcasecmp(ss->orientation, orientation) == 0)
944 static splashscreen_x *__find_default_splashscreen(GList *splashscreens,
945 const char *orientation)
949 tmp = g_list_find_custom(splashscreens, orientation,
951 __compare_splashscreen_with_orientation_dpi);
953 return (splashscreen_x *)tmp->data;
955 tmp = g_list_find_custom(splashscreens, orientation,
956 (GCompareFunc)__compare_splashscreen_with_orientation);
958 return (splashscreen_x *)tmp->data;
963 static void __find_appcontrol_splashscreen_with_dpi(gpointer data,
966 splashscreen_x *ss = (splashscreen_x *)data;
967 GList **list = (GList **)user_data;
971 if (ss->operation == NULL || ss->dpi == NULL)
974 ret = system_info_get_platform_int(
975 "http://tizen.org/feature/screen.dpi", &dpi);
976 if (ret != SYSTEM_INFO_ERROR_NONE)
979 if (__check_dpi(ss->dpi, dpi) != 0)
982 *list = g_list_append(*list, ss);
985 static void __find_appcontrol_splashscreen(gpointer data, gpointer user_data)
987 splashscreen_x *ss = (splashscreen_x *)data;
988 GList **list = (GList **)user_data;
989 splashscreen_x *ss_tmp;
992 if (ss->operation == NULL || ss->dpi)
995 for (tmp = *list; tmp; tmp = tmp->next) {
996 ss_tmp = (splashscreen_x *)tmp->data;
997 if (ss_tmp->operation
998 && strcmp(ss_tmp->operation, ss->operation) == 0
999 && strcmp(ss_tmp->orientation, ss->orientation) == 0)
1003 *list = g_list_append(*list, ss);
1006 static GList *__find_splashscreens(GList *splashscreens)
1011 if (splashscreens == NULL)
1014 g_list_foreach(splashscreens,
1015 __find_appcontrol_splashscreen_with_dpi, &list);
1016 g_list_foreach(splashscreens,
1017 __find_appcontrol_splashscreen, &list);
1019 ss = __find_default_splashscreen(splashscreens, "portrait");
1021 list = g_list_append(list, ss);
1022 ss = __find_default_splashscreen(splashscreens, "landscape");
1024 list = g_list_append(list, ss);
1029 static int __insert_splashscreen_info(sqlite3 *db, application_x *app,
1032 static const char query[] =
1033 "INSERT INTO package_app_splash_screen (app_id, src, type,"
1034 " orientation, indicatordisplay, operation, color_depth) "
1035 "VALUES (?, ?, ?, ?, ?, ?, ?)";
1042 if (app->splashscreens == NULL)
1045 if (ss_list == NULL)
1048 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1049 if (ret != SQLITE_OK) {
1050 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1054 for (tmp = ss_list; tmp; tmp = tmp->next) {
1055 ss = (splashscreen_x *)tmp->data;
1059 __BIND_TEXT(db, stmt, idx++, app->appid);
1060 __BIND_TEXT(db, stmt, idx++, ss->src);
1061 __BIND_TEXT(db, stmt, idx++, ss->type);
1062 __BIND_TEXT(db, stmt, idx++, ss->orientation);
1063 __BIND_TEXT(db, stmt, idx++, ss->indicatordisplay);
1064 __BIND_TEXT(db, stmt, idx++, ss->operation);
1065 __BIND_TEXT(db, stmt, idx++, ss->color_depth);
1067 ret = sqlite3_step(stmt);
1068 if (ret != SQLITE_DONE) {
1069 _LOGE("step failed: %s", sqlite3_errmsg(db));
1070 sqlite3_finalize(stmt);
1074 sqlite3_reset(stmt);
1077 sqlite3_finalize(stmt);
1082 static void __trimfunc(GList *trim_list)
1086 GList *list = g_list_first(trim_list);
1089 trim_data = (char *)list->data;
1092 if (strcmp(trim_data, prev) == 0) {
1093 trim_list = g_list_remove(trim_list,
1095 list = g_list_first(trim_list);
1104 list = g_list_next(list);
1108 static gint __comparefunc(gconstpointer a, gconstpointer b, gpointer userdata)
1110 if (a == NULL || b == NULL)
1112 if (strcmp((char *)a, (char *)b) == 0)
1114 if (strcmp((char *)a, (char *)b) < 0)
1116 if (strcmp((char *)a, (char *)b) > 0)
1121 /* TODO: refactor inserting localized info */
1122 static GList *__create_locale_list(GList *lbls, GList *lcns, GList *icns,
1123 GList *dcns, GList *aths)
1125 GList *locale = NULL;
1133 for (tmp = lbls; tmp; tmp = tmp->next) {
1134 lbl = (label_x *)tmp->data;
1138 locale = g_list_insert_sorted_with_data(
1139 locale, (gpointer)lbl->lang,
1140 __comparefunc, NULL);
1142 for (tmp = lcns; tmp; tmp = tmp->next) {
1143 lcn = (license_x *)tmp->data;
1147 locale = g_list_insert_sorted_with_data(
1148 locale, (gpointer)lcn->lang,
1149 __comparefunc, NULL);
1151 for (tmp = icns; tmp; tmp = tmp->next) {
1152 icn = (icon_x *)tmp->data;
1156 locale = g_list_insert_sorted_with_data(
1157 locale, (gpointer)icn->lang,
1158 __comparefunc, NULL);
1160 for (tmp = dcns; tmp; tmp = tmp->next) {
1161 dcn = (description_x *)tmp->data;
1165 locale = g_list_insert_sorted_with_data(
1166 locale, (gpointer)dcn->lang,
1167 __comparefunc, NULL);
1169 for (tmp = aths; tmp; tmp = tmp->next) {
1170 ath = (author_x *)tmp->data;
1174 locale = g_list_insert_sorted_with_data(
1175 locale, (gpointer)ath->lang,
1176 __comparefunc, NULL);
1182 static gint __check_icon_resolution(const char *orig_icon_path,
1183 char **new_icon_path)
1187 char *icon_filename;
1188 char modified_iconpath[BUFSIZE];
1189 char icon_path[BUFSIZE];
1193 if (orig_icon_path == NULL)
1196 ret = system_info_get_platform_int(
1197 "http://tizen.org/feature/screen.dpi", &dpi);
1198 if (ret != SYSTEM_INFO_ERROR_NONE)
1201 if (dpi >= LDPI_MIN && dpi <= LDPI_MAX) {
1202 dpi_path[0] = "LDPI";
1203 dpi_path[1] = "ldpi";
1204 } else if (dpi >= MDPI_MIN && dpi <= MDPI_MAX) {
1205 dpi_path[0] = "MDPI";
1206 dpi_path[1] = "mdpi";
1207 } else if (dpi >= HDPI_MIN && dpi <= HDPI_MAX) {
1208 dpi_path[0] = "HDPI";
1209 dpi_path[1] = "hdpi";
1210 } else if (dpi >= XHDPI_MIN && dpi <= XHDPI_MAX) {
1211 dpi_path[0] = "XHDPI";
1212 dpi_path[1] = "xhdpi";
1213 } else if (dpi >= XXHDPI_MIN && dpi <= XXHDPI_MAX) {
1214 dpi_path[0] = "XXHDPI";
1215 dpi_path[1] = "xxhdpi";
1217 _LOGE("Unidentified dpi[%d]", dpi);
1221 icon_filename = strrchr(orig_icon_path, '/');
1222 if (icon_filename == NULL)
1226 strlen(orig_icon_path) - (strlen(icon_filename) - 1),
1227 "%s", orig_icon_path);
1228 for (i = 0; i < 2; i++) {
1229 snprintf(modified_iconpath, BUFSIZE - 1, "%s/%s%s",
1230 icon_path, dpi_path[i], icon_filename);
1231 if (access(modified_iconpath, F_OK) != -1) {
1232 /* if exists, return modified icon path */
1233 *new_icon_path = strdup(modified_iconpath);
1241 static gint __compare_icon(gconstpointer a, gconstpointer b)
1243 icon_x *icon = (icon_x *)a;
1246 if (icon->lang != NULL && strcasecmp(icon->lang, DEFAULT_LOCALE) != 0)
1249 if (icon->dpi != NULL)
1252 if (__check_icon_resolution(icon->text, &icon_path) == 0) {
1254 icon->text = icon_path;
1260 static gint __compare_icon_with_dpi(gconstpointer a, gconstpointer b)
1262 icon_x *icon = (icon_x *)a;
1263 int dpi = GPOINTER_TO_INT(b);
1265 if (icon->lang != NULL && strcasecmp(icon->lang, DEFAULT_LOCALE) != 0)
1268 if (icon->dpi == NULL)
1271 if (__check_dpi(icon->dpi, dpi) == 0)
1277 static gint __compare_icon_with_lang(gconstpointer a, gconstpointer b)
1279 icon_x *icon = (icon_x *)a;
1280 char *lang = (char *)b;
1283 if (icon->dpi != NULL)
1286 if (strcasecmp(icon->lang, lang) == 0) {
1287 if (strcasecmp(icon->lang, DEFAULT_LOCALE) == 0) {
1288 /* icon for no locale. check existance of
1289 * folder-hierachied default icons
1291 if (__check_icon_resolution(icon->text,
1294 icon->text = icon_path;
1303 static gint __compare_icon_with_lang_dpi(gconstpointer a, gconstpointer b)
1306 icon_x *icon = (icon_x *)a;
1307 char *lang = (char *)b;
1310 ret = system_info_get_platform_int(
1311 "http://tizen.org/feature/screen.dpi", &dpi);
1312 if (ret != SYSTEM_INFO_ERROR_NONE)
1315 if (strcasecmp(icon->lang, lang) == 0 &&
1316 __check_dpi(icon->dpi, dpi) == 0)
1322 static char *__find_icon(GList *icons, const char *lang)
1329 /* first, find icon whose locale and dpi with given lang and
1330 * system's dpi has matched
1332 tmp = g_list_find_custom(icons, lang,
1333 (GCompareFunc)__compare_icon_with_lang_dpi);
1335 icon = (icon_x *)tmp->data;
1336 return (char *)icon->text;
1339 /* if first has failed, find icon whose locale has matched */
1340 tmp = g_list_find_custom(icons, lang,
1341 (GCompareFunc)__compare_icon_with_lang);
1343 icon = (icon_x *)tmp->data;
1344 return (char *)icon->text;
1347 /* if second has failed, find icon whose dpi has matched with
1350 ret = system_info_get_platform_int(
1351 "http://tizen.org/feature/screen.dpi", &dpi);
1352 if (ret == SYSTEM_INFO_ERROR_NONE) {
1353 tmp = g_list_find_custom(icons, GINT_TO_POINTER(dpi),
1354 (GCompareFunc)__compare_icon_with_dpi);
1356 icon = (icon_x *)tmp->data;
1357 return (char *)icon->text;
1361 /* last, find default icon marked as "No Locale" */
1362 tmp = g_list_find_custom(icons, NULL, (GCompareFunc)__compare_icon);
1364 icon = (icon_x *)tmp->data;
1365 return (char *)icon->text;
1371 static void __extract_data(const char *locale, GList *lbls, GList *lcns,
1372 GList *icns, GList *dcns, GList *aths, char **label,
1373 char **license, char **icon, char **description, char **author)
1381 for (tmp = lbls; tmp; tmp = tmp->next) {
1382 lbl = (label_x *)tmp->data;
1386 if (strcmp(lbl->lang, locale) == 0) {
1387 *label = (char *)lbl->text;
1392 for (tmp = lcns; tmp; tmp = tmp->next) {
1393 lcn = (license_x *)tmp->data;
1397 if (strcmp(lcn->lang, locale) == 0) {
1398 *license = (char *)lcn->text;
1404 *icon = __find_icon(icns, locale);
1406 for (tmp = dcns; tmp; tmp = tmp->next) {
1407 dcn = (description_x *)tmp->data;
1411 if (strcmp(dcn->lang, locale) == 0) {
1412 *description = (char *)dcn->text;
1417 for (tmp = aths; tmp; tmp = tmp->next) {
1418 ath = (author_x *)tmp->data;
1422 if (strcmp(ath->lang, locale) == 0) {
1423 *author = (char *)ath->text;
1430 static int __insert_mainapp_localized_info(sqlite3 *db, application_x *app,
1431 const char *locale, const char *label, const char *icon)
1433 static const char query[] =
1434 "INSERT OR REPLACE INTO package_localized_info ("
1435 " package, package_locale, package_label, package_icon,"
1436 " package_description, package_license, package_author) "
1438 " COALESCE((SELECT package_label FROM package_localized_info"
1439 " WHERE package=? AND package_locale=?), ?),"
1440 " COALESCE((SELECT package_icon FROM package_localized_info"
1441 " WHERE package=? AND package_icon=?), ?),"
1442 " (SELECT package_description FROM package_localized_info"
1443 " WHERE package=? AND package_locale=?),"
1444 " (SELECT package_description FROM package_localized_info"
1445 " WHERE package=? AND package_locale=?),"
1446 " (SELECT package_description FROM package_localized_info"
1447 " WHERE package=? AND package_locale=?))";
1452 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1453 if (ret != SQLITE_OK) {
1454 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1458 __BIND_TEXT(db, stmt, idx++, app->package);
1459 __BIND_TEXT(db, stmt, idx++, locale);
1460 __BIND_TEXT(db, stmt, idx++, app->package);
1461 __BIND_TEXT(db, stmt, idx++, locale);
1462 __BIND_TEXT(db, stmt, idx++, label);
1463 __BIND_TEXT(db, stmt, idx++, app->package);
1464 __BIND_TEXT(db, stmt, idx++, locale);
1465 __BIND_TEXT(db, stmt, idx++, icon);
1466 __BIND_TEXT(db, stmt, idx++, app->package);
1467 __BIND_TEXT(db, stmt, idx++, locale);
1468 __BIND_TEXT(db, stmt, idx++, app->package);
1469 __BIND_TEXT(db, stmt, idx++, locale);
1470 __BIND_TEXT(db, stmt, idx++, app->package);
1471 __BIND_TEXT(db, stmt, idx++, locale);
1473 ret = sqlite3_step(stmt);
1474 if (ret != SQLITE_DONE) {
1475 _LOGE("step failed: %s", sqlite3_errmsg(db));
1476 sqlite3_finalize(stmt);
1480 sqlite3_finalize(stmt);
1485 static int __insert_app_localized_info(sqlite3 *db, application_x *app)
1487 static const char query[] =
1488 "INSERT INTO package_app_localized_info (app_id, app_locale,"
1489 " app_label, app_icon) "
1490 "VALUES (?, ?, ?, ?)";
1500 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1501 if (ret != SQLITE_OK) {
1502 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1506 locales = __create_locale_list(app->label, NULL, app->icon, NULL, NULL);
1507 for (tmp = locales; tmp; tmp = tmp->next) {
1508 locale = (const char *)tmp->data;
1511 __extract_data(locale, app->label, NULL, app->icon, NULL, NULL,
1512 &label, NULL, &icon, NULL, NULL);
1513 if (!label && !icon)
1517 __BIND_TEXT(db, stmt, idx++, app->appid);
1518 __BIND_TEXT(db, stmt, idx++, locale);
1519 __BIND_TEXT(db, stmt, idx++, label);
1520 __BIND_TEXT(db, stmt, idx++, icon);
1522 ret = sqlite3_step(stmt);
1523 if (ret != SQLITE_DONE) {
1524 _LOGE("step failed: %s", sqlite3_errmsg(db));
1525 g_list_free(locales);
1526 sqlite3_finalize(stmt);
1530 sqlite3_reset(stmt);
1532 if (strcasecmp(app->mainapp, "true") == 0) {
1533 if (__insert_mainapp_localized_info(db, app, locale,
1535 _LOGE("insert mainapp localized info failed");
1539 g_list_free(locales);
1540 sqlite3_finalize(stmt);
1545 static int __insert_package_privilege_info(sqlite3 *db, manifest_x *mfx)
1547 static const char query[] =
1548 "INSERT INTO package_privilege_info (package, privilege, type) "
1556 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1557 if (ret != SQLITE_OK) {
1558 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1562 for (tmp = mfx->privileges; tmp; tmp = tmp->next) {
1563 priv = (privilege_x *)tmp->data;
1568 __BIND_TEXT(db, stmt, idx++, mfx->package);
1569 __BIND_TEXT(db, stmt, idx++, priv->value);
1570 __BIND_TEXT(db, stmt, idx++, priv->type);
1572 ret = sqlite3_step(stmt);
1573 if (ret != SQLITE_DONE) {
1574 _LOGE("step failed: %s", sqlite3_errmsg(db));
1575 sqlite3_finalize(stmt);
1578 sqlite3_reset(stmt);
1581 sqlite3_finalize(stmt);
1586 static int __insert_package_appdefined_privilege_info(sqlite3 *db,
1589 static const char query[] =
1590 "INSERT INTO package_appdefined_privilege_info "
1591 "(package, privilege, license, type) "
1592 "VALUES (?, ?, ?, ?)";
1597 appdefined_privilege_x *priv;
1599 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1600 if (ret != SQLITE_OK) {
1601 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1605 for (tmp = mfx->appdefined_privileges; tmp; tmp = tmp->next) {
1606 priv = (appdefined_privilege_x *)tmp->data;
1611 __BIND_TEXT(db, stmt, idx++, mfx->package);
1612 __BIND_TEXT(db, stmt, idx++, priv->value);
1613 __BIND_TEXT(db, stmt, idx++, priv->license);
1614 __BIND_TEXT(db, stmt, idx++, priv->type);
1616 ret = sqlite3_step(stmt);
1617 if (ret != SQLITE_DONE) {
1618 _LOGE("step failed: %s", sqlite3_errmsg(db));
1619 sqlite3_finalize(stmt);
1622 sqlite3_reset(stmt);
1625 sqlite3_finalize(stmt);
1630 /* _PRODUCT_LAUNCHING_ENHANCED_
1631 * app->indicatordisplay, app->portraitimg, app->landscapeimg,
1632 * app->guestmode_appstatus
1634 static int __insert_application_info(sqlite3 *db, manifest_x *mfx)
1636 static const char query[] =
1637 "INSERT INTO package_app_info (app_id, app_component,"
1638 " app_exec, app_nodisplay, app_type, app_onboot, app_multiple,"
1639 " app_autorestart, app_taskmanage, app_hwacceleration,"
1640 " app_screenreader, app_mainapp, app_recentimage,"
1641 " app_launchcondition, app_indicatordisplay, app_portraitimg,"
1642 " app_landscapeimg, app_guestmodevisibility,"
1643 " app_permissiontype, app_preload, app_submode,"
1644 " app_submode_mainid, app_installed_storage, app_process_pool,"
1645 " app_launch_mode, app_ui_gadget, app_support_mode,"
1646 " app_support_disable, component_type, package, app_tep_name,"
1647 " app_zip_mount_file, app_background_category,"
1648 " app_package_type, app_root_path, app_api_version,"
1649 " app_effective_appid, app_splash_screen_display,"
1650 " app_package_system, app_removable,"
1651 " app_package_installed_time, app_support_ambient,"
1652 " app_external_path, app_setup_appid) "
1654 " ?, LOWER(?), ?, LOWER(?), LOWER(?),"
1655 " LOWER(?), LOWER(?), ?,"
1659 " ?, LOWER(?), LOWER(?),"
1661 " COALESCE(?, 'single'), LOWER(?), ?,"
1662 " LOWER(?), ?, ?, ?,"
1666 " LOWER(?), LOWER(?),"
1675 const char *effective_appid;
1678 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1679 if (ret != SQLITE_OK) {
1680 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1684 for (tmp = mfx->application; tmp; tmp = tmp->next) {
1685 app = (application_x *)tmp->data;
1689 bg_category = __convert_background_category(
1690 app->background_category);
1691 effective_appid = __find_effective_appid(app->metadata);
1694 __BIND_TEXT(db, stmt, idx++, app->appid);
1695 __BIND_TEXT(db, stmt, idx++, app->component_type);
1696 __BIND_TEXT(db, stmt, idx++, app->exec);
1697 __BIND_TEXT(db, stmt, idx++, __get_bool(app->nodisplay, false));
1698 __BIND_TEXT(db, stmt, idx++, app->type);
1699 __BIND_TEXT(db, stmt, idx++, __get_bool(app->onboot, false));
1700 __BIND_TEXT(db, stmt, idx++, __get_bool(app->multiple, false));
1701 __BIND_TEXT(db, stmt, idx++,
1702 __get_bool(app->autorestart, false));
1703 __BIND_TEXT(db, stmt, idx++,
1704 __get_bool(app->taskmanage, false));
1705 __BIND_TEXT(db, stmt, idx++, app->hwacceleration);
1706 __BIND_TEXT(db, stmt, idx++, app->screenreader);
1707 __BIND_TEXT(db, stmt, idx++, __get_bool(app->mainapp, false));
1708 __BIND_TEXT(db, stmt, idx++, app->recentimage);
1709 __BIND_TEXT(db, stmt, idx++, app->launchcondition);
1710 __BIND_TEXT(db, stmt, idx++,
1711 __get_bool(app->indicatordisplay, true));
1712 __BIND_TEXT(db, stmt, idx++, app->portraitimg);
1713 __BIND_TEXT(db, stmt, idx++, app->landscapeimg);
1714 __BIND_TEXT(db, stmt, idx++,
1715 __get_bool(app->guestmode_visibility, true));
1716 __BIND_TEXT(db, stmt, idx++, app->permission_type);
1717 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->preload, false));
1718 __BIND_TEXT(db, stmt, idx++, __get_bool(app->submode, false));
1719 __BIND_TEXT(db, stmt, idx++, app->submode_mainid);
1720 __BIND_TEXT(db, stmt, idx++, mfx->installed_storage);
1721 __BIND_TEXT(db, stmt, idx++,
1722 __get_bool(app->process_pool, false));
1723 __BIND_TEXT(db, stmt, idx++, app->launch_mode);
1724 __BIND_TEXT(db, stmt, idx++, __get_bool(app->ui_gadget, false));
1725 __BIND_TEXT(db, stmt, idx++, app->support_mode);
1726 __BIND_TEXT(db, stmt, idx++,
1727 __get_bool(mfx->support_disable, false));
1728 __BIND_TEXT(db, stmt, idx++, app->component_type);
1729 __BIND_TEXT(db, stmt, idx++, mfx->package);
1730 __BIND_TEXT(db, stmt, idx++, mfx->tep_name);
1731 __BIND_TEXT(db, stmt, idx++, mfx->zip_mount_file);
1732 __BIND_INT(db, stmt, idx++, bg_category);
1733 __BIND_TEXT(db, stmt, idx++, mfx->type ? mfx->type : "tpk");
1734 __BIND_TEXT(db, stmt, idx++, mfx->root_path);
1735 __BIND_TEXT(db, stmt, idx++, mfx->api_version);
1736 __BIND_TEXT(db, stmt, idx++, effective_appid);
1737 __BIND_TEXT(db, stmt, idx++,
1738 __get_bool(app->splash_screen_display, true));
1739 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->system, false));
1740 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->removable, false));
1741 __BIND_TEXT(db, stmt, idx++, mfx->installed_time);
1742 __BIND_TEXT(db, stmt, idx++,
1743 __get_bool(app->support_ambient, false));
1744 __BIND_TEXT(db, stmt, idx++, mfx->external_path);
1745 __BIND_TEXT(db, stmt, idx++, app->setup_appid);
1747 ret = sqlite3_step(stmt);
1748 if (ret != SQLITE_DONE) {
1749 _LOGE("step failed: %s", sqlite3_errmsg(db));
1750 sqlite3_finalize(stmt);
1754 sqlite3_reset(stmt);
1756 if (__insert_appcontrol_info(db, app)) {
1757 sqlite3_finalize(stmt);
1760 if (__insert_category_info(db, app)) {
1761 sqlite3_finalize(stmt);
1764 if (__insert_metadata_info(db, app)) {
1765 sqlite3_finalize(stmt);
1768 if (__insert_datacontrol_info(db, app)) {
1769 sqlite3_finalize(stmt);
1772 ss_list = __find_splashscreens(app->splashscreens);
1773 if (__insert_splashscreen_info(db, app, ss_list)) {
1774 g_list_free(ss_list);
1775 sqlite3_finalize(stmt);
1778 g_list_free(ss_list);
1779 if (__insert_app_localized_info(db, app)) {
1780 sqlite3_finalize(stmt);
1785 sqlite3_finalize(stmt);
1790 static int __insert_package_update_info(sqlite3 *db, manifest_x *mfx)
1792 static const char query[] =
1793 "INSERT INTO package_update_info (package, update_version) "
1799 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1800 if (ret != SQLITE_OK) {
1801 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1806 __BIND_TEXT(db, stmt, idx++, mfx->package);
1807 __BIND_TEXT(db, stmt, idx, mfx->version);
1808 ret = sqlite3_step(stmt);
1809 if (ret != SQLITE_DONE) {
1810 _LOGE("step failed: %s", sqlite3_errmsg(db));
1811 sqlite3_finalize(stmt);
1814 sqlite3_finalize(stmt);
1819 static int __insert_package_localized_info(sqlite3 *db, manifest_x *mfx)
1821 static const char query[] =
1822 "INSERT INTO package_localized_info (package, package_locale,"
1823 " package_label, package_icon, package_description,"
1824 " package_license, package_author) "
1825 "VALUES (?, ?, ?, ?, ?, ?, ?)";
1838 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1839 if (ret != SQLITE_OK) {
1840 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1844 locales = __create_locale_list(mfx->label, mfx->license, mfx->icon,
1845 mfx->description, mfx->author);
1846 for (tmp = locales; tmp; tmp = tmp->next) {
1847 locale = (const char *)tmp->data;
1853 __extract_data(locale, mfx->label, mfx->license, mfx->icon,
1854 mfx->description, mfx->author,
1855 &label, &license, &icon, &description, &author);
1856 if (!label && !license && !icon && !description && !author)
1860 __BIND_TEXT(db, stmt, idx++, mfx->package);
1861 __BIND_TEXT(db, stmt, idx++, locale);
1862 __BIND_TEXT(db, stmt, idx++, label);
1863 __BIND_TEXT(db, stmt, idx++, icon);
1864 __BIND_TEXT(db, stmt, idx++, description);
1865 __BIND_TEXT(db, stmt, idx++, license);
1866 __BIND_TEXT(db, stmt, idx++, author);
1868 ret = sqlite3_step(stmt);
1869 if (ret != SQLITE_DONE) {
1870 _LOGE("step failed: %s", sqlite3_errmsg(db));
1871 g_list_free(locales);
1872 sqlite3_finalize(stmt);
1876 sqlite3_reset(stmt);
1879 g_list_free(locales);
1880 sqlite3_finalize(stmt);
1885 static int __insert_package_info(sqlite3 *db, manifest_x *mfx)
1887 static const char query[] =
1888 "INSERT INTO package_info (package, package_type,"
1889 " package_version, package_api_version, package_tep_name,"
1890 " package_zip_mount_file, install_location, package_size,"
1891 " package_removable, package_preload, package_readonly,"
1892 " package_update, package_appsetting, package_nodisplay,"
1893 " package_system, author_name, author_email, author_href,"
1894 " installed_time, installed_storage, storeclient_id,"
1895 " mainapp_id, package_url, root_path, external_path,"
1896 " csc_path, package_support_mode, package_support_disable) "
1900 " LOWER(?), LOWER(?), LOWER(?),"
1901 " LOWER(?), LOWER(?), LOWER(?),"
1902 " LOWER(?), ?, ?, ?,"
1909 const char *author_name = NULL;
1910 const char *author_email = NULL;
1911 const char *author_href = NULL;
1913 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1914 if (ret != SQLITE_OK) {
1915 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1919 if (mfx->author && mfx->author->data) {
1920 author_name = ((author_x *)mfx->author->data)->text;
1921 author_email = ((author_x *)mfx->author->data)->email;
1922 author_href = ((author_x *)mfx->author->data)->href;
1925 __BIND_TEXT(db, stmt, idx++, mfx->package);
1926 __BIND_TEXT(db, stmt, idx++, mfx->type);
1927 __BIND_TEXT(db, stmt, idx++, mfx->version);
1928 __BIND_TEXT(db, stmt, idx++, mfx->api_version);
1929 __BIND_TEXT(db, stmt, idx++, mfx->tep_name);
1930 __BIND_TEXT(db, stmt, idx++, mfx->zip_mount_file);
1931 __BIND_TEXT(db, stmt, idx++, mfx->installlocation);
1932 __BIND_TEXT(db, stmt, idx++, mfx->package_size);
1933 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->removable, true));
1934 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->preload, false));
1935 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->readonly, false));
1936 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->update, false));
1937 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->appsetting, false));
1938 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->nodisplay_setting, false));
1939 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->system, false));
1940 __BIND_TEXT(db, stmt, idx++, author_name);
1941 __BIND_TEXT(db, stmt, idx++, author_email);
1942 __BIND_TEXT(db, stmt, idx++, author_href);
1943 __BIND_TEXT(db, stmt, idx++, mfx->installed_time);
1944 __BIND_TEXT(db, stmt, idx++, mfx->installed_storage);
1945 __BIND_TEXT(db, stmt, idx++, mfx->storeclient_id);
1946 __BIND_TEXT(db, stmt, idx++, mfx->mainapp_id);
1947 __BIND_TEXT(db, stmt, idx++, mfx->package_url);
1948 __BIND_TEXT(db, stmt, idx++, mfx->root_path);
1949 __BIND_TEXT(db, stmt, idx++, mfx->external_path);
1950 __BIND_TEXT(db, stmt, idx++, mfx->csc_path);
1951 __BIND_TEXT(db, stmt, idx++, mfx->support_mode);
1952 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->support_disable, false));
1954 ret = sqlite3_step(stmt);
1955 if (ret != SQLITE_DONE) {
1956 _LOGE("step failed: %s", sqlite3_errmsg(db));
1957 sqlite3_finalize(stmt);
1961 sqlite3_finalize(stmt);
1963 if (__insert_package_update_info(db, mfx))
1965 if (__insert_package_localized_info(db, mfx))
1967 if (__insert_application_info(db, mfx))
1969 if (__insert_package_privilege_info(db, mfx))
1971 if (__insert_package_appdefined_privilege_info(db, mfx))
1977 API int pkgmgr_parser_insert_manifest_info_in_usr_db(manifest_x *mfx, uid_t uid)
1984 _LOGE("invalid parameter");
1985 return PM_PARSER_R_EINVAL;
1988 dbpath = __get_parser_db_path(uid);
1990 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
1991 if (ret != SQLITE_OK) {
1992 _LOGE("open db failed: %d", ret);
1993 return PM_PARSER_R_ERROR;
1996 __BEGIN_TRANSACTION(db);
1997 __DO_TRANSACTION(db, __insert_package_info(db, mfx));
1998 __END_TRANSACTION(db);
2000 sqlite3_close_v2(db);
2002 return PM_PARSER_R_OK;
2005 API int pkgmgr_parser_insert_manifest_info_in_db(manifest_x *mfx)
2007 return pkgmgr_parser_insert_manifest_info_in_usr_db(mfx, __getuid());
2010 static int __delete_package_info(sqlite3 *db, const char *pkgid)
2012 static const char query[] =
2013 "DELETE FROM package_info WHERE package=?";
2017 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2018 if (ret != SQLITE_OK) {
2019 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2023 __BIND_TEXT(db, stmt, 1, pkgid);
2025 ret = sqlite3_step(stmt);
2026 if (ret != SQLITE_DONE) {
2027 _LOGE("step failed: %s", sqlite3_errmsg(db));
2028 sqlite3_finalize(stmt);
2032 sqlite3_finalize(stmt);
2037 API int pkgmgr_parser_delete_manifest_info_from_usr_db(manifest_x *mfx,
2045 _LOGE("invalid parameter");
2046 return PM_PARSER_R_EINVAL;
2049 dbpath = __get_parser_db_path(uid);
2051 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2052 if (ret != SQLITE_OK) {
2053 _LOGE("open db failed: %d", ret);
2054 return PM_PARSER_R_ERROR;
2057 __BEGIN_TRANSACTION(db);
2058 __DO_TRANSACTION(db, __delete_package_info(db, mfx->package));
2059 __END_TRANSACTION(db);
2061 sqlite3_close_v2(db);
2063 return PM_PARSER_R_OK;
2066 API int pkgmgr_parser_delete_manifest_info_from_db(manifest_x *mfx)
2068 return pkgmgr_parser_delete_manifest_info_from_usr_db(mfx, __getuid());
2071 API int pkgmgr_parser_update_manifest_info_in_usr_db(manifest_x *mfx, uid_t uid)
2078 _LOGE("invalid parameter");
2079 return PM_PARSER_R_EINVAL;
2082 dbpath = __get_parser_db_path(uid);
2084 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2085 if (ret != SQLITE_OK) {
2086 _LOGE("open db failed: %d", ret);
2087 return PM_PARSER_R_ERROR;
2090 __BEGIN_TRANSACTION(db);
2091 __DO_TRANSACTION(db, __delete_package_info(db, mfx->package));
2092 __DO_TRANSACTION(db, __insert_package_info(db, mfx));
2093 __END_TRANSACTION(db);
2095 sqlite3_close_v2(db);
2097 return PM_PARSER_R_OK;
2100 API int pkgmgr_parser_update_manifest_info_in_db(manifest_x *mfx)
2102 return pkgmgr_parser_update_manifest_info_in_usr_db(mfx, __getuid());
2105 static int __set_global_app_disable_for_uid(sqlite3 *db, const char *appid,
2106 uid_t uid, bool is_disable)
2108 static const char query[] =
2109 "INSERT OR REPLACE INTO package_app_info_for_uid ("
2110 " app_id, uid, is_disabled, is_splash_screen_enabled) "
2112 " (SELECT app_splash_screen_display FROM package_app_info"
2113 " WHERE app_id=?))";
2118 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2119 if (ret != SQLITE_OK) {
2120 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2124 __BIND_TEXT(db, stmt, idx++, appid);
2125 __BIND_INT(db, stmt, idx++, uid);
2126 __BIND_TEXT(db, stmt, idx++, is_disable ? "true" : "false");
2127 __BIND_TEXT(db, stmt, idx++, appid);
2129 ret = sqlite3_step(stmt);
2130 if (ret != SQLITE_DONE) {
2131 _LOGE("step failed: %s", sqlite3_errmsg(db));
2132 sqlite3_finalize(stmt);
2136 sqlite3_finalize(stmt);
2141 API int pkgmgr_parser_update_global_app_disable_for_uid_info_in_db(
2142 const char *appid, uid_t uid, int is_disable)
2148 if (appid == NULL) {
2149 _LOGE("invalid parameter");
2150 return PM_PARSER_R_EINVAL;
2153 dbpath = __get_parser_db_path(GLOBAL_USER);
2155 ret = __open_db(GLOBAL_USER, dbpath, &db, SQLITE_OPEN_READWRITE);
2156 if (ret != SQLITE_OK) {
2157 _LOGE("open db failed: %d", ret);
2158 return PM_PARSER_R_ERROR;
2161 __BEGIN_TRANSACTION(db);
2162 __DO_TRANSACTION(db, __set_global_app_disable_for_uid(db, appid,
2163 uid, (bool)is_disable));
2164 __END_TRANSACTION(db);
2166 sqlite3_close_v2(db);
2168 return PM_PARSER_R_OK;
2171 static int __set_app_disable(sqlite3 *db, const char *appid, uid_t uid,
2174 static const char query[] =
2175 "UPDATE package_app_info SET app_disable=? "
2181 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2182 if (ret != SQLITE_OK) {
2183 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2187 __BIND_TEXT(db, stmt, idx++, is_disable ? "true" : "false");
2188 __BIND_TEXT(db, stmt, idx++, appid);
2190 ret = sqlite3_step(stmt);
2191 if (ret != SQLITE_DONE) {
2192 _LOGE("step failed: %s", sqlite3_errmsg(db));
2193 sqlite3_finalize(stmt);
2197 sqlite3_finalize(stmt);
2202 API int pkgmgr_parser_update_app_disable_info_in_usr_db(const char *appid,
2203 uid_t uid, int is_disable)
2209 if (appid == NULL) {
2210 _LOGE("invalid parameter");
2211 return PM_PARSER_R_EINVAL;
2214 dbpath = __get_parser_db_path(uid);
2216 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2217 if (ret != SQLITE_OK) {
2218 _LOGE("open db failed: %d", ret);
2219 return PM_PARSER_R_ERROR;
2222 __BEGIN_TRANSACTION(db);
2223 __DO_TRANSACTION(db, __set_app_disable(db, appid, uid,
2225 __END_TRANSACTION(db);
2227 sqlite3_close_v2(db);
2229 return PM_PARSER_R_OK;
2232 API int pkgmgr_parser_update_app_disable_info_in_db(const char *appid,
2235 return pkgmgr_parser_update_app_disable_info_in_usr_db(appid,
2236 __getuid(), is_disable);
2239 static int __set_pkg_disable(sqlite3 *db, const char *pkgid, uid_t uid,
2242 static const char query[] =
2243 "UPDATE package_info SET package_disable=? "
2249 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2250 if (ret != SQLITE_OK) {
2251 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2255 __BIND_TEXT(db, stmt, idx++, is_disable ? "true" : "false");
2256 __BIND_TEXT(db, stmt, idx++, pkgid);
2258 ret = sqlite3_step(stmt);
2259 if (ret != SQLITE_DONE) {
2260 _LOGE("step failed: %s", sqlite3_errmsg(db));
2261 sqlite3_finalize(stmt);
2265 sqlite3_finalize(stmt);
2270 API int pkgmgr_parser_update_pkg_disable_info_in_usr_db(const char *pkgid,
2271 uid_t uid, int is_disable)
2277 if (pkgid == NULL) {
2278 _LOGE("invalid parameter");
2279 return PM_PARSER_R_EINVAL;
2282 dbpath = __get_parser_db_path(uid);
2284 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2285 if (ret != SQLITE_OK) {
2286 _LOGE("open db failed: %d", ret);
2287 return PM_PARSER_R_ERROR;
2290 __BEGIN_TRANSACTION(db);
2291 __DO_TRANSACTION(db, __set_pkg_disable(db, pkgid, uid,
2293 __END_TRANSACTION(db);
2295 sqlite3_close_v2(db);
2297 return PM_PARSER_R_OK;
2300 API int pkgmgr_parser_update_pkg_disable_info_in_db(const char *pkgid,
2303 return pkgmgr_parser_update_pkg_disable_info_in_usr_db(pkgid,
2304 __getuid(), is_disable);
2307 static int __set_global_app_splash_screen_for_uid(sqlite3 *db,
2308 const char *appid, uid_t uid, bool is_enabled)
2310 static const char query[] =
2311 "INSERT OR REPLACE INTO package_app_info_for_uid("
2312 " appid, uid, is_splash_screen_enabled) "
2318 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2319 if (ret != SQLITE_OK) {
2320 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2324 __BIND_TEXT(db, stmt, idx++, appid);
2325 __BIND_INT(db, stmt, idx++, uid);
2326 __BIND_TEXT(db, stmt, idx++, is_enabled ? "true" : "false");
2328 ret = sqlite3_step(stmt);
2329 if (ret != SQLITE_DONE) {
2330 _LOGE("step failed: %s", sqlite3_errmsg(db));
2331 sqlite3_finalize(stmt);
2335 sqlite3_finalize(stmt);
2340 API int pkgmgr_parser_update_global_app_splash_screen_display_info_in_usr_db(
2341 const char *appid, uid_t uid, int flag)
2347 if (appid == NULL) {
2348 _LOGE("invalid parameter");
2349 return PM_PARSER_R_EINVAL;
2352 dbpath = __get_parser_db_path(GLOBAL_USER);
2354 ret = __open_db(GLOBAL_USER, dbpath, &db, SQLITE_OPEN_READWRITE);
2355 if (ret != SQLITE_OK) {
2356 _LOGE("open db failed: %d", ret);
2357 return PM_PARSER_R_ERROR;
2360 __BEGIN_TRANSACTION(db);
2361 __DO_TRANSACTION(db, __set_global_app_splash_screen_for_uid(db,
2362 appid, uid, (bool)flag));
2363 __END_TRANSACTION(db);
2365 sqlite3_close_v2(db);
2367 return PM_PARSER_R_OK;
2370 static int __set_app_splash_screen(sqlite3 *db, const char *appid,
2373 static const char query[] =
2374 "UPDATE package_app_info SET app_splash_screen_display=? "
2380 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2381 if (ret != SQLITE_OK) {
2382 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2386 __BIND_TEXT(db, stmt, idx++, is_enabled ? "true" : "false");
2387 __BIND_TEXT(db, stmt, idx++, appid);
2389 ret = sqlite3_step(stmt);
2390 if (ret != SQLITE_DONE) {
2391 _LOGE("step failed: %s", sqlite3_errmsg(db));
2392 sqlite3_finalize(stmt);
2396 sqlite3_finalize(stmt);
2401 API int pkgmgr_parser_update_app_splash_screen_display_info_in_usr_db(
2402 const char *appid, uid_t uid, int flag)
2408 if (appid == NULL) {
2409 _LOGE("invalid parameter");
2410 return PM_PARSER_R_EINVAL;
2413 dbpath = __get_parser_db_path(uid);
2415 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2416 if (ret != SQLITE_OK) {
2417 _LOGE("open db failed: %d", ret);
2418 return PM_PARSER_R_ERROR;
2421 __BEGIN_TRANSACTION(db);
2422 __DO_TRANSACTION(db, __set_app_splash_screen(db, appid, (bool)flag));
2423 __END_TRANSACTION(db);
2425 sqlite3_close_v2(db);
2427 return PM_PARSER_R_OK;
2430 API int pkgmgr_parser_update_app_splash_screen_display_info_in_db(
2431 const char *appid, int flag)
2433 return pkgmgr_parser_update_app_splash_screen_display_info_in_usr_db(
2434 appid, __getuid(), flag);
2437 static int __set_app_label(sqlite3 *db, const char *appid, const char *label)
2439 static const char query[] =
2440 "UPDATE package_app_localized_info SET app_label=? "
2441 "WHERE app_id=? AND app_label IS NOT NULL";
2446 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2447 if (ret != SQLITE_OK) {
2448 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2452 __BIND_TEXT(db, stmt, idx++, label);
2453 __BIND_TEXT(db, stmt, idx++, appid);
2455 ret = sqlite3_step(stmt);
2456 if (ret != SQLITE_DONE) {
2457 _LOGE("step failed: %s", sqlite3_errmsg(db));
2458 sqlite3_finalize(stmt);
2462 sqlite3_finalize(stmt);
2467 API int pkgmgr_parser_update_app_label_info_in_usr_db(const char *appid,
2468 uid_t uid, const char *label)
2474 if (appid == NULL) {
2475 _LOGE("invalid parameter");
2476 return PM_PARSER_R_EINVAL;
2479 dbpath = __get_parser_db_path(uid);
2481 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2482 if (ret != SQLITE_OK) {
2483 _LOGE("open db failed: %d", ret);
2484 return PM_PARSER_R_ERROR;
2487 __BEGIN_TRANSACTION(db);
2488 __DO_TRANSACTION(db, __set_app_label(db, appid, label));
2489 __END_TRANSACTION(db);
2491 sqlite3_close_v2(db);
2493 return PM_PARSER_R_OK;
2496 API int pkgmgr_parser_update_app_label_info_in_db(const char *appid,
2499 return pkgmgr_parser_update_app_label_info_in_usr_db(appid, __getuid(),
2503 static int __set_app_icon(sqlite3 *db, const char *appid, const char *icon_path)
2505 static const char query[] =
2506 "UPDATE package_app_localized_info SET app_icon=? "
2507 "WHERE app_id=? AND app_icon IS NOT NULL";
2512 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2513 if (ret != SQLITE_OK) {
2514 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2518 __BIND_TEXT(db, stmt, idx++, icon_path);
2519 __BIND_TEXT(db, stmt, idx++, appid);
2521 ret = sqlite3_step(stmt);
2522 if (ret != SQLITE_DONE) {
2523 _LOGE("step failed: %s", sqlite3_errmsg(db));
2524 sqlite3_finalize(stmt);
2528 sqlite3_finalize(stmt);
2533 API int pkgmgr_parser_update_app_icon_info_in_usr_db(const char *appid,
2534 uid_t uid, const char *icon_path)
2540 if (appid == NULL) {
2541 _LOGE("invalid parameter");
2542 return PM_PARSER_R_EINVAL;
2545 dbpath = __get_parser_db_path(uid);
2547 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2548 if (ret != SQLITE_OK) {
2549 _LOGE("open db failed: %d", ret);
2550 return PM_PARSER_R_ERROR;
2553 __BEGIN_TRANSACTION(db);
2554 __DO_TRANSACTION(db, __set_app_icon(db, appid, icon_path));
2555 __END_TRANSACTION(db);
2557 sqlite3_close_v2(db);
2559 return PM_PARSER_R_OK;
2562 API int pkgmgr_parser_update_app_icon_info_in_db(const char *appid,
2563 const char *icon_path)
2565 return pkgmgr_parser_update_app_icon_info_in_usr_db(appid, __getuid(),
2569 static int __set_tep_path(sqlite3 *db, const char *pkgid, const char *tep_path)
2571 static const char query[] =
2572 "UPDATE package_info SET package_tep_name=? "
2578 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2579 if (ret != SQLITE_OK) {
2580 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2584 __BIND_TEXT(db, stmt, idx++, tep_path);
2585 __BIND_TEXT(db, stmt, idx++, pkgid);
2587 ret = sqlite3_step(stmt);
2588 if (ret != SQLITE_DONE) {
2589 _LOGE("step failed: %s", sqlite3_errmsg(db));
2590 sqlite3_finalize(stmt);
2594 sqlite3_finalize(stmt);
2599 API int pkgmgr_parser_update_tep_info_in_usr_db(const char *pkgid,
2600 const char *tep_path, uid_t uid)
2606 if (pkgid == NULL) {
2607 _LOGE("invalid parameter");
2608 return PM_PARSER_R_EINVAL;
2611 dbpath = __get_parser_db_path(uid);
2613 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2614 if (ret != SQLITE_OK) {
2615 _LOGE("open db failed: %d", ret);
2616 return PM_PARSER_R_ERROR;
2619 __BEGIN_TRANSACTION(db);
2620 __DO_TRANSACTION(db, __set_tep_path(db, pkgid, tep_path));
2621 __END_TRANSACTION(db);
2623 sqlite3_close_v2(db);
2625 return PM_PARSER_R_OK;
2628 API int pkgmgr_parser_update_tep_info_in_db(const char *pkgid,
2629 const char *tep_path)
2631 return pkgmgr_parser_update_tep_info_in_usr_db(pkgid, tep_path,
2635 static int __convert_update_type(pkgmgrinfo_updateinfo_update_type type,
2636 const char **update_type)
2638 if (type == PMINFO_UPDATEINFO_NONE)
2639 *update_type = PMINFO_UPDATEINFO_TYPE_NONE;
2640 else if (type == PMINFO_UPDATEINFO_FORCE)
2641 *update_type = PMINFO_UPDATEINFO_TYPE_FORCE;
2642 else if (type == PMINFO_UPDATEINFO_OPTIONAL)
2643 *update_type = PMINFO_UPDATEINFO_TYPE_OPTIONAL;
2649 static int __register_pkg_update_info(sqlite3 *db, updateinfo_x *info,
2650 const char *update_type)
2652 static const char query[] =
2653 "UPDATE package_update_info "
2654 "SET update_version=?, update_type=? "
2660 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2661 if (ret != SQLITE_OK) {
2662 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2666 __BIND_TEXT(db, stmt, idx++, info->version);
2667 __BIND_TEXT(db, stmt, idx++, update_type);
2668 __BIND_TEXT(db, stmt, idx++, info->pkgid);
2670 ret = sqlite3_step(stmt);
2671 if (ret != SQLITE_DONE) {
2672 _LOGE("step failed: %s", sqlite3_errmsg(db));
2673 sqlite3_finalize(stmt);
2677 sqlite3_finalize(stmt);
2682 API int pkgmgr_parser_register_pkg_update_info_in_usr_db(
2683 pkgmgrinfo_updateinfo_h handle, uid_t uid)
2686 updateinfo_x *update_info;
2687 updateinfo_x *prev_update_info;
2688 pkgmgrinfo_updateinfo_h prev_update_handle;
2689 pkgmgrinfo_pkginfo_h pkginfo;
2690 pkgmgrinfo_version_compare_type compare_result;
2692 const char *update_type;
2696 if (handle == NULL) {
2697 _LOGE("invalid parameter");
2698 return PM_PARSER_R_EINVAL;
2701 update_info = (updateinfo_x *)handle;
2702 if (update_info->pkgid == NULL || update_info->version == NULL)
2703 return PM_PARSER_R_EINVAL;
2704 if (__convert_update_type(update_info->type, &update_type) != 0)
2705 return PM_PARSER_R_EINVAL;
2707 ret = pkgmgrinfo_updateinfo_get_usr_updateinfo(update_info->pkgid,
2708 &prev_update_handle, uid);
2709 if (ret != PMINFO_R_OK)
2710 return PM_PARSER_R_ERROR;
2712 prev_update_info = (updateinfo_x *)prev_update_handle;
2713 ret = pkgmgrinfo_compare_package_version(update_info->version,
2714 prev_update_info->version, &compare_result);
2715 if (ret != PMINFO_R_OK) {
2716 pkgmgrinfo_updateinfo_destroy(prev_update_handle);
2717 return PM_PARSER_R_ERROR;
2720 if (compare_result == PMINFO_VERSION_SAME &&
2721 prev_update_info->type == PMINFO_UPDATEINFO_NONE) {
2722 _LOGI("Given update info version[%s] of pkgid[%s] "
2724 update_info->version, update_info->pkgid);
2725 pkgmgrinfo_updateinfo_destroy(prev_update_handle);
2726 return PM_PARSER_R_OK;
2728 pkgmgrinfo_updateinfo_destroy(prev_update_handle);
2730 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(update_info->pkgid, uid,
2732 if (ret != PMINFO_R_OK)
2733 return PM_PARSER_R_ERROR;
2735 ret = pkgmgrinfo_pkginfo_is_global(pkginfo, &is_global_pkg);
2736 if (ret != PMINFO_R_OK) {
2737 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
2738 return PM_PARSER_R_ERROR;
2740 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
2742 dbpath = __get_parser_db_path(is_global_pkg ? GLOBAL_USER : uid);
2744 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2745 if (ret != SQLITE_OK) {
2746 _LOGE("open db failed: %d", ret);
2747 return PM_PARSER_R_ERROR;
2750 __BEGIN_TRANSACTION(db);
2751 __DO_TRANSACTION(db, __register_pkg_update_info(db, update_info,
2753 __END_TRANSACTION(db);
2755 sqlite3_close_v2(db);
2757 return PM_PARSER_R_OK;
2760 API int pkgmgr_parser_register_pkg_update_info_in_db(
2761 pkgmgrinfo_updateinfo_h handle)
2763 return pkgmgr_parser_register_pkg_update_info_in_usr_db(handle,
2767 static int __unregister_pkg_update_info(sqlite3 *db, const char *pkgid)
2769 static const char query[] =
2770 "UPDATE package_update_info SET update_type='none' "
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++, pkgid);
2784 ret = sqlite3_step(stmt);
2785 if (ret != SQLITE_DONE) {
2786 _LOGE("step failed: %s", sqlite3_errmsg(db));
2787 sqlite3_finalize(stmt);
2791 sqlite3_finalize(stmt);
2796 API int pkgmgr_parser_unregister_pkg_update_info_in_usr_db(const char *pkgid,
2802 pkgmgrinfo_pkginfo_h pkginfo;
2805 if (pkgid == NULL) {
2806 _LOGE("invalid parameter");
2807 return PM_PARSER_R_EINVAL;
2810 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &pkginfo);
2811 if (ret != PMINFO_R_OK)
2812 return PM_PARSER_R_EINVAL;
2814 ret = pkgmgrinfo_pkginfo_is_global(pkginfo, &is_global_pkg);
2815 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
2816 if (ret != PMINFO_R_OK)
2817 return PM_PARSER_R_ERROR;
2819 dbpath = __get_parser_db_path(is_global_pkg ? GLOBAL_USER : uid);
2821 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2822 if (ret != SQLITE_OK) {
2823 _LOGE("open db failed: %d", ret);
2824 return PM_PARSER_R_ERROR;
2827 __BEGIN_TRANSACTION(db);
2828 __DO_TRANSACTION(db, __unregister_pkg_update_info(db, pkgid));
2829 __END_TRANSACTION(db);
2831 sqlite3_close_v2(db);
2833 return PM_PARSER_R_OK;
2836 API int pkgmgr_parser_unregister_pkg_update_info_in_db(const char *pkgid)
2838 return pkgmgr_parser_unregister_pkg_update_info_in_usr_db(pkgid,
2842 static int __unregister_all_pkg_update_info(sqlite3 *db)
2844 static const char query[] =
2845 "UPDATE package_update_info SET update_type='none'";
2849 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2850 if (ret != SQLITE_OK) {
2851 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2855 ret = sqlite3_step(stmt);
2856 if (ret != SQLITE_DONE) {
2857 _LOGE("step failed: %s", sqlite3_errmsg(db));
2858 sqlite3_finalize(stmt);
2862 sqlite3_finalize(stmt);
2867 API int pkgmgr_parser_unregister_all_pkg_update_info_in_usr_db(uid_t uid)
2873 dbpath = __get_parser_db_path(uid);
2875 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2876 if (ret != SQLITE_OK) {
2877 _LOGE("open db failed: %d", ret);
2878 return PM_PARSER_R_ERROR;
2881 __BEGIN_TRANSACTION(db);
2882 __DO_TRANSACTION(db, __unregister_all_pkg_update_info(db));
2883 __END_TRANSACTION(db);
2885 sqlite3_close_v2(db);
2887 return PM_PARSER_R_OK;
2890 API int pkgmgr_parser_unregister_all_pkg_update_info_in_db(void)
2892 return pkgmgr_parser_unregister_all_pkg_update_info_in_usr_db(