From: jk7744.park Date: Sat, 24 Oct 2015 07:25:17 +0000 (+0900) Subject: tizen 2.4 release X-Git-Tag: accepted/tizen/2.4/mobile/20151029.034544^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fheads%2Faccepted%2Ftizen_2.4_mobile;p=framework%2Fapi%2Fpackage-manager.git tizen 2.4 release --- diff --git a/CMakeLists.txt b/CMakeLists.txt index d5349e9..ffdea85 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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") diff --git a/doc/package_manager_doc.h b/doc/package_manager_doc.h index 25a7f62..b641553 100755 --- a/doc/package_manager_doc.h +++ b/doc/package_manager_doc.h @@ -49,6 +49,22 @@ * */ +/** + * @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 + * + * @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__ */ diff --git a/include/package_info.h b/include/package_info.h index b21f926..8d7c44e 100755 --- a/include/package_info.h +++ b/include/package_info.h @@ -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 * diff --git a/include/package_manager.h b/include/package_manager.h index 846017f..b945b60 100755 --- a/include/package_manager.h +++ b/include/package_manager.h @@ -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_h 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_h 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); + + + +/** * @} */ diff --git a/include/package_manager_internal.h b/include/package_manager_internal.h index 4992139..43281e9 100755 --- a/include/package_manager_internal.h +++ b/include/package_manager_internal.h @@ -22,13 +22,10 @@ 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 diff --git a/packaging/capi-appfw-package-manager.spec b/packaging/capi-appfw-package-manager.spec index ab8ed41..02c53ff 100755 --- a/packaging/capi-appfw-package-manager.spec +++ b/packaging/capi-appfw-package-manager.spec @@ -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} diff --git a/src/package_info.c b/src/package_info.c index 890597d..b3221f4 100755 --- a/src/package_info.c +++ b/src/package_info.c @@ -26,7 +26,8 @@ #include #include - +#include +#include #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; } diff --git a/src/package_manager.c b/src/package_manager.c index aee7e2a..6d68619 100755 --- a/src/package_manager.c +++ b/src/package_manager.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -24,6 +25,7 @@ #include #include +#include #ifdef LOG_TAG #undef LOG_TAG @@ -34,8 +36,28 @@ #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 index b7b08c3..0000000 --- a/src/package_manager_internal.c +++ /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 -#include -#include - -#include -#include -#include - -#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/main.c b/tool/main.c index ec12a0b..d6fd4c4 100755 --- a/tool/main.c +++ b/tool/main.c @@ -31,7 +31,7 @@ #include - +#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; }