Add api to get detailed information of privilege 30/315330/2
authorIlho Kim <ilho159.kim@samsung.com>
Thu, 30 Nov 2023 02:03:28 +0000 (11:03 +0900)
committerIlho Kim <ilho159.kim@samsung.com>
Mon, 2 Dec 2024 03:52:48 +0000 (12:52 +0900)
- pkgmgrinfo_pkginfo_foreach_privilege_v2
- pkgmgrinfo_get_privilege_category
- pkgmgrinfo_get_privilege_name
- pkgmgrinfo_get_privilege_type

Change-Id: I0b494fb45a94973d1427af93ef8b807ddc8d708a
Signed-off-by: Ilho Kim <ilho159.kim@samsung.com>
include/pkgmgr-info.h
include/pkgmgrinfo_type.h
src/pkgmgrinfo_pkginfo.c
src/pkgmgrinfo_private.h

index 0c9aec31e57fab6b5dee6695d32ba89d1b60dd30..d6bd8a948d1fbd44fcfe3fd141deca556a3d843d 100644 (file)
@@ -2735,6 +2735,141 @@ static int list_appdefined_privilege(const char *package)
 int pkgmgrinfo_pkginfo_foreach_appdefined_privilege(pkgmgrinfo_pkginfo_h handle,
                        pkgmgrinfo_pkg_appdefined_privilege_list_cb privilege_func, void *user_data);
 
+/**
+ * @fn int pkgmgrinfo_pkginfo_foreach_privilege_v2(pkgmgrinfo_pkginfo_h handle,
+                       pkgmgrinfo_pkg_privilege_list_cb_v2 privilege_func,
+                       void *user_data);
+ * @brief      This API gets the list of privilege for a particular package
+ *
+ * @par                This API is for package-manager client application
+ * @par Sync (or) Async : Synchronous API
+ * @param[in]  handle          pointer to the package info handle.
+ * @param[in]  privilege_func  callback function for list
+ * @param[in]  user_data       user data to be passed to callback function
+ * @return     0 if success, error code(<0) if fail
+ * @retval     PMINFO_R_OK     success
+ * @retval     PMINFO_R_EINVAL invalid argument
+ * @retval     PMINFO_R_ERROR  internal error
+ * @pre                pkgmgrinfo_pkginfo_get_pkginfo()
+ * @post       pkgmgrinfo_pkginfo_destroy_pkginfo()
+ * @code
+int privilege_func(pkgmgrinfo_pkginfo_privilege_h handle, void *user_data)
+{
+       char* type;
+       char* name;
+       if (pkgmgrinfo_get_privilege_name(handle, &name) != PMINFO_R_OK)
+               return 0;
+
+       if (pkgmgrinfo_get_privilege_type(handle, &type) != PMINFO_R_OK)
+               return 0;
+
+       printf("privilege : %s, type : %s\n", name, type);
+
+       return 0;
+}
+
+static int print_privilege(const char *package, char *privilege)
+{
+       int ret = 0;
+       pkgmgrinfo_pkginfo_h handle;
+       ret = pkgmgrinfo_pkginfo_get_pkginfo(package, &handle);
+       if (ret != PMINFO_R_OK)
+               return -1;
+       ret = pkgmgrinfo_pkginfo_foreach_privilege_v2(handle, privilege_func, NULL);
+       if (ret != PMINFO_R_OK) {
+               pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
+               return -1;
+       }
+       pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
+       return 0;
+}
+ * @endcode
+ */
+int pkgmgrinfo_pkginfo_foreach_privilege_v2(pkgmgrinfo_pkginfo_h handle,
+               pkgmgrinfo_pkg_privilege_list_cb_v2 privilege_func,
+               void *user_data);
+
+/**
+ * @fn int pkgmgrinfo_get_privilege_category(pkgmgrinfo_pkginfo_privilege_h handle, pkgmgrinfo_privilege_category *category)
+ * @brief      This API retrieves the privilege category from privilge handle
+ *
+ * @par                This API is for package-manager client application
+ * @par Sync (or) Async : Synchronous API
+ *
+ * @param[in]  handle          pointer to privilege handle
+ * @param[out] category        privilege category
+ * @return     0 if success, error code(<0) if fail
+ * @retval     PMINFO_R_OK     success
+ * @retval     PMINFO_R_EINVAL invalid argument
+ * @code
+static int get_privilege_category_from_handle(pkgmgrinfo_pkginfo_privilege_h handle)
+{
+       int ret = 0;
+       pkgmgrinfo_privilege_category category;
+
+       ret = pkgmgrinfo_get_privilege_category(handle, &category);
+       if (ret != PMINFO_R_OK)
+               return -1;
+       return 0;
+}
+ * @endcode
+ */
+int pkgmgrinfo_get_privilege_category(pkgmgrinfo_pkginfo_privilege_h handle, pkgmgrinfo_privilege_category *category);
+
+/**
+ * @fn int pkgmgrinfo_get_privilege_name(pkgmgrinfo_pkginfo_privilege_h handle, char **name)
+ * @brief      This API retrieves the privilege name from privilge handle
+ *
+ * @par                This API is for package-manager client application
+ * @par Sync (or) Async : Synchronous API
+ *
+ * @param[in]  handle  pointer to privilege handle
+ * @param[out] name    privilege name
+ * @return     0 if success, error code(<0) if fail
+ * @retval     PMINFO_R_OK     success
+ * @retval     PMINFO_R_EINVAL invalid argument
+ * @code
+static int get_privilege_name_from_handle(pkgmgrinfo_pkginfo_privilege_h handle)
+{
+       int ret = 0;
+       pkgmgrinfo_privilege_name name;
+
+       ret = pkgmgrinfo_get_privilege_name(handle, &name);
+       if (ret != PMINFO_R_OK)
+               return -1;
+       return 0;
+}
+ * @endcode
+ */
+int pkgmgrinfo_get_privilege_name(pkgmgrinfo_pkginfo_privilege_h handle, char **name);
+
+/**
+ * @fn int pkgmgrinfo_get_privilege_type(pkgmgrinfo_pkginfo_privilege_h handle, char **type)
+ * @brief      This API retrieves the privilege type from privilge handle
+ *
+ * @par                This API is for package-manager client application
+ * @par Sync (or) Async : Synchronous API
+ *
+ * @param[in]  handle  pointer to privilege handle
+ * @param[out] type    privilege type
+ * @return     0 if success, error code(<0) if fail
+ * @retval     PMINFO_R_OK     success
+ * @retval     PMINFO_R_EINVAL invalid argument
+ * @code
+static int get_privilege_type_from_handle(pkgmgrinfo_pkginfo_privilege_h handle)
+{
+       int ret = 0;
+       pkgmgrinfo_privilege_type type;
+
+       ret = pkgmgrinfo_get_privilege_type(handle, &type);
+       if (ret != PMINFO_R_OK)
+               return -1;
+       return 0;
+}
+ * @endcode
+ */
+int pkgmgrinfo_get_privilege_type(pkgmgrinfo_pkginfo_privilege_h handle, char **type);
+
 /**
  * @fn int pkgmgrinfo_pkginfo_foreach_plugin(pkgmgrinfo_pkginfo_h handle,
                        pkgmgrinfo_plugin_list_cb plugin_func, void *user_data);
index 4710ff1b94f3aafa9a698d5401fec2b3354a2525..24b08151df4610c36b49c2cf9c01b9dcb1febda8 100644 (file)
@@ -237,6 +237,11 @@ typedef void *required_privilege_h;
  */
 typedef void *pkgmgrinfo_appinfo_app_control_h;
 
+/**
+ * @brief A handle to get privilege
+ */
+typedef void *pkgmgrinfo_pkginfo_privilege_h;
+
 /**
  * @brief type definition.
  */
@@ -320,6 +325,21 @@ typedef int (*pkgmgrinfo_app_category_list_cb) (const char *category_name,
 typedef int (*pkgmgrinfo_pkg_privilege_list_cb) (const char *privilege_name,
                                                        void *user_data);
 
+/**
+ * @fn int (*pkgmgrinfo_pkg_privilege_list_cb_v2) (pkgmgrinfo_pkginfo_privilege_h privilege, void *user_data)
+ *
+ * @brief Specifies the type of function passed to pkgmgrinfo_pkginfo_foreach_privilege_v2()
+ *
+ * @param[in] privilege the handle of the privilege
+ * @param[in] user_data user data passed to pkgmgrinfo_pkginfo_foreach_privilege_v2()
+ *
+ * @return 0 if success, negative value(<0) if fail. Callback is not called if return value is negative.\n
+ *
+ * @see  pkgmgrinfo_pkginfo_foreach_privilege_v2()
+ */
+typedef int (*pkgmgrinfo_pkg_privilege_list_cb_v2) (
+               pkgmgrinfo_pkginfo_privilege_h privilege, void *user_data);
+
 /**
  * @fn int (*pkgmgrinfo_pkg_appdefined_privilege_list_cb) (const char *privilege_name, const char *license_path, void *user_data)
  *
@@ -609,4 +629,9 @@ typedef enum {
        PMINFO_PERMISSION_PRIVILEGE,            /**< permission type is privilege*/
 } pkgmgrinfo_permission_type;
 
+typedef enum {
+       PMINFO_PRIVILEGE_NORMAL = 0,            /**< normal privilege*/
+       PMINFO_PRIVILEGE_APPDEFINES,            /**< appdefines privilege*/
+} pkgmgrinfo_privilege_category;
+
 #endif
index 8ecf48b6364507ad7d73fe11f958b1a3229622ef..b24e086fa659d6e35b629d82f40e3c257bdc1c93 100644 (file)
@@ -1455,6 +1455,110 @@ API int pkgmgrinfo_pkginfo_foreach_privilege(pkgmgrinfo_pkginfo_h handle,
        return PMINFO_R_OK;
 }
 
+API int pkgmgrinfo_pkginfo_foreach_privilege_v2(pkgmgrinfo_pkginfo_h handle,
+               pkgmgrinfo_pkg_privilege_list_cb_v2 privilege_func,
+               void *user_data)
+{
+       retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL");
+       retvm_if(privilege_func == NULL, PMINFO_R_EINVAL, "Callback function is NULL");
+       int ret;
+       privilege_x *privilege;
+       appdefined_privilege_x *appdefined_privilege;
+       pkgmgrinfo_privilege_x privilege_handle;
+       GList *tmp;
+       pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
+
+       if (info->pkg_info == NULL)
+               return PMINFO_R_ERROR;
+
+       for (tmp = info->pkg_info->privileges; tmp; tmp = tmp->next) {
+
+               privilege = (privilege_x *)tmp->data;
+               if (privilege == NULL)
+                       continue;
+               privilege_handle.category = PMINFO_PRIVILEGE_NORMAL;
+               privilege_handle.priv = (void *)privilege;
+               ret = privilege_func((pkgmgrinfo_pkginfo_privilege_h)&privilege_handle, user_data);
+               if (ret < 0)
+                       return PMINFO_R_OK;
+       }
+
+       for (tmp = info->pkg_info->appdefined_privileges; tmp;
+                       tmp = tmp->next) {
+               appdefined_privilege = (appdefined_privilege_x *)tmp->data;
+               if (appdefined_privilege == NULL)
+                       continue;
+               privilege_handle.category = PMINFO_PRIVILEGE_APPDEFINES;
+               privilege_handle.priv = (void *)appdefined_privilege;
+               ret = privilege_func((pkgmgrinfo_pkginfo_privilege_h)&privilege_handle, user_data);
+               if (ret < 0)
+                       return PMINFO_R_OK;
+       }
+
+       return PMINFO_R_OK;
+}
+
+API int pkgmgrinfo_get_privilege_category(pkgmgrinfo_pkginfo_privilege_h handle, pkgmgrinfo_privilege_category *category)
+{
+       retvm_if(handle == NULL, PMINFO_R_EINVAL, "privilege handle is NULL");
+       retvm_if(category == NULL, PMINFO_R_EINVAL,
+                       "Argument supplied to hold return value is NULL");
+
+       *category = ((pkgmgrinfo_privilege_x *)handle)->category;
+
+       return PMINFO_R_OK;
+}
+
+API int pkgmgrinfo_get_privilege_name(pkgmgrinfo_pkginfo_privilege_h handle, char **name)
+{
+       retvm_if(handle == NULL, PMINFO_R_EINVAL, "privilege handle is NULL");
+       retvm_if(name == NULL, PMINFO_R_EINVAL,
+                       "Argument supplied to hold return value is NULL");
+
+       int ret = PMINFO_R_OK;
+       pkgmgrinfo_privilege_x *privilege_handle = (pkgmgrinfo_privilege_x *)handle;
+       switch (privilege_handle->category) {
+       case PMINFO_PRIVILEGE_NORMAL:
+               *name = ((privilege_x *)privilege_handle->priv)->value;
+               break;
+       case PMINFO_PRIVILEGE_APPDEFINES:
+               *name = ((appdefined_privilege_x *)privilege_handle->priv)->value;
+               break;
+       default:
+               LOGE("Invalid privilege category : %d",
+                               privilege_handle->category);
+               ret = PMINFO_R_ERROR;
+               break;
+       }
+
+       return ret;
+}
+
+API int pkgmgrinfo_get_privilege_type(pkgmgrinfo_pkginfo_privilege_h handle, char **type)
+{
+       retvm_if(handle == NULL, PMINFO_R_EINVAL, "privilege handle is NULL");
+       retvm_if(type == NULL, PMINFO_R_EINVAL,
+                       "Argument supplied to hold return value is NULL");
+
+       int ret = PMINFO_R_OK;
+       pkgmgrinfo_privilege_x *privilege_handle = (pkgmgrinfo_privilege_x *)handle;
+       switch (privilege_handle->category) {
+       case PMINFO_PRIVILEGE_NORMAL:
+               *type = ((privilege_x *)privilege_handle->priv)->type;
+               break;
+       case PMINFO_PRIVILEGE_APPDEFINES:
+               *type = ((appdefined_privilege_x *)privilege_handle->priv)->type;
+               break;
+       default:
+               LOGE("Invalid privilege category : %d",
+                               privilege_handle->category);
+               ret = PMINFO_R_ERROR;
+               break;
+       }
+
+       return ret;
+}
+
 API int pkgmgrinfo_pkginfo_foreach_plugin(pkgmgrinfo_pkginfo_h handle,
                        pkgmgrinfo_plugin_list_cb plugin_func, void *user_data)
 {
index 4dc76041afd5d0e6acf6e84b89817161e6c9de9a..134088aa4a005a12d54404457cb0e00c2dc63568 100644 (file)
@@ -309,6 +309,11 @@ typedef struct _pkg_plugin_set {
        get_pkg_detail_info_from_package;
 } pkg_plugin_set;
 
+typedef struct _pkgmgrinfo_privilege_x {
+       pkgmgrinfo_privilege_category category;
+       void *priv;
+} pkgmgrinfo_privilege_x;
+
 pkgmgrinfo_pkginfo_filter_prop_str _pminfo_pkginfo_convert_to_prop_str(const char *property);
 pkgmgrinfo_pkginfo_filter_prop_int _pminfo_pkginfo_convert_to_prop_int(const char *property);
 pkgmgrinfo_pkginfo_filter_prop_bool _pminfo_pkginfo_convert_to_prop_bool(const char *property);