Implement package archive info as extension api 09/127109/3
authorSangyoon Jang <s89.jang@samsung.com>
Thu, 13 Apr 2017 11:24:05 +0000 (20:24 +0900)
committerSangyoon Jang <s89.jang@samsung.com>
Fri, 28 Apr 2017 04:11:13 +0000 (13:11 +0900)
This provides the information of given tizen package.

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

diff --git a/include/package_archive_info_extension.h b/include/package_archive_info_extension.h
new file mode 100644 (file)
index 0000000..e964529
--- /dev/null
@@ -0,0 +1,200 @@
+/*
+ * 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_EXTENSION_H
+#define __TIZEN_APPFW_PACKAGE_ARCHIVE_INFO_EXTENSION_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 3.0
+ */
+typedef struct package_archive_info_s *package_archive_info_h;
+
+/**
+ * @brief Creates the package archive information for the given package.
+ * @since_tizen 3.0
+ * @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_SYSTEM_ERROR      Severe system 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 3.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 3.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 3.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 3.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 3.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 3.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 3.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 3.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 3.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_EXTENSION_H */
diff --git a/src/package_archive_info.c b/src/package_archive_info.c
new file mode 100644 (file)
index 0000000..7e569ef
--- /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_SYSTEM_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;
+}