Add new APIs retrieving package dependency info
[platform/core/api/package-manager.git] / src / package_info.c
old mode 100755 (executable)
new mode 100644 (file)
index 30335ee..239db69
 
 #include <package-manager.h>
 #include <pkgmgr-info.h>
-#include <dlog.h>
 #include <tzplatform_config.h>
 
-#include <package_info.h>
-#include <package_manager.h>
-#include "package_manager_private.h"
-
-
-#ifdef LOG_TAG
-#undef LOG_TAG
-#endif
-
-#define LOG_TAG "CAPI_APPFW_PACKAGE_MANAGER"
-#define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
+#include "package_info.h"
+#include "package_manager.h"
+#include "package_manager_internal.h"
 
 struct package_info_s {
        char *package;
-       pkgmgr_pkginfo_h pkgmgr_pkginfo;
+       pkgmgrinfo_pkginfo_h pkgmgr_pkginfo;
 };
 
 struct package_cert_info_s {
@@ -47,52 +38,80 @@ struct package_cert_info_s {
        pkgmgrinfo_certinfo_h pkgmgrinfo_certinfo;
 };
 
-typedef struct _foreach_pkg_context_{
-       package_manager_package_info_cb callback;
-       void *user_data;
-} foreach_pkg_context_s;
-
+typedef struct package_updateinfo_s {
+       pkgmgrinfo_updateinfo_h update_info;
+} package_updateinfo_s;
 
-typedef struct _foreach_app_context_{
+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;
+
+typedef struct _foreach_privilege_ {
+       package_info_privilege_info_cb callback;
+       void *user_data;
+} foreach_privilege_s;
+
+typedef struct _foreach_dependency_ {
+       package_info_dependency_info_cb callback;
+       void *user_data;
+} foreach_dependency_s;
 
-static int package_info_create(const char *package,  package_info_h *package_info)
+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;
-       pkgmgr_pkginfo_h pkgmgr_pkginfo;
-       uid_t uid = getuid();
+       pkgmgrinfo_pkginfo_h pkgmgr_pkginfo;
 
        if (package == NULL || package_info == NULL)
-       {
                return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
-       }
 
-       if (uid != GLOBAL_USER)
-       {
-               if (pkgmgr_pkginfo_get_usr_pkginfo(package, uid, &pkgmgr_pkginfo) != PKGMGR_R_OK)
-                       return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
-       }
-       else
-       {
-               if (pkgmgr_pkginfo_get_pkginfo(package, &pkgmgr_pkginfo) != PKGMGR_R_OK)
-                       return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
-       }
+       if (pkgmgrinfo_pkginfo_get_pkginfo(package, &pkgmgr_pkginfo) != PKGMGR_R_OK)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
+
        package_info_created = calloc(1, sizeof(struct package_info_s));
 
-       if (package_info_created == NULL)
-       {
-               pkgmgr_pkginfo_destroy_pkginfo(pkgmgr_pkginfo);
+       if (package_info_created == NULL) {
+               pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgr_pkginfo);
                return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
        }
 
        package_info_created->package = strdup(package);
 
-       if (package_info_created->package == NULL)
-       {
-               pkgmgr_pkginfo_destroy_pkginfo(pkgmgr_pkginfo);
+       if (package_info_created->package == NULL) {
+               pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgr_pkginfo);
                free(package_info_created);
                return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
        }
@@ -104,180 +123,125 @@ static int package_info_create(const char *package,  package_info_h *package_inf
        return PACKAGE_MANAGER_ERROR_NONE;
 }
 
-
-int package_info_get_package_info(const char *package, package_info_h *package_info)
-{
-       return package_info_create(package, package_info);
-}
-
-
-static int package_info_foreach_package_info_cb(const pkgmgr_pkginfo_h handle, void *user_data)
-{
-       char *pkg_name = NULL;
-       foreach_pkg_context_s *foreach_pkg_context = user_data;
-       package_info_h package_info = NULL;
-
-       if (handle == NULL || foreach_pkg_context == NULL)
-       {
-               package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
-               return PKGMGR_R_EINVAL;
-       }
-
-       pkgmgr_pkginfo_get_pkgname(handle, &pkg_name);
-
-       if (package_info_create(pkg_name, &package_info) == PACKAGE_MANAGER_ERROR_NONE)
-       {
-               foreach_pkg_context->callback(package_info, foreach_pkg_context->user_data);
-               package_info_destroy(package_info);
-       }
-
-       /* pkgmgr_get_info_list() needs to be enhanced to stop and continue callback */
-       return PKGMGR_R_OK;
-}
-
-
-int package_info_foreach_package_info(package_manager_package_info_cb callback, void *user_data)
-{
-       foreach_pkg_context_s foreach_pkg_context = {
-               .callback = callback,
-               .user_data = user_data,
-       };
-       int ret = 0;
-
-       if (callback == NULL)
-       {
-               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
-       }
-       uid_t uid = getuid();
-       if (uid != GLOBAL_USER)
-               ret = pkgmgr_pkginfo_get_usr_list(package_info_foreach_package_info_cb, &foreach_pkg_context, uid);
-       else
-               ret = pkgmgr_pkginfo_get_list(package_info_foreach_package_info_cb, &foreach_pkg_context);
-       if (ret < 0) {
-               return PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE;
-       }
-
-       return PACKAGE_MANAGER_ERROR_NONE;
-}
-
-
-static int package_info_foreach_app_cb (const pkgmgr_appinfo_h handle, void *user_data)
+static int package_info_foreach_app_cb(const pkgmgrinfo_appinfo_h handle, void *user_data)
 {
        char *appid = NULL;
-       pkgmgr_app_component comp;
+       pkgmgrinfo_app_component comp;
        foreach_app_context_s *foreach_app_context = user_data;
        int ret = 0;
+       bool r;
 
-       if (handle == NULL || foreach_app_context == NULL)
-       {
+       if (handle == NULL || foreach_app_context == NULL) {
                package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
                return PKGMGR_R_EINVAL;
        }
 
-       ret = pkgmgr_appinfo_get_appid(handle, &appid);
-       if (ret < 0) {
+       ret = pkgmgrinfo_appinfo_get_appid(handle, &appid);
+       if (ret < 0)
                return PKGMGR_R_ERROR;
-       }
-       ret = pkgmgr_appinfo_get_component(handle, &comp);
-       if (ret < 0) {
+
+       ret = pkgmgrinfo_appinfo_get_component(handle, &comp);
+       if (ret < 0)
                return PKGMGR_R_ERROR;
-       }
 
-       foreach_app_context->callback(comp, appid, foreach_app_context->user_data);
+       r = foreach_app_context->callback(comp, appid, foreach_app_context->user_data);
 
-       return PKGMGR_R_OK;
+       return (r == true) ? PKGMGR_R_OK : PKGMGR_R_ERROR;
 }
 
-
-
-int package_info_foreach_app_from_package(package_info_h package_info, package_info_app_component_type_e comp_type, package_info_app_cb callback, void *user_data)
+API int package_info_foreach_app_from_package(package_info_h package_info, package_info_app_component_type_e comp_type, package_info_app_cb callback, void *user_data)
 {
        foreach_app_context_s foreach_app_context = {
                .callback = callback,
                .user_data = user_data,
        };
-       pkgmgr_pkginfo_h pkgmgr_pkginfo;
 
        if (package_info == NULL || callback == NULL)
-       {
                return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
-       }
 
-       if (pkgmgr_pkginfo_get_pkginfo(package_info->package, &pkgmgr_pkginfo) != PKGMGR_R_OK)
-       {
-               return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
-       }
        if (comp_type == PACKAGE_INFO_ALLAPP)
-               pkgmgr_appinfo_get_list(pkgmgr_pkginfo, PM_ALL_APP, package_info_foreach_app_cb, &foreach_app_context);
+               pkgmgrinfo_appinfo_get_list(package_info->pkgmgr_pkginfo, PMINFO_ALL_APP, package_info_foreach_app_cb, &foreach_app_context);
        if (comp_type == PACKAGE_INFO_UIAPP)
-               pkgmgr_appinfo_get_list(pkgmgr_pkginfo, PM_UI_APP, package_info_foreach_app_cb, &foreach_app_context);
+               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)
-               pkgmgr_appinfo_get_list(pkgmgr_pkginfo, PM_SVC_APP, package_info_foreach_app_cb, &foreach_app_context);
+               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;
 }
 
-
-int package_info_destroy(package_info_h package_info)
+API int package_info_destroy(package_info_h package_info)
 {
        if (package_info == NULL)
-       {
                return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
-       }
 
        free(package_info->package);
 
-       pkgmgr_pkginfo_destroy_pkginfo(package_info->pkgmgr_pkginfo);
+       pkgmgrinfo_pkginfo_destroy_pkginfo(package_info->pkgmgr_pkginfo);
 
        free(package_info);
 
        return PACKAGE_MANAGER_ERROR_NONE;
 }
 
-int package_info_get_package(package_info_h package_info, char **package)
+API int package_info_get_package(package_info_h package_info, char **package)
 {
        char *package_dup;
 
        if (package_info == NULL || package == NULL)
-       {
                return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
-       }
 
        package_dup = strdup(package_info->package);
 
        if (package_dup == NULL)
-       {
                return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
-       }
 
        *package = package_dup;
 
        return PACKAGE_MANAGER_ERROR_NONE;
 }
 
-int package_info_get_label(package_info_h package_info, char **label)
+API int package_info_get_main_app_id(package_info_h package_info, char **main_app_id)
+{
+       char *mainappid_dup;
+       char *pkg_info_value;
+
+       if (package_info == NULL || main_app_id == NULL)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+
+       if (pkgmgrinfo_pkginfo_get_mainappid(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+
+       mainappid_dup = strdup(pkg_info_value);
+       if (mainappid_dup == NULL)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
+
+       *main_app_id = mainappid_dup;
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+API int package_info_get_label(package_info_h package_info, char **label)
 {
        char *pkg_info_value = NULL;
        char *label_dup = NULL;
 
        if (package_info == NULL || label == NULL)
-       {
                return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
-       }
 
-       if (pkgmgr_pkginfo_get_label(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
-       {
+       if (pkgmgrinfo_pkginfo_get_label(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
                return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
-       }
 
-       if(!pkg_info_value)
+       if (!pkg_info_value)
                goto END;
 
        label_dup = strdup(pkg_info_value);
 
        if (label_dup == NULL)
-       {
                return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
-       }
 
 END:
        *label = label_dup;
@@ -285,30 +249,24 @@ END:
        return PACKAGE_MANAGER_ERROR_NONE;
 }
 
-int package_info_get_icon(package_info_h package_info, char **path)
+API int package_info_get_icon(package_info_h package_info, char **path)
 {
        char *pkg_info_value = NULL;
        char *icon_dup = NULL;
 
        if (package_info == NULL || path == NULL)
-       {
                return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
-       }
 
-       if (pkgmgr_pkginfo_get_icon(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
-       {
+       if (pkgmgrinfo_pkginfo_get_icon(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
                return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
-       }
 
-       if(!pkg_info_value)
+       if (!pkg_info_value)
                goto END;
 
        icon_dup = strdup(pkg_info_value);
 
        if (icon_dup == NULL)
-       {
                return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
-       }
 
 END:
        *path = icon_dup;
@@ -316,30 +274,24 @@ END:
        return PACKAGE_MANAGER_ERROR_NONE;
 }
 
-int package_info_get_version(package_info_h package_info, char **version)
+API int package_info_get_version(package_info_h package_info, char **version)
 {
        char *pkg_info_value = NULL;
        char *ver_dup = NULL;
 
        if (package_info == NULL || version == NULL)
-       {
                return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
-       }
 
-       if (pkgmgr_pkginfo_get_version(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
-       {
+       if (pkgmgrinfo_pkginfo_get_version(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
                return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
-       }
 
-       if(!pkg_info_value)
+       if (!pkg_info_value)
                goto END;
 
        ver_dup = strdup(pkg_info_value);
 
        if (ver_dup == NULL)
-       {
                return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
-       }
 
 END:
        *version = ver_dup;
@@ -347,30 +299,24 @@ END:
        return PACKAGE_MANAGER_ERROR_NONE;
 }
 
-int package_info_get_type(package_info_h package_info, char **type)
+API int package_info_get_type(package_info_h package_info, char **type)
 {
        char *pkg_info_value = NULL;
        char *type_dup = NULL;
 
        if (package_info == NULL || type == NULL)
-       {
                return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
-       }
 
-       if (pkgmgr_pkginfo_get_type(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
-       {
+       if (pkgmgrinfo_pkginfo_get_type(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
                return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
-       }
 
-       if(!pkg_info_value)
+       if (!pkg_info_value)
                goto END;
 
        type_dup = strdup(pkg_info_value);
 
        if (type_dup == NULL)
-       {
                return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
-       }
 
 END:
        *type = type_dup;
@@ -378,136 +324,146 @@ END:
        return PACKAGE_MANAGER_ERROR_NONE;
 }
 
-int package_info_get_installed_storage(package_info_h package_info, package_info_installed_storage_type_e *storage)
+API int package_info_get_installed_storage(package_info_h package_info, package_info_installed_storage_type_e *storage)
 {
        int ret = 0;
-       pkgmgr_installed_storage pkg_info_value;
+       pkgmgrinfo_installed_storage pkg_info_value;
 
        if (package_info == NULL || storage == NULL)
-       {
                return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
-       }
 
-       ret = pkgmgr_pkginfo_get_installed_storage(package_info->pkgmgr_pkginfo, &pkg_info_value);
+       ret = pkgmgrinfo_pkginfo_get_installed_storage(package_info->pkgmgr_pkginfo, &pkg_info_value);
        if (ret < 0)
                return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
 
-       if (pkg_info_value == PM_INTERNAL_STORAGE)
+       if (pkg_info_value == PMINFO_INTERNAL_STORAGE)
                *storage = PACKAGE_INFO_INTERNAL_STORAGE;
-       else if (pkg_info_value == PM_EXTERNAL_STORAGE)
+       else if (pkg_info_value == PMINFO_EXTERNAL_STORAGE)
                *storage = PACKAGE_INFO_EXTERNAL_STORAGE;
+       else if (pkg_info_value == PMINFO_EXTENDED_STORAGE)
+               *storage = PACKAGE_INFO_EXTENDED_STORAGE;
+       else
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
 
        return PACKAGE_MANAGER_ERROR_NONE;
 }
 
-/*
-int package_info_get_install_location(package_info_h package_info, package_manager_package_location_e *location)
+API int package_info_get_root_path(package_info_h package_info, char **path)
 {
-       pkgmgr_install_location pkg_info_value = 0;
+       char *pkg_info_value = NULL;
+       char *path_dup = NULL;
 
-       if (package_info == NULL || system == NULL)
-       {
+       if (package_info == NULL || path == NULL)
                return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
-       }
 
-       if (pkgmgr_pkginfo_get_install_location(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
-       {
+       if (pkgmgrinfo_pkginfo_get_root_path(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
                return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
-       }
 
-       *location = (pkg_info_value==PM_INSTALL_LOCATION_INTERNAL_ONLY ? PACAKGE_MANAGER_LOCATION_INTERNAL : PACAKGE_MANAGER_LOCATION_EXTERNAL);
+       if (!pkg_info_value)
+               goto END;
+
+       path_dup = strdup(pkg_info_value);
+
+       if (path_dup == NULL)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
+
+END:
+       *path = path_dup;
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+API int package_info_get_tep_name(package_info_h package_info, char **name)
+{
+       char *tepname_tmp = NULL;
+       int retval = 0;
+
+       if (package_info == NULL || package_info->package == NULL || name == NULL)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+
+       retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
+       if (retval != PACKAGE_MANAGER_ERROR_NONE)
+               return retval;
+
+       if (pkgmgrinfo_pkginfo_get_tep_name(package_info->pkgmgr_pkginfo, &tepname_tmp) != PMINFO_R_OK)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
+
+       if (tepname_tmp != NULL)
+               *name = strdup(tepname_tmp);
+
+       if (*name == NULL)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
 
        return PACKAGE_MANAGER_ERROR_NONE;
 }
-*/
 
-int package_info_is_system_package(package_info_h package_info, bool *system)
+API int package_info_is_system_package(package_info_h package_info, bool *system)
 {
        bool pkg_info_value = false;
 
        if (package_info == NULL || system == NULL)
-       {
                return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
-       }
 
-       if (pkgmgr_pkginfo_is_preload(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
-       {
+       if (pkgmgrinfo_pkginfo_is_system(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
                return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
-       }
 
        *system = pkg_info_value;
 
        return PACKAGE_MANAGER_ERROR_NONE;
 }
 
-int package_info_is_removable_package(package_info_h package_info, bool *removable)
+API int package_info_is_removable_package(package_info_h package_info, bool *removable)
 {
        bool pkg_info_value = false;
 
        if (package_info == NULL || removable == NULL)
-       {
                return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
-       }
 
-       if (pkgmgr_pkginfo_is_removable(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
-       {
+       if (pkgmgrinfo_pkginfo_is_removable(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
                return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
-       }
 
        *removable = pkg_info_value;
 
        return PACKAGE_MANAGER_ERROR_NONE;
 }
 
-int package_info_is_preload_package(package_info_h package_info, bool *preload)
+API int package_info_is_preload_package(package_info_h package_info, bool *preload)
 {
        bool pkg_info_value = false;
 
        if (package_info == NULL || preload == NULL)
-       {
                return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
-       }
 
-       if (pkgmgr_pkginfo_is_preload(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
-       {
+       if (pkgmgrinfo_pkginfo_is_preload(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
                return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
-       }
 
        *preload = pkg_info_value;
 
        return PACKAGE_MANAGER_ERROR_NONE;
 }
 
-int package_info_is_equal(package_info_h lhs, package_info_h rhs, bool *equal)
+API int package_info_is_equal(package_info_h lhs, package_info_h rhs, bool *equal)
 {
        if (lhs == NULL || rhs == NULL || equal == NULL)
-       {
                return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
-       }
 
        if (!strcmp(lhs->package, rhs->package))
-       {
                *equal = true;
-       }
        else
-       {
                *equal = false;
-       }
 
        return PACKAGE_MANAGER_ERROR_NONE;
 }
 
-int package_info_is_accessible(package_info_h package_info, bool *accessible)
+API int package_info_is_accessible(package_info_h package_info, bool *accessible)
 {
        int ret = 0;
        bool pkg_info_value = false;
 
        if (package_info == NULL || accessible == NULL)
-       {
                return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
-       }
 
-       ret = pkgmgr_pkginfo_is_accessible(package_info->pkgmgr_pkginfo, &pkg_info_value);
+       ret = pkgmgrinfo_pkginfo_is_accessible(package_info->pkgmgr_pkginfo, &pkg_info_value);
        if (ret < 0)
                return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
 
@@ -517,26 +473,39 @@ int package_info_is_accessible(package_info_h package_info, bool *accessible)
        return PACKAGE_MANAGER_ERROR_NONE;
 }
 
-int package_info_clone(package_info_h *clone, package_info_h package_info)
+API int package_info_get_installed_time(package_info_h package_info, int *installed_time)
+{
+       int ret;
+       int time_value;
+
+       if (package_info == NULL || installed_time == NULL)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+
+       ret = pkgmgrinfo_pkginfo_get_installed_time(package_info->pkgmgr_pkginfo, &time_value);
+       if (ret < 0)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+
+       *installed_time = time_value;
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+API int package_info_clone(package_info_h *clone, package_info_h package_info)
 {
        int retval;
 
        if (clone == NULL || package_info == NULL)
-       {
                return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
-       }
 
        retval = package_info_create(package_info->package, clone);
 
        if (retval != PACKAGE_MANAGER_ERROR_NONE)
-       {
                return package_manager_error(retval, __FUNCTION__, NULL);
-       }
 
        return PACKAGE_MANAGER_ERROR_NONE;
 }
 
-int package_info_foreach_cert_info(package_info_h package_info, package_info_cert_info_cb callback, void* user_data)
+API int package_info_foreach_cert_info(package_info_h package_info, package_info_cert_info_cb callback, void *user_data)
 {
        int retval;
        pkgmgrinfo_certinfo_h handle = NULL;
@@ -544,32 +513,26 @@ int package_info_foreach_cert_info(package_info_h package_info, package_info_cer
        const char *cert_value = NULL;
 
        if (package_info == NULL || callback == NULL)
-       {
                return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
-       }
 
        retval = pkgmgrinfo_pkginfo_create_certinfo(&handle);
        if (retval != PMINFO_R_OK)
                return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
 
-       retval = pkgmgrinfo_pkginfo_load_certinfo(package_info->package, handle);
-       if (retval != PMINFO_R_OK)
-       {
+       retval = pkgmgrinfo_pkginfo_load_certinfo(package_info->package, handle, getuid());
+       if (retval != PMINFO_R_OK) {
                pkgmgrinfo_pkginfo_destroy_certinfo(handle);
                return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
        }
 
-       for( i=0; i<=PACKAGE_INFO_DISTRIBUTOR2_SIGNER_CERT; i++)
-       {
+       for (i = 0; i <= PACKAGE_INFO_DISTRIBUTOR2_SIGNER_CERT; i++) {
                retval = pkgmgrinfo_pkginfo_get_cert_value(handle, i, &cert_value);
-               if (retval != PMINFO_R_OK)
-               {
+               if (retval != PMINFO_R_OK) {
                        pkgmgrinfo_pkginfo_destroy_certinfo(handle);
                        return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
                }
 
-               if ( cert_value && strncmp(cert_value, "(null)", strlen("(null)")) )
-               {
+               if (cert_value && strncmp(cert_value, "(null)", strlen("(null)"))) {
                        retval = callback(package_info, (package_cert_type_e)i, cert_value, user_data);
                        if (!retval)
                                break;
@@ -583,3 +546,245 @@ int package_info_foreach_cert_info(package_info_h package_info, package_info_cer
        return PACKAGE_MANAGER_ERROR_NONE;
 }
 
+static int package_info_foreach_privilege_cb(const char *privilege_name, void *user_data)
+{
+       foreach_privilege_s *foreach_privilege = (foreach_privilege_s *)user_data;
+
+       if (!foreach_privilege->callback(privilege_name, foreach_privilege->user_data))
+               return -1;
+       else
+               return 0;
+}
+
+API int package_info_foreach_privilege_info(package_info_h package_info, package_info_privilege_info_cb callback, void *user_data)
+{
+       int ret = 0;
+       foreach_privilege_s foreach_privilege = {
+               .callback = callback,
+               .user_data = user_data,
+       };
+
+       if (package_info == NULL || callback == NULL)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+
+       ret = pkgmgrinfo_pkginfo_foreach_privilege(package_info->pkgmgr_pkginfo, package_info_foreach_privilege_cb, &foreach_privilege);
+
+       return ret;
+}
+
+static int package_info_foreach_dependency_cb(const char *from, const char *to, const char *type, const char *required_version, void *user_data)
+{
+       foreach_dependency_s *foreach_dependency = (foreach_dependency_s *)user_data;
+
+       if (!foreach_dependency->callback(from, to, type, required_version, user_data))
+               return -1;
+       else
+               return 0;
+}
+
+API int package_info_foreach_dependency_info(package_info_h package_info, package_info_dependency_info_cb callback, void *user_data)
+{
+       int ret = 0;
+       foreach_dependency_s foreach_dependency = {
+               .callback = callback,
+               .user_data = user_data,
+       };
+
+       if (package_info == NULL || callback == NULL)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+
+       ret = pkgmgrinfo_pkginfo_foreach_dependency(package_info->pkgmgr_pkginfo, package_info_foreach_dependency_cb, &foreach_dependency);
+       if (ret == PMINFO_R_EINVAL)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       else if (ret == PMINFO_R_ERROR)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+API int package_info_foreach_dependency_info_depends_on(package_info_h package_info, package_info_dependency_info_cb callback, void *user_data)
+{
+       int ret = 0;
+       foreach_dependency_s foreach_dependency = {
+               .callback = callback,
+               .user_data = user_data,
+       };
+
+       if (package_info == NULL || callback == NULL)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+
+       ret = pkgmgrinfo_pkginfo_foreach_depends_on(package_info->pkgmgr_pkginfo, package_info_foreach_dependency_cb, &foreach_dependency);
+       if (ret == PMINFO_R_EINVAL)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       else if (ret == PMINFO_R_ERROR)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+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;
+
+       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));
+       if (pkg_info == NULL)
+               return PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY;
+
+       pkg_info->package = strdup(pkg_name);
+       if (pkg_info->package == NULL) {
+               free(pkg_info);
+               return PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY;
+       }
+
+       pkg_info->pkgmgr_pkginfo = pkg_handle;
+       *package_info = pkg_info;
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+int package_info_destroy_handle(package_info_h handle)
+{
+       if (handle == NULL)
+               return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
+
+       free(handle->package);
+       free(handle);
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}