From aa3110764e9f123c9e597013e0400f62a206794e Mon Sep 17 00:00:00 2001 From: Junghyun Yeon Date: Tue, 23 Feb 2021 10:18:16 +0900 Subject: [PATCH] Implement basic pkgmgrinfo_appinfo_ APIs using newly implemented pkginfo_manager Signed-off-by: Junghyun Yeon --- src/manager/pkginfo_manager.cc | 42 ++++++++++++++++++++++++++++++++++-------- src/manager/pkginfo_manager.h | 2 ++ src/pkgmgrinfo_appinfo.c | 22 ++++++++++++++++++---- 3 files changed, 54 insertions(+), 12 deletions(-) diff --git a/src/manager/pkginfo_manager.cc b/src/manager/pkginfo_manager.cc index 6055a7c..4b91707 100644 --- a/src/manager/pkginfo_manager.cc +++ b/src/manager/pkginfo_manager.cc @@ -23,6 +23,7 @@ #include "pkgmgrinfo_private.h" #include "logging.hh" +#include "common/parcel/appinfo_parcelable.hh" #include "common/parcel/filter_parcelable.hh" #include "common/parcel/pkginfo_parcelable.hh" #include "common/parcel/result_parcelable.hh" @@ -42,15 +43,14 @@ #define EXPORT_API __attribute__((visibility("default"))) extern "C" EXPORT_API int _pkginfo_get_packages(uid_t uid, - pkgmgrinfo_filter_x *filter, int flag, GHashTable *packages) { - + pkgmgrinfo_filter_x *filter, int flag, GHashTable *packages) { std::shared_ptr parcelable( new pkgmgr_common::parcel::FilterParcelable(uid, static_cast(filter), flag)); pkgmgr_client::PkgInfoClient client(parcelable, uid); if (!client.SendRequest()) - return PMINFO_R_ERROR; + return PMINFO_R_ERROR; std::shared_ptr return_parcel( std::static_pointer_cast( @@ -60,12 +60,38 @@ extern "C" EXPORT_API int _pkginfo_get_packages(uid_t uid, parcel.ReadParcelable(return_parcel.get()); auto result_list = return_parcel->GetPkgInfo(); - if (result_list.size() == 0) - return PMINFO_R_ENOENT; + // TODO: check noentry error has returned if size of result_list is 0 for (auto& pkginfo : result_list) { - g_hash_table_insert(packages, (gpointer)pkginfo->package, (gpointer)pkginfo); - // TODO: remove element from list. is this work? - pkginfo = nullptr; + g_hash_table_insert(packages, (gpointer)pkginfo->package, (gpointer)pkginfo); + // TODO: remove element from list. is this work? + pkginfo = nullptr; + } + + return PMINFO_R_OK; +} + +// TODO: Need to add target db uid to identify which database to be searched +extern "C" EXPORT_API int _appinfo_get_applications(uid_t db_uid, uid_t uid, + pkgmgrinfo_filter_x *filter, int flag, GHashTable *packages) { + std::shared_ptr parcelable( + new pkgmgr_common::parcel::FilterParcelable(uid, + static_cast(filter), flag)); + + pkgmgr_client::PkgInfoClient client(parcelable, uid); + if (!client.SendRequest()) + return PMINFO_R_ERROR; + + std::shared_ptr return_parcel( + std::static_pointer_cast( + client.GetResultParcel())); + + tizen_base::Parcel parcel; + parcel.ReadParcelable(return_parcel.get()); + auto result_list = return_parcel->GetAppInfo(); + for (auto& appinfo : result_list) { + g_hash_table_insert(packages, (gpointer)appinfo->appid, (gpointer)appinfo); + // TODO: remove element from list. is this work? + appinfo = nullptr; } return PMINFO_R_OK; diff --git a/src/manager/pkginfo_manager.h b/src/manager/pkginfo_manager.h index ef31f8a..6ddd5e2 100644 --- a/src/manager/pkginfo_manager.h +++ b/src/manager/pkginfo_manager.h @@ -30,6 +30,8 @@ extern "C" { int _pkginfo_get_packages(uid_t uid, pkgmgrinfo_filter_x *filter, int flag, GHashTable *packages); +int _appinfo_get_applications(uid_t db_uid, uid_t uid, + pkgmgrinfo_filter_x *filter, int flag, GHashTable *packages); #ifdef __cplusplus } diff --git a/src/pkgmgrinfo_appinfo.c b/src/pkgmgrinfo_appinfo.c index 42e475f..305a043 100644 --- a/src/pkgmgrinfo_appinfo.c +++ b/src/pkgmgrinfo_appinfo.c @@ -14,6 +14,7 @@ #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) { @@ -90,6 +91,12 @@ static int _pkgmgrinfo_get_appinfo(const char *appid, uid_t uid, return PMINFO_R_ERROR; // TODO: need to use pkginfo-client APIs + ret = _appinfo_get_applications(uid, uid, filter, + PMINFO_APPINFO_GET_ALL, list); + if (ret != PMINFO_R_OK) { + g_hash_table_destroy(list); + return ret; + } if (!g_hash_table_size(list)) { _LOGD("appinfo for [%s] is not existed for user [%d]", @@ -113,9 +120,9 @@ static int _pkgmgrinfo_get_appinfo(const char *appid, uid_t uid, free(info); return PMINFO_R_ENOENT; } - //info->locale = locale; + info->locale = strdup(info->app_info->locale); info->package = strdup(info->app_info->package); - if (!info->package) { + if (!info->package || !info->locale) { _LOGE("out of memory"); g_hash_table_destroy(list); free(info); @@ -608,18 +615,25 @@ static int _appinfo_get_filtered_foreach_appinfo(uid_t uid, GHashTable *list; GHashTableIter iter; gpointer value; + int ret; list = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, __free_applications); if (list == NULL) return PMINFO_R_ERROR; - // TODO: use pkginfo-client APIs to get appinfo + ret = _appinfo_get_applications(uid, uid, filter, + flag | PMINFO_APPINFO_GET_BASICINFO, list); + if (ret != PMINFO_R_OK) { + g_hash_table_destroy(list); + return ret; + } + g_hash_table_iter_init(&iter, list); 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; -- 2.7.4