2 * Copyright (c) 2021 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.
24 #include <sys/smack.h>
25 #include <linux/limits.h>
32 #include <system_info.h>
34 #include "pkgmgr_parser.h"
35 #include "pkgmgrinfo_basic.h"
36 #include "pkgmgrinfo_internal.h"
37 #include "pkgmgrinfo_private.h"
38 #include "pkgmgrinfo_debug.h"
39 #include "pkgmgr-info.h"
45 #define XXHDPI "xxhdpi"
55 #define XXHDPI_MIN 481
56 #define XXHDPI_MAX 600
58 static const char join_localized_info[] =
59 " LEFT OUTER JOIN package_localized_info"
60 " ON pi.package=package_localized_info.package"
61 " AND package_localized_info.package_locale=?";
62 static const char join_privilege_info[] =
63 " LEFT OUTER JOIN package_privilege_info"
64 " ON pi.package=package_privilege_info.package";
65 static const char join_res_info[] =
66 " LEFT OUTER JOIN package_res_info"
67 " ON pi.package=package_res_info.package";
69 static int _get_filtered_query(pkgmgrinfo_filter_x *filter,
70 const char *locale, uid_t uid,
71 char **query, GList **bind_params)
75 char buf[MAX_QUERY_LEN] = { '\0' };
76 char buf2[MAX_QUERY_LEN] = { '\0' };
77 char *condition = NULL;
83 if (g_slist_length(filter->list) == 0) {
84 joined = E_PMINFO_PKGINFO_JOIN_LOCALIZED_INFO |
85 E_PMINFO_PKGINFO_JOIN_PRIVILEGE_INFO |
86 E_PMINFO_PKGINFO_JOIN_RES_INFO;
89 snprintf(buf, sizeof(buf), "%s", " WHERE 1=1 ");
90 for (list = filter->list; list; list = list->next) {
91 joined |= __get_filter_condition(list->data, uid, &condition,
93 if (condition == NULL)
96 strncat(buf, " AND ", sizeof(buf) - strlen(buf) - 1);
98 strncat(buf, condition, sizeof(buf) - strlen(buf) - 1);
103 if (joined & E_PMINFO_PKGINFO_JOIN_LOCALIZED_INFO) {
104 strncat(buf2, join_localized_info,
105 sizeof(buf2) - strlen(buf2) - 1);
106 *bind_params = g_list_append(*bind_params, strdup(locale));
108 if (joined & E_PMINFO_PKGINFO_JOIN_PRIVILEGE_INFO)
109 strncat(buf2, join_privilege_info,
110 sizeof(buf2) - strlen(buf2) - 1);
111 if (joined & E_PMINFO_PKGINFO_JOIN_RES_INFO)
112 strncat(buf2, join_res_info,
113 sizeof(buf2) - strlen(buf2) - 1);
115 size = strlen(buf2) + strlen(buf) + 1;
116 *query = (char *)calloc(1, size);
118 return PMINFO_R_ERROR;
119 snprintf(*query, size, "%s%s", buf2, buf);
124 static int __bind_params(sqlite3_stmt *stmt, GList *params)
126 GList *tmp_list = NULL;
130 if (stmt == NULL || params == NULL)
131 return PMINFO_R_EINVAL;
135 ret = sqlite3_bind_text(stmt, ++idx,
136 (char *)tmp_list->data, -1, SQLITE_STATIC);
137 if (ret != SQLITE_OK)
138 return PMINFO_R_ERROR;
139 tmp_list = tmp_list->next;
145 static bool __check_package_storage_status(pkgmgrinfo_filter_x *tmp_filter)
147 GSList *tmp_list = NULL;
148 pkgmgrinfo_node_x *tmp_node = NULL;
151 property = _pminfo_pkginfo_convert_to_prop_bool(
152 PMINFO_PKGINFO_PROP_PACKAGE_CHECK_STORAGE);
153 for (tmp_list = tmp_filter->list; tmp_list != NULL;
154 tmp_list = g_slist_next(tmp_list)) {
155 tmp_node = (pkgmgrinfo_node_x *)tmp_list->data;
156 if (property == tmp_node->prop) {
157 if (strcmp(tmp_node->value, "true") == 0)
166 static int _pkginfo_add_description_info_into_list(const char *locale,
167 char *record, GList **description)
171 info = calloc(1, sizeof(description_x));
173 LOGE("out of memory");
174 return PMINFO_R_ERROR;
176 info->lang = strdup(locale);
178 *description = g_list_prepend(*description, info);
183 static int _pkginfo_get_plugin_execution_info(sqlite3 *db, const char *pkgid,
186 static const char query_raw[] =
187 "SELECT appid, plugin_type, plugin_name FROM package_plugin_info "
194 query = sqlite3_mprintf(query_raw, pkgid);
196 LOGE("out of memory");
197 return PMINFO_R_ERROR;
200 ret = sqlite3_prepare_v2(db, query, strlen(query),
203 if (ret != SQLITE_OK) {
204 LOGE("prepare failed: %s", sqlite3_errmsg(db));
205 return PMINFO_R_ERROR;
208 while (sqlite3_step(stmt) == SQLITE_ROW) {
209 plugin = calloc(1, sizeof(plugin_x));
211 LOGE("out of memory");
212 sqlite3_finalize(stmt);
213 return PMINFO_R_ERROR;
215 plugin->pkgid = strdup(pkgid);
216 _save_column_str(stmt, 0, &plugin->appid);
217 _save_column_str(stmt, 1, &plugin->plugin_type);
218 _save_column_str(stmt, 2, &plugin->plugin_name);
219 *plugins = g_list_prepend(*plugins,
223 sqlite3_finalize(stmt);
228 static int _pkginfo_get_privilege(sqlite3 *db, const char *pkgid,
231 static const char query_raw[] =
232 "SELECT DISTINCT privilege, type FROM package_privilege_info "
237 privilege_x *privilege;
239 query = sqlite3_mprintf(query_raw, pkgid);
241 LOGE("out of memory");
242 return PMINFO_R_ERROR;
245 ret = sqlite3_prepare_v2(db, query, strlen(query),
248 if (ret != SQLITE_OK) {
249 LOGE("prepare failed: %s", sqlite3_errmsg(db));
250 return PMINFO_R_ERROR;
253 while (sqlite3_step(stmt) == SQLITE_ROW) {
254 privilege = calloc(1, sizeof(privilege_x));
256 LOGE("failed to alloc memory");
257 sqlite3_finalize(stmt);
258 return PMINFO_R_ERROR;
260 _save_column_str(stmt, 0, &privilege->value);
261 _save_column_str(stmt, 1, &privilege->type);
262 *privileges = g_list_prepend(*privileges,
263 (gpointer)privilege);
266 sqlite3_finalize(stmt);
271 static int _pkginfo_get_appdefined_privilege(sqlite3 *db, const char *pkgid,
274 static const char query_raw[] =
275 "SELECT DISTINCT privilege, license, type FROM "
276 "package_appdefined_privilege_info WHERE package=%Q";
280 appdefined_privilege_x *privilege;
282 query = sqlite3_mprintf(query_raw, pkgid);
284 LOGE("out of memory");
285 return PMINFO_R_ERROR;
288 ret = sqlite3_prepare_v2(db, query, strlen(query),
291 if (ret != SQLITE_OK) {
292 LOGE("prepare failed: %s", sqlite3_errmsg(db));
293 return PMINFO_R_ERROR;
296 while (sqlite3_step(stmt) == SQLITE_ROW) {
297 privilege = calloc(1, sizeof(appdefined_privilege_x));
299 LOGE("failed to alloc memory");
300 sqlite3_finalize(stmt);
301 return PMINFO_R_ERROR;
303 _save_column_str(stmt, 0, &privilege->value);
304 _save_column_str(stmt, 1, &privilege->license);
305 _save_column_str(stmt, 2, &privilege->type);
306 *privileges = g_list_prepend(*privileges,
307 (gpointer)privilege);
310 sqlite3_finalize(stmt);
315 static int _pkginfo_get_dependency(sqlite3 *db, const char *pkgid,
316 GList **dependencies)
318 static const char query_raw[] =
319 "SELECT DISTINCT depends_on, type, required_version "
320 "FROM package_dependency_info WHERE package=%Q";
324 dependency_x *dependency;
326 query = sqlite3_mprintf(query_raw, pkgid);
328 LOGE("out of memory");
329 return PMINFO_R_ERROR;
332 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
334 if (ret != SQLITE_OK) {
335 LOGE("prepare failed: %s", sqlite3_errmsg(db));
336 return PMINFO_R_ERROR;
339 while (sqlite3_step(stmt) == SQLITE_ROW) {
340 dependency = calloc(1, sizeof(dependency_x));
342 LOGE("failed to alloc memory");
343 sqlite3_finalize(stmt);
344 return PMINFO_R_ERROR;
346 _save_column_str(stmt, 0, &dependency->depends_on);
347 _save_column_str(stmt, 1, &dependency->type);
348 _save_column_str(stmt, 2, &dependency->required_version);
349 *dependencies = g_list_prepend(*dependencies,
350 (gpointer)dependency);
353 sqlite3_finalize(stmt);
358 static int _pkginfo_get_res_allowed_packages(sqlite3 *db, const char *pkgid,
359 GList **allowed_packages)
361 static const char query_raw[] =
362 "SELECT DISTINCT allowed_package, required_privilege "
363 "FROM package_res_allowed_package WHERE package=%Q";
369 res_allowed_package_x *allowed_package_x;
372 query = sqlite3_mprintf(query_raw, pkgid);
374 LOGE("out of memory");
375 return PMINFO_R_ERROR;
378 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
380 if (ret != SQLITE_OK) {
381 LOGE("prepare failed: %s", sqlite3_errmsg(db));
382 return PMINFO_R_ERROR;
385 while (sqlite3_step(stmt) == SQLITE_ROW) {
386 allowed_package_x = NULL;
390 _save_column_str(stmt, 0, &package);
394 for (l = *allowed_packages; l; l = l->next) {
395 allowed_package_x = (res_allowed_package_x *)l->data;
396 if (!strcmp(package, (char *)l->data))
398 allowed_package_x = NULL;
401 if (allowed_package_x) {
404 allowed_package_x = calloc(1,
405 sizeof(res_allowed_package_x));
406 if (allowed_package_x == NULL) {
407 LOGE("failed to alloc memory");
408 sqlite3_finalize(stmt);
410 return PMINFO_R_ERROR;
412 allowed_package_x->allowed_package = package;
413 *allowed_packages = g_list_prepend(*allowed_packages,
414 (gpointer)allowed_package_x);
417 _save_column_str(stmt, 1, &privilege);
421 allowed_package_x->required_privileges = g_list_prepend(
422 allowed_package_x->required_privileges,
426 sqlite3_finalize(stmt);
431 static int _pkginfo_get_res_info(sqlite3 *db, const char *pkgid,
432 char **res_type, char **res_version,
433 GList **res_allowed_packages)
435 static const char query_raw[] =
436 "SELECT DISTINCT res_type, res_version "
437 "FROM package_res_info WHERE package=%Q";
442 query = sqlite3_mprintf(query_raw, pkgid);
444 LOGE("out of memory");
445 return PMINFO_R_ERROR;
448 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
450 if (ret != SQLITE_OK) {
451 LOGE("prepare failed: %s", sqlite3_errmsg(db));
452 return PMINFO_R_ERROR;
455 if (sqlite3_step(stmt) != SQLITE_ROW) {
456 sqlite3_finalize(stmt);
460 _save_column_str(stmt, 0, res_type);
461 _save_column_str(stmt, 1, res_version);
463 if (_pkginfo_get_res_allowed_packages(db, pkgid,
464 res_allowed_packages) != PMINFO_R_OK) {
465 sqlite3_finalize(stmt);
466 return PMINFO_R_ERROR;
469 sqlite3_finalize(stmt);
474 static int _pkginfo_get_packages(sqlite3 *db, uid_t uid, const char *locale,
475 pkgmgrinfo_filter_x *filter, int flag, GHashTable *packages)
477 static const char query_raw[] =
478 "SELECT DISTINCT pi.package, pi.installed_storage, pi.external_path";
479 static const char query_basic[] =
480 ", pi.package_version, pi.install_location, "
481 "pi.package_removable, pi.package_preload, pi.package_readonly, "
482 "pi.package_update, pi.package_appsetting, pi.package_system, "
483 "pi.package_type, pi.package_size, pi.installed_time, "
484 "pi.storeclient_id, pi.mainapp_id, pi.package_url, pi.root_path, "
485 "pi.csc_path, pi.package_nodisplay, pi.package_api_version, "
486 "pi.package_support_disable, pi.package_tep_name, "
487 "pi.package_zip_mount_file, pi.package_support_mode, pi.package_disable, "
488 "pi.light_user_switch_mode";
489 static const char query_author[] =
490 ", pi.author_name, pi.author_email, pi.author_href";
491 static const char query_label[] =
493 "(SELECT package_label FROM package_localized_info WHERE pi.package=package AND package_locale=?), "
494 "(SELECT package_label FROM package_localized_info WHERE pi.package=package AND package_locale='No Locale'))";
495 static const char query_icon[] =
497 "(SELECT package_icon FROM package_localized_info WHERE pi.package=package AND package_locale=?), "
498 "(SELECT package_icon FROM package_localized_info WHERE pi.package=package AND package_locale='No Locale'))";
499 static const char query_description[] =
501 "(SELECT package_description FROM package_localized_info WHERE pi.package=package AND package_locale=?), "
502 "(SELECT package_description FROM package_localized_info WHERE pi.package=package AND package_locale='No Locale'))";
503 static const char query_res_type[] =
504 ", (SELECT res_type FROM package_res_info WHERE pi.package=package)";
505 static const char query_res_version[] =
506 ", (SELECT res_version FROM package_res_info WHERE pi.package=package)";
507 static const char query_from_clause[] = " FROM package_info as pi";
508 int ret = PMINFO_R_ERROR;
510 char *tmp_record = NULL;
511 char *constraints = NULL;
512 char query[MAX_QUERY_LEN] = { '\0' };
513 package_x *info = NULL;
514 author_x *author = NULL;
515 GList *bind_params = NULL;
516 sqlite3_stmt *stmt = NULL;
517 bool is_check_storage = true;
518 const uid_t global_user_uid = GLOBAL_USER;
520 if (db == NULL || locale == NULL || filter == NULL) {
521 LOGE("Invalid parameter");
522 return PMINFO_R_EINVAL;
525 is_check_storage = __check_package_storage_status(filter);
527 snprintf(query, MAX_QUERY_LEN - 1, "%s", query_raw);
528 if (flag & PMINFO_APPINFO_GET_BASICINFO)
529 strncat(query, query_basic, sizeof(query) - strlen(query) - 1);
530 if (flag & PMINFO_PKGINFO_GET_AUTHOR)
531 strncat(query, query_author, sizeof(query) - strlen(query) - 1);
532 if (flag & PMINFO_PKGINFO_GET_LABEL) {
533 strncat(query, query_label, sizeof(query) - strlen(query) - 1);
534 bind_params = g_list_append(bind_params, strdup(locale));
536 if (flag & PMINFO_PKGINFO_GET_ICON) {
537 strncat(query, query_icon, sizeof(query) - strlen(query) - 1);
538 bind_params = g_list_append(bind_params, strdup(locale));
540 if (flag & PMINFO_PKGINFO_GET_DESCRIPTION) {
541 strncat(query, query_description,
542 sizeof(query) - strlen(query) - 1);
543 bind_params = g_list_append(bind_params, strdup(locale));
545 if (flag & PMINFO_PKGINFO_GET_RES_INFO) {
546 strncat(query, query_res_type,
547 sizeof(query) - strlen(query) - 1);
548 strncat(query, query_res_version,
549 sizeof(query) - strlen(query) - 1);
552 strncat(query, query_from_clause, sizeof(query) - strlen(query) - 1);
554 ret = _get_filtered_query(filter, locale, uid,
555 &constraints, &bind_params);
556 if (ret != PMINFO_R_OK) {
557 LOGE("Failed to get WHERE clause");
562 strncat(query, constraints, sizeof(query) - strlen(query) - 1);
564 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
565 if (ret != SQLITE_OK) {
566 LOGE("prepare failed: %s", sqlite3_errmsg(db));
567 ret = PMINFO_R_ERROR;
571 ret = __bind_params(stmt, bind_params);
572 if (ret != SQLITE_OK) {
573 LOGE("Failed to bind parameters");
577 while (sqlite3_step(stmt) == SQLITE_ROW) {
578 info = calloc(1, sizeof(package_x));
580 LOGE("out of memory");
581 ret = PMINFO_R_ERROR;
584 info->locale = strdup(locale);
585 if (info->locale == NULL) {
586 LOGE("Out of memory");
587 ret = PMINFO_R_ERROR;
592 _save_column_str(stmt, idx++, &info->package);
593 _save_column_str(stmt, idx++, &info->installed_storage);
594 _save_column_str(stmt, idx++, &info->external_path);
596 if (flag & PMINFO_APPINFO_GET_BASICINFO) {
597 _save_column_str(stmt, idx++, &info->version);
598 _save_column_str(stmt, idx++, &info->installlocation);
599 _save_column_str(stmt, idx++, &info->removable);
600 _save_column_str(stmt, idx++, &info->preload);
601 _save_column_str(stmt, idx++, &info->readonly);
602 _save_column_str(stmt, idx++, &info->update);
603 _save_column_str(stmt, idx++, &info->appsetting);
604 _save_column_str(stmt, idx++, &info->system);
605 _save_column_str(stmt, idx++, &info->type);
606 _save_column_str(stmt, idx++, &info->package_size);
607 _save_column_str(stmt, idx++, &info->installed_time);
608 _save_column_str(stmt, idx++, &info->storeclient_id);
609 _save_column_str(stmt, idx++, &info->mainapp_id);
610 _save_column_str(stmt, idx++, &info->package_url);
611 _save_column_str(stmt, idx++, &info->root_path);
612 _save_column_str(stmt, idx++, &info->csc_path);
613 _save_column_str(stmt, idx++, &info->nodisplay_setting);
614 _save_column_str(stmt, idx++, &info->api_version);
615 _save_column_str(stmt, idx++, &info->support_disable);
616 _save_column_str(stmt, idx++, &info->tep_name);
617 _save_column_str(stmt, idx++, &info->zip_mount_file);
618 _save_column_str(stmt, idx++, &info->support_mode);
619 _save_column_str(stmt, idx++, &info->is_disabled);
620 _save_column_str(stmt, idx++, &info->light_user_switch_mode);
623 info->for_all_users =
624 strdup((uid != global_user_uid) ? "false" : "true");
626 if (_pkginfo_get_plugin_execution_info(db,
627 info->package, &info->plugin)) {
628 ret = PMINFO_R_ERROR;
632 if (flag & PMINFO_PKGINFO_GET_AUTHOR) {
633 /* TODO : author should be retrieved at package_localized_info */
634 author = calloc(1, sizeof(author_x));
635 if (author == NULL) {
636 ret = PMINFO_R_ERROR;
639 _save_column_str(stmt, idx++, &author->text);
640 _save_column_str(stmt, idx++, &author->email);
641 _save_column_str(stmt, idx++, &author->href);
642 info->author = g_list_prepend(info->author, author);
645 if (flag & PMINFO_PKGINFO_GET_LABEL) {
647 _save_column_str(stmt, idx++, &tmp_record);
649 if (_add_label_info_into_list(locale,
650 tmp_record, &info->label)) {
651 ret = PMINFO_R_ERROR;
656 if (flag & PMINFO_PKGINFO_GET_ICON) {
658 _save_column_str(stmt, idx++, &tmp_record);
659 if (_add_icon_info_into_list(locale,
660 tmp_record, &info->icon)) {
661 ret = PMINFO_R_ERROR;
666 if (flag & PMINFO_PKGINFO_GET_DESCRIPTION) {
668 _save_column_str(stmt, idx++, &tmp_record);
669 if (_pkginfo_add_description_info_into_list(locale,
670 tmp_record, &info->description)) {
671 ret = PMINFO_R_ERROR;
676 if (flag & PMINFO_PKGINFO_GET_PRIVILEGE) {
677 if (_pkginfo_get_privilege(db, info->package,
678 &info->privileges)) {
679 ret = PMINFO_R_ERROR;
684 if (flag & PMINFO_PKGINFO_GET_APPDEFINED_PRIVILEGE) {
685 if (_pkginfo_get_appdefined_privilege(db, info->package,
686 &info->appdefined_privileges)) {
687 ret = PMINFO_R_ERROR;
692 if (flag & PMINFO_PKGINFO_GET_DEPENDENCY) {
693 if (_pkginfo_get_dependency(db, info->package,
694 &info->dependencies)) {
695 ret = PMINFO_R_ERROR;
700 if (flag & PMINFO_PKGINFO_GET_RES_INFO) {
701 if (_pkginfo_get_res_info(db, info->package,
704 &info->res_allowed_packages) < 0) {
705 ret = PMINFO_R_ERROR;
710 if (is_check_storage &&
711 __pkginfo_check_installed_storage(info) !=
713 ret = PMINFO_R_ERROR;
714 pkgmgrinfo_basic_free_package(info);
719 g_hash_table_insert(packages, (gpointer)info->package,
726 sqlite3_finalize(stmt);
731 if (ret != PMINFO_R_OK && info != NULL)
732 pkgmgrinfo_basic_free_package(info);
734 g_list_free_full(bind_params, free);
739 API int pkginfo_internal_filter_get_list(
740 sqlite3 *db, pkgmgrinfo_pkginfo_filter_h filter,
741 uid_t uid, const char *locale, GHashTable *pkginfo_list)
745 if (filter == NULL || pkginfo_list == NULL) {
746 LOGE("Invalid argument");
747 return PMINFO_R_EINVAL;
750 ret = _pkginfo_get_packages(db, uid, locale, filter,
751 PMINFO_PKGINFO_GET_ALL, pkginfo_list);
755 API int get_query_result(sqlite3 *db, const char *query, GList *param,
756 GList **list, int *row, int *col)
762 sqlite3_stmt *stmt = NULL;
765 if (db == NULL || query == NULL) {
766 LOGE("Invalid parameter");
767 return PMINFO_R_EINVAL;
770 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
771 if (ret != SQLITE_OK) {
772 LOGE("prepare failed: %s", sqlite3_errmsg(db));
773 return PMINFO_R_ERROR;
776 if (g_list_length(param) != 0) {
777 ret = __bind_params(stmt, param);
778 if (ret != PMINFO_R_OK) {
779 LOGE("failed to bind parameters: %s", sqlite3_errmsg(db));
780 sqlite3_finalize(stmt);
785 col_cnt = sqlite3_column_count(stmt);
787 while (sqlite3_step(stmt) == SQLITE_ROW) {
789 for (idx = 0; idx < col_cnt; ++idx) {
790 _save_column_str(stmt, idx, &result);
791 *list = g_list_append(*list, result);
799 sqlite3_finalize(stmt);
804 static int _get_depends_on(sqlite3 *db, const char *pkgid, GQueue **queue,
805 GHashTable **table, GList **pkg_list)
807 static const char query[] =
808 "SELECT package, depends_on, type, required_version "
809 "FROM package_dependency_info WHERE depends_on=?";
814 /* already checked */
815 if (!g_hash_table_insert(*table, strdup(pkgid), GINT_TO_POINTER(1)))
818 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
819 if (ret != SQLITE_OK) {
820 LOGE("prepare failed: %s", sqlite3_errmsg(db));
821 return PMINFO_R_ERROR;
824 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_STATIC);
825 if (ret != SQLITE_OK) {
826 LOGE("bind failed: %s", sqlite3_errmsg(db));
827 sqlite3_finalize(stmt);
828 return PMINFO_R_ERROR;
831 while (sqlite3_step(stmt) == SQLITE_ROW) {
832 req = calloc(1, sizeof(dependency_x));
834 LOGE("out of memory");
835 sqlite3_finalize(stmt);
836 return PMINFO_R_ERROR;
838 _save_column_str(stmt, 0, &req->pkgid);
839 _save_column_str(stmt, 1, &req->depends_on);
840 _save_column_str(stmt, 2, &req->type);
841 _save_column_str(stmt, 3, &req->required_version);
843 *pkg_list = g_list_prepend(*pkg_list, req);
844 g_queue_push_tail(*queue, strdup(req->pkgid));
847 sqlite3_finalize(stmt);
852 static void __free_depends_on(gpointer data)
854 struct dependency_x *dep = (struct dependency_x *)data;
857 free(dep->depends_on);
859 free(dep->required_version);
863 API int pkginfo_internal_filter_get_depends_on(sqlite3 *db, const char *pkgid,
871 if (db == NULL || pkgid == NULL) {
872 LOGE("Invalid parameter");
873 return PMINFO_R_EINVAL;
876 queue = g_queue_new();
878 LOGE("out of memory");
879 return PMINFO_R_ERROR;
881 table = g_hash_table_new_full(g_str_hash, g_str_equal, free, NULL);
883 g_queue_push_tail(queue, strdup(pkgid));
884 while (!g_queue_is_empty(queue)) {
885 item = g_queue_pop_head(queue);
886 ret = _get_depends_on(db, item, &queue, &table, list);
888 if (ret != PMINFO_R_OK) {
889 LOGE("failed to get pkgs depends on %s", pkgid);
890 g_hash_table_destroy(table);
891 g_list_free_full(*list, __free_depends_on);
892 g_queue_free_full(queue, free);
893 return PMINFO_R_ERROR;
897 g_hash_table_destroy(table);
898 g_queue_free_full(queue, free);
902 static int __execute_query(sqlite3 *db, const char *query, GList *param)
905 sqlite3_stmt *stmt = NULL;
907 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
908 if (ret != SQLITE_OK) {
909 LOGE("prepare failed: %s", sqlite3_errmsg(db));
913 if (g_list_length(param) != 0) {
914 ret = __bind_params(stmt, param);
915 if (ret != PMINFO_R_OK) {
916 LOGE("failed to bind parameters: %s", sqlite3_errmsg(db));
917 sqlite3_finalize(stmt);
922 ret = sqlite3_step(stmt);
923 if (ret != SQLITE_DONE && ret != SQLITE_OK) {
924 LOGE("step failed:%d %s", ret, sqlite3_errmsg(db));
925 sqlite3_finalize(stmt);
929 sqlite3_finalize(stmt);
934 API int execute_write_queries(sqlite3 *db, GList *queries, GList *params_list)
937 query_args *tmp_ptr = NULL;
939 if (db == NULL || queries == NULL) {
940 _LOGE("Invalid parameter");
941 return PMINFO_R_EINVAL;
944 __BEGIN_TRANSACTION(db);
945 for (i = 0; i < g_list_length(queries); ++i) {
946 tmp_ptr = (query_args *)g_list_nth_data(params_list, i);
947 if (tmp_ptr == NULL) {
948 _LOGE("Failed to get parameter list");
949 sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL);
950 return PMINFO_R_ERROR;
954 __execute_query(db, g_list_nth_data(queries, i),
957 __END_TRANSACTION(db);
962 static int __check_dpi(const char *dpi_char, int dpi_int)
964 if (dpi_char == NULL)
967 if (strcasecmp(dpi_char, LDPI) == 0) {
968 if (dpi_int >= LDPI_MIN && dpi_int <= LDPI_MAX)
972 } else if (strcasecmp(dpi_char, MDPI) == 0) {
973 if (dpi_int >= MDPI_MIN && dpi_int <= MDPI_MAX)
977 } else if (strcasecmp(dpi_char, HDPI) == 0) {
978 if (dpi_int >= HDPI_MIN && dpi_int <= HDPI_MAX)
982 } else if (strcasecmp(dpi_char, XHDPI) == 0) {
983 if (dpi_int >= XHDPI_MIN && dpi_int <= XHDPI_MAX)
987 } else if (strcasecmp(dpi_char, XXHDPI) == 0) {
988 if (dpi_int >= XXHDPI_MIN && dpi_int <= XXHDPI_MAX)
996 static void __find_appcontrol_splashscreen_with_dpi(gpointer data,
999 splashscreen_x *ss = (splashscreen_x *)data;
1000 GList **list = (GList **)user_data;
1004 if (ss->operation == NULL || ss->dpi == NULL)
1007 ret = system_info_get_platform_int(
1008 "http://tizen.org/feature/screen.dpi", &dpi);
1009 if (ret != SYSTEM_INFO_ERROR_NONE)
1012 if (__check_dpi(ss->dpi, dpi) != 0)
1015 *list = g_list_prepend(*list, ss);
1018 static void __find_appcontrol_splashscreen(gpointer data, gpointer user_data)
1020 splashscreen_x *ss = (splashscreen_x *)data;
1021 GList **list = (GList **)user_data;
1022 splashscreen_x *ss_tmp;
1025 if (ss->operation == NULL || ss->dpi)
1028 for (tmp = *list; tmp; tmp = tmp->next) {
1029 ss_tmp = (splashscreen_x *)tmp->data;
1030 if (ss_tmp->operation
1031 && strcmp(ss_tmp->operation, ss->operation) == 0
1032 && strcmp(ss_tmp->orientation, ss->orientation) == 0)
1036 *list = g_list_prepend(*list, ss);
1039 static gint __compare_splashscreen_with_orientation_dpi(gconstpointer a,
1042 splashscreen_x *ss = (splashscreen_x *)a;
1043 const char *orientation = (const char *)b;
1047 if (ss->operation || ss->dpi == NULL)
1050 ret = system_info_get_platform_int(
1051 "http://tizen.org/feature/screen.dpi", &dpi);
1052 if (ret != SYSTEM_INFO_ERROR_NONE)
1055 if (strcasecmp(ss->orientation, orientation) == 0 &&
1056 __check_dpi(ss->dpi, dpi) == 0)
1062 static gint __compare_splashscreen_with_orientation(gconstpointer a,
1065 splashscreen_x *ss = (splashscreen_x *)a;
1066 const char *orientation = (const char *)b;
1068 if (ss->operation || ss->dpi)
1071 if (strcasecmp(ss->orientation, orientation) == 0)
1077 static splashscreen_x *__find_default_splashscreen(GList *splashscreens,
1078 const char *orientation)
1082 tmp = g_list_find_custom(splashscreens, orientation,
1084 __compare_splashscreen_with_orientation_dpi);
1086 return (splashscreen_x *)tmp->data;
1088 tmp = g_list_find_custom(splashscreens, orientation,
1089 (GCompareFunc)__compare_splashscreen_with_orientation);
1091 return (splashscreen_x *)tmp->data;
1096 static GList *__find_splashscreens(GList *splashscreens)
1101 if (splashscreens == NULL)
1104 g_list_foreach(splashscreens,
1105 __find_appcontrol_splashscreen_with_dpi, &list);
1106 g_list_foreach(splashscreens,
1107 __find_appcontrol_splashscreen, &list);
1109 ss = __find_default_splashscreen(splashscreens, "portrait");
1111 list = g_list_prepend(list, ss);
1112 ss = __find_default_splashscreen(splashscreens, "landscape");
1114 list = g_list_prepend(list, ss);
1119 static int __insert_splashscreen_info(sqlite3 *db, application_x *app,
1122 static const char query[] =
1123 "INSERT INTO package_app_splash_screen (app_id, src, type,"
1124 " orientation, indicatordisplay, operation, color_depth) "
1125 "VALUES (?, ?, ?, ?, ?, ?, ?)";
1132 if (app->splashscreens == NULL)
1135 if (ss_list == NULL)
1138 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1139 if (ret != SQLITE_OK) {
1140 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1144 for (tmp = ss_list; tmp; tmp = tmp->next) {
1145 ss = (splashscreen_x *)tmp->data;
1149 __BIND_TEXT(db, stmt, idx++, app->appid);
1150 __BIND_TEXT(db, stmt, idx++, ss->src);
1151 __BIND_TEXT(db, stmt, idx++, ss->type);
1152 __BIND_TEXT(db, stmt, idx++, ss->orientation);
1153 __BIND_TEXT(db, stmt, idx++, ss->indicatordisplay);
1154 __BIND_TEXT(db, stmt, idx++, ss->operation);
1155 __BIND_TEXT(db, stmt, idx++, ss->color_depth);
1157 ret = sqlite3_step(stmt);
1158 if (ret != SQLITE_DONE) {
1159 _LOGE("step failed: %s", sqlite3_errmsg(db));
1160 sqlite3_finalize(stmt);
1164 sqlite3_reset(stmt);
1167 sqlite3_finalize(stmt);
1172 static void __trimfunc(GList *trim_list)
1176 GList *list = g_list_first(trim_list);
1179 trim_data = (char *)list->data;
1182 if (strcmp(trim_data, prev) == 0) {
1183 trim_list = g_list_remove(trim_list,
1185 list = g_list_first(trim_list);
1194 list = g_list_next(list);
1198 static int __insert_package_appdefined_privilege_info(sqlite3 *db,
1201 static const char query[] =
1202 "INSERT INTO package_appdefined_privilege_info "
1203 "(package, privilege, license, type) "
1204 "VALUES (?, ?, ?, ?)";
1209 appdefined_privilege_x *priv;
1211 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1212 if (ret != SQLITE_OK) {
1213 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1217 for (tmp = mfx->appdefined_privileges; tmp; tmp = tmp->next) {
1218 priv = (appdefined_privilege_x *)tmp->data;
1223 __BIND_TEXT(db, stmt, idx++, mfx->package);
1224 __BIND_TEXT(db, stmt, idx++, priv->value);
1225 __BIND_TEXT(db, stmt, idx++, priv->license);
1226 __BIND_TEXT(db, stmt, idx++, priv->type);
1228 ret = sqlite3_step(stmt);
1229 if (ret != SQLITE_DONE) {
1230 _LOGE("step failed: %s", sqlite3_errmsg(db));
1231 sqlite3_finalize(stmt);
1234 sqlite3_reset(stmt);
1237 sqlite3_finalize(stmt);
1242 static int __insert_package_dependency_info(sqlite3 *db, manifest_x *mfx)
1244 static const char query[] =
1245 "INSERT INTO package_dependency_info"
1246 " (package, depends_on, type, required_version) "
1247 "VALUES (?, ?, ?, ?)";
1254 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1255 if (ret != SQLITE_OK) {
1256 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1260 for (tmp = mfx->dependencies; tmp; tmp = tmp->next) {
1261 dep = (dependency_x *)tmp->data;
1266 __BIND_TEXT(db, stmt, idx++, mfx->package);
1267 __BIND_TEXT(db, stmt, idx++, dep->depends_on);
1268 __BIND_TEXT(db, stmt, idx++, dep->type);
1269 __BIND_TEXT(db, stmt, idx++, dep->required_version);
1271 ret = sqlite3_step(stmt);
1272 if (ret != SQLITE_DONE) {
1273 _LOGE("step failed: %s", sqlite3_errmsg(db));
1274 sqlite3_finalize(stmt);
1277 sqlite3_reset(stmt);
1280 sqlite3_finalize(stmt);
1285 static int __insert_mainapp_localized_info(sqlite3 *db, application_x *app,
1286 const char *locale, const char *label, const char *icon)
1288 static const char query[] =
1289 "INSERT OR REPLACE INTO package_localized_info ("
1290 " package, package_locale, package_label, package_icon,"
1291 " package_description, package_license, package_author) "
1293 " COALESCE((SELECT package_label FROM package_localized_info"
1294 " WHERE package=? AND package_locale=?), ?),"
1295 " COALESCE((SELECT package_icon FROM package_localized_info"
1296 " WHERE package=? AND package_icon=?), ?),"
1297 " (SELECT package_description FROM package_localized_info"
1298 " WHERE package=? AND package_locale=?),"
1299 " (SELECT package_description FROM package_localized_info"
1300 " WHERE package=? AND package_locale=?),"
1301 " (SELECT package_description FROM package_localized_info"
1302 " WHERE package=? AND package_locale=?))";
1307 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1308 if (ret != SQLITE_OK) {
1309 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1313 __BIND_TEXT(db, stmt, idx++, app->package);
1314 __BIND_TEXT(db, stmt, idx++, locale);
1315 __BIND_TEXT(db, stmt, idx++, app->package);
1316 __BIND_TEXT(db, stmt, idx++, locale);
1317 __BIND_TEXT(db, stmt, idx++, label);
1318 __BIND_TEXT(db, stmt, idx++, app->package);
1319 __BIND_TEXT(db, stmt, idx++, locale);
1320 __BIND_TEXT(db, stmt, idx++, icon);
1321 __BIND_TEXT(db, stmt, idx++, app->package);
1322 __BIND_TEXT(db, stmt, idx++, locale);
1323 __BIND_TEXT(db, stmt, idx++, app->package);
1324 __BIND_TEXT(db, stmt, idx++, locale);
1325 __BIND_TEXT(db, stmt, idx++, app->package);
1326 __BIND_TEXT(db, stmt, idx++, locale);
1328 ret = sqlite3_step(stmt);
1329 if (ret != SQLITE_DONE) {
1330 _LOGE("step failed: %s", sqlite3_errmsg(db));
1331 sqlite3_finalize(stmt);
1335 sqlite3_finalize(stmt);
1340 static gint __comparefunc(gconstpointer a, gconstpointer b, gpointer userdata)
1342 if (a == NULL || b == NULL)
1344 if (strcmp((char *)a, (char *)b) == 0)
1346 if (strcmp((char *)a, (char *)b) < 0)
1348 if (strcmp((char *)a, (char *)b) > 0)
1353 static GList *__create_locale_list(GList *lbls, GList *lcns, GList *icns,
1354 GList *dcns, GList *aths)
1356 GList *locale = NULL;
1364 for (tmp = lbls; tmp; tmp = tmp->next) {
1365 lbl = (label_x *)tmp->data;
1369 locale = g_list_insert_sorted_with_data(
1370 locale, (gpointer)lbl->lang,
1371 __comparefunc, NULL);
1373 for (tmp = lcns; tmp; tmp = tmp->next) {
1374 lcn = (license_x *)tmp->data;
1378 locale = g_list_insert_sorted_with_data(
1379 locale, (gpointer)lcn->lang,
1380 __comparefunc, NULL);
1382 for (tmp = icns; tmp; tmp = tmp->next) {
1383 icn = (icon_x *)tmp->data;
1387 locale = g_list_insert_sorted_with_data(
1388 locale, (gpointer)icn->lang,
1389 __comparefunc, NULL);
1391 for (tmp = dcns; tmp; tmp = tmp->next) {
1392 dcn = (description_x *)tmp->data;
1396 locale = g_list_insert_sorted_with_data(
1397 locale, (gpointer)dcn->lang,
1398 __comparefunc, NULL);
1400 for (tmp = aths; tmp; tmp = tmp->next) {
1401 ath = (author_x *)tmp->data;
1405 locale = g_list_insert_sorted_with_data(
1406 locale, (gpointer)ath->lang,
1407 __comparefunc, NULL);
1413 static gint __check_icon_resolution(const char *orig_icon_path,
1414 char **new_icon_path)
1418 char *icon_filename;
1419 char modified_iconpath[BUFSIZE];
1420 char icon_path[BUFSIZE];
1424 if (orig_icon_path == NULL)
1427 ret = system_info_get_platform_int(
1428 "http://tizen.org/feature/screen.dpi", &dpi);
1429 if (ret != SYSTEM_INFO_ERROR_NONE)
1432 if (dpi >= LDPI_MIN && dpi <= LDPI_MAX) {
1433 dpi_path[0] = "LDPI";
1434 dpi_path[1] = "ldpi";
1435 } else if (dpi >= MDPI_MIN && dpi <= MDPI_MAX) {
1436 dpi_path[0] = "MDPI";
1437 dpi_path[1] = "mdpi";
1438 } else if (dpi >= HDPI_MIN && dpi <= HDPI_MAX) {
1439 dpi_path[0] = "HDPI";
1440 dpi_path[1] = "hdpi";
1441 } else if (dpi >= XHDPI_MIN && dpi <= XHDPI_MAX) {
1442 dpi_path[0] = "XHDPI";
1443 dpi_path[1] = "xhdpi";
1444 } else if (dpi >= XXHDPI_MIN && dpi <= XXHDPI_MAX) {
1445 dpi_path[0] = "XXHDPI";
1446 dpi_path[1] = "xxhdpi";
1448 _LOGE("Unidentified dpi[%d]", dpi);
1452 icon_filename = strrchr(orig_icon_path, '/');
1453 if (icon_filename == NULL)
1457 strlen(orig_icon_path) - (strlen(icon_filename) - 1),
1458 "%s", orig_icon_path);
1459 for (i = 0; i < 2; i++) {
1460 ret = snprintf(modified_iconpath, BUFSIZE - 1, "%s/%s%s",
1461 icon_path, dpi_path[i], icon_filename);
1462 if (ret < 0 || ret > BUFSIZE - 1) {
1463 _LOGE("snprintf fail");
1466 if (access(modified_iconpath, F_OK) != -1) {
1467 /* if exists, return modified icon path */
1468 *new_icon_path = strdup(modified_iconpath);
1476 static gint __compare_icon(gconstpointer a, gconstpointer b)
1478 icon_x *icon = (icon_x *)a;
1481 if (icon->lang != NULL && strcasecmp(icon->lang, DEFAULT_LOCALE) != 0)
1484 if (icon->dpi != NULL)
1487 if (__check_icon_resolution(icon->text, &icon_path) == 0) {
1489 icon->text = icon_path;
1495 static gint __compare_icon_with_lang(gconstpointer a, gconstpointer b)
1497 icon_x *icon = (icon_x *)a;
1498 char *lang = (char *)b;
1501 if (icon->dpi != NULL)
1504 if (strcasecmp(icon->lang, lang) == 0) {
1505 if (strcasecmp(icon->lang, DEFAULT_LOCALE) == 0) {
1506 /* icon for no locale. check existance of
1507 * folder-hierachied default icons
1509 if (__check_icon_resolution(icon->text,
1512 icon->text = icon_path;
1521 static gint __compare_icon_with_dpi(gconstpointer a, gconstpointer b)
1523 icon_x *icon = (icon_x *)a;
1524 int dpi = GPOINTER_TO_INT(b);
1526 if (icon->lang != NULL && strcasecmp(icon->lang, DEFAULT_LOCALE) != 0)
1529 if (icon->dpi == NULL)
1532 if (__check_dpi(icon->dpi, dpi) == 0)
1538 static gint __compare_icon_with_lang_dpi(gconstpointer a, gconstpointer b)
1541 icon_x *icon = (icon_x *)a;
1542 char *lang = (char *)b;
1545 ret = system_info_get_platform_int(
1546 "http://tizen.org/feature/screen.dpi", &dpi);
1547 if (ret != SYSTEM_INFO_ERROR_NONE)
1550 if (strcasecmp(icon->lang, lang) == 0 &&
1551 __check_dpi(icon->dpi, dpi) == 0)
1557 static char *__find_icon(GList *icons, const char *lang)
1564 /* first, find icon whose locale and dpi with given lang and
1565 * system's dpi has matched
1567 tmp = g_list_find_custom(icons, lang,
1568 (GCompareFunc)__compare_icon_with_lang_dpi);
1570 icon = (icon_x *)tmp->data;
1571 return (char *)icon->text;
1574 /* if first has failed, find icon whose locale has matched */
1575 tmp = g_list_find_custom(icons, lang,
1576 (GCompareFunc)__compare_icon_with_lang);
1578 icon = (icon_x *)tmp->data;
1579 return (char *)icon->text;
1582 /* if second has failed, find icon whose dpi has matched with
1585 ret = system_info_get_platform_int(
1586 "http://tizen.org/feature/screen.dpi", &dpi);
1587 if (ret == SYSTEM_INFO_ERROR_NONE) {
1588 tmp = g_list_find_custom(icons, GINT_TO_POINTER(dpi),
1589 (GCompareFunc)__compare_icon_with_dpi);
1591 icon = (icon_x *)tmp->data;
1592 return (char *)icon->text;
1596 /* last, find default icon marked as "No Locale" */
1597 tmp = g_list_find_custom(icons, NULL, (GCompareFunc)__compare_icon);
1599 icon = (icon_x *)tmp->data;
1600 return (char *)icon->text;
1606 static void __extract_data(const char *locale, GList *lbls, GList *lcns,
1607 GList *icns, GList *dcns, GList *aths, char **label,
1608 char **license, char **icon, char **description, char **author)
1616 for (tmp = lbls; tmp; tmp = tmp->next) {
1617 lbl = (label_x *)tmp->data;
1621 if (strcmp(lbl->lang, locale) == 0) {
1622 *label = (char *)lbl->text;
1627 for (tmp = lcns; tmp; tmp = tmp->next) {
1628 lcn = (license_x *)tmp->data;
1632 if (strcmp(lcn->lang, locale) == 0) {
1633 *license = (char *)lcn->text;
1639 *icon = __find_icon(icns, locale);
1641 for (tmp = dcns; tmp; tmp = tmp->next) {
1642 dcn = (description_x *)tmp->data;
1646 if (strcmp(dcn->lang, locale) == 0) {
1647 *description = (char *)dcn->text;
1652 for (tmp = aths; tmp; tmp = tmp->next) {
1653 ath = (author_x *)tmp->data;
1657 if (strcmp(ath->lang, locale) == 0) {
1658 *author = (char *)ath->text;
1665 static int __insert_app_localized_info(sqlite3 *db, application_x *app)
1667 static const char query[] =
1668 "INSERT INTO package_app_localized_info (app_id, app_locale,"
1669 " app_label, app_icon) "
1670 "VALUES (?, ?, ?, ?)";
1680 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1681 if (ret != SQLITE_OK) {
1682 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1686 locales = __create_locale_list(app->label, NULL, app->icon, NULL, NULL);
1687 for (tmp = locales; tmp; tmp = tmp->next) {
1688 locale = (const char *)tmp->data;
1691 __extract_data(locale, app->label, NULL, app->icon, NULL, NULL,
1692 &label, NULL, &icon, NULL, NULL);
1693 if (!label && !icon)
1697 __BIND_TEXT(db, stmt, idx++, app->appid);
1698 __BIND_TEXT(db, stmt, idx++, locale);
1699 __BIND_TEXT(db, stmt, idx++, label);
1700 __BIND_TEXT(db, stmt, idx++, icon);
1702 ret = sqlite3_step(stmt);
1703 if (ret != SQLITE_DONE) {
1704 _LOGE("step failed: %s", sqlite3_errmsg(db));
1705 g_list_free(locales);
1706 sqlite3_finalize(stmt);
1710 sqlite3_reset(stmt);
1712 if (strcasecmp(app->mainapp, "true") == 0) {
1713 if (__insert_mainapp_localized_info(db, app, locale,
1715 _LOGE("insert mainapp localized info failed");
1719 g_list_free(locales);
1720 sqlite3_finalize(stmt);
1725 static int __insert_app_res_control(sqlite3 *db, application_x *app)
1727 static const char query[] =
1728 "INSERT INTO package_app_res_control (app_id, res_type,"
1729 " min_res_version, max_res_version, auto_close) "
1730 "VALUES (?, ?, ?, ?, ?)";
1737 if (app->res_control == NULL)
1740 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1741 if (ret != SQLITE_OK) {
1742 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1746 for (tmp = app->res_control; tmp; tmp = tmp->next) {
1747 rc = (res_control_x *)tmp->data;
1751 __BIND_TEXT(db, stmt, idx++, app->appid);
1752 __BIND_TEXT(db, stmt, idx++, rc->res_type);
1753 __BIND_TEXT(db, stmt, idx++, rc->min_res_version);
1754 __BIND_TEXT(db, stmt, idx++, rc->max_res_version);
1755 __BIND_TEXT(db, stmt, idx++, rc->auto_close);
1757 ret = sqlite3_step(stmt);
1758 if (ret != SQLITE_DONE) {
1759 _LOGE("step failed: %s", sqlite3_errmsg(db));
1760 sqlite3_finalize(stmt);
1764 sqlite3_reset(stmt);
1767 sqlite3_finalize(stmt);
1772 static int __insert_package_privilege_info(sqlite3 *db, manifest_x *mfx)
1774 static const char query[] =
1775 "INSERT INTO package_privilege_info (package, privilege, type) "
1783 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1784 if (ret != SQLITE_OK) {
1785 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1789 for (tmp = mfx->privileges; tmp; tmp = tmp->next) {
1790 priv = (privilege_x *)tmp->data;
1795 __BIND_TEXT(db, stmt, idx++, mfx->package);
1796 __BIND_TEXT(db, stmt, idx++, priv->value);
1797 __BIND_TEXT(db, stmt, idx++, priv->type);
1799 ret = sqlite3_step(stmt);
1800 if (ret != SQLITE_DONE) {
1801 _LOGE("step failed: %s", sqlite3_errmsg(db));
1802 sqlite3_finalize(stmt);
1805 sqlite3_reset(stmt);
1808 sqlite3_finalize(stmt);
1813 static int __insert_app_data_control_privilege_info(sqlite3 *db,
1814 datacontrol_x *datacontrol)
1816 static const char query[] =
1817 "INSERT INTO package_app_data_control_privilege (providerid,"
1818 " privilege, type) VALUES (?, ?, ?)";
1826 if (datacontrol == NULL)
1829 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1830 if (ret != SQLITE_OK) {
1831 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1835 for (privileges = datacontrol->privileges; privileges;
1836 privileges = privileges->next) {
1837 priv = (char *)privileges->data;
1842 __BIND_TEXT(db, stmt, idx++, datacontrol->providerid);
1843 __BIND_TEXT(db, stmt, idx++, priv);
1844 __BIND_TEXT(db, stmt, idx++, datacontrol->type);
1846 ret = sqlite3_step(stmt);
1847 if (ret != SQLITE_DONE) {
1848 _LOGE("step failed: %s", sqlite3_errmsg(db));
1849 sqlite3_finalize(stmt);
1853 sqlite3_reset(stmt);
1856 sqlite3_finalize(stmt);
1860 static int __insert_datacontrol_info(sqlite3 *db, application_x *app)
1862 static const char query[] =
1863 "INSERT INTO package_app_data_control (app_id, providerid,"
1864 " access, type, trusted) VALUES (?, ?, ?, ?, ?)";
1871 if (app->datacontrol == NULL)
1874 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1875 if (ret != SQLITE_OK) {
1876 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1880 for (tmp = app->datacontrol; tmp; tmp = tmp->next) {
1881 dc = (datacontrol_x *)tmp->data;
1885 __BIND_TEXT(db, stmt, idx++, app->appid);
1886 __BIND_TEXT(db, stmt, idx++, dc->providerid);
1887 __BIND_TEXT(db, stmt, idx++, dc->access);
1888 __BIND_TEXT(db, stmt, idx++, dc->type);
1889 __BIND_TEXT(db, stmt, idx++, dc->trusted);
1891 ret = sqlite3_step(stmt);
1892 if (ret != SQLITE_DONE) {
1893 _LOGE("step failed: %s", sqlite3_errmsg(db));
1894 sqlite3_finalize(stmt);
1898 if (dc->privileges &&
1899 __insert_app_data_control_privilege_info(
1901 sqlite3_finalize(stmt);
1905 sqlite3_reset(stmt);
1908 sqlite3_finalize(stmt);
1913 static int __insert_category_info(sqlite3 *db, application_x *app)
1915 static const char query[] =
1916 "INSERT INTO package_app_app_category (app_id, category) "
1922 const char *category;
1924 if (app->category == NULL)
1927 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1928 if (ret != SQLITE_OK) {
1929 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1933 for (tmp = app->category; tmp; tmp = tmp->next) {
1934 category = (const char *)tmp->data;
1935 if (category == NULL)
1938 __BIND_TEXT(db, stmt, idx++, app->appid);
1939 __BIND_TEXT(db, stmt, idx++, category);
1941 ret = sqlite3_step(stmt);
1942 if (ret != SQLITE_DONE) {
1943 _LOGE("step failed: %s", sqlite3_errmsg(db));
1944 sqlite3_finalize(stmt);
1948 sqlite3_reset(stmt);
1951 sqlite3_finalize(stmt);
1956 static int __insert_metadata_info(sqlite3 *db, application_x *app)
1958 static const char query[] =
1959 "INSERT INTO package_app_app_metadata (app_id,"
1960 " md_key, md_value) VALUES (?, ?, ?)";
1967 if (app->metadata == NULL)
1970 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1971 if (ret != SQLITE_OK) {
1972 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1976 for (tmp = app->metadata; tmp; tmp = tmp->next) {
1977 md = (metadata_x *)tmp->data;
1981 __BIND_TEXT(db, stmt, idx++, app->appid);
1982 __BIND_TEXT(db, stmt, idx++, md->key);
1983 __BIND_TEXT(db, stmt, idx++, md->value);
1985 ret = sqlite3_step(stmt);
1986 if (ret != SQLITE_DONE) {
1987 _LOGE("step failed: %s", sqlite3_errmsg(db));
1988 sqlite3_finalize(stmt);
1992 sqlite3_reset(stmt);
1995 sqlite3_finalize(stmt);
2000 static int __insert_appcontrol_privilege_info(sqlite3 *db, const char *appid,
2003 static const char query[] =
2004 "INSERT INTO package_app_app_control_privilege (app_id,"
2005 " app_control, privilege) VALUES (?, ?, ?)";
2009 char app_control[BUFSIZE];
2016 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2017 if (ret != SQLITE_OK) {
2018 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2022 for (tmp = ac->privileges; tmp; tmp = tmp->next) {
2023 privilege = (char *)tmp->data;
2024 if (privilege == NULL || !strlen(privilege))
2028 snprintf(app_control, sizeof(app_control), "%s|%s|%s",
2029 ac->operation ? (strlen(ac->operation) > 0 ?
2030 ac->operation : "NULL") : "NULL",
2031 ac->uri ? (strlen(ac->uri) > 0 ?
2032 ac->uri : "NULL") : "NULL",
2033 ac->mime ? (strlen(ac->mime) > 0 ?
2034 ac->mime : "NULL") : "NULL");
2035 __BIND_TEXT(db, stmt, idx++, appid);
2036 __BIND_TEXT(db, stmt, idx++, app_control);
2037 __BIND_TEXT(db, stmt, idx++, privilege);
2039 ret = sqlite3_step(stmt);
2040 if (ret != SQLITE_DONE) {
2041 _LOGE("step failed: %s", sqlite3_errmsg(db));
2042 sqlite3_finalize(stmt);
2046 sqlite3_reset(stmt);
2049 sqlite3_finalize(stmt);
2054 static int __insert_appcontrol_info(sqlite3 *db, application_x *app)
2056 static const char query[] =
2057 "INSERT INTO package_app_app_control (app_id, app_control,"
2058 " visibility, app_control_id) "
2059 "VALUES (?, ?, ?, ?)";
2063 char app_control[BUFSIZE];
2067 if (app->appcontrol == NULL)
2070 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2071 if (ret != SQLITE_OK) {
2072 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2076 for (tmp = app->appcontrol; tmp; tmp = tmp->next) {
2077 ac = (appcontrol_x *)tmp->data;
2081 snprintf(app_control, sizeof(app_control), "%s|%s|%s",
2082 ac->operation ? (strlen(ac->operation) > 0 ?
2083 ac->operation : "NULL") : "NULL",
2084 ac->uri ? (strlen(ac->uri) > 0 ?
2085 ac->uri : "NULL") : "NULL",
2086 ac->mime ? (strlen(ac->mime) > 0 ?
2087 ac->mime : "NULL") : "NULL");
2088 __BIND_TEXT(db, stmt, idx++, app->appid);
2089 __BIND_TEXT(db, stmt, idx++, app_control);
2090 __BIND_TEXT(db, stmt, idx++, ac->visibility);
2091 __BIND_TEXT(db, stmt, idx++, ac->id);
2093 ret = sqlite3_step(stmt);
2094 if (ret != SQLITE_DONE) {
2095 _LOGE("step failed: %s", sqlite3_errmsg(db));
2096 sqlite3_finalize(stmt);
2100 if (__insert_appcontrol_privilege_info(db, app->appid, ac)) {
2101 sqlite3_finalize(stmt);
2105 sqlite3_reset(stmt);
2108 sqlite3_finalize(stmt);
2113 static const char *__get_bool(char *value, bool is_true)
2115 if (value != NULL) {
2116 if (!strcmp(value, ""))
2117 return (is_true) ? "true" : "false";
2121 return (is_true) ? "true" : "false";
2124 #define EFFECTIVE_APPID_KEY "http://tizen.org/metadata/effective-appid"
2125 static const char *__find_effective_appid(GList *metadata_list)
2130 for (tmp = metadata_list; tmp; tmp = tmp->next) {
2131 md = (metadata_x *)tmp->data;
2132 if (md == NULL || md->key == NULL)
2135 if (strcmp(md->key, EFFECTIVE_APPID_KEY) == 0) {
2144 static int __convert_background_category(GList *category_list)
2148 char *category_data;
2150 if (category_list == NULL)
2153 for (tmp = category_list; tmp; tmp = tmp->next) {
2154 category_data = (char *)tmp->data;
2155 if (category_data == NULL)
2157 if (!strcmp(category_data, APP_BG_CATEGORY_MEDIA_STR))
2158 ret |= APP_BG_CATEGORY_MEDIA_VAL;
2159 else if (!strcmp(category_data, APP_BG_CATEGORY_DOWNLOAD_STR))
2160 ret |= APP_BG_CATEGORY_DOWNLOAD_VAL;
2161 else if (!strcmp(category_data, APP_BG_CATEGORY_BGNETWORK_STR))
2162 ret |= APP_BG_CATEGORY_BGNETWORK_VAL;
2163 else if (!strcmp(category_data, APP_BG_CATEGORY_LOCATION_STR))
2164 ret |= APP_BG_CATEGORY_LOCATION_VAL;
2165 else if (!strcmp(category_data, APP_BG_CATEGORY_SENSOR_STR))
2166 ret |= APP_BG_CATEGORY_SENSOR_VAL;
2167 else if (!strcmp(category_data, APP_BG_CATEGORY_IOTCOMM_STR))
2168 ret |= APP_BG_CATEGORY_IOTCOMM_VAL;
2169 else if (!strcmp(category_data, APP_BG_CATEGORY_SYSTEM))
2170 ret |= APP_BG_CATEGORY_SYSTEM_VAL;
2172 _LOGE("Unidentified category [%s]", category_data);
2178 static int __insert_package_res_info_allowed_package(sqlite3 *db,
2179 const char *pkgid, GList *rap_list)
2181 static const char query[] =
2182 "INSERT INTO package_res_allowed_package (package,"
2183 " allowed_package, required_privilege) VALUES (?, ?, ?)";
2189 res_allowed_package_x *rap;
2191 if (rap_list == NULL)
2194 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2195 if (ret != SQLITE_OK) {
2196 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2200 for (tmp = rap_list; tmp; tmp = tmp->next) {
2201 rap = (res_allowed_package_x *)tmp->data;
2205 if (!rap->required_privileges) {
2207 __BIND_TEXT(db, stmt, idx++, pkgid);
2208 __BIND_TEXT(db, stmt, idx++, rap->allowed_package);
2209 __BIND_TEXT(db, stmt, idx++, NULL);
2211 ret = sqlite3_step(stmt);
2212 if (ret != SQLITE_DONE) {
2213 _LOGE("step failed: %s", sqlite3_errmsg(db));
2214 sqlite3_finalize(stmt);
2218 sqlite3_reset(stmt);
2222 for (priv_list = rap->required_privileges; priv_list;
2223 priv_list = priv_list->next) {
2225 __BIND_TEXT(db, stmt, idx++, pkgid);
2226 __BIND_TEXT(db, stmt, idx++, rap->allowed_package);
2227 __BIND_TEXT(db, stmt, idx++, (char *)priv_list->data);
2229 ret = sqlite3_step(stmt);
2230 if (ret != SQLITE_DONE) {
2231 _LOGE("step failed: %s", sqlite3_errmsg(db));
2232 sqlite3_finalize(stmt);
2236 sqlite3_reset(stmt);
2240 sqlite3_finalize(stmt);
2245 static int __insert_package_res_info(sqlite3 *db, manifest_x *mfx)
2247 static const char query[] =
2248 "INSERT INTO package_res_info (package, res_type,"
2249 " res_version) VALUES (?, ?, ?)";
2254 if (mfx->res_type == NULL || mfx->res_version == NULL)
2257 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2258 if (ret != SQLITE_OK) {
2259 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2264 __BIND_TEXT(db, stmt, idx++, mfx->package);
2265 __BIND_TEXT(db, stmt, idx++, mfx->res_type);
2266 __BIND_TEXT(db, stmt, idx++, mfx->res_version);
2268 ret = sqlite3_step(stmt);
2269 if (ret != SQLITE_DONE) {
2270 _LOGE("step failed: %s", sqlite3_errmsg(db));
2271 sqlite3_finalize(stmt);
2275 if (__insert_package_res_info_allowed_package(db, mfx->package,
2276 mfx->res_allowed_packages) < 0) {
2277 sqlite3_finalize(stmt);
2281 sqlite3_finalize(stmt);
2286 static int __insert_application_info(sqlite3 *db, manifest_x *mfx)
2288 static const char query[] =
2289 "INSERT INTO package_app_info (app_id, app_component,"
2290 " app_exec, app_nodisplay, app_type, app_onboot, app_multiple,"
2291 " app_autorestart, app_taskmanage, app_hwacceleration,"
2292 " app_screenreader, app_mainapp, app_recentimage,"
2293 " app_launchcondition, app_indicatordisplay, app_portraitimg,"
2294 " app_landscapeimg, app_guestmodevisibility,"
2295 " app_permissiontype, app_preload, app_submode,"
2296 " app_submode_mainid, app_installed_storage, app_process_pool,"
2297 " app_launch_mode, app_ui_gadget, app_support_mode,"
2298 " app_support_disable, component_type, package, app_tep_name,"
2299 " app_zip_mount_file, app_background_category,"
2300 " app_package_type, app_root_path, app_api_version,"
2301 " app_effective_appid, app_splash_screen_display,"
2302 " app_package_system, app_removable,"
2303 " app_package_installed_time, app_support_ambient,"
2304 " app_external_path, app_setup_appid, light_user_switch_mode) "
2306 " ?, LOWER(?), ?, LOWER(?), LOWER(?),"
2307 " LOWER(?), LOWER(?), ?,"
2311 " ?, LOWER(?), LOWER(?),"
2313 " COALESCE(?, 'single'), LOWER(?), ?,"
2314 " LOWER(?), ?, ?, ?,"
2318 " LOWER(?), LOWER(?),"
2327 const char *effective_appid;
2330 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2331 if (ret != SQLITE_OK) {
2332 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2336 for (tmp = mfx->application; tmp; tmp = tmp->next) {
2337 app = (application_x *)tmp->data;
2341 bg_category = __convert_background_category(
2342 app->background_category);
2343 effective_appid = __find_effective_appid(app->metadata);
2346 __BIND_TEXT(db, stmt, idx++, app->appid);
2347 __BIND_TEXT(db, stmt, idx++, app->component_type);
2348 __BIND_TEXT(db, stmt, idx++, app->exec);
2349 __BIND_TEXT(db, stmt, idx++, __get_bool(app->nodisplay, false));
2350 __BIND_TEXT(db, stmt, idx++, app->type);
2351 __BIND_TEXT(db, stmt, idx++, __get_bool(app->onboot, false));
2352 __BIND_TEXT(db, stmt, idx++, __get_bool(app->multiple, false));
2353 __BIND_TEXT(db, stmt, idx++,
2354 __get_bool(app->autorestart, false));
2355 __BIND_TEXT(db, stmt, idx++,
2356 __get_bool(app->taskmanage, false));
2357 __BIND_TEXT(db, stmt, idx++, app->hwacceleration);
2358 __BIND_TEXT(db, stmt, idx++, app->screenreader);
2359 __BIND_TEXT(db, stmt, idx++, __get_bool(app->mainapp, false));
2360 __BIND_TEXT(db, stmt, idx++, app->recentimage);
2361 __BIND_TEXT(db, stmt, idx++, app->launchcondition);
2362 __BIND_TEXT(db, stmt, idx++,
2363 __get_bool(app->indicatordisplay, true));
2364 __BIND_TEXT(db, stmt, idx++, app->portraitimg);
2365 __BIND_TEXT(db, stmt, idx++, app->landscapeimg);
2366 __BIND_TEXT(db, stmt, idx++,
2367 __get_bool(app->guestmode_visibility, true));
2368 __BIND_TEXT(db, stmt, idx++, app->permission_type);
2369 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->preload, false));
2370 __BIND_TEXT(db, stmt, idx++, __get_bool(app->submode, false));
2371 __BIND_TEXT(db, stmt, idx++, app->submode_mainid);
2372 __BIND_TEXT(db, stmt, idx++, mfx->installed_storage);
2373 __BIND_TEXT(db, stmt, idx++,
2374 __get_bool(app->process_pool, false));
2375 __BIND_TEXT(db, stmt, idx++, app->launch_mode);
2376 __BIND_TEXT(db, stmt, idx++, __get_bool(app->ui_gadget, false));
2377 __BIND_TEXT(db, stmt, idx++,
2378 app->support_mode ? app->support_mode : "0");
2379 __BIND_TEXT(db, stmt, idx++,
2380 __get_bool(mfx->support_disable, false));
2381 __BIND_TEXT(db, stmt, idx++, app->component_type);
2382 __BIND_TEXT(db, stmt, idx++, mfx->package);
2383 __BIND_TEXT(db, stmt, idx++, mfx->tep_name);
2384 __BIND_TEXT(db, stmt, idx++, mfx->zip_mount_file);
2385 __BIND_INT(db, stmt, idx++, bg_category);
2386 __BIND_TEXT(db, stmt, idx++, mfx->type ? mfx->type : "tpk");
2387 __BIND_TEXT(db, stmt, idx++, mfx->root_path);
2388 __BIND_TEXT(db, stmt, idx++, app->api_version);
2389 __BIND_TEXT(db, stmt, idx++, effective_appid);
2390 __BIND_TEXT(db, stmt, idx++,
2391 __get_bool(app->splash_screen_display, true));
2392 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->system, false));
2393 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->removable, false));
2394 __BIND_TEXT(db, stmt, idx++, mfx->installed_time);
2395 __BIND_TEXT(db, stmt, idx++,
2396 __get_bool(app->support_ambient, false));
2397 __BIND_TEXT(db, stmt, idx++, mfx->external_path);
2398 __BIND_TEXT(db, stmt, idx++, app->setup_appid);
2399 __BIND_TEXT(db, stmt, idx++, mfx->light_user_switch_mode);
2401 ret = sqlite3_step(stmt);
2402 if (ret != SQLITE_DONE) {
2403 _LOGE("step failed: %s", sqlite3_errmsg(db));
2404 sqlite3_finalize(stmt);
2408 sqlite3_reset(stmt);
2410 if (__insert_appcontrol_info(db, app)) {
2411 sqlite3_finalize(stmt);
2414 if (__insert_category_info(db, app)) {
2415 sqlite3_finalize(stmt);
2418 if (__insert_metadata_info(db, app)) {
2419 sqlite3_finalize(stmt);
2422 if (__insert_datacontrol_info(db, app)) {
2423 sqlite3_finalize(stmt);
2426 ss_list = __find_splashscreens(app->splashscreens);
2427 if (__insert_splashscreen_info(db, app, ss_list)) {
2428 g_list_free(ss_list);
2429 sqlite3_finalize(stmt);
2432 g_list_free(ss_list);
2433 if (__insert_app_localized_info(db, app)) {
2434 sqlite3_finalize(stmt);
2437 if (__insert_app_res_control(db, app)) {
2438 sqlite3_finalize(stmt);
2443 sqlite3_finalize(stmt);
2448 static int __insert_package_update_info(sqlite3 *db, manifest_x *mfx)
2450 static const char query[] =
2451 "INSERT INTO package_update_info (package, update_version) "
2457 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2458 if (ret != SQLITE_OK) {
2459 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2464 __BIND_TEXT(db, stmt, idx++, mfx->package);
2465 __BIND_TEXT(db, stmt, idx, mfx->version);
2466 ret = sqlite3_step(stmt);
2467 if (ret != SQLITE_DONE) {
2468 _LOGE("step failed: %s", sqlite3_errmsg(db));
2469 sqlite3_finalize(stmt);
2472 sqlite3_finalize(stmt);
2477 static int __insert_package_localized_info(sqlite3 *db, manifest_x *mfx)
2479 static const char query[] =
2480 "INSERT INTO package_localized_info (package, package_locale,"
2481 " package_label, package_icon, package_description,"
2482 " package_license, package_author) "
2483 "VALUES (?, ?, ?, ?, ?, ?, ?)";
2496 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2497 if (ret != SQLITE_OK) {
2498 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2502 locales = __create_locale_list(mfx->label, mfx->license, mfx->icon,
2503 mfx->description, mfx->author);
2504 for (tmp = locales; tmp; tmp = tmp->next) {
2505 locale = (const char *)tmp->data;
2511 __extract_data(locale, mfx->label, mfx->license, mfx->icon,
2512 mfx->description, mfx->author,
2513 &label, &license, &icon, &description, &author);
2514 if (!label && !license && !icon && !description && !author)
2518 __BIND_TEXT(db, stmt, idx++, mfx->package);
2519 __BIND_TEXT(db, stmt, idx++, locale);
2520 __BIND_TEXT(db, stmt, idx++, label);
2521 __BIND_TEXT(db, stmt, idx++, icon);
2522 __BIND_TEXT(db, stmt, idx++, description);
2523 __BIND_TEXT(db, stmt, idx++, license);
2524 __BIND_TEXT(db, stmt, idx++, author);
2526 ret = sqlite3_step(stmt);
2527 if (ret != SQLITE_DONE) {
2528 _LOGE("step failed: %s", sqlite3_errmsg(db));
2529 g_list_free(locales);
2530 sqlite3_finalize(stmt);
2534 sqlite3_reset(stmt);
2537 g_list_free(locales);
2538 sqlite3_finalize(stmt);
2543 static int __insert_package_info(sqlite3 *db, manifest_x *mfx)
2545 static const char query[] =
2546 "INSERT INTO package_info (package, package_type,"
2547 " package_version, package_api_version, package_tep_name,"
2548 " package_zip_mount_file, install_location, package_size,"
2549 " package_removable, package_preload, package_readonly,"
2550 " package_update, package_appsetting, package_nodisplay,"
2551 " package_system, author_name, author_email, author_href,"
2552 " installed_time, installed_storage, storeclient_id,"
2553 " mainapp_id, package_url, root_path, external_path,"
2554 " csc_path, package_support_mode, package_support_disable,"
2555 " light_user_switch_mode)"
2559 " LOWER(?), LOWER(?), LOWER(?),"
2560 " LOWER(?), LOWER(?), LOWER(?),"
2561 " LOWER(?), ?, ?, ?,"
2564 " ?, ?, LOWER(?), ?)";
2568 const char *author_name = NULL;
2569 const char *author_email = NULL;
2570 const char *author_href = NULL;
2572 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2573 if (ret != SQLITE_OK) {
2574 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2578 if (mfx->author && mfx->author->data) {
2579 author_name = ((author_x *)mfx->author->data)->text;
2580 author_email = ((author_x *)mfx->author->data)->email;
2581 author_href = ((author_x *)mfx->author->data)->href;
2584 __BIND_TEXT(db, stmt, idx++, mfx->package);
2585 __BIND_TEXT(db, stmt, idx++, mfx->type);
2586 __BIND_TEXT(db, stmt, idx++, mfx->version);
2587 __BIND_TEXT(db, stmt, idx++, mfx->api_version);
2588 __BIND_TEXT(db, stmt, idx++, mfx->tep_name);
2589 __BIND_TEXT(db, stmt, idx++, mfx->zip_mount_file);
2590 __BIND_TEXT(db, stmt, idx++, mfx->installlocation);
2591 __BIND_TEXT(db, stmt, idx++, mfx->package_size);
2592 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->removable, true));
2593 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->preload, false));
2594 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->readonly, false));
2595 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->update, false));
2596 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->appsetting, false));
2597 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->nodisplay_setting, false));
2598 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->system, false));
2599 __BIND_TEXT(db, stmt, idx++, author_name);
2600 __BIND_TEXT(db, stmt, idx++, author_email);
2601 __BIND_TEXT(db, stmt, idx++, author_href);
2602 __BIND_TEXT(db, stmt, idx++, mfx->installed_time);
2603 __BIND_TEXT(db, stmt, idx++, mfx->installed_storage);
2604 __BIND_TEXT(db, stmt, idx++, mfx->storeclient_id);
2605 __BIND_TEXT(db, stmt, idx++, mfx->mainapp_id);
2606 __BIND_TEXT(db, stmt, idx++, mfx->package_url);
2607 __BIND_TEXT(db, stmt, idx++, mfx->root_path);
2608 __BIND_TEXT(db, stmt, idx++, mfx->external_path);
2609 __BIND_TEXT(db, stmt, idx++, mfx->csc_path);
2610 __BIND_TEXT(db, stmt, idx++,
2611 mfx->support_mode ? mfx->support_mode : "0");
2612 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->support_disable, false));
2613 __BIND_TEXT(db, stmt, idx++, mfx->light_user_switch_mode);
2615 ret = sqlite3_step(stmt);
2616 if (ret != SQLITE_DONE) {
2617 _LOGE("step failed: %s", sqlite3_errmsg(db));
2618 sqlite3_finalize(stmt);
2622 sqlite3_finalize(stmt);
2624 if (__insert_package_update_info(db, mfx))
2626 if (__insert_package_localized_info(db, mfx))
2628 if (__insert_application_info(db, mfx))
2630 if (__insert_package_privilege_info(db, mfx))
2632 if (__insert_package_appdefined_privilege_info(db, mfx))
2634 if (__insert_package_dependency_info(db, mfx))
2636 if (__insert_package_res_info(db, mfx))
2642 static int __delete_package_info(sqlite3 *db, const char *pkgid)
2644 static const char query[] =
2645 "DELETE FROM package_info WHERE package=?";
2649 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2650 if (ret != SQLITE_OK) {
2651 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2655 __BIND_TEXT(db, stmt, 1, pkgid);
2657 ret = sqlite3_step(stmt);
2658 if (ret != SQLITE_DONE) {
2659 _LOGE("step failed: %s", sqlite3_errmsg(db));
2660 sqlite3_finalize(stmt);
2664 sqlite3_finalize(stmt);
2669 API int pkgmgr_parser_delete_pkg_info(sqlite3 *db,
2670 const char *package, uid_t uid)
2672 if (db == NULL || package == NULL) {
2673 _LOGE("invalid parameter");
2674 return PM_PARSER_R_EINVAL;
2677 __BEGIN_TRANSACTION(db);
2678 __DO_TRANSACTION(db, __delete_package_info(db, package));
2679 __END_TRANSACTION(db);
2681 return PM_PARSER_R_OK;
2684 API int pkgmgr_parser_update_pkg_info(sqlite3 *db, manifest_x *mfx, uid_t uid)
2686 if (db == NULL || mfx == NULL) {
2687 _LOGE("invalid parameter");
2688 return PM_PARSER_R_EINVAL;
2691 __BEGIN_TRANSACTION(db);
2692 __DO_TRANSACTION(db, __delete_package_info(db, mfx->package));
2693 __DO_TRANSACTION(db, __insert_package_info(db, mfx));
2694 __END_TRANSACTION(db);
2696 return PM_PARSER_R_OK;
2699 API int pkgmgr_parser_insert_pkg_info(sqlite3 *db, manifest_x *mfx, uid_t uid)
2701 if (db == NULL || mfx == NULL) {
2702 _LOGE("invalid parameter");
2703 return PM_PARSER_R_EINVAL;
2706 __BEGIN_TRANSACTION(db);
2707 __DO_TRANSACTION(db, __insert_package_info(db, mfx));
2708 __END_TRANSACTION(db);
2710 return PM_PARSER_R_OK;