tizen 2.3.1 release tizen_2.3.1 submit/tizen_2.3.1/20150915.075845 tizen_2.3.1_release
authorjk7744.park <jk7744.park@samsung.com>
Tue, 8 Sep 2015 13:10:43 +0000 (22:10 +0900)
committerjk7744.park <jk7744.park@samsung.com>
Tue, 8 Sep 2015 13:10:43 +0000 (22:10 +0900)
14 files changed:
CMakeLists.txt
capi-appfw-package-manager.manifest [new file with mode: 0644]
capi-appfw-package-manager.pc.in
doc/package_manager_doc.h [new file with mode: 0755]
doc_prod/package_manager_doc.h [new file with mode: 0755]
include/package_info.h [new file with mode: 0755]
include/package_manager.h
include/package_manager_internal.h [new file with mode: 0755]
packaging/capi-appfw-package-manager.spec
src/package_info.c [new file with mode: 0755]
src/package_manager.c
src/package_manager_internal.c [new file with mode: 0755]
tool/CMakeLists.txt [new file with mode: 0644]
tool/main.c [new file with mode: 0755]

index c9cdab6..d5349e9 100755 (executable)
@@ -10,7 +10,7 @@ SET(PREFIX ${CMAKE_INSTALL_PREFIX})
 SET(INC_DIR include)
 INCLUDE_DIRECTORIES(${INC_DIR})
 
-SET(requires "capi-base-common dlog vconf aul ail pkgmgr glib-2.0")
+SET(requires "capi-base-common dlog vconf aul ail pkgmgr pkgmgr-info")
 SET(pc_requires "capi-base-common")
 
 INCLUDE(FindPkgConfig)
@@ -19,7 +19,7 @@ FOREACH(flag ${${fw_name}_CFLAGS})
     SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
 ENDFOREACH(flag)
 
-SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIC -Wall -Werror")
+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIC -Wall")
 SET(CMAKE_C_FLAGS_DEBUG "-O0 -g")
 
 IF("${ARCH}" STREQUAL "arm")
@@ -29,7 +29,7 @@ ENDIF("${ARCH}" STREQUAL "arm")
 ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"")
 ADD_DEFINITIONS("-DSLP_DEBUG")
 
-SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -Wl,--rpath=/usr/lib")
+SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -Wl,--rpath=${LIB_INSTALL_DIR}")
 
 aux_source_directory(src SOURCES)
 ADD_LIBRARY(${fw_name} SHARED ${SOURCES})
@@ -43,7 +43,7 @@ SET_TARGET_PROPERTIES(${fw_name}
      CLEAN_DIRECT_OUTPUT 1
 )
 
-INSTALL(TARGETS ${fw_name} DESTINATION lib)
+INSTALL(TARGETS ${fw_name} DESTINATION ${LIB_INSTALL_DIR})
 INSTALL(
         DIRECTORY ${INC_DIR}/ DESTINATION include/appfw
         FILES_MATCHING
@@ -61,7 +61,7 @@ CONFIGURE_FILE(
     ${CMAKE_CURRENT_SOURCE_DIR}/${fw_name}.pc
     @ONLY
 )
-INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${fw_name}.pc DESTINATION lib/pkgconfig)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${fw_name}.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig)
 
 
 IF(UNIX)
@@ -95,3 +95,4 @@ ADD_CUSTOM_COMMAND(
 
 ENDIF(UNIX)
 
+add_subdirectory(tool)
diff --git a/capi-appfw-package-manager.manifest b/capi-appfw-package-manager.manifest
new file mode 100644 (file)
index 0000000..6e65195
--- /dev/null
@@ -0,0 +1,8 @@
+<manifest>
+    <request>
+        <domain name="_"/>
+    </request>
+       <assign>
+               <filesystem path="/usr/bin/pkgmgr_tool" label="_" exec_label="none"/>
+       </assign>
+</manifest>
index c1a82ff..4881866 100755 (executable)
@@ -3,7 +3,7 @@
 
 prefix=@PREFIX@
 exec_prefix=/usr
-libdir=/usr/lib
+libdir=@LIB_INSTALL_DIR@
 includedir=/usr/include/appfw
 
 Name: @PC_NAME@
diff --git a/doc/package_manager_doc.h b/doc/package_manager_doc.h
new file mode 100755 (executable)
index 0000000..25a7f62
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2011 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_PACKAGE_MANAGER_DOC_H__
+#define __TIZEN_PACKAGE_MANAGER_DOC_H__
+
+/**
+ * @ingroup CAPI_APPLICATION_FRAMEWORK
+ * @defgroup CAPI_PACKAGE_MANAGER_MODULE Package Manager
+ * @brief The package manager is one of the core modules of Tizen application framework, and responsible for getting their information.
+ *        You can also retrieve information related to the packages that are installed on the device.
+ *
+ * @section CAPI_PACKAGE_MANAGER_MODULE_HEADER Required Header
+ *   \#include <package_manager.h>
+ *
+ * @section CAPI_PACKAGE_MANAGER_MODULE_OVERVIEW Overview
+ * The Package Manager API provides functions to retrieve information related to the packages and also provides event
+ * listening function. You can get the status of package using package_manager_set_event_status() and
+ * package_manager_set_event_cb(). If you register package_manager_event_cb(), it is invoked when a package is installed,
+ * uninstalled or updated.
+ */
+
+/**
+ * @ingroup CAPI_PACKAGE_MANAGER_MODULE
+ * @defgroup CAPI_PACKAGE_INFO_MODULE Package Information
+ * @brief Packager Manager infomation API for packaging. It provides functions for getting the package information.
+ *
+ * @section CAPI_PACKAGE_INFO_MODULE_HEADER Required Header
+ *   \#include <package_manager.h>
+ *
+ * @section CAPI_PACKAGE_INFO_MODULE_OVERVIEW Overview
+ * The package manager is used to retrieve detailed information of the installed packages on the device. This information includes package name, label, path to the icon image, version, type, and installed storage.
+ * To retrieve package information, you should get the #package_info_h using package_info_create() or package_manager_get_package_info().
+ * The package_manager_foreach_package_info() is used to retrieve all the package information of installed packages. And then package_manager_package_info_cb() is invoked. When the callback function is called, you can get the information using the following functions.
+ *
+ */
+
+#endif /* __TIZEN_PACKAGE_MANAGER_DOC_H__ */
+
+
diff --git a/doc_prod/package_manager_doc.h b/doc_prod/package_manager_doc.h
new file mode 100755 (executable)
index 0000000..8d3434c
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2011 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_PACKAGE_MANAGER_DOC_H__
+#define __TIZEN_PACKAGE_MANAGER_DOC_H__
+
+/**
+ * @defgroup CAPI_PACKAGE_MANAGER_MODULE Package Manager
+ * @ingroup CAPI_APPLICATION_FRAMEWORK
+ * @brief The package manager is one of the core modules of Tizen application framework, and responsible for installing, uninstalling, and updating packages, and storing their information. You can also retrieve information related to the packages that are installed on the device.
+ *
+ * @section CAPI_PACKAGE_MANAGER_MODULE_HEADER Required Header
+ *   \#include <package_manager_product.h>
+ *
+ * @section CAPI_PACKAGE_MANAGER_MODULE_OVERVIEW Overview
+ * The Package Manager API provides functions to install, uninstall the package, and also privides event listening function.
+ * The package_manager_request_install() method is used to asynchronously install a package. Similarly, the package_manager_request_uninstall() and package_manager_request_move() method are used to asynchronously uninstall a package. The callback function is called when the progress of the request changes. Use the package_manager_request_event_cb() to listen to package installation related events.
+ * You can also get the status of package using package_manager_set_event_status() and package_manager_set_event_cb(). If you registers package_manager_event_cb(), it is invoked when is installed, uninstalled or updated.
+ *
+ */
+
+/**
+ * @defgroup CAPI_PACKAGE_INFO_MODULE Package Information
+ * @ingroup CAPI_PACKAGE_MANAGER_MODULE
+ * @brief Packager Manager infomation api for packaging. It provides functions for getting package informations.
+ *
+ * @section CAPI_PACKAGE_INFO_MODULE_HEADER Required Header
+ *   \#include <package_manager.h>
+ *
+ * @section CAPI_PACKAGE_INFO_MODULE_OVERVIEW Overview
+ * The package manager is used to retrieve detailed information of the installed packages on the device. This information includes package name, label, path to the icon image, version, type, and installed storage.
+ * To retrieve package information, you should get the package_info_h using package_info_create() or package_manager_get_package_info().
+ * The package_manager_foreach_package_info() is used to retrieve all package information of installed packages. And then pacakage_manager_package_info_cb is invoked. When callback function is called you can get the information using following functions.
+ *
+ */
+
+#endif /* __TIZEN_PACKAGE_MANAGER_DOC_H__ */
+
+
diff --git a/include/package_info.h b/include/package_info.h
new file mode 100755 (executable)
index 0000000..b21f926
--- /dev/null
@@ -0,0 +1,462 @@
+/*
+ * Copyright (c) 2011 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_INFO_H
+#define __TIZEN_APPFW_PACKAGE_INFO_H
+
+#include <tizen.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @file package_info.h
+ */
+
+/**
+ * @addtogroup CAPI_PACKAGE_INFO_MODULE
+ * @{
+ */
+
+/**
+ * @brief The package information handle.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ */
+ typedef struct package_info_s *package_info_h;
+
+/**
+ * @brief Enumeration for storage type.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ */
+typedef enum {
+    PACKAGE_INFO_INTERNAL_STORAGE = 0,    /**< Internal storage */
+    PACKAGE_INFO_EXTERNAL_STORAGE = 1,    /**< External storage */
+} package_info_installed_storage_type_e;
+
+/**
+ * @brief Enumeration for app component type.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ */
+typedef enum {
+    PACKAGE_INFO_ALLAPP = 0,        /**< All application */
+    PACKAGE_INFO_UIAPP = 1,         /**< UI application */
+    PACKAGE_INFO_SERVICEAPP = 2,    /**< Service application */
+} package_info_app_component_type_e;
+
+/**
+ * @brief Enumeration for certification type.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ */
+typedef enum {
+    PACKAGE_INFO_AUTHOR_ROOT_CERT = 0,               /**< Author Root Certificate*/
+    PACKAGE_INFO_AUTHOR_INTERMEDIATE_CERT = 1,       /**< Author Intermediate Certificate*/
+    PACKAGE_INFO_AUTHOR_SIGNER_CERT = 2,             /**< Author Signer Certificate*/
+    PACKAGE_INFO_DISTRIBUTOR_ROOT_CERT = 3,          /**< Distributor Root Certificate*/
+    PACKAGE_INFO_DISTRIBUTOR_INTERMEDIATE_CERT = 4,  /**< Distributor Intermediate Certificate*/
+    PACKAGE_INFO_DISTRIBUTOR_SIGNER_CERT = 5,        /**< Distributor Signer Certificate*/
+    PACKAGE_INFO_DISTRIBUTOR2_ROOT_CERT = 6,         /**< Distributor2 Root Certificate*/
+    PACKAGE_INFO_DISTRIBUTOR2_INTERMEDIATE_CERT = 7, /**< Distributor2 Intermediate Certificate*/
+    PACKAGE_INFO_DISTRIBUTOR2_SIGNER_CERT = 8,       /**< Distributor2 Signer Certificate*/
+} package_cert_type_e;
+
+/**
+ * @brief Called to get the application ID once for each installed package.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ * @param[in] comp_type  The Application Component type
+ * @param[in] callback   The callback function to be invoked
+ * @param[in] user_data  The user data passed from the foreach function
+ *
+ * @return  @c true to continue with the next iteration of the loop,
+ *          otherwise @c false to break out of the loop
+ *
+ * @pre package_info_foreach_app_from_package() will invoke this callback.
+ * @see package_info_foreach_app_from_package()
+ */
+typedef bool (*package_info_app_cb) (package_info_app_component_type_e comp_type, const char *app_id, void *user_data);
+
+/**
+ * @brief Called to get the certification information.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ * @param[in] package_info The package info handle
+ * @param[in] cert_type    The certificate type
+ * @param[in] cert_value   The certificate value of corresponding certificate key \n
+ *                         This value is base64 encoded data.
+ * @param[in] user_data    The user data passed from the foreach function
+ *
+ * @return  @c true to continue with the next iteration of the loop,
+ *          otherwise @c false to break out of the loop
+ *
+ * @pre package_info_foreach_cert_info() will invoke this callback.
+ *
+ * @see package_info_foreach_cert_info()
+ */
+typedef bool (*package_info_cert_info_cb) (package_info_h handle, package_cert_type_e cert_type, const char *cert_value, void *user_data);
+
+/**
+ * @brief Called to get the privilege information.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ * @param[in] privilege_name the name of the privilege
+ * @param[in] user_data    The user data passed from the foreach function
+ *
+ * @return  @c true to continue with the next iteration of the loop,
+ *          otherwise @c false to break out of the loop
+ *
+ * @pre package_info_foreach_privilege_info() will invoke this callback.
+ *
+ * @see package_info_foreach_privilege_info()
+ */
+typedef bool (*package_info_privilege_info_cb) (const char *privilege_name, void *user_data);
+
+/**
+ * @brief Retrieves all application IDs of each package.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ * @param[in] package_info  The package info handle
+ * @param[in] comp_type     The application component type
+ * @param[in] callback      The callback function to invoke
+ * @param[in] user_data     The user data to be passed to the callback function
+ *
+ * @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_NO_SUCH_PACKAGE   No such package
+ *
+ * @post  This function invokes package_info_app_cb() repeatedly for each package.
+ *
+ * @see package_info_app_cb()
+ */
+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);
+
+/**
+ * @brief Destroys the package information handle and releases all its resources.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ * @param[in] package_info The package 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_manager_foreach_package_info()
+ * @see package_manager_get_package_info()
+ */
+int package_info_destroy(package_info_h package_info);
+
+/**
+ * @brief Gets the package name.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ * @remarks You must release @a package using free().
+ *
+ * @param[in]  package_info The package 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_info_get_package(package_info_h package_info, char **package);
+
+/**
+ * @brief Gets the label of the package.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ * @remarks You must release @a label using free().
+ *
+ * @param[in]  package_info The package 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_info_get_label(package_info_h package_info, char **label);
+
+/**
+ * @brief Gets the absolute path to the icon image.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ * @remarks You must release @a path using free().
+ *
+ * @param[in]  package_info The package information
+ * @param[out] path         The path 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_info_get_icon(package_info_h package_info, char **path);
+
+/**
+ * @brief Gets the version of the package.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ * @remarks You must release @a version using free().
+ *
+ * @param[in]  package_info The package 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
+ * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR          I/O error
+ */
+int package_info_get_version(package_info_h package_info, char **version);
+
+/**
+ * @brief Gets the type of the package.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ * @remarks You must release @a type using free().
+ *
+ * @param[in]  package_info The package 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
+ * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR          I/O error
+ */
+int package_info_get_type(package_info_h package_info, char **type);
+
+/**
+ * @brief Gets the installed storage for the given package.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ * @param[in]  package_info The package information
+ * @param[out] storage      The installed storage
+ *
+ * @return  @c 0 on success,
+ *          otherwise a negative error value
+ *
+ * @retval #PACKAGE_MANAGER_ERROR_NONE              Successful
+ * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ */
+int package_info_get_installed_storage(package_info_h package_info, package_info_installed_storage_type_e *storage);
+
+/**
+ * @brief Gets the root path of the package.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ * @remarks You must release @a path using free().
+ *
+ * @param[in]  package_info The package information
+ * @param[out] path         The root path 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_info_get_root_path(package_info_h package_info, char **path);
+
+/**
+ * @brief Checks whether the package is system package.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ * @param[in]  package_info The package information
+ * @param[out] system       @c true if the package is system package,
+ *                          otherwise @c false if the package is not system 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_info_is_system_package(package_info_h package_info, bool *system);
+
+/**
+ * @brief Checks whether the package is removable.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ * @param[in]  package_info The package information
+ * @param[out] removable    The removable info 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_info_is_removable_package(package_info_h package_info, bool *removable);
+
+/**
+ * @brief Checks whether the package is preloaded.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ * @param[in]  package_info The package information
+ * @param[out] preload      The preload info 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_info_is_preload_package(package_info_h package_info, bool *preload);
+
+/**
+ * @brief Checks whether two package information are equal.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ * @param[in]  lhs    The first package information to be compared
+ * @param[in]  rhs    The second package information to be compared
+ * @param[out] equal  @c true if the package information are equal,
+ *                    otherwise @c false if package information are not equal
+ *
+ * @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          Database error occurred
+ */
+int package_info_is_equal(package_info_h lhs, package_info_h rhs, bool *equal);
+
+/**
+ * @brief Checks whether the package info is accessible for the given package.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ * @param[in]  package_info The package information
+ * @param[out] accessible   @c true if the package info is accessible,
+ *                          otherwise @c false if the package info is not accessible
+ *
+ * @return  @c 0 on success,
+ *          otherwise a negative error value
+ *
+ * @retval #PACKAGE_MANAGER_ERROR_NONE              Successful
+ * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ */
+int package_info_is_accessible(package_info_h package_info, bool *accessible);
+
+/**
+ * @brief Clones the package information handle.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ * @param[out] clone          The newly created package information handle
+ * @param[in]  package_info   The package information
+ *
+ * @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_NO_SUCH_PACKAGE   The package is not installed
+ * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY     Out of memory
+ */
+int package_info_clone(package_info_h *clone, package_info_h package_info);
+
+/**
+ * @brief Gets the package information for the given package
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ * @remarks You must release @a package_info using package_info_destroy().
+ *
+ * @param[in]  package      The ID of the package
+ * @param[out] package_info The package information for the given package ID
+ *
+ * @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_NO_SUCH_PACKAGE   The package is not installed
+ * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY     Out of memory
+ */
+int package_info_create(const char *package,  package_info_h *package_info);
+
+/**
+ * @brief Retrieves certification information of the package.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ * @param[in] package_info The package information
+ * @param[in] callback     The iteration callback function
+ * @param[in] user_data    The user data to be passed to the callback function
+ *
+ * @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_info_foreach_cert_info(package_info_h package_info, package_info_cert_info_cb callback, void* user_data);
+
+/**
+ * @brief Retrieves privilege information of the package.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ * @param[in] package_info The package information
+ * @param[in] callback     The iteration callback function
+ * @param[in] user_data    The user data to be passed to the callback function
+ *
+ * @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_info_foreach_privilege_info(package_info_h package_info, package_info_privilege_info_cb callback, void* user_data);
+
+/**
+* @}
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __TIZEN_APPFW_PACKAGE_INFO_H */
index 1a241a9..846017f 100755 (executable)
 
 #include <tizen.h>
 
+#include <package_info.h>
+
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 /**
+ * @file package_manager.h
+ */
+
+/**
  * @addtogroup CAPI_PACKAGE_MANAGER_MODULE
  * @{
  */
 
 /**
- * @brief Enumerations of error code
+ * @brief Value to be used when filtering based on install location: Boolean property for filtering whether the package is removable or not based on package info
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ */
+#define PACKAGE_MANAGER_PKGINFO_PROP_REMOVABLE       "PMINFO_PKGINFO_PROP_PACKAGE_REMOVABLE"
+
+/**
+ * @brief Value to be used when filtering based on install location: Boolean property for filtering whether the package is readonly or not based on package info
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ */
+#define PACKAGE_MANAGER_PKGINFO_PROP_READONLY        "PMINFO_PKGINFO_PROP_PACKAGE_READONLY"
+
+/**
+ * @brief Value to be used when filtering based on install location: Boolean property for filtering whether the package supports disable or not based on package info
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ */
+#define PACKAGE_MANAGER_PKGINFO_PROP_SUPPORT_DISABLE     "PMINFO_PKGINFO_PROP_PACKAGE_SUPPORT_DISABLE"
+
+/**
+ * @brief Value to be used when filtering based on install location: Boolean property for filtering whether the package is disabled based on package info
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ */
+#define PACKAGE_MANAGER_PKGINFO_PROP_DISABLE             "PMINFO_PKGINFO_PROP_PACKAGE_DISABLE"
+
+/**
+ * @brief Value to be used when filtering based on install location: Boolean property for filtering whether the package is preload or not based on package info
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ */
+#define PACKAGE_MANAGER_PKGINFO_PROP_PRELOAD           "PMINFO_PKGINFO_PROP_PACKAGE_PRELOAD"
+
+/**
+ * @brief Enumeration for error code.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  */
 typedef enum {
-       PACKAGE_MANAGER_ERROR_NONE = TIZEN_ERROR_NONE, /**< Successful */
-       PACKAGE_MANAGER_ERROR_INVALID_PARAMETER = TIZEN_ERROR_INVALID_PARAMETER, /**< Invalid parameter */
-       PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY = TIZEN_ERROR_OUT_OF_MEMORY, /**< Out of memory */
-       PACKAGE_MANAGER_ERROR_IO_ERROR = TIZEN_ERROR_IO_ERROR, /**< Internal I/O error */
+       PACKAGE_MANAGER_ERROR_NONE = TIZEN_ERROR_NONE,                                /**< Successful */
+       PACKAGE_MANAGER_ERROR_INVALID_PARAMETER = TIZEN_ERROR_INVALID_PARAMETER,      /**< Invalid parameter */
+       PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY = TIZEN_ERROR_OUT_OF_MEMORY,              /**< Out of memory */
+       PACKAGE_MANAGER_ERROR_IO_ERROR = TIZEN_ERROR_IO_ERROR,                        /**< Internal I/O error */
+       PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE = TIZEN_ERROR_PACKAGE_MANAGER | 0x71,   /**< No such package */
+       PACKAGE_MANAGER_ERROR_SYSTEM_ERROR = TIZEN_ERROR_PACKAGE_MANAGER | 0x72,      /**< Severe system error */
+       PACKAGE_MANAGER_ERROR_PERMISSION_DENIED = TIZEN_ERROR_PERMISSION_DENIED       /**< Permisson denied */
 } package_manager_error_e;
 
 /**
- * @brief Enumeration of event type
+ * @brief Enumeration for event type.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  */
 typedef enum {
-       PACAKGE_MANAGER_EVENT_TYPE_INSTALL,
-       PACAKGE_MANAGER_EVENT_TYPE_UNINSTALL,
-       PACAKGE_MANAGER_EVENT_TYPE_UPDATE,
+    PACKAGE_MANAGER_EVENT_TYPE_INSTALL = 0,    /**< Install event type */
+    PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL,      /**< Uninstall event type */
+    PACKAGE_MANAGER_EVENT_TYPE_UPDATE,         /**< Update event type */
 } package_manager_event_type_e;
 
 /**
- * @brief Enumeration of event state
+ * @brief Enumeration for event state.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  */
 typedef enum {
-       PACAKGE_MANAGER_EVENT_STATE_STARTED,
-       PACAKGE_MANAGER_EVENT_STATE_PROCESSING,
-       PACAKGE_MANAGER_EVENT_STATE_COMPLETED,
-       PACAKGE_MANAGER_EVENT_STATE_FAILED,
+    PACKAGE_MANAGER_EVENT_STATE_STARTED = 0,   /**< Started event state */
+    PACKAGE_MANAGER_EVENT_STATE_PROCESSING,    /**< Processing event state */
+    PACKAGE_MANAGER_EVENT_STATE_COMPLETED,     /**< Completed event state */
+    PACKAGE_MANAGER_EVENT_STATE_FAILED,        /**< Failed event state */
 } package_manager_event_state_e;
 
 /**
- * @brief Enumeration of request mode
+ * @internal
+ * @brief Enumeration for request mode.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  */
 typedef enum {
-       PACAKGE_MANAGER_REQUEST_MODE_DEFAULT,
-       PACAKGE_MANAGER_REQUEST_MODE_QUIET,
+    PACKAGE_MANAGER_REQUEST_MODE_DEFAULT = 0,    /**< @internal Default request mode */
+    PACKAGE_MANAGER_REQUEST_MODE_QUIET,          /**< @internal Quiet request mode */
 } package_manager_request_mode_e;
 
 /**
- * @brief Package manager handle
+ * @brief Enumeration for move type.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ */
+typedef enum {
+    PACKAGE_MANAGER_REQUEST_MOVE_TO_INTERNAL = 0,    /**< Internal type */
+    PACKAGE_MANAGER_REQUEST_MOVE_TO_EXTERNAL,        /**< External type */
+} package_manager_move_type_e;
+
+/**
+ * @brief Enumeration for certification compare type.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ */
+typedef enum {
+    PACKAGE_MANAGER_COMPARE_MATCH = 0,      /**< Matching certification */
+    PACKAGE_MANAGER_COMPARE_MISMATCH,       /**< Mismatching certification */
+    PACKAGE_MANAGER_COMPARE_LHS_NO_CERT,    /**< First package has no certification */
+    PACKAGE_MANAGER_COMPARE_RHS_NO_CERT,    /**< Second package has no certification */
+    PACKAGE_MANAGER_COMPARE_BOTH_NO_CERT,   /**< Both have no certification */
+} package_manager_compare_result_type_e;
+
+/**
+ * @brief Enumeration for permission type.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ */
+typedef enum {
+    PACKAGE_MANAGER_PERMISSION_NORMAL = 0,    /**< Normal permission */
+    PACKAGE_MANAGER_PERMISSION_SIGNATURE,     /**< Signature permission */
+    PACKAGE_MANAGER_PERMISSION_PRIVILEGE,     /**< Privilege permission */
+} package_manager_permission_type_e;
+
+/**
+ * @brief Enumeration for status type.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ */
+typedef enum {
+    PACKAGE_MANAGER_STATUS_TYPE_ALL = 0x00,               /**< All status */
+    PACKAGE_MANAGER_STATUS_TYPE_INSTALL = 0x01,           /**< Install package status */
+    PACKAGE_MANAGER_STATUS_TYPE_UNINSTALL = 0x02,         /**< Uninstall package status */
+    PACKAGE_MANAGER_STATUS_TYPE_UPGRADE = 0x04,           /**< Upgrade package status */
+    PACKAGE_MANAGER_STATUS_TYPE_MOVE = 0x08,              /**< Move package status */
+    PACKAGE_MANAGER_STATUS_TYPE_CLEAR_DATA = 0x10,        /**< Clear data status */
+    PACKAGE_MANAGER_STATUS_TYPE_INSTALL_PROGRESS = 0x20,  /**< Install progress status */
+    PACKAGE_MANAGER_STATUS_TYPE_GET_SIZE = 0x40,          /**< Get size status */
+} package_manager_status_type_e;
+
+/**
+ * @brief The Package manager handle.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  */
 typedef struct package_manager_s *package_manager_h;
 
 /**
- * @brief Package manager request handle
+ * @brief Package manager filter handle.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ */
+typedef struct package_manager_filter_s *package_manager_filter_h;
+
+/**
+ * @internal
+ * @brief The Package manager request handle.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  */
 typedef struct package_manager_request_s *package_manager_request_h;
 
 /**
+ * @internal
  * @brief Called when the progress of the request to the package manager changes.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ * @param[in] id          The ID of the request to the package manager
+ * @param[in] type        The type of the package to install, uninstall or update
+ * @param[in] package     The name of the package to install, uninstall or update
+ * @param[in] event_type  The type of the request to the package manager
+ * @param[in] event_state The current state of the request to the package manager
+ * @param[in] progress    The progress for the request that is being processed by the package manager \n
+ *                        The range of progress is from @c 0 to @c 100.
+ * @param[in] error       The error code when the package manager failed to process the request
+ * @param[in] user_data   The user data passed from package_manager_request_set_event_cb()
  *
- * @param [in] id The ID of the request to the package manager
- * @param [in] type The type of the package to install, uninstall or update
- * @param [in] package The name of the package to install, uninstall or update
- * @param [in] event_type The type of the request to the package manager
- * @param [in] event_state The current state of the request to the package manager
- * @param [in] progress The progress for the request that is being processed by the package manager \n
- * The range of progress is from 0 to 100.
- * @param [in] error The error code when the package manager failed to process the request
- * @param [in] user_data The user data passed from package_manager_request_set_event_cb()
  * @see package_manager_request_set_event_cb()
  * @see package_manager_request_unset_event_cb()
  */
 typedef void (*package_manager_request_event_cb) (
-                       int id,
-                       const char *type,
-                       const char *package,
-                       package_manager_event_type_e event_type,
-                       package_manager_event_state_e event_state,
-                       int progress,
-                       package_manager_error_e error,
-                       void *user_data);
+            int id,
+            const char *type,
+            const char *package,
+            package_manager_event_type_e event_type,
+            package_manager_event_state_e event_state,
+            int progress,
+            package_manager_error_e error,
+            void *user_data);
 
 /**
+ * @internal
  * @brief Creates a request handle to the package manager.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
- * @remarks The @a request must be released with package_manager_reqeust_destroy() by you.
- * @param [out] request A request handle to be newly created on success
- * @return 0 on success, otherwise a negative error value.
- * @retval #PACKAGE_MANAGER_ERROR_NONE Successful
+ * @remarks You must release @a request using package_manager_request_destroy().
+ *
+ * @param[out] request The request handle that is newly created on success
+ *
+ * @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_manager_reqeust_destroy()
+ * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY     Out of memory
+ * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR          Internal I/O error
+ *
+ * @see package_manager_request_destroy()
  */
 int package_manager_request_create(package_manager_request_h *request);
 
 /**
+ * @internal
  * @brief Destroys the request handle to the package manager.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
- * @param [in] request The request handle to the package manager
- * @return 0 on success, otherwise a negative error value.
- * @retval #PACKAGE_MANAGER_ERROR_NONE Successful
+ * @param[in] request The request handle to the package manager
+ *
+ * @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_manager_request_create()
  */
-int package_manager_reqeust_destroy(package_manager_request_h request);
+int package_manager_request_destroy(package_manager_request_h request);
 
 /**
+ * @internal
  * @brief Registers a callback function to be invoked when the progress of the request changes.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/packagemanager.info
+ * @param[in] request The request handle
+ * @param[in] callback The callback function to be registered
+ * @param[in] user_data The user data to be passed to the callback function
  *
- * @param [in] request The request handle
- * @param [in] callback The callback function to register
- * @param [in] user_data The user data to be passed to the callback function
- * @return 0 on success, otherwise a negative error value.
- * @retval #PACKAGE_MANAGER_ERROR_NONE Successful
+ * @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_PERMISSION_DENIED Permission denied
  * @post package_manager_request_event_cb() will be invoked.
+ *
  * @see package_manager_request_event_cb()
  * @see package_manager_request_unset_event_cb()
-*/
+ */
 int package_manager_request_set_event_cb(package_manager_request_h request,
-                                        package_manager_request_event_cb callback, void *user_data);
+                     package_manager_request_event_cb callback, void *user_data);
 
 /**
+ * @internal
  * @brief Unregisters the callback function.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
- * @param [in] request The request handle
- * @return 0 on success, otherwise a negative error value.
- * @retval #PACKAGE_MANAGER_ERROR_NONE Successful
+ * @param[in] request The request 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_manager_request_event_cb()
  * @see package_manager_request_set_event_cb()
-*/
+ */
 int package_manager_request_unset_event_cb(package_manager_request_h request);
 
 /**
+ * @internal
  * @brief Sets the type of the package to install, uninstall or update.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
- * @param [in] request The request handle
- * @param [in] type The type of the package
- * @return 0 on success, otherwise a negative error value.
- * @retval #PACKAGE_MANAGER_ERROR_NONE Successful
+ * @param[in] request The request handle
+ * @param[in] 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
-*/
+ */
 int package_manager_request_set_type(package_manager_request_h request,
-                                    const char *type);
+                     const char *type);
 
 /**
+ * @internal
  * @brief Sets the mode of the request.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
- * @param [in] request The request handle
- * @param [in] mode The mode of the request
- * @return 0 on success, otherwise a negative error value.
- * @retval #PACKAGE_MANAGER_ERROR_NONE Successful
+ * @param[in] request The request handle
+ * @param[in] mode    The mode of the request
+ *
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ *
+ * @retval #PACKAGE_MANAGER_ERROR_NONE              Successful
  * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
-*/
+ */
 int package_manager_request_set_mode(package_manager_request_h request,
-                                    package_manager_request_mode_e mode);
+                     package_manager_request_mode_e mode);
 
 /**
- * @brief Installs the package which is located at the given path.
+ * @internal
+ * @brief Installs the package located at the given path.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ * @privlevel platform
+ * @privilege %http://tizen.org/privilege/packagemanager.admin
+ * @param[in]  request The request handle
+ * @param[in]  path    The absolute path to the package to be installed
+ * @param[out] id      The ID of the request to the package manager
  *
- * @param [in] request The request handle
- * @param [in] path The absolute path to the package to install
- * @param [out] id The ID of the request to the package manager
- * @return 0 on success, otherwise a negative error value.
- * @retval #PACKAGE_MANAGER_ERROR_NONE Successful
+ * @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_PERMISSION_DENIED Permission denied
  * @see package_manager_request_uninstall()
-*/
+ */
 int package_manager_request_install(package_manager_request_h request,
-                                   const char *path, int *id);
+                    const char *path, int *id);
 
 /**
- * @brief Uninstalls the package with the given name
+ * @internal
+ * @brief Uninstalls the package with the given name.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ * @privlevel platform
+ * @privilege %http://tizen.org/privilege/packagemanager.admin
+ * @param[in]  request The request handle
+ * @param[in]  name    The name of the package to be uninstalled
+ * @param[out] id      The ID of the request to the package manager
  *
- * @param [in] request The request handle
- * @param [in] name The name of the package to uninstall
- * @param [out] id The ID of the request to the package manager
- * @return 0 on success, otherwise a negative error value.
- * @retval #PACKAGE_MANAGER_ERROR_NONE Successful
+ * @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_PERMISSION_DENIED Permission denied
+ */
 int package_manager_request_uninstall(package_manager_request_h request,
-                                     const char *name, int *id);
+                      const char *name, int *id);
+
+/**
+ * @internal
+ * @brief Moves the package from SD card to the internal memory and vice versa.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ * @privlevel platform
+ * @privilege %http://tizen.org/privilege/packagemanager.admin
+ * @param[in] request   The request handle
+ * @param[in] name      The name of the package to be moved
+ * @param[in] move_type The move type [enum package_manager_move_type_e], [external to internal/internal to external]
+ *
+ * @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_PERMISSION_DENIED Permission denied
+ */
+int package_manager_request_move(package_manager_request_h request,
+                    const char *name, package_manager_move_type_e move_type);
+
 
 /**
  * @brief Called when the package is installed, uninstalled or updated, and the progress of the request to the package manager changes.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ * @param[in] type        The type of the package to be installed, uninstalled or updated
+ * @param[in] package     The name of the package to be installed, uninstalled or updated
+ * @param[in] event_type  The type of the request to the package manager
+ * @param[in] event_state The current state of the request to the package manager
+ * @param[in] progress    The progress for the request that is being processed by the package manager \n
+ *                        The range of progress is from @c 0 to @c 100.
+ * @param[in] error       The error code when the package manager failed to process the request
+ * @param[in] user_data   The user data passed from package_manager_set_event_cb()
  *
- * @param [in] type The type of the package to install, uninstall or update
- * @param [in] package The name of the package to install, uninstall or update
- * @param [in] event_type The type of the request to the package manager
- * @param [in] event_state The current state of the request to the package manager
- * @param [in] progress The progress for the request that is being processed by the package manager \n
- * The range of progress is from 0 to 100.
- * @param [in] error The error code when the package manager failed to process the request
- * @param [in] user_data The user data passed from package_manager_set_event_cb()
  * @see package_manager_set_event_cb()
  * @see package_manager_unset_event_cb()
  */
 typedef void (*package_manager_event_cb) (
-                       const char *type,
-                       const char *package,
-                       package_manager_event_type_e event_type,
-                       package_manager_event_state_e event_state,
-                       int progress,
-                       package_manager_error_e error,
-                       void *user_data);
+            const char *type,
+            const char *package,
+            package_manager_event_type_e event_type,
+            package_manager_event_state_e event_state,
+            int progress,
+            package_manager_error_e error,
+            void *user_data);
 
 /**
  * @brief Creates a package manager handle.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/packagemanager.info
+ * @remarks You must release @a manager using package_manager_destroy().
  *
- * @remarks The @a manager must be released with package_manager_destroy() by you
- * @param [out] manager A package manager handle to be newly created on success
- * @return 0 on success, otherwise a negative error value.
- * @retval #PACKAGE_MANAGER_ERROR_NONE Successful
+ * @param[out] manager The package manager handle that is newly created on success
+ *
+ * @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
+ * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY     Out of memory
+ * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR          Internal I/O error
+ * @retval #PACKAGE_MANAGER_ERROR_PERMISSION_DENIED Permission denied
  * @see package_manager_destroy()
  */
 int package_manager_create(package_manager_h * manager);
 
 /**
  * @brief Destroys the package manager handle.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
- * @param [in] manager The package manager handle
- * @return 0 on success, otherwise a negative error value.
- * @retval #PACKAGE_MANAGER_ERROR_NONE Successful
+ * @param[in] manager The package manager 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_manager_create()
  */
 int package_manager_destroy(package_manager_h manager);
 
 /**
+ * @brief Sets the event status of the package when the package is installed, uninstalled or updated.
+ *        You can combine multiple status using OR operation which you want to listen.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ * @param [in] manager     The package manager handle
+ * @param [in] status_type The status 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_IO_ERROR          Internal I/O error
+ *
+ * @see package_manager_status_type_e
+ * @see package_manager_set_event_cb()
+ */
+int package_manager_set_event_status(package_manager_h manager, int status_type);
+
+/**
  * @brief Registers a callback function to be invoked when the package is installed, uninstalled or updated.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/packagemanager.info
+ * @param[in] manager    The package manager handle
+ * @param[in] callback   The callback function to be registered
+ * @param[in] user_data  The user data to be passed to the callback function
  *
- * @param [in] manager The package manager handle
- * @param [in] callback The callback function to register
- * @param [in] user_data The user data to be passed to the callback function
- * @return 0 on success, otherwise a negative error value.
- * @retval #PACKAGE_MANAGER_ERROR_NONE Successful
+ * @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_PERMISSION_DENIED Permission denied
  * @post package_manager_event_cb() will be invoked.
+ *
+ * @see package_manager_set_event_status()
  * @see package_manager_event_cb()
  * @see package_manager_unset_event_cb()
-*/
+ */
 int package_manager_set_event_cb(package_manager_h manager,
-                                package_manager_event_cb callback,
-                                void *user_data);
+                 package_manager_event_cb callback,
+                 void *user_data);
 
 /**
  * @brief Unregisters the callback function.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
- * @param [in] manager The package manager handle
- * @return 0 on success, otherwise a negative error value.
- * @retval #PACKAGE_MANAGER_ERROR_NONE Successful
+ * @param[in] manager The package manager 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_manager_event_cb()
  * @see package_manager_set_event_cb()
-*/
+ */
 int package_manager_unset_event_cb(package_manager_h manager);
 
+/**
+ * @brief Called to retrieve all packages.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ * @param[in] package_info The package information
+ * @param[in] user_data    The user data passed from the foreach function
+ *
+ * @return  @c true to continue with the next iteration of the loop,
+ *          otherwise @c false to break out of the loop
+ *
+ * @see package_manager_foreach_package_info()
+ */
+typedef bool (*package_manager_package_info_cb) (
+            package_info_h package_info,
+            void *user_data);
+
+/**
+ * @brief Retrieves all package information of installed packages.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/packagemanager.info
+ * @param[in] callback  The callback function to be invoked
+ * @param[in] user_data The user data to be passed to the callback function
+ *
+ * @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_PERMISSION_DENIED Permission denied
+ * @post This function invokes package_manager_package_info_cb() repeatedly for each package information.
+ *
+ * @see package_manager_package_info_cb()
+ */
+int package_manager_foreach_package_info(package_manager_package_info_cb callback,
+                    void *user_data);
+
+/**
+ * @brief Gets the package ID for the given app ID.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/packagemanager.info
+ * @param[in]  app_id     The ID of the application
+ * @param[out] package_id The ID 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_PERMISSION_DENIED Permission denied
+ */
+int package_manager_get_package_id_by_app_id(const char *app_id, char **package_id);
+
+/**
+ * @brief Gets the package information for the given package.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/packagemanager.info
+ * @remarks You must release @a package_info using package_info_destroy().
+ *
+ * @param[in]  package_id   The ID of the package
+ * @param[out] package_info The package information for the given package ID
+ *
+ * @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 Database error occurred
+ * @retval #PACKAGE_MANAGER_ERROR_PERMISSION_DENIED Permission denied
+ */
+int package_manager_get_package_info(const char *package_id, package_info_h *package_info);
+
+
+/**
+ * @brief Compares whether two package certifications are matched.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ * @param[in]  lhs_package_id The first package ID to compare
+ * @param[in]  rhs_package_id The second package ID to compare
+ * @param[out] compare_result @c 0 if the certification information are matched,
+ *                            otherwise the compared result
+ *
+ * @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          Database error occurred
+ */
+int package_manager_compare_package_cert_info(const char *lhs_package_id, const char *rhs_package_id, package_manager_compare_result_type_e *compare_result);
+
+/**
+ * @brief Compares whether two app certifications are matched.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ * @param[in]  lhs_app_id     The first app ID to compare
+ * @param[in]  rhs_app_id     The second app ID to compare
+ * @param[out] compare_result @c 0 if the certification information are matched,
+ *                            otherwise the compared result
+ *
+ * @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          Database error occurred
+ */
+ int package_manager_compare_app_cert_info(const char *lhs_app_id, const char *rhs_app_id, package_manager_compare_result_type_e *compare_result);
+
+/**
+ * @brief Checks whether the package is preloaded by @a app_id.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/packagemanager.info
+ * @param[in]  app_id   The ID of the application
+ * @param[out] preload  The preload info 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
+ * @retval #PACKAGE_MANAGER_ERROR_PERMISSION_DENIED Permission denied
+ */
+int package_manager_is_preload_package_by_app_id(const char *app_id, bool *preload);
+
+/**
+ * @brief Gets the package permission type by @a app_id.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/packagemanager.info
+ * @param[in]  app_id          The ID of the application
+ * @param[out] permission_type The package permission type
+ *
+ * @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
+ * @retval #PACKAGE_MANAGER_ERROR_PERMISSION_DENIED Permission denied
+ */
+int package_manager_get_permission_type(const char *app_id, package_manager_permission_type_e *permission_type);
+
+/**
+ * @internal
+ * @brief  Clears the application's internal and external cache directory.
+ * @details All files stored in the cache directory of the application specified with the
+ *          package ID are removed.
+ *
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ * @privlevel platform
+ * @privilege %http://tizen.org/privilege/packagemanager.admin
+ *
+ * @param[in] package_id  The package ID
+ *
+ * @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_NO_SUCH_PACKAGE   No such package
+ * @retval #PACKAGE_MANAGER_ERROR_PERMISSION_DENIED Permission denied
+ * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY     Out of memory
+ * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR          I/O error
+ * @retval #PACKAGE_MANAGER_ERROR_SYSTEM_ERROR      Severe system error
+ */
+int package_manager_clear_cache_dir(const char *package_id);
+
+/**
+ * @internal
+ * @brief  Clears all applications' internal and external cache directory.
+ * @details All files stored in the cache directory of each application are removed.
+ *
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ * @privlevel platform
+ * @privilege %http://tizen.org/privilege/packagemanager.admin
+ *
+ * @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_NO_SUCH_PACKAGE   No such package
+ * @retval #PACKAGE_MANAGER_ERROR_PERMISSION_DENIED Permission denied
+ * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY     Out of memory
+ * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR          I/O error
+ * @retval #PACKAGE_MANAGER_ERROR_SYSTEM_ERROR      Severe system error
+ */
+int package_manager_clear_all_cache_dir(void);
+
+/**
+ * @internal
+ * @brief  The structure type for data structure for the package size information.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ */
+typedef struct package_size_info
+{
+    long long data_size;            /**< The size of files in the application's internal data directory */
+    long long cache_size;           /**< The size of files in the application's internal cache directory */
+    long long app_size;             /**< The size of files in the application's internal bin, lib, and
+                                         res directories */
+    long long external_data_size;   /**< The size of files in the application's external data directory */
+    long long external_cache_size;  /**< The size of files in the application's external cache directory */
+    long long external_app_size;    /**< The size of files in the application's res directory */
+} package_size_info_t;
+
+/**
+ * @internal
+ * @brief  Called when the package size information is obtained.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ * @param[in]  package_id  The package ID
+ * @param[in]  size_info   The pointer to the structure including the package size information
+ * @param[in]  user_data   The user data to be passed to the callback function
+ */
+typedef void (*package_manager_size_info_receive_cb)(const char *package_id, const package_size_info_t *size_info, void *user_data);
+
+/**
+ * @internal
+ * @brief  Called when the total package size information is obtained.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ * @param[in]  size_info  The pointer to the structure including the package size information
+ * @param[in]  user_data  The user data to be passed to the callback function
+ */
+typedef void (*package_manager_total_size_info_receive_cb)(const package_size_info_t *size_info, void *user_data);
+
+/**
+ * @internal
+ * @brief  Gets the package size information.
+ * @details The package size info is asynchronously obtained by the callback function.
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/packagemanager.info
+ *
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ * @param[in]  package_id  The package ID
+ * @param[in]  callback    The asynchronous callback function to get the package size information
+ * @param[in]  user_data   The user data to be passed to the callback function
+ *
+ * @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_NO_SUCH_PACKAGE   No such package
+ * @retval #PACKAGE_MANAGER_ERROR_PERMISSION_DENIED Permision denied
+ * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY     Out of memory
+ * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR          I/O error
+ * @retval #PACKAGE_MANAGER_ERROR_SYSTEM_ERROR      Severe system error
+ */
+int package_manager_get_package_size_info(const char *package_id, package_manager_size_info_receive_cb callback, void *user_data);
+
+/**
+ * @internal
+ * @brief  Gets the total package size information.
+ * @details The total package size info is asynchronously obtained by the callback function.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/packagemanager.info
+ *
+ * @param [in] callback        The asynchronous callback function to get the total package size information
+ * @param [in] user_data       The user data to be passed to the callback function
+ *
+ * @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_NO_SUCH_PACKAGE   No such package
+ * @retval #PACKAGE_MANAGER_ERROR_PERMISSION_DENIED Permission denied
+ * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY     Out of memory
+ * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR          I/O error
+ * @retval #PACKAGE_MANAGER_ERROR_SYSTEM_ERROR      Severe system error
+ */
+int package_manager_get_total_package_size_info(package_manager_total_size_info_receive_cb callback, void *user_data);
+
+/**
+ * @brief Creates the package information filter handle from db.
+ * @details All filter properties will be ANDed.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/packagemanager.info
+ *
+ * @param[out] handle Pointer to the package info filter 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
+ * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR I/O error
+ * @post package_manager_filter_destroy()
+ * @see package_manager_filter_add_bool()
+ * @see package_manager_filter_foreach_pkginfo()
+ */
+int package_manager_filter_create(package_manager_filter_h *handle);
+
+/**
+ * @brief This API destroys the package information filter handle freeing up all the resources
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ * @param[in] handle Pointer to the package info filter 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
+ * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR I/O error
+ * @pre package_manager_filter_create()
+ * @see package_manager_filter_count()
+ * @see package_manager_filter_foreach_package_info()
+ */
+int package_manager_filter_destroy(package_manager_filter_h handle);
+
+/**
+ * @brief This API adds a boolean filter property to the filter handle
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ * @param[in] handle Pointer to the package info filter handle.
+ * @param[in] property boolean property name.
+ * @param[in] value value corresponding to the property.
+ *
+ * @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_IO_ERROR I/O error
+ * @pre package_manager_filter_create()
+ * @post package_manager_filter_destroy()
+ * @see package_manager_filter_count()
+ * @see package_manager_filter_foreach_package_info()
+ */
+int package_manager_filter_add_bool(package_manager_filter_h handle,
+               const char *property, const bool value);
+
+/**
+ * @brief This API counts the package that satisfy the filter conditions
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/packagemanager.info
+ *
+ * @param[in] handle Pointer to the package info filter handle.
+ * @param[out] count Pointer to store the count value.
+ *
+ * @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_IO_ERROR I/O error
+ * @pre package_manager_filter_create()
+ * @post package_manager_filter_destroy()
+ * @see package_manager_filter_foreach_package_info()
+ */
+int package_manager_filter_count(package_manager_filter_h handle, int *count);
+
+/**
+ * @brief This API executes the user supplied callback function for each package that satisfy the filter conditions
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/packagemanager.info
+ *
+ * @param[in] handle Pointer to the package info filter handle.
+ * @param[in] callback callback function.
+ * @param[in] user_data user data to be passed to the callback function
+ *
+ * @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_IO_ERROR I/O error
+ * @pre package_manager_filter_create()
+ * @post package_manager_filter_destroy()
+ * @post This function invokes package_manager_package_info_cb() repeatedly for each package information.
+ * @see package_manager_package_info_cb()
+ * @see package_manager_filter_count()
+ */
+int package_manager_filter_foreach_package_info(package_manager_filter_h handle,
+               package_manager_package_info_cb callback, void *user_data);
+
+/**
+* @}
+*/
 
 #ifdef __cplusplus
 }
diff --git a/include/package_manager_internal.h b/include/package_manager_internal.h
new file mode 100755 (executable)
index 0000000..4992139
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2011 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_MANAGER_INTERNAL_H__
+#define __TIZEN_APPFW_PACKAGE_MANAGER_INTERNAL_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum {
+       PRIVILEGE_PACKAGE_MANAGER_INFO,
+       PRIVILEGE_PACKAGE_MANAGER_ADMIN
+} privilege_type;
+
+int check_privilege(privilege_type type);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __TIZEN_APPFW_PACKAGE_MANAGER_INTERNAL_H__ */
index 568d7b5..ab8ed41 100755 (executable)
@@ -1,19 +1,18 @@
-#sbs-git:slp/api/package-manager capi-appfw-package-manager 0.1.0 76739af2bfbeb46dc9db0cb3e044f880ddcb9440
 Name:       capi-appfw-package-manager
 Summary:    Package Manager API
-Version: 0.0.3
+Version:       0.0.49
 Release:    1
-Group:      TO_BE/FILLED_IN
-License:    TO BE FILLED IN
+Group:      API
+License:    Apache-2.0
 Source0:    %{name}-%{version}.tar.gz
 BuildRequires:  cmake
 BuildRequires:  pkgconfig(dlog)
 BuildRequires:  pkgconfig(pkgmgr)
+BuildRequires:  pkgconfig(pkgmgr-info)
 BuildRequires:  pkgconfig(ail)
-BuildRequires:  pkgconfig(pkgmgr)
+BuildRequires: pkgconfig(vconf)
+BuildRequires: pkgconfig(aul)
 BuildRequires:  pkgconfig(capi-base-common)
-Requires(post): /sbin/ldconfig
-Requires(postun): /sbin/ldconfig
 
 %description
 The Package Manager API provides functions to install, uninstall the package,
@@ -21,7 +20,7 @@ and also privides event listening function.
 
 %package devel
 Summary:  Package Manager API (Development)
-Group:    TO_BE/FILLED_IN
+Group:    API
 Requires: %{name} = %{version}-%{release}
 
 %description devel
@@ -35,7 +34,7 @@ and also privides event listening function. (DEV)
 
 %build
 MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'`
-cmake . -DCMAKE_INSTALL_PREFIX=/usr -DFULLVER=%{version} -DMAJORVER=${MAJORVER}
+%cmake . -DFULLVER=%{version} -DMAJORVER=${MAJORVER}
 
 make %{?jobs:-j%jobs}
 
@@ -43,16 +42,22 @@ make %{?jobs:-j%jobs}
 rm -rf %{buildroot}
 %make_install
 
+mkdir -p %{buildroot}/usr/share/license
+cp LICENSE %{buildroot}/usr/share/license/%{name}
+
 %post -p /sbin/ldconfig
 
 %postun -p /sbin/ldconfig
 
 
 %files
+%manifest capi-appfw-package-manager.manifest
 %{_libdir}/libcapi-appfw-package-manager.so.*
+%{_bindir}/pkgmgr_tool
+/usr/share/license/%{name}
 
 %files devel
-%{_includedir}/appfw/package_manager.h
+%{_includedir}/appfw/*.h
 %{_libdir}/libcapi-appfw-package-manager.so
 %{_libdir}/pkgconfig/*.pc
 
diff --git a/src/package_info.c b/src/package_info.c
new file mode 100755 (executable)
index 0000000..890597d
--- /dev/null
@@ -0,0 +1,647 @@
+/*
+ * Copyright (c) 2011 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <package-manager.h>
+#include <pkgmgr-info.h>
+#include <dlog.h>
+
+#include <package_info.h>
+#include <package_manager.h>
+
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#endif
+
+#define LOG_TAG "CAPI_APPFW_PACKAGE_MANAGER"
+
+struct package_info_s {
+       char *package;
+       pkgmgrinfo_pkginfo_h pkgmgrinfo_pkginfo;
+};
+
+struct package_cert_info_s {
+       char *package;
+       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 _foreach_app_context_{
+       package_info_app_cb callback;
+       void *user_data;
+} foreach_app_context_s;
+
+
+int package_info_create(const char *package,  package_info_h *package_info)
+{
+       package_info_h package_info_created;
+       pkgmgrinfo_pkginfo_h pkgmgrinfo_pkginfo;
+
+       if (package == NULL || package_info == NULL)
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       if (pkgmgrinfo_pkginfo_get_pkginfo(package, &pkgmgrinfo_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)
+       {
+               pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_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)
+       {
+               pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
+               free(package_info_created);
+               return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
+       }
+
+       package_info_created->pkgmgrinfo_pkginfo = pkgmgrinfo_pkginfo;
+
+       *package_info = package_info_created;
+
+       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 pkgmgrinfo_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;
+       }
+
+       pkgmgrinfo_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);
+       }
+
+       ret = pkgmgrinfo_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;
+}
+
+int package_info_filter_foreach_package_info(pkgmgrinfo_pkginfo_filter_h handle, 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 ((handle == NULL) || (callback == NULL))
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       ret = pkgmgrinfo_pkginfo_filter_foreach_pkginfo(handle, package_info_foreach_package_info_cb, &foreach_pkg_context);
+       if (ret < 0) {
+               return PACKAGE_MANAGER_ERROR_IO_ERROR;
+       }
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+static int package_info_foreach_app_cb (const pkgmgrinfo_appinfo_h handle, void *user_data)
+{
+       char *appid = NULL;
+       pkgmgr_app_component comp;
+       foreach_app_context_s *foreach_app_context = user_data;
+       int ret = 0;
+
+       if (handle == NULL || foreach_app_context == NULL)
+       {
+               package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+               return PKGMGR_R_EINVAL;
+       }
+
+       ret = pkgmgrinfo_appinfo_get_appid(handle, &appid);
+       if (ret < 0) {
+               return PKGMGR_R_ERROR;
+       }
+       ret = pkgmgrinfo_appinfo_get_component(handle, &comp);
+       if (ret < 0) {
+               return PKGMGR_R_ERROR;
+       }
+
+       ret = foreach_app_context->callback(comp, appid, foreach_app_context->user_data);
+       if (!ret)
+       {
+               package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+               return PKGMGR_R_ERROR;
+       }
+
+       return PKGMGR_R_OK;
+}
+
+
+
+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,
+       };
+       pkgmgrinfo_pkginfo_h pkgmgrinfo_pkginfo;
+       int ret = 0;
+
+       if (package_info == NULL || callback == NULL)
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       if (pkgmgrinfo_pkginfo_get_pkginfo(package_info->package, &pkgmgrinfo_pkginfo) != PKGMGR_R_OK)
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
+       }
+       if (comp_type == PACKAGE_INFO_ALLAPP)
+               ret = pkgmgrinfo_appinfo_get_list(pkgmgrinfo_pkginfo, PM_ALL_APP, package_info_foreach_app_cb, &foreach_app_context);
+       if (comp_type == PACKAGE_INFO_UIAPP)
+               ret = pkgmgrinfo_appinfo_get_list(pkgmgrinfo_pkginfo, PM_UI_APP, package_info_foreach_app_cb, &foreach_app_context);
+       if (comp_type == PACKAGE_INFO_SERVICEAPP)
+               ret = pkgmgrinfo_appinfo_get_list(pkgmgrinfo_pkginfo, PM_SVC_APP, package_info_foreach_app_cb, &foreach_app_context);
+
+       return ret;
+}
+
+
+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);
+
+       pkgmgrinfo_pkginfo_destroy_pkginfo(package_info->pkgmgrinfo_pkginfo);
+
+       free(package_info);
+
+       package_info = NULL;
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+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)
+{
+       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 (pkgmgrinfo_pkginfo_get_label(package_info->pkgmgrinfo_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+       }
+
+       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;
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+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 (pkgmgrinfo_pkginfo_get_icon(package_info->pkgmgrinfo_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+       }
+
+       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;
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+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 (pkgmgrinfo_pkginfo_get_version(package_info->pkgmgrinfo_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+       }
+
+       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;
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+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 (pkgmgrinfo_pkginfo_get_type(package_info->pkgmgrinfo_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+       }
+
+       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;
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+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;
+
+       if (package_info == NULL || storage == NULL)
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       ret = pkgmgrinfo_pkginfo_get_installed_storage(package_info->pkgmgrinfo_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)
+               *storage = PACKAGE_INFO_INTERNAL_STORAGE;
+       else if (pkg_info_value == PM_EXTERNAL_STORAGE)
+               *storage = PACKAGE_INFO_EXTERNAL_STORAGE;
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+int package_info_get_root_path(package_info_h package_info, char **path)
+{
+       char *pkg_info_value = NULL;
+       char *path_dup = NULL;
+
+       if (package_info == NULL || path == NULL)
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       if (pkgmgrinfo_pkginfo_get_root_path(package_info->pkgmgrinfo_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+       }
+
+       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;
+}
+
+
+/*
+int package_info_get_install_location(package_info_h package_info, package_manager_package_location_e *location)
+{
+       pkgmgr_install_location pkg_info_value = 0;
+
+       if (package_info == NULL || system == NULL)
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       if (pkgmgrinfo_pkginfo_get_install_location(package_info->pkgmgrinfo_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);
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+*/
+
+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 (pkgmgrinfo_pkginfo_is_preload(package_info->pkgmgrinfo_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)
+{
+       bool pkg_info_value = false;
+
+       if (package_info == NULL || removable == NULL)
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       if (pkgmgrinfo_pkginfo_is_removable(package_info->pkgmgrinfo_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)
+{
+       bool pkg_info_value = false;
+
+       if (package_info == NULL || preload == NULL)
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       if (pkgmgrinfo_pkginfo_is_preload(package_info->pkgmgrinfo_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)
+{
+       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)
+{
+       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 = pkgmgrinfo_pkginfo_is_accessible(package_info->pkgmgrinfo_pkginfo, &pkg_info_value);
+       if (ret < 0)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+
+
+       *accessible = pkg_info_value;
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+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)
+{
+       int retval;
+       pkgmgrinfo_certinfo_h handle = NULL;
+       int i = 0;
+       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)
+       {
+               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++)
+       {
+               retval = pkgmgrinfo_pkginfo_get_cert_value(handle, i, &cert_value);
+               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)")) )
+               {
+                       retval = callback(package_info, (package_cert_type_e)i, cert_value, user_data);
+                       if (!retval)
+                               break;
+               }
+
+               cert_value = NULL;
+       }
+
+       pkgmgrinfo_pkginfo_destroy_certinfo(handle);
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+int package_info_foreach_privilege_info(package_info_h package_info, package_info_privilege_info_cb callback, void *user_data)
+{
+       int ret = 0;
+
+       if (package_info == NULL || callback == NULL)
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       ret = pkgmgrinfo_pkginfo_foreach_privilege(package_info->pkgmgrinfo_pkginfo, callback, user_data);
+
+       return ret;
+}
index cf159c4..aee7e2a 100755 (executable)
  */
 
 #include <stdlib.h>
-#include <strings.h>
+#include <string.h>
+#include <glib.h>
 #include <dlog.h>
 
 #include <package-manager.h>
 #include <package_manager.h>
+#include <pkgmgr-info.h>
+
+#include <package_manager_internal.h>
 
 #ifdef LOG_TAG
 #undef LOG_TAG
 #endif
 
-#define LOG_TAG "TIZEN_N_PACKAGE_MANAGER"
+#define LOG_TAG "CAPI_APPFW_PACKAGE_MANAGER"
+
+#define _LOGE(fmt, arg...) LOGE(fmt,##arg)
+#define _LOGD(fmt, arg...) LOGD(fmt, ##arg)
+
+static GHashTable *__cb_table = NULL;
 
 typedef struct _event_info {
        int req_id;
@@ -57,6 +66,10 @@ struct package_manager_request_s {
        void *user_data;
 };
 
+struct package_manager_filter_s {
+       pkgmgrinfo_pkginfo_filter_h pkgmgrinfo_pkginfo_filter;
+};
+
 static int package_manager_request_new_id()
 {
        static int request_handle_id = 0;
@@ -75,29 +88,32 @@ static const char *package_manager_error_to_string(package_manager_error_e
        switch (error) {
        case PACKAGE_MANAGER_ERROR_NONE:
                return "NONE";
-
        case PACKAGE_MANAGER_ERROR_INVALID_PARAMETER:
                return "INVALID_PARAMETER";
-
        case PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY:
                return "OUT_OF_MEMORY";
-
        case PACKAGE_MANAGER_ERROR_IO_ERROR:
                return "IO_ERROR";
+       case PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE:
+               return "NO_SUCH_PACKAGE";
+       case PACKAGE_MANAGER_ERROR_PERMISSION_DENIED:
+               return "PERMISSION_DENIED";
+       case PACKAGE_MANAGER_ERROR_SYSTEM_ERROR:
+               return "SEVERE_SYSTEM_ERROR";
        default:
                return "UNKNOWN";
        }
 }
 
-static int package_manager_error(package_manager_error_e error,
+int package_manager_error(package_manager_error_e error,
                                 const char *function, const char *description)
 {
        if (description) {
-               LOGE("[%s] %s(0x%08x) : %s", function,
+               _LOGE("[%s] %s(0x%08x) : %s", function,
                     package_manager_error_to_string(error), error,
                     description);
        } else {
-               LOGE("[%s] %s(0x%08x)", function,
+               _LOGE("[%s] %s(0x%08x)", function,
                     package_manager_error_to_string(error), error);
        }
 
@@ -141,7 +157,7 @@ int package_manager_request_create(package_manager_request_h * request)
        return PACKAGE_MANAGER_ERROR_NONE;
 }
 
-static int package_manager_client_valiate_handle(package_manager_request_h
+static int package_manager_client_validate_handle(package_manager_request_h
                                                 request)
 {
        if (request == NULL || request->pc == NULL) {
@@ -153,7 +169,23 @@ static int package_manager_client_valiate_handle(package_manager_request_h
 
 int package_manager_client_destroy(package_manager_request_h request)
 {
-       if (package_manager_client_valiate_handle(request)) {
+       if (package_manager_client_validate_handle(request)) {
+               return
+                   package_manager_error
+                   (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
+                    NULL);
+       }
+
+       pkgmgr_client_free(request->pc);
+       request->pc = NULL;
+       free(request);
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+int package_manager_request_destroy(package_manager_request_h request)
+{
+       if (package_manager_client_validate_handle(request)) {
                return
                    package_manager_error
                    (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
@@ -171,7 +203,15 @@ int package_manager_request_set_event_cb(package_manager_request_h request,
                                         package_manager_request_event_cb
                                         callback, void *user_data)
 {
-       if (package_manager_client_valiate_handle(request)) {
+       int retval;
+
+       retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
+       if (retval != PACKAGE_MANAGER_ERROR_NONE) {
+               return package_manager_error(retval, __FUNCTION__,
+                        "failed to allow privilege");
+       }
+
+       if (package_manager_client_validate_handle(request)) {
                return
                    package_manager_error
                    (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
@@ -187,6 +227,10 @@ int package_manager_request_set_event_cb(package_manager_request_h request,
 int package_manager_request_unset_event_cb(package_manager_request_h request)
 {
        // TODO: Please implement this function.
+       if (package_manager_client_validate_handle(request)) {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
        return PACKAGE_MANAGER_ERROR_NONE;
 }
 
@@ -194,7 +238,7 @@ int package_manager_request_unset_event_cb(package_manager_request_h request)
 int package_manager_request_set_type(package_manager_request_h request,
                                     const char *pkg_type)
 {
-       if (package_manager_client_valiate_handle(request)) {
+       if (package_manager_client_validate_handle(request)) {
                return
                    package_manager_error
                    (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
@@ -209,14 +253,14 @@ int package_manager_request_set_type(package_manager_request_h request,
 int package_manager_request_set_mode(package_manager_request_h request,
                                     package_manager_request_mode_e mode)
 {
-       if (package_manager_client_valiate_handle(request)) {
+       if (package_manager_client_validate_handle(request)) {
                return
                    package_manager_error
                    (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
                     NULL);
        }
 
-       if (mode == PACAKGE_MANAGER_REQUEST_MODE_QUIET)
+       if (mode == PACKAGE_MANAGER_REQUEST_MODE_QUIET)
                request->mode = PM_QUIET;
        else
                request->mode = PM_DEFAULT;
@@ -232,11 +276,11 @@ static int package_manager_get_event_type(const char *key,
                return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
 
        if (strcasecmp(key, "install") == 0)
-               *event_type = PACAKGE_MANAGER_EVENT_TYPE_INSTALL;
+               *event_type = PACKAGE_MANAGER_EVENT_TYPE_INSTALL;
        else if (strcasecmp(key, "uninstall") == 0)
-               *event_type = PACAKGE_MANAGER_EVENT_TYPE_UNINSTALL;
-       else if (strcasecmp(key, "undate") == 0)
-               *event_type = PACAKGE_MANAGER_EVENT_TYPE_UPDATE;
+               *event_type = PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL;
+       else if (strcasecmp(key, "update") == 0)
+               *event_type = PACKAGE_MANAGER_EVENT_TYPE_UPDATE;
        else
                return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
 
@@ -253,7 +297,7 @@ static int __add_event_info(event_info ** head, int req_id,
 
        evt_info = (event_info *) calloc(1, sizeof(event_info));
        if (evt_info == NULL) {
-               LOGD("calloc failed");
+               _LOGD("calloc failed");
                return -1;
        }
        evt_info->req_id = req_id;
@@ -284,11 +328,11 @@ static int __find_event_info(event_info ** head, int req_id,
        tmp = *head;
 
        if (tmp == NULL) {
-               LOGE("tmp is NULL");
+               _LOGE("tmp is NULL");
                return -1;
        }
 
-       LOGD("tmp->req_id %d, event_type %d", tmp->req_id, event_type);
+       _LOGD("tmp->req_id %d, event_type %d", tmp->req_id, event_type);
 
        while (tmp) {
                if (tmp->req_id == req_id) {
@@ -314,7 +358,7 @@ static int __update_event_info(event_info ** head, int req_id,
                tmp = *head;
 
                if (tmp == NULL) {
-                       LOGE("tmp is NULL");
+                       _LOGE("tmp is NULL");
                        return -1;
                }
 
@@ -364,7 +408,7 @@ static int request_event_handler(int req_id, const char *pkg_type,
        package_manager_event_type_e event_type = -1;
        package_manager_event_state_e event_state = -1;
 
-       LOGD("request_event_handler is called");
+       _LOGD("request_event_handler is called");
 
        package_manager_request_h request = data;
 
@@ -374,12 +418,12 @@ static int request_event_handler(int req_id, const char *pkg_type,
                        return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
 
                __add_event_info(&(request->head), req_id, event_type,
-                                PACAKGE_MANAGER_EVENT_STATE_STARTED);
+                                PACKAGE_MANAGER_EVENT_STATE_STARTED);
 
                if (request->event_cb)
                        request->event_cb(req_id, pkg_type, pkg_name,
                                          event_type,
-                                         PACAKGE_MANAGER_EVENT_STATE_STARTED,
+                                         PACKAGE_MANAGER_EVENT_STATE_STARTED,
                                          0, PACKAGE_MANAGER_ERROR_NONE, request->user_data);
 
        } else if (strcasecmp(key, "install_percent") == 0
@@ -389,11 +433,11 @@ static int request_event_handler(int req_id, const char *pkg_type,
                     &event_state) == 0) {
                        __update_event_info(&(request->head), req_id,
                                            event_type,
-                                           PACAKGE_MANAGER_EVENT_STATE_PROCESSING);
+                                           PACKAGE_MANAGER_EVENT_STATE_PROCESSING);
                        if (request->event_cb)
                                request->event_cb(req_id, pkg_type, pkg_name,
                                                  event_type,
-                                                 PACAKGE_MANAGER_EVENT_STATE_PROCESSING,
+                                                 PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
                                                  atoi(val),
                                                  PACKAGE_MANAGER_ERROR_NONE,
                                                  request->user_data);
@@ -406,13 +450,13 @@ static int request_event_handler(int req_id, const char *pkg_type,
                             &event_state) == 0) {
                                __update_event_info(&(request->head), req_id,
                                                    event_type,
-                                                   PACAKGE_MANAGER_EVENT_STATE_FAILED);
+                                                   PACKAGE_MANAGER_EVENT_STATE_FAILED);
                        }
 
                        if (request->event_cb)
                                request->event_cb(req_id, pkg_type,
                                                  pkg_name, event_type,
-                                                 PACAKGE_MANAGER_EVENT_STATE_FAILED,
+                                                 PACKAGE_MANAGER_EVENT_STATE_FAILED,
                                                  0,
                                                  PACKAGE_MANAGER_ERROR_NONE,
                                                  request->user_data);
@@ -422,11 +466,11 @@ static int request_event_handler(int req_id, const char *pkg_type,
                if (__find_event_info
                    (&(request->head), req_id, &event_type,
                     &event_state) == 0) {
-                       if (event_state != PACAKGE_MANAGER_EVENT_STATE_FAILED) {
+                       if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
                                if (request->event_cb)
                                        request->event_cb(req_id, pkg_type,
                                                          pkg_name, event_type,
-                                                         PACAKGE_MANAGER_EVENT_STATE_COMPLETED,
+                                                         PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
                                                          100,
                                                          PACKAGE_MANAGER_ERROR_NONE,
                                                          request->user_data);
@@ -436,7 +480,7 @@ static int request_event_handler(int req_id, const char *pkg_type,
                                if (request->event_cb)
                                        request->event_cb(req_id, pkg_type,
                                                          pkg_name, event_type,
-                                                         PACAKGE_MANAGER_EVENT_STATE_FAILED,
+                                                         PACKAGE_MANAGER_EVENT_STATE_FAILED,
                                                          0,
                                                          PACKAGE_MANAGER_ERROR_NONE,
                                                          request->user_data);
@@ -449,6 +493,13 @@ static int request_event_handler(int req_id, const char *pkg_type,
 int package_manager_request_install(package_manager_request_h request,
                                    const char *path, int *id)
 {
+       if (package_manager_client_validate_handle(request)) {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+       if (path == NULL) {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
        int request_id = 0;
        request->pkg_path = path;
        request_id = pkgmgr_client_install(request->pc, request->pkg_type, NULL,
@@ -456,8 +507,19 @@ int package_manager_request_install(package_manager_request_h request,
                                           request->mode, request_event_handler,
                                           request);
 
-       if (request_id < 0)
-               return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
+       if (request_id == PKGMGR_R_EINVAL) {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       } else if (request_id == PKGMGR_R_ENOPKG) {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
+       } else if (request_id == PKGMGR_R_ENOMEM) {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
+       } else if (request_id == PKGMGR_R_EIO) {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+       } else if (request_id == PKGMGR_R_EPRIV) {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
+       } else if (request_id == PKGMGR_R_ESYSTEM || request_id == PKGMGR_R_ECOMM || request_id == PKGMGR_R_ERROR) {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
+       }
 
        *id = request_id;
 
@@ -467,22 +529,78 @@ int package_manager_request_install(package_manager_request_h request,
 int package_manager_request_uninstall(package_manager_request_h request,
                                      const char *name, int *id)
 {
+       if (package_manager_client_validate_handle(request)) {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+       if (name == NULL) {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
        int request_id = 0;
        request->pkg_name = name;
        request_id = pkgmgr_client_uninstall(request->pc, request->pkg_type,
-                                            request->pkg_name, PM_DEFAULT,
+                                            request->pkg_name, request->mode,
                                             request_event_handler, request);
 
-       if (request_id < 0)
-               return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
+       if (request_id == PKGMGR_R_EINVAL) {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       } else if (request_id == PKGMGR_R_ENOPKG) {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
+       } else if (request_id == PKGMGR_R_ENOMEM) {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
+       } else if (request_id == PKGMGR_R_EIO) {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+       } else if (request_id == PKGMGR_R_EPRIV) {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
+       } else if (request_id == PKGMGR_R_ESYSTEM || request_id == PKGMGR_R_ECOMM || request_id == PKGMGR_R_ERROR) {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
+       }
 
        *id = request_id;
 
        return PACKAGE_MANAGER_ERROR_NONE;
 }
 
+int package_manager_request_move(package_manager_request_h request,
+                                   const char *name, package_manager_move_type_e move_type)
+{
+       if (package_manager_client_validate_handle(request)) {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+       if (name == NULL) {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       int ret = 0;
+       request->pkg_name = name;
+       ret = pkgmgr_client_move(request->pc, request->pkg_name, move_type, request_event_handler, request);
+
+       if (ret == PKGMGR_R_EINVAL) {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       } else if (ret == PKGMGR_R_ENOPKG) {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
+       } else if (ret == PKGMGR_R_ENOMEM) {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
+       } else if (ret == PKGMGR_R_EIO) {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+       } else if (ret == PKGMGR_R_EPRIV) {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
+       } else if (ret == PKGMGR_R_ESYSTEM || ret == PKGMGR_R_ECOMM || ret == PKGMGR_R_ERROR) {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
+       }
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
 int package_manager_create(package_manager_h * manager)
 {
+       int ret;
+
+       ret = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
+       if (ret != PACKAGE_MANAGER_ERROR_NONE) {
+               return package_manager_error(ret, __FUNCTION__,
+                        "failed to allow privilege");
+       }
+
        struct package_manager_s *package_manager = NULL;
 
        if (manager == NULL) {
@@ -517,7 +635,7 @@ int package_manager_create(package_manager_h * manager)
        return PACKAGE_MANAGER_ERROR_NONE;
 }
 
-static int package_manager_valiate_handle(package_manager_h manager)
+static int package_manager_validate_handle(package_manager_h manager)
 {
        if (manager == NULL || manager->pc == NULL) {
                return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
@@ -528,7 +646,7 @@ static int package_manager_valiate_handle(package_manager_h manager)
 
 int package_manager_destroy(package_manager_h manager)
 {
-       if (package_manager_valiate_handle(manager)) {
+       if (package_manager_validate_handle(manager)) {
                return
                    package_manager_error
                    (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
@@ -542,6 +660,68 @@ int package_manager_destroy(package_manager_h manager)
        return PACKAGE_MANAGER_ERROR_NONE;
 }
 
+static int __add_event(event_info ** head, int req_id,
+                           package_manager_event_type_e event_type,
+                           package_manager_event_state_e event_state)
+{
+       event_info *evt_info;
+
+       evt_info = (event_info *) calloc(1, sizeof(event_info));
+       if (evt_info == NULL) {
+               _LOGD("calloc failed");
+               return -1;
+       }
+       evt_info->req_id = req_id;
+       evt_info->event_type = event_type;
+       evt_info->next = NULL;
+
+       *head = evt_info;
+
+       return 0;
+}
+
+static int __find_event(event_info ** head, int req_id,
+                            package_manager_event_type_e * event_type,
+                            package_manager_event_state_e * event_state)
+{
+       event_info *tmp;
+
+       tmp = *head;
+
+       if (tmp == NULL) {
+               _LOGE("tmp is NULL");
+               return -1;
+       }
+
+       *event_type = tmp->event_type;
+       return 0;
+}
+
+static int __update_event(event_info ** head, int req_id,
+                              package_manager_event_type_e event_type,
+                              package_manager_event_state_e event_state)
+{
+       package_manager_event_type_e evt_type;
+       package_manager_event_state_e evt_state;
+       event_info *tmp;
+
+       if (__find_event_info(head, req_id, &evt_type, &evt_state) != 0)
+               __add_event_info(head, req_id, event_type, event_state);
+       else {
+               tmp = *head;
+
+               if (tmp == NULL) {
+                       _LOGE("tmp is NULL");
+                       return -1;
+               }
+
+               tmp->event_type = event_type;
+               return 0;
+       }
+
+       return -1;
+}
+
 static int global_event_handler(int req_id, const char *pkg_type,
                                const char *pkg_name, const char *key,
                                const char *val, const void *pmsg, void *data)
@@ -550,7 +730,7 @@ static int global_event_handler(int req_id, const char *pkg_type,
        package_manager_event_type_e event_type = -1;
        package_manager_event_state_e event_state = -1;
 
-       LOGD("global_event_handler is called");
+       _LOGD("global_event_handler is called");
 
        package_manager_h manager = data;
 
@@ -559,27 +739,27 @@ static int global_event_handler(int req_id, const char *pkg_type,
                if (ret != PACKAGE_MANAGER_ERROR_NONE)
                        return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
 
-               __add_event_info(&(manager->head), req_id, event_type,
-                                PACAKGE_MANAGER_EVENT_STATE_STARTED);
+               __add_event(&(manager->head), req_id, event_type,
+                                PACKAGE_MANAGER_EVENT_STATE_STARTED);
 
                if (manager->event_cb)
                        manager->event_cb(pkg_type, pkg_name,
                                          event_type,
-                                         PACAKGE_MANAGER_EVENT_STATE_STARTED,
+                                         PACKAGE_MANAGER_EVENT_STATE_STARTED,
                                          0, PACKAGE_MANAGER_ERROR_NONE, manager->user_data);
 
        } else if (strcasecmp(key, "install_percent") == 0
                   || strcasecmp(key, "progress_percent") == 0) {
-               if (__find_event_info
+               if (__find_event
                    (&(manager->head), req_id, &event_type,
                     &event_state) == 0) {
-                       __update_event_info(&(manager->head), req_id,
+                       __update_event(&(manager->head), req_id,
                                            event_type,
-                                           PACAKGE_MANAGER_EVENT_STATE_PROCESSING);
+                                           PACKAGE_MANAGER_EVENT_STATE_PROCESSING);
                        if (manager->event_cb)
                                manager->event_cb(pkg_type, pkg_name,
                                                  event_type,
-                                                 PACAKGE_MANAGER_EVENT_STATE_PROCESSING,
+                                                 PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
                                                  atoi(val),
                                                  PACKAGE_MANAGER_ERROR_NONE,
                                                  manager->user_data);
@@ -587,32 +767,32 @@ static int global_event_handler(int req_id, const char *pkg_type,
 
        } else if (strcasecmp(key, "error") == 0) {
                if (strcasecmp(key, "0") != 0) {
-                       if (__find_event_info
+                       if (__find_event
                            (&(manager->head), req_id, &event_type,
                             &event_state) == 0) {
-                               __update_event_info(&(manager->head), req_id,
+                               __update_event(&(manager->head), req_id,
                                                    event_type,
-                                                   PACAKGE_MANAGER_EVENT_STATE_FAILED);
+                                                   PACKAGE_MANAGER_EVENT_STATE_FAILED);
                        }
 
                        if (manager->event_cb)
                                manager->event_cb(pkg_type,
                                                  pkg_name, event_type,
-                                                 PACAKGE_MANAGER_EVENT_STATE_FAILED,
+                                                 PACKAGE_MANAGER_EVENT_STATE_FAILED,
                                                  0,
                                                  PACKAGE_MANAGER_ERROR_NONE,
                                                  manager->user_data);
 
                }
        } else if (strcasecmp(key, "end") == 0) {
-               if (__find_event_info
+               if (__find_event
                    (&(manager->head), req_id, &event_type,
                     &event_state) == 0) {
-                       if (event_state != PACAKGE_MANAGER_EVENT_STATE_FAILED) {
+                       if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
                                if (manager->event_cb)
                                        manager->event_cb(pkg_type,
                                                          pkg_name, event_type,
-                                                         PACAKGE_MANAGER_EVENT_STATE_COMPLETED,
+                                                         PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
                                                          100,
                                                          PACKAGE_MANAGER_ERROR_NONE,
                                                          manager->user_data);
@@ -622,7 +802,7 @@ static int global_event_handler(int req_id, const char *pkg_type,
                                if (manager->event_cb)
                                        manager->event_cb(pkg_type,
                                                          pkg_name, event_type,
-                                                         PACAKGE_MANAGER_EVENT_STATE_FAILED,
+                                                         PACKAGE_MANAGER_EVENT_STATE_FAILED,
                                                          0,
                                                          PACKAGE_MANAGER_ERROR_NONE,
                                                          manager->user_data);
@@ -632,12 +812,36 @@ static int global_event_handler(int req_id, const char *pkg_type,
        return PACKAGE_MANAGER_ERROR_NONE;
 }
 
+int package_manager_set_event_status(package_manager_h manager, int status_type)
+{
+       int retval;
+
+       if (manager == NULL){
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       retval = pkgmgrinfo_client_set_status_type(manager->pc, status_type);
+
+       if (retval < 0){
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+       }
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
 int package_manager_set_event_cb(package_manager_h manager,
                                 package_manager_event_cb callback,
                                 void *user_data)
 {
-       int ret = 0;
-       if (package_manager_valiate_handle(manager)) {
+       int retval;
+
+       retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
+       if (retval != PACKAGE_MANAGER_ERROR_NONE) {
+               return package_manager_error(retval, __FUNCTION__,
+                        "failed to allow privilege");
+       }
+
+       if (package_manager_validate_handle(manager)) {
                return
                    package_manager_error
                    (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
@@ -647,9 +851,7 @@ int package_manager_set_event_cb(package_manager_h manager,
        manager->event_cb = callback;
        manager->user_data = user_data;
 
-       ret =
-           pkgmgr_client_listen_status(manager->pc, global_event_handler,
-                                       manager);
+    pkgmgr_client_listen_status(manager->pc, global_event_handler, manager);
 
        return PACKAGE_MANAGER_ERROR_NONE;
 }
@@ -657,5 +859,545 @@ int package_manager_set_event_cb(package_manager_h manager,
 int package_manager_unset_event_cb(package_manager_h manager)
 {
        // TODO: Please implement this function.
+       if (package_manager_validate_handle(manager)) {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+int package_manager_get_package_id_by_app_id(const char *app_id, char **package_id)
+{
+       pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo;
+       int retval;
+       char *pkg_id = NULL;
+       char *pkg_id_dup = NULL;
+
+       retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
+       if (retval != PACKAGE_MANAGER_ERROR_NONE) {
+               return package_manager_error(retval, __FUNCTION__,
+                        "failed to allow privilege");
+       }
+
+       if (app_id == NULL) {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       retval = pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id);
+       if (retval != PMINFO_R_OK)
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       pkg_id_dup = strdup(pkg_id);
+       if (pkg_id_dup == NULL)
+       {
+               pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
+               return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
+       }
+
+       *package_id = pkg_id_dup;
+
+       pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+int package_manager_get_package_info(const char *package_id, package_info_h *package_info)
+{
+       int retval;
+
+       retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
+       if (retval != PACKAGE_MANAGER_ERROR_NONE) {
+               return package_manager_error(retval, __FUNCTION__,
+                        "failed to allow privilege");
+       }
+
+       retval = package_info_get_package_info(package_id, package_info);
+
+       if (retval != PACKAGE_MANAGER_ERROR_NONE)
+       {
+               return package_manager_error(retval, __FUNCTION__, NULL);
+       }
+       else
+       {
+               return PACKAGE_MANAGER_ERROR_NONE;
+       }
+}
+
+int package_manager_foreach_package_info(package_manager_package_info_cb callback,
+                                       void *user_data)
+{
+       int retval;
+
+       retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
+       if (retval != PACKAGE_MANAGER_ERROR_NONE) {
+               return package_manager_error(retval, __FUNCTION__,
+                        "failed to allow privilege");
+       }
+
+       retval = package_info_foreach_package_info(callback, user_data);
+
+       if (retval != PACKAGE_MANAGER_ERROR_NONE)
+       {
+               return package_manager_error(retval, __FUNCTION__, NULL);
+       }
+       else
+       {
+               return PACKAGE_MANAGER_ERROR_NONE;
+       }
+}
+int package_manager_compare_package_cert_info(const char *lhs_package_id, const char *rhs_package_id, package_manager_compare_result_type_e *compare_result)
+{
+       pkgmgrinfo_cert_compare_result_type_e result;
+
+       if (lhs_package_id == NULL || rhs_package_id == NULL || compare_result == NULL)
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       if (pkgmgrinfo_pkginfo_compare_pkg_cert_info(lhs_package_id, rhs_package_id, &result) != PKGMGR_R_OK)
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+       }
+
+       *compare_result = (package_manager_compare_result_type_e)result;
+
        return PACKAGE_MANAGER_ERROR_NONE;
-}
\ No newline at end of file
+}
+
+int package_manager_compare_app_cert_info(const char *lhs_app_id, const char *rhs_app_id, package_manager_compare_result_type_e *compare_result)
+{
+       pkgmgrinfo_cert_compare_result_type_e result;
+
+       if (lhs_app_id == NULL || rhs_app_id == NULL || compare_result == NULL)
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       if (pkgmgrinfo_pkginfo_compare_app_cert_info(lhs_app_id, rhs_app_id, &result) != PKGMGR_R_OK)
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+       }
+
+       *compare_result = (package_manager_compare_result_type_e)result;
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+int package_manager_is_preload_package_by_app_id(const char *app_id, bool *preload)
+{
+       pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo = NULL;
+       pkgmgrinfo_pkginfo_h pkgmgrinfo_pkginfo = NULL;
+
+       int retval =0;
+       char *pkg_id = NULL;
+       bool is_preload = 0;
+
+       retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
+       if (retval != PACKAGE_MANAGER_ERROR_NONE) {
+               return package_manager_error(retval, __FUNCTION__,
+                        "failed to allow privilege");
+       }
+
+       if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
+       }
+
+       retval = pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id);
+       if (retval != PMINFO_R_OK)
+       {
+               pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
+               return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
+       }
+
+       if (pkgmgrinfo_pkginfo_get_pkginfo(pkg_id, &pkgmgrinfo_pkginfo) != PMINFO_R_OK)
+       {
+               pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
+               pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
+               return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
+       }
+
+       if (pkgmgrinfo_pkginfo_is_preload(pkgmgrinfo_pkginfo, &is_preload) != PMINFO_R_OK)
+       {
+               pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
+               pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
+               return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
+       }
+
+       if (is_preload)
+               *preload = 1;
+       else
+               *preload = 0;
+
+       pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
+       pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+int package_manager_get_permission_type(const char *app_id, package_manager_permission_type_e *permission_type)
+{
+       int retval = 0;
+       pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo =NULL;
+       pkgmgrinfo_permission_type permission = 0;
+
+       retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
+       if (retval != PACKAGE_MANAGER_ERROR_NONE) {
+               return package_manager_error(retval, __FUNCTION__,
+                        "failed to allow privilege");
+       }
+
+       if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
+       }
+
+       retval = pkgmgrinfo_appinfo_get_permission_type(pkgmgrinfo_appinfo, &permission);
+       if (retval != PMINFO_R_OK)
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
+       }
+
+       if (permission == PMINFO_PERMISSION_NORMAL)
+               *permission_type = PACKAGE_MANAGER_PERMISSION_NORMAL;
+       else if (permission == PMINFO_PERMISSION_SIGNATURE)
+               *permission_type = PACKAGE_MANAGER_PERMISSION_SIGNATURE;
+       else if (permission == PMINFO_PERMISSION_PRIVILEGE)
+               *permission_type = PACKAGE_MANAGER_PERMISSION_PRIVILEGE;
+       else
+               *permission_type = PACKAGE_MANAGER_PERMISSION_NORMAL;
+
+       pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+int package_manager_clear_cache_dir(const char *package_id)
+{
+       int res = pkgmgr_client_clear_cache_dir(package_id);
+       if (res == PKGMGR_R_EINVAL)
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+       else if (res == PKGMGR_R_ENOPKG)
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
+       }
+       else if (res == PKGMGR_R_ENOMEM)
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
+       }
+       else if (res == PKGMGR_R_EIO)
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+       }
+       else if (res == PKGMGR_R_EPRIV)
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
+       }
+       else if (res == PKGMGR_R_ESYSTEM || res == PKGMGR_R_ECOMM || res == PKGMGR_R_ERROR)
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
+       }
+       else if (res != PKGMGR_R_OK)
+       {
+               _LOGE("Unexpected error");
+               return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
+       }
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+int package_manager_clear_all_cache_dir(void)
+{
+       return package_manager_clear_cache_dir(PKG_CLEAR_ALL_CACHE);
+}
+
+static void __free_data(gpointer data)
+{
+       if (data)
+       {
+               free(data);
+               data = NULL;
+       }
+}
+
+static void __initialize_cb_table(void)
+{
+       __cb_table = g_hash_table_new_full(g_int_hash, g_int_equal, __free_data, NULL);
+}
+
+static void __result_cb(pkgmgr_client *pc, const char *pkgid, const pkg_size_info_t *result, void *user_data)
+{
+       int key = (int *)pc;
+
+       package_manager_size_info_receive_cb callback = g_hash_table_lookup(__cb_table, &key);
+       if (callback == NULL)
+       {
+               _LOGE("callback is null.");
+               g_hash_table_remove(__cb_table, pc);
+               pkgmgr_client_free(pc);
+               return;
+       }
+
+       package_size_info_t size_info;
+       size_info.data_size  = result->data_size;
+       size_info.cache_size = result->cache_size;
+       size_info.app_size   = result->app_size;
+       size_info.external_data_size  = result->ext_data_size;
+       size_info.external_cache_size = result->ext_cache_size;
+       size_info.external_app_size   = result->ext_app_size;
+
+       callback(pkgid, &size_info, user_data);
+
+       g_hash_table_remove(__cb_table, pc);
+       pkgmgr_client_free(pc);
+}
+
+static void __total_result_cb(pkgmgr_client *pc, const pkg_size_info_t *result, void *user_data)
+{
+       int key = (int *)pc;
+
+       package_manager_total_size_info_receive_cb callback = g_hash_table_lookup(__cb_table, &key);
+       if (callback == NULL)
+       {
+               _LOGE("callback is null.");
+               g_hash_table_remove(__cb_table, pc);
+               pkgmgr_client_free(pc);
+               return;
+       }
+
+       package_size_info_t size_info;
+       size_info.data_size  = result->data_size;
+       size_info.cache_size = result->cache_size;
+       size_info.app_size   = result->app_size;
+       size_info.external_data_size  = result->ext_data_size;
+       size_info.external_cache_size = result->ext_cache_size;
+       size_info.external_app_size   = result->ext_app_size;
+
+       callback(&size_info, user_data);
+
+       g_hash_table_remove(__cb_table, pc);
+       pkgmgr_client_free(pc);
+}
+
+int package_manager_get_package_size_info(const char *package_id, package_manager_size_info_receive_cb callback, void *user_data)
+{
+       if (package_id == NULL || callback == NULL)
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       if (__cb_table == NULL)
+       {
+               __initialize_cb_table();
+       }
+
+       pkgmgr_client *pc = pkgmgr_client_new(PC_REQUEST);
+       if (pc == NULL)
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
+       }
+
+       int res = 0;
+       if (strcmp(package_id, PKG_SIZE_INFO_TOTAL) != 0)
+       {
+               res = pkgmgr_client_get_package_size_info(pc, package_id, __result_cb, user_data);
+       }
+       else
+       {
+               res = pkgmgr_client_get_total_package_size_info(pc, __total_result_cb, user_data);
+       }
+
+       if (res == PKGMGR_R_EINVAL)
+       {
+               pkgmgr_client_free(pc);
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+       else if (res == PKGMGR_R_ENOPKG)
+       {
+               pkgmgr_client_free(pc);
+               return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
+       }
+       else if (res == PKGMGR_R_ENOMEM)
+       {
+               pkgmgr_client_free(pc);
+               return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
+       }
+       else if (res == PKGMGR_R_EIO)
+       {
+               pkgmgr_client_free(pc);
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+       }
+       else if (res == PKGMGR_R_EPRIV)
+       {
+               pkgmgr_client_free(pc);
+               return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
+       }
+       else if (res == PKGMGR_R_ESYSTEM || res == PKGMGR_R_ECOMM || res == PKGMGR_R_ERROR)
+       {
+               pkgmgr_client_free(pc);
+               return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
+       }
+       else if (res != PKGMGR_R_OK)
+       {
+               _LOGE("Unexpected error");
+               pkgmgr_client_free(pc);
+               return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
+       }
+
+       int *key = malloc(sizeof(int));
+       if (key == NULL)
+       {
+               _LOGE("out of memory");
+               pkgmgr_client_free(pc);
+               return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
+       }
+
+       *key = pc;
+       g_hash_table_insert(__cb_table, key, callback);
+
+       _LOGD("Successful");
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+int package_manager_get_total_package_size_info(package_manager_total_size_info_receive_cb callback, void *user_data)
+{
+       return package_manager_get_package_size_info(PKG_SIZE_INFO_TOTAL, callback, user_data);
+}
+
+int package_manager_filter_create(package_manager_filter_h *handle)
+{
+       int retval;
+       package_manager_filter_h created_filter = NULL;
+       pkgmgrinfo_pkginfo_filter_h pkgmgr_filter = NULL;
+
+       retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
+       if (retval != PACKAGE_MANAGER_ERROR_NONE) {
+               return package_manager_error(retval, __FUNCTION__,
+                        "failed to allow privilege");
+       }
+
+       if (handle == NULL)
+       {
+               return
+                   package_manager_error
+                   (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
+                    NULL);
+       }
+
+       retval = pkgmgrinfo_pkginfo_filter_create(&pkgmgr_filter);
+       if (retval != PACKAGE_MANAGER_ERROR_NONE)
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+       }
+
+       created_filter = malloc(sizeof(struct package_manager_filter_s));
+       if (created_filter == NULL)
+       {
+               pkgmgrinfo_pkginfo_filter_destroy(pkgmgr_filter);
+               return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
+       }
+
+       created_filter->pkgmgrinfo_pkginfo_filter = pkgmgr_filter;
+
+       *handle = created_filter;
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+int package_manager_filter_destroy(package_manager_filter_h handle)
+{
+       int retval;
+
+       if (handle == NULL)
+       {
+               return
+                   package_manager_error
+                   (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
+                    NULL);
+       }
+
+       retval = pkgmgrinfo_pkginfo_filter_destroy(handle->pkgmgrinfo_pkginfo_filter);
+       if (retval != PACKAGE_MANAGER_ERROR_NONE)
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+       }
+
+       free(handle);
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+int package_manager_filter_add_bool(package_manager_filter_h handle,
+               const char *property, const bool value)
+{
+       int retval;
+
+       if ((handle == NULL) || (property == NULL))
+       {
+               return
+                   package_manager_error
+                   (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
+                    NULL);
+       }
+
+       retval = pkgmgrinfo_pkginfo_filter_add_bool(handle->pkgmgrinfo_pkginfo_filter, property, value);
+       if (retval != PACKAGE_MANAGER_ERROR_NONE)
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+       }
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+int package_manager_filter_count(package_manager_filter_h handle, int *count)
+{
+       int retval = 0;
+
+       retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
+       if (retval != PACKAGE_MANAGER_ERROR_NONE) {
+               return package_manager_error(retval, __FUNCTION__,
+                        "failed to allow privilege");
+       }
+
+       if ((handle == NULL) || (count == NULL))
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       retval = pkgmgrinfo_pkginfo_filter_count(handle->pkgmgrinfo_pkginfo_filter, count);
+       if (retval < 0)
+       {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+       }
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+int package_manager_filter_foreach_package_info(package_manager_filter_h handle,
+               package_manager_package_info_cb callback, void *user_data)
+{
+       int retval;
+
+       retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
+       if (retval != PACKAGE_MANAGER_ERROR_NONE) {
+               return package_manager_error(retval, __FUNCTION__,
+                        "failed to allow privilege");
+       }
+
+       retval = package_info_filter_foreach_package_info(handle->pkgmgrinfo_pkginfo_filter, callback, user_data);
+
+       if (retval != PACKAGE_MANAGER_ERROR_NONE)
+       {
+               return package_manager_error(retval, __FUNCTION__, NULL);
+       }
+       else
+       {
+               return PACKAGE_MANAGER_ERROR_NONE;
+       }
+}
diff --git a/src/package_manager_internal.c b/src/package_manager_internal.c
new file mode 100755 (executable)
index 0000000..b7b08c3
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ * Copyright (c) 2011 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 <package_manager.h>
+#include <package_manager_internal.h>
+#include <dlog.h>
+
+#include <sys/smack.h>
+#include <sys/types.h>
+#include <fcntl.h>
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#endif
+
+#define LOG_TAG "CAPI_APPFW_PACKAGE_MANAGER"
+
+#define _LOGE(fmt, arg...) LOGE(fmt,##arg)
+#define _LOGD(fmt, arg...) LOGD(fmt, ##arg)
+
+int check_privilege(privilege_type type)
+{
+       int fd = 0;
+       int ret = 0;
+       char subject_label[SMACK_LABEL_LEN + 1] = "";
+
+       fd = open("/proc/self/attr/current", O_RDONLY);
+       if (fd < 0) {
+               _LOGE("open [%d] failed!", errno);
+               return PACKAGE_MANAGER_ERROR_IO_ERROR;
+       }
+
+       ret = read(fd, subject_label, SMACK_LABEL_LEN);
+       if (ret < 0) {
+               _LOGE("read [%d] failed!", errno);
+               close(fd);
+               return PACKAGE_MANAGER_ERROR_IO_ERROR;
+       }
+
+       close(fd);
+
+       _LOGD("subject_label : %s", subject_label);
+
+       if (type == PRIVILEGE_PACKAGE_MANAGER_INFO) {
+               ret = smack_have_access(subject_label, "pkgmgr::info", "r");
+               if (ret == -1) {
+                       _LOGE("smack_have_access() fail");
+                       return PACKAGE_MANAGER_ERROR_IO_ERROR;
+               } else if (ret == 0) {
+                       _LOGD("permission denied");
+                       return PACKAGE_MANAGER_ERROR_PERMISSION_DENIED;
+               }
+
+               ret = smack_have_access(subject_label, "pkgmgr::db", "rlx");
+               if (ret == -1) {
+                       _LOGE("smack_have_access() fail");
+                       return PACKAGE_MANAGER_ERROR_IO_ERROR;
+               } else if (ret == 0) {
+                       _LOGD("permission denied");
+                       return PACKAGE_MANAGER_ERROR_PERMISSION_DENIED;
+               }
+
+               ret = smack_have_access(subject_label, "ail::db", "rlx");
+               if (ret == 1) {
+                       _LOGD("permission allowed");
+                       return PACKAGE_MANAGER_ERROR_NONE;
+               } else if (ret == -1) {
+                       _LOGE("smack_have_access() fail");
+                       return PACKAGE_MANAGER_ERROR_IO_ERROR;
+               } else if (ret == 0) {
+                       _LOGD("permission denied");
+                       return PACKAGE_MANAGER_ERROR_PERMISSION_DENIED;
+               }
+       } else if (type == PRIVILEGE_PACKAGE_MANAGER_ADMIN) {
+               ret = smack_have_access(subject_label, "pkgmgr::svc", "rwx");
+               if (ret == 1) {
+                       _LOGD("permission allowed");
+                       return PACKAGE_MANAGER_ERROR_NONE;
+               } else if (ret == -1) {
+                       _LOGE("smack_have_access() fail");
+                       return PACKAGE_MANAGER_ERROR_IO_ERROR;
+               } else if (ret == 0) {
+                       _LOGD("permission denied");
+                       return PACKAGE_MANAGER_ERROR_PERMISSION_DENIED;
+               }
+       }
+
+       return PACKAGE_MANAGER_ERROR_IO_ERROR;
+}
diff --git a/tool/CMakeLists.txt b/tool/CMakeLists.txt
new file mode 100644 (file)
index 0000000..2298a42
--- /dev/null
@@ -0,0 +1,23 @@
+# Test executables
+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${TEST_CFLAGS}")
+
+#Verbose
+INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include)
+
+INCLUDE(FindPkgConfig)
+pkg_check_modules(pkgs_test REQUIRED)
+FOREACH(flag ${pkgs_test_CFLAGS})
+       SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include)
+SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -Wl,-zdefs -pie" )
+SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fvisibility=hidden")
+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
+SET(CMAKE_C_FLAGS_DEBUG "-O0 -g -fPIE")
+SET(CMAKE_C_FLAGS_RELEASE "-O2 -fPIE")
+
+ADD_EXECUTABLE(pkgmgr_tool main.c)
+TARGET_LINK_LIBRARIES(pkgmgr_tool capi-appfw-package-manager ${pkgs_test_LDFLAGS})
+INSTALL(TARGETS pkgmgr_tool DESTINATION bin)
+
diff --git a/tool/main.c b/tool/main.c
new file mode 100755 (executable)
index 0000000..ec12a0b
--- /dev/null
@@ -0,0 +1,151 @@
+/*
+ * package-manager
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>,
+ * Jaeho Lee <jaeho81.lee@samsung.com>, Shobhit Srivastava <shobhit.s@samsung.com>
+ *
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <fcntl.h>
+
+#include <package_manager.h>
+
+
+
+static void _print_help(const char *cmd)
+{
+       fprintf(stderr, "Usage:\n");
+       fprintf(stderr, "\n");
+       fprintf(stderr, "[Get packageinfo value]\n");
+       fprintf(stderr, "    %s <package>\n", cmd);
+       fprintf(stderr, "\n");
+       fprintf(stderr, "Ex) %s org.tizen.memo\n", cmd);
+       fprintf(stderr, "\n");
+}
+
+
+static bool _cert_info_cb(package_info_h handle, package_cert_type_e cert_type,
+                                               const char *cert_value, void *user_data)
+{
+       fprintf(stderr, "cert_info[%d] \t= [%s]\n", cert_type, cert_value);
+
+       return true;
+}
+
+static int _get_packageinfo(const char *package)
+{
+       package_info_h package_info;
+       int ret;
+       char *pkg = NULL;
+       char *label = NULL;
+       char *icon = NULL;
+       char *version = NULL;
+       char *type = NULL;
+       package_info_installed_storage_type_e storage;
+       bool system;
+       bool removable;
+       bool preload;
+
+
+       ret = package_manager_get_package_info(package, &package_info);
+       if (ret != PACKAGE_MANAGER_ERROR_NONE) {
+               return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
+       }
+
+       package_info_get_package(package_info, &pkg);
+       package_info_get_label(package_info, &label);
+       package_info_get_icon(package_info, &icon);
+       package_info_get_version(package_info, &version);
+       package_info_get_type(package_info, &type);
+       package_info_get_installed_storage(package_info, &storage);
+       package_info_is_system_package(package_info, &system);
+       package_info_is_removable_package(package_info, &removable);
+       package_info_is_preload_package(package_info, &preload);
+
+       fprintf(stderr, "pkg \t= [%s]\n", pkg);
+       fprintf(stderr, "label \t= [%s]\n", label);
+       fprintf(stderr, "icon \t= [%s]\n", icon);
+       fprintf(stderr, "version \t= [%s]\n", version);
+       fprintf(stderr, "type \t= [%s]\n", type);
+       fprintf(stderr, "storage \t= [%d]\n", storage);
+       fprintf(stderr, "system \t= [%d]\n", system);
+       fprintf(stderr, "removable \t= [%d]\n", removable);
+       fprintf(stderr, "preload \t= [%d]\n", preload);
+
+       package_info_foreach_cert_info(package_info, _cert_info_cb, NULL);
+
+       free(pkg);
+       free(label);
+       free(icon);
+       free(version);
+       free(type);
+
+       ret = package_info_destroy(package_info);
+       if (ret != PACKAGE_MANAGER_ERROR_NONE) {
+               return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
+       }
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+static int _get_appinfo(const char *appid)
+{
+       int ret = 0;
+       char *package_id = NULL;
+       ret = package_manager_get_package_id_by_app_id(appid, &package_id);
+       if (ret < 0)
+               fprintf(stderr, "package_manager_get_package_id_by_app_id fail \n");
+
+       fprintf(stderr, "app_id \t= [%s]\n", appid);
+       fprintf(stderr, "package_id \t= [%s]\n", package_id);
+
+       if (package_id)
+               free(package_id);
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+int main(int argc, char** argv)
+{
+       int ret = PACKAGE_MANAGER_ERROR_NONE;
+
+       if (2 == argc) {
+               ret = _get_packageinfo(argv[1]);
+       } else if (3 == argc) {
+               ret = _get_appinfo(argv[1]);
+       }
+
+       else {
+               _print_help(argv[0]);
+               return EXIT_FAILURE;
+       }
+
+       if (ret != PACKAGE_MANAGER_ERROR_NONE) {
+               fprintf(stderr, "There are some problems\n");
+       }
+
+       return EXIT_SUCCESS;
+}
+
+