Release version 0.26.1
[platform/core/appfw/pkgmgr-info.git] / src / pkgmgrinfo_pkginfo.c
index ea5a3a4..b72c63d 100644 (file)
@@ -1149,6 +1149,22 @@ API int pkgmgrinfo_pkginfo_is_for_all_users(pkgmgrinfo_pkginfo_h handle, bool *f
        return pkgmgrinfo_pkginfo_is_global(handle, for_all_users);
 }
 
+API int pkgmgrinfo_pkginfo_is_lib(pkgmgrinfo_pkginfo_h handle, bool *lib)
+{
+       pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
+
+       retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
+       retvm_if(lib == NULL, PMINFO_R_EINVAL,
+                       "Argument supplied to hold return value is NULL\n");
+
+       if (info->pkg_info == NULL || info->pkg_info->lib == NULL)
+               return PMINFO_R_ERROR;
+
+       *lib = _get_bool_value(info->pkg_info->lib);
+
+       return PMINFO_R_OK;
+}
+
 API int pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo_h handle)
 {
        pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
@@ -1190,6 +1206,9 @@ API int pkgmgrinfo_pkginfo_filter_destroy(pkgmgrinfo_pkginfo_filter_h handle)
        if (filter->list_metadata)
                g_slist_free_full(filter->list_metadata,
                                __destroy_metadata_node);
+       if (filter->list_pkg_metadata)
+               g_slist_free_full(filter->list_pkg_metadata,
+                               __destroy_metadata_node);
 
        free(filter);
 
@@ -1528,22 +1547,22 @@ static void __free_depends_on(gpointer data)
        pkgmgrinfo_basic_free_dependency(dep);
 }
 
-API int pkgmgrinfo_pkginfo_foreach_depends_on(pkgmgrinfo_pkginfo_h handle,
+/* This API is not exported at the header file */
+API int pkgmgrinfo_pkginfo_foreach_depends_on_by_pkgid(const char *pkgid,
                pkgmgrinfo_pkg_dependency_list_cb dependency_cb,
-               void *user_data)
+               void *user_data, uid_t uid)
 {
        int ret;
-       pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
        GList *pkg_list = NULL;
        GList *l;
        dependency_x *dep;
 
-       if (handle == NULL || dependency_cb == NULL || info->pkg_info == NULL) {
+       if (pkgid == NULL || dependency_cb == NULL) {
                LOGE("invalid parameter");
                return PMINFO_R_EINVAL;
        }
 
-       ret = _pkginfo_get_depends_on(info->uid, info->pkg_info->package, &pkg_list);
+       ret = _pkginfo_get_depends_on(uid, pkgid, &pkg_list);
        if (ret != PMINFO_R_OK)
                return PMINFO_R_ERROR;
 
@@ -1559,6 +1578,22 @@ API int pkgmgrinfo_pkginfo_foreach_depends_on(pkgmgrinfo_pkginfo_h handle,
        return PMINFO_R_OK;
 }
 
+API int pkgmgrinfo_pkginfo_foreach_depends_on(pkgmgrinfo_pkginfo_h handle,
+               pkgmgrinfo_pkg_dependency_list_cb dependency_cb,
+               void *user_data)
+{
+       pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
+
+       if (handle == NULL || dependency_cb == NULL || info->pkg_info == NULL) {
+               LOGE("invalid parameter");
+               return PMINFO_R_EINVAL;
+       }
+
+       return pkgmgrinfo_pkginfo_foreach_depends_on_by_pkgid(
+                        info->pkg_info->package, dependency_cb, user_data,
+                        info->uid);
+}
+
 API int pkgmgrinfo_pkginfo_foreach_res_allowed_package(
                pkgmgrinfo_pkginfo_h handle,
                pkgmgrinfo_res_allowed_package_list_cb res_allowed_package_cb,
@@ -1738,3 +1773,134 @@ API int pkgmgrinfo_compare_package_version(const char *current_version,
 
        return PMINFO_R_OK;
 }
+
+API int pkgmgrinfo_pkginfo_foreach_metadata(pkgmgrinfo_pkginfo_h handle,
+               pkgmgrinfo_pkg_metadata_list_cb metadata_func, void *user_data)
+{
+       retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL");
+       retvm_if(metadata_func == NULL, PMINFO_R_EINVAL,
+                       "Callback function is NULL");
+       int ret = -1;
+       metadata_x *ptr;
+       GList *tmp;
+       pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
+
+       if (info->pkg_info == NULL)
+               return PMINFO_R_ERROR;
+
+       for (tmp = info->pkg_info->metadata; tmp; tmp = tmp->next) {
+               ptr = (metadata_x *)tmp->data;
+               if (ptr == NULL)
+                       continue;
+               if (ptr->key) {
+                       ret = metadata_func(ptr->key, ptr->value ?
+                                       ptr->value : "", user_data);
+                       if (ret < 0)
+                               break;
+               }
+       }
+       return PMINFO_R_OK;
+}
+
+API int pkgmgrinfo_pkginfo_metadata_filter_create(
+               pkgmgrinfo_pkginfo_metadata_filter_h *handle)
+{
+       return pkgmgrinfo_pkginfo_filter_create(handle);
+}
+
+API int pkgmgrinfo_pkginfo_metadata_filter_destroy(
+               pkgmgrinfo_pkginfo_metadata_filter_h handle)
+{
+       return pkgmgrinfo_pkginfo_filter_destroy(handle);
+}
+
+API int pkgmgrinfo_pkginfo_metadata_filter_add(
+               pkgmgrinfo_pkginfo_metadata_filter_h handle,
+               const char *key, const char *value)
+{
+       pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x *)handle;
+       pkgmgrinfo_metadata_node_x *node;
+
+       /* value can be NULL.
+        * In that case all pkgs with specified key should be displayed
+        */
+       if (handle == NULL || key == NULL) {
+               LOGE("invalid parameter");
+               return PMINFO_R_EINVAL;
+       }
+
+       node = calloc(1, sizeof(pkgmgrinfo_metadata_node_x));
+       if (node == NULL) {
+               LOGE("out of memory");
+               return PMINFO_R_ERROR;
+       }
+
+       node->key = strdup(key);
+       if (value && strlen(value))
+               node->value = strdup(value);
+
+       filter->list_pkg_metadata = g_slist_append(filter->list_pkg_metadata,
+                       (gpointer)node);
+
+       return PMINFO_R_OK;
+}
+
+API int pkgmgrinfo_pkginfo_usr_metadata_filter_foreach(
+               pkgmgrinfo_pkginfo_metadata_filter_h handle,
+               pkgmgrinfo_pkg_list_cb pkg_cb, void *user_data, uid_t uid)
+{
+       if (handle == NULL || pkg_cb == NULL) {
+               LOGE("invalid parameter");
+               return PMINFO_R_EINVAL;
+       }
+
+       pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x *)handle;
+
+       if (pkgmgrinfo_pkginfo_filter_add_bool(filter,
+                       PMINFO_PKGINFO_PROP_PACKAGE_DISABLE, false))
+               return PMINFO_R_ERROR;
+
+       return _pkginfo_get_filtered_foreach_pkginfo(uid, handle,
+                       PMINFO_PKGINFO_GET_ALL, pkg_cb,
+                       user_data);
+}
+
+API int pkgmgrinfo_pkginfo_metadata_filter_foreach(
+               pkgmgrinfo_pkginfo_metadata_filter_h handle,
+               pkgmgrinfo_pkg_list_cb pkg_cb, void *user_data)
+{
+       return pkgmgrinfo_pkginfo_usr_metadata_filter_foreach(handle, pkg_cb,
+                       user_data, _getuid());
+}
+
+API int pkgmgrinfo_pkginfo_get_metadata_value(
+               pkgmgrinfo_pkginfo_h handle, const char *metadata_key,
+               char **metadata_value)
+{
+       retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL");
+       retvm_if(metadata_key == NULL, PMINFO_R_EINVAL, "metadata_key is NULL");
+       retvm_if(metadata_value == NULL, PMINFO_R_EINVAL,
+                       "metadata_value is NULL");
+
+       GList *list_md = NULL;
+       metadata_x *metadata = NULL;
+       pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
+
+       list_md = info->pkg_info->metadata;
+
+       for (; list_md; list_md = list_md->next) {
+               metadata = (metadata_x *)list_md->data;
+               if (metadata && metadata->key) {
+                       if (strcasecmp(metadata->key, metadata_key) == 0) {
+                               if (metadata->value == NULL)
+                                       *metadata_value = "";
+                               else
+                                       *metadata_value =
+                                                       (char *)metadata->value;
+                               return PMINFO_R_OK;
+                       }
+               }
+       }
+
+       return PMINFO_R_EINVAL;
+}