Implement localed label API
authorJunghyun Yeon <jungh.yeon@samsung.com>
Tue, 23 Feb 2021 07:40:56 +0000 (16:40 +0900)
committerJunghyun Yeon <jungh.yeon@samsung.com>
Tue, 23 Feb 2021 07:40:56 +0000 (16:40 +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 4b91707..d2c14fd 100644 (file)
@@ -18,6 +18,7 @@
 
 #include <sys/types.h>
 
+#include "sqlite3.h"
 #include "glib.h"
 
 #include "pkgmgrinfo_private.h"
@@ -26,6 +27,7 @@
 #include "common/parcel/appinfo_parcelable.hh"
 #include "common/parcel/filter_parcelable.hh"
 #include "common/parcel/pkginfo_parcelable.hh"
+#include "common/parcel/query_parcelable.hh"
 #include "common/parcel/result_parcelable.hh"
 
 #include "client/pkginfo_client.hh"
@@ -95,4 +97,48 @@ extern "C" EXPORT_API int _appinfo_get_applications(uid_t db_uid, uid_t uid,
        }
 
        return PMINFO_R_OK;
+}
+
+extern "C" EXPORT_API char *_appinfo_get_localed_label(
+               const char *appid, const char *locale, uid_t uid) {
+       char *query = nullptr;
+    query = sqlite3_mprintf(
+                       "SELECT COALESCE((SELECT app_label FROM package_app_localized_info "
+                       "WHERE app_id=%Q AND app_locale=%Q),"
+                       "(SELECT app_label FROM package_app_localized_info WHERE "
+                       "app_id=%Q AND app_locale='No Locale'))", appid, locale, appid);
+       if (query == nullptr) {
+               LOG(ERROR) << "Out of memory";
+               return nullptr;
+       }
+
+       std::shared_ptr<pkgmgr_common::parcel::AbstractParcelable> parcelable(
+                       new pkgmgr_common::parcel::QueryParcelable(uid, std::string(query)));
+
+       pkgmgr_client::PkgInfoClient client(parcelable, uid);
+       if (!client.SendRequest())
+               return nullptr;
+       sqlite3_free(query);
+       std::shared_ptr<pkgmgr_common::parcel::ResultParcelable> return_parcel(
+                               std::static_pointer_cast<pkgmgr_common::parcel::ResultParcelable>(
+                                               client.GetResultParcel()));
+       tizen_base::Parcel parcel;
+       parcel.ReadParcelable(return_parcel.get());
+       
+       // result_list is vector of string vector
+       char *label;
+       auto result_list = return_parcel->GetResult();
+       for (auto result : result_list) {
+               // result is string vector
+               // it only has one string or not.
+               if (result.front().empty() || result.front().length() == 0)
+                       return nullptr;
+               label = strdup(result.front().c_str());
+               if (label == nullptr) {
+                       LOG(ERROR) << "Out of memory";
+                       return nullptr;
+               }
+       }
+
+       return label;
 }
\ No newline at end of file
index 6ddd5e2..63931c4 100644 (file)
@@ -33,6 +33,9 @@ int _pkginfo_get_packages(uid_t uid,
 int _appinfo_get_applications(uid_t db_uid, uid_t uid,
                pkgmgrinfo_filter_x *filter, int flag, GHashTable *packages);
 
+char *_appinfo_get_localed_label(const char *appid, const char *locale, 
+               uid_t uid);
+
 #ifdef __cplusplus
 }
 #endif
index 305a043..7d0c88c 100644 (file)
@@ -961,22 +961,11 @@ API int pkgmgrinfo_appinfo_usr_get_localed_label(const char *appid, const char *
        char *val;
 
        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);
-       }
-
+       val = _appinfo_get_localed_label();
        if (val == NULL)
                return PMINFO_R_ERROR;
 
        *label = val;
-
        return PMINFO_R_OK;
 }