Add APIs for multi package install
[platform/core/api/package-manager.git] / src / package_manager.c
index 1791d28..aa8fec4 100644 (file)
@@ -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;