From fd485c96dec89899d853f29f6ddae8012877274e Mon Sep 17 00:00:00 2001 From: Sangyoon Jang Date: Mon, 25 May 2020 18:54:49 +0900 Subject: [PATCH] Add APIs for multi package install Added: - package_manager_request_install_packages() - package_manager_request_install_packages_with_cb() - package_manager_request_uninstall_packages() - package_manager_request_uninstall_with_cb() - package_manager_request_mount_install_packages() - package_manager_request_mount_install_packages_with_cb() Change-Id: I700842643a2228b00b685e92d9fa1822100bc061 Signed-off-by: Sangyoon Jang --- include/package_manager.h | 116 +++++++++++++++ include/package_manager_extension.h | 59 ++++++++ src/package_manager.c | 276 ++++++++++++++++++++++++++++++++++++ 3 files changed, 451 insertions(+) diff --git a/include/package_manager.h b/include/package_manager.h index 3451c6a..e5f5ce0 100644 --- a/include/package_manager.h +++ b/include/package_manager.h @@ -985,6 +985,64 @@ int package_manager_request_install_with_cb(package_manager_request_h request, void *user_data, int *id); +/** + * @platform + * @brief Installs the packages located at the given paths, asynchronously. + * @since_tizen 6.0 + * @privlevel platform + * @privilege %http://tizen.org/privilege/packagemanager.admin + * @param[in] request The request handle + * @param[in] paths The array of absolute paths to the package to be installed + * @param[in] n_paths The number of paths in array + * @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_PERMISSION_DENIED Permission denied + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE No such package + * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY Out of memory + * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR I/O error + * @retval #PACKAGE_MANAGER_ERROR_SYSTEM_ERROR Severe system error + * @see package_manager_request_uninstall_packages() + */ +int package_manager_request_install_packages(package_manager_request_h request, + const char **paths, + int n_paths, + int *id); + +/** + * @platform + * @brief Installs the packages located at the given paths, asynchronously. + * @details The progress of the request is asynchronously received by the callback function. + * The @a callback is the individual callback only called for the current API call. + * The @a callback is the only callback called, even if another callback was set for this request + * with package_manager_request_set_event_cb(). + * @since_tizen 6.0 + * @privlevel platform + * @privilege %http://tizen.org/privilege/packagemanager.admin + * @param[in] request The request handle + * @param[in] paths The array of absolute paths to the package to be installed + * @param[in] n_paths The number of paths in array + * @param[in] callback The callback function to be invoked + * @param[in] user_data The user data to be passed to the callback function + * @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_PERMISSION_DENIED Permission denied + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE No such package + * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY Out of memory + * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR I/O error + * @retval #PACKAGE_MANAGER_ERROR_SYSTEM_ERROR Severe system error + */ +int package_manager_request_install_packages_with_cb(package_manager_request_h request, + const char **paths, + int n_paths, + package_manager_request_event_cb callback, + void *user_data, + int *id); /** * @platform @@ -1031,6 +1089,64 @@ int package_manager_request_uninstall_with_cb(package_manager_request_h request, void *user_data, int *id); +/** + * @platform + * @brief Uninstalls the packages with the given names, asynchronously. + * @since_tizen 6.0 + * @privlevel platform + * @privilege %http://tizen.org/privilege/packagemanager.admin + * @param[in] request The request handle + * @param[in] names The array of names of the package to be uninstalled + * @param[in] n_names The number of names in array + * @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_PERMISSION_DENIED Permission denied + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE No such package + * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY Out of memory + * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR I/O error + * @retval #PACKAGE_MANAGER_ERROR_SYSTEM_ERROR Severe system error + * @see package_manager_request_uninstall_packages() + */ +int package_manager_request_uninstall_packages(package_manager_request_h request, + const char **names, + int n_names, + int *id); + +/** + * @platform + * @brief Uninstalls the packages with the given names, asynchronously. + * @details The progress of the request is asynchronously received by the callback function. + * The @a callback is the individual callback only called for the current API call. + * The @a callback is the only callback called, even if another callback was set for this request + * with package_manager_request_set_event_cb(). + * @since_tizen 6.0 + * @privlevel platform + * @privilege %http://tizen.org/privilege/packagemanager.admin + * @param[in] request The request handle + * @param[in] names The array of names of the package to be uninstalled + * @param[in] n_names The number of names in array + * @param[in] callback The callback function to be invoked + * @param[in] user_data The user data to be passed to the callback function + * @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_PERMISSION_DENIED Permission denied + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE No such package + * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY Out of memory + * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR I/O error + * @retval #PACKAGE_MANAGER_ERROR_SYSTEM_ERROR Severe system error + */ +int package_manager_request_uninstall_packages_with_cb(package_manager_request_h request, + const char **names, + int n_names, + package_manager_request_event_cb callback, + void *user_data, + int *id); /** * @platform diff --git a/include/package_manager_extension.h b/include/package_manager_extension.h index d003b08..00eb521 100644 --- a/include/package_manager_extension.h +++ b/include/package_manager_extension.h @@ -79,6 +79,65 @@ int package_manager_request_mount_install_with_cb(package_manager_request_h requ int *id); /** + * @platform + * @brief Installs the packages located at the given paths as the runtime mountable package, asynchronously. + * @since_tizen 6.0 + * @privlevel platform + * @privilege %http://tizen.org/privilege/packagemanager.admin + * @param[in] request The request handle + * @param[in] paths The array of absolute paths to the package to be installed + * @param[in] n_paths The number of paths in array + * @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_PERMISSION_DENIED Permission denied + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE No such package + * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY Out of memory + * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR I/O error + * @retval #PACKAGE_MANAGER_ERROR_SYSTEM_ERROR Severe system error + * @see package_manager_request_uninstall_packages() + */ +int package_manager_request_mount_install_packages(package_manager_request_h request, + const char **paths, + int n_paths, + int *id); + +/** + * @platform + * @brief Installs the packages located at the given paths as the runtime mountable package, asynchronously. + * @details The progress of the request is asynchronously received by the callback function. + * The @a callback is the individual callback only called for the current API call. + * The @a callback is the only callback called, even if another callback was set for this request + * with package_manager_request_set_event_cb(). + * @since_tizen 6.0 + * @privlevel platform + * @privilege %http://tizen.org/privilege/packagemanager.admin + * @param[in] request The request handle + * @param[in] paths The array of absolute paths to the package to be installed + * @param[in] n_paths The number of paths in array + * @param[in] callback The callback function to be invoked + * @param[in] user_data The user data to be passed to the callback function + * @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_PERMISSION_DENIED Permission denied + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE No such package + * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY Out of memory + * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR I/O error + * @retval #PACKAGE_MANAGER_ERROR_SYSTEM_ERROR Severe system error + */ +int package_manager_request_mount_install_packages_with_cb(package_manager_request_h request, + const char **paths, + int n_paths, + package_manager_request_event_cb callback, + void *user_data, + int *id); + +/** * @} */ diff --git a/src/package_manager.c b/src/package_manager.c index 1791d28..aa8fec4 100644 --- a/src/package_manager.c +++ b/src/package_manager.c @@ -733,6 +733,62 @@ static int __request_install(package_manager_request_h request, return PACKAGE_MANAGER_ERROR_NONE; } +static int __request_install_packages(package_manager_request_h request, + const char **paths, int n_paths, pkgmgr_handler event_cb, + int *id) +{ + int retval; + retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN); + if (retval != PACKAGE_MANAGER_ERROR_NONE) + return retval; + + if (package_manager_client_validate_handle(request)) + return package_manager_error( + PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, + __FUNCTION__, NULL); + + if (paths == NULL || n_paths < 1) + return package_manager_error( + PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, + __FUNCTION__, NULL); + int request_id = 0; + request_id = pkgmgr_client_install_packages(request->pc, paths, + n_paths, event_cb ? event_cb : request_event_handler, + request); + + if (request_id == PKGMGR_R_EINVAL) + return package_manager_error( + PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, + __FUNCTION__, NULL); + else if (request_id == PKGMGR_R_ENOPKG) + return package_manager_error( + PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, + __FUNCTION__, NULL); + else if (request_id == PKGMGR_R_ENOMEM) + return package_manager_error( + PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, + __FUNCTION__, NULL); + else if (request_id == PKGMGR_R_EIO) + return package_manager_error( + PACKAGE_MANAGER_ERROR_IO_ERROR, + __FUNCTION__, NULL); + else if (request_id == PKGMGR_R_EPRIV) + return package_manager_error( + PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, + __FUNCTION__, NULL); + else if (request_id == PKGMGR_R_ESYSTEM || + request_id == PKGMGR_R_ECOMM || + request_id == PKGMGR_R_ERROR) + return package_manager_error( + PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, + __FUNCTION__, NULL); + + if (id) + *id = request_id; + + return PACKAGE_MANAGER_ERROR_NONE; +} + static int __request_uninstall(package_manager_request_h request, const char *name, pkgmgr_handler event_cb, int *id) { @@ -770,6 +826,62 @@ static int __request_uninstall(package_manager_request_h request, return PACKAGE_MANAGER_ERROR_NONE; } +static int __request_uninstall_packages(package_manager_request_h request, + const char **names, int n_names, pkgmgr_handler event_cb, + int *id) +{ + int retval; + retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN); + if (retval != PACKAGE_MANAGER_ERROR_NONE) + return retval; + + if (package_manager_client_validate_handle(request)) + return package_manager_error( + PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, + __FUNCTION__, NULL); + + if (names == NULL || n_names < 1) + return package_manager_error( + PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, + __FUNCTION__, NULL); + int request_id = 0; + request_id = pkgmgr_client_uninstall_packages(request->pc, names, + n_names, event_cb ? event_cb : request_event_handler, + request); + + if (request_id == PKGMGR_R_EINVAL) + return package_manager_error( + PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, + __FUNCTION__, NULL); + else if (request_id == PKGMGR_R_ENOPKG) + return package_manager_error( + PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, + __FUNCTION__, NULL); + else if (request_id == PKGMGR_R_ENOMEM) + return package_manager_error( + PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, + __FUNCTION__, NULL); + else if (request_id == PKGMGR_R_EIO) + return package_manager_error( + PACKAGE_MANAGER_ERROR_IO_ERROR, + __FUNCTION__, NULL); + else if (request_id == PKGMGR_R_EPRIV) + return package_manager_error( + PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, + __FUNCTION__, NULL); + else if (request_id == PKGMGR_R_ESYSTEM || + request_id == PKGMGR_R_ECOMM || + request_id == PKGMGR_R_ERROR) + return package_manager_error( + PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, + __FUNCTION__, NULL); + + if (id) + *id = request_id; + + return PACKAGE_MANAGER_ERROR_NONE; +} + static int __request_move(package_manager_request_h request, const char *name, package_manager_move_type_e move_type, pkgmgr_handler event_cb, int *id) @@ -846,6 +958,61 @@ static int __request_mount_install(package_manager_request_h request, return PACKAGE_MANAGER_ERROR_NONE; } +static int __request_mount_install_packages(package_manager_request_h request, + const char **paths, int n_paths, pkgmgr_handler event_cb, + int *id) +{ + int retval; + retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN); + if (retval != PACKAGE_MANAGER_ERROR_NONE) + return retval; + + if (package_manager_client_validate_handle(request)) + return package_manager_error( + PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, + __FUNCTION__, NULL); + + if (paths == NULL || n_paths < 1) + return package_manager_error( + PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, + __FUNCTION__, NULL); + int request_id = 0; + request_id = pkgmgr_client_mount_install_packages(request->pc, paths, + n_paths, event_cb ? event_cb : request_event_handler, + request); + + if (request_id == PKGMGR_R_EINVAL) + return package_manager_error( + PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, + __FUNCTION__, NULL); + else if (request_id == PKGMGR_R_ENOPKG) + return package_manager_error( + PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, + __FUNCTION__, NULL); + else if (request_id == PKGMGR_R_ENOMEM) + return package_manager_error( + PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, + __FUNCTION__, NULL); + else if (request_id == PKGMGR_R_EIO) + return package_manager_error( + PACKAGE_MANAGER_ERROR_IO_ERROR, + __FUNCTION__, NULL); + else if (request_id == PKGMGR_R_EPRIV) + return package_manager_error( + PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, + __FUNCTION__, NULL); + else if (request_id == PKGMGR_R_ESYSTEM || + request_id == PKGMGR_R_ECOMM || + request_id == PKGMGR_R_ERROR) + return package_manager_error( + PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, + __FUNCTION__, NULL); + + if (id) + *id = request_id; + + return PACKAGE_MANAGER_ERROR_NONE; +} API int package_manager_request_install(package_manager_request_h request, const char *path, int *id) @@ -877,6 +1044,42 @@ API int package_manager_request_install_with_cb(package_manager_request_h reques return ret; } +API int package_manager_request_install_packages( + package_manager_request_h request, const char **paths, + int n_paths, int *id) +{ + return __request_install_packages(request, paths, n_paths, NULL, id); +} + +API int package_manager_request_install_packages_with_cb( + package_manager_request_h request, const char **paths, + int n_paths, package_manager_request_event_cb callback, + void *user_data, int *id) +{ + int ret; + int req_id = 0; + + if (request->request_cb_table == NULL) + __initialize_request_cb_table(request); + + ret = __request_install_packages(request, paths, n_paths, + internal_request_callback, &req_id); + + if (req_id > 0) { + ret = __insert_request_cb_info(request, req_id, callback, + user_data); + if (ret < 0) + return package_manager_error( + PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, + __FUNCTION__, + "failed to create request cb info"); + if (id) + *id = req_id; + } + + return ret; +} + API int package_manager_request_uninstall(package_manager_request_h request, const char *name, int *id) { @@ -907,6 +1110,42 @@ API int package_manager_request_uninstall_with_cb(package_manager_request_h requ return ret; } +API int package_manager_request_uninstall_packages( + package_manager_request_h request, const char **names, + int n_names, int *id) +{ + return __request_uninstall_packages(request, names, n_names, NULL, id); +} + +API int package_manager_request_uninstall_packages_with_cb( + package_manager_request_h request, const char **names, + int n_names, package_manager_request_event_cb callback, + void *user_data, int *id) +{ + int ret; + int req_id = 0; + + if (request->request_cb_table == NULL) + __initialize_request_cb_table(request); + + ret = __request_uninstall_packages(request, names, n_names, + internal_request_callback, &req_id); + + if (req_id > 0) { + ret = __insert_request_cb_info(request, req_id, callback, + user_data); + if (ret < 0) + return package_manager_error( + PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, + __FUNCTION__, + "failed to create request cb info"); + if (id) + *id = req_id; + } + + return ret; +} + API int package_manager_request_move(package_manager_request_h request, const char *name, package_manager_move_type_e move_type) { @@ -967,6 +1206,43 @@ API int package_manager_request_mount_install_with_cb(package_manager_request_h return ret; } +API int package_manager_request_mount_install_packages( + package_manager_request_h request, const char **paths, + int n_paths, int *id) +{ + return __request_mount_install_packages(request, paths, n_paths, NULL, + id); +} + +API int package_manager_request_mount_install_packages_with_cb( + package_manager_request_h request, const char **paths, + int n_paths, package_manager_request_event_cb callback, + void *user_data, int *id) +{ + int ret; + int req_id = 0; + + if (request->request_cb_table == NULL) + __initialize_request_cb_table(request); + + ret = __request_mount_install_packages(request, paths, n_paths, + internal_request_callback, &req_id); + + if (req_id > 0) { + ret = __insert_request_cb_info(request, req_id, callback, + user_data); + if (ret < 0) + return package_manager_error( + PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, + __FUNCTION__, + "failed to create request cb info"); + if (id) + *id = req_id; + } + + return ret; +} + API int package_manager_create(package_manager_h *manager) { int retval; -- 2.7.4