Implement basic pkgmgrinfo_appinfo_ APIs using newly implemented pkginfo_manager
authorJunghyun Yeon <jungh.yeon@samsung.com>
Tue, 23 Feb 2021 01:18:16 +0000 (10:18 +0900)
committerJunghyun Yeon <jungh.yeon@samsung.com>
Tue, 23 Feb 2021 01:18:16 +0000 (10:18 +0900)
Signed-off-by: Junghyun Yeon <jungh.yeon@samsung.com>
src/manager/pkginfo_manager.cc
src/manager/pkginfo_manager.h
src/pkgmgrinfo_appinfo.c

index 6055a7c..4b91707 100644 (file)
@@ -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"
 #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<pkgmgr_common::parcel::AbstractParcelable> parcelable(
                        new pkgmgr_common::parcel::FilterParcelable(uid,
                                        static_cast<pkgmgrinfo_filter_x*>(filter), flag));
 
        pkgmgr_client::PkgInfoClient client(parcelable, uid);
        if (!client.SendRequest())
-               return PMINFO_R_ERROR;
+      return PMINFO_R_ERROR;
 
        std::shared_ptr<pkgmgr_common::parcel::PkgInfoParcelable> return_parcel(
                        std::static_pointer_cast<pkgmgr_common::parcel::PkgInfoParcelable>(
@@ -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<pkgmgr_common::parcel::AbstractParcelable> parcelable(
+                       new pkgmgr_common::parcel::FilterParcelable(uid,
+                                       static_cast<pkgmgrinfo_filter_x*>(filter), flag));
+
+       pkgmgr_client::PkgInfoClient client(parcelable, uid);
+       if (!client.SendRequest())
+      return PMINFO_R_ERROR;
+
+       std::shared_ptr<pkgmgr_common::parcel::AppInfoParcelable> return_parcel(
+                       std::static_pointer_cast<pkgmgr_common::parcel::AppInfoParcelable>(
+                                       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;
index ef31f8a..6ddd5e2 100644 (file)
@@ -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
 }
index 42e475f..305a043 100644 (file)
@@ -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;