Implement package archive info 60/125160/20
authorSangyoon Jang <s89.jang@samsung.com>
Thu, 13 Apr 2017 11:24:05 +0000 (20:24 +0900)
committerSangyoon Jang <s89.jang@samsung.com>
Mon, 15 May 2017 13:38:42 +0000 (22:38 +0900)
This provides the information of given tizen package.

Change-Id: Id05f07c64fffef27aab43cf885f738c85c5180d8
Signed-off-by: Sangyoon Jang <s89.jang@samsung.com>
doc/package_manager_doc.h
include/package_archive_info.h [new file with mode: 0644]
src/package_archive_info.c [new file with mode: 0644]

index 043e929..ab7afbf 100755 (executable)
  */
 
 
-#endif /* __TIZEN_PACKAGE_MANAGER_DOC_H__ */
+/**
+ * @ingroup CAPI_PACKAGE_MANAGER_MODULE
+ * @defgroup CAPI_PACKAGE_ARCHIVE_INFO_MODULE Package Archive Info
+ * @brief Package Archive Info API. It provides functions for getting information of the package archive.
+ * @section CAPI_PACKAGE_ARCHIVE_INFO_MODULE_HEADER Required Header
+ *   \#include <package_archive_info.h>
+ *
+ * @section CAPI_PACKAGE_ARCHIVE_INFO_MODULE_OVERVIEW Overview
+ * The Package Archive Info API provides functions to get information from the package archive.
+ * You can get basic information such as package id, description, label, author and so on.
+ * Also you can get raw data of icon of the package archive.
+ */
 
 
+#endif /* __TIZEN_PACKAGE_MANAGER_DOC_H__ */
diff --git a/include/package_archive_info.h b/include/package_archive_info.h
new file mode 100644 (file)
index 0000000..8121965
--- /dev/null
@@ -0,0 +1,204 @@
+/*
+ * 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 */
diff --git a/src/package_archive_info.c b/src/package_archive_info.c
new file mode 100644 (file)
index 0000000..1e990bb
--- /dev/null
@@ -0,0 +1,296 @@
+/*
+ * 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;
+}