tizen 2.4 release accepted/tizen_2.4_mobile accepted/tizen/2.4/mobile/20151029.034544 submit/tizen_2.4/20151028.063640 tizen_2.4_mobile_release
authorjk7744.park <jk7744.park@samsung.com>
Sat, 24 Oct 2015 07:25:17 +0000 (16:25 +0900)
committerjk7744.park <jk7744.park@samsung.com>
Sat, 24 Oct 2015 07:25:17 +0000 (16:25 +0900)
CMakeLists.txt
doc/package_manager_doc.h
include/package_info.h
include/package_manager.h
include/package_manager_internal.h
packaging/capi-appfw-package-manager.spec
src/package_info.c
src/package_manager.c
src/package_manager_internal.c [deleted file]
tool/main.c

index d5349e9..ffdea85 100755 (executable)
@@ -10,7 +10,11 @@ SET(PREFIX ${CMAKE_INSTALL_PREFIX})
 SET(INC_DIR include)
 INCLUDE_DIRECTORIES(${INC_DIR})
 
-SET(requires "capi-base-common dlog vconf aul ail pkgmgr pkgmgr-info")
+IF(_APPFW_FEATURE_EXPANSION_PKG_INSTALL)
+       ADD_DEFINITIONS("-D_APPFW_FEATURE_EXPANSION_PKG_INSTALL")
+ENDIF(_APPFW_FEATURE_EXPANSION_PKG_INSTALL)
+
+SET(requires "capi-base-common dlog vconf aul pkgmgr pkgmgr-info security-privilege-checker")
 SET(pc_requires "capi-base-common")
 
 INCLUDE(FindPkgConfig)
@@ -19,7 +23,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")
+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIC -Wall -Wextra -Wshadow")
 SET(CMAKE_C_FLAGS_DEBUG "-O0 -g")
 
 IF("${ARCH}" STREQUAL "arm")
index 25a7f62..b641553 100755 (executable)
  *
  */
 
+/**
+ * @ingroup CAPI_PACKAGE_MANAGER_MODULE
+ * @defgroup CAPI_PACKAGE_REQUEST_MODULE Package Manager Request
+ * @brief Package Manager Request API. It is responsible for installing, uninstalling, and moving packages, and storing their information.
+ *
+ * @section CAPI_PACKAGE_REQUEST_MODULE_HEADER Required Header
+ *   \#include <package_manager.h>
+ *
+ * @section CAPI_PACKAGE_REQUEST_MODULE_OVERVIEW Overview
+ * The Package Manager API provides functions to install and uninstall the package, and also provides 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() methods are used to
+ * asynchronously uninstall a package. The callback function is called when the progress of the request changes.
+ * Use package_manager_request_event_cb() to listen to package installation related events.
+ */
+
 #endif /* __TIZEN_PACKAGE_MANAGER_DOC_H__ */
 
 
index b21f926..8d7c44e 100755 (executable)
@@ -293,6 +293,25 @@ int package_info_get_installed_storage(package_info_h package_info, package_info
 int package_info_get_root_path(package_info_h package_info, char **path);
 
 /**
+ * @platform
+ * @brief Gets the name of the TEP(Tizen Expansion Package).
+ * @since_tizen 2.4
+ * @privlevel platform
+ * @privilege %http://tizen.org/privilege/packagemanager.admin
+ * @remarks name must be released using free().
+ * @param[in] package_info The package information
+ * @param[out] name The name of the tep
+ * @return 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 IO error
+ * @retval #PACKAGE_MANAGER_ERROR_SYSTEM_ERROR          Severe system error
+ * @retval #PACKAGE_MANAGER_ERROR_PERMISSION_DENIED Permission denied
+ */
+int package_info_get_tep_name (package_info_h package_info, char **name);
+
+/**
  * @brief Checks whether the package is system package.
  * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
index 846017f..b945b60 100755 (executable)
@@ -100,16 +100,6 @@ typedef enum {
 } package_manager_event_state_e;
 
 /**
- * @internal
- * @brief Enumeration for request mode.
- * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
- */
-typedef enum {
-    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 Enumeration for move type.
  * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  */
@@ -168,217 +158,6 @@ typedef struct package_manager_s *package_manager_h;
 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()
- *
- * @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);
-
-/**
- * @internal
- * @brief Creates a request handle to the package manager.
- * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
- *
- * @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_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 @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_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
- *
- * @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);
-
-/**
- * @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 @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 @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);
-
-/**
- * @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 @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);
-
-/**
- * @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
- *
- * @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);
-
-/**
- * @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
- *
- * @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);
-
-/**
- * @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
  *
@@ -474,6 +253,7 @@ int package_manager_set_event_status(package_manager_h manager, int status_type)
  *
  * @retval #PACKAGE_MANAGER_ERROR_NONE              Successful
  * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR          Internal I/O error
  * @retval #PACKAGE_MANAGER_ERROR_PERMISSION_DENIED Permission denied
  * @post package_manager_event_cb() will be invoked.
  *
@@ -531,6 +311,7 @@ typedef bool (*package_manager_package_info_cb) (
  *
  * @retval #PACKAGE_MANAGER_ERROR_NONE              Successful
  * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR          Internal I/O error
  * @retval #PACKAGE_MANAGER_ERROR_PERMISSION_DENIED Permission denied
  * @post This function invokes package_manager_package_info_cb() repeatedly for each package information.
  *
@@ -553,6 +334,7 @@ int package_manager_foreach_package_info(package_manager_package_info_cb callbac
  * @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_PERMISSION_DENIED Permission denied
  */
 int package_manager_get_package_id_by_app_id(const char *app_id, char **package_id);
@@ -656,14 +438,13 @@ int package_manager_is_preload_package_by_app_id(const char *app_id, bool *prelo
 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
+ * @since_tizen 2.4
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/packagemanager.clearcache
  *
  * @param[in] package_id  The package ID
  *
@@ -681,7 +462,7 @@ int package_manager_get_permission_type(const char *app_id, package_manager_perm
 int package_manager_clear_cache_dir(const char *package_id);
 
 /**
- * @internal
+ * @platform
  * @brief  Clears all applications' internal and external cache directory.
  * @details All files stored in the cache directory of each application are removed.
  *
@@ -703,50 +484,38 @@ int package_manager_clear_cache_dir(const char *package_id);
 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
+ * @brief  The handle for the package size information.
+ * @since_tizen 2.4
  */
-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;
+typedef struct package_size_info *package_size_info_h;
 
 /**
- * @internal
  * @brief  Called when the package size information is obtained.
- * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ * @since_tizen 2.4
  *
  * @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);
+typedef void (*package_manager_size_info_receive_cb)(const char *package_id, const package_size_info_size_info, void *user_data);
 
 /**
- * @internal
+ * @platform
  * @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);
+typedef void (*package_manager_total_size_info_receive_cb)(const package_size_info_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
+ * @since_tizen 2.4
  *
  * @param[in]  package_id  The package ID
  * @param[in]  callback    The asynchronous callback function to get the package size information
@@ -766,7 +535,7 @@ typedef void (*package_manager_total_size_info_receive_cb)(const package_size_in
 int package_manager_get_package_size_info(const char *package_id, package_manager_size_info_receive_cb callback, void *user_data);
 
 /**
- * @internal
+ * @platform
  * @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
@@ -897,6 +666,406 @@ int package_manager_filter_foreach_package_info(package_manager_filter_h handle,
                package_manager_package_info_cb callback, void *user_data);
 
 /**
+ * @platform
+ * @brief Generates request for getting License
+ * @since_tizen 2.4
+ * @privlevel platform
+ * @privilege %http://tizen.org/privilege/packagemanager.admin
+ * @param[in] resp_data The response data string of the purchase request
+ * @param[out] req_data        License request data
+ * @param[out] license_url     License acquisition url data
+ * @remarks You must release @a req_data and @a license_url by yourself.
+ * @return 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_PERMISSION_DENIED Permission denied
+ * @post package_manager_drm_register_license
+ */
+int package_manager_drm_generate_license_request(const char *resp_data, char **req_data, char **license_url);
+
+/**
+ * @platform
+ * @brief Registers encrypted license
+ * @since_tizen 2.4
+ * @privlevel platform
+ * @privilege %http://tizen.org/privilege/packagemanager.admin
+ * @param[in] resp_data The response data string of the rights request
+ * @return 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
+ * @retval #PACKAGE_MANAGER_ERROR_PERMISSION_DENIED Permission denied
+ * @pre package_manager_drm_generate_license_request
+ */
+int package_manager_drm_register_license(const char *resp_data);
+
+/**
+ * @platform
+ * @brief Decrypts contents which is encrypted
+ * @since_tizen 2.4
+ * @privlevel platform
+ * @privilege %http://tizen.org/privilege/packagemanager.admin
+ * @param[in] drm_file_path DRM file path
+ * @param[in] decrypted_file_path Decrypted file path
+ * @return 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
+ * @retval #PACKAGE_MANAGER_ERROR_PERMISSION_DENIED Permission denied
+ */
+int package_manager_drm_decrypt_package(const char *drm_file_path, const char *decrypted_file_path);
+
+/**
+ * @brief  Retrieves data size from given handle
+ *
+ * @since_tizen 2.4
+ *
+ * @param[in] handle  Package size info handle
+ * @param[out] data_size  Data size will be returned
+ *
+ * @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_size_info_get_data_size(package_size_info_h handle, long long *data_size);
+
+/**
+ * @brief  Retrieves cache size from given handle
+ *
+ * @since_tizen 2.4
+ *
+ * @param[in] handle  Package size info handle
+ * @param[out] cache_size  Cache size will be returned
+ *
+ * @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_size_info_get_cache_size(package_size_info_h handle, long long *cache_size);
+
+/**
+ * @brief  Retrieves application size from given handle
+ *
+ * @since_tizen 2.4
+ *
+ * @param[in] handle  Package size info handle
+ * @param[out] app_size  App size will be returned
+ *
+ * @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_size_info_get_app_size(package_size_info_h handle, long long *app_size);
+
+/**
+ * @brief  Retrieves external data size from given handle
+ *
+ * @since_tizen 2.4
+ *
+ * @param[in] handle  Package size info handle
+ * @param[out] ext_data_size  External data size will be returned
+ *
+ * @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_size_info_get_external_data_size(package_size_info_h handle, long long *ext_data_size);
+
+
+/**
+ * @brief  Retrieves external cache size from given handle
+ *
+ * @since_tizen 2.4
+ *
+ * @param[in] handle  Package size info handle
+ * @param[out] ext_cache_size  External cache size will be returned
+ *
+ * @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_size_info_get_external_cache_size(package_size_info_h handle, long long *ext_cache_size);
+
+
+/**
+ * @brief  Retrieves external application size from given handle
+ *
+ * @since_tizen 2.4
+ *
+ * @param[in] handle  Package size info handle
+ * @param[out] ext_app_size  External app size will be returned
+ *
+ * @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_size_info_get_external_app_size(package_size_info_h handle, long long *ext_app_size);
+
+/**
+* @}
+*/
+
+/**
+ * @addtogroup CAPI_PACKAGE_REQUEST_MODULE
+ * @{
+ */
+
+/**
+ * @platform
+ * @brief Enumeration for request mode.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ */
+typedef enum {
+    PACKAGE_MANAGER_REQUEST_MODE_DEFAULT = 0,    /**< @platform Default request mode */
+    PACKAGE_MANAGER_REQUEST_MODE_QUIET,          /**< @platform Quiet request mode */
+} package_manager_request_mode_e;
+
+/**
+ * @platform
+ * @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;
+
+/**
+ * @platform
+ * @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()
+ *
+ * @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);
+
+/**
+ * @platform
+ * @brief Creates a request handle to the package manager.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ * @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_request_destroy()
+ */
+int package_manager_request_create(package_manager_request_h *request);
+
+/**
+ * @platform
+ * @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 @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_request_destroy(package_manager_request_h request);
+
+/**
+ * @platform
+ * @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
+ *
+ * @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
+ * @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);
+
+/**
+ * @platform
+ * @brief Unregisters the callback function.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ * @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);
+
+/**
+ * @platform
+ * @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 @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);
+
+/**
+ * @platform
+ * @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 @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);
+
+/**
+ * @platform
+ * @brief Sets the path of TEP file to the request. The TEP file that is set will be installed when the package is installed.
+ * @since_tizen 2.4
+ * @privlevel platform
+ * @privilege %http://tizen.org/privilege/packagemanager.admin
+ * @param[in] request The request handle
+ * @param[in] tep_path The tep path to set. If this is NULL on update, installed tep will be removed.
+ * @return 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
+ * @retval #PACKAGE_MANAGER_ERROR_PERMISSION_DENIED Permission denied
+ * @retval #PACKAGE_MANAGER_ERROR_SYSTEM_ERROR          Severe system error
+ */
+int package_manager_request_set_tep(package_manager_request_h request,
+                     const char *tep_path);
+
+/**
+ * @platform
+ * @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
+ *
+ * @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);
+
+/**
+ * @platform
+ * @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
+ *
+ * @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);
+
+/**
+ * @platform
+ * @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);
+
+
+
+/**
 * @}
 */
 
index 4992139..43281e9 100755 (executable)
 extern "C" {
 #endif
 
-typedef enum {
-       PRIVILEGE_PACKAGE_MANAGER_INFO,
-       PRIVILEGE_PACKAGE_MANAGER_ADMIN
-} privilege_type;
-
-int check_privilege(privilege_type type);
+int package_manager_error(package_manager_error_e error, const char *function, const char *description);
 
+int package_manager_info_check_privilege();
+int package_manager_admin_check_privilege();
 #ifdef __cplusplus
 }
 #endif
index ab8ed41..02c53ff 100755 (executable)
@@ -9,10 +9,10 @@ BuildRequires:  cmake
 BuildRequires:  pkgconfig(dlog)
 BuildRequires:  pkgconfig(pkgmgr)
 BuildRequires:  pkgconfig(pkgmgr-info)
-BuildRequires:  pkgconfig(ail)
 BuildRequires: pkgconfig(vconf)
 BuildRequires: pkgconfig(aul)
 BuildRequires:  pkgconfig(capi-base-common)
+BuildRequires:  pkgconfig(security-privilege-checker)
 
 %description
 The Package Manager API provides functions to install, uninstall the package,
@@ -27,6 +27,13 @@ Requires: %{name} = %{version}-%{release}
 The Package Manager API provides functions to install, uninstall the package,
 and also privides event listening function. (DEV)
 
+%define appfw_feature_expansion_pkg_install 0
+
+%if 0%{?appfw_feature_expansion_pkg_install}
+_EXPANSION_PKG_INSTALL=ON
+%else
+_EXPANSION_PKG_INSTALL=OFF
+%endif
 
 %prep
 %setup -q
@@ -34,7 +41,7 @@ and also privides event listening function. (DEV)
 
 %build
 MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'`
-%cmake . -DFULLVER=%{version} -DMAJORVER=${MAJORVER}
+%cmake . -DFULLVER=%{version} -DMAJORVER=${MAJORVER} -D_APPFW_FEATURE_EXPANSION_PKG_INSTALL:BOOL=ON
 
 make %{?jobs:-j%jobs}
 
index 890597d..b3221f4 100755 (executable)
@@ -26,7 +26,8 @@
 
 #include <package_info.h>
 #include <package_manager.h>
-
+#include <package_manager_internal.h>
+#include <privilege_checker.h>
 
 #ifdef LOG_TAG
 #undef LOG_TAG
@@ -172,7 +173,8 @@ int package_info_filter_foreach_package_info(pkgmgrinfo_pkginfo_filter_h handle,
 static int package_info_foreach_app_cb (const pkgmgrinfo_appinfo_h handle, void *user_data)
 {
        char *appid = NULL;
-       pkgmgr_app_component comp;
+       char *comp_type = NULL;
+       pkgmgr_app_component comp = PACKAGE_INFO_UIAPP;
        foreach_app_context_s *foreach_app_context = user_data;
        int ret = 0;
 
@@ -186,11 +188,20 @@ static int package_info_foreach_app_cb (const pkgmgrinfo_appinfo_h handle, void
        if (ret < 0) {
                return PKGMGR_R_ERROR;
        }
-       ret = pkgmgrinfo_appinfo_get_component(handle, &comp);
+
+       ret = pkgmgrinfo_appinfo_get_component_type(handle, &comp_type);
        if (ret < 0) {
                return PKGMGR_R_ERROR;
        }
 
+       if (comp_type && !strncmp("svcapp", comp_type, strlen(comp_type))) {
+               comp = PACKAGE_INFO_SERVICEAPP;
+       } else if (comp_type && !strncmp("uiapp", comp_type, strlen(comp_type))) {
+               comp = PACKAGE_INFO_UIAPP;
+       } else {
+               comp = PACKAGE_INFO_ALLAPP;
+       }
+
        ret = foreach_app_context->callback(comp, appid, foreach_app_context->user_data);
        if (!ret)
        {
@@ -222,11 +233,13 @@ int package_info_foreach_app_from_package(package_info_h package_info, package_i
                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);
+               ret = pkgmgrinfo_appinfo_get_list(pkgmgrinfo_pkginfo, PMINFO_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);
+               ret = pkgmgrinfo_appinfo_get_list(pkgmgrinfo_pkginfo, PMINFO_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);
+               ret = pkgmgrinfo_appinfo_get_list(pkgmgrinfo_pkginfo, PMINFO_SVC_APP, package_info_foreach_app_cb, &foreach_app_context);
+
+       pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
 
        return ret;
 }
@@ -405,7 +418,7 @@ int package_info_get_installed_storage(package_info_h package_info, package_info
                return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
        }
 
-       ret = pkgmgrinfo_pkginfo_get_installed_storage(package_info->pkgmgrinfo_pkginfo, &pkg_info_value);
+       ret = pkgmgrinfo_pkginfo_get_installed_storage(package_info->pkgmgrinfo_pkginfo, (pkgmgrinfo_installed_storage *)&pkg_info_value);
        if (ret < 0)
                return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
 
@@ -448,6 +461,43 @@ END:
        return PACKAGE_MANAGER_ERROR_NONE;
 }
 
+int package_info_get_tep_name (package_info_h package_info, char **name)
+{
+#ifdef _APPFW_FEATURE_EXPANSION_PKG_INSTALL
+       pkgmgrinfo_pkginfo_h pkginfo;
+       char *tepname_tmp = NULL;
+       int retval = 0;
+
+       if (package_info == NULL || package_info->package == NULL || name == NULL)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+
+       retval = package_manager_admin_check_privilege();
+       if (retval != PACKAGE_MANAGER_ERROR_NONE) {
+               return retval;
+       }
+
+       if (pkgmgrinfo_pkginfo_get_pkginfo(package_info->package, &pkginfo) != PMINFO_R_OK)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
+
+       if (pkginfo == NULL)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
+
+       if (pkgmgrinfo_pkginfo_get_tep_name(pkginfo, &tepname_tmp) != PMINFO_R_OK)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
+
+       if (tepname_tmp != NULL)
+               *name = strdup(tepname_tmp);
+
+       if (*name == NULL)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
+
+       pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+#else
+       return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
+#endif
+}
 
 /*
 int package_info_get_install_location(package_info_h package_info, package_manager_package_location_e *location)
@@ -641,7 +691,7 @@ int package_info_foreach_privilege_info(package_info_h package_info, package_inf
                return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
        }
 
-       ret = pkgmgrinfo_pkginfo_foreach_privilege(package_info->pkgmgrinfo_pkginfo, callback, user_data);
+       ret = pkgmgrinfo_pkginfo_foreach_privilege(package_info->pkgmgrinfo_pkginfo, (pkgmgrinfo_pkg_privilege_list_cb)callback, user_data);
 
        return ret;
 }
index aee7e2a..6d68619 100755 (executable)
@@ -17,6 +17,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <glib.h>
+#include <gio/gio.h>
 #include <dlog.h>
 
 #include <package-manager.h>
@@ -24,6 +25,7 @@
 #include <pkgmgr-info.h>
 
 #include <package_manager_internal.h>
+#include <privilege_checker.h>
 
 #ifdef LOG_TAG
 #undef LOG_TAG
 #define _LOGE(fmt, arg...) LOGE(fmt,##arg)
 #define _LOGD(fmt, arg...) LOGD(fmt, ##arg)
 
+#define CAPI_PACKAGE_MANAGER_DBUS_SERVICE "org.tizen.pkgmgr"
+#define CAPI_PACKAGE_MANAGER_DBUS_PATH "/org/tizen/pkgmgr"
+#define CAPI_PACKAGE_MANAGER_DBUS_INTERFACE "org.tizen.pkgmgr"
+#define CAPI_PACKAGE_MANAGER_METHOD_DRM_GENERATE_LICENSE_REQUEST "DrmGenerateLicenseRequest"
+#define CAPI_PACKAGE_MANAGER_METHOD_DRM_REGISTER_LICNESE "DrmRegisterLicense"
+#define CAPI_PACKAGE_MANAGER_METHOD_DRM_DECRYPT_PACKAGE "DrmDecryptPackage"
+#define CAPI_PACKAGE_MANAGER_RETRY_MAX 3
+
+#define UNUSED(x) (void)(x)
+
+#define TIZEN_PRIVILEGE_PACKAGE_INFO "http://tizen.org/privilege/package.info"
+#define TIZEN_PRIVILEGE_PACKAGE_MANAGER_INSTALL "http://tizen.org/privilege/packagemanager.install"
+#define TIZEN_PRIVILEGE_PACKAGE_MANAGER_ADMIN "http://tizen.org/privilege/packagemanager.admin"
+#define TIZEN_PRIVILEGE_PACKAGE_MANAGER_INFO "http://tizen.org/privilege/packagemanager.info"
+
 static GHashTable *__cb_table = NULL;
 
+extern int package_info_get_package_info(const char *package, package_info_h *package_info);
+extern int package_info_foreach_package_info(package_manager_package_info_cb callback, void *user_data);
+extern int package_info_filter_foreach_package_info(pkgmgrinfo_pkginfo_filter_h handle, package_manager_package_info_cb callback, void *user_data);
+
+
 typedef struct _event_info {
        int req_id;
        package_manager_event_type_e event_type;
@@ -64,8 +86,22 @@ struct package_manager_request_s {
        event_info *head;
        package_manager_request_event_cb event_cb;
        void *user_data;
+#ifdef _APPFW_FEATURE_EXPANSION_PKG_INSTALL
+       const char *tep_path;
+       bool tep_move;
+#endif
 };
 
+typedef struct package_size_info
+{
+    long long data_size;
+    long long cache_size;
+    long long app_size;
+    long long external_data_size;
+    long long external_cache_size;
+    long long external_app_size;
+} package_size_info_t;
+
 struct package_manager_filter_s {
        pkgmgrinfo_pkginfo_filter_h pkgmgrinfo_pkginfo_filter;
 };
@@ -205,10 +241,9 @@ int package_manager_request_set_event_cb(package_manager_request_h request,
 {
        int retval;
 
-       retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
+       retval = package_manager_info_check_privilege();
        if (retval != PACKAGE_MANAGER_ERROR_NONE) {
-               return package_manager_error(retval, __FUNCTION__,
-                        "failed to allow privilege");
+               return retval;
        }
 
        if (package_manager_client_validate_handle(request)) {
@@ -226,11 +261,13 @@ 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);
        }
 
+       request->event_cb = NULL;
+       request->user_data = NULL;
+
        return PACKAGE_MANAGER_ERROR_NONE;
 }
 
@@ -268,6 +305,39 @@ int package_manager_request_set_mode(package_manager_request_h request,
        return PACKAGE_MANAGER_ERROR_NONE;
 }
 
+int package_manager_request_set_tep(package_manager_request_h request,
+                                    const char *tep_path)
+{
+#ifdef _APPFW_FEATURE_EXPANSION_PKG_INSTALL
+       int retval = 0;
+
+       if (package_manager_client_validate_handle(request) || tep_path == NULL) {
+               return
+                       package_manager_error
+                       (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
+                        NULL);
+       }
+
+       retval = package_manager_admin_check_privilege();
+       if (retval != PACKAGE_MANAGER_ERROR_NONE) {
+               return retval;
+       }
+
+       if (request->tep_path)
+               free((void *)request->tep_path);
+
+       request->tep_path = strdup(tep_path);
+       request->tep_move = true;
+
+       if (request ->tep_path == NULL)
+               return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+#else
+       return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
+#endif
+}
+
 static int package_manager_get_event_type(const char *key,
                                          package_manager_event_type_e *
                                          event_type)
@@ -294,7 +364,7 @@ static int __add_event_info(event_info ** head, int req_id,
        event_info *evt_info;
        event_info *current;
        event_info *prev;
-
+       UNUSED(event_state);
        evt_info = (event_info *) calloc(1, sizeof(event_info));
        if (evt_info == NULL) {
                _LOGD("calloc failed");
@@ -324,6 +394,7 @@ static int __find_event_info(event_info ** head, int req_id,
                             package_manager_event_state_e * event_state)
 {
        event_info *tmp;
+       UNUSED(event_state);
 
        tmp = *head;
 
@@ -409,6 +480,7 @@ static int request_event_handler(int req_id, const char *pkg_type,
        package_manager_event_state_e event_state = -1;
 
        _LOGD("request_event_handler is called");
+       UNUSED(pmsg);
 
        package_manager_request_h request = data;
 
@@ -502,6 +574,15 @@ int package_manager_request_install(package_manager_request_h request,
 
        int request_id = 0;
        request->pkg_path = path;
+
+#ifdef _APPFW_FEATURE_EXPANSION_PKG_INSTALL
+       if (request->tep_path)
+               request_id = pkgmgr_client_install_with_tep(request->pc, request->pkg_type, NULL,
+                               request->pkg_path, request->tep_path, request->tep_move, NULL,
+                               request->mode, request_event_handler,
+                               request);
+       else
+#endif
        request_id = pkgmgr_client_install(request->pc, request->pkg_type, NULL,
                                           request->pkg_path, NULL,
                                           request->mode, request_event_handler,
@@ -593,12 +674,11 @@ int package_manager_request_move(package_manager_request_h request,
 }
 int package_manager_create(package_manager_h * manager)
 {
-       int ret;
+       int retval;
 
-       ret = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
-       if (ret != PACKAGE_MANAGER_ERROR_NONE) {
-               return package_manager_error(ret, __FUNCTION__,
-                        "failed to allow privilege");
+       retval = package_manager_info_check_privilege();
+       if (retval != PACKAGE_MANAGER_ERROR_NONE) {
+               return retval;
        }
 
        struct package_manager_s *package_manager = NULL;
@@ -665,6 +745,7 @@ static int __add_event(event_info ** head, int req_id,
                            package_manager_event_state_e event_state)
 {
        event_info *evt_info;
+       UNUSED(event_state);
 
        evt_info = (event_info *) calloc(1, sizeof(event_info));
        if (evt_info == NULL) {
@@ -685,6 +766,8 @@ static int __find_event(event_info ** head, int req_id,
                             package_manager_event_state_e * event_state)
 {
        event_info *tmp;
+       UNUSED(event_state);
+       UNUSED(req_id);
 
        tmp = *head;
 
@@ -729,6 +812,7 @@ static int global_event_handler(int req_id, const char *pkg_type,
        int ret = -1;
        package_manager_event_type_e event_type = -1;
        package_manager_event_state_e event_state = -1;
+       UNUSED(pmsg);
 
        _LOGD("global_event_handler is called");
 
@@ -835,12 +919,12 @@ int package_manager_set_event_cb(package_manager_h manager,
 {
        int retval;
 
-       retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
+       retval = package_manager_info_check_privilege();
        if (retval != PACKAGE_MANAGER_ERROR_NONE) {
-               return package_manager_error(retval, __FUNCTION__,
-                        "failed to allow privilege");
+               return retval;
        }
 
+
        if (package_manager_validate_handle(manager)) {
                return
                    package_manager_error
@@ -873,10 +957,9 @@ int package_manager_get_package_id_by_app_id(const char *app_id, char **package_
        char *pkg_id = NULL;
        char *pkg_id_dup = NULL;
 
-       retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
+       retval = package_manager_info_check_privilege();
        if (retval != PACKAGE_MANAGER_ERROR_NONE) {
-               return package_manager_error(retval, __FUNCTION__,
-                        "failed to allow privilege");
+               return retval;
        }
 
        if (app_id == NULL) {
@@ -912,10 +995,9 @@ int package_manager_get_package_info(const char *package_id, package_info_h *pac
 {
        int retval;
 
-       retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
+       retval = package_manager_info_check_privilege();
        if (retval != PACKAGE_MANAGER_ERROR_NONE) {
-               return package_manager_error(retval, __FUNCTION__,
-                        "failed to allow privilege");
+               return retval;
        }
 
        retval = package_info_get_package_info(package_id, package_info);
@@ -935,10 +1017,9 @@ int package_manager_foreach_package_info(package_manager_package_info_cb callbac
 {
        int retval;
 
-       retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
+       retval = package_manager_info_check_privilege();
        if (retval != PACKAGE_MANAGER_ERROR_NONE) {
-               return package_manager_error(retval, __FUNCTION__,
-                        "failed to allow privilege");
+               return retval;
        }
 
        retval = package_info_foreach_package_info(callback, user_data);
@@ -999,10 +1080,9 @@ int package_manager_is_preload_package_by_app_id(const char *app_id, bool *prelo
        char *pkg_id = NULL;
        bool is_preload = 0;
 
-       retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
+       retval = package_manager_info_check_privilege();
        if (retval != PACKAGE_MANAGER_ERROR_NONE) {
-               return package_manager_error(retval, __FUNCTION__,
-                        "failed to allow privilege");
+               return retval;
        }
 
        if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
@@ -1048,10 +1128,9 @@ int package_manager_get_permission_type(const char *app_id, package_manager_perm
        pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo =NULL;
        pkgmgrinfo_permission_type permission = 0;
 
-       retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
+       retval = package_manager_info_check_privilege();
        if (retval != PACKAGE_MANAGER_ERROR_NONE) {
-               return package_manager_error(retval, __FUNCTION__,
-                        "failed to allow privilege");
+               return retval;
        }
 
        if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
@@ -1135,7 +1214,7 @@ static void __initialize_cb_table(void)
 
 static void __result_cb(pkgmgr_client *pc, const char *pkgid, const pkg_size_info_t *result, void *user_data)
 {
-       int key = (int *)pc;
+       int key = (int)pc;
 
        package_manager_size_info_receive_cb callback = g_hash_table_lookup(__cb_table, &key);
        if (callback == NULL)
@@ -1154,7 +1233,8 @@ static void __result_cb(pkgmgr_client *pc, const char *pkgid, const pkg_size_inf
        size_info.external_cache_size = result->ext_cache_size;
        size_info.external_app_size   = result->ext_app_size;
 
-       callback(pkgid, &size_info, user_data);
+       package_size_info_h size_info_h = (package_size_info_h)&size_info;
+       callback(pkgid, size_info_h, user_data);
 
        g_hash_table_remove(__cb_table, pc);
        pkgmgr_client_free(pc);
@@ -1162,7 +1242,7 @@ static void __result_cb(pkgmgr_client *pc, const char *pkgid, const pkg_size_inf
 
 static void __total_result_cb(pkgmgr_client *pc, const pkg_size_info_t *result, void *user_data)
 {
-       int key = (int *)pc;
+       int key = (int)pc;
 
        package_manager_total_size_info_receive_cb callback = g_hash_table_lookup(__cb_table, &key);
        if (callback == NULL)
@@ -1253,14 +1333,13 @@ int package_manager_get_package_size_info(const char *package_id, package_manage
        }
 
        int *key = malloc(sizeof(int));
-       if (key == NULL)
-       {
+       if (!key) {
                _LOGE("out of memory");
                pkgmgr_client_free(pc);
                return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
        }
 
-       *key = pc;
+       *key = (int)pc;
        g_hash_table_insert(__cb_table, key, callback);
 
        _LOGD("Successful");
@@ -1269,7 +1348,7 @@ int package_manager_get_package_size_info(const char *package_id, package_manage
 
 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);
+       return package_manager_get_package_size_info(PKG_SIZE_INFO_TOTAL, (package_manager_size_info_receive_cb)callback, user_data);
 }
 
 int package_manager_filter_create(package_manager_filter_h *handle)
@@ -1278,10 +1357,9 @@ int package_manager_filter_create(package_manager_filter_h *handle)
        package_manager_filter_h created_filter = NULL;
        pkgmgrinfo_pkginfo_filter_h pkgmgr_filter = NULL;
 
-       retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
+       retval = package_manager_info_check_privilege();
        if (retval != PACKAGE_MANAGER_ERROR_NONE) {
-               return package_manager_error(retval, __FUNCTION__,
-                        "failed to allow privilege");
+               return retval;
        }
 
        if (handle == NULL)
@@ -1359,10 +1437,9 @@ int package_manager_filter_count(package_manager_filter_h handle, int *count)
 {
        int retval = 0;
 
-       retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
+       retval = package_manager_info_check_privilege();
        if (retval != PACKAGE_MANAGER_ERROR_NONE) {
-               return package_manager_error(retval, __FUNCTION__,
-                        "failed to allow privilege");
+               return retval;
        }
 
        if ((handle == NULL) || (count == NULL))
@@ -1384,10 +1461,9 @@ int package_manager_filter_foreach_package_info(package_manager_filter_h handle,
 {
        int retval;
 
-       retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
+       retval = package_manager_info_check_privilege();
        if (retval != PACKAGE_MANAGER_ERROR_NONE) {
-               return package_manager_error(retval, __FUNCTION__,
-                        "failed to allow privilege");
+               return retval;
        }
 
        retval = package_info_filter_foreach_package_info(handle->pkgmgrinfo_pkginfo_filter, callback, user_data);
@@ -1401,3 +1477,536 @@ int package_manager_filter_foreach_package_info(package_manager_filter_h handle,
                return PACKAGE_MANAGER_ERROR_NONE;
        }
 }
+
+int package_size_info_get_data_size(package_size_info_h handle, long long *data_size)
+{
+       if (handle == NULL)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+
+       package_size_info_t *size_info = (package_size_info_t *)handle;
+
+       *data_size = (long long)size_info->data_size;
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+int package_size_info_get_cache_size(package_size_info_h handle, long long *cache_size)
+{
+       if (handle == NULL)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+
+       package_size_info_t *size_info = (package_size_info_t *)handle;
+
+       *cache_size = size_info->cache_size;
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+int package_size_info_get_app_size(package_size_info_h handle, long long *app_size)
+{
+       if (handle == NULL)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+
+       package_size_info_t *size_info = (package_size_info_t *)handle;
+       *app_size = size_info->app_size;
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+int package_size_info_get_external_data_size(package_size_info_h handle, long long *ext_data_size)
+{
+       if (handle == NULL)
+               return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
+
+       package_size_info_t *size_info = (package_size_info_t *)handle;
+       *ext_data_size = size_info->external_data_size;
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+int package_size_info_get_external_cache_size(package_size_info_h handle, long long *ext_cache_size)
+{
+       if (handle == NULL)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+
+       package_size_info_t *size_info = (package_size_info_t *)handle;
+       *ext_cache_size = size_info->external_cache_size;
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+int package_size_info_get_external_app_size(package_size_info_h handle, long long *ext_app_size)
+{
+       if (handle == NULL)
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+
+       package_size_info_t *size_info = (package_size_info_t *)handle;
+       *ext_app_size = size_info->external_app_size;
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+static char *__get_cookie_from_security_server(void)
+{
+       int ret = 0;
+       size_t cookie_size = 0;
+       char *e_cookie = NULL;
+
+       //calculage cookie size
+       cookie_size = security_server_get_cookie_size();
+       if (cookie_size <= 0) {
+               _LOGE("failed to get cookie size");
+               return NULL;
+       }
+
+       //get cookie from security server
+       char cookie[cookie_size];
+       cookie[0] = '\0';
+       ret = security_server_request_cookie(cookie, cookie_size);
+       if (ret < 0) {
+               _LOGE("failed to get cookie");
+               return NULL;
+       }
+
+       //encode cookie
+       e_cookie = g_base64_encode((const guchar *)cookie, cookie_size);
+       if (e_cookie == NULL) {
+               _LOGE("failed to encode cookie");
+               return NULL;
+       }
+
+       return e_cookie;
+}
+
+static int __package_manager_drm_generate_license_request(const char *resp_data, char **req_data, char **license_url)
+{
+       _LOGE("__package_manager_drm_generate_license_request is called.");
+
+       if (resp_data == NULL || req_data == NULL || license_url == NULL) {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       int ret = -1;
+       GDBusConnection *bus = NULL;
+       GDBusMessage *message = NULL;
+       GDBusMessage *reply = NULL;
+       GVariant *body = NULL;
+       GError *error = NULL;
+       char *req_data_tmp = NULL;
+       char *license_url_tmp = NULL;
+       char *cookie = NULL;
+
+       _LOGE("send event to pkgmgr server");
+
+       bus = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
+       if (bus == NULL) {
+               _LOGE("g_bus_get_sync is failed.");
+               if (error != NULL) {
+                       _LOGE("error message.[%s]", error->message);
+                       g_error_free(error);
+                       error = NULL;
+               }
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+       }
+
+       _LOGE("g_bus_get_sync is OK.");
+
+       message = g_dbus_message_new_method_call(CAPI_PACKAGE_MANAGER_DBUS_SERVICE,
+                       CAPI_PACKAGE_MANAGER_DBUS_PATH,
+                       CAPI_PACKAGE_MANAGER_DBUS_INTERFACE,
+                       CAPI_PACKAGE_MANAGER_METHOD_DRM_GENERATE_LICENSE_REQUEST);
+
+       if (message == NULL) {
+               _LOGE("g_dbus_message_new_method_call is failed.");
+               g_dbus_connection_flush_sync(bus, NULL, NULL);
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+       }
+
+       _LOGE("g_dbus_message_new_method_call is OK.");
+
+       cookie = __get_cookie_from_security_server();
+       if (cookie == NULL) {
+               _LOGE("__get_cookie_from_security_server is NULL");
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+       }
+
+       g_dbus_message_set_body(message, g_variant_new("(ss)", resp_data, cookie));
+       reply = g_dbus_connection_send_message_with_reply_sync(bus, message, G_DBUS_SEND_MESSAGE_FLAGS_NONE, -1, NULL, NULL, &error);
+       if (reply == NULL) {
+               _LOGE("g_dbus_connection_send_message_with_reply_sync is failed.");
+               if (error != NULL) {
+                       _LOGE("error message.[%s]", error->message);
+                       g_error_free(error);
+                       error = NULL;
+               }
+               g_dbus_connection_flush_sync(bus, NULL, NULL);
+               g_object_unref(message);
+               ret = PACKAGE_MANAGER_ERROR_IO_ERROR;
+               goto catch;
+       }
+
+       _LOGE("g_dbus_connection_send_message_with_reply_sync is OK.");
+
+       body = g_dbus_message_get_body(reply);
+       if (body != NULL) {
+               _LOGE("g_dbus_message_get_body is OK.");
+               g_variant_get(body, "(ssi)", &req_data_tmp, &license_url_tmp, &ret);
+       } else {
+               _LOGE("body is NULL.");
+       }
+
+       g_dbus_connection_flush_sync(bus, NULL, NULL);
+       g_object_unref(message);
+
+       if (ret != 0) {
+               _LOGE("drm_tizen_generate_license_request is failed.");
+               if (ret == -5)
+                       ret = PACKAGE_MANAGER_ERROR_PERMISSION_DENIED;
+               else
+                       ret = PACKAGE_MANAGER_ERROR_IO_ERROR;
+               goto catch;
+       }
+
+       *req_data = strdup(req_data_tmp);
+       *license_url = strdup(license_url_tmp);
+
+       g_object_unref(reply);
+
+       _LOGE("__package_manager_drm_generate_license_request is successful.");
+
+catch:
+       if (cookie)
+               g_free(cookie);
+
+       if (ret != PACKAGE_MANAGER_ERROR_NONE)
+               return package_manager_error(ret, __FUNCTION__, NULL);
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+int package_manager_drm_generate_license_request(const char *resp_data, char **req_data, char **license_url)
+{
+       int ret = -1;
+       int retry_cnt = 0;
+
+       _LOGE("package_manager_drm_generate_license_request is called.");
+
+       ret = __package_manager_drm_generate_license_request(resp_data, req_data, license_url);
+
+       while (ret != PACKAGE_MANAGER_ERROR_NONE) {
+               _LOGE("sleep and retry. ret is [%d].", ret);
+               sleep(1);
+
+               if (retry_cnt == CAPI_PACKAGE_MANAGER_RETRY_MAX) {
+                       _LOGE("retry_cnt is max. stop retry.");
+                       return package_manager_error(ret, __FUNCTION__, NULL);
+               }
+
+               retry_cnt++;
+
+               ret = __package_manager_drm_generate_license_request(resp_data, req_data, license_url);
+               if (ret == PACKAGE_MANAGER_ERROR_NONE) {
+                       _LOGE("retry is successful. retry_cnt is [%d].", retry_cnt);
+                       break;
+               }
+       }
+
+       _LOGE("package_manager_drm_generate_license_request is successful.");
+
+       return ret;
+}
+
+static int __package_manager_drm_register_license(const char *resp_data)
+{
+       _LOGE("__package_manager_drm_register_license is called.");
+
+       if (resp_data == NULL) {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       int ret = -1;
+       GDBusConnection *bus = NULL;
+       GDBusMessage *message = NULL;
+       GDBusMessage *reply = NULL;
+       GVariant *body = NULL;
+       GError *error = NULL;
+       char *cookie = NULL;
+
+       _LOGE("send event to pkgmgr server");
+
+       bus = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
+       if (bus == NULL) {
+               _LOGE("g_bus_get_sync is failed.");
+               if (error != NULL) {
+                       _LOGE("error message.[%s]", error->message);
+                       g_error_free(error);
+                       error = NULL;
+               }
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+       }
+
+       _LOGE("g_bus_get_sync is OK.");
+
+       message = g_dbus_message_new_method_call(CAPI_PACKAGE_MANAGER_DBUS_SERVICE,
+            CAPI_PACKAGE_MANAGER_DBUS_PATH,
+            CAPI_PACKAGE_MANAGER_DBUS_INTERFACE,
+            CAPI_PACKAGE_MANAGER_METHOD_DRM_REGISTER_LICNESE);
+
+       if (message == NULL) {
+               _LOGE("g_dbus_message_new_method_call is failed.");
+               g_dbus_connection_flush_sync(bus, NULL, NULL);
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+       }
+
+       _LOGE("g_dbus_message_new_method_call is OK.");
+
+       cookie = __get_cookie_from_security_server();
+       if (cookie == NULL) {
+               _LOGE("__get_cookie_from_security_server is NULL");
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+       }
+
+       g_dbus_message_set_body(message, g_variant_new("(ss)", resp_data, cookie));
+       reply = g_dbus_connection_send_message_with_reply_sync(bus, message, G_DBUS_SEND_MESSAGE_FLAGS_NONE, -1, NULL, NULL, &error);
+       if (reply == NULL) {
+               _LOGE("g_dbus_connection_send_message_with_reply_sync is failed.");
+               if (error != NULL) {
+                       _LOGE("error message.[%s]", error->message);
+                       g_error_free(error);
+                       error = NULL;
+               }
+               g_dbus_connection_flush_sync(bus, NULL, NULL);
+               g_object_unref(message);
+               ret = PACKAGE_MANAGER_ERROR_IO_ERROR;
+               goto catch;
+       }
+
+       _LOGE("g_dbus_connection_send_message_with_reply_sync is OK.");
+
+       body = g_dbus_message_get_body(reply);
+       if (body != NULL) {
+               _LOGE("g_dbus_message_get_body is OK.");
+               g_variant_get(body, "(i)", &ret);
+       } else {
+               _LOGE("body is NULL.");
+       }
+
+       g_dbus_connection_flush_sync(bus, NULL, NULL);
+       g_object_unref(message);
+       g_object_unref(reply);
+
+       if (ret != 0) {
+               _LOGE("drm_tizen_register_license is failed.");
+               if (ret == -5)
+                       ret = PACKAGE_MANAGER_ERROR_PERMISSION_DENIED;
+               else
+                       ret = PACKAGE_MANAGER_ERROR_IO_ERROR;
+       } else
+               _LOGE("__package_manager_drm_register_license is successful.");
+
+catch:
+       if (cookie)
+               g_free(cookie);
+
+       if (ret != PACKAGE_MANAGER_ERROR_NONE)
+               return package_manager_error(ret, __FUNCTION__, NULL);
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+int package_manager_drm_register_license(const char *resp_data)
+{
+       int ret = -1;
+       int retry_cnt = 0;
+
+       _LOGE("package_manager_drm_register_license is called.");
+
+       ret = __package_manager_drm_register_license(resp_data);
+
+       while (ret != PACKAGE_MANAGER_ERROR_NONE) {
+               _LOGE("sleep and retry. ret is [%d].", ret);
+               sleep(1);
+
+               if (retry_cnt == CAPI_PACKAGE_MANAGER_RETRY_MAX) {
+                       _LOGE("retry_cnt is max. stop retry.");
+                       return package_manager_error(ret, __FUNCTION__, NULL);
+               }
+
+               retry_cnt++;
+
+               ret = __package_manager_drm_register_license(resp_data);
+               if (ret == PACKAGE_MANAGER_ERROR_NONE) {
+                       _LOGE("retry is successful. retry_cnt is [%d].", retry_cnt);
+                       break;
+               }
+       }
+
+       _LOGE("package_manager_drm_register_license is successful.");
+
+       return ret;
+}
+
+static int __package_manager_drm_decrypt_package(const char *drm_file_path, const char *decrypted_file_path)
+{
+       _LOGE("__package_manager_drm_decrypt_package is called.");
+
+       if (drm_file_path == NULL || decrypted_file_path == NULL) {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       int ret = -1;
+       GDBusConnection *bus = NULL;
+       GDBusMessage *message = NULL;
+       GDBusMessage *reply = NULL;
+       GVariant *body = NULL;
+       GError *error = NULL;
+       char *cookie = NULL;
+
+       _LOGE("send event to pkgmgr server");
+
+       bus = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
+       if (bus == NULL) {
+               _LOGE("g_bus_get_sync is failed.");
+               if (error != NULL) {
+                       _LOGE("error message.[%s]", error->message);
+                       g_error_free(error);
+                       error = NULL;
+               }
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+       }
+
+       _LOGE("g_bus_get_sync is OK.");
+
+       message = g_dbus_message_new_method_call(CAPI_PACKAGE_MANAGER_DBUS_SERVICE,
+            CAPI_PACKAGE_MANAGER_DBUS_PATH,
+            CAPI_PACKAGE_MANAGER_DBUS_INTERFACE,
+            CAPI_PACKAGE_MANAGER_METHOD_DRM_DECRYPT_PACKAGE);
+
+       if (message == NULL) {
+               _LOGE("g_dbus_message_new_method_call is failed.");
+               g_dbus_connection_flush_sync(bus, NULL, NULL);
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+       }
+
+       _LOGE("g_dbus_message_new_method_call is OK.");
+
+       cookie = __get_cookie_from_security_server();
+       if (cookie == NULL) {
+               _LOGE("__get_cookie_from_security_server is NULL");
+               return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+       }
+
+       g_dbus_message_set_body(message, g_variant_new("(sss)", drm_file_path, decrypted_file_path, cookie));
+       reply = g_dbus_connection_send_message_with_reply_sync(bus, message, G_DBUS_SEND_MESSAGE_FLAGS_NONE, G_MAXINT, NULL, NULL, &error);
+       if (reply == NULL) {
+               _LOGE("g_dbus_connection_send_message_with_reply_sync is failed.");
+               if (error != NULL) {
+                       _LOGE("error message.[%s]", error->message);
+                       g_error_free(error);
+                       error = NULL;
+               }
+               g_dbus_connection_flush_sync(bus, NULL, NULL);
+               g_object_unref(message);
+               ret = PACKAGE_MANAGER_ERROR_IO_ERROR;
+               goto catch;
+       }
+
+       _LOGE("g_dbus_connection_send_message_with_reply_sync is OK.");
+
+       body = g_dbus_message_get_body(reply);
+       if (body != NULL) {
+               _LOGE("g_dbus_message_get_body is OK.");
+               g_variant_get(body, "(i)", &ret);
+       } else {
+               _LOGE("body is NULL.");
+       }
+
+       g_dbus_connection_flush_sync(bus, NULL, NULL);
+       g_object_unref(message);
+       g_object_unref(reply);
+
+       if (ret != 0) {
+               _LOGE("drm_tizen_decrypt_package is failed. ret is [%d].", ret);
+               if (ret == -5)
+                       ret = PACKAGE_MANAGER_ERROR_PERMISSION_DENIED;
+               else
+                       ret = PACKAGE_MANAGER_ERROR_IO_ERROR;
+       } else
+               _LOGE("__package_manager_drm_decrypt_package is successful.");
+
+catch:
+       if (cookie)
+               g_free(cookie);
+
+       if (ret != PACKAGE_MANAGER_ERROR_NONE)
+               return package_manager_error(ret, __FUNCTION__, NULL);
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+int package_manager_drm_decrypt_package(const char *drm_file_path, const char *decrypted_file_path)
+{
+       int ret = -1;
+       int retry_cnt = 0;
+
+       _LOGE("package_manager_drm_decrypt_package is called.");
+
+       ret = __package_manager_drm_decrypt_package(drm_file_path, decrypted_file_path);
+
+       while (ret != PACKAGE_MANAGER_ERROR_NONE) {
+               _LOGE("sleep and retry. ret is [%d].", ret);
+               sleep(1);
+
+               if (retry_cnt == CAPI_PACKAGE_MANAGER_RETRY_MAX) {
+                       _LOGE("retry_cnt is max. stop retry.");
+                       return package_manager_error(ret, __FUNCTION__, NULL);
+               }
+
+               retry_cnt++;
+
+               ret = __package_manager_drm_decrypt_package(drm_file_path, decrypted_file_path);
+               if (ret == PACKAGE_MANAGER_ERROR_NONE) {
+                       _LOGE("retry is successful. retry_cnt is [%d].", retry_cnt);
+                       break;
+               }
+       }
+
+       _LOGE("package_manager_drm_decrypt_package is successful.");
+
+       return ret;
+}
+
+int package_manager_info_check_privilege()
+{
+       int retval;
+
+       retval = privilege_checker_check_privilege(TIZEN_PRIVILEGE_PACKAGE_INFO);
+       if (retval != PRIVILEGE_CHECKER_ERR_NONE) {
+               _LOGD("%s is not declared. This might be native application", TIZEN_PRIVILEGE_PACKAGE_INFO);
+       } else {
+               return PACKAGE_MANAGER_ERROR_NONE;
+       }
+
+       retval = privilege_checker_check_privilege(TIZEN_PRIVILEGE_PACKAGE_MANAGER_INFO);
+       if (retval != PRIVILEGE_CHECKER_ERR_NONE) {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__,
+                               "failed to allow privilege");
+       }
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
+int package_manager_admin_check_privilege()
+{
+       int retval;
+
+       retval = privilege_checker_check_privilege(TIZEN_PRIVILEGE_PACKAGE_MANAGER_INSTALL);
+       if (retval != PRIVILEGE_CHECKER_ERR_NONE) {
+               _LOGD("%s is not declared. This might be native application", TIZEN_PRIVILEGE_PACKAGE_MANAGER_INSTALL);
+       } else {
+               return PACKAGE_MANAGER_ERROR_NONE;
+       }
+
+       retval = privilege_checker_check_privilege(TIZEN_PRIVILEGE_PACKAGE_MANAGER_ADMIN);
+       if (retval != PRIVILEGE_CHECKER_ERR_NONE) {
+               return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__,
+                               "failed to allow privilege");
+       }
+
+       return PACKAGE_MANAGER_ERROR_NONE;
+}
+
diff --git a/src/package_manager_internal.c b/src/package_manager_internal.c
deleted file mode 100755 (executable)
index b7b08c3..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * 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;
-}
index ec12a0b..d6fd4c4 100755 (executable)
@@ -31,7 +31,7 @@
 
 #include <package_manager.h>
 
-
+#define UNUSED(x) (void)x
 
 static void _print_help(const char *cmd)
 {
@@ -49,7 +49,8 @@ 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);
-
+       UNUSED(user_data);
+       UNUSED(handle);
        return true;
 }
 
@@ -114,14 +115,15 @@ 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)
+       if (ret < 0) {
                fprintf(stderr, "package_manager_get_package_id_by_app_id fail \n");
+               return PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE;
+       }
 
        fprintf(stderr, "app_id \t= [%s]\n", appid);
        fprintf(stderr, "package_id \t= [%s]\n", package_id);
 
-       if (package_id)
-               free(package_id);
+       free(package_id);
 
        return PACKAGE_MANAGER_ERROR_NONE;
 }