--- /dev/null
+/*
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __TIZEN_APPFW_PACKAGE_ARCHIVE_INFO_H
+#define __TIZEN_APPFW_PACKAGE_ARCHIVE_INFO_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @file package_archive_info.h
+ */
+
+/**
+ * @addtogroup CAPI_PACKAGE_ARCHIVE_INFO_MODULE
+ * @{
+ */
+
+
+/**
+ * @brief The package archive information handle.
+ * @since_tizen 4.0
+ */
+typedef struct package_archive_info_s *package_archive_info_h;
+
+/**
+ * @brief Creates the package archive information for the given package.
+ * @since_tizen 4.0
+ * @remarks If the given path is relevant to media storage, the privilege
+ * http://tizen.org/privilege/mediastorage is needed.
+ * @remarks If the given path is relevant to external storage, the privilege
+ * http://tizen.org/privilege/externalstorage is needed.
+ * @remarks You must release @a archive_info
+ * using package_archive_info_destroy().
+ * @param[in] path The path of the package
+ * @param[out] archive_info The package archive information for
+ * the given package
+ * @return @c 0 on success,
+ * otherwise a negative error value
+ * @retval #PACKAGE_MANAGER_ERROR_NONE Successful
+ * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY Out of memory
+ * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR Internal I/O error
+ * @see package_archive_info_destroy()
+ */
+int package_archive_info_create(const char *path,
+ package_archive_info_h *archive_info);
+
+/**
+ * @brief Destroys the package archive information handle.
+ * @since_tizen 4.0
+ * @param[in] archive_info The package archive information handle
+ * @return @c 0 on success,
+ * otherwise a negative error value
+ * @retval #PACKAGE_MANAGER_ERROR_NONE Successful
+ * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @see package_archive_info_create()
+ */
+int package_archive_info_destroy(package_archive_info_h archive_info);
+
+/**
+ * @brief Gets the package name.
+ * @since_tizen 4.0
+ * @remarks You must release @a package using free().
+ * @param[in] archive_info The package archive information
+ * @param[out] package The package name
+ * @return @c 0 on success,
+ * otherwise a negative error value
+ * @retval #PACKAGE_MANAGER_ERROR_NONE Successful
+ * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY Out of memory
+ */
+int package_archive_info_get_package(package_archive_info_h archive_info,
+ char **package);
+
+/**
+ * @brief Gets the type of the package.
+ * @since_tizen 4.0
+ * @remarks You must release @a type using free().
+ * @param[in] archive_info The package archive information
+ * @param[out] type The type of the package
+ * @return @c 0 on success,
+ * otherwise a negative error value
+ * @retval #PACKAGE_MANAGER_ERROR_NONE Successful
+ * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY Out of memory
+ */
+int package_archive_info_get_type(package_archive_info_h archive_info,
+ char **type);
+
+/**
+ * @brief Gets the version of the package.
+ * @since_tizen 4.0
+ * @remarks You must release @a version using free().
+ * @param[in] archive_info The package archive information
+ * @param[out] version The version of the package
+ * @return @c 0 on success,
+ * otherwise a negative error value
+ * @retval #PACKAGE_MANAGER_ERROR_NONE Successful
+ * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY Out of memory
+ */
+int package_archive_info_get_version(package_archive_info_h archive_info,
+ char **version);
+
+/**
+ * @brief Gets the API version of the package.
+ * @since_tizen 4.0
+ * @remarks You must release @a api_version using free().
+ * @param[in] archive_info The package archive information
+ * @param[out] api_version The API version of the package
+ * @return @c 0 on success,
+ * otherwise a negative error value
+ * @retval #PACKAGE_MANAGER_ERROR_NONE Successful
+ * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY Out of memory
+ */
+int package_archive_info_get_api_version(package_archive_info_h archive_info,
+ char **api_version);
+
+/**
+ * @brief Gets the description of the package.
+ * @since_tizen 4.0
+ * @remarks You must release @a description using free().
+ * @param[in] archive_info The package archive information
+ * @param[out] description The description of the package
+ * @return @c 0 on success,
+ * otherwise a negative error value
+ * @retval #PACKAGE_MANAGER_ERROR_NONE Successful
+ * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY Out of memory
+ * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR I/O error
+ */
+int package_archive_info_get_description(package_archive_info_h archive_info,
+ char **description);
+
+/**
+ * @brief Gets the label of the package.
+ * @since_tizen 4.0
+ * @remarks You must release @a label using free().
+ * @param[in] archive_info The package archive information
+ * @param[out] label The label of the package
+ * @return @c 0 on success,
+ * otherwise a negative error value
+ * @retval #PACKAGE_MANAGER_ERROR_NONE Successful
+ * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY Out of memory
+ * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR I/O error
+ */
+int package_archive_info_get_label(package_archive_info_h archive_info,
+ char **label);
+
+/**
+ * @brief Gets the author of the package.
+ * @since_tizen 4.0
+ * @remarks You must release @a author using free().
+ * @param[in] archive_info The package archive information
+ * @param[out] author The author of the package
+ * @return @c 0 on success,
+ * otherwise a negative error value
+ * @retval #PACKAGE_MANAGER_ERROR_NONE Successful
+ * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY Out of memory
+ * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR I/O error
+ */
+int package_archive_info_get_author(package_archive_info_h archive_info,
+ char **author);
+
+/**
+ * @brief Gets the raw icon of the package.
+ * @since_tizen 4.0
+ * @remarks You must release @a icon using free().
+ * @param[in] archive_info The package archive information
+ * @param[out] icon The raw icon of the package
+ * @param[out] icon_size The size of the icon
+ * @return @c 0 on success,
+ * otherwise a negative error value
+ * @retval #PACKAGE_MANAGER_ERROR_NONE Successful
+ * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY Out of memory
+ * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR I/O error
+ */
+int package_archive_info_get_icon(package_archive_info_h archive_info,
+ unsigned char **icon, size_t *icon_size);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __TIZEN_APPFW_PACKAGE_ARCHIVE_INFO_H */
--- /dev/null
+/*
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdlib.h>
+
+#include <pkgmgr-info.h>
+
+#include "package_archive_info.h"
+#include "package_manager.h"
+#include "package_manager_internal.h"
+
+struct package_archive_info_s {
+ pkgmgrinfo_archiveinfo_h archive_info;
+};
+
+API int package_archive_info_create(const char *path,
+ package_archive_info_h *archive_info)
+{
+ int ret;
+ pkgmgrinfo_archiveinfo_h info;
+ struct package_archive_info_s *info_out;
+
+ if (path == NULL || archive_info == NULL) {
+ _LOGE("Invalid parameter");
+ return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
+ }
+
+ ret = pkgmgrinfo_archiveinfo_get_archiveinfo(path, &info);
+ if (ret != PMINFO_R_OK) {
+ _LOGE("Failed to get archive info from %s", path);
+ return PACKAGE_MANAGER_ERROR_IO_ERROR;
+ }
+
+ info_out = malloc(sizeof(struct package_archive_info_s));
+ if (info_out == NULL) {
+ _LOGE("Out of memory");
+ pkgmgrinfo_archiveinfo_destroy_archiveinfo(info);
+ return PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY;
+ }
+
+ info_out->archive_info = info;
+ *archive_info = info_out;
+
+ return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+API int package_archive_info_destroy(package_archive_info_h archive_info)
+{
+ int ret;
+ struct package_archive_info_s *info =
+ (struct package_archive_info_s *)archive_info;
+
+ if (archive_info == NULL) {
+ _LOGE("Invalid parameter");
+ return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
+ }
+
+ ret = pkgmgrinfo_archiveinfo_destroy_archiveinfo(info->archive_info);
+ if (ret != PMINFO_R_OK)
+ return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
+ free(info);
+
+ return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+API int package_archive_info_get_package(package_archive_info_h archive_info,
+ char **package)
+{
+ int ret;
+ struct package_archive_info_s *info =
+ (struct package_archive_info_s *)archive_info;
+ const char *pkgid;
+
+ if (archive_info == NULL || package == NULL) {
+ _LOGE("Invalid parameter");
+ return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
+ }
+
+ ret = pkgmgrinfo_archiveinfo_get_pkgid(info->archive_info, &pkgid);
+ if (ret != PMINFO_R_OK)
+ return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
+
+ *package = strdup(pkgid);
+ if (*package == NULL) {
+ _LOGE("Out of memory");
+ return PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY;
+ }
+
+ return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+API int package_archive_info_get_type(package_archive_info_h archive_info,
+ char **type)
+{
+ int ret;
+ struct package_archive_info_s *info =
+ (struct package_archive_info_s *)archive_info;
+ const char *pkg_type;
+
+ if (archive_info == NULL || type == NULL) {
+ _LOGE("Invalid parameter");
+ return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
+ }
+
+ ret = pkgmgrinfo_archiveinfo_get_type(info->archive_info,
+ &pkg_type);
+ if (ret != PMINFO_R_OK)
+ return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
+
+ *type = strdup(pkg_type);
+ if (*type == NULL) {
+ _LOGE("Out of memory");
+ return PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY;
+ }
+
+ return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+API int package_archive_info_get_version(package_archive_info_h archive_info,
+ char **version)
+{
+ int ret;
+ struct package_archive_info_s *info =
+ (struct package_archive_info_s *)archive_info;
+ const char *pkg_version;
+
+ if (archive_info == NULL || version == NULL) {
+ _LOGE("Invalid parameter");
+ return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
+ }
+
+ ret = pkgmgrinfo_archiveinfo_get_version(info->archive_info,
+ &pkg_version);
+ if (ret != PMINFO_R_OK)
+ return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
+
+ *version = strdup(pkg_version);
+ if (*version == NULL) {
+ _LOGE("Out of memory");
+ return PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY;
+ }
+
+ return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+API int package_archive_info_get_api_version(
+ package_archive_info_h archive_info, char **api_version)
+{
+ int ret;
+ struct package_archive_info_s *info =
+ (struct package_archive_info_s *)archive_info;
+ const char *pkg_api_version;
+
+ if (archive_info == NULL || api_version == NULL) {
+ _LOGE("Invalid parameter");
+ return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
+ }
+
+ ret = pkgmgrinfo_archiveinfo_get_api_version(info->archive_info,
+ &pkg_api_version);
+ if (ret != PMINFO_R_OK)
+ return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
+
+ *api_version = strdup(pkg_api_version);
+ if (*api_version == NULL) {
+ _LOGE("Out of memory");
+ return PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY;
+ }
+
+ return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+API int package_archive_info_get_description(
+ package_archive_info_h archive_info, char **description)
+{
+ int ret;
+ struct package_archive_info_s *info =
+ (struct package_archive_info_s *)archive_info;
+ const char *pkg_description;
+
+ if (archive_info == NULL || description == NULL) {
+ _LOGE("Invalid parameter");
+ return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
+ }
+
+ ret = pkgmgrinfo_archiveinfo_get_description(info->archive_info,
+ &pkg_description);
+ if (ret != PMINFO_R_OK)
+ return PACKAGE_MANAGER_ERROR_IO_ERROR;
+
+ *description = strdup(pkg_description);
+ if (*description == NULL) {
+ _LOGE("Out of memory");
+ return PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY;
+ }
+
+ return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+API int package_archive_info_get_label(package_archive_info_h archive_info,
+ char **label)
+{
+ int ret;
+ struct package_archive_info_s *info =
+ (struct package_archive_info_s *)archive_info;
+ const char *pkg_label;
+
+ if (archive_info == NULL || label == NULL) {
+ _LOGE("Invalid parameter");
+ return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
+ }
+
+ ret = pkgmgrinfo_archiveinfo_get_label(info->archive_info,
+ &pkg_label);
+ if (ret != PMINFO_R_OK)
+ return PACKAGE_MANAGER_ERROR_IO_ERROR;
+
+ *label = strdup(pkg_label);
+ if (*label == NULL) {
+ _LOGE("Out of memory");
+ return PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY;
+ }
+
+ return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+API int package_archive_info_get_author(package_archive_info_h archive_info,
+ char **author)
+{
+ int ret;
+ struct package_archive_info_s *info =
+ (struct package_archive_info_s *)archive_info;
+ const char *pkg_author;
+
+ if (archive_info == NULL || author == NULL) {
+ _LOGE("Invalid parameter");
+ return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
+ }
+
+ ret = pkgmgrinfo_archiveinfo_get_author(info->archive_info,
+ &pkg_author);
+ if (ret != PMINFO_R_OK)
+ return PACKAGE_MANAGER_ERROR_IO_ERROR;
+
+ *author = strdup(pkg_author);
+ if (*author == NULL) {
+ _LOGE("Out of memory");
+ return PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY;
+ }
+
+ return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+API int package_archive_info_get_icon(package_archive_info_h archive_info,
+ unsigned char **icon, size_t *icon_size)
+{
+ int ret;
+ struct package_archive_info_s *info =
+ (struct package_archive_info_s *)archive_info;
+ const unsigned char *pkg_icon;
+ size_t pkg_icon_size;
+ unsigned char *icon_buf;
+
+ if (archive_info == NULL || icon == NULL) {
+ _LOGE("Invalid parameter");
+ return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
+ }
+
+ ret = pkgmgrinfo_archiveinfo_get_icon(info->archive_info,
+ &pkg_icon, &pkg_icon_size);
+ if (ret != PMINFO_R_OK)
+ return PACKAGE_MANAGER_ERROR_IO_ERROR;
+
+ icon_buf = malloc(pkg_icon_size * sizeof(unsigned char));
+ if (icon_buf == NULL) {
+ _LOGE("Out of memory");
+ return PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY;
+ }
+
+ memcpy(icon_buf, pkg_icon, pkg_icon_size);
+
+ return PACKAGE_MANAGER_ERROR_NONE;
+}