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.
23 #include <package-manager.h>
24 #include <package_manager.h>
25 #include <package_manager_private.h>
26 #include <pkgmgr-info.h>
27 #include <tzplatform_config.h>
34 #define LOG_TAG "CAPI_APPFW_PACKAGE_MANAGER"
36 #define _LOGE(fmt, arg...) LOGE(fmt,##arg)
37 #define _LOGD(fmt, arg...) LOGD(fmt, ##arg)
39 static GHashTable *__cb_table = NULL;
41 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
42 typedef struct _event_info {
44 package_manager_event_type_e event_type;
45 package_manager_event_state_e event_state;
46 struct _event_info *next;
49 struct package_manager_s {
55 package_manager_event_cb event_cb;
59 struct package_manager_request_s {
68 package_manager_request_event_cb event_cb;
72 struct package_manager_filter_s {
73 pkgmgrinfo_pkginfo_filter_h pkgmgrinfo_pkginfo_filter;
76 static int package_manager_request_new_id()
78 static int request_handle_id = 0;
79 return request_handle_id++;
82 static int package_manager_new_id()
84 static int manager_handle_id = 0;
85 return manager_handle_id++;
88 static const char *package_manager_error_to_string(package_manager_error_e
92 case PACKAGE_MANAGER_ERROR_NONE:
94 case PACKAGE_MANAGER_ERROR_INVALID_PARAMETER:
95 return "INVALID_PARAMETER";
96 case PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY:
97 return "OUT_OF_MEMORY";
98 case PACKAGE_MANAGER_ERROR_IO_ERROR:
100 case PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE:
101 return "NO_SUCH_PACKAGE";
102 case PACKAGE_MANAGER_ERROR_PERMISSION_DENIED:
103 return "PERMISSION_DENIED";
104 case PACKAGE_MANAGER_ERROR_SYSTEM_ERROR:
105 return "SEVERE_SYSTEM_ERROR";
111 int package_manager_error(package_manager_error_e error,
112 const char *function, const char *description)
115 _LOGE("[%s] %s(0x%08x) : %s", function,
116 package_manager_error_to_string(error), error,
119 _LOGE("[%s] %s(0x%08x)", function,
120 package_manager_error_to_string(error), error);
126 int package_manager_request_create(package_manager_request_h * request)
128 struct package_manager_request_s *package_manager_request;
130 if (request == NULL) {
132 package_manager_error
133 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
137 package_manager_request =
138 calloc(1, sizeof(struct package_manager_request_s));
139 if (package_manager_request == NULL) {
141 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
143 "failed to create a package_manager handle");
146 package_manager_request->ctype = PC_REQUEST;
147 package_manager_request->pc = pkgmgr_client_new(PC_REQUEST);
148 if (package_manager_request->pc == NULL) {
149 free(package_manager_request);
151 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
153 "failed to create a package_manager client");
156 package_manager_request->handle_id = package_manager_request_new_id();
158 *request = package_manager_request;
160 return PACKAGE_MANAGER_ERROR_NONE;
163 static int package_manager_client_validate_handle(package_manager_request_h
166 if (request == NULL || request->pc == NULL) {
167 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
170 return PACKAGE_MANAGER_ERROR_NONE;
173 int package_manager_client_destroy(package_manager_request_h request)
175 if (package_manager_client_validate_handle(request)) {
177 package_manager_error
178 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
182 pkgmgr_client_free(request->pc);
186 return PACKAGE_MANAGER_ERROR_NONE;
189 int package_manager_request_destroy(package_manager_request_h request)
191 if (package_manager_client_validate_handle(request)) {
193 package_manager_error
194 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
198 pkgmgr_client_free(request->pc);
202 return PACKAGE_MANAGER_ERROR_NONE;
205 int package_manager_request_set_event_cb(package_manager_request_h request,
206 package_manager_request_event_cb
207 callback, void *user_data)
209 if (package_manager_client_validate_handle(request)) {
211 package_manager_error
212 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
216 request->event_cb = callback;
217 request->user_data = user_data;
219 return PACKAGE_MANAGER_ERROR_NONE;
222 int package_manager_request_unset_event_cb(package_manager_request_h request)
224 // TODO: Please implement this function.
225 if (package_manager_client_validate_handle(request)) {
226 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
229 return PACKAGE_MANAGER_ERROR_NONE;
233 int package_manager_request_set_type(package_manager_request_h request,
234 const char *pkg_type)
236 if (package_manager_client_validate_handle(request)) {
238 package_manager_error
239 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
243 request->pkg_type = pkg_type;
245 return PACKAGE_MANAGER_ERROR_NONE;
248 int package_manager_request_set_mode(package_manager_request_h request,
249 package_manager_request_mode_e mode)
251 if (package_manager_client_validate_handle(request)) {
253 package_manager_error
254 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
258 if (mode == PACKAGE_MANAGER_REQUEST_MODE_QUIET)
259 request->mode = PM_QUIET;
261 request->mode = PM_DEFAULT;
263 return PACKAGE_MANAGER_ERROR_NONE;
266 static int package_manager_get_event_type(const char *key,
267 package_manager_event_type_e *
271 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
273 if (strcasecmp(key, "install") == 0)
274 *event_type = PACKAGE_MANAGER_EVENT_TYPE_INSTALL;
275 else if (strcasecmp(key, "uninstall") == 0)
276 *event_type = PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL;
277 else if (strcasecmp(key, "update") == 0)
278 *event_type = PACKAGE_MANAGER_EVENT_TYPE_UPDATE;
280 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
282 return PACKAGE_MANAGER_ERROR_NONE;
285 static int __add_event_info(event_info ** head, int req_id,
286 package_manager_event_type_e event_type,
287 package_manager_event_state_e event_state)
289 event_info *evt_info;
293 evt_info = (event_info *) calloc(1, sizeof(event_info));
294 if (evt_info == NULL) {
295 _LOGD("calloc failed");
298 evt_info->req_id = req_id;
299 evt_info->event_type = event_type;
300 evt_info->next = NULL;
305 current = prev = *head;
308 current = current->next;
311 prev->next = evt_info;
317 static int __find_event_info(event_info ** head, int req_id,
318 package_manager_event_type_e * event_type,
319 package_manager_event_state_e * event_state)
326 _LOGE("tmp is NULL");
330 _LOGD("tmp->req_id %d, event_type %d", tmp->req_id, event_type);
333 if (tmp->req_id == req_id) {
334 *event_type = tmp->event_type;
342 static int __update_event_info(event_info ** head, int req_id,
343 package_manager_event_type_e event_type,
344 package_manager_event_state_e event_state)
346 package_manager_event_type_e evt_type;
347 package_manager_event_state_e evt_state;
350 if (__find_event_info(head, req_id, &evt_type, &evt_state) != 0)
351 __add_event_info(head, req_id, event_type, event_state);
356 _LOGE("tmp is NULL");
361 if (tmp->req_id == req_id) {
362 tmp->event_type = event_type;
373 static int __remove_event_info(event_info **head request, int req_id)
384 if (current->next->req_id == req_id) {
386 current->next = current->next->next;
398 static int request_event_handler(int req_id, const char *pkg_type,
399 const char *pkg_name, const char *key,
400 const char *val, const void *pmsg, void *data)
403 package_manager_event_type_e event_type = -1;
404 package_manager_event_state_e event_state = -1;
406 _LOGD("request_event_handler is called");
408 package_manager_request_h request = data;
410 if (strcasecmp(key, "start") == 0) {
411 ret = package_manager_get_event_type(val, &event_type);
412 if (ret != PACKAGE_MANAGER_ERROR_NONE)
413 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
415 __add_event_info(&(request->head), req_id, event_type,
416 PACKAGE_MANAGER_EVENT_STATE_STARTED);
418 if (request->event_cb)
419 request->event_cb(req_id, pkg_type, pkg_name,
421 PACKAGE_MANAGER_EVENT_STATE_STARTED,
422 0, PACKAGE_MANAGER_ERROR_NONE, request->user_data);
424 } else if (strcasecmp(key, "install_percent") == 0
425 || strcasecmp(key, "progress_percent") == 0) {
426 if (__find_event_info
427 (&(request->head), req_id, &event_type,
428 &event_state) == 0) {
429 __update_event_info(&(request->head), req_id,
431 PACKAGE_MANAGER_EVENT_STATE_PROCESSING);
432 if (request->event_cb)
433 request->event_cb(req_id, pkg_type, pkg_name,
435 PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
437 PACKAGE_MANAGER_ERROR_NONE,
441 } else if (strcasecmp(key, "error") == 0) {
442 if (strcasecmp(key, "0") != 0) {
443 if (__find_event_info
444 (&(request->head), req_id, &event_type,
445 &event_state) == 0) {
446 __update_event_info(&(request->head), req_id,
448 PACKAGE_MANAGER_EVENT_STATE_FAILED);
451 if (request->event_cb)
452 request->event_cb(req_id, pkg_type,
453 pkg_name, event_type,
454 PACKAGE_MANAGER_EVENT_STATE_FAILED,
456 PACKAGE_MANAGER_ERROR_NONE,
460 } else if (strcasecmp(key, "end") == 0) {
461 if (__find_event_info
462 (&(request->head), req_id, &event_type,
463 &event_state) == 0) {
464 if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
465 if (request->event_cb)
466 request->event_cb(req_id, pkg_type,
467 pkg_name, event_type,
468 PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
470 PACKAGE_MANAGER_ERROR_NONE,
474 if (strcasecmp(key, "ok") != 0)
475 if (request->event_cb)
476 request->event_cb(req_id, pkg_type,
477 pkg_name, event_type,
478 PACKAGE_MANAGER_EVENT_STATE_FAILED,
480 PACKAGE_MANAGER_ERROR_NONE,
485 return PACKAGE_MANAGER_ERROR_NONE;
488 int package_manager_request_install(package_manager_request_h request,
489 const char *path, int *id)
491 if (package_manager_client_validate_handle(request)) {
492 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
495 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
499 request->pkg_path = path;
500 uid_t uid = getuid();
501 if (uid != GLOBAL_USER)
502 request_id = pkgmgr_client_usr_install(request->pc, request->pkg_type, NULL,
503 request->pkg_path, NULL,
504 request->mode, request_event_handler,
508 request_id = pkgmgr_client_install(request->pc, request->pkg_type, NULL,
509 request->pkg_path, NULL,
510 request->mode, request_event_handler,
513 if (request_id == PKGMGR_R_EINVAL) {
514 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
515 } else if (request_id == PKGMGR_R_ENOPKG) {
516 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
517 } else if (request_id == PKGMGR_R_ENOMEM) {
518 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
519 } else if (request_id == PKGMGR_R_EIO) {
520 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
521 } else if (request_id == PKGMGR_R_EPRIV) {
522 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
523 } else if (request_id == PKGMGR_R_ESYSTEM || request_id == PKGMGR_R_ECOMM || request_id == PKGMGR_R_ERROR) {
524 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
525 } else if (request_id != PKGMGR_R_OK) {
526 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, "Unexpected error");
531 return PACKAGE_MANAGER_ERROR_NONE;
534 int package_manager_request_uninstall(package_manager_request_h request,
535 const char *name, int *id)
537 if (package_manager_client_validate_handle(request)) {
538 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
541 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
545 request->pkg_name = name;
546 uid_t uid = getuid();
547 if (uid != GLOBAL_USER)
548 request_id = pkgmgr_client_usr_uninstall(request->pc, request->pkg_type,
549 request->pkg_name, request->mode,
550 request_event_handler, request, uid);
552 request_id = pkgmgr_client_uninstall(request->pc, request->pkg_type,
553 request->pkg_name, request->mode,
554 request_event_handler, request);
556 if (request_id == PKGMGR_R_EINVAL) {
557 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
558 } else if (request_id == PKGMGR_R_ENOPKG) {
559 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
560 } else if (request_id == PKGMGR_R_ENOMEM) {
561 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
562 } else if (request_id == PKGMGR_R_EIO) {
563 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
564 } else if (request_id == PKGMGR_R_EPRIV) {
565 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
566 } else if (request_id == PKGMGR_R_ESYSTEM || request_id == PKGMGR_R_ECOMM || request_id == PKGMGR_R_ERROR) {
567 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
568 } else if (request_id != PKGMGR_R_OK) {
569 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, "Unexpected error");
574 return PACKAGE_MANAGER_ERROR_NONE;
577 int package_manager_request_move(package_manager_request_h request,
578 const char *name, package_manager_move_type_e move_type)
580 if (package_manager_client_validate_handle(request)) {
581 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
584 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
588 request->pkg_name = name;
589 uid_t uid = getuid();
590 if (uid != GLOBAL_USER)
591 ret = pkgmgr_client_usr_move(request->pc, request->pkg_type, request->pkg_name,
592 move_type, request->mode, uid);
594 ret = pkgmgr_client_move(request->pc, request->pkg_type, request->pkg_name,
595 move_type, request->mode);
596 if (ret == PKGMGR_R_EINVAL) {
597 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
598 } else if (ret == PKGMGR_R_ENOPKG) {
599 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
600 } else if (ret == PKGMGR_R_ENOMEM) {
601 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
602 } else if (ret == PKGMGR_R_EIO) {
603 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
604 } else if (ret == PKGMGR_R_EPRIV) {
605 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
606 } else if (ret == PKGMGR_R_ESYSTEM || ret == PKGMGR_R_ECOMM || ret == PKGMGR_R_ERROR) {
607 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
608 } else if (ret != PKGMGR_R_OK) {
609 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, "Unexpected error");
613 return PACKAGE_MANAGER_ERROR_NONE;
615 int package_manager_create(package_manager_h * manager)
617 struct package_manager_s *package_manager = NULL;
619 if (manager == NULL) {
621 package_manager_error
622 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
626 package_manager = calloc(1, sizeof(struct package_manager_s));
627 if (package_manager == NULL) {
629 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
631 "failed to create a package_manager handle");
634 package_manager->ctype = PC_LISTENING;
635 package_manager->pc = pkgmgr_client_new(PC_LISTENING);
636 if (package_manager->pc == NULL) {
637 free(package_manager);
639 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
641 "failed to create a package_manager client");
644 package_manager->handle_id = package_manager_new_id();
646 *manager = package_manager;
648 return PACKAGE_MANAGER_ERROR_NONE;
651 static int package_manager_validate_handle(package_manager_h manager)
653 if (manager == NULL || manager->pc == NULL) {
654 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
657 return PACKAGE_MANAGER_ERROR_NONE;
660 int package_manager_destroy(package_manager_h manager)
662 if (package_manager_validate_handle(manager)) {
664 package_manager_error
665 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
669 pkgmgr_client_free(manager->pc);
673 return PACKAGE_MANAGER_ERROR_NONE;
676 static int __add_event(event_info ** head, int req_id,
677 package_manager_event_type_e event_type,
678 package_manager_event_state_e event_state)
680 event_info *evt_info;
682 evt_info = (event_info *) calloc(1, sizeof(event_info));
683 if (evt_info == NULL) {
684 _LOGD("calloc failed");
687 evt_info->req_id = req_id;
688 evt_info->event_type = event_type;
689 evt_info->next = NULL;
696 static int __find_event(event_info ** head, int req_id,
697 package_manager_event_type_e * event_type,
698 package_manager_event_state_e * event_state)
705 _LOGE("tmp is NULL");
709 *event_type = tmp->event_type;
713 static int __update_event(event_info ** head, int req_id,
714 package_manager_event_type_e event_type,
715 package_manager_event_state_e event_state)
717 package_manager_event_type_e evt_type;
718 package_manager_event_state_e evt_state;
721 if (__find_event_info(head, req_id, &evt_type, &evt_state) != 0)
722 __add_event_info(head, req_id, event_type, event_state);
727 _LOGE("tmp is NULL");
731 tmp->event_type = event_type;
738 static int global_event_handler(int req_id, const char *pkg_type,
739 const char *pkg_name, const char *key,
740 const char *val, const void *pmsg, void *data)
743 package_manager_event_type_e event_type = -1;
744 package_manager_event_state_e event_state = -1;
746 _LOGD("global_event_handler is called");
748 package_manager_h manager = data;
750 if (strcasecmp(key, "start") == 0) {
751 ret = package_manager_get_event_type(val, &event_type);
752 if (ret != PACKAGE_MANAGER_ERROR_NONE)
753 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
755 __add_event(&(manager->head), req_id, event_type,
756 PACKAGE_MANAGER_EVENT_STATE_STARTED);
758 if (manager->event_cb)
759 manager->event_cb(pkg_type, pkg_name,
761 PACKAGE_MANAGER_EVENT_STATE_STARTED,
762 0, PACKAGE_MANAGER_ERROR_NONE, manager->user_data);
764 } else if (strcasecmp(key, "install_percent") == 0
765 || strcasecmp(key, "progress_percent") == 0) {
767 (&(manager->head), req_id, &event_type,
768 &event_state) == 0) {
769 __update_event(&(manager->head), req_id,
771 PACKAGE_MANAGER_EVENT_STATE_PROCESSING);
772 if (manager->event_cb)
773 manager->event_cb(pkg_type, pkg_name,
775 PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
777 PACKAGE_MANAGER_ERROR_NONE,
781 } else if (strcasecmp(key, "error") == 0) {
782 if (strcasecmp(key, "0") != 0) {
784 (&(manager->head), req_id, &event_type,
785 &event_state) == 0) {
786 __update_event(&(manager->head), req_id,
788 PACKAGE_MANAGER_EVENT_STATE_FAILED);
791 if (manager->event_cb)
792 manager->event_cb(pkg_type,
793 pkg_name, event_type,
794 PACKAGE_MANAGER_EVENT_STATE_FAILED,
796 PACKAGE_MANAGER_ERROR_NONE,
800 } else if (strcasecmp(key, "end") == 0) {
802 (&(manager->head), req_id, &event_type,
803 &event_state) == 0) {
804 if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
805 if (manager->event_cb)
806 manager->event_cb(pkg_type,
807 pkg_name, event_type,
808 PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
810 PACKAGE_MANAGER_ERROR_NONE,
814 if (strcasecmp(key, "ok") != 0)
815 if (manager->event_cb)
816 manager->event_cb(pkg_type,
817 pkg_name, event_type,
818 PACKAGE_MANAGER_EVENT_STATE_FAILED,
820 PACKAGE_MANAGER_ERROR_NONE,
825 return PACKAGE_MANAGER_ERROR_NONE;
828 int package_manager_set_event_status(package_manager_h manager, int status_type)
832 if (manager == NULL){
833 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
836 retval = pkgmgrinfo_client_set_status_type(manager->pc, status_type);
839 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
842 return PACKAGE_MANAGER_ERROR_NONE;
845 int package_manager_set_event_cb(package_manager_h manager,
846 package_manager_event_cb callback,
849 if (package_manager_validate_handle(manager)) {
851 package_manager_error
852 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
856 manager->event_cb = callback;
857 manager->user_data = user_data;
859 pkgmgr_client_listen_status(manager->pc, global_event_handler, manager);
861 return PACKAGE_MANAGER_ERROR_NONE;
864 int package_manager_unset_event_cb(package_manager_h manager)
866 // TODO: Please implement this function.
867 return PACKAGE_MANAGER_ERROR_NONE;
870 int package_manager_get_package_id_by_app_id(const char *app_id, char **package_id)
872 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo;
875 char *pkg_id_dup = NULL;
877 uid_t uid = getuid();
878 if (uid != GLOBAL_USER)
880 if (pkgmgrinfo_appinfo_get_usr_appinfo(app_id, uid, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
881 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
884 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
885 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
887 retval = pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id);
888 if (retval != PMINFO_R_OK)
890 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
893 pkg_id_dup = strdup(pkg_id);
894 if (pkg_id_dup == NULL)
896 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
897 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
900 *package_id = pkg_id_dup;
902 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
904 return PACKAGE_MANAGER_ERROR_NONE;
907 int package_manager_get_package_info(const char *package_id, package_info_h *package_info)
911 retval = package_info_get_package_info(package_id, package_info);
913 if (retval != PACKAGE_MANAGER_ERROR_NONE)
914 return package_manager_error(retval, __FUNCTION__, NULL);
916 return PACKAGE_MANAGER_ERROR_NONE;
919 int package_manager_foreach_package_info(package_manager_package_info_cb callback,
924 retval = package_info_foreach_package_info(callback, user_data);
926 if (retval != PACKAGE_MANAGER_ERROR_NONE)
927 return package_manager_error(retval, __FUNCTION__, NULL);
930 return PACKAGE_MANAGER_ERROR_NONE;
933 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)
935 pkgmgrinfo_cert_compare_result_type_e result;
936 uid_t uid = getuid();
938 if (lhs_package_id == NULL || rhs_package_id == NULL || compare_result == NULL)
939 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
940 if (uid != GLOBAL_USER)
942 if (pkgmgrinfo_pkginfo_compare_usr_pkg_cert_info(lhs_package_id, rhs_package_id, uid, &result) != PKGMGR_R_OK)
943 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
946 if (pkgmgrinfo_pkginfo_compare_pkg_cert_info(lhs_package_id, rhs_package_id, &result) != PKGMGR_R_OK)
947 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
949 *compare_result = (package_manager_compare_result_type_e)result;
951 return PACKAGE_MANAGER_ERROR_NONE;
954 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)
956 pkgmgrinfo_cert_compare_result_type_e result;
957 uid_t uid = getuid();
959 if (lhs_app_id == NULL || rhs_app_id == NULL || compare_result == NULL)
960 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
961 if (uid != GLOBAL_USER)
963 if (pkgmgrinfo_pkginfo_compare_usr_app_cert_info(lhs_app_id, rhs_app_id, uid, &result) != PKGMGR_R_OK)
964 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
967 if (pkgmgrinfo_pkginfo_compare_app_cert_info(lhs_app_id, rhs_app_id, &result) != PKGMGR_R_OK)
968 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
971 *compare_result = (package_manager_compare_result_type_e)result;
973 return PACKAGE_MANAGER_ERROR_NONE;
976 int package_manager_is_preload_package_by_app_id(const char *app_id, bool *preload)
978 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo = NULL;
979 pkgmgrinfo_pkginfo_h pkgmgrinfo_pkginfo = NULL;
984 uid_t uid = getuid();
985 if (uid != GLOBAL_USER)
987 if (pkgmgrinfo_appinfo_get_usr_appinfo(app_id, uid, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
988 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
991 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
992 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
994 retval = pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id);
995 if (retval != PMINFO_R_OK)
997 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
998 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1000 if (uid != GLOBAL_USER)
1002 if (pkgmgrinfo_pkginfo_get_usr_pkginfo(pkg_id, uid, &pkgmgrinfo_pkginfo) != PMINFO_R_OK)
1004 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1005 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1006 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1010 if (pkgmgrinfo_pkginfo_get_pkginfo(pkg_id, &pkgmgrinfo_pkginfo) != PMINFO_R_OK)
1012 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1013 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1014 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1017 if (pkgmgrinfo_pkginfo_is_preload(pkgmgrinfo_pkginfo, &is_preload) != PMINFO_R_OK)
1019 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1020 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1021 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1029 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1030 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1032 return PACKAGE_MANAGER_ERROR_NONE;
1035 int package_manager_get_permission_type(const char *app_id, package_manager_permission_type_e *permission_type)
1038 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo =NULL;
1039 pkgmgrinfo_permission_type permission = 0;
1040 uid_t uid = getuid();
1041 if (uid != GLOBAL_USER)
1043 if (pkgmgrinfo_appinfo_get_usr_appinfo(app_id, uid, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1044 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1046 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1047 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1049 retval = pkgmgrinfo_appinfo_get_permission_type(pkgmgrinfo_appinfo, &permission);
1050 if (retval != PMINFO_R_OK)
1051 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1053 if (permission == PMINFO_PERMISSION_NORMAL)
1054 *permission_type = PACKAGE_MANAGER_PERMISSION_NORMAL;
1055 else if (permission == PMINFO_PERMISSION_SIGNATURE)
1056 *permission_type = PACKAGE_MANAGER_PERMISSION_SIGNATURE;
1057 else if (permission == PMINFO_PERMISSION_PRIVILEGE)
1058 *permission_type = PACKAGE_MANAGER_PERMISSION_PRIVILEGE;
1060 *permission_type = PACKAGE_MANAGER_PERMISSION_NORMAL;
1062 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1063 return PACKAGE_MANAGER_ERROR_NONE;
1066 int package_manager_clear_cache_dir(const char *package_id)
1068 int res = pkgmgr_client_clear_cache_dir(package_id);
1069 if (res == PKGMGR_R_EINVAL)
1071 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1073 else if (res == PKGMGR_R_ENOPKG)
1075 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1077 else if (res == PKGMGR_R_ENOMEM)
1079 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1081 else if (res == PKGMGR_R_EIO)
1083 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1085 else if (res == PKGMGR_R_EPRIV)
1087 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
1089 else if (res == PKGMGR_R_ESYSTEM || res == PKGMGR_R_ECOMM || res == PKGMGR_R_ERROR)
1091 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1093 else if (res != PKGMGR_R_OK)
1095 _LOGE("Unexpected error");
1096 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1099 return PACKAGE_MANAGER_ERROR_NONE;
1102 int package_manager_clear_all_cache_dir(void)
1104 return package_manager_clear_cache_dir(PKG_CLEAR_ALL_CACHE);
1107 static void __initialize_cb_table(void)
1109 __cb_table = g_hash_table_new_full(g_int_hash, g_int_equal, pkgmgr_client_free, NULL);
1112 static void __result_cb(pkgmgr_client *pc, const char *pkgid, const pkg_size_info_t *result, void *user_data)
1114 package_manager_size_info_receive_cb callback = g_hash_table_lookup(__cb_table, pc);
1115 if (callback == NULL)
1117 _LOGE("callback is null.");
1118 g_hash_table_remove(__cb_table, pc);
1122 package_size_info_t size_info;
1123 size_info.data_size = result->data_size;
1124 size_info.cache_size = result->cache_size;
1125 size_info.app_size = result->app_size;
1126 size_info.external_data_size = result->ext_data_size;
1127 size_info.external_cache_size = result->ext_cache_size;
1128 size_info.external_app_size = result->ext_app_size;
1130 callback(pkgid, &size_info, user_data);
1132 g_hash_table_remove(__cb_table, pc);
1135 static void __total_result_cb(pkgmgr_client *pc, const pkg_size_info_t *result, void *user_data)
1137 package_manager_total_size_info_receive_cb callback = g_hash_table_lookup(__cb_table, pc);
1138 if (callback == NULL)
1140 _LOGE("callback is null.");
1141 g_hash_table_remove(__cb_table, pc);
1145 package_size_info_t size_info;
1146 size_info.data_size = result->data_size;
1147 size_info.cache_size = result->cache_size;
1148 size_info.app_size = result->app_size;
1149 size_info.external_data_size = result->ext_data_size;
1150 size_info.external_cache_size = result->ext_cache_size;
1151 size_info.external_app_size = result->ext_app_size;
1153 callback(&size_info, user_data);
1155 g_hash_table_remove(__cb_table, pc);
1158 int package_manager_get_package_size_info(const char *package_id, package_manager_size_info_receive_cb callback, void *user_data)
1160 if (package_id == NULL || callback == NULL)
1162 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1165 if (__cb_table == NULL)
1167 __initialize_cb_table();
1170 pkgmgr_client *pc = pkgmgr_client_new(PC_REQUEST);
1173 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1177 if (strcmp(package_id, PKG_SIZE_INFO_TOTAL) != 0)
1179 res = pkgmgr_client_get_package_size_info(pc, package_id, __result_cb, user_data);
1183 res = pkgmgr_client_get_total_package_size_info(pc, __total_result_cb, user_data);
1186 if (res == PKGMGR_R_EINVAL)
1188 pkgmgr_client_free(pc);
1189 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1191 else if (res == PKGMGR_R_ENOPKG)
1193 pkgmgr_client_free(pc);
1194 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1196 else if (res == PKGMGR_R_ENOMEM)
1198 pkgmgr_client_free(pc);
1199 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1201 else if (res == PKGMGR_R_EIO)
1203 pkgmgr_client_free(pc);
1204 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1206 else if (res == PKGMGR_R_EPRIV)
1208 pkgmgr_client_free(pc);
1209 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
1211 else if (res == PKGMGR_R_ESYSTEM || res == PKGMGR_R_ECOMM || res == PKGMGR_R_ERROR)
1213 pkgmgr_client_free(pc);
1214 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1216 else if (res != PKGMGR_R_OK)
1218 _LOGE("Unexpected error");
1219 pkgmgr_client_free(pc);
1220 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1223 g_hash_table_insert(__cb_table, pc, callback);
1225 _LOGD("Successful");
1226 return PACKAGE_MANAGER_ERROR_NONE;
1229 int package_manager_get_total_package_size_info(package_manager_total_size_info_receive_cb callback, void *user_data)
1231 return package_manager_get_package_size_info(PKG_SIZE_INFO_TOTAL, callback, user_data);
1234 int package_manager_filter_create(package_manager_filter_h *handle)
1237 pkgmgrinfo_pkginfo_filter_h pkgmgr_filter = NULL;
1242 package_manager_error
1243 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1247 retval = pkgmgrinfo_pkginfo_filter_create(&pkgmgr_filter);
1248 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1250 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1253 *handle = pkgmgr_filter;
1255 return PACKAGE_MANAGER_ERROR_NONE;
1258 int package_manager_filter_destroy(package_manager_filter_h handle)
1265 package_manager_error
1266 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1270 retval = pkgmgrinfo_pkginfo_filter_destroy(handle);
1271 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1273 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1276 return PACKAGE_MANAGER_ERROR_NONE;
1278 int package_manager_filter_add_bool(package_manager_filter_h handle,
1279 const char *property, const bool value)
1283 if ((handle == NULL) || (property == NULL))
1286 package_manager_error
1287 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1291 retval = pkgmgrinfo_pkginfo_filter_add_bool(handle, property, value);
1292 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1294 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1297 return PACKAGE_MANAGER_ERROR_NONE;
1300 int package_manager_filter_count(package_manager_filter_h handle, int *count)
1304 if ((handle == NULL) || (count == NULL))
1306 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1309 retval = pkgmgrinfo_pkginfo_filter_count(handle, count);
1312 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1315 return PACKAGE_MANAGER_ERROR_NONE;
1318 int package_manager_filter_foreach_package_info(package_manager_filter_h handle,
1319 package_manager_package_info_cb callback, void *user_data)
1323 retval = package_info_filter_foreach_package_info(handle, callback, user_data);
1325 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1327 return package_manager_error(retval, __FUNCTION__, NULL);
1331 return PACKAGE_MANAGER_ERROR_NONE;