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;
49 struct package_manager_request_s {
58 package_manager_request_event_cb event_cb;
62 struct package_manager_filter_s {
63 pkgmgrinfo_pkginfo_filter_h pkgmgrinfo_pkginfo_filter;
66 static int package_manager_request_new_id()
68 static int request_handle_id = 0;
69 return request_handle_id++;
72 static int package_manager_new_id()
74 static int manager_handle_id = 0;
75 return manager_handle_id++;
78 API int package_manager_request_create(package_manager_request_h *request)
80 struct package_manager_request_s *package_manager_request;
82 if (request == NULL) {
85 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
89 package_manager_request =
90 calloc(1, sizeof(struct package_manager_request_s));
91 if (package_manager_request == NULL) {
93 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
95 "failed to create a package_manager handle");
98 package_manager_request->ctype = PC_REQUEST;
99 package_manager_request->pc = pkgmgr_client_new(PC_REQUEST);
100 if (package_manager_request->pc == NULL) {
101 free(package_manager_request);
103 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
105 "failed to create a package_manager client");
108 package_manager_request->handle_id = package_manager_request_new_id();
110 *request = package_manager_request;
112 return PACKAGE_MANAGER_ERROR_NONE;
115 static int package_manager_client_validate_handle(package_manager_request_h
118 if (request == NULL || request->pc == NULL) {
119 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
122 return PACKAGE_MANAGER_ERROR_NONE;
125 API int package_manager_request_destroy(package_manager_request_h request)
127 if (package_manager_client_validate_handle(request)) {
129 package_manager_error
130 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
134 pkgmgr_client_free(request->pc);
138 return PACKAGE_MANAGER_ERROR_NONE;
141 API int package_manager_request_set_event_cb(package_manager_request_h request,
142 package_manager_request_event_cb
143 callback, void *user_data)
145 if (package_manager_client_validate_handle(request)) {
147 package_manager_error
148 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
152 request->event_cb = callback;
153 request->user_data = user_data;
155 return PACKAGE_MANAGER_ERROR_NONE;
158 API int package_manager_request_unset_event_cb(package_manager_request_h request)
160 // TODO: Please implement this function.
161 if (package_manager_client_validate_handle(request)) {
162 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
165 return PACKAGE_MANAGER_ERROR_NONE;
169 API int package_manager_request_set_type(package_manager_request_h request,
170 const char *pkg_type)
172 if (package_manager_client_validate_handle(request)) {
174 package_manager_error
175 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
179 request->pkg_type = pkg_type;
181 return PACKAGE_MANAGER_ERROR_NONE;
184 API int package_manager_request_set_mode(package_manager_request_h request,
185 package_manager_request_mode_e mode)
187 if (package_manager_client_validate_handle(request)) {
189 package_manager_error
190 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
194 if (mode == PACKAGE_MANAGER_REQUEST_MODE_QUIET)
195 request->mode = PM_QUIET;
197 request->mode = PM_DEFAULT;
199 return PACKAGE_MANAGER_ERROR_NONE;
202 static int package_manager_get_event_type(const char *key,
203 package_manager_event_type_e *
207 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
209 if (strcasecmp(key, "install") == 0)
210 *event_type = PACKAGE_MANAGER_EVENT_TYPE_INSTALL;
211 else if (strcasecmp(key, "uninstall") == 0)
212 *event_type = PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL;
213 else if (strcasecmp(key, "update") == 0)
214 *event_type = PACKAGE_MANAGER_EVENT_TYPE_UPDATE;
216 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
218 return PACKAGE_MANAGER_ERROR_NONE;
221 static int __add_event_info(event_info ** head, int req_id,
222 package_manager_event_type_e event_type,
223 package_manager_event_state_e event_state)
225 event_info *evt_info;
229 evt_info = (event_info *) calloc(1, sizeof(event_info));
230 if (evt_info == NULL) {
231 _LOGD("calloc failed");
234 evt_info->req_id = req_id;
235 evt_info->event_type = event_type;
236 evt_info->next = NULL;
241 current = prev = *head;
244 current = current->next;
247 prev->next = evt_info;
253 static int __find_event_info(event_info ** head, int req_id,
254 package_manager_event_type_e * event_type,
255 package_manager_event_state_e * event_state)
262 _LOGE("tmp is NULL");
266 _LOGD("tmp->req_id %d, event_type %d", tmp->req_id, event_type);
269 if (tmp->req_id == req_id) {
270 *event_type = tmp->event_type;
278 static int __update_event_info(event_info ** head, int req_id,
279 package_manager_event_type_e event_type,
280 package_manager_event_state_e event_state)
282 package_manager_event_type_e evt_type;
283 package_manager_event_state_e evt_state;
286 if (__find_event_info(head, req_id, &evt_type, &evt_state) != 0)
287 __add_event_info(head, req_id, event_type, event_state);
292 _LOGE("tmp is NULL");
297 if (tmp->req_id == req_id) {
298 tmp->event_type = event_type;
309 static int __remove_event_info(event_info **head request, int req_id)
320 if (current->next->req_id == req_id) {
322 current->next = current->next->next;
334 static int request_event_handler(int req_id, const char *pkg_type,
335 const char *pkg_name, const char *key,
336 const char *val, const void *pmsg, void *data)
339 package_manager_event_type_e event_type = -1;
340 package_manager_event_state_e event_state = -1;
342 _LOGD("request_event_handler is called");
344 package_manager_request_h request = data;
346 if (strcasecmp(key, "start") == 0) {
347 ret = package_manager_get_event_type(val, &event_type);
348 if (ret != PACKAGE_MANAGER_ERROR_NONE)
349 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
351 __add_event_info(&(request->head), req_id, event_type,
352 PACKAGE_MANAGER_EVENT_STATE_STARTED);
354 if (request->event_cb)
355 request->event_cb(req_id, pkg_type, pkg_name,
357 PACKAGE_MANAGER_EVENT_STATE_STARTED,
358 0, PACKAGE_MANAGER_ERROR_NONE, request->user_data);
360 } else if (strcasecmp(key, "install_percent") == 0
361 || strcasecmp(key, "progress_percent") == 0) {
362 if (__find_event_info
363 (&(request->head), req_id, &event_type,
364 &event_state) == 0) {
365 __update_event_info(&(request->head), req_id,
367 PACKAGE_MANAGER_EVENT_STATE_PROCESSING);
368 if (request->event_cb)
369 request->event_cb(req_id, pkg_type, pkg_name,
371 PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
373 PACKAGE_MANAGER_ERROR_NONE,
377 } else if (strcasecmp(key, "error") == 0) {
378 if (strcasecmp(key, "0") != 0) {
379 if (__find_event_info
380 (&(request->head), req_id, &event_type,
381 &event_state) == 0) {
382 __update_event_info(&(request->head), req_id,
384 PACKAGE_MANAGER_EVENT_STATE_FAILED);
387 if (request->event_cb)
388 request->event_cb(req_id, pkg_type,
389 pkg_name, event_type,
390 PACKAGE_MANAGER_EVENT_STATE_FAILED,
392 PACKAGE_MANAGER_ERROR_NONE,
396 } else if (strcasecmp(key, "end") == 0) {
397 if (__find_event_info
398 (&(request->head), req_id, &event_type,
399 &event_state) == 0) {
400 if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
401 if (request->event_cb)
402 request->event_cb(req_id, pkg_type,
403 pkg_name, event_type,
404 PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
406 PACKAGE_MANAGER_ERROR_NONE,
410 if (strcasecmp(key, "ok") != 0)
411 if (request->event_cb)
412 request->event_cb(req_id, pkg_type,
413 pkg_name, event_type,
414 PACKAGE_MANAGER_EVENT_STATE_FAILED,
416 PACKAGE_MANAGER_ERROR_NONE,
421 return PACKAGE_MANAGER_ERROR_NONE;
424 API int package_manager_request_install(package_manager_request_h request,
425 const char *path, int *id)
427 if (package_manager_client_validate_handle(request)) {
428 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
431 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
435 request->pkg_path = path;
436 uid_t uid = getuid();
437 if (uid != GLOBAL_USER)
438 request_id = pkgmgr_client_usr_install(request->pc, request->pkg_type, NULL,
439 request->pkg_path, NULL,
440 request->mode, request_event_handler,
444 request_id = pkgmgr_client_install(request->pc, request->pkg_type, NULL,
445 request->pkg_path, NULL,
446 request->mode, request_event_handler,
449 if (request_id == PKGMGR_R_EINVAL) {
450 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
451 } else if (request_id == PKGMGR_R_ENOPKG) {
452 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
453 } else if (request_id == PKGMGR_R_ENOMEM) {
454 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
455 } else if (request_id == PKGMGR_R_EIO) {
456 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
457 } else if (request_id == PKGMGR_R_EPRIV) {
458 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
459 } else if (request_id == PKGMGR_R_ESYSTEM || request_id == PKGMGR_R_ECOMM || request_id == PKGMGR_R_ERROR) {
460 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
461 } else if (request_id != PKGMGR_R_OK) {
462 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, "Unexpected error");
467 return PACKAGE_MANAGER_ERROR_NONE;
470 API int package_manager_request_uninstall(package_manager_request_h request,
471 const char *name, int *id)
473 if (package_manager_client_validate_handle(request)) {
474 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
477 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
481 request->pkg_name = name;
482 uid_t uid = getuid();
483 if (uid != GLOBAL_USER)
484 request_id = pkgmgr_client_usr_uninstall(request->pc, request->pkg_type,
485 request->pkg_name, request->mode,
486 request_event_handler, request, uid);
488 request_id = pkgmgr_client_uninstall(request->pc, request->pkg_type,
489 request->pkg_name, request->mode,
490 request_event_handler, request);
492 if (request_id == PKGMGR_R_EINVAL) {
493 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
494 } else if (request_id == PKGMGR_R_ENOPKG) {
495 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
496 } else if (request_id == PKGMGR_R_ENOMEM) {
497 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
498 } else if (request_id == PKGMGR_R_EIO) {
499 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
500 } else if (request_id == PKGMGR_R_EPRIV) {
501 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
502 } else if (request_id == PKGMGR_R_ESYSTEM || request_id == PKGMGR_R_ECOMM || request_id == PKGMGR_R_ERROR) {
503 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
504 } else if (request_id != PKGMGR_R_OK) {
505 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, "Unexpected error");
510 return PACKAGE_MANAGER_ERROR_NONE;
513 API int package_manager_request_move(package_manager_request_h request,
514 const char *name, package_manager_move_type_e move_type)
516 if (package_manager_client_validate_handle(request)) {
517 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
520 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
524 request->pkg_name = name;
525 uid_t uid = getuid();
526 if (uid != GLOBAL_USER)
527 ret = pkgmgr_client_usr_move(request->pc, request->pkg_type, request->pkg_name,
528 move_type, request->mode, uid);
530 ret = pkgmgr_client_move(request->pc, request->pkg_type, request->pkg_name,
531 move_type, request->mode);
532 if (ret == PKGMGR_R_EINVAL) {
533 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
534 } else if (ret == PKGMGR_R_ENOPKG) {
535 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
536 } else if (ret == PKGMGR_R_ENOMEM) {
537 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
538 } else if (ret == PKGMGR_R_EIO) {
539 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
540 } else if (ret == PKGMGR_R_EPRIV) {
541 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
542 } else if (ret == PKGMGR_R_ESYSTEM || ret == PKGMGR_R_ECOMM || ret == PKGMGR_R_ERROR) {
543 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
544 } else if (ret != PKGMGR_R_OK) {
545 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, "Unexpected error");
549 return PACKAGE_MANAGER_ERROR_NONE;
552 API int package_manager_create(package_manager_h * manager)
554 struct package_manager_s *package_manager = NULL;
556 if (manager == NULL) {
558 package_manager_error
559 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
563 package_manager = calloc(1, sizeof(struct package_manager_s));
564 if (package_manager == NULL) {
566 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
568 "failed to create a package_manager handle");
571 package_manager->ctype = PC_LISTENING;
572 package_manager->pc = pkgmgr_client_new(PC_LISTENING);
573 if (package_manager->pc == NULL) {
574 free(package_manager);
576 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
578 "failed to create a package_manager client");
581 package_manager->handle_id = package_manager_new_id();
583 *manager = package_manager;
585 return PACKAGE_MANAGER_ERROR_NONE;
588 static int package_manager_validate_handle(package_manager_h manager)
590 if (manager == NULL || manager->pc == NULL) {
591 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
594 return PACKAGE_MANAGER_ERROR_NONE;
597 API int package_manager_destroy(package_manager_h manager)
599 if (package_manager_validate_handle(manager)) {
601 package_manager_error
602 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
606 pkgmgr_client_free(manager->pc);
610 return PACKAGE_MANAGER_ERROR_NONE;
613 static int __add_event(event_info ** head, int req_id,
614 package_manager_event_type_e event_type,
615 package_manager_event_state_e event_state)
617 event_info *evt_info;
619 evt_info = (event_info *) calloc(1, sizeof(event_info));
620 if (evt_info == NULL) {
621 _LOGD("calloc failed");
624 evt_info->req_id = req_id;
625 evt_info->event_type = event_type;
626 evt_info->next = NULL;
633 static int __find_event(event_info ** head, int req_id,
634 package_manager_event_type_e * event_type,
635 package_manager_event_state_e * event_state)
642 _LOGE("tmp is NULL");
646 *event_type = tmp->event_type;
650 static int __update_event(event_info ** head, int req_id,
651 package_manager_event_type_e event_type,
652 package_manager_event_state_e event_state)
654 package_manager_event_type_e evt_type;
655 package_manager_event_state_e evt_state;
658 if (__find_event_info(head, req_id, &evt_type, &evt_state) != 0)
659 __add_event_info(head, req_id, event_type, event_state);
664 _LOGE("tmp is NULL");
668 tmp->event_type = event_type;
675 static int global_event_handler(int req_id, const char *pkg_type,
676 const char *pkg_name, const char *key,
677 const char *val, const void *pmsg, void *data)
680 package_manager_event_type_e event_type = -1;
681 package_manager_event_state_e event_state = -1;
683 _LOGD("global_event_handler is called");
685 package_manager_h manager = data;
687 if (strcasecmp(key, "start") == 0) {
688 ret = package_manager_get_event_type(val, &event_type);
689 if (ret != PACKAGE_MANAGER_ERROR_NONE)
690 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
692 __add_event(&(manager->head), req_id, event_type,
693 PACKAGE_MANAGER_EVENT_STATE_STARTED);
695 if (manager->event_cb)
696 manager->event_cb(pkg_type, pkg_name,
698 PACKAGE_MANAGER_EVENT_STATE_STARTED,
699 0, PACKAGE_MANAGER_ERROR_NONE, manager->user_data);
701 } else if (strcasecmp(key, "install_percent") == 0
702 || strcasecmp(key, "progress_percent") == 0) {
704 (&(manager->head), req_id, &event_type,
705 &event_state) == 0) {
706 __update_event(&(manager->head), req_id,
708 PACKAGE_MANAGER_EVENT_STATE_PROCESSING);
709 if (manager->event_cb)
710 manager->event_cb(pkg_type, pkg_name,
712 PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
714 PACKAGE_MANAGER_ERROR_NONE,
718 } else if (strcasecmp(key, "error") == 0) {
719 if (strcasecmp(key, "0") != 0) {
721 (&(manager->head), req_id, &event_type,
722 &event_state) == 0) {
723 __update_event(&(manager->head), req_id,
725 PACKAGE_MANAGER_EVENT_STATE_FAILED);
728 if (manager->event_cb)
729 manager->event_cb(pkg_type,
730 pkg_name, event_type,
731 PACKAGE_MANAGER_EVENT_STATE_FAILED,
733 PACKAGE_MANAGER_ERROR_NONE,
737 } else if (strcasecmp(key, "end") == 0) {
739 (&(manager->head), req_id, &event_type,
740 &event_state) == 0) {
741 if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
742 if (manager->event_cb)
743 manager->event_cb(pkg_type,
744 pkg_name, event_type,
745 PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
747 PACKAGE_MANAGER_ERROR_NONE,
751 if (strcasecmp(key, "ok") != 0)
752 if (manager->event_cb)
753 manager->event_cb(pkg_type,
754 pkg_name, event_type,
755 PACKAGE_MANAGER_EVENT_STATE_FAILED,
757 PACKAGE_MANAGER_ERROR_NONE,
762 return PACKAGE_MANAGER_ERROR_NONE;
765 API int package_manager_set_event_status(package_manager_h manager, int status_type)
769 if (manager == NULL){
770 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
773 retval = pkgmgrinfo_client_set_status_type(manager->pc, status_type);
776 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
779 return PACKAGE_MANAGER_ERROR_NONE;
782 API int package_manager_set_event_cb(package_manager_h manager,
783 package_manager_event_cb callback,
786 if (package_manager_validate_handle(manager)) {
788 package_manager_error
789 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
793 manager->event_cb = callback;
794 manager->user_data = user_data;
796 pkgmgr_client_listen_status(manager->pc, global_event_handler, manager);
798 return PACKAGE_MANAGER_ERROR_NONE;
801 API int package_manager_unset_event_cb(package_manager_h manager)
803 // TODO: Please implement this function.
804 return PACKAGE_MANAGER_ERROR_NONE;
807 API int package_manager_get_package_id_by_app_id(const char *app_id, char **package_id)
809 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo;
812 char *pkg_id_dup = NULL;
814 uid_t uid = getuid();
815 if (uid != GLOBAL_USER)
817 if (pkgmgrinfo_appinfo_get_usr_appinfo(app_id, uid, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
818 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
821 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
822 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
824 retval = pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id);
825 if (retval != PMINFO_R_OK)
827 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
830 pkg_id_dup = strdup(pkg_id);
831 if (pkg_id_dup == NULL)
833 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
834 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
837 *package_id = pkg_id_dup;
839 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
841 return PACKAGE_MANAGER_ERROR_NONE;
844 API int package_manager_get_package_info(const char *package_id, package_info_h *package_info)
848 retval = package_info_get_package_info(package_id, package_info);
850 if (retval != PACKAGE_MANAGER_ERROR_NONE)
851 return package_manager_error(retval, __FUNCTION__, NULL);
853 return PACKAGE_MANAGER_ERROR_NONE;
856 API int package_manager_foreach_package_info(package_manager_package_info_cb callback,
861 retval = package_info_foreach_package_info(callback, user_data);
863 if (retval != PACKAGE_MANAGER_ERROR_NONE)
864 return package_manager_error(retval, __FUNCTION__, NULL);
867 return PACKAGE_MANAGER_ERROR_NONE;
871 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)
873 pkgmgrinfo_cert_compare_result_type_e result;
874 uid_t uid = getuid();
876 if (lhs_package_id == NULL || rhs_package_id == NULL || compare_result == NULL)
877 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
878 if (uid != GLOBAL_USER)
880 if (pkgmgrinfo_pkginfo_compare_usr_pkg_cert_info(lhs_package_id, rhs_package_id, uid, &result) != PKGMGR_R_OK)
881 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
884 if (pkgmgrinfo_pkginfo_compare_pkg_cert_info(lhs_package_id, rhs_package_id, &result) != PKGMGR_R_OK)
885 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
887 *compare_result = (package_manager_compare_result_type_e)result;
889 return PACKAGE_MANAGER_ERROR_NONE;
892 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)
894 pkgmgrinfo_cert_compare_result_type_e result;
895 uid_t uid = getuid();
897 if (lhs_app_id == NULL || rhs_app_id == NULL || compare_result == NULL)
898 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
899 if (uid != GLOBAL_USER)
901 if (pkgmgrinfo_pkginfo_compare_usr_app_cert_info(lhs_app_id, rhs_app_id, uid, &result) != PKGMGR_R_OK)
902 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
905 if (pkgmgrinfo_pkginfo_compare_app_cert_info(lhs_app_id, rhs_app_id, &result) != PKGMGR_R_OK)
906 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
909 *compare_result = (package_manager_compare_result_type_e)result;
911 return PACKAGE_MANAGER_ERROR_NONE;
914 API int package_manager_is_preload_package_by_app_id(const char *app_id, bool *preload)
916 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo = NULL;
917 pkgmgrinfo_pkginfo_h pkgmgrinfo_pkginfo = NULL;
922 uid_t uid = getuid();
923 if (uid != GLOBAL_USER)
925 if (pkgmgrinfo_appinfo_get_usr_appinfo(app_id, uid, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
926 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
929 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
930 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
932 retval = pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id);
933 if (retval != PMINFO_R_OK)
935 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
936 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
938 if (uid != GLOBAL_USER)
940 if (pkgmgrinfo_pkginfo_get_usr_pkginfo(pkg_id, uid, &pkgmgrinfo_pkginfo) != PMINFO_R_OK)
942 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
943 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
944 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
948 if (pkgmgrinfo_pkginfo_get_pkginfo(pkg_id, &pkgmgrinfo_pkginfo) != PMINFO_R_OK)
950 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
951 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
952 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
955 if (pkgmgrinfo_pkginfo_is_preload(pkgmgrinfo_pkginfo, &is_preload) != PMINFO_R_OK)
957 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
958 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
959 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
967 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
968 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
970 return PACKAGE_MANAGER_ERROR_NONE;
973 API int package_manager_get_permission_type(const char *app_id, package_manager_permission_type_e *permission_type)
976 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo =NULL;
977 pkgmgrinfo_permission_type permission = 0;
978 uid_t uid = getuid();
979 if (uid != GLOBAL_USER)
981 if (pkgmgrinfo_appinfo_get_usr_appinfo(app_id, uid, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
982 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
984 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
985 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
987 retval = pkgmgrinfo_appinfo_get_permission_type(pkgmgrinfo_appinfo, &permission);
988 if (retval != PMINFO_R_OK)
989 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
991 if (permission == PMINFO_PERMISSION_NORMAL)
992 *permission_type = PACKAGE_MANAGER_PERMISSION_NORMAL;
993 else if (permission == PMINFO_PERMISSION_SIGNATURE)
994 *permission_type = PACKAGE_MANAGER_PERMISSION_SIGNATURE;
995 else if (permission == PMINFO_PERMISSION_PRIVILEGE)
996 *permission_type = PACKAGE_MANAGER_PERMISSION_PRIVILEGE;
998 *permission_type = PACKAGE_MANAGER_PERMISSION_NORMAL;
1000 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1001 return PACKAGE_MANAGER_ERROR_NONE;
1004 API int package_manager_clear_cache_dir(const char *package_id)
1006 int res = pkgmgr_client_clear_cache_dir(package_id);
1007 if (res == PKGMGR_R_EINVAL)
1009 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1011 else if (res == PKGMGR_R_ENOPKG)
1013 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1015 else if (res == PKGMGR_R_ENOMEM)
1017 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1019 else if (res == PKGMGR_R_EIO)
1021 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1023 else if (res == PKGMGR_R_EPRIV)
1025 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
1027 else if (res == PKGMGR_R_ESYSTEM || res == PKGMGR_R_ECOMM || res == PKGMGR_R_ERROR)
1029 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1031 else if (res != PKGMGR_R_OK)
1033 _LOGE("Unexpected error");
1034 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1037 return PACKAGE_MANAGER_ERROR_NONE;
1040 API int package_manager_clear_all_cache_dir(void)
1042 return package_manager_clear_cache_dir(PKG_CLEAR_ALL_CACHE);
1045 static void __initialize_cb_table(void)
1047 __cb_table = g_hash_table_new_full(g_int_hash, g_int_equal, pkgmgr_client_free, NULL);
1050 static void __result_cb(pkgmgr_client *pc, const char *pkgid, const pkg_size_info_t *result, void *user_data)
1052 package_manager_size_info_receive_cb callback = g_hash_table_lookup(__cb_table, pc);
1053 if (callback == NULL)
1055 _LOGE("callback is null.");
1056 g_hash_table_remove(__cb_table, pc);
1060 package_size_info_t size_info;
1061 size_info.data_size = result->data_size;
1062 size_info.cache_size = result->cache_size;
1063 size_info.app_size = result->app_size;
1064 size_info.external_data_size = result->ext_data_size;
1065 size_info.external_cache_size = result->ext_cache_size;
1066 size_info.external_app_size = result->ext_app_size;
1068 callback(pkgid, &size_info, user_data);
1070 g_hash_table_remove(__cb_table, pc);
1073 static void __total_result_cb(pkgmgr_client *pc, const pkg_size_info_t *result, void *user_data)
1075 package_manager_total_size_info_receive_cb callback = g_hash_table_lookup(__cb_table, pc);
1076 if (callback == NULL)
1078 _LOGE("callback is null.");
1079 g_hash_table_remove(__cb_table, pc);
1083 package_size_info_t size_info;
1084 size_info.data_size = result->data_size;
1085 size_info.cache_size = result->cache_size;
1086 size_info.app_size = result->app_size;
1087 size_info.external_data_size = result->ext_data_size;
1088 size_info.external_cache_size = result->ext_cache_size;
1089 size_info.external_app_size = result->ext_app_size;
1091 callback(&size_info, user_data);
1093 g_hash_table_remove(__cb_table, pc);
1096 API int package_manager_get_package_size_info(const char *package_id, package_manager_size_info_receive_cb callback, void *user_data)
1098 if (package_id == NULL || callback == NULL)
1100 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1103 if (__cb_table == NULL)
1105 __initialize_cb_table();
1108 pkgmgr_client *pc = pkgmgr_client_new(PC_REQUEST);
1111 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1115 if (strcmp(package_id, PKG_SIZE_INFO_TOTAL) != 0)
1117 res = pkgmgr_client_get_package_size_info(pc, package_id, __result_cb, user_data);
1121 res = pkgmgr_client_get_total_package_size_info(pc, __total_result_cb, user_data);
1124 if (res == PKGMGR_R_EINVAL)
1126 pkgmgr_client_free(pc);
1127 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1129 else if (res == PKGMGR_R_ENOPKG)
1131 pkgmgr_client_free(pc);
1132 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1134 else if (res == PKGMGR_R_ENOMEM)
1136 pkgmgr_client_free(pc);
1137 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1139 else if (res == PKGMGR_R_EIO)
1141 pkgmgr_client_free(pc);
1142 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1144 else if (res == PKGMGR_R_EPRIV)
1146 pkgmgr_client_free(pc);
1147 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
1149 else if (res == PKGMGR_R_ESYSTEM || res == PKGMGR_R_ECOMM || res == PKGMGR_R_ERROR)
1151 pkgmgr_client_free(pc);
1152 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1154 else if (res != PKGMGR_R_OK)
1156 _LOGE("Unexpected error");
1157 pkgmgr_client_free(pc);
1158 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1161 g_hash_table_insert(__cb_table, pc, callback);
1163 _LOGD("Successful");
1164 return PACKAGE_MANAGER_ERROR_NONE;
1167 API int package_manager_get_total_package_size_info(package_manager_total_size_info_receive_cb callback, void *user_data)
1169 return package_manager_get_package_size_info(PKG_SIZE_INFO_TOTAL, callback, user_data);
1172 API int package_manager_filter_create(package_manager_filter_h *handle)
1175 pkgmgrinfo_pkginfo_filter_h pkgmgr_filter = NULL;
1180 package_manager_error
1181 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1185 retval = pkgmgrinfo_pkginfo_filter_create(&pkgmgr_filter);
1186 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1188 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1191 *handle = pkgmgr_filter;
1193 return PACKAGE_MANAGER_ERROR_NONE;
1196 API int package_manager_filter_destroy(package_manager_filter_h handle)
1203 package_manager_error
1204 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1208 retval = pkgmgrinfo_pkginfo_filter_destroy(handle);
1209 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1211 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1214 return PACKAGE_MANAGER_ERROR_NONE;
1217 API int package_manager_filter_add_bool(package_manager_filter_h handle,
1218 const char *property, const bool value)
1222 if ((handle == NULL) || (property == NULL))
1225 package_manager_error
1226 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1230 retval = pkgmgrinfo_pkginfo_filter_add_bool(handle, property, value);
1231 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1233 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1236 return PACKAGE_MANAGER_ERROR_NONE;
1239 API int package_manager_filter_count(package_manager_filter_h handle, int *count)
1243 if ((handle == NULL) || (count == NULL))
1245 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1248 retval = pkgmgrinfo_pkginfo_filter_count(handle, count);
1251 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1254 return PACKAGE_MANAGER_ERROR_NONE;
1257 API int package_manager_filter_foreach_package_info(package_manager_filter_h handle,
1258 package_manager_package_info_cb callback, void *user_data)
1262 retval = package_info_filter_foreach_package_info(handle, callback, user_data);
1264 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1266 return package_manager_error(retval, __FUNCTION__, NULL);
1270 return PACKAGE_MANAGER_ERROR_NONE;