X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fpkgmgrinfo_appinfo.c;h=a826ec338fa750c162c507306b2614f4e4082754;hb=78a62f1e24a93dfe5679935a5a5be461e485b36f;hp=e07bf52665c722bc2a284c2b3158363f23e6b8d4;hpb=50e488484683e5df4292c89c9caa53307ec4a0e2;p=platform%2Fcore%2Fappfw%2Fpkgmgr-info.git diff --git a/src/pkgmgrinfo_appinfo.c b/src/pkgmgrinfo_appinfo.c index e07bf52..a826ec3 100644 --- a/src/pkgmgrinfo_appinfo.c +++ b/src/pkgmgrinfo_appinfo.c @@ -57,81 +57,55 @@ static int _get_filtered_query(pkgmgrinfo_filter_x *filter, const char *locale, uid_t uid, char **query, GList **bind_params) { int joined = 0; - size_t len = 0; char *condition = NULL; char buf[MAX_QUERY_LEN] = { '\0' }; char tmp_query[MAX_QUERY_LEN] = { '\0' }; - static const char query_pkg_disable[] = " AND ai.package IN " - "(SELECT package FROM package_info WHERE package_disable='false')"; GSList *list; - strncat(buf, " WHERE 1=1", MAX_QUERY_LEN - len - 1); - len += strlen(" WHERE 1=1"); - - if (filter == NULL) { - strncat(buf, query_pkg_disable, MAX_QUERY_LEN - len - 1); - *query = strdup(buf); + 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 ", MAX_QUERY_LEN - len - 1); - len += strlen(" AND "); + strncat(buf, " AND ", sizeof(buf) - strlen(buf) - 1); - strncat(buf, condition, sizeof(buf) - len - 1); - len += strlen(condition); + strncat(buf, condition, sizeof(buf) - strlen(buf) - 1); free(condition); condition = NULL; } - if (filter->list_metadata) { - strncat(buf, " AND (", MAX_QUERY_LEN - len - 1); - len += strlen(" AND ("); - } + 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) - len - 1); - len += strlen(condition); + strncat(buf, condition, sizeof(buf) - strlen(buf) - 1); free(condition); condition = NULL; - strncat(buf, " OR ", MAX_QUERY_LEN - len - 1); - len += strlen(" OR "); - } - if (filter->list_metadata) { - strncat(buf, "1=0)", MAX_QUERY_LEN - len - 1); - len += strlen("1=0)"); + 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, MAX_QUERY_LEN - len - 1); - len += strlen(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, MAX_QUERY_LEN - len - 1); - len += strlen(join_category); - } - if (joined & E_PMINFO_APPINFO_JOIN_APP_CONTROL) { - strncat(tmp_query, join_app_control, MAX_QUERY_LEN - len - 1); - len += strlen(join_app_control); - } - if (joined & E_PMINFO_APPINFO_JOIN_METADATA) { - strncat(tmp_query, join_metadata, MAX_QUERY_LEN - len - 1); - len += strlen(join_metadata); - } + 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, MAX_QUERY_LEN - len - 1); - len += strlen(buf); - - strncat(tmp_query, query_pkg_disable, MAX_QUERY_LEN - len - 1); + strncat(tmp_query, buf, sizeof(tmp_query) - strlen(tmp_query) - 1); *query = strdup(tmp_query); if (*query == NULL) @@ -381,24 +355,28 @@ static void __free_applications(gpointer data) pkgmgrinfo_basic_free_application((application_x *)data); } -static gint __app_disable_chk_func(gconstpointer data1, gconstpointer data2) +static gint __disable_chk_func(gconstpointer data1, gconstpointer data2) { pkgmgrinfo_node_x *node = (pkgmgrinfo_node_x *)data1; + pkgmgrinfo_appinfo_disable_type value = GPOINTER_TO_INT(data2); - if (node->prop == E_PMINFO_APPINFO_PROP_APP_DISABLE) - return 0; + if (value == E_APPINFO_DISABLE_TYPE_PKG) + return (node->prop == E_PMINFO_APPINFO_PROP_PKG_DISABLE) + ? 0 : 1; else - return 1; + return (node->prop == E_PMINFO_APPINFO_PROP_APP_DISABLE) + ? 0 : 1; } -static bool __check_disable_filter_exist(pkgmgrinfo_filter_x *filter) +static bool __check_disable_filter_exist(pkgmgrinfo_filter_x *filter, + pkgmgrinfo_appinfo_disable_type type) { GSList *link; if (filter == NULL) return false; - link = g_slist_find_custom(filter->list, NULL, __app_disable_chk_func); + link = g_slist_find_custom(filter->list, GINT_TO_POINTER(type), __disable_chk_func); if (link) return true; @@ -490,7 +468,6 @@ static int _appinfo_get_applications(uid_t db_uid, uid_t uid, "ON (ai.app_id=ui.app_id AND ui.uid=?)"; int ret = PMINFO_R_ERROR; int idx; - int len = 0; char *dbpath; char *bg_category_str = NULL; char *constraint = NULL; @@ -510,29 +487,24 @@ static int _appinfo_get_applications(uid_t db_uid, uid_t uid, ret = __open_db(dbpath, &db, SQLITE_OPEN_READONLY); if (ret != SQLITE_OK) { - _LOGE("failed to open db: %d", ret); + _LOGE("failed to open db(%s): %d", dbpath, ret); free(dbpath); return PMINFO_R_ERROR; } free(dbpath); - len = strlen(query_raw); snprintf(query, MAX_QUERY_LEN - 1, "%s", query_raw); if (flag & PMINFO_APPINFO_GET_BASICINFO) { - strncat(query, query_basic, MAX_QUERY_LEN - len - 1); - len += strlen(query_basic); - strncat(query, query_uid_info, MAX_QUERY_LEN - len - 1); - len += strlen(query_uid_info); + 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, MAX_QUERY_LEN - len - 1); - len += strlen(query_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, MAX_QUERY_LEN - len - 1); - len += strlen(query_icon); + strncat(query, query_icon, sizeof(query) - strlen(query) - 1); bind_params = g_list_append(bind_params, strdup(locale)); } @@ -546,14 +518,12 @@ static int _appinfo_get_applications(uid_t db_uid, uid_t uid, LOGE("Failed to get WHERE clause"); goto catch; } - strncat(query, query_from_clause, MAX_QUERY_LEN - len - 1); - len += strlen(query_from_clause); + strncat(query, query_from_clause, sizeof(query) - strlen(query) - 1); - strncat(query, query_uid_info_clause, MAX_QUERY_LEN - len - 1); - len += strlen(query_uid_info_clause); + strncat(query, query_uid_info_clause, sizeof(query) - strlen(query) - 1); if (constraint) - strncat(query, constraint, MAX_QUERY_LEN - len - 1); + strncat(query, constraint, sizeof(query) - strlen(query) - 1); ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL); if (ret != SQLITE_OK) { @@ -764,7 +734,7 @@ static int _pkgmgrinfo_get_appinfo(const char *appid, uid_t uid, PMINFO_APPINFO_GET_ALL, list); if (!g_hash_table_size(list)) { - _LOGI("appinfo for [%s] is not existed for user [%d]", + _LOGD("appinfo for [%s] is not existed for user [%d]", appid, uid); g_hash_table_destroy(list); free(locale); @@ -860,6 +830,13 @@ API int pkgmgrinfo_appinfo_get_usr_appinfo(const char *appid, uid_t uid, return PMINFO_R_ERROR; } + ret = pkgmgrinfo_appinfo_filter_add_bool(filter, + PMINFO_APPINFO_PROP_PKG_DISABLE, false); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_filter_destroy(filter); + return PMINFO_R_ERROR; + } + ret = _pkgmgrinfo_get_appinfo(appid, uid, filter, handle); pkgmgrinfo_appinfo_filter_destroy(filter); return ret; @@ -1275,11 +1252,6 @@ static int _appinfo_get_filtered_foreach_appinfo(uid_t uid, return PMINFO_R_ERROR; } - if (__check_disable_filter_exist(filter) == false) { - pkgmgrinfo_appinfo_filter_add_bool(filter, - PMINFO_APPINFO_PROP_APP_DISABLE, false); - } - ret = _appinfo_get_applications(uid, uid, locale, filter, flag | PMINFO_APPINFO_GET_BASICINFO, list); if (ret == PMINFO_R_OK && uid != GLOBAL_USER) @@ -1337,6 +1309,12 @@ API int pkgmgrinfo_appinfo_get_usr_list(pkgmgrinfo_pkginfo_h handle, return PMINFO_R_ERROR; } + if (pkgmgrinfo_appinfo_filter_add_bool(filter, + PMINFO_APPINFO_PROP_APP_DISABLE, false)) { + pkgmgrinfo_appinfo_filter_destroy(filter); + return PMINFO_R_ERROR; + } + comp_str = __appcomponent_str(component); if (comp_str) { @@ -1379,7 +1357,13 @@ API int pkgmgrinfo_appinfo_get_usr_installed_list_full( return PMINFO_R_ERROR; if (pkgmgrinfo_appinfo_filter_add_bool(filter, - PMINFO_APPINFO_PROP_APP_DISABLE, false)) { + PMINFO_APPINFO_PROP_APP_DISABLE, false)) { + pkgmgrinfo_appinfo_filter_destroy(filter); + return PMINFO_R_ERROR; + } + + if (pkgmgrinfo_appinfo_filter_add_bool(filter, + PMINFO_APPINFO_PROP_PKG_DISABLE, false)) { pkgmgrinfo_appinfo_filter_destroy(filter); return PMINFO_R_ERROR; } @@ -1421,6 +1405,18 @@ API int pkgmgrinfo_appinfo_get_usr_installed_list( if (ret != PMINFO_R_OK) return ret; + if (pkgmgrinfo_appinfo_filter_add_bool(filter, + PMINFO_APPINFO_PROP_APP_DISABLE, false)) { + pkgmgrinfo_appinfo_filter_destroy(filter); + return PMINFO_R_ERROR; + } + + if (pkgmgrinfo_appinfo_filter_add_bool(filter, + PMINFO_APPINFO_PROP_PKG_DISABLE, false)) { + pkgmgrinfo_appinfo_filter_destroy(filter); + return PMINFO_R_ERROR; + } + ret = _appinfo_get_filtered_foreach_appinfo(uid, filter, PMINFO_APPINFO_GET_ALL, app_func, user_data); @@ -1539,21 +1535,42 @@ API int pkgmgrinfo_appinfo_get_label(pkgmgrinfo_appinfo_h handle, char **label) { label_x *ptr; pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + char *lbl = NULL; + const char *locale; + 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"); - if (info->app_info == NULL || info->app_info->label == NULL) + if (info->app_info == NULL) return PMINFO_R_ERROR; - ptr = (label_x *)info->app_info->label->data; - if (ptr == NULL) - return PMINFO_R_ERROR; + locale = info->locale; + if (locale == NULL) + locale = DEFAULT_LOCALE; - if (ptr->text == NULL) - return PMINFO_R_ERROR; - else - *label = ptr->text; + for (tmp = info->app_info->label; tmp; tmp = tmp->next) { + ptr = (label_x *)tmp->data; + if (ptr == NULL || strcmp(locale, ptr->lang) != 0) + continue; + lbl = ptr->text; + break; + } + + if (lbl != NULL) { + *label = lbl; + return PMINFO_R_OK; + } + + for (tmp = info->app_info->label; tmp; tmp = tmp->next) { + ptr = (label_x *)tmp->data; + if (ptr == NULL || strcmp(DEFAULT_LOCALE, ptr->lang) != 0) + continue; + lbl = ptr->text; + break; + } + + *label = lbl ? lbl : ""; return PMINFO_R_OK; } @@ -1774,35 +1791,6 @@ API int pkgmgrinfo_appinfo_get_subapp(pkgmgrinfo_appcontrol_h handle, return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_get_setting_icon(pkgmgrinfo_appinfo_h handle, char **icon) -{ - char *val; - icon_x *ptr; - GList *tmp; - 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"); - - if (info->app_info == NULL) - return PMINFO_R_ERROR; - - for (tmp = info->app_info->icon; tmp; tmp = tmp->next) { - ptr = (icon_x *)tmp->data; - if (ptr == NULL || ptr->section == NULL) - continue; - - val = (char *)ptr->section; - if (val && strcmp(val, "setting") == 0) { - *icon = (char *)ptr->text; - return PMINFO_R_OK; - } - } - - return PMINFO_R_ERROR; -} - - API int pkgmgrinfo_appinfo_get_notification_icon(pkgmgrinfo_appinfo_h handle, char **icon) { char *val; @@ -2183,43 +2171,117 @@ API int pkgmgrinfo_appinfo_get_installed_time(pkgmgrinfo_appinfo_h handle, int * return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_usr_get_datacontrol_info(const char *providerid, - const char *type, uid_t uid, char **appid, char **access) +static int _appinfo_get_datacontrol_info(sqlite3 *db, const char *providerid, + const char *type, char **appid, char **access) { - retvm_if(providerid == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL\n"); - retvm_if(type == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL\n"); - retvm_if(appid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); - retvm_if(access == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); - - int ret = PMINFO_R_OK; - char *query = NULL; - sqlite3_stmt *stmt = NULL; + static const char query[] = + "SELECT app_id, access FROM package_app_data_control " + "WHERE providerid=? AND type=?"; + int ret; + sqlite3_stmt *stmt; - /*open db*/ - ret = __open_manifest_db(uid, true); - retvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB); + 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; + } - /*Start constructing query*/ - query = sqlite3_mprintf("select * from package_app_data_control where providerid=%Q and type=%Q", providerid, type); - tryvm_if(query == NULL, ret = PMINFO_R_ERROR, "Out of memory"); + 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; + } - /*prepare query*/ - ret = sqlite3_prepare_v2(GET_DB(manifest_db), query, strlen(query), &stmt, NULL); - tryvm_if(ret != PMINFO_R_OK, ret = PMINFO_R_ERROR, "sqlite3_prepare_v2 failed[%s]\n", query); + 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; + } - /*step query*/ ret = sqlite3_step(stmt); - tryvm_if((ret != SQLITE_ROW) || (ret == SQLITE_DONE), ret = PMINFO_R_ERROR, "No records found"); + 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)); - *access = strdup((char *)sqlite3_column_text(stmt, 2)); - - ret = PMINFO_R_OK; + 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; + } -catch: - sqlite3_free(query); sqlite3_finalize(stmt); - __close_manifest_db(); + + 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) +{ + int ret; + + if (providerid == NULL || type == NULL || appid == NULL || + access == NULL) { + LOGE("invalid parameter"); + 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); + + /* FIXME: It should return PMINFO_R_ENOENT but to keep previous + * implementation, return PMINFO_R_ERROR. This should be + * modified later... + */ + if (ret == PMINFO_R_ENOENT) { + LOGE("no datacontrol info of %s", providerid); + ret = PMINFO_R_ERROR; + } + return ret; } @@ -2230,39 +2292,100 @@ API int pkgmgrinfo_appinfo_get_datacontrol_info(const char *providerid, type, _getuid(), appid, access); } -API int pkgmgrinfo_appinfo_usr_get_datacontrol_appid(const char *providerid, uid_t uid, char **appid) +static int _appinfo_get_datacontrol_appid(sqlite3 *db, const char *providerid, + char **appid) { - retvm_if(providerid == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL\n"); - retvm_if(appid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); - - int ret = PMINFO_R_OK; - char *query = NULL; - sqlite3_stmt *stmt = NULL; - - /*open db*/ - ret = __open_manifest_db(uid, true); - retvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB); + static const char query[] = + "SELECT app_id FROM package_app_data_control " + "WHERE providerid=?"; + int ret; + sqlite3_stmt *stmt; - /*Start constructing query*/ - query = sqlite3_mprintf("select * from package_app_data_control where providerid=%Q", providerid); - tryvm_if(query == NULL, ret = PMINFO_R_ERROR, "Out of memory"); + 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; + } - /*prepare query*/ - ret = sqlite3_prepare_v2(GET_DB(manifest_db), query, strlen(query), &stmt, NULL); - tryvm_if(ret != PMINFO_R_OK, ret = PMINFO_R_ERROR, "sqlite3_prepare_v2 failed[%s]\n", query); + 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; + } - /*step query*/ ret = sqlite3_step(stmt); - tryvm_if((ret != SQLITE_ROW) || (ret == SQLITE_DONE), ret = PMINFO_R_ERROR, "No records found"); + 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)); - ret = PMINFO_R_OK; - -catch: - sqlite3_free(query); sqlite3_finalize(stmt); - __close_manifest_db(); + + 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) +{ + int ret; + + if (providerid == NULL || appid == NULL) { + LOGE("invalid parameter"); + 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); + + /* FIXME: It should return PMINFO_R_ENOENT but to keep previous + * implementation, return PMINFO_R_ERROR. This should be + * modified later... + */ + if (ret == PMINFO_R_ENOENT) { + LOGE("no datacontrol appid of %s", providerid); + ret = PMINFO_R_ERROR; + } + return ret; } @@ -2271,41 +2394,113 @@ API int pkgmgrinfo_appinfo_get_datacontrol_appid(const char *providerid, char ** return pkgmgrinfo_appinfo_usr_get_datacontrol_appid(providerid, _getuid(), appid); } -API int pkgmgrinfo_appinfo_usr_get_datacontrol_trusted_info(const char *providerid, - const char *type, uid_t uid, char **appid, bool *is_trusted) +static int _appinfo_get_datacontrol_trusted_info(sqlite3 *db, + const char *providerid, const char *type, char **appid, + bool *is_trusted) { - retvm_if(providerid == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL\n"); - retvm_if(appid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); - - int ret = PMINFO_R_OK; - char *query = NULL; - sqlite3_stmt *stmt = NULL; + static const char query[] = + "SELECT app_id, trusted FROM package_app_data_control " + "WHERE providerid=? AND type=?"; + int ret; + sqlite3_stmt *stmt; - /*open db*/ - ret = __open_manifest_db(uid, true); - retvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB); + 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; + } - /*Start constructing query*/ - query = sqlite3_mprintf("SELECT app_id, trusted FROM package_app_data_control WHERE providerid=%Q AND type=%Q", providerid, type); - tryvm_if(query == NULL, ret = PMINFO_R_ERROR, "Out of memory"); + 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; + } - /*prepare query*/ - ret = sqlite3_prepare_v2(GET_DB(manifest_db), query, strlen(query), &stmt, NULL); - tryvm_if(ret != PMINFO_R_OK, ret = PMINFO_R_ERROR, "sqlite3_prepare_v2 failed[%s]\n", query); + 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; + } - /*step query*/ ret = sqlite3_step(stmt); - tryvm_if((ret != SQLITE_ROW) || (ret == SQLITE_DONE), ret = PMINFO_R_ERROR, "No records found"); + 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; + } + } - _save_column_str(stmt, 0, appid); + *appid = strdup((char *)sqlite3_column_text(stmt, 0)); *is_trusted = _get_bool_value((char *)sqlite3_column_text(stmt, 1)); - ret = PMINFO_R_OK; - -catch: - sqlite3_free(query); sqlite3_finalize(stmt); - __close_manifest_db(); + + 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) +{ + 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; +} + +API int pkgmgrinfo_appinfo_usr_get_datacontrol_trusted_info( + const char *providerid, const char *type, uid_t uid, + char **appid, bool *is_trusted) +{ + int ret; + + if (providerid == NULL || type == NULL || appid == NULL || + is_trusted == NULL) { + LOGE("invalid parameter"); + 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); + + /* FIXME: It should return PMINFO_R_ENOENT but to keep previous + * implementation, return PMINFO_R_ERROR. This should be + * modified later... + */ + if (ret == PMINFO_R_ENOENT) { + LOGE("no datacontrol trusted info of %s", providerid); + ret = PMINFO_R_ERROR; + } + return ret; } @@ -2316,51 +2511,107 @@ API int pkgmgrinfo_appinfo_get_datacontrol_trsuted_info(const char *providerid, type, _getuid(), appid, is_trusted); } -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) +static int _appinfo_foreach_datacontrol_privileges(sqlite3 *db, + const char *providerid, const char *type, + pkgmgrinfo_pkg_privilege_list_cb callback, void *user_data) { - retvm_if(providerid == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL\n"); - retvm_if(privilege_func == NULL, PMINFO_R_EINVAL, "Callback function is NULL"); - - int ret = PMINFO_R_OK; - char *query = NULL; - sqlite3_stmt *stmt = NULL; + static const char query[] = + "SELECT privilege FROM package_app_data_control_privilege " + "WHERE providerid=? AND type=?"; + int ret; + sqlite3_stmt *stmt; + int count = 0; - /*open db*/ - ret = __open_manifest_db(uid, true); - retvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB); + 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; + } - /*Start constructing query*/ - query = sqlite3_mprintf("SELECT privilege FROM package_app_data_control_privilege " - "WHERE providerid=%Q AND type=%Q", providerid, type); - tryvm_if(query == NULL, ret = PMINFO_R_ERROR, "Out of memory"); + 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; + } - /*prepare query*/ - ret = sqlite3_prepare_v2(GET_DB(manifest_db), query, strlen(query), &stmt, NULL); - tryvm_if(ret != PMINFO_R_OK, ret = PMINFO_R_ERROR, "sqlite3_prepare_v2 failed[%s]\n", query); + 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) { - char *privilege; - privilege = (char *)sqlite3_column_text(stmt, 0); - ret = privilege_func(privilege, user_data); + count++; + ret = callback((const char *)sqlite3_column_text(stmt, 0), + user_data); if (ret < 0) break; } - ret = PMINFO_R_OK; - -catch: - sqlite3_free(query); sqlite3_finalize(stmt); - __close_manifest_db(); + + 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_foreach_datacontrol_privileges(const char *providerid, const char *type, - pkgmgrinfo_pkg_privilege_list_cb privilege_func, void *user_data) +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) { - return pkgmgrinfo_appinfo_usr_foreach_datacontrol_privileges(providerid, type, privilege_func, - user_data, _getuid()); + int ret; + + 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); + + if (ret == PMINFO_R_ENOENT) + ret = PMINFO_R_OK; + + return ret; +} + +API int pkgmgrinfo_appinfo_foreach_datacontrol_privileges( + const char *providerid, const char *type, + pkgmgrinfo_pkg_privilege_list_cb privilege_func, + void *user_data) +{ + return pkgmgrinfo_appinfo_usr_foreach_datacontrol_privileges( + providerid, type, privilege_func, user_data, _getuid()); } API int pkgmgrinfo_appinfo_get_support_mode(pkgmgrinfo_appinfo_h handle, int *support_mode) @@ -2377,32 +2628,6 @@ API int pkgmgrinfo_appinfo_get_support_mode(pkgmgrinfo_appinfo_h handle, int *s return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_foreach_permission(pkgmgrinfo_appinfo_h handle, - pkgmgrinfo_app_permission_list_cb permission_func, void *user_data) -{ - retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); - retvm_if(permission_func == NULL, PMINFO_R_EINVAL, "Callback function is NULL"); - int ret = -1; - permission_x *ptr; - GList *tmp; - pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; - - if (info->app_info == NULL) - return PMINFO_R_ERROR; - - for (tmp = info->app_info->permission; tmp; tmp = tmp->next) { - ptr = (permission_x *)tmp->data; - if (ptr == NULL) - continue; - if (ptr->value) { - ret = permission_func(ptr->value, user_data); - if (ret < 0) - break; - } - } - return PMINFO_R_OK; -} - API int pkgmgrinfo_appinfo_foreach_category(pkgmgrinfo_appinfo_h handle, pkgmgrinfo_app_category_list_cb category_func, void *user_data) { @@ -2453,6 +2678,114 @@ 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, + pkgmgrinfo_pkg_privilege_list_cb privilege_func, + void *user_data, uid_t uid) +{ + int ret; + char app_control[BUFSIZE]; + + 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); + + if (ret == PMINFO_R_ENOENT) + ret = PMINFO_R_OK; + + return ret; +} + +API int pkgmgrinfo_appinfo_foreach_appcontrol_privileges(const char *appid, + const char *operation, const char *uri, const char *mime, + 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()); +} + API int pkgmgrinfo_appinfo_foreach_appcontrol(pkgmgrinfo_appinfo_h handle, pkgmgrinfo_app_control_list_cb appcontrol_func, void *user_data) { @@ -3070,6 +3403,26 @@ API int pkgmgrinfo_appinfo_usr_filter_count(pkgmgrinfo_appinfo_filter_h handle, 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; + } + } + + if (__check_disable_filter_exist( + handle, E_APPINFO_DISABLE_TYPE_PKG) == false) { + 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, @@ -3102,6 +3455,20 @@ API int pkgmgrinfo_appinfo_usr_filter_foreach_appinfo( return PMINFO_R_EINVAL; } + 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)) + return PMINFO_R_ERROR; + } + + if (__check_disable_filter_exist( + handle, E_APPINFO_DISABLE_TYPE_PKG) == false) { + if (pkgmgrinfo_appinfo_filter_add_bool(handle, + PMINFO_APPINFO_PROP_PKG_DISABLE, false)) + return PMINFO_R_ERROR; + } + return _appinfo_get_filtered_foreach_appinfo(uid, handle, PMINFO_APPINFO_GET_ALL, app_cb, user_data); } @@ -3162,6 +3529,15 @@ API int pkgmgrinfo_appinfo_usr_metadata_filter_foreach( return PMINFO_R_EINVAL; } + 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; + + if (pkgmgrinfo_appinfo_filter_add_bool(filter, + PMINFO_APPINFO_PROP_PKG_DISABLE, false)) + return PMINFO_R_ERROR; + return _appinfo_get_filtered_foreach_appinfo(uid, handle, PMINFO_APPINFO_GET_ALL, app_cb, user_data); }