2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
22 #include <package-manager.h>
23 #include <pkgmgr_installer.h>
24 #include <pkgmgr-info.h>
25 #include <tzplatform_config.h>
27 #include "package_manager.h"
28 #include "package_manager_internal.h"
30 static GHashTable *__cb_table = NULL;
32 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
33 typedef struct _event_info {
35 package_manager_event_type_e event_type;
36 package_manager_event_state_e event_state;
37 struct _event_info *next;
40 struct package_manager_s {
46 package_manager_event_cb event_cb;
47 package_manager_global_event_cb global_event_cb;
48 void *global_user_data;
52 struct package_manager_request_s {
62 package_manager_request_event_cb event_cb;
67 typedef struct package_size_info {
72 long long external_data_size;
73 long long external_cache_size;
74 long long external_app_size;
75 } package_size_info_t;
77 struct package_manager_filter_s {
78 pkgmgrinfo_pkginfo_filter_h pkgmgrinfo_pkginfo_filter;
81 static int package_manager_request_new_id()
83 static int request_handle_id = 0;
84 return request_handle_id++;
87 static int package_manager_new_id()
89 static int manager_handle_id = 0;
90 return manager_handle_id++;
93 API int package_manager_request_create(package_manager_request_h *request)
95 struct package_manager_request_s *package_manager_request;
97 if (request == NULL) {
100 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
104 package_manager_request =
105 calloc(1, sizeof(struct package_manager_request_s));
106 if (package_manager_request == NULL) {
108 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
110 "failed to create a package_manager handle");
113 package_manager_request->ctype = PC_REQUEST;
114 package_manager_request->pc = pkgmgr_client_new(PC_REQUEST);
115 if (package_manager_request->pc == NULL) {
116 free(package_manager_request);
118 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
120 "failed to create a package_manager client");
123 package_manager_request->handle_id = package_manager_request_new_id();
125 *request = package_manager_request;
127 return PACKAGE_MANAGER_ERROR_NONE;
130 static int package_manager_client_validate_handle(package_manager_request_h
133 if (request == NULL || request->pc == NULL)
134 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
136 return PACKAGE_MANAGER_ERROR_NONE;
139 API int package_manager_request_destroy(package_manager_request_h request)
141 if (package_manager_client_validate_handle(request)) {
143 package_manager_error
144 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
148 pkgmgr_client_free(request->pc);
152 return PACKAGE_MANAGER_ERROR_NONE;
155 API int package_manager_request_set_event_cb(package_manager_request_h request,
156 package_manager_request_event_cb
157 callback, void *user_data)
161 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
162 if (retval != PACKAGE_MANAGER_ERROR_NONE)
165 if (package_manager_client_validate_handle(request)) {
167 package_manager_error
168 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
172 request->event_cb = callback;
173 request->user_data = user_data;
175 return PACKAGE_MANAGER_ERROR_NONE;
178 API int package_manager_request_unset_event_cb(package_manager_request_h request)
180 if (package_manager_client_validate_handle(request))
181 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
183 request->event_cb = NULL;
184 request->user_data = NULL;
186 return PACKAGE_MANAGER_ERROR_NONE;
189 API int package_manager_request_set_type(package_manager_request_h request,
190 const char *pkg_type)
192 if (package_manager_client_validate_handle(request)) {
194 package_manager_error
195 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
199 request->pkg_type = pkg_type;
201 return PACKAGE_MANAGER_ERROR_NONE;
204 API int package_manager_request_set_mode(package_manager_request_h request,
205 package_manager_request_mode_e mode)
207 if (package_manager_client_validate_handle(request)) {
209 package_manager_error
210 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
214 if (mode == PACKAGE_MANAGER_REQUEST_MODE_QUIET)
215 request->mode = PM_QUIET;
217 request->mode = PM_DEFAULT;
219 return PACKAGE_MANAGER_ERROR_NONE;
222 int package_manager_request_set_tep(package_manager_request_h request,
223 const char *tep_path)
227 if (package_manager_client_validate_handle(request) || tep_path == NULL) {
229 package_manager_error
230 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
234 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
235 if (retval != PACKAGE_MANAGER_ERROR_NONE)
238 if (request->tep_path)
239 free((void *)request->tep_path);
241 request->tep_path = strdup(tep_path);
242 request->tep_move = true;
244 if (request ->tep_path == NULL)
245 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
247 return PACKAGE_MANAGER_ERROR_NONE;
250 static int package_manager_get_event_type(const char *key,
251 package_manager_event_type_e *
255 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
257 if (strcasecmp(key, PKGMGR_INSTALLER_INSTALL_EVENT_STR) == 0)
258 *event_type = PACKAGE_MANAGER_EVENT_TYPE_INSTALL;
259 else if (strcasecmp(key, PKGMGR_INSTALLER_UNINSTALL_EVENT_STR) == 0)
260 *event_type = PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL;
261 else if (strcasecmp(key, PKGMGR_INSTALLER_UPGRADE_EVENT_STR) == 0)
262 *event_type = PACKAGE_MANAGER_EVENT_TYPE_UPDATE;
264 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
266 return PACKAGE_MANAGER_ERROR_NONE;
269 static int __add_event_info(event_info **head, int req_id,
270 package_manager_event_type_e event_type,
271 package_manager_event_state_e event_state)
273 event_info *evt_info;
277 evt_info = (event_info *) calloc(1, sizeof(event_info));
278 if (evt_info == NULL) {
279 _LOGD("calloc failed");
282 evt_info->req_id = req_id;
283 evt_info->event_type = event_type;
284 evt_info->next = NULL;
289 current = prev = *head;
292 current = current->next;
295 prev->next = evt_info;
301 static int __find_event_info(event_info **head, int req_id,
302 package_manager_event_type_e *event_type,
303 package_manager_event_state_e *event_state)
310 _LOGE("tmp is NULL");
314 _LOGD("tmp->req_id %d, event_type %d", tmp->req_id, event_type);
317 if (tmp->req_id == req_id) {
318 *event_type = tmp->event_type;
326 static int __update_event_info(event_info **head, int req_id,
327 package_manager_event_type_e event_type,
328 package_manager_event_state_e event_state)
330 package_manager_event_type_e evt_type;
331 package_manager_event_state_e evt_state;
334 if (__find_event_info(head, req_id, &evt_type, &evt_state) != 0)
335 __add_event_info(head, req_id, event_type, event_state);
340 _LOGE("tmp is NULL");
345 if (tmp->req_id == req_id) {
346 tmp->event_type = event_type;
357 static int __remove_event_info(event_info **head request, int req_id)
368 if (current->next->req_id == req_id) {
370 current->next = current->next->next;
382 static int request_event_handler(uid_t target_uid, int req_id, const char *pkg_type,
383 const char *pkg_name, const char *key,
384 const char *val, const void *pmsg, void *data)
387 package_manager_event_type_e event_type = -1;
388 package_manager_event_state_e event_state = -1;
390 _LOGD("request_event_handler is called");
392 package_manager_request_h request = data;
394 if (strcasecmp(key, "start") == 0) {
395 ret = package_manager_get_event_type(val, &event_type);
396 if (ret != PACKAGE_MANAGER_ERROR_NONE)
397 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
399 __add_event_info(&(request->head), req_id, event_type,
400 PACKAGE_MANAGER_EVENT_STATE_STARTED);
402 if (request->event_cb)
403 request->event_cb(req_id, pkg_type, pkg_name,
405 PACKAGE_MANAGER_EVENT_STATE_STARTED,
406 0, PACKAGE_MANAGER_ERROR_NONE, request->user_data);
408 } else if (strcasecmp(key, "install_percent") == 0
409 || strcasecmp(key, "progress_percent") == 0) {
410 if (__find_event_info
411 (&(request->head), req_id, &event_type,
412 &event_state) == 0) {
413 __update_event_info(&(request->head), req_id,
415 PACKAGE_MANAGER_EVENT_STATE_PROCESSING);
416 if (request->event_cb)
417 request->event_cb(req_id, pkg_type, pkg_name,
419 PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
421 PACKAGE_MANAGER_ERROR_NONE,
425 } else if (strcasecmp(key, "error") == 0) {
426 if (strcasecmp(key, "0") != 0) {
427 if (__find_event_info
428 (&(request->head), req_id, &event_type,
429 &event_state) == 0) {
430 __update_event_info(&(request->head), req_id,
432 PACKAGE_MANAGER_EVENT_STATE_FAILED);
435 if (request->event_cb)
436 request->event_cb(req_id, pkg_type,
437 pkg_name, event_type,
438 PACKAGE_MANAGER_EVENT_STATE_FAILED,
440 PACKAGE_MANAGER_ERROR_NONE,
444 } else if (strcasecmp(key, "end") == 0) {
445 if (__find_event_info
446 (&(request->head), req_id, &event_type,
447 &event_state) == 0) {
448 if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
449 if (request->event_cb)
450 request->event_cb(req_id, pkg_type,
451 pkg_name, event_type,
452 PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
454 PACKAGE_MANAGER_ERROR_NONE,
458 if (strcasecmp(key, "ok") != 0)
459 if (request->event_cb)
460 request->event_cb(req_id, pkg_type,
461 pkg_name, event_type,
462 PACKAGE_MANAGER_EVENT_STATE_FAILED,
464 PACKAGE_MANAGER_ERROR_NONE,
469 return PACKAGE_MANAGER_ERROR_NONE;
472 API int package_manager_request_install(package_manager_request_h request,
473 const char *path, int *id)
477 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
478 if (retval != PACKAGE_MANAGER_ERROR_NONE)
481 if (package_manager_client_validate_handle(request))
482 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
485 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
488 request->pkg_path = path;
489 uid_t uid = getuid();
490 if (uid != GLOBAL_USER)
491 request_id = pkgmgr_client_usr_install(request->pc, request->pkg_type, NULL,
492 request->pkg_path, NULL,
493 request->mode, request_event_handler,
497 request_id = pkgmgr_client_install(request->pc, request->pkg_type, NULL,
498 request->pkg_path, NULL,
499 request->mode, request_event_handler,
502 if (request_id == PKGMGR_R_EINVAL)
503 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
504 else if (request_id == PKGMGR_R_ENOPKG)
505 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
506 else if (request_id == PKGMGR_R_ENOMEM)
507 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
508 else if (request_id == PKGMGR_R_EIO)
509 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
510 else if (request_id == PKGMGR_R_EPRIV)
511 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
512 else if (request_id == PKGMGR_R_ESYSTEM || request_id == PKGMGR_R_ECOMM || request_id == PKGMGR_R_ERROR)
513 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
517 return PACKAGE_MANAGER_ERROR_NONE;
520 API int package_manager_request_uninstall(package_manager_request_h request,
521 const char *name, int *id)
525 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
526 if (retval != PACKAGE_MANAGER_ERROR_NONE)
529 if (package_manager_client_validate_handle(request))
530 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
533 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
536 request->pkg_name = name;
537 uid_t uid = getuid();
538 if (uid != GLOBAL_USER)
539 request_id = pkgmgr_client_usr_uninstall(request->pc, request->pkg_type,
540 request->pkg_name, request->mode,
541 request_event_handler, request, uid);
543 request_id = pkgmgr_client_uninstall(request->pc, request->pkg_type,
544 request->pkg_name, request->mode,
545 request_event_handler, request);
547 if (request_id == PKGMGR_R_EINVAL)
548 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
549 else if (request_id == PKGMGR_R_ENOPKG)
550 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
551 else if (request_id == PKGMGR_R_ENOMEM)
552 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
553 else if (request_id == PKGMGR_R_EIO)
554 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
555 else if (request_id == PKGMGR_R_EPRIV)
556 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
557 else if (request_id == PKGMGR_R_ESYSTEM || request_id == PKGMGR_R_ECOMM || request_id == PKGMGR_R_ERROR)
558 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
562 return PACKAGE_MANAGER_ERROR_NONE;
565 API int package_manager_request_move(package_manager_request_h request,
566 const char *name, package_manager_move_type_e move_type)
570 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
571 if (retval != PACKAGE_MANAGER_ERROR_NONE)
574 if (package_manager_client_validate_handle(request))
575 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
578 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
581 request->pkg_name = name;
582 uid_t uid = getuid();
583 if (uid != GLOBAL_USER)
584 ret = pkgmgr_client_usr_move(request->pc, request->pkg_type, request->pkg_name,
585 move_type, request->mode, uid);
587 ret = pkgmgr_client_move(request->pc, request->pkg_type, request->pkg_name,
588 move_type, request->mode);
589 if (ret == PKGMGR_R_EINVAL)
590 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
591 else if (ret == PKGMGR_R_ENOPKG)
592 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
593 else if (ret == PKGMGR_R_ENOMEM)
594 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
595 else if (ret == PKGMGR_R_EIO)
596 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
597 else if (ret == PKGMGR_R_EPRIV)
598 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
599 else if (ret == PKGMGR_R_ESYSTEM || ret == PKGMGR_R_ECOMM || ret == PKGMGR_R_ERROR)
600 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
602 return PACKAGE_MANAGER_ERROR_NONE;
605 API int package_manager_create(package_manager_h *manager)
609 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
610 if (retval != PACKAGE_MANAGER_ERROR_NONE)
613 struct package_manager_s *package_manager = NULL;
615 if (manager == NULL) {
617 package_manager_error
618 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
622 package_manager = calloc(1, sizeof(struct package_manager_s));
623 if (package_manager == NULL) {
625 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
627 "failed to create a package_manager handle");
630 package_manager->ctype = PC_LISTENING;
631 package_manager->pc = pkgmgr_client_new(PC_LISTENING);
632 if (package_manager->pc == NULL) {
633 free(package_manager);
635 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
637 "failed to create a package_manager client");
640 package_manager->handle_id = package_manager_new_id();
642 *manager = package_manager;
644 return PACKAGE_MANAGER_ERROR_NONE;
647 static int package_manager_validate_handle(package_manager_h manager)
649 if (manager == NULL || manager->pc == NULL)
650 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
652 return PACKAGE_MANAGER_ERROR_NONE;
655 API int package_manager_destroy(package_manager_h manager)
657 if (package_manager_validate_handle(manager)) {
659 package_manager_error
660 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
664 pkgmgr_client_free(manager->pc);
668 return PACKAGE_MANAGER_ERROR_NONE;
671 static int __add_event(event_info **head, int req_id,
672 package_manager_event_type_e event_type,
673 package_manager_event_state_e event_state)
675 event_info *evt_info;
677 evt_info = (event_info *) calloc(1, sizeof(event_info));
678 if (evt_info == NULL) {
679 _LOGD("calloc failed");
682 evt_info->req_id = req_id;
683 evt_info->event_type = event_type;
684 evt_info->next = NULL;
691 static int __find_event(event_info **head, int req_id,
692 package_manager_event_type_e *event_type,
693 package_manager_event_state_e *event_state)
700 _LOGE("tmp is NULL");
704 *event_type = tmp->event_type;
708 static int __update_event(event_info **head, int req_id,
709 package_manager_event_type_e event_type,
710 package_manager_event_state_e event_state)
712 package_manager_event_type_e evt_type;
713 package_manager_event_state_e evt_state;
716 if (__find_event_info(head, req_id, &evt_type, &evt_state) != 0)
717 __add_event_info(head, req_id, event_type, event_state);
722 _LOGE("tmp is NULL");
726 tmp->event_type = event_type;
733 /* App Event Listening Policy:
734 * +----------------+------------+---------------+------------------+
735 * |Listener \ Type |Global Event|My User's Event|Other user's Event|
736 * +----------------+------------+---------------+------------------+
737 * |User Process App| Grant | Grant | Deny |
738 * +----------------+------------+---------------+------------------+
739 * |Platform module | Grant | Grant | Grant |
740 * +----------------+------------+---------------+------------------+
741 * UID assignment policy:
742 * https://wiki.tizen.org/wiki/Security/User_and_group_ID_assignment_policy
744 #define REGULAR_USER 5000
745 static int __validate_event_signal(uid_t target_uid)
747 uid_t self = getuid();
749 if (self == target_uid)
752 if (self < REGULAR_USER)
758 static int global_event_handler(uid_t target_uid, int req_id, const char *pkg_type,
759 const char *pkg_name, const char *key,
760 const char *val, const void *pmsg, void *data)
763 package_manager_event_type_e event_type = -1;
764 package_manager_event_state_e event_state = -1;
765 uid_t uid = target_uid;
767 _LOGD("global_event_handler is called");
769 package_manager_h manager = data;
771 if (target_uid == GLOBAL_USER)
774 if (__validate_event_signal(uid))
775 return PACKAGE_MANAGER_ERROR_NONE;
777 if (strcasecmp(key, "start") == 0) {
778 ret = package_manager_get_event_type(val, &event_type);
779 if (ret != PACKAGE_MANAGER_ERROR_NONE)
780 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
782 __add_event(&(manager->head), req_id, event_type,
783 PACKAGE_MANAGER_EVENT_STATE_STARTED);
785 if (manager->event_cb && getuid() == uid)
786 manager->event_cb(pkg_type, pkg_name,
788 PACKAGE_MANAGER_EVENT_STATE_STARTED,
789 0, PACKAGE_MANAGER_ERROR_NONE, manager->user_data);
790 if (manager->global_event_cb)
791 manager->global_event_cb(target_uid, pkg_type, pkg_name,
793 PACKAGE_MANAGER_EVENT_STATE_STARTED,
794 0, PACKAGE_MANAGER_ERROR_NONE, manager->global_user_data);
796 } else if (strcasecmp(key, "install_percent") == 0
797 || strcasecmp(key, "progress_percent") == 0) {
799 (&(manager->head), req_id, &event_type,
800 &event_state) == 0) {
801 __update_event(&(manager->head), req_id,
803 PACKAGE_MANAGER_EVENT_STATE_PROCESSING);
804 if (manager->event_cb && getuid() == uid)
805 manager->event_cb(pkg_type, pkg_name,
807 PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
809 PACKAGE_MANAGER_ERROR_NONE,
811 if (manager->global_event_cb)
812 manager->global_event_cb(target_uid, pkg_type, pkg_name,
814 PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
816 PACKAGE_MANAGER_ERROR_NONE,
817 manager->global_user_data);
820 } else if (strcasecmp(key, "error") == 0) {
821 if (strcasecmp(key, "0") != 0) {
823 (&(manager->head), req_id, &event_type,
824 &event_state) == 0) {
825 __update_event(&(manager->head), req_id,
827 PACKAGE_MANAGER_EVENT_STATE_FAILED);
830 if (manager->event_cb && getuid() == uid)
831 manager->event_cb(pkg_type,
832 pkg_name, event_type,
833 PACKAGE_MANAGER_EVENT_STATE_FAILED,
835 PACKAGE_MANAGER_ERROR_NONE,
837 if (manager->global_event_cb)
838 manager->global_event_cb(target_uid, pkg_type,
839 pkg_name, event_type,
840 PACKAGE_MANAGER_EVENT_STATE_FAILED,
842 PACKAGE_MANAGER_ERROR_NONE,
843 manager->global_user_data);
845 } else if (strcasecmp(key, "end") == 0) {
847 (&(manager->head), req_id, &event_type,
848 &event_state) == 0) {
849 if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
850 if (manager->event_cb && getuid() == uid)
851 manager->event_cb(pkg_type,
852 pkg_name, event_type,
853 PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
855 PACKAGE_MANAGER_ERROR_NONE,
857 if (manager->global_event_cb)
858 manager->global_event_cb(target_uid, pkg_type,
859 pkg_name, event_type,
860 PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
862 PACKAGE_MANAGER_ERROR_NONE,
863 manager->global_user_data);
866 if (strcasecmp(key, "ok") != 0) {
867 if (manager->event_cb && getuid() == uid)
868 manager->event_cb(pkg_type,
869 pkg_name, event_type,
870 PACKAGE_MANAGER_EVENT_STATE_FAILED,
872 PACKAGE_MANAGER_ERROR_NONE,
874 if (manager->global_event_cb)
875 manager->global_event_cb(target_uid, pkg_type,
876 pkg_name, event_type,
877 PACKAGE_MANAGER_EVENT_STATE_FAILED,
879 PACKAGE_MANAGER_ERROR_NONE,
880 manager->global_user_data);
885 return PACKAGE_MANAGER_ERROR_NONE;
888 API int package_manager_set_event_status(package_manager_h manager, int status_type)
893 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
895 retval = pkgmgrinfo_client_set_status_type(manager->pc, status_type);
898 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
900 return PACKAGE_MANAGER_ERROR_NONE;
903 API int package_manager_set_event_cb(package_manager_h manager,
904 package_manager_event_cb callback,
909 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
910 if (retval != PACKAGE_MANAGER_ERROR_NONE)
913 if (package_manager_validate_handle(manager)) {
915 package_manager_error
916 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
920 manager->event_cb = callback;
921 manager->user_data = user_data;
923 pkgmgr_client_listen_status(manager->pc, global_event_handler, manager);
925 return PACKAGE_MANAGER_ERROR_NONE;
928 API int package_manager_unset_event_cb(package_manager_h manager)
930 if (manager == NULL) {
932 package_manager_error
933 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
938 manager->event_cb = NULL;
939 manager->user_data = NULL;
941 if (manager->global_event_cb == NULL) {
942 retval = pkgmgr_client_remove_listen_status(manager->pc);
943 if (retval == PKGMGR_R_EINVAL)
945 package_manager_error
946 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
948 else if (retval == PKGMGR_R_ERROR)
950 package_manager_error
951 (PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__,
955 return PACKAGE_MANAGER_ERROR_NONE;
958 API int package_manager_set_global_event_cb(package_manager_h manager,
959 package_manager_global_event_cb callback,
964 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
965 if (retval != PACKAGE_MANAGER_ERROR_NONE)
968 if (package_manager_validate_handle(manager)) {
970 package_manager_error
971 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
975 if (getuid() >= REGULAR_USER) {
976 _LOGE("Regular user is not allowed for this api");
977 return PACKAGE_MANAGER_ERROR_PERMISSION_DENIED;
980 manager->global_event_cb = callback;
981 manager->global_user_data = user_data;
983 pkgmgr_client_listen_status(manager->pc, global_event_handler, manager);
985 return PACKAGE_MANAGER_ERROR_NONE;
988 API int package_manager_unset_global_event_cb(package_manager_h manager)
992 if (manager == NULL) {
994 package_manager_error
995 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
999 manager->global_event_cb = NULL;
1000 manager->global_user_data = NULL;
1002 if (manager->event_cb == NULL) {
1003 retval = pkgmgr_client_remove_listen_status(manager->pc);
1004 if (retval == PKGMGR_R_EINVAL)
1006 package_manager_error
1007 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1009 else if (retval == PKGMGR_R_ERROR)
1011 package_manager_error
1012 (PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__,
1016 return PACKAGE_MANAGER_ERROR_NONE;
1019 API int package_manager_get_package_id_by_app_id(const char *app_id, char **package_id)
1021 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo;
1023 char *pkg_id = NULL;
1024 char *pkg_id_dup = NULL;
1026 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1027 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1030 if (app_id == NULL || package_id == NULL)
1031 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1033 uid_t uid = getuid();
1034 if (uid != GLOBAL_USER) {
1035 if (pkgmgrinfo_appinfo_get_usr_appinfo(app_id, uid, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1036 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1038 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1039 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1041 retval = pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id);
1042 if (retval != PMINFO_R_OK)
1043 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1045 pkg_id_dup = strdup(pkg_id);
1046 if (pkg_id_dup == NULL) {
1047 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1048 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1051 *package_id = pkg_id_dup;
1053 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1055 return PACKAGE_MANAGER_ERROR_NONE;
1058 API int package_manager_get_package_info(const char *package_id, package_info_h *package_info)
1061 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1062 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1065 retval = package_info_get_package_info(package_id, package_info);
1067 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1068 return package_manager_error(retval, __FUNCTION__, NULL);
1070 return PACKAGE_MANAGER_ERROR_NONE;
1073 API int package_manager_foreach_package_info(package_manager_package_info_cb callback,
1078 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1079 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1082 retval = package_info_foreach_package_info(callback, user_data);
1084 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1085 return package_manager_error(retval, __FUNCTION__, NULL);
1087 return PACKAGE_MANAGER_ERROR_NONE;
1090 API int package_manager_compare_package_cert_info(const char *lhs_package_id, const char *rhs_package_id, package_manager_compare_result_type_e *compare_result)
1092 pkgmgrinfo_cert_compare_result_type_e result;
1093 uid_t uid = getuid();
1095 if (lhs_package_id == NULL || rhs_package_id == NULL || compare_result == NULL)
1096 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1097 if (uid != GLOBAL_USER) {
1098 if (pkgmgrinfo_pkginfo_compare_usr_pkg_cert_info(lhs_package_id, rhs_package_id, uid, &result) != PKGMGR_R_OK)
1099 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1101 if (pkgmgrinfo_pkginfo_compare_pkg_cert_info(lhs_package_id, rhs_package_id, &result) != PKGMGR_R_OK)
1102 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1104 *compare_result = (package_manager_compare_result_type_e)result;
1106 return PACKAGE_MANAGER_ERROR_NONE;
1109 API int package_manager_compare_app_cert_info(const char *lhs_app_id, const char *rhs_app_id, package_manager_compare_result_type_e *compare_result)
1111 pkgmgrinfo_cert_compare_result_type_e result;
1112 uid_t uid = getuid();
1114 if (lhs_app_id == NULL || rhs_app_id == NULL || compare_result == NULL)
1115 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1116 if (uid != GLOBAL_USER) {
1117 if (pkgmgrinfo_pkginfo_compare_usr_app_cert_info(lhs_app_id, rhs_app_id, uid, &result) != PKGMGR_R_OK)
1118 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1120 if (pkgmgrinfo_pkginfo_compare_app_cert_info(lhs_app_id, rhs_app_id, &result) != PKGMGR_R_OK)
1121 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1124 *compare_result = (package_manager_compare_result_type_e)result;
1126 return PACKAGE_MANAGER_ERROR_NONE;
1129 API int package_manager_is_preload_package_by_app_id(const char *app_id, bool *preload)
1133 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1134 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1137 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo = NULL;
1138 pkgmgrinfo_pkginfo_h pkgmgrinfo_pkginfo = NULL;
1140 char *pkg_id = NULL;
1141 bool is_preload = 0;
1142 uid_t uid = getuid();
1143 if (uid != GLOBAL_USER) {
1144 if (pkgmgrinfo_appinfo_get_usr_appinfo(app_id, uid, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1145 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1147 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1148 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1151 retval = pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id);
1152 if (retval != PMINFO_R_OK) {
1153 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1154 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1156 if (uid != GLOBAL_USER) {
1157 if (pkgmgrinfo_pkginfo_get_usr_pkginfo(pkg_id, uid, &pkgmgrinfo_pkginfo) != PMINFO_R_OK) {
1158 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1159 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1160 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1163 if (pkgmgrinfo_pkginfo_get_pkginfo(pkg_id, &pkgmgrinfo_pkginfo) != PMINFO_R_OK) {
1164 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1165 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1166 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1169 if (pkgmgrinfo_pkginfo_is_preload(pkgmgrinfo_pkginfo, &is_preload) != PMINFO_R_OK) {
1170 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1171 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1172 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1180 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1181 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1183 return PACKAGE_MANAGER_ERROR_NONE;
1186 API int package_manager_get_permission_type(const char *app_id, package_manager_permission_type_e *permission_type)
1190 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1191 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1194 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo = NULL;
1195 pkgmgrinfo_permission_type permission = 0;
1196 uid_t uid = getuid();
1197 if (uid != GLOBAL_USER) {
1198 if (pkgmgrinfo_appinfo_get_usr_appinfo(app_id, uid, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1199 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1201 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1202 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1204 retval = pkgmgrinfo_appinfo_get_permission_type(pkgmgrinfo_appinfo, &permission);
1205 if (retval != PMINFO_R_OK)
1206 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1208 if (permission == PMINFO_PERMISSION_NORMAL)
1209 *permission_type = PACKAGE_MANAGER_PERMISSION_NORMAL;
1210 else if (permission == PMINFO_PERMISSION_SIGNATURE)
1211 *permission_type = PACKAGE_MANAGER_PERMISSION_SIGNATURE;
1212 else if (permission == PMINFO_PERMISSION_PRIVILEGE)
1213 *permission_type = PACKAGE_MANAGER_PERMISSION_PRIVILEGE;
1215 *permission_type = PACKAGE_MANAGER_PERMISSION_NORMAL;
1217 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1218 return PACKAGE_MANAGER_ERROR_NONE;
1221 API int package_manager_clear_cache_dir(const char *package_id)
1225 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_CACHE);
1226 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1229 int res = pkgmgr_client_usr_clear_cache_dir(package_id, getuid());
1230 if (res == PKGMGR_R_EINVAL) {
1231 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1232 } else if (res == PKGMGR_R_ENOPKG) {
1233 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1234 } else if (res == PKGMGR_R_ENOMEM) {
1235 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1236 } else if (res == PKGMGR_R_EIO) {
1237 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1238 } else if (res == PKGMGR_R_EPRIV) {
1239 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
1240 } else if (res == PKGMGR_R_ESYSTEM || res == PKGMGR_R_ECOMM || res == PKGMGR_R_ERROR) {
1241 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1242 } else if (res != PKGMGR_R_OK) {
1243 _LOGE("Unexpected error");
1244 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1247 return PACKAGE_MANAGER_ERROR_NONE;
1250 API int package_manager_clear_all_cache_dir(void)
1254 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
1255 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1258 return package_manager_clear_cache_dir(PKG_CLEAR_ALL_CACHE);
1261 static void __free_client(gpointer data)
1263 pkgmgr_client *pc = (pkgmgr_client *)data;
1264 pkgmgr_client_free(pc);
1267 static void __initialize_cb_table(void)
1269 __cb_table = g_hash_table_new_full(g_int_hash, g_int_equal, __free_client, NULL);
1272 static void __result_cb(pkgmgr_client *pc, const char *pkgid, const pkg_size_info_t *result, void *user_data)
1274 package_manager_size_info_receive_cb callback = g_hash_table_lookup(__cb_table, pc);
1275 if (callback == NULL) {
1276 _LOGE("callback is null.");
1277 g_hash_table_remove(__cb_table, pc);
1281 package_size_info_t size_info;
1282 size_info.data_size = result->data_size;
1283 size_info.cache_size = result->cache_size;
1284 size_info.app_size = result->app_size;
1285 size_info.external_data_size = result->ext_data_size;
1286 size_info.external_cache_size = result->ext_cache_size;
1287 size_info.external_app_size = result->ext_app_size;
1289 callback(pkgid, (package_size_info_h)&size_info, user_data);
1291 g_hash_table_remove(__cb_table, pc);
1294 static void __total_result_cb(pkgmgr_client *pc, const pkg_size_info_t *result, void *user_data)
1296 package_manager_total_size_info_receive_cb callback = g_hash_table_lookup(__cb_table, pc);
1297 if (callback == NULL) {
1298 _LOGE("callback is null.");
1299 g_hash_table_remove(__cb_table, pc);
1303 package_size_info_t size_info;
1304 size_info.data_size = result->data_size;
1305 size_info.cache_size = result->cache_size;
1306 size_info.app_size = result->app_size;
1307 size_info.external_data_size = result->ext_data_size;
1308 size_info.external_cache_size = result->ext_cache_size;
1309 size_info.external_app_size = result->ext_app_size;
1311 callback((package_size_info_h)&size_info, user_data);
1313 g_hash_table_remove(__cb_table, pc);
1316 static int _get_pkg_size_info(const char *package_id, void *callback, void *user_data)
1318 if (package_id == NULL || callback == NULL)
1319 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1321 if (__cb_table == NULL)
1322 __initialize_cb_table();
1324 pkgmgr_client *pc = pkgmgr_client_new(PC_REQUEST);
1326 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1329 if (strcmp(package_id, PKG_SIZE_INFO_TOTAL) != 0)
1330 res = pkgmgr_client_usr_get_package_size_info(pc, package_id, __result_cb, user_data, getuid());
1332 res = pkgmgr_client_usr_get_total_package_size_info(pc, __total_result_cb, user_data, getuid());
1334 if (res == PKGMGR_R_EINVAL) {
1335 pkgmgr_client_free(pc);
1336 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1337 } else if (res == PKGMGR_R_ENOPKG) {
1338 pkgmgr_client_free(pc);
1339 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1340 } else if (res == PKGMGR_R_ENOMEM) {
1341 pkgmgr_client_free(pc);
1342 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1343 } else if (res == PKGMGR_R_EIO) {
1344 pkgmgr_client_free(pc);
1345 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1346 } else if (res == PKGMGR_R_EPRIV) {
1347 pkgmgr_client_free(pc);
1348 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
1349 } else if (res == PKGMGR_R_ESYSTEM || res == PKGMGR_R_ECOMM || res == PKGMGR_R_ERROR) {
1350 pkgmgr_client_free(pc);
1351 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1352 } else if (res != PKGMGR_R_OK) {
1353 _LOGE("Unexpected error");
1354 pkgmgr_client_free(pc);
1355 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1358 g_hash_table_insert(__cb_table, pc, callback);
1360 _LOGD("Successful");
1361 return PACKAGE_MANAGER_ERROR_NONE;
1364 API int package_manager_get_package_size_info(const char *package_id, package_manager_size_info_receive_cb callback, void *user_data)
1366 return _get_pkg_size_info(package_id, (void *)callback, user_data);
1369 API int package_manager_get_total_package_size_info(package_manager_total_size_info_receive_cb callback, void *user_data)
1371 return _get_pkg_size_info(PKG_SIZE_INFO_TOTAL, (void *)callback, user_data);
1374 API int package_manager_filter_create(package_manager_filter_h *handle)
1377 pkgmgrinfo_pkginfo_filter_h pkgmgr_filter = NULL;
1379 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1380 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1383 if (handle == NULL) {
1385 package_manager_error
1386 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1390 retval = pkgmgrinfo_pkginfo_filter_create(&pkgmgr_filter);
1391 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1392 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1394 *handle = pkgmgr_filter;
1396 return PACKAGE_MANAGER_ERROR_NONE;
1399 API int package_manager_filter_destroy(package_manager_filter_h handle)
1403 if (handle == NULL) {
1405 package_manager_error
1406 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1410 retval = pkgmgrinfo_pkginfo_filter_destroy(handle);
1411 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1412 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1414 return PACKAGE_MANAGER_ERROR_NONE;
1417 API int package_manager_filter_add_bool(package_manager_filter_h handle,
1418 const char *property, const bool value)
1422 if ((handle == NULL) || (property == NULL)) {
1424 package_manager_error
1425 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1429 retval = pkgmgrinfo_pkginfo_filter_add_bool(handle, property, value);
1430 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1431 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1433 return PACKAGE_MANAGER_ERROR_NONE;
1436 API int package_manager_filter_count(package_manager_filter_h handle, int *count)
1440 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1441 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1444 if ((handle == NULL) || (count == NULL))
1445 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1447 retval = pkgmgrinfo_pkginfo_filter_count(handle, count);
1449 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1451 return PACKAGE_MANAGER_ERROR_NONE;
1454 API int package_manager_filter_foreach_package_info(package_manager_filter_h handle,
1455 package_manager_package_info_cb callback, void *user_data)
1459 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1460 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1463 retval = package_info_filter_foreach_package_info(handle, callback, user_data);
1465 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1466 return package_manager_error(retval, __FUNCTION__, NULL);
1468 return PACKAGE_MANAGER_ERROR_NONE;
1471 API int package_size_info_get_data_size(package_size_info_h handle, long long *data_size)
1474 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1476 package_size_info_t *size_info = (package_size_info_t *)handle;
1478 *data_size = (long long)size_info->data_size;
1479 return PACKAGE_MANAGER_ERROR_NONE;
1482 API int package_size_info_get_cache_size(package_size_info_h handle, long long *cache_size)
1485 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1487 package_size_info_t *size_info = (package_size_info_t *)handle;
1489 *cache_size = size_info->cache_size;
1490 return PACKAGE_MANAGER_ERROR_NONE;
1493 API int package_size_info_get_app_size(package_size_info_h handle, long long *app_size)
1496 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1498 package_size_info_t *size_info = (package_size_info_t *)handle;
1499 *app_size = size_info->app_size;
1500 return PACKAGE_MANAGER_ERROR_NONE;
1503 API int package_size_info_get_external_data_size(package_size_info_h handle, long long *ext_data_size)
1506 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
1508 package_size_info_t *size_info = (package_size_info_t *)handle;
1509 *ext_data_size = size_info->external_data_size;
1510 return PACKAGE_MANAGER_ERROR_NONE;
1513 API int package_size_info_get_external_cache_size(package_size_info_h handle, long long *ext_cache_size)
1516 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1518 package_size_info_t *size_info = (package_size_info_t *)handle;
1519 *ext_cache_size = size_info->external_cache_size;
1520 return PACKAGE_MANAGER_ERROR_NONE;
1523 API int package_size_info_get_external_app_size(package_size_info_h handle, long long *ext_app_size)
1526 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1528 package_size_info_t *size_info = (package_size_info_t *)handle;
1529 *ext_app_size = size_info->external_app_size;
1530 return PACKAGE_MANAGER_ERROR_NONE;