Fix memory leaks
[platform/core/api/package-manager.git] / src / package_info.c
index 6ecb6fa..15f59e4 100644 (file)
@@ -38,11 +38,48 @@ struct package_cert_info_s {
        pkgmgrinfo_certinfo_h pkgmgrinfo_certinfo;
 };
 
+typedef struct package_updateinfo_s {
+       pkgmgrinfo_updateinfo_h update_info;
+} package_updateinfo_s;
+
 typedef struct _foreach_app_context_ {
        package_info_app_cb callback;
        void *user_data;
 } foreach_app_context_s;
 
+typedef struct _foreach_updateinfo_ {
+       package_info_updateinfo_cb callback;
+       void *user_data;
+} foreach_updateinfo_context_s;
+
+static int package_info_foreach_updateinfo_cb(const pkgmgrinfo_updateinfo_h handle, void *user_data)
+{
+       foreach_updateinfo_context_s *foreach_updateinfo = user_data;
+       bool iteration_next;
+
+       if (handle == NULL || foreach_updateinfo == NULL)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+       iteration_next = foreach_updateinfo->callback(handle, foreach_updateinfo->user_data);
+       if (iteration_next == true)
+               return PMINFO_R_OK;
+       else
+               return PMINFO_R_ERROR;
+}
+
+static int package_info_updateinfo_convert_type(pkgmgrinfo_updateinfo_update_type type, package_updateinfo_type_e *converted_type)
+{
+       if (type == PMINFO_UPDATEINFO_NONE)
+               *converted_type = PACKAGE_UPDATEINFO_TYPE_NONE;
+       else if (type == PMINFO_UPDATEINFO_FORCE)
+               *converted_type = PACKAGE_UPDATEINFO_TYPE_FORCE;
+       else if (type == PMINFO_UPDATEINFO_OPTIONAL)
+               *converted_type = PACKAGE_UPDATEINFO_TYPE_OPTIONAL;
+       else
+               return -1;
+
+       return 0;
+}
+
 API int package_info_create(const char *package, package_info_h *package_info)
 {
        package_info_h package_info_created;
@@ -118,6 +155,11 @@ API int package_info_foreach_app_from_package(package_info_h package_info, packa
                pkgmgrinfo_appinfo_get_list(package_info->pkgmgr_pkginfo, PMINFO_UI_APP, package_info_foreach_app_cb, &foreach_app_context);
        if (comp_type == PACKAGE_INFO_SERVICEAPP)
                pkgmgrinfo_appinfo_get_list(package_info->pkgmgr_pkginfo, PMINFO_SVC_APP, package_info_foreach_app_cb, &foreach_app_context);
+       if (comp_type == PACKAGE_INFO_WIDGETAPP)
+               pkgmgrinfo_appinfo_get_list(package_info->pkgmgr_pkginfo, PMINFO_WIDGET_APP, package_info_foreach_app_cb, &foreach_app_context);
+       if (comp_type == PACKAGE_INFO_WATCHAPP)
+               pkgmgrinfo_appinfo_get_list(package_info->pkgmgr_pkginfo, PMINFO_WATCH_APP, package_info_foreach_app_cb, &foreach_app_context);
+
        return PACKAGE_MANAGER_ERROR_NONE;
 }
 
@@ -502,13 +544,144 @@ API int package_info_foreach_privilege_info(package_info_h package_info, package
        return ret;
 }
 
+API int package_info_updateinfo_create(const char *pkgid, package_updateinfo_h *info)
+{
+       int ret;
+       package_updateinfo_s *update_info;
+
+       if (pkgid == NULL || info == NULL)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+
+       update_info = calloc(1, sizeof(package_updateinfo_s));
+       if (update_info == NULL)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
+
+       ret = pkgmgrinfo_updateinfo_get_updateinfo(pkgid, &update_info->update_info);
+       if (ret == PMINFO_R_ENOENT) {
+               free(update_info);
+               return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
+       } else if (ret == PMINFO_R_EINVAL) {
+               free(update_info);
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       } else if (ret == PMINFO_R_ERROR) {
+               free(update_info);
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+       }
+
+       *info = update_info;
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+API int package_info_updateinfo_get_pkgid(package_updateinfo_h info, char **package)
+{
+       int ret;
+       char *pkg_updateinfo_value = NULL;
+       char *pkgid_dup;
+       package_updateinfo_s *update_info;
+
+       if (package == NULL || info == NULL)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+
+       update_info = (package_updateinfo_s *)info;
+       ret = pkgmgrinfo_updateinfo_get_pkgid(update_info->update_info, &pkg_updateinfo_value);
+       if (ret != PMINFO_R_OK || pkg_updateinfo_value == NULL)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+
+       pkgid_dup = strdup(pkg_updateinfo_value);
+       if (pkgid_dup == NULL)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
+
+       *package = pkgid_dup;
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+API int package_info_updateinfo_get_version(package_updateinfo_h info, char **version)
+{
+       int ret;
+       char *pkg_updateinfo_value = NULL;
+       char *ver_dup;
+       package_updateinfo_s *update_info;
+
+       if (info == NULL || version == NULL)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+
+       update_info = (package_updateinfo_s *)info;
+       ret = pkgmgrinfo_updateinfo_get_version(update_info->update_info, &pkg_updateinfo_value);
+       if (ret != PMINFO_R_OK || pkg_updateinfo_value == NULL)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+
+       ver_dup = strdup(pkg_updateinfo_value);
+       if (ver_dup == NULL)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
+
+       *version = ver_dup;
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+API int package_info_updateinfo_get_type(package_updateinfo_h info, package_updateinfo_type_e *type)
+{
+       int ret;
+       pkgmgrinfo_updateinfo_update_type pkg_updateinfo_value;
+       package_updateinfo_type_e converted_type;
+       package_updateinfo_s *update_info;
+
+       if (info == NULL || type == NULL)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+
+       update_info = (package_updateinfo_s *)info;
+       ret = pkgmgrinfo_updateinfo_get_update_type(update_info->update_info, &pkg_updateinfo_value);
+       if (ret != PMINFO_R_OK)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+
+       ret = package_info_updateinfo_convert_type(pkg_updateinfo_value, &converted_type);
+       if (ret != 0)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+
+       *type = converted_type;
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+API int package_info_updateinfo_destroy(package_updateinfo_h info)
+{
+       package_updateinfo_s *update_info;
+
+       if (info == NULL)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+
+       update_info = (package_updateinfo_s *)info;
+       pkgmgrinfo_updateinfo_destroy(update_info->update_info);
+       free(update_info);
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+API int package_info_updateinfo_foreach_info(package_info_updateinfo_cb callback, void *user_data)
+{
+       int ret;
+
+       if (callback == NULL)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+
+       foreach_updateinfo_context_s foreach_updateinfo = {
+               .callback = callback,
+               .user_data = user_data,
+       };
+
+       ret = pkgmgrinfo_updateinfo_foreach_updateinfo(package_info_foreach_updateinfo_cb, &foreach_updateinfo);
+       if (ret != PMINFO_R_OK)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
 int package_info_create_with_pkginfo(pkgmgrinfo_pkginfo_h pkg_handle, package_info_h *package_info)
 {
        package_info_h pkg_info = NULL;
        char *pkg_name = NULL;
+       int ret;
 
-       pkgmgrinfo_pkginfo_get_pkgid(pkg_handle, &pkg_name);
-       if (pkg_name == NULL)
+       ret = pkgmgrinfo_pkginfo_get_pkgid(pkg_handle, &pkg_name);
+       if (ret != PMINFO_R_OK)
                return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
 
        pkg_info = calloc(1, sizeof(struct package_info_s));