10 #include <sys/smack.h>
11 #include <linux/limits.h>
18 #include <system_info.h>
20 #include "pkgmgr_parser.h"
21 #include "pkgmgrinfo_basic.h"
22 #include "pkgmgrinfo_private.h"
23 #include "pkgmgrinfo_debug.h"
24 #include "pkgmgr-info.h"
26 #define __BEGIN_TRANSACTION(db) \
28 if (sqlite3_exec(db, "BEGIN DEFERRED", NULL, NULL, NULL) != \
30 _LOGE("begin transaction failed: %s", sqlite3_errmsg(db)); \
35 #define __DO_TRANSACTION(db, func) \
38 _LOGE("transaction failed: %s, rollback", sqlite3_errmsg(db)); \
39 if (sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL) != \
41 _LOGE("roll back transaction failed: %s", \
42 sqlite3_errmsg(db)); \
47 #define __END_TRANSACTION(db) \
49 if (sqlite3_exec(db, "COMMIT", NULL, NULL, NULL) != \
51 _LOGE("commit failed: %s, rollback", sqlite3_errmsg(db)); \
52 if (sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL) != \
54 _LOGE("roll back transaction failed: %s", \
55 sqlite3_errmsg(db)); \
60 #define __BIND_TEXT(db, stmt, i, text) \
62 if (sqlite3_bind_text(stmt, i, text, -1, SQLITE_STATIC) != SQLITE_OK) {\
63 _LOGE("bind error(index %d): %s", i, sqlite3_errmsg(db)); \
64 sqlite3_finalize(stmt); \
69 #define __BIND_INT(db, stmt, i, int) \
71 if (sqlite3_bind_int(stmt, i, int) != SQLITE_OK) { \
72 _LOGE("bind error(index %d): %s", i, sqlite3_errmsg(db)); \
73 sqlite3_finalize(stmt); \
82 #define XXHDPI "xxhdpi"
92 #define XXHDPI_MIN 481
93 #define XXHDPI_MAX 600
95 static const char join_localized_info[] =
96 " LEFT OUTER JOIN package_localized_info"
97 " ON pi.package=package_localized_info.package"
98 " AND package_localized_info.package_locale=?";
99 static const char join_privilege_info[] =
100 " LEFT OUTER JOIN package_privilege_info"
101 " ON pi.package=package_privilege_info.package";
103 static int _get_filtered_query(pkgmgrinfo_filter_x *filter,
104 const char *locale, uid_t uid, char **query, GList **bind_params)
108 char buf[MAX_QUERY_LEN] = { '\0' };
109 char buf2[MAX_QUERY_LEN] = { '\0' };
110 char *condition = NULL;
116 snprintf(buf, sizeof(buf), "%s", " WHERE 1=1 ");
117 for (list = filter->list; list; list = list->next) {
118 joined |= __get_filter_condition(list->data, uid, &condition,
120 if (condition == NULL)
123 strncat(buf, " AND ", sizeof(buf) - strlen(buf) - 1);
125 strncat(buf, condition, sizeof(buf) - strlen(buf) - 1);
130 if (joined & E_PMINFO_PKGINFO_JOIN_LOCALIZED_INFO) {
131 strncat(buf2, join_localized_info, sizeof(buf2) - strlen(buf2) - 1);
132 *bind_params = g_list_append(*bind_params, strdup(locale));
134 if (joined & E_PMINFO_PKGINFO_JOIN_PRIVILEGE_INFO)
135 strncat(buf2, join_privilege_info, sizeof(buf2) - strlen(buf2) - 1);
137 size = strlen(buf2) + strlen(buf) + 1;
138 *query = (char *)calloc(1, size);
140 return PMINFO_R_ERROR;
141 snprintf(*query, size, "%s%s", buf2, buf);
146 static int __bind_params(sqlite3_stmt *stmt, GList *params)
148 GList *tmp_list = NULL;
152 if (stmt == NULL || params == NULL)
153 return PMINFO_R_EINVAL;
157 ret = sqlite3_bind_text(stmt, ++idx, (char *)tmp_list->data, -1, SQLITE_STATIC);
158 if (ret != SQLITE_OK)
159 return PMINFO_R_ERROR;
160 tmp_list = tmp_list->next;
166 static bool __check_package_storage_status(pkgmgrinfo_filter_x *tmp_filter)
168 GSList *tmp_list = NULL;
169 pkgmgrinfo_node_x *tmp_node = NULL;
172 property = _pminfo_pkginfo_convert_to_prop_bool(PMINFO_PKGINFO_PROP_PACKAGE_CHECK_STORAGE);
173 for (tmp_list = tmp_filter->list; tmp_list != NULL;
174 tmp_list = g_slist_next(tmp_list)) {
175 tmp_node = (pkgmgrinfo_node_x *)tmp_list->data;
176 if (property == tmp_node->prop) {
177 if (strcmp(tmp_node->value, "true") == 0)
186 static int _pkginfo_add_description_info_into_list(const char *locale,
187 char *record, GList **description)
191 info = calloc(1, sizeof(description_x));
193 LOGE("out of memory");
194 return PMINFO_R_ERROR;
196 info->lang = strdup(locale);
198 *description = g_list_prepend(*description, info);
203 static int _pkginfo_get_plugin_execution_info(sqlite3 *db, const char *pkgid,
206 static const char query_raw[] =
207 "SELECT appid, plugin_type, plugin_name FROM package_plugin_info "
214 query = sqlite3_mprintf(query_raw, pkgid);
216 LOGE("out of memory");
217 return PMINFO_R_ERROR;
220 ret = sqlite3_prepare_v2(db, query, strlen(query),
223 if (ret != SQLITE_OK) {
224 LOGE("prepare failed: %s", sqlite3_errmsg(db));
225 return PMINFO_R_ERROR;
228 while (sqlite3_step(stmt) == SQLITE_ROW) {
229 plugin = calloc(1, sizeof(plugin_x));
231 LOGE("out of memory");
232 sqlite3_finalize(stmt);
233 return PMINFO_R_ERROR;
235 plugin->pkgid = strdup(pkgid);
236 _save_column_str(stmt, 0, &plugin->appid);
237 _save_column_str(stmt, 1, &plugin->plugin_type);
238 _save_column_str(stmt, 2, &plugin->plugin_name);
239 *plugins = g_list_prepend(*plugins,
243 sqlite3_finalize(stmt);
248 static int _pkginfo_get_privilege(sqlite3 *db, const char *pkgid,
251 static const char query_raw[] =
252 "SELECT DISTINCT privilege, type FROM package_privilege_info "
257 privilege_x *privilege;
259 query = sqlite3_mprintf(query_raw, pkgid);
261 LOGE("out of memory");
262 return PMINFO_R_ERROR;
265 ret = sqlite3_prepare_v2(db, query, strlen(query),
268 if (ret != SQLITE_OK) {
269 LOGE("prepare failed: %s", sqlite3_errmsg(db));
270 return PMINFO_R_ERROR;
273 while (sqlite3_step(stmt) == SQLITE_ROW) {
274 privilege = calloc(1, sizeof(privilege_x));
276 LOGE("failed to alloc memory");
277 sqlite3_finalize(stmt);
278 return PMINFO_R_ERROR;
280 _save_column_str(stmt, 0, &privilege->value);
281 _save_column_str(stmt, 1, &privilege->type);
282 *privileges = g_list_prepend(*privileges,
283 (gpointer)privilege);
286 sqlite3_finalize(stmt);
291 static int _pkginfo_get_appdefined_privilege(sqlite3 *db, const char *pkgid,
294 static const char query_raw[] =
295 "SELECT DISTINCT privilege, license, type FROM "
296 "package_appdefined_privilege_info WHERE package=%Q";
300 appdefined_privilege_x *privilege;
302 query = sqlite3_mprintf(query_raw, pkgid);
304 LOGE("out of memory");
305 return PMINFO_R_ERROR;
308 ret = sqlite3_prepare_v2(db, query, strlen(query),
311 if (ret != SQLITE_OK) {
312 LOGE("prepare failed: %s", sqlite3_errmsg(db));
313 return PMINFO_R_ERROR;
316 while (sqlite3_step(stmt) == SQLITE_ROW) {
317 privilege = calloc(1, sizeof(appdefined_privilege_x));
319 LOGE("failed to alloc memory");
320 sqlite3_finalize(stmt);
321 return PMINFO_R_ERROR;
323 _save_column_str(stmt, 0, &privilege->value);
324 _save_column_str(stmt, 1, &privilege->license);
325 _save_column_str(stmt, 2, &privilege->type);
326 *privileges = g_list_prepend(*privileges,
327 (gpointer)privilege);
330 sqlite3_finalize(stmt);
335 static int _pkginfo_get_dependency(sqlite3 *db, const char *pkgid,
336 GList **dependencies)
338 static const char query_raw[] =
339 "SELECT DISTINCT depends_on, type, required_version "
340 "FROM package_dependency_info WHERE package=%Q";
344 dependency_x *dependency;
346 query = sqlite3_mprintf(query_raw, pkgid);
348 LOGE("out of memory");
349 return PMINFO_R_ERROR;
352 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
354 if (ret != SQLITE_OK) {
355 LOGE("prepare failed: %s", sqlite3_errmsg(db));
356 return PMINFO_R_ERROR;
359 while (sqlite3_step(stmt) == SQLITE_ROW) {
360 dependency = calloc(1, sizeof(dependency_x));
362 LOGE("failed to alloc memory");
363 sqlite3_finalize(stmt);
364 return PMINFO_R_ERROR;
366 _save_column_str(stmt, 0, &dependency->depends_on);
367 _save_column_str(stmt, 1, &dependency->type);
368 _save_column_str(stmt, 2, &dependency->required_version);
369 *dependencies = g_list_prepend(*dependencies,
370 (gpointer)dependency);
373 sqlite3_finalize(stmt);
378 static int _pkginfo_get_packages(sqlite3 *db, uid_t uid, const char *locale,
379 pkgmgrinfo_filter_x *filter, int flag, GHashTable *packages)
381 static const char query_raw[] =
382 "SELECT DISTINCT pi.package, pi.installed_storage, pi.external_path";
383 static const char query_basic[] =
384 ", pi.package_version, pi.install_location, "
385 "pi.package_removable, pi.package_preload, pi.package_readonly, "
386 "pi.package_update, pi.package_appsetting, pi.package_system, "
387 "pi.package_type, pi.package_size, pi.installed_time, "
388 "pi.storeclient_id, pi.mainapp_id, pi.package_url, pi.root_path, "
389 "pi.csc_path, pi.package_nodisplay, pi.package_api_version, "
390 "pi.package_support_disable, pi.package_tep_name, "
391 "pi.package_zip_mount_file, pi.package_support_mode";
392 static const char query_author[] =
393 ", pi.author_name, pi.author_email, pi.author_href";
394 static const char query_label[] =
396 "(SELECT package_label FROM package_localized_info WHERE pi.package=package AND package_locale=?), "
397 "(SELECT package_label FROM package_localized_info WHERE pi.package=package AND package_locale='No Locale'))";
398 static const char query_icon[] =
400 "(SELECT package_icon FROM package_localized_info WHERE pi.package=package AND package_locale=?), "
401 "(SELECT package_icon FROM package_localized_info WHERE pi.package=package AND package_locale='No Locale'))";
402 static const char query_description[] =
404 "(SELECT package_description FROM package_localized_info WHERE pi.package=package AND package_locale=?), "
405 "(SELECT package_description FROM package_localized_info WHERE pi.package=package AND package_locale='No Locale'))";
406 static const char query_from_clause[] = " FROM package_info as pi";
407 int ret = PMINFO_R_ERROR;
410 char *tmp_record = NULL;
411 char *constraints = NULL;
412 char query[MAX_QUERY_LEN] = { '\0' };
413 package_x *info = NULL;
414 author_x *author = NULL;
415 GList *bind_params = NULL;
417 sqlite3_stmt *stmt = NULL;
418 bool is_check_storage = true;
419 const uid_t global_user_uid = GLOBAL_USER;
421 dbpath = getUserPkgParserDBPathUID(uid);
423 return PMINFO_R_ERROR;
425 ret = __open_db(dbpath, &db, SQLITE_OPEN_READONLY);
426 if (ret != SQLITE_OK) {
427 _LOGD("failed to open db(%s): %d", dbpath, ret);
429 return PMINFO_R_ERROR;
433 is_check_storage = __check_package_storage_status(filter);
435 snprintf(query, MAX_QUERY_LEN - 1, "%s", query_raw);
436 if (flag & PMINFO_APPINFO_GET_BASICINFO)
437 strncat(query, query_basic, sizeof(query) - strlen(query) - 1);
438 if (flag & PMINFO_PKGINFO_GET_AUTHOR)
439 strncat(query, query_author, sizeof(query) - strlen(query) - 1);
440 if (flag & PMINFO_PKGINFO_GET_LABEL) {
441 strncat(query, query_label, sizeof(query) - strlen(query) - 1);
442 bind_params = g_list_append(bind_params, strdup(locale));
444 if (flag & PMINFO_PKGINFO_GET_ICON) {
445 strncat(query, query_icon, sizeof(query) - strlen(query) - 1);
446 bind_params = g_list_append(bind_params, strdup(locale));
448 if (flag & PMINFO_PKGINFO_GET_DESCRIPTION) {
449 strncat(query, query_description, sizeof(query) - strlen(query) - 1);
450 bind_params = g_list_append(bind_params, strdup(locale));
453 strncat(query, query_from_clause, sizeof(query) - strlen(query) - 1);
455 ret = _get_filtered_query(filter, locale, uid, &constraints, &bind_params);
456 if (ret != PMINFO_R_OK) {
457 LOGE("Failed to get WHERE clause");
462 strncat(query, constraints, sizeof(query) - strlen(query) - 1);
464 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
465 if (ret != SQLITE_OK) {
466 LOGE("prepare failed: %s", sqlite3_errmsg(db));
467 ret = PMINFO_R_ERROR;
471 ret = __bind_params(stmt, bind_params);
472 if (ret != SQLITE_OK) {
473 LOGE("Failed to bind parameters");
477 while (sqlite3_step(stmt) == SQLITE_ROW) {
478 info = calloc(1, sizeof(package_x));
480 LOGE("out of memory");
481 ret = PMINFO_R_ERROR;
484 info->locale = strdup(locale);
485 if (info->locale == NULL) {
486 LOGE("Out of memory");
487 ret = PMINFO_R_ERROR;
492 _save_column_str(stmt, idx++, &info->package);
493 _save_column_str(stmt, idx++, &info->installed_storage);
494 _save_column_str(stmt, idx++, &info->external_path);
496 if (flag & PMINFO_APPINFO_GET_BASICINFO) {
497 _save_column_str(stmt, idx++, &info->version);
498 _save_column_str(stmt, idx++, &info->installlocation);
499 _save_column_str(stmt, idx++, &info->removable);
500 _save_column_str(stmt, idx++, &info->preload);
501 _save_column_str(stmt, idx++, &info->readonly);
502 _save_column_str(stmt, idx++, &info->update);
503 _save_column_str(stmt, idx++, &info->appsetting);
504 _save_column_str(stmt, idx++, &info->system);
505 _save_column_str(stmt, idx++, &info->type);
506 _save_column_str(stmt, idx++, &info->package_size);
507 _save_column_str(stmt, idx++, &info->installed_time);
508 _save_column_str(stmt, idx++, &info->storeclient_id);
509 _save_column_str(stmt, idx++, &info->mainapp_id);
510 _save_column_str(stmt, idx++, &info->package_url);
511 _save_column_str(stmt, idx++, &info->root_path);
512 _save_column_str(stmt, idx++, &info->csc_path);
513 _save_column_str(stmt, idx++, &info->nodisplay_setting);
514 _save_column_str(stmt, idx++, &info->api_version);
515 _save_column_str(stmt, idx++, &info->support_disable);
516 _save_column_str(stmt, idx++, &info->tep_name);
517 _save_column_str(stmt, idx++, &info->zip_mount_file);
518 _save_column_str(stmt, idx++, &info->support_mode);
521 info->for_all_users =
522 strdup((uid != global_user_uid) ? "false" : "true");
524 if (_pkginfo_get_plugin_execution_info(db, info->package, &info->plugin)) {
525 ret = PMINFO_R_ERROR;
529 if (flag & PMINFO_PKGINFO_GET_AUTHOR) {
530 /* TODO : author should be retrieved at package_localized_info */
531 author = calloc(1, sizeof(author_x));
532 if (author == NULL) {
533 ret = PMINFO_R_ERROR;
536 _save_column_str(stmt, idx++, &author->text);
537 _save_column_str(stmt, idx++, &author->email);
538 _save_column_str(stmt, idx++, &author->href);
539 info->author = g_list_prepend(info->author, author);
542 if (flag & PMINFO_PKGINFO_GET_LABEL) {
544 _save_column_str(stmt, idx++, &tmp_record);
546 if (_add_label_info_into_list(locale, tmp_record, &info->label)) {
547 ret = PMINFO_R_ERROR;
552 if (flag & PMINFO_PKGINFO_GET_ICON) {
554 _save_column_str(stmt, idx++, &tmp_record);
555 if (_add_icon_info_into_list(locale, tmp_record, &info->icon)) {
556 ret = PMINFO_R_ERROR;
561 if (flag & PMINFO_PKGINFO_GET_DESCRIPTION) {
563 _save_column_str(stmt, idx++, &tmp_record);
564 if (_pkginfo_add_description_info_into_list(locale, tmp_record,
565 &info->description)) {
566 ret = PMINFO_R_ERROR;
571 if (flag & PMINFO_PKGINFO_GET_PRIVILEGE) {
572 if (_pkginfo_get_privilege(db, info->package,
573 &info->privileges)) {
574 ret = PMINFO_R_ERROR;
579 if (flag & PMINFO_PKGINFO_GET_APPDEFINED_PRIVILEGE) {
580 if (_pkginfo_get_appdefined_privilege(db, info->package,
581 &info->appdefined_privileges)) {
582 ret = PMINFO_R_ERROR;
587 if (flag & PMINFO_PKGINFO_GET_DEPENDENCY) {
588 if (_pkginfo_get_dependency(db, info->package,
589 &info->dependencies)) {
590 ret = PMINFO_R_ERROR;
595 if (is_check_storage &&
596 __pkginfo_check_installed_storage(info) != PMINFO_R_OK) {
597 ret = PMINFO_R_ERROR;
598 pkgmgrinfo_basic_free_package(info);
603 g_hash_table_insert(packages, (gpointer)info->package,
610 sqlite3_finalize(stmt);
615 if (ret != PMINFO_R_OK && info != NULL)
616 pkgmgrinfo_basic_free_package(info);
618 g_list_free_full(bind_params, free);
623 API int pkginfo_internal_filter_get_list(
624 sqlite3 *db, pkgmgrinfo_pkginfo_filter_h filter,
625 uid_t uid, const char *locale, GHashTable *pkginfo_list) {
628 if (filter == NULL || pkginfo_list == NULL) {
629 // TODO: print error log
630 return PMINFO_R_EINVAL;
633 ret = _pkginfo_get_packages(db, uid, locale, filter,
634 PMINFO_PKGINFO_GET_ALL, pkginfo_list);
635 if (ret == PMINFO_R_OK && uid != GLOBAL_USER)
636 ret = _pkginfo_get_packages(db, GLOBAL_USER, locale, filter,
637 PMINFO_PKGINFO_GET_ALL, pkginfo_list);
642 API int get_query_result(sqlite3 *db, const char *query,
643 GList **list, int *row, int *col) {
648 sqlite3_stmt *stmt = NULL;
651 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
652 if (ret != SQLITE_OK) {
653 LOGE("prepare failed: %s", sqlite3_errmsg(db));
654 return PMINFO_R_ERROR;
657 col_cnt = sqlite3_column_count(stmt);
659 while (sqlite3_step(stmt) == SQLITE_ROW) {
661 for (idx = 0; idx < col_cnt; ++idx) {
662 _save_column_str(stmt, idx, &result);
663 *list = g_list_append(*list, result);
671 sqlite3_finalize(stmt);
676 static int _get_depends_on(sqlite3 *db, const char *pkgid, GQueue **queue,
677 GHashTable **table, GList **pkg_list)
679 static const char query[] =
680 "SELECT package, depends_on, type, required_version "
681 "FROM package_dependency_info WHERE depends_on=?";
686 /* already checked */
687 if (!g_hash_table_insert(*table, strdup(pkgid), GINT_TO_POINTER(1)))
690 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
691 if (ret != SQLITE_OK) {
692 LOGE("prepare failed: %s", sqlite3_errmsg(db));
693 return PMINFO_R_ERROR;
696 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_STATIC);
697 if (ret != SQLITE_OK) {
698 LOGE("bind failed: %s", sqlite3_errmsg(db));
699 sqlite3_finalize(stmt);
700 return PMINFO_R_ERROR;
703 while (sqlite3_step(stmt) == SQLITE_ROW) {
704 req = calloc(1, sizeof(dependency_x));
706 LOGE("out of memory");
707 sqlite3_finalize(stmt);
708 return PMINFO_R_ERROR;
710 _save_column_str(stmt, 0, &req->pkgid);
711 _save_column_str(stmt, 1, &req->depends_on);
712 _save_column_str(stmt, 2, &req->type);
713 _save_column_str(stmt, 3, &req->required_version);
715 *pkg_list = g_list_prepend(*pkg_list, req);
716 g_queue_push_tail(*queue, strdup(req->pkgid));
719 sqlite3_finalize(stmt);
724 static void __free_depends_on(gpointer data)
726 struct dependency_x *dep = (struct dependency_x *)data;
728 free(dep->depends_on);
730 free(dep->required_version);
734 API int pkginfo_internal_filter_get_depends_on(sqlite3 *db, const char *pkgid,
741 queue = g_queue_new();
743 LOGE("out of memory");
744 return PMINFO_R_ERROR;
746 table = g_hash_table_new_full(g_str_hash, g_str_equal, free, NULL);
748 g_queue_push_tail(queue, strdup(pkgid));
749 while (!g_queue_is_empty(queue)) {
750 item = g_queue_pop_head(queue);
751 ret = _get_depends_on(db, item, &queue, &table, list);
753 if (ret != PMINFO_R_OK) {
754 LOGE("failed to get pkgs depends on %s", pkgid);
755 g_hash_table_destroy(table);
756 g_list_free_full(*list, __free_depends_on);
757 g_queue_free_full(queue, free);
758 return PMINFO_R_ERROR;
762 g_hash_table_destroy(table);
763 g_queue_free_full(queue, free);
767 static int __execute_query(sqlite3 *db, const char *query) {
769 sqlite3_stmt *stmt = NULL;
771 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
772 if (ret != SQLITE_OK) {
773 LOGE("prepare failed: %s", sqlite3_errmsg(db));
777 ret = sqlite3_step(stmt);
778 if (ret != SQLITE_DONE) {
779 LOGE("step failed: %s", sqlite3_errmsg(db));
780 sqlite3_finalize(stmt);
784 sqlite3_finalize(stmt);
789 API int execute_write_queries(sqlite3 *db, const char **queries, int len) {
792 __BEGIN_TRANSACTION(db);
793 for (i = 0; i < len; ++i) {
794 __DO_TRANSACTION(db, __execute_query(db, queries[i]));
796 __END_TRANSACTION(db);
798 // Is db handel freed by AbstractDBHandler?
799 // sqlite3_close_v2(db);
804 /*###############################################################################*/
806 static int __check_dpi(const char *dpi_char, int dpi_int)
808 if (dpi_char == NULL)
811 if (strcasecmp(dpi_char, LDPI) == 0) {
812 if (dpi_int >= LDPI_MIN && dpi_int <= LDPI_MAX)
816 } else if (strcasecmp(dpi_char, MDPI) == 0) {
817 if (dpi_int >= MDPI_MIN && dpi_int <= MDPI_MAX)
821 } else if (strcasecmp(dpi_char, HDPI) == 0) {
822 if (dpi_int >= HDPI_MIN && dpi_int <= HDPI_MAX)
826 } else if (strcasecmp(dpi_char, XHDPI) == 0) {
827 if (dpi_int >= XHDPI_MIN && dpi_int <= XHDPI_MAX)
831 } else if (strcasecmp(dpi_char, XXHDPI) == 0) {
832 if (dpi_int >= XXHDPI_MIN && dpi_int <= XXHDPI_MAX)
840 static void __find_appcontrol_splashscreen_with_dpi(gpointer data,
843 splashscreen_x *ss = (splashscreen_x *)data;
844 GList **list = (GList **)user_data;
848 if (ss->operation == NULL || ss->dpi == NULL)
851 ret = system_info_get_platform_int(
852 "http://tizen.org/feature/screen.dpi", &dpi);
853 if (ret != SYSTEM_INFO_ERROR_NONE)
856 if (__check_dpi(ss->dpi, dpi) != 0)
859 *list = g_list_prepend(*list, ss);
862 static void __find_appcontrol_splashscreen(gpointer data, gpointer user_data)
864 splashscreen_x *ss = (splashscreen_x *)data;
865 GList **list = (GList **)user_data;
866 splashscreen_x *ss_tmp;
869 if (ss->operation == NULL || ss->dpi)
872 for (tmp = *list; tmp; tmp = tmp->next) {
873 ss_tmp = (splashscreen_x *)tmp->data;
874 if (ss_tmp->operation
875 && strcmp(ss_tmp->operation, ss->operation) == 0
876 && strcmp(ss_tmp->orientation, ss->orientation) == 0)
880 *list = g_list_prepend(*list, ss);
883 static gint __compare_splashscreen_with_orientation_dpi(gconstpointer a,
886 splashscreen_x *ss = (splashscreen_x *)a;
887 const char *orientation = (const char *)b;
891 if (ss->operation || ss->dpi == NULL)
894 ret = system_info_get_platform_int(
895 "http://tizen.org/feature/screen.dpi", &dpi);
896 if (ret != SYSTEM_INFO_ERROR_NONE)
899 if (strcasecmp(ss->orientation, orientation) == 0 &&
900 __check_dpi(ss->dpi, dpi) == 0)
906 static gint __compare_splashscreen_with_orientation(gconstpointer a,
909 splashscreen_x *ss = (splashscreen_x *)a;
910 const char *orientation = (const char *)b;
912 if (ss->operation || ss->dpi)
915 if (strcasecmp(ss->orientation, orientation) == 0)
921 static splashscreen_x *__find_default_splashscreen(GList *splashscreens,
922 const char *orientation)
926 tmp = g_list_find_custom(splashscreens, orientation,
928 __compare_splashscreen_with_orientation_dpi);
930 return (splashscreen_x *)tmp->data;
932 tmp = g_list_find_custom(splashscreens, orientation,
933 (GCompareFunc)__compare_splashscreen_with_orientation);
935 return (splashscreen_x *)tmp->data;
940 static GList *__find_splashscreens(GList *splashscreens)
945 if (splashscreens == NULL)
948 g_list_foreach(splashscreens,
949 __find_appcontrol_splashscreen_with_dpi, &list);
950 g_list_foreach(splashscreens,
951 __find_appcontrol_splashscreen, &list);
953 ss = __find_default_splashscreen(splashscreens, "portrait");
955 list = g_list_prepend(list, ss);
956 ss = __find_default_splashscreen(splashscreens, "landscape");
958 list = g_list_prepend(list, ss);
963 static int __insert_splashscreen_info(sqlite3 *db, application_x *app,
966 static const char query[] =
967 "INSERT INTO package_app_splash_screen (app_id, src, type,"
968 " orientation, indicatordisplay, operation, color_depth) "
969 "VALUES (?, ?, ?, ?, ?, ?, ?)";
976 if (app->splashscreens == NULL)
982 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
983 if (ret != SQLITE_OK) {
984 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
988 for (tmp = ss_list; tmp; tmp = tmp->next) {
989 ss = (splashscreen_x *)tmp->data;
993 __BIND_TEXT(db, stmt, idx++, app->appid);
994 __BIND_TEXT(db, stmt, idx++, ss->src);
995 __BIND_TEXT(db, stmt, idx++, ss->type);
996 __BIND_TEXT(db, stmt, idx++, ss->orientation);
997 __BIND_TEXT(db, stmt, idx++, ss->indicatordisplay);
998 __BIND_TEXT(db, stmt, idx++, ss->operation);
999 __BIND_TEXT(db, stmt, idx++, ss->color_depth);
1001 ret = sqlite3_step(stmt);
1002 if (ret != SQLITE_DONE) {
1003 _LOGE("step failed: %s", sqlite3_errmsg(db));
1004 sqlite3_finalize(stmt);
1008 sqlite3_reset(stmt);
1011 sqlite3_finalize(stmt);
1016 static void __trimfunc(GList *trim_list)
1020 GList *list = g_list_first(trim_list);
1023 trim_data = (char *)list->data;
1026 if (strcmp(trim_data, prev) == 0) {
1027 trim_list = g_list_remove(trim_list,
1029 list = g_list_first(trim_list);
1038 list = g_list_next(list);
1042 static int __insert_package_appdefined_privilege_info(sqlite3 *db,
1045 static const char query[] =
1046 "INSERT INTO package_appdefined_privilege_info "
1047 "(package, privilege, license, type) "
1048 "VALUES (?, ?, ?, ?)";
1053 appdefined_privilege_x *priv;
1055 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1056 if (ret != SQLITE_OK) {
1057 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1061 for (tmp = mfx->appdefined_privileges; tmp; tmp = tmp->next) {
1062 priv = (appdefined_privilege_x *)tmp->data;
1067 __BIND_TEXT(db, stmt, idx++, mfx->package);
1068 __BIND_TEXT(db, stmt, idx++, priv->value);
1069 __BIND_TEXT(db, stmt, idx++, priv->license);
1070 __BIND_TEXT(db, stmt, idx++, priv->type);
1072 ret = sqlite3_step(stmt);
1073 if (ret != SQLITE_DONE) {
1074 _LOGE("step failed: %s", sqlite3_errmsg(db));
1075 sqlite3_finalize(stmt);
1078 sqlite3_reset(stmt);
1081 sqlite3_finalize(stmt);
1086 static int __insert_package_dependency_info(sqlite3 *db, manifest_x *mfx)
1088 static const char query[] =
1089 "INSERT INTO package_dependency_info"
1090 " (package, depends_on, type, required_version) "
1091 "VALUES (?, ?, ?, ?)";
1098 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1099 if (ret != SQLITE_OK) {
1100 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1104 for (tmp = mfx->dependencies; tmp; tmp = tmp->next) {
1105 dep = (dependency_x *)tmp->data;
1110 __BIND_TEXT(db, stmt, idx++, mfx->package);
1111 __BIND_TEXT(db, stmt, idx++, dep->depends_on);
1112 __BIND_TEXT(db, stmt, idx++, dep->type);
1113 __BIND_TEXT(db, stmt, idx++, dep->required_version);
1115 ret = sqlite3_step(stmt);
1116 if (ret != SQLITE_DONE) {
1117 _LOGE("step failed: %s", sqlite3_errmsg(db));
1118 sqlite3_finalize(stmt);
1121 sqlite3_reset(stmt);
1124 sqlite3_finalize(stmt);
1129 static int __insert_mainapp_localized_info(sqlite3 *db, application_x *app,
1130 const char *locale, const char *label, const char *icon)
1132 static const char query[] =
1133 "INSERT OR REPLACE INTO package_localized_info ("
1134 " package, package_locale, package_label, package_icon,"
1135 " package_description, package_license, package_author) "
1137 " COALESCE((SELECT package_label FROM package_localized_info"
1138 " WHERE package=? AND package_locale=?), ?),"
1139 " COALESCE((SELECT package_icon FROM package_localized_info"
1140 " WHERE package=? AND package_icon=?), ?),"
1141 " (SELECT package_description FROM package_localized_info"
1142 " WHERE package=? AND package_locale=?),"
1143 " (SELECT package_description FROM package_localized_info"
1144 " WHERE package=? AND package_locale=?),"
1145 " (SELECT package_description FROM package_localized_info"
1146 " WHERE package=? AND package_locale=?))";
1151 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1152 if (ret != SQLITE_OK) {
1153 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1157 __BIND_TEXT(db, stmt, idx++, app->package);
1158 __BIND_TEXT(db, stmt, idx++, locale);
1159 __BIND_TEXT(db, stmt, idx++, app->package);
1160 __BIND_TEXT(db, stmt, idx++, locale);
1161 __BIND_TEXT(db, stmt, idx++, label);
1162 __BIND_TEXT(db, stmt, idx++, app->package);
1163 __BIND_TEXT(db, stmt, idx++, locale);
1164 __BIND_TEXT(db, stmt, idx++, icon);
1165 __BIND_TEXT(db, stmt, idx++, app->package);
1166 __BIND_TEXT(db, stmt, idx++, locale);
1167 __BIND_TEXT(db, stmt, idx++, app->package);
1168 __BIND_TEXT(db, stmt, idx++, locale);
1169 __BIND_TEXT(db, stmt, idx++, app->package);
1170 __BIND_TEXT(db, stmt, idx++, locale);
1172 ret = sqlite3_step(stmt);
1173 if (ret != SQLITE_DONE) {
1174 _LOGE("step failed: %s", sqlite3_errmsg(db));
1175 sqlite3_finalize(stmt);
1179 sqlite3_finalize(stmt);
1184 static gint __comparefunc(gconstpointer a, gconstpointer b, gpointer userdata)
1186 if (a == NULL || b == NULL)
1188 if (strcmp((char *)a, (char *)b) == 0)
1190 if (strcmp((char *)a, (char *)b) < 0)
1192 if (strcmp((char *)a, (char *)b) > 0)
1197 static GList *__create_locale_list(GList *lbls, GList *lcns, GList *icns,
1198 GList *dcns, GList *aths)
1200 GList *locale = NULL;
1208 for (tmp = lbls; tmp; tmp = tmp->next) {
1209 lbl = (label_x *)tmp->data;
1213 locale = g_list_insert_sorted_with_data(
1214 locale, (gpointer)lbl->lang,
1215 __comparefunc, NULL);
1217 for (tmp = lcns; tmp; tmp = tmp->next) {
1218 lcn = (license_x *)tmp->data;
1222 locale = g_list_insert_sorted_with_data(
1223 locale, (gpointer)lcn->lang,
1224 __comparefunc, NULL);
1226 for (tmp = icns; tmp; tmp = tmp->next) {
1227 icn = (icon_x *)tmp->data;
1231 locale = g_list_insert_sorted_with_data(
1232 locale, (gpointer)icn->lang,
1233 __comparefunc, NULL);
1235 for (tmp = dcns; tmp; tmp = tmp->next) {
1236 dcn = (description_x *)tmp->data;
1240 locale = g_list_insert_sorted_with_data(
1241 locale, (gpointer)dcn->lang,
1242 __comparefunc, NULL);
1244 for (tmp = aths; tmp; tmp = tmp->next) {
1245 ath = (author_x *)tmp->data;
1249 locale = g_list_insert_sorted_with_data(
1250 locale, (gpointer)ath->lang,
1251 __comparefunc, NULL);
1257 static gint __check_icon_resolution(const char *orig_icon_path,
1258 char **new_icon_path)
1262 char *icon_filename;
1263 char modified_iconpath[BUFSIZE];
1264 char icon_path[BUFSIZE];
1268 if (orig_icon_path == NULL)
1271 ret = system_info_get_platform_int(
1272 "http://tizen.org/feature/screen.dpi", &dpi);
1273 if (ret != SYSTEM_INFO_ERROR_NONE)
1276 if (dpi >= LDPI_MIN && dpi <= LDPI_MAX) {
1277 dpi_path[0] = "LDPI";
1278 dpi_path[1] = "ldpi";
1279 } else if (dpi >= MDPI_MIN && dpi <= MDPI_MAX) {
1280 dpi_path[0] = "MDPI";
1281 dpi_path[1] = "mdpi";
1282 } else if (dpi >= HDPI_MIN && dpi <= HDPI_MAX) {
1283 dpi_path[0] = "HDPI";
1284 dpi_path[1] = "hdpi";
1285 } else if (dpi >= XHDPI_MIN && dpi <= XHDPI_MAX) {
1286 dpi_path[0] = "XHDPI";
1287 dpi_path[1] = "xhdpi";
1288 } else if (dpi >= XXHDPI_MIN && dpi <= XXHDPI_MAX) {
1289 dpi_path[0] = "XXHDPI";
1290 dpi_path[1] = "xxhdpi";
1292 _LOGE("Unidentified dpi[%d]", dpi);
1296 icon_filename = strrchr(orig_icon_path, '/');
1297 if (icon_filename == NULL)
1301 strlen(orig_icon_path) - (strlen(icon_filename) - 1),
1302 "%s", orig_icon_path);
1303 for (i = 0; i < 2; i++) {
1304 ret = snprintf(modified_iconpath, BUFSIZE - 1, "%s/%s%s",
1305 icon_path, dpi_path[i], icon_filename);
1306 if (ret < 0 || ret > BUFSIZE -1) {
1307 _LOGE("snprintf fail");
1310 if (access(modified_iconpath, F_OK) != -1) {
1311 /* if exists, return modified icon path */
1312 *new_icon_path = strdup(modified_iconpath);
1320 static gint __compare_icon(gconstpointer a, gconstpointer b)
1322 icon_x *icon = (icon_x *)a;
1325 if (icon->lang != NULL && strcasecmp(icon->lang, DEFAULT_LOCALE) != 0)
1328 if (icon->dpi != NULL)
1331 if (__check_icon_resolution(icon->text, &icon_path) == 0) {
1333 icon->text = icon_path;
1339 static gint __compare_icon_with_lang(gconstpointer a, gconstpointer b)
1341 icon_x *icon = (icon_x *)a;
1342 char *lang = (char *)b;
1345 if (icon->dpi != NULL)
1348 if (strcasecmp(icon->lang, lang) == 0) {
1349 if (strcasecmp(icon->lang, DEFAULT_LOCALE) == 0) {
1350 /* icon for no locale. check existance of
1351 * folder-hierachied default icons
1353 if (__check_icon_resolution(icon->text,
1356 icon->text = icon_path;
1365 static gint __compare_icon_with_dpi(gconstpointer a, gconstpointer b)
1367 icon_x *icon = (icon_x *)a;
1368 int dpi = GPOINTER_TO_INT(b);
1370 if (icon->lang != NULL && strcasecmp(icon->lang, DEFAULT_LOCALE) != 0)
1373 if (icon->dpi == NULL)
1376 if (__check_dpi(icon->dpi, dpi) == 0)
1382 static gint __compare_icon_with_lang_dpi(gconstpointer a, gconstpointer b)
1385 icon_x *icon = (icon_x *)a;
1386 char *lang = (char *)b;
1389 ret = system_info_get_platform_int(
1390 "http://tizen.org/feature/screen.dpi", &dpi);
1391 if (ret != SYSTEM_INFO_ERROR_NONE)
1394 if (strcasecmp(icon->lang, lang) == 0 &&
1395 __check_dpi(icon->dpi, dpi) == 0)
1401 static char *__find_icon(GList *icons, const char *lang)
1408 /* first, find icon whose locale and dpi with given lang and
1409 * system's dpi has matched
1411 tmp = g_list_find_custom(icons, lang,
1412 (GCompareFunc)__compare_icon_with_lang_dpi);
1414 icon = (icon_x *)tmp->data;
1415 return (char *)icon->text;
1418 /* if first has failed, find icon whose locale has matched */
1419 tmp = g_list_find_custom(icons, lang,
1420 (GCompareFunc)__compare_icon_with_lang);
1422 icon = (icon_x *)tmp->data;
1423 return (char *)icon->text;
1426 /* if second has failed, find icon whose dpi has matched with
1429 ret = system_info_get_platform_int(
1430 "http://tizen.org/feature/screen.dpi", &dpi);
1431 if (ret == SYSTEM_INFO_ERROR_NONE) {
1432 tmp = g_list_find_custom(icons, GINT_TO_POINTER(dpi),
1433 (GCompareFunc)__compare_icon_with_dpi);
1435 icon = (icon_x *)tmp->data;
1436 return (char *)icon->text;
1440 /* last, find default icon marked as "No Locale" */
1441 tmp = g_list_find_custom(icons, NULL, (GCompareFunc)__compare_icon);
1443 icon = (icon_x *)tmp->data;
1444 return (char *)icon->text;
1450 static void __extract_data(const char *locale, GList *lbls, GList *lcns,
1451 GList *icns, GList *dcns, GList *aths, char **label,
1452 char **license, char **icon, char **description, char **author)
1460 for (tmp = lbls; tmp; tmp = tmp->next) {
1461 lbl = (label_x *)tmp->data;
1465 if (strcmp(lbl->lang, locale) == 0) {
1466 *label = (char *)lbl->text;
1471 for (tmp = lcns; tmp; tmp = tmp->next) {
1472 lcn = (license_x *)tmp->data;
1476 if (strcmp(lcn->lang, locale) == 0) {
1477 *license = (char *)lcn->text;
1483 *icon = __find_icon(icns, locale);
1485 for (tmp = dcns; tmp; tmp = tmp->next) {
1486 dcn = (description_x *)tmp->data;
1490 if (strcmp(dcn->lang, locale) == 0) {
1491 *description = (char *)dcn->text;
1496 for (tmp = aths; tmp; tmp = tmp->next) {
1497 ath = (author_x *)tmp->data;
1501 if (strcmp(ath->lang, locale) == 0) {
1502 *author = (char *)ath->text;
1509 static int __insert_app_localized_info(sqlite3 *db, application_x *app)
1511 static const char query[] =
1512 "INSERT INTO package_app_localized_info (app_id, app_locale,"
1513 " app_label, app_icon) "
1514 "VALUES (?, ?, ?, ?)";
1524 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1525 if (ret != SQLITE_OK) {
1526 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1530 locales = __create_locale_list(app->label, NULL, app->icon, NULL, NULL);
1531 for (tmp = locales; tmp; tmp = tmp->next) {
1532 locale = (const char *)tmp->data;
1535 __extract_data(locale, app->label, NULL, app->icon, NULL, NULL,
1536 &label, NULL, &icon, NULL, NULL);
1537 if (!label && !icon)
1541 __BIND_TEXT(db, stmt, idx++, app->appid);
1542 __BIND_TEXT(db, stmt, idx++, locale);
1543 __BIND_TEXT(db, stmt, idx++, label);
1544 __BIND_TEXT(db, stmt, idx++, icon);
1546 ret = sqlite3_step(stmt);
1547 if (ret != SQLITE_DONE) {
1548 _LOGE("step failed: %s", sqlite3_errmsg(db));
1549 g_list_free(locales);
1550 sqlite3_finalize(stmt);
1554 sqlite3_reset(stmt);
1556 if (strcasecmp(app->mainapp, "true") == 0) {
1557 if (__insert_mainapp_localized_info(db, app, locale,
1559 _LOGE("insert mainapp localized info failed");
1563 g_list_free(locales);
1564 sqlite3_finalize(stmt);
1569 static int __insert_package_privilege_info(sqlite3 *db, manifest_x *mfx)
1571 static const char query[] =
1572 "INSERT INTO package_privilege_info (package, privilege, type) "
1580 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1581 if (ret != SQLITE_OK) {
1582 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1586 for (tmp = mfx->privileges; tmp; tmp = tmp->next) {
1587 priv = (privilege_x *)tmp->data;
1592 __BIND_TEXT(db, stmt, idx++, mfx->package);
1593 __BIND_TEXT(db, stmt, idx++, priv->value);
1594 __BIND_TEXT(db, stmt, idx++, priv->type);
1596 ret = sqlite3_step(stmt);
1597 if (ret != SQLITE_DONE) {
1598 _LOGE("step failed: %s", sqlite3_errmsg(db));
1599 sqlite3_finalize(stmt);
1602 sqlite3_reset(stmt);
1605 sqlite3_finalize(stmt);
1610 static int __insert_app_data_control_privilege_info(sqlite3 *db,
1611 datacontrol_x *datacontrol)
1613 static const char query[] =
1614 "INSERT INTO package_app_data_control_privilege (providerid,"
1615 " privilege, type) VALUES (?, ?, ?)";
1623 if (datacontrol == NULL)
1626 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1627 if (ret != SQLITE_OK) {
1628 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1632 for (privileges = datacontrol->privileges; privileges;
1633 privileges = privileges->next) {
1634 priv = (char *)privileges->data;
1639 __BIND_TEXT(db, stmt, idx++, datacontrol->providerid);
1640 __BIND_TEXT(db, stmt, idx++, priv);
1641 __BIND_TEXT(db, stmt, idx++, datacontrol->type);
1643 ret = sqlite3_step(stmt);
1644 if (ret != SQLITE_DONE) {
1645 _LOGE("step failed: %s", sqlite3_errmsg(db));
1646 sqlite3_finalize(stmt);
1650 sqlite3_reset(stmt);
1653 sqlite3_finalize(stmt);
1657 static int __insert_datacontrol_info(sqlite3 *db, application_x *app)
1659 static const char query[] =
1660 "INSERT INTO package_app_data_control (app_id, providerid,"
1661 " access, type, trusted) VALUES (?, ?, ?, ?, ?)";
1668 if (app->datacontrol == NULL)
1671 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1672 if (ret != SQLITE_OK) {
1673 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1677 for (tmp = app->datacontrol; tmp; tmp = tmp->next) {
1678 dc = (datacontrol_x *)tmp->data;
1682 __BIND_TEXT(db, stmt, idx++, app->appid);
1683 __BIND_TEXT(db, stmt, idx++, dc->providerid);
1684 __BIND_TEXT(db, stmt, idx++, dc->access);
1685 __BIND_TEXT(db, stmt, idx++, dc->type);
1686 __BIND_TEXT(db, stmt, idx++, dc->trusted);
1688 ret = sqlite3_step(stmt);
1689 if (ret != SQLITE_DONE) {
1690 _LOGE("step failed: %s", sqlite3_errmsg(db));
1691 sqlite3_finalize(stmt);
1695 if (dc->privileges &&
1696 __insert_app_data_control_privilege_info(db, dc)) {
1697 sqlite3_finalize(stmt);
1701 sqlite3_reset(stmt);
1704 sqlite3_finalize(stmt);
1709 static int __insert_category_info(sqlite3 *db, application_x *app)
1711 static const char query[] =
1712 "INSERT INTO package_app_app_category (app_id, category) "
1718 const char *category;
1720 if (app->category == NULL)
1723 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1724 if (ret != SQLITE_OK) {
1725 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1729 for (tmp = app->category; tmp; tmp = tmp->next) {
1730 category = (const char *)tmp->data;
1731 if (category == NULL)
1734 __BIND_TEXT(db, stmt, idx++, app->appid);
1735 __BIND_TEXT(db, stmt, idx++, category);
1737 ret = sqlite3_step(stmt);
1738 if (ret != SQLITE_DONE) {
1739 _LOGE("step failed: %s", sqlite3_errmsg(db));
1740 sqlite3_finalize(stmt);
1744 sqlite3_reset(stmt);
1747 sqlite3_finalize(stmt);
1752 static int __insert_metadata_info(sqlite3 *db, application_x *app)
1754 static const char query[] =
1755 "INSERT INTO package_app_app_metadata (app_id,"
1756 " md_key, md_value) VALUES (?, ?, ?)";
1763 if (app->metadata == NULL)
1766 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1767 if (ret != SQLITE_OK) {
1768 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1772 for (tmp = app->metadata; tmp; tmp = tmp->next) {
1773 md = (metadata_x *)tmp->data;
1777 __BIND_TEXT(db, stmt, idx++, app->appid);
1778 __BIND_TEXT(db, stmt, idx++, md->key);
1779 __BIND_TEXT(db, stmt, idx++, md->value);
1781 ret = sqlite3_step(stmt);
1782 if (ret != SQLITE_DONE) {
1783 _LOGE("step failed: %s", sqlite3_errmsg(db));
1784 sqlite3_finalize(stmt);
1788 sqlite3_reset(stmt);
1791 sqlite3_finalize(stmt);
1796 static int __insert_appcontrol_privilege_info(sqlite3 *db, const char *appid,
1799 static const char query[] =
1800 "INSERT INTO package_app_app_control_privilege (app_id,"
1801 " app_control, privilege) VALUES (?, ?, ?)";
1805 char app_control[BUFSIZE];
1812 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1813 if (ret != SQLITE_OK) {
1814 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1818 for (tmp = ac->privileges; tmp; tmp = tmp->next) {
1819 privilege = (char *)tmp->data;
1820 if (privilege == NULL || !strlen(privilege))
1824 snprintf(app_control, sizeof(app_control), "%s|%s|%s",
1825 ac->operation ? (strlen(ac->operation) > 0 ?
1826 ac->operation : "NULL") : "NULL",
1827 ac->uri ? (strlen(ac->uri) > 0 ?
1828 ac->uri : "NULL") : "NULL",
1829 ac->mime ? (strlen(ac->mime) > 0 ?
1830 ac->mime : "NULL") : "NULL");
1831 __BIND_TEXT(db, stmt, idx++, appid);
1832 __BIND_TEXT(db, stmt, idx++, app_control);
1833 __BIND_TEXT(db, stmt, idx++, privilege);
1835 ret = sqlite3_step(stmt);
1836 if (ret != SQLITE_DONE) {
1837 _LOGE("step failed: %s", sqlite3_errmsg(db));
1838 sqlite3_finalize(stmt);
1842 sqlite3_reset(stmt);
1845 sqlite3_finalize(stmt);
1850 static int __insert_appcontrol_info(sqlite3 *db, application_x *app)
1852 static const char query[] =
1853 "INSERT INTO package_app_app_control (app_id, app_control,"
1854 " visibility, app_control_id) "
1855 "VALUES (?, ?, ?, ?)";
1859 char app_control[BUFSIZE];
1863 if (app->appcontrol == NULL)
1866 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1867 if (ret != SQLITE_OK) {
1868 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1872 for (tmp = app->appcontrol; tmp; tmp = tmp->next) {
1873 ac = (appcontrol_x *)tmp->data;
1877 snprintf(app_control, sizeof(app_control), "%s|%s|%s",
1878 ac->operation ? (strlen(ac->operation) > 0 ?
1879 ac->operation : "NULL") : "NULL",
1880 ac->uri ? (strlen(ac->uri) > 0 ?
1881 ac->uri : "NULL") : "NULL",
1882 ac->mime ? (strlen(ac->mime) > 0 ?
1883 ac->mime : "NULL") : "NULL");
1884 __BIND_TEXT(db, stmt, idx++, app->appid);
1885 __BIND_TEXT(db, stmt, idx++, app_control);
1886 __BIND_TEXT(db, stmt, idx++, ac->visibility);
1887 __BIND_TEXT(db, stmt, idx++, ac->id);
1889 ret = sqlite3_step(stmt);
1890 if (ret != SQLITE_DONE) {
1891 _LOGE("step failed: %s", sqlite3_errmsg(db));
1892 sqlite3_finalize(stmt);
1896 if (__insert_appcontrol_privilege_info(db, app->appid, ac)) {
1897 sqlite3_finalize(stmt);
1901 sqlite3_reset(stmt);
1904 sqlite3_finalize(stmt);
1909 static const char *__get_bool(char *value, bool is_true)
1911 if (value != NULL) {
1912 if (!strcmp(value, ""))
1913 return (is_true) ? "true" : "false";
1917 return (is_true) ? "true" : "false";
1920 #define EFFECTIVE_APPID_KEY "http://tizen.org/metadata/effective-appid"
1921 static const char *__find_effective_appid(GList *metadata_list)
1926 for (tmp = metadata_list; tmp; tmp = tmp->next) {
1927 md = (metadata_x *)tmp->data;
1928 if (md == NULL || md->key == NULL)
1931 if (strcmp(md->key, EFFECTIVE_APPID_KEY) == 0) {
1940 static int __convert_background_category(GList *category_list)
1944 char *category_data;
1946 if (category_list == NULL)
1949 for (tmp = category_list; tmp; tmp = tmp->next) {
1950 category_data = (char *)tmp->data;
1951 if (category_data == NULL)
1953 if (!strcmp(category_data, APP_BG_CATEGORY_MEDIA_STR))
1954 ret |= APP_BG_CATEGORY_MEDIA_VAL;
1955 else if (!strcmp(category_data, APP_BG_CATEGORY_DOWNLOAD_STR))
1956 ret |= APP_BG_CATEGORY_DOWNLOAD_VAL;
1957 else if (!strcmp(category_data, APP_BG_CATEGORY_BGNETWORK_STR))
1958 ret |= APP_BG_CATEGORY_BGNETWORK_VAL;
1959 else if (!strcmp(category_data, APP_BG_CATEGORY_LOCATION_STR))
1960 ret |= APP_BG_CATEGORY_LOCATION_VAL;
1961 else if (!strcmp(category_data, APP_BG_CATEGORY_SENSOR_STR))
1962 ret |= APP_BG_CATEGORY_SENSOR_VAL;
1963 else if (!strcmp(category_data, APP_BG_CATEGORY_IOTCOMM_STR))
1964 ret |= APP_BG_CATEGORY_IOTCOMM_VAL;
1965 else if (!strcmp(category_data, APP_BG_CATEGORY_SYSTEM))
1966 ret |= APP_BG_CATEGORY_SYSTEM_VAL;
1968 _LOGE("Unidentified category [%s]", category_data);
1974 static int __insert_application_info(sqlite3 *db, manifest_x *mfx)
1976 static const char query[] =
1977 "INSERT INTO package_app_info (app_id, app_component,"
1978 " app_exec, app_nodisplay, app_type, app_onboot, app_multiple,"
1979 " app_autorestart, app_taskmanage, app_hwacceleration,"
1980 " app_screenreader, app_mainapp, app_recentimage,"
1981 " app_launchcondition, app_indicatordisplay, app_portraitimg,"
1982 " app_landscapeimg, app_guestmodevisibility,"
1983 " app_permissiontype, app_preload, app_submode,"
1984 " app_submode_mainid, app_installed_storage, app_process_pool,"
1985 " app_launch_mode, app_ui_gadget, app_support_mode,"
1986 " app_support_disable, component_type, package, app_tep_name,"
1987 " app_zip_mount_file, app_background_category,"
1988 " app_package_type, app_root_path, app_api_version,"
1989 " app_effective_appid, app_splash_screen_display,"
1990 " app_package_system, app_removable,"
1991 " app_package_installed_time, app_support_ambient,"
1992 " app_external_path, app_setup_appid) "
1994 " ?, LOWER(?), ?, LOWER(?), LOWER(?),"
1995 " LOWER(?), LOWER(?), ?,"
1999 " ?, LOWER(?), LOWER(?),"
2001 " COALESCE(?, 'single'), LOWER(?), ?,"
2002 " LOWER(?), ?, ?, ?,"
2006 " LOWER(?), LOWER(?),"
2015 const char *effective_appid;
2018 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2019 if (ret != SQLITE_OK) {
2020 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2024 for (tmp = mfx->application; tmp; tmp = tmp->next) {
2025 app = (application_x *)tmp->data;
2029 bg_category = __convert_background_category(
2030 app->background_category);
2031 effective_appid = __find_effective_appid(app->metadata);
2034 __BIND_TEXT(db, stmt, idx++, app->appid);
2035 __BIND_TEXT(db, stmt, idx++, app->component_type);
2036 __BIND_TEXT(db, stmt, idx++, app->exec);
2037 __BIND_TEXT(db, stmt, idx++, __get_bool(app->nodisplay, false));
2038 __BIND_TEXT(db, stmt, idx++, app->type);
2039 __BIND_TEXT(db, stmt, idx++, __get_bool(app->onboot, false));
2040 __BIND_TEXT(db, stmt, idx++, __get_bool(app->multiple, false));
2041 __BIND_TEXT(db, stmt, idx++,
2042 __get_bool(app->autorestart, false));
2043 __BIND_TEXT(db, stmt, idx++,
2044 __get_bool(app->taskmanage, false));
2045 __BIND_TEXT(db, stmt, idx++, app->hwacceleration);
2046 __BIND_TEXT(db, stmt, idx++, app->screenreader);
2047 __BIND_TEXT(db, stmt, idx++, __get_bool(app->mainapp, false));
2048 __BIND_TEXT(db, stmt, idx++, app->recentimage);
2049 __BIND_TEXT(db, stmt, idx++, app->launchcondition);
2050 __BIND_TEXT(db, stmt, idx++,
2051 __get_bool(app->indicatordisplay, true));
2052 __BIND_TEXT(db, stmt, idx++, app->portraitimg);
2053 __BIND_TEXT(db, stmt, idx++, app->landscapeimg);
2054 __BIND_TEXT(db, stmt, idx++,
2055 __get_bool(app->guestmode_visibility, true));
2056 __BIND_TEXT(db, stmt, idx++, app->permission_type);
2057 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->preload, false));
2058 __BIND_TEXT(db, stmt, idx++, __get_bool(app->submode, false));
2059 __BIND_TEXT(db, stmt, idx++, app->submode_mainid);
2060 __BIND_TEXT(db, stmt, idx++, mfx->installed_storage);
2061 __BIND_TEXT(db, stmt, idx++,
2062 __get_bool(app->process_pool, false));
2063 __BIND_TEXT(db, stmt, idx++, app->launch_mode);
2064 __BIND_TEXT(db, stmt, idx++, __get_bool(app->ui_gadget, false));
2065 __BIND_TEXT(db, stmt, idx++,
2066 app->support_mode ? app->support_mode : "0");
2067 __BIND_TEXT(db, stmt, idx++,
2068 __get_bool(mfx->support_disable, false));
2069 __BIND_TEXT(db, stmt, idx++, app->component_type);
2070 __BIND_TEXT(db, stmt, idx++, mfx->package);
2071 __BIND_TEXT(db, stmt, idx++, mfx->tep_name);
2072 __BIND_TEXT(db, stmt, idx++, mfx->zip_mount_file);
2073 __BIND_INT(db, stmt, idx++, bg_category);
2074 __BIND_TEXT(db, stmt, idx++, mfx->type ? mfx->type : "tpk");
2075 __BIND_TEXT(db, stmt, idx++, mfx->root_path);
2076 __BIND_TEXT(db, stmt, idx++, app->api_version);
2077 __BIND_TEXT(db, stmt, idx++, effective_appid);
2078 __BIND_TEXT(db, stmt, idx++,
2079 __get_bool(app->splash_screen_display, true));
2080 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->system, false));
2081 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->removable, false));
2082 __BIND_TEXT(db, stmt, idx++, mfx->installed_time);
2083 __BIND_TEXT(db, stmt, idx++,
2084 __get_bool(app->support_ambient, false));
2085 __BIND_TEXT(db, stmt, idx++, mfx->external_path);
2086 __BIND_TEXT(db, stmt, idx++, app->setup_appid);
2088 ret = sqlite3_step(stmt);
2089 if (ret != SQLITE_DONE) {
2090 _LOGE("step failed: %s", sqlite3_errmsg(db));
2091 sqlite3_finalize(stmt);
2095 sqlite3_reset(stmt);
2097 if (__insert_appcontrol_info(db, app)) {
2098 sqlite3_finalize(stmt);
2101 if (__insert_category_info(db, app)) {
2102 sqlite3_finalize(stmt);
2105 if (__insert_metadata_info(db, app)) {
2106 sqlite3_finalize(stmt);
2109 if (__insert_datacontrol_info(db, app)) {
2110 sqlite3_finalize(stmt);
2113 ss_list = __find_splashscreens(app->splashscreens);
2114 if (__insert_splashscreen_info(db, app, ss_list)) {
2115 g_list_free(ss_list);
2116 sqlite3_finalize(stmt);
2119 g_list_free(ss_list);
2120 if (__insert_app_localized_info(db, app)) {
2121 sqlite3_finalize(stmt);
2126 sqlite3_finalize(stmt);
2131 static int __insert_package_update_info(sqlite3 *db, manifest_x *mfx)
2133 static const char query[] =
2134 "INSERT INTO package_update_info (package, update_version) "
2140 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2141 if (ret != SQLITE_OK) {
2142 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2147 __BIND_TEXT(db, stmt, idx++, mfx->package);
2148 __BIND_TEXT(db, stmt, idx, mfx->version);
2149 ret = sqlite3_step(stmt);
2150 if (ret != SQLITE_DONE) {
2151 _LOGE("step failed: %s", sqlite3_errmsg(db));
2152 sqlite3_finalize(stmt);
2155 sqlite3_finalize(stmt);
2160 static int __insert_package_localized_info(sqlite3 *db, manifest_x *mfx)
2162 static const char query[] =
2163 "INSERT INTO package_localized_info (package, package_locale,"
2164 " package_label, package_icon, package_description,"
2165 " package_license, package_author) "
2166 "VALUES (?, ?, ?, ?, ?, ?, ?)";
2179 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2180 if (ret != SQLITE_OK) {
2181 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2185 locales = __create_locale_list(mfx->label, mfx->license, mfx->icon,
2186 mfx->description, mfx->author);
2187 for (tmp = locales; tmp; tmp = tmp->next) {
2188 locale = (const char *)tmp->data;
2194 __extract_data(locale, mfx->label, mfx->license, mfx->icon,
2195 mfx->description, mfx->author,
2196 &label, &license, &icon, &description, &author);
2197 if (!label && !license && !icon && !description && !author)
2201 __BIND_TEXT(db, stmt, idx++, mfx->package);
2202 __BIND_TEXT(db, stmt, idx++, locale);
2203 __BIND_TEXT(db, stmt, idx++, label);
2204 __BIND_TEXT(db, stmt, idx++, icon);
2205 __BIND_TEXT(db, stmt, idx++, description);
2206 __BIND_TEXT(db, stmt, idx++, license);
2207 __BIND_TEXT(db, stmt, idx++, author);
2209 ret = sqlite3_step(stmt);
2210 if (ret != SQLITE_DONE) {
2211 _LOGE("step failed: %s", sqlite3_errmsg(db));
2212 g_list_free(locales);
2213 sqlite3_finalize(stmt);
2217 sqlite3_reset(stmt);
2220 g_list_free(locales);
2221 sqlite3_finalize(stmt);
2226 static int __insert_package_info(sqlite3 *db, manifest_x *mfx)
2228 static const char query[] =
2229 "INSERT INTO package_info (package, package_type,"
2230 " package_version, package_api_version, package_tep_name,"
2231 " package_zip_mount_file, install_location, package_size,"
2232 " package_removable, package_preload, package_readonly,"
2233 " package_update, package_appsetting, package_nodisplay,"
2234 " package_system, author_name, author_email, author_href,"
2235 " installed_time, installed_storage, storeclient_id,"
2236 " mainapp_id, package_url, root_path, external_path,"
2237 " csc_path, package_support_mode, package_support_disable) "
2241 " LOWER(?), LOWER(?), LOWER(?),"
2242 " LOWER(?), LOWER(?), LOWER(?),"
2243 " LOWER(?), ?, ?, ?,"
2250 const char *author_name = NULL;
2251 const char *author_email = NULL;
2252 const char *author_href = NULL;
2254 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2255 if (ret != SQLITE_OK) {
2256 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2260 if (mfx->author && mfx->author->data) {
2261 author_name = ((author_x *)mfx->author->data)->text;
2262 author_email = ((author_x *)mfx->author->data)->email;
2263 author_href = ((author_x *)mfx->author->data)->href;
2266 __BIND_TEXT(db, stmt, idx++, mfx->package);
2267 __BIND_TEXT(db, stmt, idx++, mfx->type);
2268 __BIND_TEXT(db, stmt, idx++, mfx->version);
2269 __BIND_TEXT(db, stmt, idx++, mfx->api_version);
2270 __BIND_TEXT(db, stmt, idx++, mfx->tep_name);
2271 __BIND_TEXT(db, stmt, idx++, mfx->zip_mount_file);
2272 __BIND_TEXT(db, stmt, idx++, mfx->installlocation);
2273 __BIND_TEXT(db, stmt, idx++, mfx->package_size);
2274 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->removable, true));
2275 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->preload, false));
2276 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->readonly, false));
2277 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->update, false));
2278 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->appsetting, false));
2279 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->nodisplay_setting, false));
2280 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->system, false));
2281 __BIND_TEXT(db, stmt, idx++, author_name);
2282 __BIND_TEXT(db, stmt, idx++, author_email);
2283 __BIND_TEXT(db, stmt, idx++, author_href);
2284 __BIND_TEXT(db, stmt, idx++, mfx->installed_time);
2285 __BIND_TEXT(db, stmt, idx++, mfx->installed_storage);
2286 __BIND_TEXT(db, stmt, idx++, mfx->storeclient_id);
2287 __BIND_TEXT(db, stmt, idx++, mfx->mainapp_id);
2288 __BIND_TEXT(db, stmt, idx++, mfx->package_url);
2289 __BIND_TEXT(db, stmt, idx++, mfx->root_path);
2290 __BIND_TEXT(db, stmt, idx++, mfx->external_path);
2291 __BIND_TEXT(db, stmt, idx++, mfx->csc_path);
2292 __BIND_TEXT(db, stmt, idx++,
2293 mfx->support_mode ? mfx->support_mode : "0");
2294 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->support_disable, false));
2296 ret = sqlite3_step(stmt);
2297 if (ret != SQLITE_DONE) {
2298 _LOGE("step failed: %s", sqlite3_errmsg(db));
2299 sqlite3_finalize(stmt);
2303 sqlite3_finalize(stmt);
2305 if (__insert_package_update_info(db, mfx))
2307 if (__insert_package_localized_info(db, mfx))
2309 if (__insert_application_info(db, mfx))
2311 if (__insert_package_privilege_info(db, mfx))
2313 if (__insert_package_appdefined_privilege_info(db, mfx))
2315 if (__insert_package_dependency_info(db, mfx))
2321 static int __delete_package_info(sqlite3 *db, const char *pkgid)
2323 static const char query[] =
2324 "DELETE FROM package_info WHERE package=?";
2328 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2329 if (ret != SQLITE_OK) {
2330 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2334 __BIND_TEXT(db, stmt, 1, pkgid);
2336 ret = sqlite3_step(stmt);
2337 if (ret != SQLITE_DONE) {
2338 _LOGE("step failed: %s", sqlite3_errmsg(db));
2339 sqlite3_finalize(stmt);
2343 sqlite3_finalize(stmt);
2348 API int pkgmgr_parser_delete_pkg_info(sqlite3 *db, const char *package, uid_t uid)
2350 if (db == NULL || package == NULL) {
2351 _LOGE("invalid parameter");
2352 return PM_PARSER_R_EINVAL;
2355 __BEGIN_TRANSACTION(db);
2356 __DO_TRANSACTION(db, __delete_package_info(db, package));
2357 __END_TRANSACTION(db);
2359 return PM_PARSER_R_OK;
2362 API int pkgmgr_parser_update_pkg_info(sqlite3 *db, manifest_x *mfx, uid_t uid)
2364 if (db == NULL || mfx == NULL) {
2365 _LOGE("invalid parameter");
2366 return PM_PARSER_R_EINVAL;
2369 __BEGIN_TRANSACTION(db);
2370 __DO_TRANSACTION(db, __delete_package_info(db, mfx->package));
2371 __DO_TRANSACTION(db, __insert_package_info(db, mfx));
2372 __END_TRANSACTION(db);
2374 sqlite3_close_v2(db);
2376 return PM_PARSER_R_OK;
2379 API int pkgmgr_parser_insert_pkg_info(sqlite3 *db, manifest_x *mfx, uid_t uid)
2381 if (db == NULL || mfx == NULL) {
2382 _LOGE("invalid parameter");
2383 return PM_PARSER_R_EINVAL;
2386 __BEGIN_TRANSACTION(db);
2387 __DO_TRANSACTION(db, __insert_package_info(db, mfx));
2388 __END_TRANSACTION(db);
2390 sqlite3_close_v2(db);
2392 return PM_PARSER_R_OK;