X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fpkgmgrinfo_appinfo.c;h=8ea2611e1ddde83155266a4cb947272379937c02;hb=0f86abcf802cdf14ef71d6b55e6c689a3b6debd2;hp=0e8cf332b154b6543d579b7b8bcea74e8cec29c2;hpb=fa3fca6b45ef5f0eb9f121433801f8188a555588;p=platform%2Fcore%2Fappfw%2Fpkgmgr-info.git diff --git a/src/pkgmgrinfo_appinfo.c b/src/pkgmgrinfo_appinfo.c index 0e8cf33..8ea2611 100644 --- a/src/pkgmgrinfo_appinfo.c +++ b/src/pkgmgrinfo_appinfo.c @@ -7,13 +7,13 @@ #include #include -#include #include #include "pkgmgr-info.h" #include "pkgmgrinfo_debug.h" #include "pkgmgrinfo_private.h" #include "pkgmgr_parser.h" +#include "manager/pkginfo_manager.h" static bool _get_bool_value(const char *str) { @@ -36,318 +36,6 @@ static void __cleanup_appinfo(pkgmgr_appinfo_x *data) pkgmgrinfo_basic_free_application(info->app_info); free((void *)info); } - return; -} - -static const char join_localized_info[] = - " LEFT OUTER JOIN package_app_localized_info" - " ON ai.app_id=package_app_localized_info.app_id" - " AND package_app_localized_info.app_locale=?"; -static const char join_category[] = - " LEFT OUTER JOIN package_app_app_category" - " ON ai.app_id=package_app_app_category.app_id"; -static const char join_app_control[] = - " LEFT OUTER JOIN package_app_app_control" - " ON ai.app_id=package_app_app_control.app_id"; -static const char join_metadata[] = - " LEFT OUTER JOIN package_app_app_metadata" - " ON ai.app_id=package_app_app_metadata.app_id "; - -static int _get_filtered_query(pkgmgrinfo_filter_x *filter, - const char *locale, uid_t uid, char **query, GList **bind_params) -{ - int joined = 0; - char *condition = NULL; - char buf[MAX_QUERY_LEN] = { '\0' }; - char tmp_query[MAX_QUERY_LEN] = { '\0' }; - GSList *list; - - if (!filter) - return PMINFO_R_OK; - strncat(buf, " WHERE 1=1", sizeof(buf) - strlen(buf) - 1); - - for (list = filter->list; list; list = list->next) { - joined |= __get_filter_condition(list->data, uid, &condition, bind_params); - if (condition == NULL) - continue; - - strncat(buf, " AND ", sizeof(buf) - strlen(buf) - 1); - - strncat(buf, condition, sizeof(buf) - strlen(buf) - 1); - free(condition); - condition = NULL; - } - - if (filter->list_metadata) - strncat(buf, " AND (", sizeof(buf) - strlen(buf) - 1); - for (list = filter->list_metadata; list; list = list->next) { - joined |= __get_metadata_filter_condition(list->data, - &condition, bind_params); - if (condition == NULL) - continue; - strncat(buf, condition, sizeof(buf) - strlen(buf) - 1); - free(condition); - condition = NULL; - - strncat(buf, " OR ", sizeof(buf) - strlen(buf) - 1); - } - if (filter->list_metadata) - strncat(buf, "1=0)", sizeof(buf) - strlen(buf) - 1); - - if (joined & E_PMINFO_APPINFO_JOIN_LOCALIZED_INFO) { - strncat(tmp_query, join_localized_info, sizeof(tmp_query) - strlen(tmp_query) - 1); - *bind_params = g_list_append(*bind_params, strdup(locale)); - } - if (joined & E_PMINFO_APPINFO_JOIN_CATEGORY) - strncat(tmp_query, join_category, sizeof(tmp_query) - strlen(tmp_query) - 1); - if (joined & E_PMINFO_APPINFO_JOIN_APP_CONTROL) - strncat(tmp_query, join_app_control, sizeof(tmp_query) - strlen(tmp_query) - 1); - if (joined & E_PMINFO_APPINFO_JOIN_METADATA) - strncat(tmp_query, join_metadata, sizeof(tmp_query) - strlen(tmp_query) - 1); - - strncat(tmp_query, buf, sizeof(tmp_query) - strlen(tmp_query) - 1); - - *query = strdup(tmp_query); - if (*query == NULL) - return PMINFO_R_ERROR; - - return PMINFO_R_OK; -} - -static int _appinfo_get_category(sqlite3 *db, const char *appid, - GList **category) -{ - static const char query_raw[] = - "SELECT category FROM package_app_app_category WHERE app_id=%Q"; - int ret; - char *query; - sqlite3_stmt *stmt; - char *val; - - query = sqlite3_mprintf(query_raw, appid); - if (query == NULL) { - LOGE("out of memory"); - return PMINFO_R_ERROR; - } - - ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL); - sqlite3_free(query); - if (ret != SQLITE_OK) { - LOGE("prepare failed: %s", sqlite3_errmsg(db)); - return PMINFO_R_ERROR; - } - - while (sqlite3_step(stmt) == SQLITE_ROW) { - val = NULL; - _save_column_str(stmt, 0, &val); - if (val) - *category = g_list_append(*category, (gpointer)val); - } - - sqlite3_finalize(stmt); - - return PMINFO_R_OK; -} - -static void __parse_appcontrol(GList **appcontrol, char *appcontrol_str) -{ - char *dup; - char *token; - char *ptr = NULL; - appcontrol_x *ac; - - if (appcontrol_str == NULL) - return; - - dup = strdup(appcontrol_str); - do { - ac = calloc(1, sizeof(appcontrol_x)); - if (ac == NULL) { - _LOGE("out of memory"); - break; - } - token = strtok_r(dup, "|", &ptr); - if (token && strcmp(token, "NULL")) - ac->operation = strdup(token); - token = strtok_r(NULL, "|", &ptr); - if (token && strcmp(token, "NULL")) - ac->uri = strdup(token); - token = strtok_r(NULL, "|", &ptr); - if (token && strcmp(token, "NULL")) - ac->mime = strdup(token); - *appcontrol = g_list_append(*appcontrol, ac); - } while ((token = strtok_r(NULL, ";", &ptr))); - - free(dup); -} - -static int _appinfo_get_app_control(sqlite3 *db, const char *appid, - GList **appcontrol) -{ - static const char query_raw[] = - "SELECT app_control FROM package_app_app_control " - "WHERE app_id=%Q"; - int ret; - char *query; - sqlite3_stmt *stmt; - char *str; - - query = sqlite3_mprintf(query_raw, appid); - if (query == NULL) { - LOGE("out of memory"); - return PMINFO_R_ERROR; - } - - ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL); - sqlite3_free(query); - if (ret != SQLITE_OK) { - LOGE("prepare failed: %s", sqlite3_errmsg(db)); - return PMINFO_R_ERROR; - } - - while (sqlite3_step(stmt) == SQLITE_ROW) { - str = NULL; - _save_column_str(stmt, 0, &str); - /* TODO: revise */ - __parse_appcontrol(appcontrol, str); - free(str); - } - - sqlite3_finalize(stmt); - - return PMINFO_R_OK; -} - -static int _appinfo_get_metadata(sqlite3 *db, const char *appid, - GList **metadata) -{ - static const char query_raw[] = - "SELECT md_key, md_value " - "FROM package_app_app_metadata WHERE app_id=%Q"; - int ret; - char *query; - sqlite3_stmt *stmt; - int idx; - metadata_x *info; - - query = sqlite3_mprintf(query_raw, appid); - if (query == NULL) { - LOGE("out of memory"); - return PMINFO_R_ERROR; - } - - ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL); - sqlite3_free(query); - if (ret != SQLITE_OK) { - LOGE("prepare failed: %s", sqlite3_errmsg(db)); - return PMINFO_R_ERROR; - } - - while (sqlite3_step(stmt) == SQLITE_ROW) { - info = calloc(1, sizeof(metadata_x)); - if (info == NULL) { - LOGE("out of memory"); - sqlite3_finalize(stmt); - return PMINFO_R_ERROR; - } - idx = 0; - _save_column_str(stmt, idx++, &info->key); - _save_column_str(stmt, idx++, &info->value); - *metadata = g_list_append(*metadata, info); - } - - sqlite3_finalize(stmt); - - return PMINFO_R_OK; - -} - -static int _appinfo_get_splashscreens(sqlite3 *db, const char *appid, - GList **splashscreens) -{ - static const char query_raw[] = - "SELECT src, type, orientation, indicatordisplay, operation, color_depth " - "FROM package_app_splash_screen WHERE app_id=%Q"; - int ret; - char *query; - sqlite3_stmt *stmt; - int idx; - splashscreen_x *info; - - query = sqlite3_mprintf(query_raw, appid); - if (query == NULL) { - LOGE("out of memory"); - return PMINFO_R_ERROR; - } - - ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL); - sqlite3_free(query); - if (ret != SQLITE_OK) { - LOGE("prepare failed: %s", sqlite3_errmsg(db)); - return PMINFO_R_ERROR; - } - - while (sqlite3_step(stmt) == SQLITE_ROW) { - info = calloc(1, sizeof(splashscreen_x)); - if (info == NULL) { - LOGE("out of memory"); - sqlite3_finalize(stmt); - return PMINFO_R_ERROR; - } - idx = 0; - _save_column_str(stmt, idx++, &info->src); - _save_column_str(stmt, idx++, &info->type); - _save_column_str(stmt, idx++, &info->orientation); - _save_column_str(stmt, idx++, &info->indicatordisplay); - _save_column_str(stmt, idx++, &info->operation); - _save_column_str(stmt, idx++, &info->color_depth); - *splashscreens = g_list_append(*splashscreens, info); - } - - sqlite3_finalize(stmt); - - return PMINFO_R_OK; -} - -static GList *__get_background_category(const char *value) -{ - GList *category_list = NULL; - int convert_value = 0; - if (!value || strlen(value) == 0) - return NULL; - - convert_value = atoi(value); - if (convert_value < 0) - return NULL; - - if (convert_value & APP_BG_CATEGORY_USER_DISABLE_TRUE_VAL) - category_list = g_list_append(category_list, strdup(APP_BG_CATEGORY_USER_DISABLE_TRUE_STR)); - else - category_list = g_list_append(category_list, strdup(APP_BG_CATEGORY_USER_DISABLE_FALSE_STR)); - - if (convert_value & APP_BG_CATEGORY_MEDIA_VAL) - category_list = g_list_append(category_list, strdup(APP_BG_CATEGORY_MEDIA_STR)); - - if (convert_value & APP_BG_CATEGORY_DOWNLOAD_VAL) - category_list = g_list_append(category_list, strdup(APP_BG_CATEGORY_DOWNLOAD_STR)); - - if (convert_value & APP_BG_CATEGORY_BGNETWORK_VAL) - category_list = g_list_append(category_list, strdup(APP_BG_CATEGORY_BGNETWORK_STR)); - - if (convert_value & APP_BG_CATEGORY_LOCATION_VAL) - category_list = g_list_append(category_list, strdup(APP_BG_CATEGORY_LOCATION_STR)); - - if (convert_value & APP_BG_CATEGORY_SENSOR_VAL) - category_list = g_list_append(category_list, strdup(APP_BG_CATEGORY_SENSOR_STR)); - - if (convert_value & APP_BG_CATEGORY_IOTCOMM_VAL) - category_list = g_list_append(category_list, strdup(APP_BG_CATEGORY_IOTCOMM_STR)); - - if (convert_value & APP_BG_CATEGORY_SYSTEM_VAL) - category_list = g_list_append(category_list, strdup(APP_BG_CATEGORY_SYSTEM)); - - return category_list; - } static void __free_applications(gpointer data) @@ -376,375 +64,43 @@ static bool __check_disable_filter_exist(pkgmgrinfo_filter_x *filter, if (filter == NULL) return false; - link = g_slist_find_custom(filter->list, GINT_TO_POINTER(type), __disable_chk_func); + link = g_slist_find_custom(filter->list, + GINT_TO_POINTER(type), __disable_chk_func); if (link) return true; return false; } -static int __bind_params(sqlite3_stmt *stmt, GList *params) -{ - GList *tmp_list = NULL; - int idx = 0; - int ret; - - if (stmt == NULL || params == NULL) - return PMINFO_R_EINVAL; - - tmp_list = params; - while (tmp_list) { - ret = sqlite3_bind_text(stmt, ++idx, (char *)tmp_list->data, -1, SQLITE_STATIC); - if (ret != SQLITE_OK) - return PMINFO_R_ERROR; - tmp_list = tmp_list->next; - } - - return PMINFO_R_OK; -} - -static bool __check_app_storage_status(pkgmgrinfo_filter_x *tmp_filter) -{ - GSList *tmp_list = NULL; - pkgmgrinfo_node_x *tmp_node = NULL; - int property = -1; - - if (tmp_filter == NULL) - return true; - - property = _pminfo_appinfo_convert_to_prop_bool(PMINFO_APPINFO_PROP_APP_CHECK_STORAGE); - for (tmp_list = tmp_filter->list; tmp_list != NULL; - tmp_list = g_slist_next(tmp_list)) { - tmp_node = (pkgmgrinfo_node_x *)tmp_list->data; - if (property == tmp_node->prop) { - if (strcmp(tmp_node->value, "true") == 0) - return true; - else - return false; - } - } - - return true; -} - -static int _appinfo_get_applications(uid_t db_uid, uid_t uid, - const char *locale, pkgmgrinfo_filter_x *filter, int flag, - GHashTable *applications) -{ - static const char query_raw[] = - "SELECT DISTINCT ai.app_id, ai.app_installed_storage, " - "ai.app_external_path"; - static const char query_basic[] = - ", ai.app_component, ai.app_exec, " - "ai.app_nodisplay, ai.app_type, ai.app_onboot, " - "ai.app_multiple, ai.app_autorestart, ai.app_taskmanage, " - "ai.app_hwacceleration, ai.app_screenreader, " - "ai.app_mainapp, ai.app_recentimage, ai.app_launchcondition, " - "ai.app_indicatordisplay, ai.app_portraitimg, " - "ai.app_landscapeimg, ai.app_guestmodevisibility, " - "ai.app_permissiontype, ai.app_preload, ai.app_submode, " - "ai.app_submode_mainid, ai.app_launch_mode, ai.app_ui_gadget, " - "ai.app_support_disable, ai.app_process_pool, " - "ai.app_background_category, ai.app_package_type, " - "ai.app_root_path, ai.app_api_version, ai.app_effective_appid, " - "ai.app_disable, ai.app_splash_screen_display, ai.app_tep_name, " - "ai.app_zip_mount_file, ai.component_type, ai.package, " - "ai.app_package_system, ai.app_removable, " - "ai.app_package_installed_time, ai.app_support_mode, " - "ai.app_support_ambient, ai.app_setup_appid"; - static const char query_uid_info[] = - ", ui.is_disabled, ui.is_splash_screen_enabled"; - static const char query_label[] = - ", COALESCE(" - "(SELECT app_label FROM package_app_localized_info WHERE ai.app_id=app_id AND app_locale=?), " - "(SELECT app_label FROM package_app_localized_info WHERE ai.app_id=app_id AND app_locale='No Locale'))"; - static const char query_icon[] = - ", COALESCE(" - "(SELECT app_icon FROM package_app_localized_info WHERE ai.app_id=app_id AND app_locale=?), " - "(SELECT app_icon FROM package_app_localized_info WHERE ai.app_id=app_id AND app_locale='No Locale'))"; - static const char query_from_clause[] = " FROM package_app_info as ai"; - static const char query_uid_info_clause[] = - " LEFT OUTER JOIN package_app_info_for_uid AS ui " - "ON (ai.app_id=ui.app_id AND ui.uid=?)"; - int ret = PMINFO_R_ERROR; - int idx; - char *dbpath; - char *bg_category_str = NULL; - char *constraint = NULL; - char *tmp_record = NULL; - char query[MAX_QUERY_LEN] = { '\0' }; - char buf[BUFSIZE] = { '\0' }; - application_x *info = NULL; - GList *bind_params = NULL; - sqlite3 *db = NULL; - sqlite3_stmt *stmt = NULL; - bool is_check_storage = true; - const uid_t global_user_uid = GLOBAL_USER; - - dbpath = getUserPkgParserDBPathUID(db_uid); - if (dbpath == NULL) - return PMINFO_R_ERROR; - - ret = __open_db(dbpath, &db, SQLITE_OPEN_READONLY); - if (ret != SQLITE_OK) { - _LOGE("failed to open db(%s): %d", dbpath, ret); - free(dbpath); - return PMINFO_R_ERROR; - } - free(dbpath); - - snprintf(query, MAX_QUERY_LEN - 1, "%s", query_raw); - - if (flag & PMINFO_APPINFO_GET_BASICINFO) { - strncat(query, query_basic, sizeof(query) - strlen(query) - 1); - strncat(query, query_uid_info, sizeof(query) - strlen(query) - 1); - } - if (flag & PMINFO_APPINFO_GET_LABEL) { - strncat(query, query_label, sizeof(query) - strlen(query) - 1); - bind_params = g_list_append(bind_params, strdup(locale)); - } - if (flag & PMINFO_APPINFO_GET_ICON) { - strncat(query, query_icon, sizeof(query) - strlen(query) - 1); - bind_params = g_list_append(bind_params, strdup(locale)); - } - - snprintf(buf, MAX_QUERY_LEN - 1, "%d", uid); - bind_params = g_list_append(bind_params, strdup(buf)); - - is_check_storage = __check_app_storage_status(filter); - - ret = _get_filtered_query(filter, locale, uid, &constraint, &bind_params); - if (ret != PMINFO_R_OK) { - LOGE("Failed to get WHERE clause"); - goto catch; - } - strncat(query, query_from_clause, sizeof(query) - strlen(query) - 1); - - strncat(query, query_uid_info_clause, sizeof(query) - strlen(query) - 1); - - if (constraint) - strncat(query, constraint, sizeof(query) - strlen(query) - 1); - - ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL); - if (ret != SQLITE_OK) { - LOGE("prepare failed: %s", sqlite3_errmsg(db)); - ret = PMINFO_R_ERROR; - goto catch; - } - - if (g_list_length(bind_params) != 0) { - ret = __bind_params(stmt, bind_params); - if (ret != SQLITE_OK) { - LOGE("Failed to bind parameters"); - goto catch; - } - } - - while (sqlite3_step(stmt) == SQLITE_ROW) { - info = calloc(1, sizeof(application_x)); - if (info == NULL) { - LOGE("out of memory"); - ret = PMINFO_R_ERROR; - goto catch; - } - idx = 0; - _save_column_str(stmt, idx++, &info->appid); - _save_column_str(stmt, idx++, &info->installed_storage); - _save_column_str(stmt, idx++ , &info->external_path); - - if (flag & PMINFO_APPINFO_GET_BASICINFO) { - _save_column_str(stmt, idx++, &info->component); - _save_column_str(stmt, idx++, &info->exec); - _save_column_str(stmt, idx++, &info->nodisplay); - _save_column_str(stmt, idx++, &info->type); - _save_column_str(stmt, idx++, &info->onboot); - _save_column_str(stmt, idx++, &info->multiple); - _save_column_str(stmt, idx++, &info->autorestart); - _save_column_str(stmt, idx++, &info->taskmanage); - _save_column_str(stmt, idx++, &info->hwacceleration); - _save_column_str(stmt, idx++, &info->screenreader); - _save_column_str(stmt, idx++, &info->mainapp); - _save_column_str(stmt, idx++, &info->recentimage); - _save_column_str(stmt, idx++, &info->launchcondition); - _save_column_str(stmt, idx++, &info->indicatordisplay); - _save_column_str(stmt, idx++, &info->portraitimg); - _save_column_str(stmt, idx++, &info->landscapeimg); - _save_column_str(stmt, idx++, &info->guestmode_visibility); - _save_column_str(stmt, idx++, &info->permission_type); - _save_column_str(stmt, idx++, &info->preload); - _save_column_str(stmt, idx++, &info->submode); - _save_column_str(stmt, idx++, &info->submode_mainid); - _save_column_str(stmt, idx++, &info->launch_mode); - _save_column_str(stmt, idx++, &info->ui_gadget); - _save_column_str(stmt, idx++, &info->support_disable); - _save_column_str(stmt, idx++, &info->process_pool); - _save_column_str(stmt, idx++, &bg_category_str); - _save_column_str(stmt, idx++, &info->package_type); - _save_column_str(stmt, idx++, &info->root_path); - _save_column_str(stmt, idx++, &info->api_version); - _save_column_str(stmt, idx++, &info->effective_appid); - _save_column_str(stmt, idx++, &info->is_disabled); - _save_column_str(stmt, idx++, &info->splash_screen_display); - _save_column_str(stmt, idx++, &info->tep_name); - _save_column_str(stmt, idx++, &info->zip_mount_file); - _save_column_str(stmt, idx++, &info->component_type); - _save_column_str(stmt, idx++, &info->package); - _save_column_str(stmt, idx++, &info->package_system); - _save_column_str(stmt, idx++, &info->removable); - _save_column_str(stmt, idx++, &info->package_installed_time); - _save_column_str(stmt, idx++, &info->support_mode); - _save_column_str(stmt, idx++, &info->support_ambient); - _save_column_str(stmt, idx++, &info->setup_appid); - info->background_category = __get_background_category( - bg_category_str); - free(bg_category_str); - } - - info->for_all_users = - strdup((db_uid != global_user_uid) ? "false" : "true"); - - if (db_uid != global_user_uid) { - idx = idx + 2; - } else { - tmp_record = NULL; - _save_column_str(stmt, idx++, &tmp_record); - if (tmp_record != NULL) { - if (strcasecmp(info->is_disabled, "false") == 0 && - strcasecmp(tmp_record, "false") == 0) { - free(info->is_disabled); - info->is_disabled = tmp_record; - } - } - tmp_record = NULL; - _save_column_str(stmt, idx++, &tmp_record); - if (tmp_record != NULL) { - if (strcasecmp(info->splash_screen_display, "false") == 0 && - strcasecmp(tmp_record, "false") == 0) { - free(info->splash_screen_display); - info->splash_screen_display = tmp_record; - } - } - } - - if (flag & PMINFO_APPINFO_GET_LABEL) { - tmp_record = NULL; - _save_column_str(stmt, idx++, &tmp_record); - if (_add_label_info_into_list(locale, tmp_record, &info->label)) { - ret = PMINFO_R_ERROR; - goto catch; - } - } - - if (flag & PMINFO_APPINFO_GET_ICON) { - tmp_record = NULL; - _save_column_str(stmt, idx++, &tmp_record); - if (_add_icon_info_into_list(locale, tmp_record, &info->icon)) { - ret = PMINFO_R_ERROR; - goto catch; - } - } - - if (flag & PMINFO_APPINFO_GET_CATEGORY) { - if (_appinfo_get_category(db, info->appid, - &info->category)) { - ret = PMINFO_R_ERROR; - goto catch; - } - } - - if (flag & PMINFO_APPINFO_GET_APP_CONTROL) { - if (_appinfo_get_app_control(db, info->appid, - &info->appcontrol)) { - ret = PMINFO_R_ERROR; - goto catch; - } - } - - if (flag & PMINFO_APPINFO_GET_METADATA) { - if (_appinfo_get_metadata(db, info->appid, - &info->metadata)) { - ret = PMINFO_R_ERROR; - goto catch; - } - } - - if (flag & PMINFO_APPINFO_GET_SPLASH_SCREEN) { - if (_appinfo_get_splashscreens(db, info->appid, - &info->splashscreens)) { - ret = PMINFO_R_ERROR; - goto catch; - } - } - - if (is_check_storage && - __appinfo_check_installed_storage(info) != PMINFO_R_OK) { - ret = PMINFO_R_ERROR; - pkgmgrinfo_basic_free_application(info); - info = NULL; - continue; - } - - g_hash_table_insert(applications, (gpointer)info->appid, - (gpointer)info); - } - - ret = PMINFO_R_OK; - -catch: - if (constraint) - free(constraint); - - if (ret != PMINFO_R_OK && info != NULL) - pkgmgrinfo_basic_free_application(info); - - g_list_free_full(bind_params, free); - sqlite3_close_v2(db); - sqlite3_finalize(stmt); - - return ret; -} - static int _pkgmgrinfo_get_appinfo(const char *appid, uid_t uid, pkgmgrinfo_appinfo_filter_h filter, pkgmgrinfo_appinfo_h *handle) { - int ret; - char *locale; + int ret = PMINFO_R_OK; GHashTable *list; pkgmgr_appinfo_x *info; if (appid == NULL || filter == NULL || handle == NULL) { - LOGE("invalid parameter"); - return PMINFO_R_EINVAL; + LOGE("invalid parameter"); + return PMINFO_R_EINVAL; } - locale = _get_system_locale(); - if (locale == NULL) - return PMINFO_R_ERROR; - list = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, __free_applications); - if (list == NULL) { - free(locale); + if (list == NULL) return PMINFO_R_ERROR; - } - ret = _appinfo_get_applications(uid, uid, locale, filter, + ret = _appinfo_get_applications(uid, filter, PMINFO_APPINFO_GET_ALL, list); - if (!g_hash_table_size(list) && uid != GLOBAL_USER) - ret = _appinfo_get_applications(GLOBAL_USER, uid, locale, filter, - PMINFO_APPINFO_GET_ALL, list); - if (ret != PMINFO_R_OK) { g_hash_table_destroy(list); - free(locale); return ret; } - if (!g_hash_table_size(list)) { + if (!g_hash_table_size(list) || !g_hash_table_lookup(list, appid) || + ((application_x *)g_hash_table_lookup(list, appid))->package == NULL) { _LOGD("appinfo for [%s] is not existed for user [%d]", appid, uid); g_hash_table_destroy(list); - free(locale); return PMINFO_R_ENOENT; } @@ -752,13 +108,25 @@ static int _pkgmgrinfo_get_appinfo(const char *appid, uid_t uid, if (info == NULL) { _LOGE("out of memory"); g_hash_table_destroy(list); - free(locale); return PMINFO_R_ERROR; } info->app_info = (application_x *)g_hash_table_lookup(list, appid); - info->locale = locale; + info->locale = strdup(info->app_info->locale); + if (!info->locale) { + _LOGE("out of memory"); + g_hash_table_destroy(list); + free(info); + return PMINFO_R_ERROR; + } info->package = strdup(info->app_info->package); + if (!info->package) { + _LOGE("out of memory"); + free(info->locale); + g_hash_table_destroy(list); + free(info); + return PMINFO_R_ERROR; + } /* just free list only */ g_hash_table_steal(list, (gconstpointer)appid); @@ -769,8 +137,8 @@ static int _pkgmgrinfo_get_appinfo(const char *appid, uid_t uid, return ret; } -API int pkgmgrinfo_appinfo_get_usr_disabled_appinfo(const char *appid, uid_t uid, - pkgmgrinfo_appinfo_h *handle) +API int pkgmgrinfo_appinfo_get_usr_disabled_appinfo( + const char *appid, uid_t uid, pkgmgrinfo_appinfo_h *handle) { int ret; pkgmgrinfo_appinfo_filter_h filter; @@ -804,9 +172,31 @@ API int pkgmgrinfo_appinfo_get_usr_disabled_appinfo(const char *appid, uid_t uid return ret; } -API int pkgmgrinfo_appinfo_get_disabled_appinfo(const char *appid, pkgmgrinfo_appinfo_h *handle) +API int pkgmgrinfo_appinfo_get_disabled_appinfo( + const char *appid, pkgmgrinfo_appinfo_h *handle) +{ + return pkgmgrinfo_appinfo_get_usr_disabled_appinfo( + appid, _getuid(), handle); +} + +static char *__get_real_appid(const char *appid) { - return pkgmgrinfo_appinfo_get_usr_disabled_appinfo(appid, _getuid(), handle); + char *str; + char *saveptr; + char *token; + + str = strdup(appid); + if (str == NULL) + return NULL; + + token = strtok_r(str, "::", &saveptr); + if (token == NULL) + return str; + + LOGD("Real appid = %s", token); + token = strdup(token); + free(str); + return token; } API int pkgmgrinfo_appinfo_get_usr_appinfo(const char *appid, uid_t uid, @@ -814,6 +204,7 @@ API int pkgmgrinfo_appinfo_get_usr_appinfo(const char *appid, uid_t uid, { int ret; pkgmgrinfo_appinfo_filter_h filter; + char *real_appid; if (appid == NULL || handle == NULL) { LOGE("invalid parameter"); @@ -824,10 +215,18 @@ API int pkgmgrinfo_appinfo_get_usr_appinfo(const char *appid, uid_t uid, if (ret != PMINFO_R_OK) return ret; + real_appid = __get_real_appid(appid); + if (real_appid == NULL) { + LOGE("Out of memory"); + pkgmgrinfo_appinfo_filter_destroy(filter); + return PMINFO_R_ERROR; + } + ret = pkgmgrinfo_appinfo_filter_add_string(filter, - PMINFO_APPINFO_PROP_APP_ID, appid); + PMINFO_APPINFO_PROP_APP_ID, real_appid); if (ret != PMINFO_R_OK) { pkgmgrinfo_appinfo_filter_destroy(filter); + free(real_appid); return PMINFO_R_ERROR; } @@ -835,6 +234,7 @@ API int pkgmgrinfo_appinfo_get_usr_appinfo(const char *appid, uid_t uid, PMINFO_APPINFO_PROP_APP_DISABLE, false); if (ret != PMINFO_R_OK) { pkgmgrinfo_appinfo_filter_destroy(filter); + free(real_appid); return PMINFO_R_ERROR; } @@ -842,15 +242,18 @@ API int pkgmgrinfo_appinfo_get_usr_appinfo(const char *appid, uid_t uid, PMINFO_APPINFO_PROP_PKG_DISABLE, false); if (ret != PMINFO_R_OK) { pkgmgrinfo_appinfo_filter_destroy(filter); + free(real_appid); return PMINFO_R_ERROR; } - ret = _pkgmgrinfo_get_appinfo(appid, uid, filter, handle); + ret = _pkgmgrinfo_get_appinfo(real_appid, uid, filter, handle); + free(real_appid); pkgmgrinfo_appinfo_filter_destroy(filter); return ret; } -API int pkgmgrinfo_appinfo_get_appinfo(const char *appid, pkgmgrinfo_appinfo_h *handle) +API int pkgmgrinfo_appinfo_get_appinfo( + const char *appid, pkgmgrinfo_appinfo_h *handle) { return pkgmgrinfo_appinfo_get_usr_appinfo(appid, _getuid(), handle); } @@ -890,7 +293,8 @@ API int pkgmgrinfo_appinfo_get_usr_all_appinfo(const char *appid, uid_t uid, return ret; } -API int pkgmgrinfo_appinfo_get_all_appinfo(const char *appid, pkgmgrinfo_appinfo_h *handle) +API int pkgmgrinfo_appinfo_get_all_appinfo( + const char *appid, pkgmgrinfo_appinfo_h *handle) { return pkgmgrinfo_appinfo_get_usr_all_appinfo(appid, _getuid(), handle); } @@ -1052,7 +456,32 @@ static gpointer __copy_splashscreens(gconstpointer src, gpointer data) return splashscreen; } -static int _appinfo_copy_appinfo(application_x **application, application_x *data) +static gpointer __copy_res_control(gconstpointer src, gpointer data) +{ + res_control_x *tmp = (res_control_x *)src; + res_control_x *res_control; + + res_control = (res_control_x *)calloc(1, sizeof(res_control_x)); + if (res_control == NULL) { + LOGE("memory alloc failed"); + *(int *)data = -1; + return NULL; + } + + if (tmp->res_type) + res_control->res_type = strdup(tmp->res_type); + if (tmp->min_res_version) + res_control->min_res_version = strdup(tmp->min_res_version); + if (tmp->max_res_version) + res_control->max_res_version = strdup(tmp->max_res_version); + if (tmp->auto_close) + res_control->auto_close = strdup(tmp->auto_close); + + return res_control; +} + +static int _appinfo_copy_appinfo( + application_x **application, application_x *data) { application_x *app_info; int ret; @@ -1096,7 +525,8 @@ static int _appinfo_copy_appinfo(application_x **application, application_x *dat if (data->landscapeimg != NULL) app_info->landscapeimg = strdup(data->landscapeimg); if (data->guestmode_visibility != NULL) - app_info->guestmode_visibility = strdup(data->guestmode_visibility); + app_info->guestmode_visibility = + strdup(data->guestmode_visibility); if (data->component != NULL) app_info->component = strdup(data->component); if (data->permission_type != NULL) @@ -1128,7 +558,8 @@ static int _appinfo_copy_appinfo(application_x **application, application_x *dat if (data->effective_appid != NULL) app_info->effective_appid = strdup(data->effective_appid); if (data->splash_screen_display != NULL) - app_info->splash_screen_display = strdup(data->splash_screen_display); + app_info->splash_screen_display = + strdup(data->splash_screen_display); /* GList */ ret = 0; @@ -1156,7 +587,17 @@ static int _appinfo_copy_appinfo(application_x **application, application_x *dat } ret = 0; - app_info->metadata = g_list_copy_deep(data->metadata, __copy_metadata, &ret); + app_info->metadata = g_list_copy_deep(data->metadata, + __copy_metadata, &ret); + if (ret < 0) { + LOGE("memory alloc failed"); + pkgmgrinfo_basic_free_application(app_info); + return PMINFO_R_ERROR; + } + + ret = 0; + app_info->datacontrol = g_list_copy_deep(data->datacontrol, + __copy_datacontrol, &ret); if (ret < 0) { LOGE("memory alloc failed"); pkgmgrinfo_basic_free_application(app_info); @@ -1164,7 +605,8 @@ static int _appinfo_copy_appinfo(application_x **application, application_x *dat } ret = 0; - app_info->datacontrol = g_list_copy_deep(data->datacontrol, __copy_datacontrol, &ret); + app_info->appcontrol = g_list_copy_deep(data->appcontrol, + __copy_appcontrol, &ret); if (ret < 0) { LOGE("memory alloc failed"); pkgmgrinfo_basic_free_application(app_info); @@ -1172,7 +614,9 @@ static int _appinfo_copy_appinfo(application_x **application, application_x *dat } ret = 0; - app_info->appcontrol = g_list_copy_deep(data->appcontrol, __copy_appcontrol, &ret); + app_info->background_category = + g_list_copy_deep(data->background_category, + __copy_str, &ret); if (ret < 0) { LOGE("memory alloc failed"); pkgmgrinfo_basic_free_application(app_info); @@ -1180,7 +624,8 @@ static int _appinfo_copy_appinfo(application_x **application, application_x *dat } ret = 0; - app_info->background_category = g_list_copy_deep(data->background_category, __copy_str, &ret); + app_info->splashscreens = g_list_copy_deep(data->splashscreens, + __copy_splashscreens, &ret); if (ret < 0) { LOGE("memory alloc failed"); pkgmgrinfo_basic_free_application(app_info); @@ -1188,7 +633,7 @@ static int _appinfo_copy_appinfo(application_x **application, application_x *dat } ret = 0; - app_info->splashscreens = g_list_copy_deep(data->splashscreens, __copy_splashscreens, &ret); + app_info->res_control = g_list_copy_deep(data->res_control, __copy_res_control, &ret); if (ret < 0) { LOGE("memory alloc failed"); pkgmgrinfo_basic_free_application(app_info); @@ -1238,37 +683,26 @@ API int pkgmgrinfo_appinfo_clone_appinfo(pkgmgrinfo_appinfo_h handle, } static int _appinfo_get_filtered_foreach_appinfo(uid_t uid, - pkgmgrinfo_filter_x *filter, int flag, pkgmgrinfo_app_list_cb app_list_cb, + pkgmgrinfo_filter_x *filter, int flag, + pkgmgrinfo_app_list_cb app_list_cb, void *user_data) { - int ret; - char *locale; application_x *app; pkgmgr_appinfo_x info; GHashTable *list; GHashTableIter iter; gpointer value; - - locale = _get_system_locale(); - if (locale == NULL) - return PMINFO_R_ERROR; + int ret; list = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, __free_applications); - if (list == NULL) { - free(locale); + if (list == NULL) return PMINFO_R_ERROR; - } - ret = _appinfo_get_applications(uid, uid, locale, filter, + ret = _appinfo_get_applications(uid, filter, flag | PMINFO_APPINFO_GET_BASICINFO, list); - if (ret == PMINFO_R_OK && uid != GLOBAL_USER) - ret = _appinfo_get_applications(GLOBAL_USER, uid, locale, - filter, flag | PMINFO_APPINFO_GET_BASICINFO, list); - - if (ret != PMINFO_R_OK) { + if (ret == PMINFO_R_ERROR) { g_hash_table_destroy(list); - free(locale); return ret; } @@ -1276,13 +710,12 @@ static int _appinfo_get_filtered_foreach_appinfo(uid_t uid, while (g_hash_table_iter_next(&iter, NULL, &value)) { app = (application_x *)value; info.app_info = app; - info.locale = locale; + info.locale = info.app_info->locale; info.package = app->package; if (app_list_cb(&info, user_data) < 0) break; } g_hash_table_destroy(list); - free(locale); return PMINFO_R_OK; } @@ -1346,7 +779,8 @@ API int pkgmgrinfo_appinfo_get_list(pkgmgrinfo_pkginfo_h handle, pkgmgrinfo_app_component component, pkgmgrinfo_app_list_cb app_func, void *user_data) { - return pkgmgrinfo_appinfo_get_usr_list(handle, component, app_func, user_data, _getuid()); + return pkgmgrinfo_appinfo_get_usr_list(handle, + component, app_func, user_data, _getuid()); } API int pkgmgrinfo_appinfo_get_usr_installed_list_full( @@ -1445,7 +879,8 @@ API int pkgmgrinfo_appinfo_get_appid(pkgmgrinfo_appinfo_h handle, char **appid) pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); - retvm_if(appid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + retvm_if(appid == NULL, PMINFO_R_EINVAL, + "Argument supplied to hold return value is NULL"); if (info->app_info == NULL || info->app_info->appid == NULL) return PMINFO_R_ERROR; @@ -1454,12 +889,14 @@ API int pkgmgrinfo_appinfo_get_appid(pkgmgrinfo_appinfo_h handle, char **appid) return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo_h handle, char **pkg_name) +API int pkgmgrinfo_appinfo_get_pkgname( + pkgmgrinfo_appinfo_h handle, char **pkg_name) { pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); - retvm_if(pkg_name == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + retvm_if(pkg_name == NULL, PMINFO_R_EINVAL, + "Argument supplied to hold return value is NULL"); if (info->package == NULL) return PMINFO_R_ERROR; @@ -1474,7 +911,8 @@ API int pkgmgrinfo_appinfo_get_pkgid(pkgmgrinfo_appinfo_h handle, char **pkgid) pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); - retvm_if(pkgid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + retvm_if(pkgid == NULL, PMINFO_R_EINVAL, + "Argument supplied to hold return value is NULL"); if (info->package == NULL) return PMINFO_R_ERROR; @@ -1484,10 +922,12 @@ API int pkgmgrinfo_appinfo_get_pkgid(pkgmgrinfo_appinfo_h handle, char **pkgid) return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_get_pkgtype(pkgmgrinfo_appinfo_h handle, char **pkgtype) +API int pkgmgrinfo_appinfo_get_pkgtype( + pkgmgrinfo_appinfo_h handle, char **pkgtype) { retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); - retvm_if(pkgtype == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + retvm_if(pkgtype == NULL, PMINFO_R_EINVAL, + "Argument supplied to hold return value is NULL"); pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; *pkgtype = (char *)info->app_info->package_type; @@ -1500,7 +940,8 @@ API int pkgmgrinfo_appinfo_get_exec(pkgmgrinfo_appinfo_h handle, char **exec) pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); - retvm_if(exec == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + retvm_if(exec == NULL, PMINFO_R_EINVAL, + "Argument supplied to hold return value is NULL"); if (info->app_info == NULL || info->app_info->exec == NULL) return PMINFO_R_ERROR; @@ -1516,7 +957,8 @@ API int pkgmgrinfo_appinfo_get_icon(pkgmgrinfo_appinfo_h handle, char **icon) pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); - retvm_if(icon == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + retvm_if(icon == NULL, PMINFO_R_EINVAL, + "Argument supplied to hold return value is NULL"); if (info->app_info == NULL) return PMINFO_R_ERROR; @@ -1548,7 +990,8 @@ API int pkgmgrinfo_appinfo_get_label(pkgmgrinfo_appinfo_h handle, char **label) GList *tmp; retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); - retvm_if(label == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + retvm_if(label == NULL, PMINFO_R_EINVAL, + "Argument supplied to hold return value is NULL"); if (info->app_info == NULL) return PMINFO_R_ERROR; @@ -1583,87 +1026,36 @@ API int pkgmgrinfo_appinfo_get_label(pkgmgrinfo_appinfo_h handle, char **label) return PMINFO_R_OK; } -static char *_get_localed_label(const char *appid, const char *locale, uid_t uid) +API int pkgmgrinfo_appinfo_usr_get_localed_label(const char *appid, + const char *locale, uid_t uid, char **label) { - char *result = NULL; - char *query = NULL; - sqlite3_stmt *stmt = NULL; - sqlite3 *db = NULL; char *val; - char *parser_db; - - parser_db = getUserPkgParserDBPathUID(uid); - if (parser_db == NULL) { - _LOGE("Failed to get parser db path"); - goto err; - } - - if (__open_db(parser_db, &db, SQLITE_OPEN_READONLY) != SQLITE_OK) { - _LOGE("DB open fail\n"); - free(parser_db); - goto err; - } - free(parser_db); - - query = sqlite3_mprintf("select app_label from package_app_localized_info where app_id=%Q and app_locale=%Q", appid, locale); - if (query == NULL) { - _LOGE("Out of memory"); - goto err; - } - - if (sqlite3_prepare_v2(db, query, -1, &stmt, NULL) != SQLITE_OK) { - _LOGE("prepare_v2 fail\n"); - goto err; - } - - if (sqlite3_step(stmt) == SQLITE_ROW) { - val = (char *)sqlite3_column_text(stmt, 0); - if (val != NULL) - result = strdup(val); - } -err: - sqlite3_finalize(stmt); - sqlite3_free(query); - sqlite3_close(db); + retvm_if(appid == NULL || locale == NULL || label == NULL, + PMINFO_R_EINVAL, "Argument is NULL"); + val = _appinfo_get_localed_label(appid, locale, uid); + if (val == NULL) + return PMINFO_R_ERROR; - return result; + *label = val; + return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_usr_get_localed_label(const char *appid, const char *locale, uid_t uid, char **label) +API int pkgmgrinfo_appinfo_get_localed_label( + const char *appid, const char *locale, char **label) { - char *val; + return pkgmgrinfo_appinfo_usr_get_localed_label( + appid, locale, _getuid(), label); +} - retvm_if(appid == NULL || locale == NULL || label == NULL, PMINFO_R_EINVAL, "Argument is NULL"); - - val = _get_localed_label(appid, locale, uid); - if (val == NULL) - val = _get_localed_label(appid, DEFAULT_LOCALE, uid); - - if (val == NULL) { - val = _get_localed_label(appid, locale, GLOBAL_USER); - if (val == NULL) - val = _get_localed_label(appid, DEFAULT_LOCALE, GLOBAL_USER); - } - - if (val == NULL) - return PMINFO_R_ERROR; - - *label = val; - - return PMINFO_R_OK; -} - -API int pkgmgrinfo_appinfo_get_localed_label(const char *appid, const char *locale, char **label) -{ - return pkgmgrinfo_appinfo_usr_get_localed_label(appid, locale, _getuid(), label); -} - -API int pkgmgrinfo_appinfo_get_metadata_value(pkgmgrinfo_appinfo_h handle, const char *metadata_key, char **metadata_value) -{ - retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); - retvm_if(metadata_key == NULL, PMINFO_R_EINVAL, "metadata_key is NULL"); - retvm_if(metadata_value == NULL, PMINFO_R_EINVAL, "metadata_value is NULL"); +API int pkgmgrinfo_appinfo_get_metadata_value( + pkgmgrinfo_appinfo_h handle, const char *metadata_key, + char **metadata_value) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(metadata_key == NULL, PMINFO_R_EINVAL, "metadata_key is NULL"); + retvm_if(metadata_value == NULL, PMINFO_R_EINVAL, + "metadata_value is NULL"); GList *list_md = NULL; metadata_x *metadata = NULL; @@ -1678,7 +1070,8 @@ API int pkgmgrinfo_appinfo_get_metadata_value(pkgmgrinfo_appinfo_h handle, const if (metadata->value == NULL) *metadata_value = ""; else - *metadata_value = (char *)metadata->value; + *metadata_value = + (char *)metadata->value; return PMINFO_R_OK; } } @@ -1697,6 +1090,8 @@ static pkgmgrinfo_app_component __appcomponent_convert(const char *comp) return PMINFO_WIDGET_APP; else if (strcasecmp(comp, "watchapp") == 0) return PMINFO_WATCH_APP; + else if (strcasecmp(comp, "componentbasedapp") == 0) + return PMINFO_COMPONENT_BASED_APP; else return -1; } @@ -1712,18 +1107,23 @@ static const char *__appcomponent_str(pkgmgrinfo_app_component comp) return "widgetapp"; case PMINFO_WATCH_APP: return "watchapp"; + case PMINFO_COMPONENT_BASED_APP: + return "componentbasedapp"; default: return NULL; } } -API int pkgmgrinfo_appinfo_get_component(pkgmgrinfo_appinfo_h handle, pkgmgrinfo_app_component *component) +API int pkgmgrinfo_appinfo_get_component( + pkgmgrinfo_appinfo_h handle, + pkgmgrinfo_app_component *component) { pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; int comp; retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); - retvm_if(component == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + retvm_if(component == NULL, PMINFO_R_EINVAL, + "Argument supplied to hold return value is NULL"); if (info->app_info == NULL) return PMINFO_R_ERROR; @@ -1737,12 +1137,14 @@ API int pkgmgrinfo_appinfo_get_component(pkgmgrinfo_appinfo_h handle, pkgmgrinfo return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_get_apptype(pkgmgrinfo_appinfo_h handle, char **app_type) +API int pkgmgrinfo_appinfo_get_apptype( + pkgmgrinfo_appinfo_h handle, char **app_type) { pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); - retvm_if(app_type == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + retvm_if(app_type == NULL, PMINFO_R_EINVAL, + "Argument supplied to hold return value is NULL"); if (info->app_info == NULL || info->app_info->type == NULL) return PMINFO_R_ERROR; @@ -1751,55 +1153,8 @@ API int pkgmgrinfo_appinfo_get_apptype(pkgmgrinfo_appinfo_h handle, char **app_t return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_get_operation(pkgmgrinfo_appcontrol_h handle, - int *operation_count, char ***operation) -{ - retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); - retvm_if(operation == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); - retvm_if(operation_count == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); - pkgmgrinfo_appcontrol_x *data = (pkgmgrinfo_appcontrol_x *)handle; - *operation_count = data->operation_count; - *operation = data->operation; - return PMINFO_R_OK; -} - -API int pkgmgrinfo_appinfo_get_uri(pkgmgrinfo_appcontrol_h handle, - int *uri_count, char ***uri) -{ - retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); - retvm_if(uri == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); - retvm_if(uri_count == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); - pkgmgrinfo_appcontrol_x *data = (pkgmgrinfo_appcontrol_x *)handle; - *uri_count = data->uri_count; - *uri = data->uri; - return PMINFO_R_OK; -} - -API int pkgmgrinfo_appinfo_get_mime(pkgmgrinfo_appcontrol_h handle, - int *mime_count, char ***mime) -{ - retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); - retvm_if(mime == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); - retvm_if(mime_count == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); - pkgmgrinfo_appcontrol_x *data = (pkgmgrinfo_appcontrol_x *)handle; - *mime_count = data->mime_count; - *mime = data->mime; - return PMINFO_R_OK; -} - -API int pkgmgrinfo_appinfo_get_subapp(pkgmgrinfo_appcontrol_h handle, - int *subapp_count, char ***subapp) -{ - retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); - retvm_if(subapp == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); - retvm_if(subapp_count == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); - pkgmgrinfo_appcontrol_x *data = (pkgmgrinfo_appcontrol_x *)handle; - *subapp_count = data->subapp_count; - *subapp = data->subapp; - return PMINFO_R_OK; -} - -API int pkgmgrinfo_appinfo_get_notification_icon(pkgmgrinfo_appinfo_h handle, char **icon) +API int pkgmgrinfo_appinfo_get_notification_icon( + pkgmgrinfo_appinfo_h handle, char **icon) { char *val; icon_x *ptr; @@ -1807,7 +1162,8 @@ API int pkgmgrinfo_appinfo_get_notification_icon(pkgmgrinfo_appinfo_h handle, ch pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL\n"); - retvm_if(icon == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + retvm_if(icon == NULL, PMINFO_R_EINVAL, + "Argument supplied to hold return value is NULL\n"); if (info->app_info == NULL) return PMINFO_R_ERROR; @@ -1827,13 +1183,15 @@ API int pkgmgrinfo_appinfo_get_notification_icon(pkgmgrinfo_appinfo_h handle, ch return PMINFO_R_ERROR; } -API int pkgmgrinfo_appinfo_get_recent_image_type(pkgmgrinfo_appinfo_h handle, pkgmgrinfo_app_recentimage *type) +API int pkgmgrinfo_appinfo_get_recent_image_type( + pkgmgrinfo_appinfo_h handle, pkgmgrinfo_app_recentimage *type) { char *val; pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); - retvm_if(type == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + retvm_if(type == NULL, PMINFO_R_EINVAL, + "Argument supplied to hold return value is NULL"); if (info->app_info == NULL || info->app_info->recentimage == NULL) return PMINFO_R_ERROR; @@ -1849,7 +1207,8 @@ API int pkgmgrinfo_appinfo_get_recent_image_type(pkgmgrinfo_appinfo_h handle, pk return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_get_preview_image(pkgmgrinfo_appinfo_h handle, char **preview_img) +API int pkgmgrinfo_appinfo_get_preview_image( + pkgmgrinfo_appinfo_h handle, char **preview_img) { char *val; image_x *ptr; @@ -1857,7 +1216,8 @@ API int pkgmgrinfo_appinfo_get_preview_image(pkgmgrinfo_appinfo_h handle, char * pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL\n"); - retvm_if(preview_img == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + retvm_if(preview_img == NULL, PMINFO_R_EINVAL, + "Argument supplied to hold return value is NULL\n"); if (info->app_info == NULL) return PMINFO_R_ERROR; @@ -1877,13 +1237,16 @@ API int pkgmgrinfo_appinfo_get_preview_image(pkgmgrinfo_appinfo_h handle, char * return PMINFO_R_ERROR; } -API int pkgmgrinfo_appinfo_get_permission_type(pkgmgrinfo_appinfo_h handle, pkgmgrinfo_permission_type *permission) +API int pkgmgrinfo_appinfo_get_permission_type( + pkgmgrinfo_appinfo_h handle, + pkgmgrinfo_permission_type *permission) { const char *val; pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL\n"); - retvm_if(permission == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + retvm_if(permission == NULL, PMINFO_R_EINVAL, + "Argument supplied to hold return value is NULL\n"); val = info->app_info->permission_type; if (val == NULL) @@ -1899,12 +1262,14 @@ API int pkgmgrinfo_appinfo_get_permission_type(pkgmgrinfo_appinfo_h handle, pkgm return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_get_component_type(pkgmgrinfo_appinfo_h handle, char **component_type) +API int pkgmgrinfo_appinfo_get_component_type( + pkgmgrinfo_appinfo_h handle, char **component_type) { pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); - retvm_if(component_type == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + retvm_if(component_type == NULL, PMINFO_R_EINVAL, + "Argument supplied to hold return value is NULL"); if (info->app_info == NULL || info->app_info->component_type == NULL) return PMINFO_R_ERROR; @@ -1914,13 +1279,16 @@ API int pkgmgrinfo_appinfo_get_component_type(pkgmgrinfo_appinfo_h handle, char return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_get_hwacceleration(pkgmgrinfo_appinfo_h handle, pkgmgrinfo_app_hwacceleration *hwacceleration) +API int pkgmgrinfo_appinfo_get_hwacceleration( + pkgmgrinfo_appinfo_h handle, + pkgmgrinfo_app_hwacceleration *hwacceleration) { char *val; pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); - retvm_if(hwacceleration == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + retvm_if(hwacceleration == NULL, PMINFO_R_EINVAL, + "Argument supplied to hold return value is NULL"); if (info->app_info == NULL || info->app_info->hwacceleration == NULL) return PMINFO_R_ERROR; @@ -1936,13 +1304,16 @@ API int pkgmgrinfo_appinfo_get_hwacceleration(pkgmgrinfo_appinfo_h handle, pkgmg return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_get_screenreader(pkgmgrinfo_appinfo_h handle, pkgmgrinfo_app_screenreader *screenreader) +API int pkgmgrinfo_appinfo_get_screenreader( + pkgmgrinfo_appinfo_h handle, + pkgmgrinfo_app_screenreader *screenreader) { char *val; pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); - retvm_if(screenreader == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + retvm_if(screenreader == NULL, PMINFO_R_EINVAL, + "Argument supplied to hold return value is NULL"); if (info->app_info == NULL || info->app_info->screenreader == NULL) return PMINFO_R_ERROR; @@ -1958,13 +1329,17 @@ API int pkgmgrinfo_appinfo_get_screenreader(pkgmgrinfo_appinfo_h handle, pkgmgri return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_get_effectimage(pkgmgrinfo_appinfo_h handle, char **portrait_img, char **landscape_img) +API int pkgmgrinfo_appinfo_get_effectimage( + pkgmgrinfo_appinfo_h handle, char **portrait_img, + char **landscape_img) { pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); - retvm_if(portrait_img == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); - retvm_if(landscape_img == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + retvm_if(portrait_img == NULL, PMINFO_R_EINVAL, + "Argument supplied to hold return value is NULL"); + retvm_if(landscape_img == NULL, PMINFO_R_EINVAL, + "Argument supplied to hold return value is NULL"); if (info->app_info == NULL) return PMINFO_R_ERROR; @@ -1982,7 +1357,8 @@ API int pkgmgrinfo_appinfo_get_effectimage(pkgmgrinfo_appinfo_h handle, char **p return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_get_effectimage_type(pkgmgrinfo_appinfo_h handle, char **effectimage_type) +API int pkgmgrinfo_appinfo_get_effectimage_type( + pkgmgrinfo_appinfo_h handle, char **effectimage_type) { pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; @@ -1999,12 +1375,14 @@ API int pkgmgrinfo_appinfo_get_effectimage_type(pkgmgrinfo_appinfo_h handle, cha return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_get_submode_mainid(pkgmgrinfo_appinfo_h handle, char **submode_mainid) +API int pkgmgrinfo_appinfo_get_submode_mainid( + pkgmgrinfo_appinfo_h handle, char **submode_mainid) { pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); - retvm_if(submode_mainid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + retvm_if(submode_mainid == NULL, PMINFO_R_EINVAL, + "Argument supplied to hold return value is NULL"); if (info->app_info == NULL) return PMINFO_R_ERROR; @@ -2017,18 +1395,22 @@ API int pkgmgrinfo_appinfo_get_submode_mainid(pkgmgrinfo_appinfo_h handle, char return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_get_installed_storage_location(pkgmgrinfo_appinfo_h handle, pkgmgrinfo_installed_storage *storage) +API int pkgmgrinfo_appinfo_get_installed_storage_location( + pkgmgrinfo_appinfo_h handle, + pkgmgrinfo_installed_storage *storage) { retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL\n"); pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; if (info->app_info && info->app_info->installed_storage) { - if (strcmp(info->app_info->installed_storage, "installed_internal") == 0) + if (strcmp(info->app_info->installed_storage, + "installed_internal") == 0) *storage = PMINFO_INTERNAL_STORAGE; - else if (strcmp(info->app_info->installed_storage, "installed_external") == 0) - *storage = PMINFO_EXTERNAL_STORAGE; - else - return PMINFO_R_ERROR; + else if (strcmp(info->app_info->installed_storage, + "installed_external") == 0) + *storage = PMINFO_EXTERNAL_STORAGE; + else + return PMINFO_R_ERROR; } else { return PMINFO_R_ERROR; } @@ -2036,12 +1418,14 @@ API int pkgmgrinfo_appinfo_get_installed_storage_location(pkgmgrinfo_appinfo_h h return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_get_launch_mode(pkgmgrinfo_appinfo_h handle, char **mode) +API int pkgmgrinfo_appinfo_get_launch_mode( + pkgmgrinfo_appinfo_h handle, char **mode) { pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL\n"); - retvm_if(mode == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + retvm_if(mode == NULL, PMINFO_R_EINVAL, + "Argument supplied to hold return value is NULL\n"); if (info->app_info->launch_mode == NULL) return PMINFO_R_ERROR; @@ -2051,7 +1435,8 @@ API int pkgmgrinfo_appinfo_get_launch_mode(pkgmgrinfo_appinfo_h handle, char **m return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_get_alias_appid(pkgmgrinfo_appinfo_h handle, char **alias_appid) +API int pkgmgrinfo_appinfo_get_alias_appid( + pkgmgrinfo_appinfo_h handle, char **alias_appid) { pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; @@ -2068,7 +1453,8 @@ API int pkgmgrinfo_appinfo_get_alias_appid(pkgmgrinfo_appinfo_h handle, char **a return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_get_effective_appid(pkgmgrinfo_appinfo_h handle, char **effective_appid) +API int pkgmgrinfo_appinfo_get_effective_appid( + pkgmgrinfo_appinfo_h handle, char **effective_appid) { pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; @@ -2088,7 +1474,8 @@ API int pkgmgrinfo_appinfo_get_effective_appid(pkgmgrinfo_appinfo_h handle, char return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_get_tep_name(pkgmgrinfo_appinfo_h handle, char **tep_name) +API int pkgmgrinfo_appinfo_get_tep_name( + pkgmgrinfo_appinfo_h handle, char **tep_name) { pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; @@ -2108,7 +1495,8 @@ API int pkgmgrinfo_appinfo_get_tep_name(pkgmgrinfo_appinfo_h handle, char **tep_ return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_get_zip_mount_file(pkgmgrinfo_appinfo_h handle, char **zip_mount_file) +API int pkgmgrinfo_appinfo_get_zip_mount_file( + pkgmgrinfo_appinfo_h handle, char **zip_mount_file) { pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; @@ -2128,7 +1516,8 @@ API int pkgmgrinfo_appinfo_get_zip_mount_file(pkgmgrinfo_appinfo_h handle, char return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_get_root_path(pkgmgrinfo_appinfo_h handle, char **root_path) +API int pkgmgrinfo_appinfo_get_root_path( + pkgmgrinfo_appinfo_h handle, char **root_path) { pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; @@ -2145,7 +1534,8 @@ API int pkgmgrinfo_appinfo_get_root_path(pkgmgrinfo_appinfo_h handle, char **roo return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_get_api_version(pkgmgrinfo_appinfo_h handle, char **api_version) +API int pkgmgrinfo_appinfo_get_api_version( + pkgmgrinfo_appinfo_h handle, char **api_version) { pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; @@ -2162,7 +1552,8 @@ API int pkgmgrinfo_appinfo_get_api_version(pkgmgrinfo_appinfo_h handle, char **a return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_get_installed_time(pkgmgrinfo_appinfo_h handle, int *installed_time) +API int pkgmgrinfo_appinfo_get_installed_time( + pkgmgrinfo_appinfo_h handle, int *installed_time) { pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; @@ -2171,7 +1562,8 @@ API int pkgmgrinfo_appinfo_get_installed_time(pkgmgrinfo_appinfo_h handle, int * return PMINFO_R_EINVAL; } - if (info->app_info == NULL || info->app_info->package_installed_time == NULL) + if (info->app_info == NULL || + info->app_info->package_installed_time == NULL) return PMINFO_R_ERROR; *installed_time = atoi(info->app_info->package_installed_time); @@ -2179,91 +1571,6 @@ API int pkgmgrinfo_appinfo_get_installed_time(pkgmgrinfo_appinfo_h handle, int * return PMINFO_R_OK; } -static int _appinfo_get_datacontrol_info(sqlite3 *db, const char *providerid, - const char *type, char **appid, char **access) -{ - static const char query[] = - "SELECT app_id, access FROM package_app_data_control " - "WHERE providerid=? AND type=?"; - int ret; - sqlite3_stmt *stmt; - - ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL); - if (ret != SQLITE_OK) { - LOGE("prepare failed: %s", sqlite3_errmsg(db)); - return PMINFO_R_ERROR; - } - - ret = sqlite3_bind_text(stmt, 1, providerid, -1, SQLITE_STATIC); - if (ret != SQLITE_OK) { - LOGE("bind failed: %s", sqlite3_errmsg(db)); - sqlite3_finalize(stmt); - return PMINFO_R_ERROR; - } - - ret = sqlite3_bind_text(stmt, 2, type, -1, SQLITE_STATIC); - if (ret != SQLITE_OK) { - LOGE("bind failed: %s", sqlite3_errmsg(db)); - sqlite3_finalize(stmt); - return PMINFO_R_ERROR; - } - - ret = sqlite3_step(stmt); - if (ret != SQLITE_ROW) { - sqlite3_finalize(stmt); - if (ret == SQLITE_DONE) { - return PMINFO_R_ENOENT; - } else { - LOGE("step error: %s", sqlite3_errmsg(db)); - return PMINFO_R_ERROR; - } - } - - *appid = strdup((char *)sqlite3_column_text(stmt, 0)); - if (*appid == NULL) { - LOGE("out of memory"); - sqlite3_finalize(stmt); - return PMINFO_R_ERROR; - } - *access = strdup((char *)sqlite3_column_text(stmt, 1)); - if (*access == NULL) { - LOGE("out of memory"); - free(*appid); - sqlite3_finalize(stmt); - return PMINFO_R_ERROR; - } - - sqlite3_finalize(stmt); - - return PMINFO_R_OK; -} - -static int _pkgmgrinfo_appinfo_get_datacontrol_info(uid_t uid, - const char *providerid, const char *type, - char **appid, char **access) -{ - int ret; - char *dbpath; - sqlite3 *db; - - dbpath = getUserPkgParserDBPathUID(GLOBAL_USER); - if (dbpath == NULL) - return PMINFO_R_ERROR; - - ret = __open_db(dbpath, &db, SQLITE_OPEN_READONLY); - free(dbpath); - if (ret != SQLITE_OK) { - LOGE("open db failed: %s", sqlite3_errmsg(db)); - return PMINFO_R_ERROR; - } - - ret = _appinfo_get_datacontrol_info(db, providerid, type, appid, - access); - sqlite3_close_v2(db); - - return ret; -} - API int pkgmgrinfo_appinfo_usr_get_datacontrol_info(const char *providerid, const char *type, uid_t uid, char **appid, char **access) { @@ -2275,12 +1582,8 @@ API int pkgmgrinfo_appinfo_usr_get_datacontrol_info(const char *providerid, return PMINFO_R_EINVAL; } - ret = _pkgmgrinfo_appinfo_get_datacontrol_info(GLOBAL_USER, providerid, - type, appid, access); - if (ret == PMINFO_R_ENOENT && uid != GLOBAL_USER) - ret = _pkgmgrinfo_appinfo_get_datacontrol_info(uid, providerid, - type, appid, access); - + ret = _appinfo_get_datacontrol_info( + providerid, type, uid, appid, access); /* FIXME: It should return PMINFO_R_ENOENT but to keep previous * implementation, return PMINFO_R_ERROR. This should be * modified later... @@ -2300,75 +1603,6 @@ API int pkgmgrinfo_appinfo_get_datacontrol_info(const char *providerid, type, _getuid(), appid, access); } -static int _appinfo_get_datacontrol_appid(sqlite3 *db, const char *providerid, - char **appid) -{ - static const char query[] = - "SELECT app_id FROM package_app_data_control " - "WHERE providerid=?"; - int ret; - sqlite3_stmt *stmt; - - ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL); - if (ret != SQLITE_OK) { - LOGE("prepare failed: %s", sqlite3_errmsg(db)); - return PMINFO_R_ERROR; - } - - ret = sqlite3_bind_text(stmt, 1, providerid, -1, SQLITE_STATIC); - if (ret != SQLITE_OK) { - LOGE("bind failed: %s", sqlite3_errmsg(db)); - sqlite3_finalize(stmt); - return PMINFO_R_ERROR; - } - - ret = sqlite3_step(stmt); - if (ret != SQLITE_ROW) { - sqlite3_finalize(stmt); - if (ret == SQLITE_DONE) { - return PMINFO_R_ENOENT; - } else { - LOGE("step error: %s", sqlite3_errmsg(db)); - return PMINFO_R_ERROR; - } - } - - *appid = strdup((char *)sqlite3_column_text(stmt, 0)); - - sqlite3_finalize(stmt); - - if (*appid == NULL) { - LOGE("out of memory"); - return PMINFO_R_ERROR; - } - - return PMINFO_R_OK; -} - -static int _pkgmgrinfo_appinfo_get_datacontrol_appid(uid_t uid, - const char *providerid, char **appid) -{ - int ret; - char *dbpath; - sqlite3 *db; - - dbpath = getUserPkgParserDBPathUID(GLOBAL_USER); - if (dbpath == NULL) - return PMINFO_R_ERROR; - - ret = __open_db(dbpath, &db, SQLITE_OPEN_READONLY); - free(dbpath); - if (ret != SQLITE_OK) { - LOGE("open db failed: %s", sqlite3_errmsg(db)); - return PMINFO_R_ERROR; - } - - ret = _appinfo_get_datacontrol_appid(db, providerid, appid); - sqlite3_close_v2(db); - - return ret; -} - API int pkgmgrinfo_appinfo_usr_get_datacontrol_appid(const char *providerid, uid_t uid, char **appid) { @@ -2379,12 +1613,7 @@ API int pkgmgrinfo_appinfo_usr_get_datacontrol_appid(const char *providerid, return PMINFO_R_EINVAL; } - ret = _pkgmgrinfo_appinfo_get_datacontrol_appid(GLOBAL_USER, providerid, - appid); - if (ret == PMINFO_R_ENOENT && uid != GLOBAL_USER) - ret = _pkgmgrinfo_appinfo_get_datacontrol_appid(uid, providerid, - appid); - + ret = _appinfo_get_datacontrol_appid(providerid, uid, appid); /* FIXME: It should return PMINFO_R_ENOENT but to keep previous * implementation, return PMINFO_R_ERROR. This should be * modified later... @@ -2397,89 +1626,11 @@ API int pkgmgrinfo_appinfo_usr_get_datacontrol_appid(const char *providerid, return ret; } -API int pkgmgrinfo_appinfo_get_datacontrol_appid(const char *providerid, char **appid) -{ - return pkgmgrinfo_appinfo_usr_get_datacontrol_appid(providerid, _getuid(), appid); -} - -static int _appinfo_get_datacontrol_trusted_info(sqlite3 *db, - const char *providerid, const char *type, char **appid, - bool *is_trusted) -{ - static const char query[] = - "SELECT app_id, trusted FROM package_app_data_control " - "WHERE providerid=? AND type=?"; - int ret; - sqlite3_stmt *stmt; - - ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL); - if (ret != SQLITE_OK) { - LOGE("prepare failed: %s", sqlite3_errmsg(db)); - return PMINFO_R_ERROR; - } - - ret = sqlite3_bind_text(stmt, 1, providerid, -1, SQLITE_STATIC); - if (ret != SQLITE_OK) { - LOGE("bind failed: %s", sqlite3_errmsg(db)); - sqlite3_finalize(stmt); - return PMINFO_R_ERROR; - } - - ret = sqlite3_bind_text(stmt, 2, type, -1, SQLITE_STATIC); - if (ret != SQLITE_OK) { - LOGE("bind failed: %s", sqlite3_errmsg(db)); - sqlite3_finalize(stmt); - return PMINFO_R_ERROR; - } - - ret = sqlite3_step(stmt); - if (ret != SQLITE_ROW) { - sqlite3_finalize(stmt); - if (ret == SQLITE_DONE) { - return PMINFO_R_ENOENT; - } else { - LOGE("step error: %s", sqlite3_errmsg(db)); - return PMINFO_R_ERROR; - } - } - - *appid = strdup((char *)sqlite3_column_text(stmt, 0)); - *is_trusted = _get_bool_value((char *)sqlite3_column_text(stmt, 1)); - - sqlite3_finalize(stmt); - - if (*appid == NULL) { - LOGE("out of memory"); - return PMINFO_R_ERROR; - } - - return PMINFO_R_OK; -} - -static int _pkgmgrinfo_appinfo_get_datacontrol_trusted_info(uid_t uid, - const char *providerid, const char *type, char **appid, - bool *is_trusted) +API int pkgmgrinfo_appinfo_get_datacontrol_appid( + const char *providerid, char **appid) { - int ret; - char *dbpath; - sqlite3 *db; - - dbpath = getUserPkgParserDBPathUID(GLOBAL_USER); - if (dbpath == NULL) - return PMINFO_R_ERROR; - - ret = __open_db(dbpath, &db, SQLITE_OPEN_READONLY); - free(dbpath); - if (ret != SQLITE_OK) { - LOGE("open db failed: %s", sqlite3_errmsg(db)); - return PMINFO_R_ERROR; - } - - ret = _appinfo_get_datacontrol_trusted_info(db, providerid, type, appid, - is_trusted); - sqlite3_close_v2(db); - - return ret; + return pkgmgrinfo_appinfo_usr_get_datacontrol_appid( + providerid, _getuid(), appid); } API int pkgmgrinfo_appinfo_usr_get_datacontrol_trusted_info( @@ -2487,6 +1638,7 @@ API int pkgmgrinfo_appinfo_usr_get_datacontrol_trusted_info( char **appid, bool *is_trusted) { int ret; + char *trusted = NULL; if (providerid == NULL || type == NULL || appid == NULL || is_trusted == NULL) { @@ -2494,11 +1646,8 @@ API int pkgmgrinfo_appinfo_usr_get_datacontrol_trusted_info( return PMINFO_R_EINVAL; } - ret = _pkgmgrinfo_appinfo_get_datacontrol_trusted_info(GLOBAL_USER, - providerid, type, appid, is_trusted); - if (ret == PMINFO_R_ENOENT && uid != GLOBAL_USER) - ret = _pkgmgrinfo_appinfo_get_datacontrol_trusted_info(uid, - providerid, type, appid, is_trusted); + ret = _appinfo_get_datacontrol_trusted_info(providerid, type, uid, + appid, &trusted); /* FIXME: It should return PMINFO_R_ENOENT but to keep previous * implementation, return PMINFO_R_ERROR. This should be @@ -2508,6 +1657,8 @@ API int pkgmgrinfo_appinfo_usr_get_datacontrol_trusted_info( LOGE("no datacontrol trusted info of %s", providerid); ret = PMINFO_R_ERROR; } + *is_trusted = _get_bool_value(trusted); + free(trusted); return ret; } @@ -2519,98 +1670,36 @@ API int pkgmgrinfo_appinfo_get_datacontrol_trsuted_info(const char *providerid, type, _getuid(), appid, is_trusted); } -static int _appinfo_foreach_datacontrol_privileges(sqlite3 *db, - const char *providerid, const char *type, - pkgmgrinfo_pkg_privilege_list_cb callback, void *user_data) -{ - static const char query[] = - "SELECT privilege FROM package_app_data_control_privilege " - "WHERE providerid=? AND type=?"; - int ret; - sqlite3_stmt *stmt; - int count = 0; - - ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL); - if (ret != SQLITE_OK) { - LOGE("prepare failed: %s", sqlite3_errmsg(db)); - return PMINFO_R_ERROR; - } - - ret = sqlite3_bind_text(stmt, 1, providerid, -1, SQLITE_STATIC); - if (ret != SQLITE_OK) { - LOGE("bind failed: %s", sqlite3_errmsg(db)); - sqlite3_finalize(stmt); - return PMINFO_R_ERROR; - } - - ret = sqlite3_bind_text(stmt, 2, type, -1, SQLITE_STATIC); - if (ret != SQLITE_OK) { - LOGE("bind failed: %s", sqlite3_errmsg(db)); - sqlite3_finalize(stmt); - return PMINFO_R_ERROR; - } - - while (sqlite3_step(stmt) == SQLITE_ROW) { - count++; - ret = callback((const char *)sqlite3_column_text(stmt, 0), - user_data); - if (ret < 0) - break; - } - - sqlite3_finalize(stmt); - - return count ? PMINFO_R_OK : PMINFO_R_ENOENT; -} - -static int _pkgmgrinfo_appinfo_foreach_datacontrol_privileges(uid_t uid, - const char *providerid, const char *type, - pkgmgrinfo_pkg_privilege_list_cb callback, void *user_data) -{ - int ret; - char *dbpath; - sqlite3 *db; - - dbpath = getUserPkgParserDBPathUID(GLOBAL_USER); - if (dbpath == NULL) - return PMINFO_R_ERROR; - - ret = __open_db(dbpath, &db, SQLITE_OPEN_READONLY); - free(dbpath); - if (ret != SQLITE_OK) { - LOGE("open db failed: %s", sqlite3_errmsg(db)); - return PMINFO_R_ERROR; - } - - ret = _appinfo_foreach_datacontrol_privileges(db, providerid, type, - callback, user_data); - sqlite3_close_v2(db); - - return ret; -} - API int pkgmgrinfo_appinfo_usr_foreach_datacontrol_privileges( const char *providerid, const char *type, pkgmgrinfo_pkg_privilege_list_cb privilege_func, void *user_data, uid_t uid) { int ret; + int count = 0; + GList *list = NULL; + GList *tmp = NULL; if (providerid == NULL || type == NULL || privilege_func == NULL) { LOGE("invalid parameter"); return PMINFO_R_EINVAL; } - ret = _pkgmgrinfo_appinfo_foreach_datacontrol_privileges(GLOBAL_USER, - providerid, type, privilege_func, user_data); - if (ret == PMINFO_R_ENOENT && uid != GLOBAL_USER) - ret = _pkgmgrinfo_appinfo_foreach_datacontrol_privileges(uid, - providerid, type, privilege_func, user_data); + ret = _appinfo_get_datacontrol_privileges(providerid, type, uid, &list); + if (ret == PMINFO_R_ERROR) { + g_list_free_full(list, free); + return ret; + } - if (ret == PMINFO_R_ENOENT) - ret = PMINFO_R_OK; + for (tmp = list; tmp != NULL; tmp = g_list_next(tmp)) { + count++; + ret = privilege_func((char *)tmp->data, user_data); + if (ret < 0) + break; + } - return ret; + g_list_free_full(list, free); + return PMINFO_R_OK; } API int pkgmgrinfo_appinfo_foreach_datacontrol_privileges( @@ -2622,12 +1711,15 @@ API int pkgmgrinfo_appinfo_foreach_datacontrol_privileges( providerid, type, privilege_func, user_data, _getuid()); } -API int pkgmgrinfo_appinfo_get_support_mode(pkgmgrinfo_appinfo_h handle, int *support_mode) +API int pkgmgrinfo_appinfo_get_support_mode( + pkgmgrinfo_appinfo_h handle, int *support_mode) { retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); - retvm_if(support_mode == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + retvm_if(support_mode == NULL, PMINFO_R_EINVAL, + "Argument supplied to hold return value is NULL"); pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + if (info->app_info->support_mode) *support_mode = atoi(info->app_info->support_mode); else @@ -2637,10 +1729,11 @@ API int pkgmgrinfo_appinfo_get_support_mode(pkgmgrinfo_appinfo_h handle, int *s } API int pkgmgrinfo_appinfo_foreach_category(pkgmgrinfo_appinfo_h handle, - pkgmgrinfo_app_category_list_cb category_func, void *user_data) + pkgmgrinfo_app_category_list_cb category_func, void *user_data) { retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); - retvm_if(category_func == NULL, PMINFO_R_EINVAL, "Callback function is NULL"); + retvm_if(category_func == NULL, PMINFO_R_EINVAL, + "Callback function is NULL"); int ret = -1; const char *category; GList *tmp; @@ -2661,10 +1754,11 @@ API int pkgmgrinfo_appinfo_foreach_category(pkgmgrinfo_appinfo_h handle, } API int pkgmgrinfo_appinfo_foreach_metadata(pkgmgrinfo_appinfo_h handle, - pkgmgrinfo_app_metadata_list_cb metadata_func, void *user_data) + pkgmgrinfo_app_metadata_list_cb metadata_func, void *user_data) { retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); - retvm_if(metadata_func == NULL, PMINFO_R_EINVAL, "Callback function is NULL"); + retvm_if(metadata_func == NULL, PMINFO_R_EINVAL, + "Callback function is NULL"); int ret = -1; metadata_x *ptr; GList *tmp; @@ -2678,7 +1772,8 @@ API int pkgmgrinfo_appinfo_foreach_metadata(pkgmgrinfo_appinfo_h handle, if (ptr == NULL) continue; if (ptr->key) { - ret = metadata_func(ptr->key, ptr->value ? ptr->value : "", user_data); + ret = metadata_func(ptr->key, ptr->value ? + ptr->value : "", user_data); if (ret < 0) break; } @@ -2686,119 +1781,84 @@ API int pkgmgrinfo_appinfo_foreach_metadata(pkgmgrinfo_appinfo_h handle, return PMINFO_R_OK; } -static int _appinfo_foreach_appcontrol_privileges(sqlite3 *db, - const char *appid, const char *app_control, - pkgmgrinfo_pkg_privilege_list_cb callback, void *user_data) -{ - static const char query[] = - "SELECT privilege FROM package_app_app_control_privilege " - "WHERE app_id=? AND app_control=?"; - int ret; - sqlite3_stmt *stmt; - int count = 0; - - ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL); - if (ret != SQLITE_OK) { - LOGE("prepare failed: %s", sqlite3_errmsg(db)); - return PMINFO_R_ERROR; - } - - ret = sqlite3_bind_text(stmt, 1, appid, -1, SQLITE_STATIC); - if (ret != SQLITE_OK) { - LOGE("bind failed: %s", sqlite3_errmsg(db)); - sqlite3_finalize(stmt); - return PMINFO_R_ERROR; - } - - ret = sqlite3_bind_text(stmt, 2, app_control, -1, SQLITE_STATIC); - if (ret != SQLITE_OK) { - LOGE("bind failed: %s", sqlite3_errmsg(db)); - sqlite3_finalize(stmt); - return PMINFO_R_ERROR; - } - - while (sqlite3_step(stmt) == SQLITE_ROW) { - count++; - ret = callback((const char *)sqlite3_column_text(stmt, 0), - user_data); - if (ret < 0) - break; - } - - sqlite3_finalize(stmt); - - return count ? PMINFO_R_OK : PMINFO_R_ENOENT; -} - -static int _pkgmgrinfo_appinfo_foreach_appcontrol_privileges(uid_t uid, - const char *appid, const char *app_control, - pkgmgrinfo_pkg_privilege_list_cb callback, void *user_data) -{ - int ret; - char *dbpath; - sqlite3 *db; - - dbpath = getUserPkgParserDBPathUID(uid); - if (dbpath == NULL) - return PMINFO_R_ERROR; - - ret = __open_db(dbpath, &db, SQLITE_OPEN_READONLY); - free(dbpath); - if (ret != SQLITE_OK) { - LOGE("open db failed: %s", sqlite3_errmsg(db)); - return PMINFO_R_ERROR; - } - - ret = _appinfo_foreach_appcontrol_privileges(db, appid, app_control, - callback, user_data); - sqlite3_close_v2(db); - - return ret; -} - API int pkgmgrinfo_appinfo_usr_foreach_appcontrol_privileges(const char *appid, - const char *operation, const char *uri, const char *mime, + const char *operation, pkgmgrinfo_pkg_privilege_list_cb privilege_func, void *user_data, uid_t uid) { int ret; - char app_control[BUFSIZE]; + GList *privilege_list = NULL; + GList *tmp_list; if (appid == NULL || operation == NULL || privilege_func == NULL) { LOGE("invalid parameter"); return PMINFO_R_EINVAL; } - snprintf(app_control, sizeof(app_control), "%s|%s|%s", operation, - uri ? uri : "NULL", mime ? mime : "NULL"); - - ret = _pkgmgrinfo_appinfo_foreach_appcontrol_privileges(GLOBAL_USER, - appid, app_control, privilege_func, user_data); - if (ret == PMINFO_R_ENOENT && uid != GLOBAL_USER) - ret = _pkgmgrinfo_appinfo_foreach_appcontrol_privileges(uid, - appid, app_control, privilege_func, user_data); + ret = _appinfo_get_appcontrol_privileges(appid, operation, uid, + &privilege_list); + if (ret == PMINFO_R_ENOENT) { + return PMINFO_R_OK; + } else if (ret != PMINFO_R_OK) { + g_list_free_full(privilege_list, free); + return ret; + } - if (ret == PMINFO_R_ENOENT) - ret = PMINFO_R_OK; + for (tmp_list = privilege_list; tmp_list != NULL; + tmp_list = g_list_next(tmp_list)) { + ret = privilege_func((char *)tmp_list->data, user_data); + if (ret != 0) + break; + } - return ret; + g_list_free_full(privilege_list, free); + return PMINFO_R_OK; } API int pkgmgrinfo_appinfo_foreach_appcontrol_privileges(const char *appid, - const char *operation, const char *uri, const char *mime, + const char *operation, pkgmgrinfo_pkg_privilege_list_cb privilege_func, void *user_data) { return pkgmgrinfo_appinfo_usr_foreach_appcontrol_privileges(appid, - operation, uri, mime, privilege_func, user_data, - _getuid()); + operation, privilege_func, user_data, _getuid()); } API int pkgmgrinfo_appinfo_foreach_appcontrol(pkgmgrinfo_appinfo_h handle, - pkgmgrinfo_app_control_list_cb appcontrol_func, void *user_data) + pkgmgrinfo_app_control_list_cb appcontrol_func, void *user_data) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(appcontrol_func == NULL, PMINFO_R_EINVAL, + "Callback function is NULL"); + int ret; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + appcontrol_x *appcontrol; + GList *tmp; + + if (info->app_info == NULL) + return PMINFO_R_ERROR; + + for (tmp = info->app_info->appcontrol; tmp; tmp = tmp->next) { + appcontrol = (appcontrol_x *)tmp->data; + if (appcontrol == NULL || !strcasecmp( + appcontrol->visibility, "remote-only")) + continue; + ret = appcontrol_func(appcontrol->operation, + appcontrol->uri, appcontrol->mime, user_data); + if (ret < 0) + break; + } + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_foreach_remote_appcontrol( + pkgmgrinfo_appinfo_h handle, + pkgmgrinfo_app_control_list_cb appcontrol_func, void *user_data) { retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); - retvm_if(appcontrol_func == NULL, PMINFO_R_EINVAL, "Callback function is NULL"); + retvm_if(appcontrol_func == NULL, PMINFO_R_EINVAL, + "Callback function is NULL"); int ret; pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; appcontrol_x *appcontrol; @@ -2809,9 +1869,11 @@ API int pkgmgrinfo_appinfo_foreach_appcontrol(pkgmgrinfo_appinfo_h handle, for (tmp = info->app_info->appcontrol; tmp; tmp = tmp->next) { appcontrol = (appcontrol_x *)tmp->data; - if (appcontrol == NULL) + if (appcontrol == NULL || !strcasecmp( + appcontrol->visibility, "local-only")) continue; - ret = appcontrol_func(appcontrol->operation, appcontrol->uri, appcontrol->mime, user_data); + ret = appcontrol_func(appcontrol->operation, appcontrol->uri, + appcontrol->mime, user_data); if (ret < 0) break; } @@ -2878,10 +1940,42 @@ API int pkgmgrinfo_appinfo_foreach_splash_screen(pkgmgrinfo_appinfo_h handle, return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_is_nodisplay(pkgmgrinfo_appinfo_h handle, bool *nodisplay) +API int pkgmgrinfo_appinfo_foreach_res_control(pkgmgrinfo_appinfo_h handle, + pkgmgrinfo_app_res_control_list_cb res_control_func, + void *user_data) { retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); - retvm_if(nodisplay == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + retvm_if(res_control_func == NULL, PMINFO_R_EINVAL, + "Callback function is NULL"); + int ret = -1; + res_control_x *res_control; + GList *tmp; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + + if (info->app_info == NULL) + return PMINFO_R_ERROR; + + for (tmp = info->app_info->res_control; tmp; tmp = tmp->next) { + res_control = (res_control_x *)tmp->data; + if (res_control == NULL) + continue; + ret = res_control_func(res_control->res_type, + res_control->min_res_version, + res_control->max_res_version, + res_control->auto_close, + user_data); + if (ret < 0) + break; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_is_nodisplay( + pkgmgrinfo_appinfo_h handle, bool *nodisplay) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(nodisplay == NULL, PMINFO_R_EINVAL, + "Argument supplied to hold return value is NULL"); pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; if (info->app_info == NULL || info->app_info->nodisplay == NULL) @@ -2892,10 +1986,12 @@ API int pkgmgrinfo_appinfo_is_nodisplay(pkgmgrinfo_appinfo_h handle, bool *nodis return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_is_multiple(pkgmgrinfo_appinfo_h handle, bool *multiple) +API int pkgmgrinfo_appinfo_is_multiple( + pkgmgrinfo_appinfo_h handle, bool *multiple) { retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); - retvm_if(multiple == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + retvm_if(multiple == NULL, PMINFO_R_EINVAL, + "Argument supplied to hold return value is NULL"); pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; if (info->app_info == NULL || info->app_info->multiple == NULL) @@ -2906,10 +2002,12 @@ API int pkgmgrinfo_appinfo_is_multiple(pkgmgrinfo_appinfo_h handle, bool *multip return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_is_indicator_display_allowed(pkgmgrinfo_appinfo_h handle, bool *indicator_disp) +API int pkgmgrinfo_appinfo_is_indicator_display_allowed( + pkgmgrinfo_appinfo_h handle, bool *indicator_disp) { retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); - retvm_if(indicator_disp == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + retvm_if(indicator_disp == NULL, PMINFO_R_EINVAL, + "Argument supplied to hold return value is NULL"); pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; if (info->app_info == NULL || info->app_info->indicatordisplay == NULL) @@ -2920,10 +2018,12 @@ API int pkgmgrinfo_appinfo_is_indicator_display_allowed(pkgmgrinfo_appinfo_h han return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_is_taskmanage(pkgmgrinfo_appinfo_h handle, bool *taskmanage) +API int pkgmgrinfo_appinfo_is_taskmanage( + pkgmgrinfo_appinfo_h handle, bool *taskmanage) { retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); - retvm_if(taskmanage == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + retvm_if(taskmanage == NULL, PMINFO_R_EINVAL, + "Argument supplied to hold return value is NULL"); pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; if (info->app_info == NULL || info->app_info->taskmanage == NULL) @@ -2934,10 +2034,12 @@ API int pkgmgrinfo_appinfo_is_taskmanage(pkgmgrinfo_appinfo_h handle, bool *tas return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_is_enabled(pkgmgrinfo_appinfo_h handle, bool *enabled) +API int pkgmgrinfo_appinfo_is_enabled( + pkgmgrinfo_appinfo_h handle, bool *enabled) { retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); - retvm_if(enabled == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + retvm_if(enabled == NULL, PMINFO_R_EINVAL, + "Argument supplied to hold return value is NULL"); pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; if (info->app_info == NULL || info->app_info->is_disabled == NULL) @@ -2948,10 +2050,12 @@ API int pkgmgrinfo_appinfo_is_enabled(pkgmgrinfo_appinfo_h handle, bool *enable return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_is_onboot(pkgmgrinfo_appinfo_h handle, bool *onboot) +API int pkgmgrinfo_appinfo_is_onboot( + pkgmgrinfo_appinfo_h handle, bool *onboot) { retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); - retvm_if(onboot == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + retvm_if(onboot == NULL, PMINFO_R_EINVAL, + "Argument supplied to hold return value is NULL"); pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; if (info->app_info == NULL || info->app_info->onboot == NULL) @@ -2962,10 +2066,12 @@ API int pkgmgrinfo_appinfo_is_onboot(pkgmgrinfo_appinfo_h handle, bool *onboot) return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_is_autorestart(pkgmgrinfo_appinfo_h handle, bool *autorestart) +API int pkgmgrinfo_appinfo_is_autorestart( + pkgmgrinfo_appinfo_h handle, bool *autorestart) { retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); - retvm_if(autorestart == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + retvm_if(autorestart == NULL, PMINFO_R_EINVAL, + "Argument supplied to hold return value is NULL"); pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; if (info->app_info == NULL || info->app_info->autorestart == NULL) @@ -2976,10 +2082,12 @@ API int pkgmgrinfo_appinfo_is_autorestart(pkgmgrinfo_appinfo_h handle, bool *au return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_is_mainapp(pkgmgrinfo_appinfo_h handle, bool *mainapp) +API int pkgmgrinfo_appinfo_is_mainapp( + pkgmgrinfo_appinfo_h handle, bool *mainapp) { retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); - retvm_if(mainapp == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + retvm_if(mainapp == NULL, PMINFO_R_EINVAL, + "Argument supplied to hold return value is NULL"); pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; if (info->app_info == NULL || info->app_info->mainapp == NULL) @@ -2990,10 +2098,12 @@ API int pkgmgrinfo_appinfo_is_mainapp(pkgmgrinfo_appinfo_h handle, bool *mainap return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_is_preload(pkgmgrinfo_appinfo_h handle, bool *preload) +API int pkgmgrinfo_appinfo_is_preload( + pkgmgrinfo_appinfo_h handle, bool *preload) { retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL\n"); - retvm_if(preload == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + retvm_if(preload == NULL, PMINFO_R_EINVAL, + "Argument supplied to hold return value is NULL\n"); pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; if (info->app_info == NULL || info->app_info->preload == NULL) @@ -3004,10 +2114,12 @@ API int pkgmgrinfo_appinfo_is_preload(pkgmgrinfo_appinfo_h handle, bool *preload return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_is_submode(pkgmgrinfo_appinfo_h handle, bool *submode) +API int pkgmgrinfo_appinfo_is_submode( + pkgmgrinfo_appinfo_h handle, bool *submode) { retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL\n"); - retvm_if(submode == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + retvm_if(submode == NULL, PMINFO_R_EINVAL, + "Argument supplied to hold return value is NULL\n"); pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; if (info->app_info == NULL || info->app_info->submode == NULL) @@ -3018,7 +2130,8 @@ API int pkgmgrinfo_appinfo_is_submode(pkgmgrinfo_appinfo_h handle, bool *submode return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_is_process_pool(pkgmgrinfo_appinfo_h handle, bool *process_pool) +API int pkgmgrinfo_appinfo_is_process_pool( + pkgmgrinfo_appinfo_h handle, bool *process_pool) { pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; @@ -3035,7 +2148,8 @@ API int pkgmgrinfo_appinfo_is_process_pool(pkgmgrinfo_appinfo_h handle, bool *pr return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_is_category_exist(pkgmgrinfo_appinfo_h handle, const char *category, bool *exist) +API int pkgmgrinfo_appinfo_is_category_exist( + pkgmgrinfo_appinfo_h handle, const char *category, bool *exist) { retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); retvm_if(category == NULL, PMINFO_R_EINVAL, "category is NULL"); @@ -3123,10 +2237,12 @@ API int pkgmgrinfo_appinfo_is_system(pkgmgrinfo_appinfo_h handle, bool *system) return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_is_disabled(pkgmgrinfo_appinfo_h handle, bool *disabled) +API int pkgmgrinfo_appinfo_is_disabled( + pkgmgrinfo_appinfo_h handle, bool *disabled) { retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); - retvm_if(disabled == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + retvm_if(disabled == NULL, PMINFO_R_EINVAL, + "Argument supplied to hold return value is NULL"); pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; if (info->app_info == NULL || info->app_info->is_disabled == NULL) @@ -3142,7 +2258,8 @@ API int pkgmgrinfo_appinfo_is_global(pkgmgrinfo_appinfo_h handle, bool *global) pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL\n"); - retvm_if(global == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + retvm_if(global == NULL, PMINFO_R_EINVAL, + "Argument supplied to hold return value is NULL\n"); if (info->app_info == NULL || info->app_info->for_all_users == NULL) return PMINFO_R_ERROR; @@ -3152,7 +2269,8 @@ API int pkgmgrinfo_appinfo_is_global(pkgmgrinfo_appinfo_h handle, bool *global) return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_get_splash_screen_display(pkgmgrinfo_appinfo_h handle, bool *splash_screen_display) +API int pkgmgrinfo_appinfo_get_splash_screen_display( + pkgmgrinfo_appinfo_h handle, bool *splash_screen_display) { pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; @@ -3161,15 +2279,18 @@ API int pkgmgrinfo_appinfo_get_splash_screen_display(pkgmgrinfo_appinfo_h handle return PMINFO_R_EINVAL; } - if (info->app_info == NULL || info->app_info->splash_screen_display == NULL) + if (info->app_info == NULL || + info->app_info->splash_screen_display == NULL) return PMINFO_R_ERROR; - *splash_screen_display = _get_bool_value(info->app_info->splash_screen_display); + *splash_screen_display = + _get_bool_value(info->app_info->splash_screen_display); return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_get_setup_appid(pkgmgrinfo_appinfo_h handle, char **setup_appid) +API int pkgmgrinfo_appinfo_get_setup_appid( + pkgmgrinfo_appinfo_h handle, char **setup_appid) { pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; @@ -3203,28 +2324,48 @@ API int pkgmgrinfo_appinfo_is_support_ambient(pkgmgrinfo_appinfo_h handle, return PMINFO_R_OK; } +API int pkgmgrinfo_appinfo_get_light_user_switch_mode( + pkgmgrinfo_appinfo_h handle, char **mode) +{ + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + + if (info == NULL || mode == NULL) { + _LOGE("Invalid parameter"); + return PMINFO_R_EINVAL; + } + + if (info->app_info == NULL || info->app_info->light_user_switch_mode == NULL) + return PMINFO_R_ERROR; + + *mode = info->app_info->light_user_switch_mode; + + return PMINFO_R_OK; +} + API int pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo_h handle) { retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + __cleanup_appinfo(info); return PMINFO_R_OK; } API int pkgmgrinfo_appinfo_filter_create(pkgmgrinfo_appinfo_filter_h *handle) { - return (pkgmgrinfo_pkginfo_filter_create(handle)); + return pkgmgrinfo_pkginfo_filter_create(handle); } API int pkgmgrinfo_appinfo_filter_destroy(pkgmgrinfo_appinfo_filter_h handle) { - return (pkgmgrinfo_pkginfo_filter_destroy(handle)); + return pkgmgrinfo_pkginfo_filter_destroy(handle); } static gint __compare_func(gconstpointer data1, gconstpointer data2) { pkgmgrinfo_node_x *node1 = (pkgmgrinfo_node_x *)data1; pkgmgrinfo_node_x *node2 = (pkgmgrinfo_node_x *)data2; + if (node1->prop == node2->prop) return 0; else if (node1->prop > node2->prop) @@ -3236,12 +2377,15 @@ static gint __compare_func(gconstpointer data1, gconstpointer data2) API int pkgmgrinfo_appinfo_filter_add_int(pkgmgrinfo_appinfo_filter_h handle, const char *property, const int value) { - retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n"); - retvm_if(property == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n"); + retvm_if(handle == NULL, PMINFO_R_EINVAL, + "Filter handle input parameter is NULL\n"); + retvm_if(property == NULL, PMINFO_R_EINVAL, + "Filter handle input parameter is NULL\n"); char buf[PKG_VALUE_STRING_LEN_MAX] = {'\0'}; char *val = NULL; GSList *link = NULL; int prop = -1; + prop = _pminfo_appinfo_convert_to_prop_int(property); if (prop < E_PMINFO_APPINFO_PROP_APP_MIN_INT || prop > E_PMINFO_APPINFO_PROP_APP_MAX_INT) { @@ -3249,7 +2393,8 @@ API int pkgmgrinfo_appinfo_filter_add_int(pkgmgrinfo_appinfo_filter_h handle, return PMINFO_R_EINVAL; } pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x *)handle; - pkgmgrinfo_node_x *node = (pkgmgrinfo_node_x *)calloc(1, sizeof(pkgmgrinfo_node_x)); + pkgmgrinfo_node_x *node = (pkgmgrinfo_node_x *)calloc(1, + sizeof(pkgmgrinfo_node_x)); if (node == NULL) { _LOGE("Out of Memory!!!\n"); return PMINFO_R_ERROR; @@ -3264,11 +2409,18 @@ API int pkgmgrinfo_appinfo_filter_add_int(pkgmgrinfo_appinfo_filter_h handle, } node->prop = prop; node->value = val; - /*If API is called multiple times for same property, we should override the previous values. - Last value set will be used for filtering.*/ - link = g_slist_find_custom(filter->list, (gconstpointer)node, __compare_func); - if (link) + + /* + * If API is called multiple times for same property, + * we should override the previous values. + * Last value set will be used for filtering. + */ + link = g_slist_find_custom(filter->list, + (gconstpointer)node, __compare_func); + if (link) { + _pkgmgrinfo_node_destroy(link->data); filter->list = g_slist_delete_link(filter->list, link); + } filter->list = g_slist_append(filter->list, (gpointer)node); return PMINFO_R_OK; @@ -3277,11 +2429,14 @@ API int pkgmgrinfo_appinfo_filter_add_int(pkgmgrinfo_appinfo_filter_h handle, API int pkgmgrinfo_appinfo_filter_add_bool(pkgmgrinfo_appinfo_filter_h handle, const char *property, const bool value) { - retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n"); - retvm_if(property == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n"); + retvm_if(handle == NULL, PMINFO_R_EINVAL, + "Filter handle input parameter is NULL\n"); + retvm_if(property == NULL, PMINFO_R_EINVAL, + "Filter handle input parameter is NULL\n"); char *val = NULL; GSList *link = NULL; int prop = -1; + prop = _pminfo_appinfo_convert_to_prop_bool(property); if (prop < E_PMINFO_APPINFO_PROP_APP_MIN_BOOL || prop > E_PMINFO_APPINFO_PROP_APP_MAX_BOOL) { @@ -3289,7 +2444,8 @@ API int pkgmgrinfo_appinfo_filter_add_bool(pkgmgrinfo_appinfo_filter_h handle, return PMINFO_R_EINVAL; } pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x *)handle; - pkgmgrinfo_node_x *node = (pkgmgrinfo_node_x *)calloc(1, sizeof(pkgmgrinfo_node_x)); + pkgmgrinfo_node_x *node = (pkgmgrinfo_node_x *)calloc(1, + sizeof(pkgmgrinfo_node_x)); if (node == NULL) { _LOGE("Out of Memory!!!\n"); return PMINFO_R_ERROR; @@ -3306,11 +2462,17 @@ API int pkgmgrinfo_appinfo_filter_add_bool(pkgmgrinfo_appinfo_filter_h handle, } node->prop = prop; node->value = val; - /*If API is called multiple times for same property, we should override the previous values. - Last value set will be used for filtering.*/ - link = g_slist_find_custom(filter->list, (gconstpointer)node, __compare_func); - if (link) + /* + * If API is called multiple times for same property, + * we should override the previous values. + * Last value set will be used for filtering. + */ + link = g_slist_find_custom(filter->list, + (gconstpointer)node, __compare_func); + if (link) { + _pkgmgrinfo_node_destroy(link->data); filter->list = g_slist_delete_link(filter->list, link); + } filter->list = g_slist_append(filter->list, (gpointer)node); return PMINFO_R_OK; @@ -3319,15 +2481,20 @@ API int pkgmgrinfo_appinfo_filter_add_bool(pkgmgrinfo_appinfo_filter_h handle, API int pkgmgrinfo_appinfo_filter_add_string(pkgmgrinfo_appinfo_filter_h handle, const char *property, const char *value) { - retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n"); - retvm_if(property == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n"); - retvm_if(value == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n"); + retvm_if(handle == NULL, PMINFO_R_EINVAL, + "Filter handle input parameter is NULL\n"); + retvm_if(property == NULL, PMINFO_R_EINVAL, + "Filter handle input parameter is NULL\n"); + retvm_if(value == NULL, PMINFO_R_EINVAL, + "Filter handle input parameter is NULL\n"); char *val = NULL; pkgmgrinfo_node_x *ptr = NULL; char prev[PKG_STRING_LEN_MAX] = {'\0'}; char temp[PKG_STRING_LEN_MAX] = {'\0'}; GSList *link = NULL; int prop = -1; + int ret; + prop = _pminfo_appinfo_convert_to_prop_str(property); if (prop < E_PMINFO_APPINFO_PROP_APP_MIN_STR || prop > E_PMINFO_APPINFO_PROP_APP_MAX_STR) { @@ -3335,7 +2502,8 @@ API int pkgmgrinfo_appinfo_filter_add_string(pkgmgrinfo_appinfo_filter_h handle, return PMINFO_R_EINVAL; } pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x *)handle; - pkgmgrinfo_node_x *node = (pkgmgrinfo_node_x *)calloc(1, sizeof(pkgmgrinfo_node_x)); + pkgmgrinfo_node_x *node = (pkgmgrinfo_node_x *)calloc(1, + sizeof(pkgmgrinfo_node_x)); if (node == NULL) { _LOGE("Out of Memory!!!\n"); return PMINFO_R_ERROR; @@ -3344,9 +2512,12 @@ API int pkgmgrinfo_appinfo_filter_add_string(pkgmgrinfo_appinfo_filter_h handle, switch (prop) { case E_PMINFO_APPINFO_PROP_APP_COMPONENT: node->value = strdup(value); - link = g_slist_find_custom(filter->list, (gconstpointer)node, __compare_func); - if (link) + link = g_slist_find_custom(filter->list, + (gconstpointer)node, __compare_func); + if (link) { + _pkgmgrinfo_node_destroy(link->data); filter->list = g_slist_delete_link(filter->list, link); + } filter->list = g_slist_append(filter->list, (gpointer)node); break; case E_PMINFO_APPINFO_PROP_APP_CATEGORY: @@ -3357,66 +2528,76 @@ API int pkgmgrinfo_appinfo_filter_add_string(pkgmgrinfo_appinfo_filter_h handle, node = NULL; return PMINFO_R_ERROR; } - link = g_slist_find_custom(filter->list, (gconstpointer)node, __compare_func); + link = g_slist_find_custom(filter->list, + (gconstpointer)node, __compare_func); if (link) { ptr = (pkgmgrinfo_node_x *)link->data; strncpy(prev, ptr->value, PKG_STRING_LEN_MAX - 1); _LOGI("Previous value is %s\n", prev); + _pkgmgrinfo_node_destroy(ptr); filter->list = g_slist_delete_link(filter->list, link); - snprintf(temp, PKG_STRING_LEN_MAX - 1, "%s,%s", prev, value); - strncpy(val, temp, PKG_STRING_LEN_MAX - 1); + ret = snprintf(temp, PKG_STRING_LEN_MAX - 1, + "%s,%s", prev, value); + if (ret < 0 || ret > PKG_STRING_LEN_MAX - 1) { + _LOGE("snprintf fail\n"); + free(node); + free(val); + return PMINFO_R_ERROR; + } + strncpy(val, temp, PKG_STRING_LEN_MAX); _LOGI("New value is %s\n", val); node->value = val; - filter->list = g_slist_append(filter->list, (gpointer)node); + filter->list = g_slist_append( + filter->list, (gpointer)node); memset(temp, '\0', PKG_STRING_LEN_MAX); } else { snprintf(temp, PKG_STRING_LEN_MAX - 1, "%s", value); - strncpy(val, temp, PKG_STRING_LEN_MAX - 1); + strncpy(val, temp, PKG_STRING_LEN_MAX); _LOGI("First value is %s\n", val); node->value = val; - filter->list = g_slist_append(filter->list, (gpointer)node); + filter->list = g_slist_append( + filter->list, (gpointer)node); memset(temp, '\0', PKG_STRING_LEN_MAX); } break; default: node->value = strndup(value, PKG_STRING_LEN_MAX - 1); - link = g_slist_find_custom(filter->list, (gconstpointer)node, __compare_func); - if (link) + link = g_slist_find_custom(filter->list, + (gconstpointer)node, __compare_func); + if (link) { + _pkgmgrinfo_node_destroy(link->data); filter->list = g_slist_delete_link(filter->list, link); + } filter->list = g_slist_append(filter->list, (gpointer)node); break; } return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_usr_filter_count(pkgmgrinfo_appinfo_filter_h handle, int *count, uid_t uid) +API int pkgmgrinfo_appinfo_usr_filter_count( + pkgmgrinfo_appinfo_filter_h handle, int *count, uid_t uid) { - int ret; - char *locale; GHashTable *list; + int ret; + int query_count; + pkgmgrinfo_filter_x *filter; if (handle == NULL || count == NULL) { _LOGE("invalid parameter"); return PMINFO_R_EINVAL; } - locale = _get_system_locale(); - if (locale == NULL) - return PMINFO_R_ERROR; - + filter = (pkgmgrinfo_filter_x *)handle; list = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, __free_applications); - if (list == NULL) { - free(locale); + if (list == NULL) return PMINFO_R_ERROR; - } if (__check_disable_filter_exist( handle, E_APPINFO_DISABLE_TYPE_APP) == false) { if (pkgmgrinfo_appinfo_filter_add_bool(handle, PMINFO_APPINFO_PROP_APP_DISABLE, false)) { g_hash_table_destroy(list); - free(locale); return PMINFO_R_ERROR; } } @@ -3426,30 +2607,22 @@ API int pkgmgrinfo_appinfo_usr_filter_count(pkgmgrinfo_appinfo_filter_h handle, if (pkgmgrinfo_appinfo_filter_add_bool(handle, PMINFO_APPINFO_PROP_PKG_DISABLE, false)) { g_hash_table_destroy(list); - free(locale); return PMINFO_R_ERROR; } } - ret = _appinfo_get_applications(uid, uid, locale, handle, 0, list); - if (ret == PMINFO_R_OK && uid != GLOBAL_USER) - ret = _appinfo_get_applications(GLOBAL_USER, uid, locale, - handle, 0, list); - - if (ret != PMINFO_R_OK) { - g_hash_table_destroy(list); - free(locale); - return PMINFO_R_ERROR; - } - - *count = g_hash_table_size(list); + ret = _appinfo_get_applications(uid, filter, 0, list); + query_count = g_hash_table_size(list); g_hash_table_destroy(list); - free(locale); + if (ret == PMINFO_R_ERROR) + return ret; + *count = query_count; return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_filter_count(pkgmgrinfo_appinfo_filter_h handle, int *count) +API int pkgmgrinfo_appinfo_filter_count( + pkgmgrinfo_appinfo_filter_h handle, int *count) { return pkgmgrinfo_appinfo_usr_filter_count(handle, count, _getuid()); } @@ -3477,24 +2650,28 @@ API int pkgmgrinfo_appinfo_usr_filter_foreach_appinfo( return PMINFO_R_ERROR; } - return _appinfo_get_filtered_foreach_appinfo(uid, handle, PMINFO_APPINFO_GET_ALL, app_cb, - user_data); + return _appinfo_get_filtered_foreach_appinfo(uid, + handle, PMINFO_APPINFO_GET_ALL, app_cb, user_data); } -API int pkgmgrinfo_appinfo_filter_foreach_appinfo(pkgmgrinfo_appinfo_filter_h handle, - pkgmgrinfo_app_list_cb app_cb, void *user_data) +API int pkgmgrinfo_appinfo_filter_foreach_appinfo( + pkgmgrinfo_appinfo_filter_h handle, + pkgmgrinfo_app_list_cb app_cb, void *user_data) { - return pkgmgrinfo_appinfo_usr_filter_foreach_appinfo(handle, app_cb, user_data, _getuid()); + return pkgmgrinfo_appinfo_usr_filter_foreach_appinfo( + handle, app_cb, user_data, _getuid()); } -API int pkgmgrinfo_appinfo_metadata_filter_create(pkgmgrinfo_appinfo_metadata_filter_h *handle) +API int pkgmgrinfo_appinfo_metadata_filter_create( + pkgmgrinfo_appinfo_metadata_filter_h *handle) { - return (pkgmgrinfo_pkginfo_filter_create(handle)); + return pkgmgrinfo_pkginfo_filter_create(handle); } -API int pkgmgrinfo_appinfo_metadata_filter_destroy(pkgmgrinfo_appinfo_metadata_filter_h handle) +API int pkgmgrinfo_appinfo_metadata_filter_destroy( + pkgmgrinfo_appinfo_metadata_filter_h handle) { - return (pkgmgrinfo_pkginfo_filter_destroy(handle)); + return pkgmgrinfo_pkginfo_filter_destroy(handle); } API int pkgmgrinfo_appinfo_metadata_filter_add( @@ -3538,6 +2715,7 @@ API int pkgmgrinfo_appinfo_usr_metadata_filter_foreach( } pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x *)handle; + if (pkgmgrinfo_appinfo_filter_add_bool(filter, PMINFO_APPINFO_PROP_APP_DISABLE, false)) return PMINFO_R_ERROR; @@ -3546,7 +2724,8 @@ API int pkgmgrinfo_appinfo_usr_metadata_filter_foreach( PMINFO_APPINFO_PROP_PKG_DISABLE, false)) return PMINFO_R_ERROR; - return _appinfo_get_filtered_foreach_appinfo(uid, handle, PMINFO_APPINFO_GET_ALL, app_cb, + return _appinfo_get_filtered_foreach_appinfo(uid, handle, + PMINFO_APPINFO_GET_ALL, app_cb, user_data); } @@ -3558,15 +2737,78 @@ API int pkgmgrinfo_appinfo_metadata_filter_foreach( user_data, _getuid()); } -API int pkgmgrinfo_appinfo_is_guestmode_visibility(pkgmgrinfo_appinfo_h handle, bool *status) +API int pkgmgrinfo_appinfo_is_guestmode_visibility( + pkgmgrinfo_appinfo_h handle, bool *status) { const char *val; pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL\n"); - retvm_if(status == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + retvm_if(status == NULL, PMINFO_R_EINVAL, + "Argument supplied to hold return value is NULL\n"); val = info->app_info->guestmode_visibility; *status = _get_bool_value(val); return PMINFO_R_OK; } + +API int pkgmgrinfo_appinfo_foreach_appcontrol_v2(pkgmgrinfo_appinfo_h handle, + pkgmgrinfo_app_control_list_cb_v2 appcontrol_func, + void *user_data) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(appcontrol_func == NULL, + PMINFO_R_EINVAL, "Callback function is NULL"); + int ret; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + appcontrol_x *appcontrol; + GList *tmp; + + if (info->app_info == NULL) + return PMINFO_R_ERROR; + + for (tmp = info->app_info->appcontrol; tmp; tmp = tmp->next) { + appcontrol = (appcontrol_x *)tmp->data; + if (appcontrol == NULL || + !strcasecmp(appcontrol->visibility, + "remote-only")) + continue; + ret = appcontrol_func(appcontrol->operation, appcontrol->uri, + appcontrol->mime, appcontrol->id, user_data); + if (ret < 0) + break; + } + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_foreach_remote_appcontrol_v2( + pkgmgrinfo_appinfo_h handle, + pkgmgrinfo_app_control_list_cb_v2 appcontrol_func, + void *user_data) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(appcontrol_func == NULL, + PMINFO_R_EINVAL, "Callback function is NULL"); + int ret; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + appcontrol_x *appcontrol; + GList *tmp; + + if (info->app_info == NULL) + return PMINFO_R_ERROR; + + for (tmp = info->app_info->appcontrol; tmp; tmp = tmp->next) { + appcontrol = (appcontrol_x *)tmp->data; + if (appcontrol == NULL || + !strcasecmp(appcontrol->visibility, + "local-only")) + continue; + ret = appcontrol_func(appcontrol->operation, appcontrol->uri, + appcontrol->mime, appcontrol->id, user_data); + if (ret < 0) + break; + } + + return PMINFO_R_OK; +}