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-info.h>
24 #include <tzplatform_config.h>
26 #include "package_manager.h"
27 #include "package_manager_internal.h"
29 static GHashTable *__cb_table = NULL;
31 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
32 typedef struct _event_info {
34 package_manager_event_type_e event_type;
35 package_manager_event_state_e event_state;
36 struct _event_info *next;
39 struct package_manager_s {
45 package_manager_event_cb event_cb;
46 package_manager_global_event_cb global_event_cb;
50 struct package_manager_request_s {
59 package_manager_request_event_cb event_cb;
63 struct package_manager_filter_s {
64 pkgmgrinfo_pkginfo_filter_h pkgmgrinfo_pkginfo_filter;
67 static int package_manager_request_new_id()
69 static int request_handle_id = 0;
70 return request_handle_id++;
73 static int package_manager_new_id()
75 static int manager_handle_id = 0;
76 return manager_handle_id++;
79 API int package_manager_request_create(package_manager_request_h *request)
81 struct package_manager_request_s *package_manager_request;
83 if (request == NULL) {
86 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
90 package_manager_request =
91 calloc(1, sizeof(struct package_manager_request_s));
92 if (package_manager_request == NULL) {
94 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
96 "failed to create a package_manager handle");
99 package_manager_request->ctype = PC_REQUEST;
100 package_manager_request->pc = pkgmgr_client_new(PC_REQUEST);
101 if (package_manager_request->pc == NULL) {
102 free(package_manager_request);
104 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
106 "failed to create a package_manager client");
109 package_manager_request->handle_id = package_manager_request_new_id();
111 *request = package_manager_request;
113 return PACKAGE_MANAGER_ERROR_NONE;
116 static int package_manager_client_validate_handle(package_manager_request_h
119 if (request == NULL || request->pc == NULL) {
120 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
123 return PACKAGE_MANAGER_ERROR_NONE;
126 API int package_manager_request_destroy(package_manager_request_h request)
128 if (package_manager_client_validate_handle(request)) {
130 package_manager_error
131 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
135 pkgmgr_client_free(request->pc);
139 return PACKAGE_MANAGER_ERROR_NONE;
142 API int package_manager_request_set_event_cb(package_manager_request_h request,
143 package_manager_request_event_cb
144 callback, void *user_data)
146 if (package_manager_client_validate_handle(request)) {
148 package_manager_error
149 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
153 request->event_cb = callback;
154 request->user_data = user_data;
156 return PACKAGE_MANAGER_ERROR_NONE;
159 API int package_manager_request_unset_event_cb(package_manager_request_h request)
161 // TODO: Please implement this function.
162 if (package_manager_client_validate_handle(request)) {
163 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
166 return PACKAGE_MANAGER_ERROR_NONE;
170 API int package_manager_request_set_type(package_manager_request_h request,
171 const char *pkg_type)
173 if (package_manager_client_validate_handle(request)) {
175 package_manager_error
176 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
180 request->pkg_type = pkg_type;
182 return PACKAGE_MANAGER_ERROR_NONE;
185 API int package_manager_request_set_mode(package_manager_request_h request,
186 package_manager_request_mode_e mode)
188 if (package_manager_client_validate_handle(request)) {
190 package_manager_error
191 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
195 if (mode == PACKAGE_MANAGER_REQUEST_MODE_QUIET)
196 request->mode = PM_QUIET;
198 request->mode = PM_DEFAULT;
200 return PACKAGE_MANAGER_ERROR_NONE;
203 static int package_manager_get_event_type(const char *key,
204 package_manager_event_type_e *
208 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
210 if (strcasecmp(key, "install") == 0)
211 *event_type = PACKAGE_MANAGER_EVENT_TYPE_INSTALL;
212 else if (strcasecmp(key, "uninstall") == 0)
213 *event_type = PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL;
214 else if (strcasecmp(key, "update") == 0)
215 *event_type = PACKAGE_MANAGER_EVENT_TYPE_UPDATE;
217 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
219 return PACKAGE_MANAGER_ERROR_NONE;
222 static int __add_event_info(event_info ** head, int req_id,
223 package_manager_event_type_e event_type,
224 package_manager_event_state_e event_state)
226 event_info *evt_info;
230 evt_info = (event_info *) calloc(1, sizeof(event_info));
231 if (evt_info == NULL) {
232 _LOGD("calloc failed");
235 evt_info->req_id = req_id;
236 evt_info->event_type = event_type;
237 evt_info->next = NULL;
242 current = prev = *head;
245 current = current->next;
248 prev->next = evt_info;
254 static int __find_event_info(event_info ** head, int req_id,
255 package_manager_event_type_e * event_type,
256 package_manager_event_state_e * event_state)
263 _LOGE("tmp is NULL");
267 _LOGD("tmp->req_id %d, event_type %d", tmp->req_id, event_type);
270 if (tmp->req_id == req_id) {
271 *event_type = tmp->event_type;
279 static int __update_event_info(event_info ** head, int req_id,
280 package_manager_event_type_e event_type,
281 package_manager_event_state_e event_state)
283 package_manager_event_type_e evt_type;
284 package_manager_event_state_e evt_state;
287 if (__find_event_info(head, req_id, &evt_type, &evt_state) != 0)
288 __add_event_info(head, req_id, event_type, event_state);
293 _LOGE("tmp is NULL");
298 if (tmp->req_id == req_id) {
299 tmp->event_type = event_type;
310 static int __remove_event_info(event_info **head request, int req_id)
321 if (current->next->req_id == req_id) {
323 current->next = current->next->next;
335 static int request_event_handler(uid_t target_uid, int req_id, const char *pkg_type,
336 const char *pkg_name, const char *key,
337 const char *val, const void *pmsg, void *data)
340 package_manager_event_type_e event_type = -1;
341 package_manager_event_state_e event_state = -1;
343 _LOGD("request_event_handler is called");
345 package_manager_request_h request = data;
347 if (strcasecmp(key, "start") == 0) {
348 ret = package_manager_get_event_type(val, &event_type);
349 if (ret != PACKAGE_MANAGER_ERROR_NONE)
350 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
352 __add_event_info(&(request->head), req_id, event_type,
353 PACKAGE_MANAGER_EVENT_STATE_STARTED);
355 if (request->event_cb)
356 request->event_cb(req_id, pkg_type, pkg_name,
358 PACKAGE_MANAGER_EVENT_STATE_STARTED,
359 0, PACKAGE_MANAGER_ERROR_NONE, request->user_data);
361 } else if (strcasecmp(key, "install_percent") == 0
362 || strcasecmp(key, "progress_percent") == 0) {
363 if (__find_event_info
364 (&(request->head), req_id, &event_type,
365 &event_state) == 0) {
366 __update_event_info(&(request->head), req_id,
368 PACKAGE_MANAGER_EVENT_STATE_PROCESSING);
369 if (request->event_cb)
370 request->event_cb(req_id, pkg_type, pkg_name,
372 PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
374 PACKAGE_MANAGER_ERROR_NONE,
378 } else if (strcasecmp(key, "error") == 0) {
379 if (strcasecmp(key, "0") != 0) {
380 if (__find_event_info
381 (&(request->head), req_id, &event_type,
382 &event_state) == 0) {
383 __update_event_info(&(request->head), req_id,
385 PACKAGE_MANAGER_EVENT_STATE_FAILED);
388 if (request->event_cb)
389 request->event_cb(req_id, pkg_type,
390 pkg_name, event_type,
391 PACKAGE_MANAGER_EVENT_STATE_FAILED,
393 PACKAGE_MANAGER_ERROR_NONE,
397 } else if (strcasecmp(key, "end") == 0) {
398 if (__find_event_info
399 (&(request->head), req_id, &event_type,
400 &event_state) == 0) {
401 if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
402 if (request->event_cb)
403 request->event_cb(req_id, pkg_type,
404 pkg_name, event_type,
405 PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
407 PACKAGE_MANAGER_ERROR_NONE,
411 if (strcasecmp(key, "ok") != 0)
412 if (request->event_cb)
413 request->event_cb(req_id, pkg_type,
414 pkg_name, event_type,
415 PACKAGE_MANAGER_EVENT_STATE_FAILED,
417 PACKAGE_MANAGER_ERROR_NONE,
422 return PACKAGE_MANAGER_ERROR_NONE;
425 API int package_manager_request_install(package_manager_request_h request,
426 const char *path, int *id)
428 if (package_manager_client_validate_handle(request)) {
429 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
432 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
436 request->pkg_path = path;
437 uid_t uid = getuid();
438 if (uid != GLOBAL_USER)
439 request_id = pkgmgr_client_usr_install(request->pc, request->pkg_type, NULL,
440 request->pkg_path, NULL,
441 request->mode, request_event_handler,
445 request_id = pkgmgr_client_install(request->pc, request->pkg_type, NULL,
446 request->pkg_path, NULL,
447 request->mode, request_event_handler,
450 if (request_id == PKGMGR_R_EINVAL) {
451 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
452 } else if (request_id == PKGMGR_R_ENOPKG) {
453 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
454 } else if (request_id == PKGMGR_R_ENOMEM) {
455 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
456 } else if (request_id == PKGMGR_R_EIO) {
457 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
458 } else if (request_id == PKGMGR_R_EPRIV) {
459 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
460 } else if (request_id == PKGMGR_R_ESYSTEM || request_id == PKGMGR_R_ECOMM || request_id == PKGMGR_R_ERROR) {
461 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
462 } else if (request_id != PKGMGR_R_OK) {
463 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, "Unexpected error");
468 return PACKAGE_MANAGER_ERROR_NONE;
471 API int package_manager_request_uninstall(package_manager_request_h request,
472 const char *name, int *id)
474 if (package_manager_client_validate_handle(request)) {
475 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
478 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
482 request->pkg_name = name;
483 uid_t uid = getuid();
484 if (uid != GLOBAL_USER)
485 request_id = pkgmgr_client_usr_uninstall(request->pc, request->pkg_type,
486 request->pkg_name, request->mode,
487 request_event_handler, request, uid);
489 request_id = pkgmgr_client_uninstall(request->pc, request->pkg_type,
490 request->pkg_name, request->mode,
491 request_event_handler, request);
493 if (request_id == PKGMGR_R_EINVAL) {
494 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
495 } else if (request_id == PKGMGR_R_ENOPKG) {
496 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
497 } else if (request_id == PKGMGR_R_ENOMEM) {
498 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
499 } else if (request_id == PKGMGR_R_EIO) {
500 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
501 } else if (request_id == PKGMGR_R_EPRIV) {
502 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
503 } else if (request_id == PKGMGR_R_ESYSTEM || request_id == PKGMGR_R_ECOMM || request_id == PKGMGR_R_ERROR) {
504 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
505 } else if (request_id != PKGMGR_R_OK) {
506 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, "Unexpected error");
511 return PACKAGE_MANAGER_ERROR_NONE;
514 API int package_manager_request_move(package_manager_request_h request,
515 const char *name, package_manager_move_type_e move_type)
517 if (package_manager_client_validate_handle(request)) {
518 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
521 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
525 request->pkg_name = name;
526 uid_t uid = getuid();
527 if (uid != GLOBAL_USER)
528 ret = pkgmgr_client_usr_move(request->pc, request->pkg_type, request->pkg_name,
529 move_type, request->mode, uid);
531 ret = pkgmgr_client_move(request->pc, request->pkg_type, request->pkg_name,
532 move_type, request->mode);
533 if (ret == PKGMGR_R_EINVAL) {
534 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
535 } else if (ret == PKGMGR_R_ENOPKG) {
536 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
537 } else if (ret == PKGMGR_R_ENOMEM) {
538 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
539 } else if (ret == PKGMGR_R_EIO) {
540 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
541 } else if (ret == PKGMGR_R_EPRIV) {
542 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
543 } else if (ret == PKGMGR_R_ESYSTEM || ret == PKGMGR_R_ECOMM || ret == PKGMGR_R_ERROR) {
544 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
545 } else if (ret != PKGMGR_R_OK) {
546 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, "Unexpected error");
550 return PACKAGE_MANAGER_ERROR_NONE;
553 API int package_manager_create(package_manager_h * manager)
555 struct package_manager_s *package_manager = NULL;
557 if (manager == NULL) {
559 package_manager_error
560 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
564 package_manager = calloc(1, sizeof(struct package_manager_s));
565 if (package_manager == NULL) {
567 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
569 "failed to create a package_manager handle");
572 package_manager->ctype = PC_LISTENING;
573 package_manager->pc = pkgmgr_client_new(PC_LISTENING);
574 if (package_manager->pc == NULL) {
575 free(package_manager);
577 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
579 "failed to create a package_manager client");
582 package_manager->handle_id = package_manager_new_id();
584 *manager = package_manager;
586 return PACKAGE_MANAGER_ERROR_NONE;
589 static int package_manager_validate_handle(package_manager_h manager)
591 if (manager == NULL || manager->pc == NULL) {
592 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
595 return PACKAGE_MANAGER_ERROR_NONE;
598 API int package_manager_destroy(package_manager_h manager)
600 if (package_manager_validate_handle(manager)) {
602 package_manager_error
603 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
607 pkgmgr_client_free(manager->pc);
611 return PACKAGE_MANAGER_ERROR_NONE;
614 static int __add_event(event_info ** head, int req_id,
615 package_manager_event_type_e event_type,
616 package_manager_event_state_e event_state)
618 event_info *evt_info;
620 evt_info = (event_info *) calloc(1, sizeof(event_info));
621 if (evt_info == NULL) {
622 _LOGD("calloc failed");
625 evt_info->req_id = req_id;
626 evt_info->event_type = event_type;
627 evt_info->next = NULL;
634 static int __find_event(event_info ** head, int req_id,
635 package_manager_event_type_e * event_type,
636 package_manager_event_state_e * event_state)
643 _LOGE("tmp is NULL");
647 *event_type = tmp->event_type;
651 static int __update_event(event_info ** head, int req_id,
652 package_manager_event_type_e event_type,
653 package_manager_event_state_e event_state)
655 package_manager_event_type_e evt_type;
656 package_manager_event_state_e evt_state;
659 if (__find_event_info(head, req_id, &evt_type, &evt_state) != 0)
660 __add_event_info(head, req_id, event_type, event_state);
665 _LOGE("tmp is NULL");
669 tmp->event_type = event_type;
676 /* App Event Listening Policy:
677 * +----------------+------------+---------------+------------------+
678 * |Listener \ Type |Global Event|My User's Event|Other user's Event|
679 * +----------------+------------+---------------+------------------+
680 * |User Process App| Grant | Grant | Deny |
681 * +----------------+------------+---------------+------------------+
682 * |Platform module | Grant | Grant | Grant |
683 * +----------------+------------+---------------+------------------+
684 * UID assignment policy:
685 * https://wiki.tizen.org/wiki/Security/User_and_group_ID_assignment_policy
687 #define REGULAR_USER 5000
688 static int __validate_event_signal(uid_t target_uid)
690 uid_t self = getuid();
692 if (self == target_uid)
695 if (self < REGULAR_USER)
701 static int global_event_handler(uid_t target_uid, int req_id, const char *pkg_type,
702 const char *pkg_name, const char *key,
703 const char *val, const void *pmsg, void *data)
706 package_manager_event_type_e event_type = -1;
707 package_manager_event_state_e event_state = -1;
709 _LOGD("global_event_handler is called");
711 package_manager_h manager = data;
713 if (__validate_event_signal(target_uid))
714 return PACKAGE_MANAGER_ERROR_NONE;
716 if (strcasecmp(key, "start") == 0) {
717 ret = package_manager_get_event_type(val, &event_type);
718 if (ret != PACKAGE_MANAGER_ERROR_NONE)
719 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
721 __add_event(&(manager->head), req_id, event_type,
722 PACKAGE_MANAGER_EVENT_STATE_STARTED);
724 if (manager->event_cb && getuid() == target_uid)
725 manager->event_cb(pkg_type, pkg_name,
727 PACKAGE_MANAGER_EVENT_STATE_STARTED,
728 0, PACKAGE_MANAGER_ERROR_NONE, manager->user_data);
729 if (manager->global_event_cb)
730 manager->global_event_cb(target_uid, pkg_type, pkg_name,
732 PACKAGE_MANAGER_EVENT_STATE_STARTED,
733 0, PACKAGE_MANAGER_ERROR_NONE, manager->user_data);
735 } else if (strcasecmp(key, "install_percent") == 0
736 || strcasecmp(key, "progress_percent") == 0) {
738 (&(manager->head), req_id, &event_type,
739 &event_state) == 0) {
740 __update_event(&(manager->head), req_id,
742 PACKAGE_MANAGER_EVENT_STATE_PROCESSING);
743 if (manager->event_cb && getuid() == target_uid)
744 manager->event_cb(pkg_type, pkg_name,
746 PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
748 PACKAGE_MANAGER_ERROR_NONE,
750 if (manager->global_event_cb)
751 manager->global_event_cb(target_uid, pkg_type, pkg_name,
753 PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
755 PACKAGE_MANAGER_ERROR_NONE,
759 } else if (strcasecmp(key, "error") == 0) {
760 if (strcasecmp(key, "0") != 0) {
762 (&(manager->head), req_id, &event_type,
763 &event_state) == 0) {
764 __update_event(&(manager->head), req_id,
766 PACKAGE_MANAGER_EVENT_STATE_FAILED);
769 if (manager->event_cb && getuid() == target_uid)
770 manager->event_cb(pkg_type,
771 pkg_name, event_type,
772 PACKAGE_MANAGER_EVENT_STATE_FAILED,
774 PACKAGE_MANAGER_ERROR_NONE,
776 if (manager->global_event_cb)
777 manager->global_event_cb(target_uid, pkg_type,
778 pkg_name, event_type,
779 PACKAGE_MANAGER_EVENT_STATE_FAILED,
781 PACKAGE_MANAGER_ERROR_NONE,
784 } else if (strcasecmp(key, "end") == 0) {
786 (&(manager->head), req_id, &event_type,
787 &event_state) == 0) {
788 if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
789 if (manager->event_cb && getuid() == target_uid)
790 manager->event_cb(pkg_type,
791 pkg_name, event_type,
792 PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
794 PACKAGE_MANAGER_ERROR_NONE,
796 if (manager->global_event_cb)
797 manager->global_event_cb(target_uid, pkg_type,
798 pkg_name, event_type,
799 PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
801 PACKAGE_MANAGER_ERROR_NONE,
805 if (strcasecmp(key, "ok") != 0) {
806 if (manager->event_cb && getuid() == target_uid)
807 manager->event_cb(pkg_type,
808 pkg_name, event_type,
809 PACKAGE_MANAGER_EVENT_STATE_FAILED,
811 PACKAGE_MANAGER_ERROR_NONE,
813 if (manager->global_event_cb)
814 manager->global_event_cb(target_uid, pkg_type,
815 pkg_name, event_type,
816 PACKAGE_MANAGER_EVENT_STATE_FAILED,
818 PACKAGE_MANAGER_ERROR_NONE,
824 return PACKAGE_MANAGER_ERROR_NONE;
827 API int package_manager_set_event_status(package_manager_h manager, int status_type)
831 if (manager == NULL){
832 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
835 retval = pkgmgrinfo_client_set_status_type(manager->pc, status_type);
838 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
841 return PACKAGE_MANAGER_ERROR_NONE;
844 API int package_manager_set_event_cb(package_manager_h manager,
845 package_manager_event_cb callback,
848 if (package_manager_validate_handle(manager)) {
850 package_manager_error
851 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
855 manager->event_cb = callback;
856 manager->user_data = user_data;
858 pkgmgr_client_listen_status(manager->pc, global_event_handler, manager);
860 return PACKAGE_MANAGER_ERROR_NONE;
863 API int package_manager_unset_event_cb(package_manager_h manager)
865 // TODO: Please implement this function.
866 return PACKAGE_MANAGER_ERROR_NONE;
869 API int package_manager_set_global_event_cb(package_manager_h manager,
870 package_manager_global_event_cb callback,
873 if (package_manager_validate_handle(manager)) {
875 package_manager_error
876 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
880 if (getuid() >= REGULAR_USER) {
881 _LOGE("Regular user is not allowed for this api");
882 return PACKAGE_MANAGER_ERROR_PERMISSION_DENIED;
885 manager->global_event_cb = callback;
886 manager->user_data = user_data;
888 pkgmgr_client_listen_status(manager->pc, global_event_handler, manager);
890 return PACKAGE_MANAGER_ERROR_NONE;
893 API int package_manager_unset_global_event_cb(package_manager_h manager)
895 // TODO: Please implement this function.
896 return PACKAGE_MANAGER_ERROR_NONE;
899 API int package_manager_get_package_id_by_app_id(const char *app_id, char **package_id)
901 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo;
904 char *pkg_id_dup = NULL;
906 uid_t uid = getuid();
907 if (uid != GLOBAL_USER)
909 if (pkgmgrinfo_appinfo_get_usr_appinfo(app_id, uid, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
910 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
913 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
914 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
916 retval = pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id);
917 if (retval != PMINFO_R_OK)
919 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
922 pkg_id_dup = strdup(pkg_id);
923 if (pkg_id_dup == NULL)
925 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
926 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
929 *package_id = pkg_id_dup;
931 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
933 return PACKAGE_MANAGER_ERROR_NONE;
936 API int package_manager_get_package_info(const char *package_id, package_info_h *package_info)
940 retval = package_info_get_package_info(package_id, package_info);
942 if (retval != PACKAGE_MANAGER_ERROR_NONE)
943 return package_manager_error(retval, __FUNCTION__, NULL);
945 return PACKAGE_MANAGER_ERROR_NONE;
948 API int package_manager_foreach_package_info(package_manager_package_info_cb callback,
953 retval = package_info_foreach_package_info(callback, user_data);
955 if (retval != PACKAGE_MANAGER_ERROR_NONE)
956 return package_manager_error(retval, __FUNCTION__, NULL);
959 return PACKAGE_MANAGER_ERROR_NONE;
963 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)
965 pkgmgrinfo_cert_compare_result_type_e result;
966 uid_t uid = getuid();
968 if (lhs_package_id == NULL || rhs_package_id == NULL || compare_result == NULL)
969 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
970 if (uid != GLOBAL_USER)
972 if (pkgmgrinfo_pkginfo_compare_usr_pkg_cert_info(lhs_package_id, rhs_package_id, uid, &result) != PKGMGR_R_OK)
973 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
976 if (pkgmgrinfo_pkginfo_compare_pkg_cert_info(lhs_package_id, rhs_package_id, &result) != PKGMGR_R_OK)
977 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
979 *compare_result = (package_manager_compare_result_type_e)result;
981 return PACKAGE_MANAGER_ERROR_NONE;
984 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)
986 pkgmgrinfo_cert_compare_result_type_e result;
987 uid_t uid = getuid();
989 if (lhs_app_id == NULL || rhs_app_id == NULL || compare_result == NULL)
990 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
991 if (uid != GLOBAL_USER)
993 if (pkgmgrinfo_pkginfo_compare_usr_app_cert_info(lhs_app_id, rhs_app_id, uid, &result) != PKGMGR_R_OK)
994 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
997 if (pkgmgrinfo_pkginfo_compare_app_cert_info(lhs_app_id, rhs_app_id, &result) != PKGMGR_R_OK)
998 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1001 *compare_result = (package_manager_compare_result_type_e)result;
1003 return PACKAGE_MANAGER_ERROR_NONE;
1006 API int package_manager_is_preload_package_by_app_id(const char *app_id, bool *preload)
1008 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo = NULL;
1009 pkgmgrinfo_pkginfo_h pkgmgrinfo_pkginfo = NULL;
1012 char *pkg_id = NULL;
1013 bool is_preload = 0;
1014 uid_t uid = getuid();
1015 if (uid != GLOBAL_USER)
1017 if (pkgmgrinfo_appinfo_get_usr_appinfo(app_id, uid, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1018 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1021 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1022 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1024 retval = pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id);
1025 if (retval != PMINFO_R_OK)
1027 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1028 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1030 if (uid != GLOBAL_USER)
1032 if (pkgmgrinfo_pkginfo_get_usr_pkginfo(pkg_id, uid, &pkgmgrinfo_pkginfo) != PMINFO_R_OK)
1034 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1035 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1036 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1040 if (pkgmgrinfo_pkginfo_get_pkginfo(pkg_id, &pkgmgrinfo_pkginfo) != PMINFO_R_OK)
1042 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1043 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1044 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1047 if (pkgmgrinfo_pkginfo_is_preload(pkgmgrinfo_pkginfo, &is_preload) != PMINFO_R_OK)
1049 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1050 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1051 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1059 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1060 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1062 return PACKAGE_MANAGER_ERROR_NONE;
1065 API int package_manager_get_permission_type(const char *app_id, package_manager_permission_type_e *permission_type)
1068 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo =NULL;
1069 pkgmgrinfo_permission_type permission = 0;
1070 uid_t uid = getuid();
1071 if (uid != GLOBAL_USER)
1073 if (pkgmgrinfo_appinfo_get_usr_appinfo(app_id, uid, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1074 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1076 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1077 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1079 retval = pkgmgrinfo_appinfo_get_permission_type(pkgmgrinfo_appinfo, &permission);
1080 if (retval != PMINFO_R_OK)
1081 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1083 if (permission == PMINFO_PERMISSION_NORMAL)
1084 *permission_type = PACKAGE_MANAGER_PERMISSION_NORMAL;
1085 else if (permission == PMINFO_PERMISSION_SIGNATURE)
1086 *permission_type = PACKAGE_MANAGER_PERMISSION_SIGNATURE;
1087 else if (permission == PMINFO_PERMISSION_PRIVILEGE)
1088 *permission_type = PACKAGE_MANAGER_PERMISSION_PRIVILEGE;
1090 *permission_type = PACKAGE_MANAGER_PERMISSION_NORMAL;
1092 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1093 return PACKAGE_MANAGER_ERROR_NONE;
1096 API int package_manager_clear_cache_dir(const char *package_id)
1098 int res = pkgmgr_client_clear_cache_dir(package_id);
1099 if (res == PKGMGR_R_EINVAL)
1101 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1103 else if (res == PKGMGR_R_ENOPKG)
1105 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1107 else if (res == PKGMGR_R_ENOMEM)
1109 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1111 else if (res == PKGMGR_R_EIO)
1113 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1115 else if (res == PKGMGR_R_EPRIV)
1117 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
1119 else if (res == PKGMGR_R_ESYSTEM || res == PKGMGR_R_ECOMM || res == PKGMGR_R_ERROR)
1121 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1123 else if (res != PKGMGR_R_OK)
1125 _LOGE("Unexpected error");
1126 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1129 return PACKAGE_MANAGER_ERROR_NONE;
1132 API int package_manager_clear_all_cache_dir(void)
1134 return package_manager_clear_cache_dir(PKG_CLEAR_ALL_CACHE);
1137 static void __initialize_cb_table(void)
1139 __cb_table = g_hash_table_new_full(g_int_hash, g_int_equal, pkgmgr_client_free, NULL);
1142 static void __result_cb(pkgmgr_client *pc, const char *pkgid, const pkg_size_info_t *result, void *user_data)
1144 package_manager_size_info_receive_cb callback = g_hash_table_lookup(__cb_table, pc);
1145 if (callback == NULL)
1147 _LOGE("callback is null.");
1148 g_hash_table_remove(__cb_table, pc);
1152 package_size_info_t size_info;
1153 size_info.data_size = result->data_size;
1154 size_info.cache_size = result->cache_size;
1155 size_info.app_size = result->app_size;
1156 size_info.external_data_size = result->ext_data_size;
1157 size_info.external_cache_size = result->ext_cache_size;
1158 size_info.external_app_size = result->ext_app_size;
1160 callback(pkgid, &size_info, user_data);
1162 g_hash_table_remove(__cb_table, pc);
1165 static void __total_result_cb(pkgmgr_client *pc, const pkg_size_info_t *result, void *user_data)
1167 package_manager_total_size_info_receive_cb callback = g_hash_table_lookup(__cb_table, pc);
1168 if (callback == NULL)
1170 _LOGE("callback is null.");
1171 g_hash_table_remove(__cb_table, pc);
1175 package_size_info_t size_info;
1176 size_info.data_size = result->data_size;
1177 size_info.cache_size = result->cache_size;
1178 size_info.app_size = result->app_size;
1179 size_info.external_data_size = result->ext_data_size;
1180 size_info.external_cache_size = result->ext_cache_size;
1181 size_info.external_app_size = result->ext_app_size;
1183 callback(&size_info, user_data);
1185 g_hash_table_remove(__cb_table, pc);
1188 API int package_manager_get_package_size_info(const char *package_id, package_manager_size_info_receive_cb callback, void *user_data)
1190 if (package_id == NULL || callback == NULL)
1192 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1195 if (__cb_table == NULL)
1197 __initialize_cb_table();
1200 pkgmgr_client *pc = pkgmgr_client_new(PC_REQUEST);
1203 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1207 if (strcmp(package_id, PKG_SIZE_INFO_TOTAL) != 0)
1209 res = pkgmgr_client_get_package_size_info(pc, package_id, __result_cb, user_data);
1213 res = pkgmgr_client_get_total_package_size_info(pc, __total_result_cb, user_data);
1216 if (res == PKGMGR_R_EINVAL)
1218 pkgmgr_client_free(pc);
1219 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1221 else if (res == PKGMGR_R_ENOPKG)
1223 pkgmgr_client_free(pc);
1224 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1226 else if (res == PKGMGR_R_ENOMEM)
1228 pkgmgr_client_free(pc);
1229 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1231 else if (res == PKGMGR_R_EIO)
1233 pkgmgr_client_free(pc);
1234 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1236 else if (res == PKGMGR_R_EPRIV)
1238 pkgmgr_client_free(pc);
1239 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
1241 else if (res == PKGMGR_R_ESYSTEM || res == PKGMGR_R_ECOMM || res == PKGMGR_R_ERROR)
1243 pkgmgr_client_free(pc);
1244 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1246 else if (res != PKGMGR_R_OK)
1248 _LOGE("Unexpected error");
1249 pkgmgr_client_free(pc);
1250 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1253 g_hash_table_insert(__cb_table, pc, callback);
1255 _LOGD("Successful");
1256 return PACKAGE_MANAGER_ERROR_NONE;
1259 API int package_manager_get_total_package_size_info(package_manager_total_size_info_receive_cb callback, void *user_data)
1261 return package_manager_get_package_size_info(PKG_SIZE_INFO_TOTAL, callback, user_data);
1264 API int package_manager_filter_create(package_manager_filter_h *handle)
1267 pkgmgrinfo_pkginfo_filter_h pkgmgr_filter = NULL;
1272 package_manager_error
1273 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1277 retval = pkgmgrinfo_pkginfo_filter_create(&pkgmgr_filter);
1278 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1280 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1283 *handle = pkgmgr_filter;
1285 return PACKAGE_MANAGER_ERROR_NONE;
1288 API int package_manager_filter_destroy(package_manager_filter_h handle)
1295 package_manager_error
1296 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1300 retval = pkgmgrinfo_pkginfo_filter_destroy(handle);
1301 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1303 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1306 return PACKAGE_MANAGER_ERROR_NONE;
1309 API int package_manager_filter_add_bool(package_manager_filter_h handle,
1310 const char *property, const bool value)
1314 if ((handle == NULL) || (property == NULL))
1317 package_manager_error
1318 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1322 retval = pkgmgrinfo_pkginfo_filter_add_bool(handle, property, value);
1323 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1325 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1328 return PACKAGE_MANAGER_ERROR_NONE;
1331 API int package_manager_filter_count(package_manager_filter_h handle, int *count)
1335 if ((handle == NULL) || (count == NULL))
1337 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1340 retval = pkgmgrinfo_pkginfo_filter_count(handle, count);
1343 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1346 return PACKAGE_MANAGER_ERROR_NONE;
1349 API int package_manager_filter_foreach_package_info(package_manager_filter_h handle,
1350 package_manager_package_info_cb callback, void *user_data)
1354 retval = package_info_filter_foreach_package_info(handle, callback, user_data);
1356 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1358 return package_manager_error(retval, __FUNCTION__, NULL);
1362 return PACKAGE_MANAGER_ERROR_NONE;