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 static int __set_db_version(sqlite3 *db)
191 static const char query_raw[] = "PRAGMA user_version=";
196 version = atoi(TIZEN_MAJOR_VER) * 10000 + atoi(TIZEN_MINOR_VER) * 100 +
197 atoi(TIZEN_PATCH_VER);
198 snprintf(query, sizeof(query), "%s%d", query_raw, version);
200 ret = sqlite3_exec(db, query, NULL, NULL, NULL);
201 if (ret != SQLITE_OK) {
202 _LOGE("exec failed: %s", sqlite3_errmsg(db));
209 /* TODO: Do not labeling directly */
210 #define DB_LABEL "User::Home"
211 #define SET_SMACK_LABEL(x) \
213 if (smack_setlabel((x), DB_LABEL, SMACK_LABEL_ACCESS)) \
214 _LOGE("failed chsmack -a %s %s", DB_LABEL, x); \
216 _LOGD("chsmack -a %s %s", DB_LABEL, x); \
219 static int __set_db_permission(const char *path, uid_t uid)
222 const char *files[2];
223 char journal_file[BUFSIZE];
227 struct passwd *result;
232 if (getuid() != OWNER_ROOT)
235 if (uid == OWNER_ROOT || uid == GLOBAL_USER) {
236 ret = getpwnam_r(APPFW_USER, &pwd, buf, sizeof(buf), &result);
237 if (result == NULL) {
239 _LOGE("no such user: %d", uid);
241 _LOGE("getpwuid_r failed: %d", errno);
247 snprintf(journal_file, sizeof(journal_file), "%s-journal", path);
249 files[1] = journal_file;
251 ret = getpwuid_r(uid, &pwd, buf, sizeof(buf), &result);
252 if (result == NULL) {
254 _LOGE("no such user: %d", uid);
256 _LOGE("getpwuid_r failed: %d", errno);
260 for (i = 0; i < 2; i++) {
261 fd = open(files[i], O_RDONLY);
263 _LOGE("open %s failed: %d", files[i], errno);
266 ret = fstat(fd, &sb);
268 _LOGE("stat %s failed: %d", files[i], errno);
272 if (S_ISLNK(sb.st_mode)) {
273 _LOGE("%s is symlink!", files[i]);
277 ret = fchown(fd, uid, pwd.pw_gid);
279 _LOGE("fchown %s failed: %d", files[i], errno);
284 mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH;
285 if (!strcmp(path, __get_cert_db_path()))
287 ret = fchmod(fd, mode);
289 _LOGD("fchmod %s failed: %d", files[i], errno);
294 SET_SMACK_LABEL(files[i]);
300 static const char *parser_init_queries[] = {
301 QUERY_CREATE_TABLE_PACKAGE_INFO,
302 QUERY_CREATE_TABLE_PACKAGE_LOCALIZED_INFO,
303 QUERY_CREATE_TABLE_PACKAGE_PRIVILEGE_INFO,
304 QUERY_CREATE_TABLE_PACKAGE_UPDATE_INFO,
305 QUERY_CREATE_TABLE_PACKAGE_APP_INFO,
306 QUERY_CREATE_TABLE_PACKAGE_APP_LOCALIZED_INFO,
307 QUERY_CREATE_TABLE_PACKAGE_APP_APP_CONTROL,
308 QUERY_CREATE_TABLE_PACKAGE_APP_APP_CONTROL_PRIVILEGE,
309 QUERY_CREATE_TABLE_PACKAGE_APP_APP_CATEGORY,
310 QUERY_CREATE_TABLE_PACKAGE_APP_APP_METADATA,
311 QUERY_CREATE_TABLE_PACKAGE_APP_DATA_CONTROL,
312 QUERY_CREATE_TABLE_PACKAGE_APP_DATA_CONTROL_PRIVILEGE,
313 QUERY_CREATE_TABLE_PACKAGE_APP_INFO_FOR_UID,
314 QUERY_CREATE_TRIGGER_UPDATE_PACKAGE_APP_INFO_FOR_UID,
315 QUERY_CREATE_TABLE_PACKAGE_APP_SPLASH_SCREEN,
319 static const char *cert_init_queries[] = {
320 QUERY_CREATE_TABLE_PACKAGE_CERT_INFO,
321 QUERY_CREATE_TABLE_PACKAGE_CERT_INDEX_INFO,
322 QUERY_CREATE_TRIGGER_UPDATE_CERT_INFO,
323 QUERY_CREATE_TRIGGER_UPDATE_CERT_INFO2,
324 QUERY_CREATE_TRIGGER_DELETE_CERT_INFO,
325 QUERY_CREATE_TRIGGER_UPDATE_CERT_INDEX_INFO,
329 static int __initialize_db(sqlite3 *db, const char *dbpath, uid_t uid)
332 const char **queries;
335 if (__set_db_version(db))
338 if (strstr(dbpath, ".pkgmgr_parser.db")) {
339 queries = parser_init_queries;
340 } else if (strstr(dbpath, ".pkgmgr_cert.db")) {
341 queries = cert_init_queries;
343 _LOGE("unexpected dbpath: %s", dbpath);
347 for (i = 0; queries[i] != NULL; i++) {
348 ret = sqlite3_exec(db, queries[i], NULL, NULL, NULL);
349 if (ret != SQLITE_OK) {
350 _LOGE("exec failed: %s", sqlite3_errmsg(db));
355 if (__set_db_permission(dbpath, uid))
356 _LOGE("failed to set db permission");
361 API int pkgmgr_parser_initialize_parser_db(uid_t uid)
367 dbpath = __get_parser_db_path(uid);
368 if (access(dbpath, F_OK) != -1) {
369 _LOGE("Manifest db for user %d is already exists", uid);
370 return PM_PARSER_R_ERROR;
373 ret = sqlite3_open_v2(dbpath, &db,
374 SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
375 if (ret != SQLITE_OK) {
376 _LOGE("open db failed: %d", ret);
377 return PM_PARSER_R_ERROR;
380 if (__initialize_db(db, dbpath, uid)) {
381 sqlite3_close_v2(db);
382 return PM_PARSER_R_ERROR;
384 sqlite3_close_v2(db);
386 return PM_PARSER_R_OK;
389 API int pkgmgr_parser_initialize_cert_db(void)
395 dbpath = __get_cert_db_path();
396 if (access(dbpath, F_OK) != -1) {
397 _LOGE("Cert db is already exists");
398 return PM_PARSER_R_ERROR;
401 ret = sqlite3_open_v2(dbpath, &db,
402 SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
403 if (ret != SQLITE_OK) {
404 _LOGE("open db failed: %d", ret);
405 return PM_PARSER_R_ERROR;
408 if (__initialize_db(db, dbpath, GLOBAL_USER)) {
409 sqlite3_close_v2(db);
410 return PM_PARSER_R_ERROR;
412 sqlite3_close_v2(db);
414 return PM_PARSER_R_OK;
417 API int pkgmgr_parser_create_and_initialize_db(uid_t uid)
421 struct passwd *result;
424 ret = getpwnam_r(APPFW_USER, &pwd, buf, sizeof(buf), &result);
425 if (result == NULL) {
427 _LOGE("no such user: %s", APPFW_USER);
429 _LOGE("getpwnam_r failed: %d", errno);
430 return PM_PARSER_R_ERROR;
433 if (getuid() != OWNER_ROOT && getuid() != pwd.pw_uid) {
434 _LOGE("Only root or app_fw user is allowed");
435 return PM_PARSER_R_EINVAL;
438 if (pkgmgr_parser_initialize_parser_db(uid))
439 return PM_PARSER_R_ERROR;
441 if (pkgmgr_parser_initialize_cert_db())
442 return PM_PARSER_R_ERROR;
444 return PM_PARSER_R_OK;
447 #define BUSY_WAITING_USEC (1000000 / 10 / 2) /* 0.05 sec */
448 #define BUSY_WAITING_MAX 20 /* wait for max 1 sec */
449 static int __db_busy_handler(void *data, int count)
451 if (count < BUSY_WAITING_MAX) {
452 usleep(BUSY_WAITING_USEC);
455 /* sqlite3_prepare_v2 will return SQLITE_BUSY */
460 static int __open_db(uid_t uid, const char *path, sqlite3 **db, int flags)
464 /* FIXME: always open with OPEN_CREATE flag for keeping previous
467 if (flags & SQLITE_OPEN_READWRITE)
468 flags = flags | SQLITE_OPEN_CREATE;
470 ret = sqlite3_open_v2(path, db, flags, NULL);
471 if (ret != SQLITE_OK)
474 ret = sqlite3_busy_handler(*db, __db_busy_handler, NULL);
475 if (ret != SQLITE_OK) {
476 _LOGE("failed to register busy handler: %s",
477 sqlite3_errmsg(*db));
478 sqlite3_close_v2(*db);
482 if (flags & SQLITE_OPEN_CREATE) {
483 ret = __initialize_db(*db, path, uid);
485 _LOGE("failed to initialize db: %s\n");
486 sqlite3_close_v2(*db);
491 ret = sqlite3_exec(*db, "PRAGMA foreign_keys=ON", NULL, NULL, NULL);
492 if (ret != SQLITE_OK) {
493 _LOGE("failed to enable foreign key support: %s",
494 sqlite3_errmsg(*db));
495 sqlite3_close_v2(*db);
503 static int __convert_background_category(GList *category_list)
509 if (category_list == NULL)
512 for (tmp = category_list; tmp; tmp = tmp->next) {
513 category_data = (char *)tmp->data;
514 if (category_data == NULL)
516 if (!strcmp(category_data, APP_BG_CATEGORY_MEDIA_STR))
517 ret |= APP_BG_CATEGORY_MEDIA_VAL;
518 else if (!strcmp(category_data, APP_BG_CATEGORY_DOWNLOAD_STR))
519 ret |= APP_BG_CATEGORY_DOWNLOAD_VAL;
520 else if (!strcmp(category_data, APP_BG_CATEGORY_BGNETWORK_STR))
521 ret |= APP_BG_CATEGORY_BGNETWORK_VAL;
522 else if (!strcmp(category_data, APP_BG_CATEGORY_LOCATION_STR))
523 ret |= APP_BG_CATEGORY_LOCATION_VAL;
524 else if (!strcmp(category_data, APP_BG_CATEGORY_SENSOR_STR))
525 ret |= APP_BG_CATEGORY_SENSOR_VAL;
526 else if (!strcmp(category_data, APP_BG_CATEGORY_IOTCOMM_STR))
527 ret |= APP_BG_CATEGORY_IOTCOMM_VAL;
528 else if (!strcmp(category_data, APP_BG_CATEGORY_SYSTEM))
529 ret |= APP_BG_CATEGORY_SYSTEM_VAL;
531 _LOGE("Unidentified category [%s]", category_data);
537 #define EFFECTIVE_APPID_KEY "http://tizen.org/metadata/effective-appid"
538 static const char *__find_effective_appid(GList *metadata_list)
543 for (tmp = metadata_list; tmp; tmp = tmp->next) {
544 md = (metadata_x *)tmp->data;
545 if (md == NULL || md->key == NULL)
548 if (strcmp(md->key, EFFECTIVE_APPID_KEY) == 0) {
557 static int __insert_appcontrol_privilege_info(sqlite3 *db, const char *appid,
560 static const char query[] =
561 "INSERT INTO package_app_app_control_privilege (app_id,"
562 " app_control, privilege) VALUES (?, ?, ?)";
566 char app_control[BUFSIZE];
573 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
574 if (ret != SQLITE_OK) {
575 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
579 for (tmp = ac->privileges; tmp; tmp = tmp->next) {
580 privilege = (char *)tmp->data;
581 if (privilege == NULL || !strlen(privilege))
585 snprintf(app_control, sizeof(app_control), "%s|%s|%s",
586 ac->operation ? (strlen(ac->operation) > 0 ?
587 ac->operation : "NULL") : "NULL",
588 ac->uri ? (strlen(ac->uri) > 0 ?
589 ac->uri : "NULL") : "NULL",
590 ac->mime ? (strlen(ac->mime) > 0 ?
591 ac->mime : "NULL") : "NULL");
592 __BIND_TEXT(db, stmt, idx++, appid);
593 __BIND_TEXT(db, stmt, idx++, app_control);
594 __BIND_TEXT(db, stmt, idx++, privilege);
596 ret = sqlite3_step(stmt);
597 if (ret != SQLITE_DONE) {
598 _LOGE("step failed: %s", sqlite3_errmsg(db));
599 sqlite3_finalize(stmt);
606 sqlite3_finalize(stmt);
611 static int __insert_appcontrol_info(sqlite3 *db, application_x *app)
613 static const char query[] =
614 "INSERT INTO package_app_app_control (app_id, app_control) "
619 char app_control[BUFSIZE];
623 if (app->appcontrol == NULL)
626 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
627 if (ret != SQLITE_OK) {
628 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
632 for (tmp = app->appcontrol; tmp; tmp = tmp->next) {
633 ac = (appcontrol_x *)tmp->data;
637 snprintf(app_control, sizeof(app_control), "%s|%s|%s",
638 ac->operation ? (strlen(ac->operation) > 0 ?
639 ac->operation : "NULL") : "NULL",
640 ac->uri ? (strlen(ac->uri) > 0 ?
641 ac->uri : "NULL") : "NULL",
642 ac->mime ? (strlen(ac->mime) > 0 ?
643 ac->mime : "NULL") : "NULL");
644 __BIND_TEXT(db, stmt, idx++, app->appid);
645 __BIND_TEXT(db, stmt, idx++, app_control);
647 ret = sqlite3_step(stmt);
648 if (ret != SQLITE_DONE) {
649 _LOGE("step failed: %s", sqlite3_errmsg(db));
650 sqlite3_finalize(stmt);
654 if (__insert_appcontrol_privilege_info(db, app->appid, ac)) {
655 sqlite3_finalize(stmt);
662 sqlite3_finalize(stmt);
667 static int __insert_category_info(sqlite3 *db, application_x *app)
669 static const char query[] =
670 "INSERT INTO package_app_app_category (app_id, category) "
676 const char *category;
678 if (app->category == NULL)
681 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
682 if (ret != SQLITE_OK) {
683 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
687 for (tmp = app->category; tmp; tmp = tmp->next) {
688 category = (const char *)tmp->data;
689 if (category == NULL)
692 __BIND_TEXT(db, stmt, idx++, app->appid);
693 __BIND_TEXT(db, stmt, idx++, category);
695 ret = sqlite3_step(stmt);
696 if (ret != SQLITE_DONE) {
697 _LOGE("step failed: %s", sqlite3_errmsg(db));
698 sqlite3_finalize(stmt);
705 sqlite3_finalize(stmt);
710 static int __insert_metadata_info(sqlite3 *db, application_x *app)
712 static const char query[] =
713 "INSERT INTO package_app_app_metadata (app_id,"
714 " md_key, md_value) VALUES (?, ?, ?)";
721 if (app->metadata == NULL)
724 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
725 if (ret != SQLITE_OK) {
726 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
730 for (tmp = app->metadata; tmp; tmp = tmp->next) {
731 md = (metadata_x *)tmp->data;
735 __BIND_TEXT(db, stmt, idx++, app->appid);
736 __BIND_TEXT(db, stmt, idx++, md->key);
737 __BIND_TEXT(db, stmt, idx++, md->value);
739 ret = sqlite3_step(stmt);
740 if (ret != SQLITE_DONE) {
741 _LOGE("step failed: %s", sqlite3_errmsg(db));
742 sqlite3_finalize(stmt);
749 sqlite3_finalize(stmt);
754 static int __insert_app_data_control_privilege_info(sqlite3 *db,
755 datacontrol_x *datacontrol)
757 static const char query[] =
758 "INSERT INTO package_app_data_control_privilege (providerid,"
759 " privilege, type) VALUES (?, ?, ?)";
767 if (datacontrol == NULL)
770 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
771 if (ret != SQLITE_OK) {
772 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
776 for (privileges = datacontrol->privileges; privileges;
777 privileges = privileges->next) {
778 priv = (char *)privileges->data;
783 __BIND_TEXT(db, stmt, idx++, datacontrol->providerid);
784 __BIND_TEXT(db, stmt, idx++, priv);
785 __BIND_TEXT(db, stmt, idx++, datacontrol->type);
787 ret = sqlite3_step(stmt);
788 if (ret != SQLITE_DONE) {
789 _LOGE("step failed: %s", sqlite3_errmsg(db));
790 sqlite3_finalize(stmt);
797 sqlite3_finalize(stmt);
801 static int __insert_datacontrol_info(sqlite3 *db, application_x *app)
803 static const char query[] =
804 "INSERT INTO package_app_data_control (app_id, providerid,"
805 " access, type, trusted) VALUES (?, ?, ?, ?, ?)";
812 if (app->datacontrol == NULL)
815 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
816 if (ret != SQLITE_OK) {
817 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
821 for (tmp = app->datacontrol; tmp; tmp = tmp->next) {
822 dc = (datacontrol_x *)tmp->data;
826 __BIND_TEXT(db, stmt, idx++, app->appid);
827 __BIND_TEXT(db, stmt, idx++, dc->providerid);
828 __BIND_TEXT(db, stmt, idx++, dc->access);
829 __BIND_TEXT(db, stmt, idx++, dc->type);
830 __BIND_TEXT(db, stmt, idx++, dc->trusted);
832 ret = sqlite3_step(stmt);
833 if (ret != SQLITE_DONE) {
834 _LOGE("step failed: %s", sqlite3_errmsg(db));
835 sqlite3_finalize(stmt);
839 if (dc->privileges &&
840 __insert_app_data_control_privilege_info(db, dc)) {
841 sqlite3_finalize(stmt);
848 sqlite3_finalize(stmt);
853 /* TODO: move to installer */
854 static int __check_dpi(const char *dpi_char, int dpi_int)
856 if (dpi_char == NULL)
859 if (strcasecmp(dpi_char, LDPI) == 0) {
860 if (dpi_int >= LDPI_MIN && dpi_int <= LDPI_MAX)
864 } else if (strcasecmp(dpi_char, MDPI) == 0) {
865 if (dpi_int >= MDPI_MIN && dpi_int <= MDPI_MAX)
869 } else if (strcasecmp(dpi_char, HDPI) == 0) {
870 if (dpi_int >= HDPI_MIN && dpi_int <= HDPI_MAX)
874 } else if (strcasecmp(dpi_char, XHDPI) == 0) {
875 if (dpi_int >= XHDPI_MIN && dpi_int <= XHDPI_MAX)
879 } else if (strcasecmp(dpi_char, XXHDPI) == 0) {
880 if (dpi_int >= XXHDPI_MIN && dpi_int <= XXHDPI_MAX)
888 static gint __compare_splashscreen_with_orientation_dpi(gconstpointer a,
891 splashscreen_x *ss = (splashscreen_x *)a;
892 const char *orientation = (const char *)b;
896 if (ss->operation || ss->dpi == NULL)
899 ret = system_info_get_platform_int(
900 "http://tizen.org/feature/screen.dpi", &dpi);
901 if (ret != SYSTEM_INFO_ERROR_NONE)
904 if (strcasecmp(ss->orientation, orientation) == 0 &&
905 __check_dpi(ss->dpi, dpi) == 0)
911 static gint __compare_splashscreen_with_orientation(gconstpointer a,
914 splashscreen_x *ss = (splashscreen_x *)a;
915 const char *orientation = (const char *)b;
917 if (ss->operation || ss->dpi)
920 if (strcasecmp(ss->orientation, orientation) == 0)
926 static splashscreen_x *__find_default_splashscreen(GList *splashscreens,
927 const char *orientation)
931 tmp = g_list_find_custom(splashscreens, orientation,
933 __compare_splashscreen_with_orientation_dpi);
935 return (splashscreen_x *)tmp->data;
937 tmp = g_list_find_custom(splashscreens, orientation,
938 (GCompareFunc)__compare_splashscreen_with_orientation);
940 return (splashscreen_x *)tmp->data;
945 static void __find_appcontrol_splashscreen_with_dpi(gpointer data,
948 splashscreen_x *ss = (splashscreen_x *)data;
949 GList **list = (GList **)user_data;
953 if (ss->operation == NULL || ss->dpi == NULL)
956 ret = system_info_get_platform_int(
957 "http://tizen.org/feature/screen.dpi", &dpi);
958 if (ret != SYSTEM_INFO_ERROR_NONE)
961 if (__check_dpi(ss->dpi, dpi) != 0)
964 *list = g_list_append(*list, ss);
967 static void __find_appcontrol_splashscreen(gpointer data, gpointer user_data)
969 splashscreen_x *ss = (splashscreen_x *)data;
970 GList **list = (GList **)user_data;
971 splashscreen_x *ss_tmp;
974 if (ss->operation == NULL || ss->dpi)
977 for (tmp = *list; tmp; tmp = tmp->next) {
978 ss_tmp = (splashscreen_x *)tmp->data;
979 if (ss_tmp->operation
980 && strcmp(ss_tmp->operation, ss->operation) == 0
981 && strcmp(ss_tmp->orientation, ss->orientation) == 0)
985 *list = g_list_append(*list, ss);
988 static GList *__find_splashscreens(GList *splashscreens)
993 g_list_foreach(splashscreens,
994 __find_appcontrol_splashscreen_with_dpi, &list);
995 g_list_foreach(splashscreens,
996 __find_appcontrol_splashscreen, &list);
998 ss = __find_default_splashscreen(splashscreens, "portrait");
1000 list = g_list_append(list, ss);
1001 ss = __find_default_splashscreen(splashscreens, "landscape");
1003 list = g_list_append(list, ss);
1008 static int __insert_splashscreen_info(sqlite3 *db, application_x *app)
1010 static const char query[] =
1011 "INSERT INTO package_app_splash_screen (app_id, src, type,"
1012 " orientation, indicatordisplay, operation, color_depth) "
1013 "VALUES (?, ?, ?, ?, ?, ?, ?)";
1021 if (app->splashscreens == NULL)
1024 ss_list = __find_splashscreens(app->splashscreens);
1025 if (ss_list == NULL)
1028 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1029 if (ret != SQLITE_OK) {
1030 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1034 for (tmp = ss_list; tmp; tmp = tmp->next) {
1035 ss = (splashscreen_x *)tmp->data;
1039 __BIND_TEXT(db, stmt, idx++, app->appid);
1040 __BIND_TEXT(db, stmt, idx++, ss->src);
1041 __BIND_TEXT(db, stmt, idx++, ss->type);
1042 __BIND_TEXT(db, stmt, idx++, ss->orientation);
1043 __BIND_TEXT(db, stmt, idx++, ss->indicatordisplay);
1044 __BIND_TEXT(db, stmt, idx++, ss->operation);
1045 __BIND_TEXT(db, stmt, idx++, ss->color_depth);
1047 ret = sqlite3_step(stmt);
1048 if (ret != SQLITE_DONE) {
1049 _LOGE("step failed: %s", sqlite3_errmsg(db));
1050 sqlite3_finalize(stmt);
1054 sqlite3_reset(stmt);
1057 sqlite3_finalize(stmt);
1062 static void __trimfunc(GList *trim_list)
1066 GList *list = g_list_first(trim_list);
1069 trim_data = (char *)list->data;
1072 if (strcmp(trim_data, prev) == 0) {
1073 trim_list = g_list_remove(trim_list,
1075 list = g_list_first(trim_list);
1084 list = g_list_next(list);
1088 static gint __comparefunc(gconstpointer a, gconstpointer b, gpointer userdata)
1090 if (a == NULL || b == NULL)
1092 if (strcmp((char *)a, (char *)b) == 0)
1094 if (strcmp((char *)a, (char *)b) < 0)
1096 if (strcmp((char *)a, (char *)b) > 0)
1101 /* TODO: refactor inserting localized info */
1102 static GList *__create_locale_list(GList *lbls, GList *lcns, GList *icns,
1103 GList *dcns, GList *aths)
1105 GList *locale = NULL;
1113 for (tmp = lbls; tmp; tmp = tmp->next) {
1114 lbl = (label_x *)tmp->data;
1118 locale = g_list_insert_sorted_with_data(
1119 locale, (gpointer)lbl->lang,
1120 __comparefunc, NULL);
1122 for (tmp = lcns; tmp; tmp = tmp->next) {
1123 lcn = (license_x *)tmp->data;
1127 locale = g_list_insert_sorted_with_data(
1128 locale, (gpointer)lcn->lang,
1129 __comparefunc, NULL);
1131 for (tmp = icns; tmp; tmp = tmp->next) {
1132 icn = (icon_x *)tmp->data;
1136 locale = g_list_insert_sorted_with_data(
1137 locale, (gpointer)icn->lang,
1138 __comparefunc, NULL);
1140 for (tmp = dcns; tmp; tmp = tmp->next) {
1141 dcn = (description_x *)tmp->data;
1145 locale = g_list_insert_sorted_with_data(
1146 locale, (gpointer)dcn->lang,
1147 __comparefunc, NULL);
1149 for (tmp = aths; tmp; tmp = tmp->next) {
1150 ath = (author_x *)tmp->data;
1154 locale = g_list_insert_sorted_with_data(
1155 locale, (gpointer)ath->lang,
1156 __comparefunc, NULL);
1162 static gint __check_icon_resolution(const char *orig_icon_path,
1163 char **new_icon_path)
1167 char *icon_filename;
1168 char modified_iconpath[BUFSIZE];
1169 char icon_path[BUFSIZE];
1173 if (orig_icon_path == NULL)
1176 ret = system_info_get_platform_int(
1177 "http://tizen.org/feature/screen.dpi", &dpi);
1178 if (ret != SYSTEM_INFO_ERROR_NONE)
1181 if (dpi >= LDPI_MIN && dpi <= LDPI_MAX) {
1182 dpi_path[0] = "LDPI";
1183 dpi_path[1] = "ldpi";
1184 } else if (dpi >= MDPI_MIN && dpi <= MDPI_MAX) {
1185 dpi_path[0] = "MDPI";
1186 dpi_path[1] = "mdpi";
1187 } else if (dpi >= HDPI_MIN && dpi <= HDPI_MAX) {
1188 dpi_path[0] = "HDPI";
1189 dpi_path[1] = "hdpi";
1190 } else if (dpi >= XHDPI_MIN && dpi <= XHDPI_MAX) {
1191 dpi_path[0] = "XHDPI";
1192 dpi_path[1] = "xhdpi";
1193 } else if (dpi >= XXHDPI_MIN && dpi <= XXHDPI_MAX) {
1194 dpi_path[0] = "XXHDPI";
1195 dpi_path[1] = "xxhdpi";
1197 _LOGE("Unidentified dpi[%d]", dpi);
1201 icon_filename = strrchr(orig_icon_path, '/');
1202 if (icon_filename == NULL)
1206 strlen(orig_icon_path) - (strlen(icon_filename) - 1),
1207 "%s", orig_icon_path);
1208 for (i = 0; i < 2; i++) {
1209 snprintf(modified_iconpath, BUFSIZE - 1, "%s/%s%s",
1210 icon_path, dpi_path[i], icon_filename);
1211 if (access(modified_iconpath, F_OK) != -1) {
1212 /* if exists, return modified icon path */
1213 *new_icon_path = strdup(modified_iconpath);
1221 static gint __compare_icon(gconstpointer a, gconstpointer b)
1223 icon_x *icon = (icon_x *)a;
1226 if (icon->lang != NULL && strcasecmp(icon->lang, DEFAULT_LOCALE) != 0)
1229 if (icon->dpi != NULL)
1232 if (__check_icon_resolution(icon->text, &icon_path) == 0) {
1234 icon->text = icon_path;
1240 static gint __compare_icon_with_dpi(gconstpointer a, gconstpointer b)
1242 icon_x *icon = (icon_x *)a;
1243 int dpi = GPOINTER_TO_INT(b);
1245 if (icon->lang != NULL && strcasecmp(icon->lang, DEFAULT_LOCALE) != 0)
1248 if (icon->dpi == NULL)
1251 if (__check_dpi(icon->dpi, dpi) == 0)
1257 static gint __compare_icon_with_lang(gconstpointer a, gconstpointer b)
1259 icon_x *icon = (icon_x *)a;
1260 char *lang = (char *)b;
1263 if (icon->dpi != NULL)
1266 if (strcasecmp(icon->lang, lang) == 0) {
1267 if (strcasecmp(icon->lang, DEFAULT_LOCALE) == 0) {
1268 /* icon for no locale. check existance of
1269 * folder-hierachied default icons
1271 if (__check_icon_resolution(icon->text,
1274 icon->text = icon_path;
1283 static gint __compare_icon_with_lang_dpi(gconstpointer a, gconstpointer b)
1286 icon_x *icon = (icon_x *)a;
1287 char *lang = (char *)b;
1290 ret = system_info_get_platform_int(
1291 "http://tizen.org/feature/screen.dpi", &dpi);
1292 if (ret != SYSTEM_INFO_ERROR_NONE)
1295 if (strcasecmp(icon->lang, lang) == 0 &&
1296 __check_dpi(icon->dpi, dpi) == 0)
1302 static char *__find_icon(GList *icons, const char *lang)
1309 /* first, find icon whose locale and dpi with given lang and
1310 * system's dpi has matched
1312 tmp = g_list_find_custom(icons, lang,
1313 (GCompareFunc)__compare_icon_with_lang_dpi);
1315 icon = (icon_x *)tmp->data;
1316 return (char *)icon->text;
1319 /* if first has failed, find icon whose locale has matched */
1320 tmp = g_list_find_custom(icons, lang,
1321 (GCompareFunc)__compare_icon_with_lang);
1323 icon = (icon_x *)tmp->data;
1324 return (char *)icon->text;
1327 /* if second has failed, find icon whose dpi has matched with
1330 ret = system_info_get_platform_int(
1331 "http://tizen.org/feature/screen.dpi", &dpi);
1332 if (ret == SYSTEM_INFO_ERROR_NONE) {
1333 tmp = g_list_find_custom(icons, GINT_TO_POINTER(dpi),
1334 (GCompareFunc)__compare_icon_with_dpi);
1336 icon = (icon_x *)tmp->data;
1337 return (char *)icon->text;
1341 /* last, find default icon marked as "No Locale" */
1342 tmp = g_list_find_custom(icons, NULL, (GCompareFunc)__compare_icon);
1344 icon = (icon_x *)tmp->data;
1345 return (char *)icon->text;
1351 static void __extract_data(const char *locale, GList *lbls, GList *lcns,
1352 GList *icns, GList *dcns, GList *aths, char **label,
1353 char **license, char **icon, char **description, char **author)
1361 for (tmp = lbls; tmp; tmp = tmp->next) {
1362 lbl = (label_x *)tmp->data;
1366 if (strcmp(lbl->lang, locale) == 0) {
1367 *label = (char *)lbl->text;
1372 for (tmp = lcns; tmp; tmp = tmp->next) {
1373 lcn = (license_x *)tmp->data;
1377 if (strcmp(lcn->lang, locale) == 0) {
1378 *license = (char *)lcn->text;
1384 *icon = __find_icon(icns, locale);
1386 for (tmp = dcns; tmp; tmp = tmp->next) {
1387 dcn = (description_x *)tmp->data;
1391 if (strcmp(dcn->lang, locale) == 0) {
1392 *description = (char *)dcn->text;
1397 for (tmp = aths; tmp; tmp = tmp->next) {
1398 ath = (author_x *)tmp->data;
1402 if (strcmp(ath->lang, locale) == 0) {
1403 *author = (char *)ath->text;
1410 static int __insert_mainapp_localized_info(sqlite3 *db, application_x *app,
1411 const char *locale, const char *label, const char *icon)
1413 static const char query[] =
1414 "INSERT OR REPLACE INTO package_localized_info ("
1415 " package, package_locale, package_label, package_icon,"
1416 " package_description, package_license, package_author) "
1418 " COALESCE((SELECT package_label FROM package_localized_info"
1419 " WHERE package=? AND package_locale=?), ?),"
1420 " COALESCE((SELECT package_icon FROM package_localized_info"
1421 " WHERE package=? AND package_icon=?), ?),"
1422 " (SELECT package_description FROM package_localized_info"
1423 " WHERE package=? AND package_locale=?),"
1424 " (SELECT package_description FROM package_localized_info"
1425 " WHERE package=? AND package_locale=?),"
1426 " (SELECT package_description FROM package_localized_info"
1427 " WHERE package=? AND package_locale=?))";
1432 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1433 if (ret != SQLITE_OK) {
1434 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1438 __BIND_TEXT(db, stmt, idx++, app->package);
1439 __BIND_TEXT(db, stmt, idx++, locale);
1440 __BIND_TEXT(db, stmt, idx++, app->package);
1441 __BIND_TEXT(db, stmt, idx++, locale);
1442 __BIND_TEXT(db, stmt, idx++, label);
1443 __BIND_TEXT(db, stmt, idx++, app->package);
1444 __BIND_TEXT(db, stmt, idx++, locale);
1445 __BIND_TEXT(db, stmt, idx++, icon);
1446 __BIND_TEXT(db, stmt, idx++, app->package);
1447 __BIND_TEXT(db, stmt, idx++, locale);
1448 __BIND_TEXT(db, stmt, idx++, app->package);
1449 __BIND_TEXT(db, stmt, idx++, locale);
1450 __BIND_TEXT(db, stmt, idx++, app->package);
1451 __BIND_TEXT(db, stmt, idx++, locale);
1453 ret = sqlite3_step(stmt);
1454 if (ret != SQLITE_DONE) {
1455 _LOGE("step failed: %s", sqlite3_errmsg(db));
1456 sqlite3_finalize(stmt);
1460 sqlite3_finalize(stmt);
1465 static int __insert_app_localized_info(sqlite3 *db, application_x *app)
1467 static const char query[] =
1468 "INSERT INTO package_app_localized_info (app_id, app_locale,"
1469 " app_label, app_icon) "
1470 "VALUES (?, ?, ?, ?)";
1480 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1481 if (ret != SQLITE_OK) {
1482 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1486 locales = __create_locale_list(app->label, NULL, app->icon, NULL, NULL);
1487 for (tmp = locales; tmp; tmp = tmp->next) {
1488 locale = (const char *)tmp->data;
1491 __extract_data(locale, app->label, NULL, app->icon, NULL, NULL,
1492 &label, NULL, &icon, NULL, NULL);
1493 if (!label && !icon)
1497 __BIND_TEXT(db, stmt, idx++, app->appid);
1498 __BIND_TEXT(db, stmt, idx++, locale);
1499 __BIND_TEXT(db, stmt, idx++, label);
1500 __BIND_TEXT(db, stmt, idx++, icon);
1502 ret = sqlite3_step(stmt);
1503 if (ret != SQLITE_DONE) {
1504 _LOGE("step failed: %s", sqlite3_errmsg(db));
1505 g_list_free(locales);
1506 sqlite3_finalize(stmt);
1510 sqlite3_reset(stmt);
1512 if (strcasecmp(app->mainapp, "true") == 0) {
1513 if (__insert_mainapp_localized_info(db, app, locale,
1515 _LOGE("insert mainapp localized info failed");
1519 g_list_free(locales);
1520 sqlite3_finalize(stmt);
1525 static int __insert_package_privilege_info(sqlite3 *db, manifest_x *mfx)
1527 static const char query[] =
1528 "INSERT INTO package_privilege_info (package, privilege, type) "
1536 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1537 if (ret != SQLITE_OK) {
1538 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1542 for (tmp = mfx->privileges; tmp; tmp = tmp->next) {
1543 priv = (privilege_x *)tmp->data;
1548 __BIND_TEXT(db, stmt, idx++, mfx->package);
1549 __BIND_TEXT(db, stmt, idx++, priv->value);
1550 __BIND_TEXT(db, stmt, idx++, priv->type);
1552 ret = sqlite3_step(stmt);
1553 if (ret != SQLITE_DONE) {
1554 _LOGE("step failed: %s", sqlite3_errmsg(db));
1555 sqlite3_finalize(stmt);
1558 sqlite3_reset(stmt);
1561 sqlite3_finalize(stmt);
1566 /* _PRODUCT_LAUNCHING_ENHANCED_
1567 * app->indicatordisplay, app->portraitimg, app->landscapeimg,
1568 * app->guestmode_appstatus
1570 static int __insert_application_info(sqlite3 *db, manifest_x *mfx)
1572 static const char query[] =
1573 "INSERT INTO package_app_info (app_id, app_component,"
1574 " app_exec, app_nodisplay, app_type, app_onboot, app_multiple,"
1575 " app_autorestart, app_taskmanage, app_hwacceleration,"
1576 " app_screenreader, app_mainapp, app_recentimage,"
1577 " app_launchcondition, app_indicatordisplay, app_portraitimg,"
1578 " app_landscapeimg, app_guestmodevisibility,"
1579 " app_permissiontype, app_preload, app_submode,"
1580 " app_submode_mainid, app_installed_storage, app_process_pool,"
1581 " app_launch_mode, app_ui_gadget, app_support_mode,"
1582 " app_support_disable, component_type, package, app_tep_name,"
1583 " app_zip_mount_file, app_background_category,"
1584 " app_package_type, app_root_path, app_api_version,"
1585 " app_effective_appid, app_splash_screen_display,"
1586 " app_package_system, app_removable,"
1587 " app_package_installed_time, app_support_ambient,"
1588 " app_setup_appid) "
1590 " ?, LOWER(?), ?, LOWER(?), LOWER(?),"
1591 " LOWER(?), LOWER(?), ?,"
1595 " ?, LOWER(?), LOWER(?),"
1597 " COALESCE(?, 'single'), LOWER(?), ?,"
1598 " LOWER(?), ?, ?, ?,"
1602 " LOWER(?), LOWER(?),"
1611 const char *effective_appid;
1613 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1614 if (ret != SQLITE_OK) {
1615 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1619 for (tmp = mfx->application; tmp; tmp = tmp->next) {
1620 app = (application_x *)tmp->data;
1624 bg_category = __convert_background_category(
1625 app->background_category);
1626 effective_appid = __find_effective_appid(app->metadata);
1629 __BIND_TEXT(db, stmt, idx++, app->appid);
1630 __BIND_TEXT(db, stmt, idx++, app->component_type);
1631 __BIND_TEXT(db, stmt, idx++, app->exec);
1632 __BIND_TEXT(db, stmt, idx++, __get_bool(app->nodisplay, false));
1633 __BIND_TEXT(db, stmt, idx++, app->type);
1634 __BIND_TEXT(db, stmt, idx++, __get_bool(app->onboot, false));
1635 __BIND_TEXT(db, stmt, idx++, __get_bool(app->multiple, false));
1636 __BIND_TEXT(db, stmt, idx++,
1637 __get_bool(app->autorestart, false));
1638 __BIND_TEXT(db, stmt, idx++,
1639 __get_bool(app->taskmanage, false));
1640 __BIND_TEXT(db, stmt, idx++, app->hwacceleration);
1641 __BIND_TEXT(db, stmt, idx++, app->screenreader);
1642 __BIND_TEXT(db, stmt, idx++, __get_bool(app->mainapp, false));
1643 __BIND_TEXT(db, stmt, idx++, app->recentimage);
1644 __BIND_TEXT(db, stmt, idx++, app->launchcondition);
1645 __BIND_TEXT(db, stmt, idx++,
1646 __get_bool(app->indicatordisplay, true));
1647 __BIND_TEXT(db, stmt, idx++, app->portraitimg);
1648 __BIND_TEXT(db, stmt, idx++, app->landscapeimg);
1649 __BIND_TEXT(db, stmt, idx++,
1650 __get_bool(app->guestmode_visibility, true));
1651 __BIND_TEXT(db, stmt, idx++, app->permission_type);
1652 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->preload, false));
1653 __BIND_TEXT(db, stmt, idx++, __get_bool(app->submode, false));
1654 __BIND_TEXT(db, stmt, idx++, app->submode_mainid);
1655 __BIND_TEXT(db, stmt, idx++, mfx->installed_storage);
1656 __BIND_TEXT(db, stmt, idx++,
1657 __get_bool(app->process_pool, false));
1658 __BIND_TEXT(db, stmt, idx++, app->launch_mode);
1659 __BIND_TEXT(db, stmt, idx++, __get_bool(app->ui_gadget, false));
1660 __BIND_TEXT(db, stmt, idx++, app->support_mode);
1661 __BIND_TEXT(db, stmt, idx++,
1662 __get_bool(mfx->support_disable, false));
1663 __BIND_TEXT(db, stmt, idx++, app->component_type);
1664 __BIND_TEXT(db, stmt, idx++, mfx->package);
1665 __BIND_TEXT(db, stmt, idx++, mfx->tep_name);
1666 __BIND_TEXT(db, stmt, idx++, mfx->zip_mount_file);
1667 __BIND_INT(db, stmt, idx++, bg_category);
1668 __BIND_TEXT(db, stmt, idx++, mfx->type ? mfx->type : "tpk");
1669 __BIND_TEXT(db, stmt, idx++, mfx->root_path);
1670 __BIND_TEXT(db, stmt, idx++, mfx->api_version);
1671 __BIND_TEXT(db, stmt, idx++, effective_appid);
1672 __BIND_TEXT(db, stmt, idx++,
1673 __get_bool(app->splash_screen_display, true));
1674 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->system, false));
1675 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->removable, false));
1676 __BIND_TEXT(db, stmt, idx++, mfx->installed_time);
1677 __BIND_TEXT(db, stmt, idx++,
1678 __get_bool(app->support_ambient, false));
1679 __BIND_TEXT(db, stmt, idx++, app->setup_appid);
1681 ret = sqlite3_step(stmt);
1682 if (ret != SQLITE_DONE) {
1683 _LOGE("step failed: %s", sqlite3_errmsg(db));
1684 sqlite3_finalize(stmt);
1688 sqlite3_reset(stmt);
1690 if (__insert_appcontrol_info(db, app)) {
1691 sqlite3_finalize(stmt);
1694 if (__insert_category_info(db, app)) {
1695 sqlite3_finalize(stmt);
1698 if (__insert_metadata_info(db, app)) {
1699 sqlite3_finalize(stmt);
1702 if (__insert_datacontrol_info(db, app)) {
1703 sqlite3_finalize(stmt);
1706 if (__insert_splashscreen_info(db, app)) {
1707 sqlite3_finalize(stmt);
1710 if (__insert_app_localized_info(db, app)) {
1711 sqlite3_finalize(stmt);
1716 sqlite3_finalize(stmt);
1721 static int __insert_package_update_info(sqlite3 *db, manifest_x *mfx)
1723 static const char query[] =
1724 "INSERT INTO package_update_info (package, update_version) "
1730 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1731 if (ret != SQLITE_OK) {
1732 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1737 __BIND_TEXT(db, stmt, idx++, mfx->package);
1738 __BIND_TEXT(db, stmt, idx, mfx->version);
1739 ret = sqlite3_step(stmt);
1740 if (ret != SQLITE_DONE) {
1741 _LOGE("step failed: %s", sqlite3_errmsg(db));
1742 sqlite3_finalize(stmt);
1745 sqlite3_finalize(stmt);
1750 static int __insert_package_localized_info(sqlite3 *db, manifest_x *mfx)
1752 static const char query[] =
1753 "INSERT INTO package_localized_info (package, package_locale,"
1754 " package_label, package_icon, package_description,"
1755 " package_license, package_author) "
1756 "VALUES (?, ?, ?, ?, ?, ?, ?)";
1769 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1770 if (ret != SQLITE_OK) {
1771 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1775 locales = __create_locale_list(mfx->label, mfx->license, mfx->icon,
1776 mfx->description, mfx->author);
1777 for (tmp = locales; tmp; tmp = tmp->next) {
1778 locale = (const char *)tmp->data;
1784 __extract_data(locale, mfx->label, mfx->license, mfx->icon,
1785 mfx->description, mfx->author,
1786 &label, &license, &icon, &description, &author);
1787 if (!label && !license && !icon && !description && !author)
1791 __BIND_TEXT(db, stmt, idx++, mfx->package);
1792 __BIND_TEXT(db, stmt, idx++, locale);
1793 __BIND_TEXT(db, stmt, idx++, label);
1794 __BIND_TEXT(db, stmt, idx++, icon);
1795 __BIND_TEXT(db, stmt, idx++, description);
1796 __BIND_TEXT(db, stmt, idx++, license);
1797 __BIND_TEXT(db, stmt, idx++, author);
1799 ret = sqlite3_step(stmt);
1800 if (ret != SQLITE_DONE) {
1801 _LOGE("step failed: %s", sqlite3_errmsg(db));
1802 g_list_free(locales);
1803 sqlite3_finalize(stmt);
1807 sqlite3_reset(stmt);
1810 g_list_free(locales);
1811 sqlite3_finalize(stmt);
1816 static int __insert_package_info(sqlite3 *db, manifest_x *mfx)
1818 static const char query[] =
1819 "INSERT INTO package_info (package, package_type,"
1820 " package_version, package_api_version, package_tep_name,"
1821 " package_zip_mount_file, install_location, package_size,"
1822 " package_removable, package_preload, package_readonly,"
1823 " package_update, package_appsetting, package_nodisplay,"
1824 " package_system, author_name, author_email, author_href,"
1825 " installed_time, installed_storage, storeclient_id,"
1826 " mainapp_id, package_url, root_path, external_path,"
1827 " csc_path, package_support_mode, package_support_disable) "
1831 " LOWER(?), LOWER(?), LOWER(?),"
1832 " LOWER(?), LOWER(?), LOWER(?),"
1833 " LOWER(?), ?, ?, ?,"
1840 const char *author_name = NULL;
1841 const char *author_email = NULL;
1842 const char *author_href = NULL;
1844 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1845 if (ret != SQLITE_OK) {
1846 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1850 if (mfx->author && mfx->author->data) {
1851 author_name = ((author_x *)mfx->author->data)->text;
1852 author_email = ((author_x *)mfx->author->data)->email;
1853 author_href = ((author_x *)mfx->author->data)->href;
1856 __BIND_TEXT(db, stmt, idx++, mfx->package);
1857 __BIND_TEXT(db, stmt, idx++, mfx->type);
1858 __BIND_TEXT(db, stmt, idx++, mfx->version);
1859 __BIND_TEXT(db, stmt, idx++, mfx->api_version);
1860 __BIND_TEXT(db, stmt, idx++, mfx->tep_name);
1861 __BIND_TEXT(db, stmt, idx++, mfx->zip_mount_file);
1862 __BIND_TEXT(db, stmt, idx++, mfx->installlocation);
1863 __BIND_TEXT(db, stmt, idx++, mfx->package_size);
1864 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->removable, true));
1865 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->preload, false));
1866 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->readonly, false));
1867 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->update, false));
1868 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->appsetting, false));
1869 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->nodisplay_setting, false));
1870 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->system, false));
1871 __BIND_TEXT(db, stmt, idx++, author_name);
1872 __BIND_TEXT(db, stmt, idx++, author_email);
1873 __BIND_TEXT(db, stmt, idx++, author_href);
1874 __BIND_TEXT(db, stmt, idx++, mfx->installed_time);
1875 __BIND_TEXT(db, stmt, idx++, mfx->installed_storage);
1876 __BIND_TEXT(db, stmt, idx++, mfx->storeclient_id);
1877 __BIND_TEXT(db, stmt, idx++, mfx->mainapp_id);
1878 __BIND_TEXT(db, stmt, idx++, mfx->package_url);
1879 __BIND_TEXT(db, stmt, idx++, mfx->root_path);
1880 __BIND_TEXT(db, stmt, idx++, mfx->external_path);
1881 __BIND_TEXT(db, stmt, idx++, mfx->csc_path);
1882 __BIND_TEXT(db, stmt, idx++, mfx->support_mode);
1883 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->support_disable, false));
1885 ret = sqlite3_step(stmt);
1886 if (ret != SQLITE_DONE) {
1887 _LOGE("step failed: %s", sqlite3_errmsg(db));
1888 sqlite3_finalize(stmt);
1892 sqlite3_finalize(stmt);
1894 if (__insert_package_update_info(db, mfx))
1896 if (__insert_package_localized_info(db, mfx))
1898 if (__insert_application_info(db, mfx))
1900 if (__insert_package_privilege_info(db, mfx))
1906 API int pkgmgr_parser_insert_manifest_info_in_usr_db(manifest_x *mfx, uid_t uid)
1913 _LOGE("invalid parameter");
1914 return PM_PARSER_R_EINVAL;
1917 dbpath = __get_parser_db_path(uid);
1919 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
1920 if (ret != SQLITE_OK) {
1921 _LOGE("open db failed: %d", ret);
1922 return PM_PARSER_R_ERROR;
1925 __BEGIN_TRANSACTION(db);
1926 __DO_TRANSACTION(db, __insert_package_info(db, mfx));
1927 __END_TRANSACTION(db);
1929 sqlite3_close_v2(db);
1931 return PM_PARSER_R_OK;
1934 API int pkgmgr_parser_insert_manifest_info_in_db(manifest_x *mfx)
1936 return pkgmgr_parser_insert_manifest_info_in_usr_db(mfx, __getuid());
1939 static int __delete_package_info(sqlite3 *db, const char *pkgid)
1941 static const char query[] =
1942 "DELETE FROM package_info WHERE package=?";
1946 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1947 if (ret != SQLITE_OK) {
1948 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1952 __BIND_TEXT(db, stmt, 1, pkgid);
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);
1966 API int pkgmgr_parser_delete_manifest_info_from_usr_db(manifest_x *mfx,
1974 _LOGE("invalid parameter");
1975 return PM_PARSER_R_EINVAL;
1978 dbpath = __get_parser_db_path(uid);
1980 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
1981 if (ret != SQLITE_OK) {
1982 _LOGE("open db failed: %d", ret);
1983 return PM_PARSER_R_ERROR;
1986 __BEGIN_TRANSACTION(db);
1987 __DO_TRANSACTION(db, __delete_package_info(db, mfx->package));
1988 __END_TRANSACTION(db);
1990 sqlite3_close_v2(db);
1992 return PM_PARSER_R_OK;
1995 API int pkgmgr_parser_delete_manifest_info_from_db(manifest_x *mfx)
1997 return pkgmgr_parser_delete_manifest_info_from_usr_db(mfx, __getuid());
2000 API int pkgmgr_parser_update_manifest_info_in_usr_db(manifest_x *mfx, uid_t uid)
2007 _LOGE("invalid parameter");
2008 return PM_PARSER_R_EINVAL;
2011 dbpath = __get_parser_db_path(uid);
2013 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2014 if (ret != SQLITE_OK) {
2015 _LOGE("open db failed: %d", ret);
2016 return PM_PARSER_R_ERROR;
2019 __BEGIN_TRANSACTION(db);
2020 __DO_TRANSACTION(db, __delete_package_info(db, mfx->package));
2021 __DO_TRANSACTION(db, __insert_package_info(db, mfx));
2022 __END_TRANSACTION(db);
2024 sqlite3_close_v2(db);
2026 return PM_PARSER_R_OK;
2029 API int pkgmgr_parser_update_manifest_info_in_db(manifest_x *mfx)
2031 return pkgmgr_parser_update_manifest_info_in_usr_db(mfx, __getuid());
2034 static int __set_global_app_disable_for_uid(sqlite3 *db, const char *appid,
2035 uid_t uid, bool is_disable)
2037 static const char query[] =
2038 "INSERT OR REPLACE INTO package_app_info_for_uid ("
2039 " app_id, uid, is_disabled, is_splash_screen_enabled) "
2041 " (SELECT app_splash_screen_display FROM package_app_info"
2042 " WHERE app_id=?))";
2047 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2048 if (ret != SQLITE_OK) {
2049 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2053 __BIND_TEXT(db, stmt, idx++, appid);
2054 __BIND_INT(db, stmt, idx++, uid);
2055 __BIND_TEXT(db, stmt, idx++, is_disable ? "true" : "false");
2056 __BIND_TEXT(db, stmt, idx++, appid);
2058 ret = sqlite3_step(stmt);
2059 if (ret != SQLITE_DONE) {
2060 _LOGE("step failed: %s", sqlite3_errmsg(db));
2061 sqlite3_finalize(stmt);
2065 sqlite3_finalize(stmt);
2070 API int pkgmgr_parser_update_global_app_disable_for_uid_info_in_db(
2071 const char *appid, uid_t uid, int is_disable)
2077 if (appid == NULL) {
2078 _LOGE("invalid parameter");
2079 return PM_PARSER_R_EINVAL;
2082 dbpath = __get_parser_db_path(GLOBAL_USER);
2084 ret = __open_db(GLOBAL_USER, 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, __set_global_app_disable_for_uid(db, appid,
2092 uid, (bool)is_disable));
2093 __END_TRANSACTION(db);
2095 sqlite3_close_v2(db);
2097 return PM_PARSER_R_OK;
2100 static int __set_app_disable(sqlite3 *db, const char *appid, uid_t uid,
2103 static const char query[] =
2104 "UPDATE package_app_info SET app_disable=? "
2110 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2111 if (ret != SQLITE_OK) {
2112 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2116 __BIND_TEXT(db, stmt, idx++, is_disable ? "true" : "false");
2117 __BIND_TEXT(db, stmt, idx++, appid);
2119 ret = sqlite3_step(stmt);
2120 if (ret != SQLITE_DONE) {
2121 _LOGE("step failed: %s", sqlite3_errmsg(db));
2122 sqlite3_finalize(stmt);
2126 sqlite3_finalize(stmt);
2131 API int pkgmgr_parser_update_app_disable_info_in_usr_db(const char *appid,
2132 uid_t uid, int is_disable)
2138 if (appid == NULL) {
2139 _LOGE("invalid parameter");
2140 return PM_PARSER_R_EINVAL;
2143 dbpath = __get_parser_db_path(uid);
2145 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2146 if (ret != SQLITE_OK) {
2147 _LOGE("open db failed: %d", ret);
2148 return PM_PARSER_R_ERROR;
2151 __BEGIN_TRANSACTION(db);
2152 __DO_TRANSACTION(db, __set_app_disable(db, appid, uid,
2154 __END_TRANSACTION(db);
2156 sqlite3_close_v2(db);
2158 return PM_PARSER_R_OK;
2161 API int pkgmgr_parser_update_app_disable_info_in_db(const char *appid,
2164 return pkgmgr_parser_update_app_disable_info_in_usr_db(appid,
2165 __getuid(), is_disable);
2168 static int __set_pkg_disable(sqlite3 *db, const char *pkgid, uid_t uid,
2171 static const char query[] =
2172 "UPDATE package_info SET package_disable=? "
2178 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2179 if (ret != SQLITE_OK) {
2180 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2184 __BIND_TEXT(db, stmt, idx++, is_disable ? "true" : "false");
2185 __BIND_TEXT(db, stmt, idx++, pkgid);
2187 ret = sqlite3_step(stmt);
2188 if (ret != SQLITE_DONE) {
2189 _LOGE("step failed: %s", sqlite3_errmsg(db));
2190 sqlite3_finalize(stmt);
2194 sqlite3_finalize(stmt);
2199 API int pkgmgr_parser_update_pkg_disable_info_in_usr_db(const char *pkgid,
2200 uid_t uid, int is_disable)
2206 if (pkgid == NULL) {
2207 _LOGE("invalid parameter");
2208 return PM_PARSER_R_EINVAL;
2211 dbpath = __get_parser_db_path(uid);
2213 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2214 if (ret != SQLITE_OK) {
2215 _LOGE("open db failed: %d", ret);
2216 return PM_PARSER_R_ERROR;
2219 __BEGIN_TRANSACTION(db);
2220 __DO_TRANSACTION(db, __set_pkg_disable(db, pkgid, uid,
2222 __END_TRANSACTION(db);
2224 sqlite3_close_v2(db);
2226 return PM_PARSER_R_OK;
2229 API int pkgmgr_parser_update_pkg_disable_info_in_db(const char *pkgid,
2232 return pkgmgr_parser_update_pkg_disable_info_in_usr_db(pkgid,
2233 __getuid(), is_disable);
2236 static int __set_global_app_splash_screen_for_uid(sqlite3 *db,
2237 const char *appid, uid_t uid, bool is_enabled)
2239 static const char query[] =
2240 "INSERT OR REPLACE INTO package_app_info_for_uid("
2241 " appid, uid, is_splash_screen_enabled) "
2247 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2248 if (ret != SQLITE_OK) {
2249 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2253 __BIND_TEXT(db, stmt, idx++, appid);
2254 __BIND_INT(db, stmt, idx++, uid);
2255 __BIND_TEXT(db, stmt, idx++, is_enabled ? "true" : "false");
2257 ret = sqlite3_step(stmt);
2258 if (ret != SQLITE_DONE) {
2259 _LOGE("step failed: %s", sqlite3_errmsg(db));
2260 sqlite3_finalize(stmt);
2264 sqlite3_finalize(stmt);
2269 API int pkgmgr_parser_update_global_app_splash_screen_display_info_in_usr_db(
2270 const char *appid, uid_t uid, int flag)
2276 if (appid == NULL) {
2277 _LOGE("invalid parameter");
2278 return PM_PARSER_R_EINVAL;
2281 dbpath = __get_parser_db_path(GLOBAL_USER);
2283 ret = __open_db(GLOBAL_USER, dbpath, &db, SQLITE_OPEN_READWRITE);
2284 if (ret != SQLITE_OK) {
2285 _LOGE("open db failed: %d", ret);
2286 return PM_PARSER_R_ERROR;
2289 __BEGIN_TRANSACTION(db);
2290 __DO_TRANSACTION(db, __set_global_app_splash_screen_for_uid(db,
2291 appid, uid, (bool)flag));
2292 __END_TRANSACTION(db);
2294 sqlite3_close_v2(db);
2296 return PM_PARSER_R_OK;
2299 static int __set_app_splash_screen(sqlite3 *db, const char *appid,
2302 static const char query[] =
2303 "UPDATE package_app_info SET app_splash_screen_display=? "
2309 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2310 if (ret != SQLITE_OK) {
2311 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2315 __BIND_TEXT(db, stmt, idx++, is_enabled ? "true" : "false");
2316 __BIND_TEXT(db, stmt, idx++, appid);
2318 ret = sqlite3_step(stmt);
2319 if (ret != SQLITE_DONE) {
2320 _LOGE("step failed: %s", sqlite3_errmsg(db));
2321 sqlite3_finalize(stmt);
2325 sqlite3_finalize(stmt);
2330 API int pkgmgr_parser_update_app_splash_screen_display_info_in_usr_db(
2331 const char *appid, uid_t uid, int flag)
2337 if (appid == NULL) {
2338 _LOGE("invalid parameter");
2339 return PM_PARSER_R_EINVAL;
2342 dbpath = __get_parser_db_path(uid);
2344 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2345 if (ret != SQLITE_OK) {
2346 _LOGE("open db failed: %d", ret);
2347 return PM_PARSER_R_ERROR;
2350 __BEGIN_TRANSACTION(db);
2351 __DO_TRANSACTION(db, __set_app_splash_screen(db, appid, (bool)flag));
2352 __END_TRANSACTION(db);
2354 sqlite3_close_v2(db);
2356 return PM_PARSER_R_OK;
2359 API int pkgmgr_parser_update_app_splash_screen_display_info_in_db(
2360 const char *appid, int flag)
2362 return pkgmgr_parser_update_app_splash_screen_display_info_in_usr_db(
2363 appid, __getuid(), flag);
2366 static int __set_app_label(sqlite3 *db, const char *appid, const char *label)
2368 static const char query[] =
2369 "UPDATE package_app_localized_info SET app_label=? "
2370 "WHERE app_id=? AND app_label IS NOT NULL";
2375 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2376 if (ret != SQLITE_OK) {
2377 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2381 __BIND_TEXT(db, stmt, idx++, label);
2382 __BIND_TEXT(db, stmt, idx++, appid);
2384 ret = sqlite3_step(stmt);
2385 if (ret != SQLITE_DONE) {
2386 _LOGE("step failed: %s", sqlite3_errmsg(db));
2387 sqlite3_finalize(stmt);
2391 sqlite3_finalize(stmt);
2396 API int pkgmgr_parser_update_app_label_info_in_usr_db(const char *appid,
2397 uid_t uid, const char *label)
2403 if (appid == NULL) {
2404 _LOGE("invalid parameter");
2405 return PM_PARSER_R_EINVAL;
2408 dbpath = __get_parser_db_path(uid);
2410 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2411 if (ret != SQLITE_OK) {
2412 _LOGE("open db failed: %d", ret);
2413 return PM_PARSER_R_ERROR;
2416 __BEGIN_TRANSACTION(db);
2417 __DO_TRANSACTION(db, __set_app_label(db, appid, label));
2418 __END_TRANSACTION(db);
2420 sqlite3_close_v2(db);
2422 return PM_PARSER_R_OK;
2425 API int pkgmgr_parser_update_app_label_info_in_db(const char *appid,
2428 return pkgmgr_parser_update_app_label_info_in_usr_db(appid, __getuid(),
2432 static int __set_tep_path(sqlite3 *db, const char *pkgid, const char *tep_path)
2434 static const char query[] =
2435 "UPDATE package_info SET package_tep_name=? "
2441 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2442 if (ret != SQLITE_OK) {
2443 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2447 __BIND_TEXT(db, stmt, idx++, tep_path);
2448 __BIND_TEXT(db, stmt, idx++, pkgid);
2450 ret = sqlite3_step(stmt);
2451 if (ret != SQLITE_DONE) {
2452 _LOGE("step failed: %s", sqlite3_errmsg(db));
2453 sqlite3_finalize(stmt);
2457 sqlite3_finalize(stmt);
2462 API int pkgmgr_parser_update_tep_info_in_usr_db(const char *pkgid,
2463 const char *tep_path, uid_t uid)
2469 if (pkgid == NULL) {
2470 _LOGE("invalid parameter");
2471 return PM_PARSER_R_EINVAL;
2474 dbpath = __get_parser_db_path(uid);
2476 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2477 if (ret != SQLITE_OK) {
2478 _LOGE("open db failed: %d", ret);
2479 return PM_PARSER_R_ERROR;
2482 __BEGIN_TRANSACTION(db);
2483 __DO_TRANSACTION(db, __set_tep_path(db, pkgid, tep_path));
2484 __END_TRANSACTION(db);
2486 sqlite3_close_v2(db);
2488 return PM_PARSER_R_OK;
2491 API int pkgmgr_parser_update_tep_info_in_db(const char *pkgid,
2492 const char *tep_path)
2494 return pkgmgr_parser_update_tep_info_in_usr_db(pkgid, tep_path,
2498 static int __convert_update_type(pkgmgrinfo_updateinfo_update_type type,
2499 const char **update_type)
2501 if (type == PMINFO_UPDATEINFO_NONE)
2502 *update_type = PMINFO_UPDATEINFO_TYPE_NONE;
2503 else if (type == PMINFO_UPDATEINFO_FORCE)
2504 *update_type = PMINFO_UPDATEINFO_TYPE_FORCE;
2505 else if (type == PMINFO_UPDATEINFO_OPTIONAL)
2506 *update_type = PMINFO_UPDATEINFO_TYPE_OPTIONAL;
2512 static int __register_pkg_update_info(sqlite3 *db, updateinfo_x *info,
2513 const char *update_type)
2515 static const char query[] =
2516 "UPDATE package_update_info "
2517 "SET update_version=?, update_type=? "
2523 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2524 if (ret != SQLITE_OK) {
2525 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2529 __BIND_TEXT(db, stmt, idx++, info->version);
2530 __BIND_TEXT(db, stmt, idx++, update_type);
2531 __BIND_TEXT(db, stmt, idx++, info->pkgid);
2533 ret = sqlite3_step(stmt);
2534 if (ret != SQLITE_DONE) {
2535 _LOGE("step failed: %s", sqlite3_errmsg(db));
2536 sqlite3_finalize(stmt);
2540 sqlite3_finalize(stmt);
2545 API int pkgmgr_parser_register_pkg_update_info_in_usr_db(
2546 pkgmgrinfo_updateinfo_h handle, uid_t uid)
2549 updateinfo_x *update_info;
2550 updateinfo_x *prev_update_info;
2551 pkgmgrinfo_updateinfo_h prev_update_handle;
2552 pkgmgrinfo_pkginfo_h pkginfo;
2553 pkgmgrinfo_version_compare_type compare_result;
2555 const char *update_type;
2559 if (handle == NULL) {
2560 _LOGE("invalid parameter");
2561 return PM_PARSER_R_EINVAL;
2564 update_info = (updateinfo_x *)handle;
2565 if (update_info->pkgid == NULL || update_info->version == NULL)
2566 return PM_PARSER_R_EINVAL;
2567 if (__convert_update_type(update_info->type, &update_type) != 0)
2568 return PM_PARSER_R_EINVAL;
2570 ret = pkgmgrinfo_updateinfo_get_usr_updateinfo(update_info->pkgid,
2571 &prev_update_handle, uid);
2572 if (ret != PMINFO_R_OK)
2573 return PM_PARSER_R_ERROR;
2575 prev_update_info = (updateinfo_x *)prev_update_handle;
2576 ret = pkgmgrinfo_compare_package_version(update_info->version,
2577 prev_update_info->version, &compare_result);
2578 if (ret != PMINFO_R_OK) {
2579 pkgmgrinfo_updateinfo_destroy(prev_update_handle);
2580 return PM_PARSER_R_ERROR;
2583 if (compare_result == PMINFO_VERSION_SAME &&
2584 prev_update_info->type == PMINFO_UPDATEINFO_NONE) {
2585 _LOGI("Given update info version[%s] of pkgid[%s] "
2587 update_info->version, update_info->pkgid);
2588 pkgmgrinfo_updateinfo_destroy(prev_update_handle);
2589 return PM_PARSER_R_OK;
2591 pkgmgrinfo_updateinfo_destroy(prev_update_handle);
2593 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(update_info->pkgid, uid,
2595 if (ret != PMINFO_R_OK)
2596 return PM_PARSER_R_ERROR;
2598 ret = pkgmgrinfo_pkginfo_is_global(pkginfo, &is_global_pkg);
2599 if (ret != PMINFO_R_OK) {
2600 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
2601 return PM_PARSER_R_ERROR;
2603 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
2605 dbpath = __get_parser_db_path(is_global_pkg ? GLOBAL_USER : uid);
2607 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2608 if (ret != SQLITE_OK) {
2609 _LOGE("open db failed: %d", ret);
2610 return PM_PARSER_R_ERROR;
2613 __BEGIN_TRANSACTION(db);
2614 __DO_TRANSACTION(db, __register_pkg_update_info(db, update_info,
2616 __END_TRANSACTION(db);
2618 sqlite3_close_v2(db);
2620 return PM_PARSER_R_OK;
2623 API int pkgmgr_parser_register_pkg_update_info_in_db(
2624 pkgmgrinfo_updateinfo_h handle)
2626 return pkgmgr_parser_register_pkg_update_info_in_usr_db(handle,
2630 static int __unregister_pkg_update_info(sqlite3 *db, const char *pkgid)
2632 static const char query[] =
2633 "UPDATE package_update_info SET update_type='none' "
2639 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2640 if (ret != SQLITE_OK) {
2641 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2645 __BIND_TEXT(db, stmt, idx++, pkgid);
2647 ret = sqlite3_step(stmt);
2648 if (ret != SQLITE_DONE) {
2649 _LOGE("step failed: %s", sqlite3_errmsg(db));
2650 sqlite3_finalize(stmt);
2654 sqlite3_finalize(stmt);
2659 API int pkgmgr_parser_unregister_pkg_update_info_in_usr_db(const char *pkgid,
2665 pkgmgrinfo_pkginfo_h pkginfo;
2668 if (pkgid == NULL) {
2669 _LOGE("invalid parameter");
2670 return PM_PARSER_R_EINVAL;
2673 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &pkginfo);
2674 if (ret != PMINFO_R_OK)
2675 return PM_PARSER_R_EINVAL;
2677 ret = pkgmgrinfo_pkginfo_is_global(pkginfo, &is_global_pkg);
2678 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
2679 if (ret != PMINFO_R_OK)
2680 return PM_PARSER_R_ERROR;
2682 dbpath = __get_parser_db_path(is_global_pkg ? GLOBAL_USER : uid);
2684 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2685 if (ret != SQLITE_OK) {
2686 _LOGE("open db failed: %d", ret);
2687 return PM_PARSER_R_ERROR;
2690 __BEGIN_TRANSACTION(db);
2691 __DO_TRANSACTION(db, __unregister_pkg_update_info(db, pkgid));
2692 __END_TRANSACTION(db);
2694 sqlite3_close_v2(db);
2696 return PM_PARSER_R_OK;
2699 API int pkgmgr_parser_unregister_pkg_update_info_in_db(const char *pkgid)
2701 return pkgmgr_parser_unregister_pkg_update_info_in_usr_db(pkgid,
2705 static int __unregister_all_pkg_update_info(sqlite3 *db)
2707 static const char query[] =
2708 "UPDATE package_update_info SET update_type='none'";
2712 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2713 if (ret != SQLITE_OK) {
2714 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2718 ret = sqlite3_step(stmt);
2719 if (ret != SQLITE_DONE) {
2720 _LOGE("step failed: %s", sqlite3_errmsg(db));
2721 sqlite3_finalize(stmt);
2725 sqlite3_finalize(stmt);
2730 API int pkgmgr_parser_unregister_all_pkg_update_info_in_usr_db(uid_t uid)
2736 dbpath = __get_parser_db_path(uid);
2738 ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
2739 if (ret != SQLITE_OK) {
2740 _LOGE("open db failed: %d", ret);
2741 return PM_PARSER_R_ERROR;
2744 __BEGIN_TRANSACTION(db);
2745 __DO_TRANSACTION(db, __unregister_all_pkg_update_info(db));
2746 __END_TRANSACTION(db);
2748 sqlite3_close_v2(db);
2750 return PM_PARSER_R_OK;
2753 API int pkgmgr_parser_unregister_all_pkg_update_info_in_db(void)
2755 return pkgmgr_parser_unregister_all_pkg_update_info_in_usr_db(