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 <package_manager.h>
24 #include <package_manager_private.h>
25 #include <pkgmgr-info.h>
32 #define LOG_TAG "CAPI_APPFW_PACKAGE_MANAGER"
34 #define _LOGE(fmt, arg...) LOGE(fmt,##arg)
35 #define _LOGD(fmt, arg...) LOGD(fmt, ##arg)
38 typedef struct _event_info {
40 package_manager_event_type_e event_type;
41 package_manager_event_state_e event_state;
42 struct _event_info *next;
45 struct package_manager_s {
51 package_manager_event_cb event_cb;
55 struct package_manager_request_s {
64 package_manager_request_event_cb event_cb;
68 static int package_manager_request_new_id()
70 static int request_handle_id = 0;
71 return request_handle_id++;
74 static int package_manager_new_id()
76 static int manager_handle_id = 0;
77 return manager_handle_id++;
80 static const char *package_manager_error_to_string(package_manager_error_e
84 case PACKAGE_MANAGER_ERROR_NONE:
87 case PACKAGE_MANAGER_ERROR_INVALID_PARAMETER:
88 return "INVALID_PARAMETER";
90 case PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY:
91 return "OUT_OF_MEMORY";
93 case PACKAGE_MANAGER_ERROR_IO_ERROR:
100 int package_manager_error(package_manager_error_e error,
101 const char *function, const char *description)
104 _LOGE("[%s] %s(0x%08x) : %s", function,
105 package_manager_error_to_string(error), error,
108 _LOGE("[%s] %s(0x%08x)", function,
109 package_manager_error_to_string(error), error);
115 int package_manager_request_create(package_manager_request_h * request)
117 struct package_manager_request_s *package_manager_request;
119 if (request == NULL) {
121 package_manager_error
122 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
126 package_manager_request =
127 calloc(1, sizeof(struct package_manager_request_s));
128 if (package_manager_request == NULL) {
130 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
132 "failed to create a package_manager handle");
135 package_manager_request->ctype = PC_REQUEST;
136 package_manager_request->pc = pkgmgr_client_new(PC_REQUEST);
137 if (package_manager_request->pc == NULL) {
138 free(package_manager_request);
140 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
142 "failed to create a package_manager client");
145 package_manager_request->handle_id = package_manager_request_new_id();
147 *request = package_manager_request;
149 return PACKAGE_MANAGER_ERROR_NONE;
152 static int package_manager_client_valiate_handle(package_manager_request_h
155 if (request == NULL || request->pc == NULL) {
156 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
159 return PACKAGE_MANAGER_ERROR_NONE;
162 int package_manager_client_destroy(package_manager_request_h request)
164 if (package_manager_client_valiate_handle(request)) {
166 package_manager_error
167 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
171 pkgmgr_client_free(request->pc);
175 return PACKAGE_MANAGER_ERROR_NONE;
178 int package_manager_request_destroy(package_manager_request_h request)
180 if (package_manager_client_valiate_handle(request)) {
182 package_manager_error
183 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
187 pkgmgr_client_free(request->pc);
191 return PACKAGE_MANAGER_ERROR_NONE;
194 int package_manager_request_set_event_cb(package_manager_request_h request,
195 package_manager_request_event_cb
196 callback, void *user_data)
198 if (package_manager_client_valiate_handle(request)) {
200 package_manager_error
201 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
205 request->event_cb = callback;
206 request->user_data = user_data;
208 return PACKAGE_MANAGER_ERROR_NONE;
211 int package_manager_request_unset_event_cb(package_manager_request_h request)
213 // TODO: Please implement this function.
214 return PACKAGE_MANAGER_ERROR_NONE;
218 int package_manager_request_set_type(package_manager_request_h request,
219 const char *pkg_type)
221 if (package_manager_client_valiate_handle(request)) {
223 package_manager_error
224 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
228 request->pkg_type = pkg_type;
230 return PACKAGE_MANAGER_ERROR_NONE;
233 int package_manager_request_set_mode(package_manager_request_h request,
234 package_manager_request_mode_e mode)
236 if (package_manager_client_valiate_handle(request)) {
238 package_manager_error
239 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
243 if (mode == PACKAGE_MANAGER_REQUEST_MODE_QUIET)
244 request->mode = PM_QUIET;
246 request->mode = PM_DEFAULT;
248 return PACKAGE_MANAGER_ERROR_NONE;
251 static int package_manager_get_event_type(const char *key,
252 package_manager_event_type_e *
256 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
258 if (strcasecmp(key, "install") == 0)
259 *event_type = PACKAGE_MANAGER_EVENT_TYPE_INSTALL;
260 else if (strcasecmp(key, "uninstall") == 0)
261 *event_type = PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL;
262 else if (strcasecmp(key, "update") == 0)
263 *event_type = PACKAGE_MANAGER_EVENT_TYPE_UPDATE;
265 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
267 return PACKAGE_MANAGER_ERROR_NONE;
270 static int __add_event_info(event_info ** head, int req_id,
271 package_manager_event_type_e event_type,
272 package_manager_event_state_e event_state)
274 event_info *evt_info;
278 evt_info = (event_info *) calloc(1, sizeof(event_info));
279 if (evt_info == NULL) {
280 _LOGD("calloc failed");
283 evt_info->req_id = req_id;
284 evt_info->event_type = event_type;
285 evt_info->next = NULL;
290 current = prev = *head;
293 current = current->next;
296 prev->next = evt_info;
302 static int __find_event_info(event_info ** head, int req_id,
303 package_manager_event_type_e * event_type,
304 package_manager_event_state_e * event_state)
311 _LOGE("tmp is NULL");
315 _LOGD("tmp->req_id %d, event_type %d", tmp->req_id, event_type);
318 if (tmp->req_id == req_id) {
319 *event_type = tmp->event_type;
327 static int __update_event_info(event_info ** head, int req_id,
328 package_manager_event_type_e event_type,
329 package_manager_event_state_e event_state)
331 package_manager_event_type_e evt_type;
332 package_manager_event_state_e evt_state;
335 if (__find_event_info(head, req_id, &evt_type, &evt_state) != 0)
336 __add_event_info(head, req_id, event_type, event_state);
341 _LOGE("tmp is NULL");
346 if (tmp->req_id == req_id) {
347 tmp->event_type = event_type;
358 static int __remove_event_info(event_info **head request, int req_id)
369 if (current->next->req_id == req_id) {
371 current->next = current->next->next;
383 static int request_event_handler(int req_id, const char *pkg_type,
384 const char *pkg_name, const char *key,
385 const char *val, const void *pmsg, void *data)
388 package_manager_event_type_e event_type = -1;
389 package_manager_event_state_e event_state = -1;
391 _LOGD("request_event_handler is called");
393 package_manager_request_h request = data;
395 if (strcasecmp(key, "start") == 0) {
396 ret = package_manager_get_event_type(val, &event_type);
397 if (ret != PACKAGE_MANAGER_ERROR_NONE)
398 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
400 __add_event_info(&(request->head), req_id, event_type,
401 PACKAGE_MANAGER_EVENT_STATE_STARTED);
403 if (request->event_cb)
404 request->event_cb(req_id, pkg_type, pkg_name,
406 PACKAGE_MANAGER_EVENT_STATE_STARTED,
407 0, PACKAGE_MANAGER_ERROR_NONE, request->user_data);
409 } else if (strcasecmp(key, "install_percent") == 0
410 || strcasecmp(key, "progress_percent") == 0) {
411 if (__find_event_info
412 (&(request->head), req_id, &event_type,
413 &event_state) == 0) {
414 __update_event_info(&(request->head), req_id,
416 PACKAGE_MANAGER_EVENT_STATE_PROCESSING);
417 if (request->event_cb)
418 request->event_cb(req_id, pkg_type, pkg_name,
420 PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
422 PACKAGE_MANAGER_ERROR_NONE,
426 } else if (strcasecmp(key, "error") == 0) {
427 if (strcasecmp(key, "0") != 0) {
428 if (__find_event_info
429 (&(request->head), req_id, &event_type,
430 &event_state) == 0) {
431 __update_event_info(&(request->head), req_id,
433 PACKAGE_MANAGER_EVENT_STATE_FAILED);
436 if (request->event_cb)
437 request->event_cb(req_id, pkg_type,
438 pkg_name, event_type,
439 PACKAGE_MANAGER_EVENT_STATE_FAILED,
441 PACKAGE_MANAGER_ERROR_NONE,
445 } else if (strcasecmp(key, "end") == 0) {
446 if (__find_event_info
447 (&(request->head), req_id, &event_type,
448 &event_state) == 0) {
449 if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
450 if (request->event_cb)
451 request->event_cb(req_id, pkg_type,
452 pkg_name, event_type,
453 PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
455 PACKAGE_MANAGER_ERROR_NONE,
459 if (strcasecmp(key, "ok") != 0)
460 if (request->event_cb)
461 request->event_cb(req_id, pkg_type,
462 pkg_name, event_type,
463 PACKAGE_MANAGER_EVENT_STATE_FAILED,
465 PACKAGE_MANAGER_ERROR_NONE,
470 return PACKAGE_MANAGER_ERROR_NONE;
473 int package_manager_request_install(package_manager_request_h request,
474 const char *path, int *id)
477 request->pkg_path = path;
478 uid_t uid = getuid();
479 if (uid != GLOBAL_USER)
480 request_id = pkgmgr_client_usr_install(request->pc, request->pkg_type, NULL,
481 request->pkg_path, NULL,
482 request->mode, request_event_handler,
486 request_id = pkgmgr_client_install(request->pc, request->pkg_type, NULL,
487 request->pkg_path, NULL,
488 request->mode, request_event_handler,
491 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
495 return PACKAGE_MANAGER_ERROR_NONE;
498 int package_manager_request_uninstall(package_manager_request_h request,
499 const char *name, int *id)
502 request->pkg_name = name;
503 uid_t uid = getuid();
504 if (uid != GLOBAL_USER)
505 request_id = pkgmgr_client_usr_uninstall(request->pc, request->pkg_type,
506 request->pkg_name, request->mode,
507 request_event_handler, request, uid);
509 request_id = pkgmgr_client_uninstall(request->pc, request->pkg_type,
510 request->pkg_name, request->mode,
511 request_event_handler, request);
513 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
517 return PACKAGE_MANAGER_ERROR_NONE;
520 int package_manager_request_move(package_manager_request_h request,
521 const char *name, package_manager_move_type_e move_type)
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);
533 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
535 return PACKAGE_MANAGER_ERROR_NONE;
537 int package_manager_create(package_manager_h * manager)
539 struct package_manager_s *package_manager = NULL;
541 if (manager == NULL) {
543 package_manager_error
544 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
548 package_manager = calloc(1, sizeof(struct package_manager_s));
549 if (package_manager == NULL) {
551 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
553 "failed to create a package_manager handle");
556 package_manager->ctype = PC_LISTENING;
557 package_manager->pc = pkgmgr_client_new(PC_LISTENING);
558 if (package_manager->pc == NULL) {
559 free(package_manager);
561 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
563 "failed to create a package_manager client");
566 package_manager->handle_id = package_manager_new_id();
568 *manager = package_manager;
570 return PACKAGE_MANAGER_ERROR_NONE;
573 static int package_manager_valiate_handle(package_manager_h manager)
575 if (manager == NULL || manager->pc == NULL) {
576 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
579 return PACKAGE_MANAGER_ERROR_NONE;
582 int package_manager_destroy(package_manager_h manager)
584 if (package_manager_valiate_handle(manager)) {
586 package_manager_error
587 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
591 pkgmgr_client_free(manager->pc);
595 return PACKAGE_MANAGER_ERROR_NONE;
598 static int __add_event(event_info ** head, int req_id,
599 package_manager_event_type_e event_type,
600 package_manager_event_state_e event_state)
602 event_info *evt_info;
604 evt_info = (event_info *) calloc(1, sizeof(event_info));
605 if (evt_info == NULL) {
606 _LOGD("calloc failed");
609 evt_info->req_id = req_id;
610 evt_info->event_type = event_type;
611 evt_info->next = NULL;
618 static int __find_event(event_info ** head, int req_id,
619 package_manager_event_type_e * event_type,
620 package_manager_event_state_e * event_state)
627 _LOGE("tmp is NULL");
631 *event_type = tmp->event_type;
635 static int __update_event(event_info ** head, int req_id,
636 package_manager_event_type_e event_type,
637 package_manager_event_state_e event_state)
639 package_manager_event_type_e evt_type;
640 package_manager_event_state_e evt_state;
643 if (__find_event_info(head, req_id, &evt_type, &evt_state) != 0)
644 __add_event_info(head, req_id, event_type, event_state);
649 _LOGE("tmp is NULL");
653 tmp->event_type = event_type;
660 static int global_event_handler(int req_id, const char *pkg_type,
661 const char *pkg_name, const char *key,
662 const char *val, const void *pmsg, void *data)
665 package_manager_event_type_e event_type = -1;
666 package_manager_event_state_e event_state = -1;
668 _LOGD("global_event_handler is called");
670 package_manager_h manager = data;
672 if (strcasecmp(key, "start") == 0) {
673 ret = package_manager_get_event_type(val, &event_type);
674 if (ret != PACKAGE_MANAGER_ERROR_NONE)
675 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
677 __add_event(&(manager->head), req_id, event_type,
678 PACKAGE_MANAGER_EVENT_STATE_STARTED);
680 if (manager->event_cb)
681 manager->event_cb(pkg_type, pkg_name,
683 PACKAGE_MANAGER_EVENT_STATE_STARTED,
684 0, PACKAGE_MANAGER_ERROR_NONE, manager->user_data);
686 } else if (strcasecmp(key, "install_percent") == 0
687 || strcasecmp(key, "progress_percent") == 0) {
689 (&(manager->head), req_id, &event_type,
690 &event_state) == 0) {
691 __update_event(&(manager->head), req_id,
693 PACKAGE_MANAGER_EVENT_STATE_PROCESSING);
694 if (manager->event_cb)
695 manager->event_cb(pkg_type, pkg_name,
697 PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
699 PACKAGE_MANAGER_ERROR_NONE,
703 } else if (strcasecmp(key, "error") == 0) {
704 if (strcasecmp(key, "0") != 0) {
706 (&(manager->head), req_id, &event_type,
707 &event_state) == 0) {
708 __update_event(&(manager->head), req_id,
710 PACKAGE_MANAGER_EVENT_STATE_FAILED);
713 if (manager->event_cb)
714 manager->event_cb(pkg_type,
715 pkg_name, event_type,
716 PACKAGE_MANAGER_EVENT_STATE_FAILED,
718 PACKAGE_MANAGER_ERROR_NONE,
722 } else if (strcasecmp(key, "end") == 0) {
724 (&(manager->head), req_id, &event_type,
725 &event_state) == 0) {
726 if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
727 if (manager->event_cb)
728 manager->event_cb(pkg_type,
729 pkg_name, event_type,
730 PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
732 PACKAGE_MANAGER_ERROR_NONE,
736 if (strcasecmp(key, "ok") != 0)
737 if (manager->event_cb)
738 manager->event_cb(pkg_type,
739 pkg_name, event_type,
740 PACKAGE_MANAGER_EVENT_STATE_FAILED,
742 PACKAGE_MANAGER_ERROR_NONE,
747 return PACKAGE_MANAGER_ERROR_NONE;
750 int package_manager_set_event_cb(package_manager_h manager,
751 package_manager_event_cb callback,
754 if (package_manager_valiate_handle(manager)) {
756 package_manager_error
757 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
761 manager->event_cb = callback;
762 manager->user_data = user_data;
764 pkgmgr_client_listen_status(manager->pc, global_event_handler, manager);
766 return PACKAGE_MANAGER_ERROR_NONE;
769 int package_manager_unset_event_cb(package_manager_h manager)
771 // TODO: Please implement this function.
772 return PACKAGE_MANAGER_ERROR_NONE;
775 int package_manager_get_package_id_by_app_id(const char *app_id, char **package_id)
777 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo;
780 char *pkg_id_dup = NULL;
782 uid_t uid = getuid();
783 if (uid != GLOBAL_USER)
785 if (pkgmgrinfo_appinfo_get_usr_appinfo(app_id, uid, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
786 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
789 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
790 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
792 retval = pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id);
793 if (retval != PMINFO_R_OK)
795 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
798 pkg_id_dup = strdup(pkg_id);
799 if (pkg_id_dup == NULL)
801 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
802 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
805 *package_id = pkg_id_dup;
807 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
809 return PACKAGE_MANAGER_ERROR_NONE;
812 int package_manager_get_package_info(const char *package_id, package_info_h *package_info)
816 retval = package_info_get_package_info(package_id, package_info);
818 if (retval != PACKAGE_MANAGER_ERROR_NONE)
819 return package_manager_error(retval, __FUNCTION__, NULL);
821 return PACKAGE_MANAGER_ERROR_NONE;
824 int package_manager_foreach_package_info(package_manager_package_info_cb callback,
829 retval = package_info_foreach_package_info(callback, user_data);
831 if (retval != PACKAGE_MANAGER_ERROR_NONE)
832 return package_manager_error(retval, __FUNCTION__, NULL);
835 return PACKAGE_MANAGER_ERROR_NONE;
838 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)
840 pkgmgrinfo_cert_compare_result_type_e result;
841 uid_t uid = getuid();
843 if (lhs_package_id == NULL || rhs_package_id == NULL || compare_result == NULL)
844 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
845 if (uid != GLOBAL_USER)
847 if (pkgmgrinfo_pkginfo_compare_usr_pkg_cert_info(lhs_package_id, rhs_package_id, uid, &result) != PKGMGR_R_OK)
848 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
851 if (pkgmgrinfo_pkginfo_compare_pkg_cert_info(lhs_package_id, rhs_package_id, &result) != PKGMGR_R_OK)
852 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
854 *compare_result = (package_manager_compare_result_type_e)result;
856 return PACKAGE_MANAGER_ERROR_NONE;
859 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)
861 pkgmgrinfo_cert_compare_result_type_e result;
862 uid_t uid = getuid();
864 if (lhs_app_id == NULL || rhs_app_id == NULL || compare_result == NULL)
865 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
866 if (uid != GLOBAL_USER)
868 if (pkgmgrinfo_pkginfo_compare_usr_app_cert_info(lhs_app_id, rhs_app_id, uid, &result) != PKGMGR_R_OK)
869 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
872 if (pkgmgrinfo_pkginfo_compare_app_cert_info(lhs_app_id, rhs_app_id, &result) != PKGMGR_R_OK)
873 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
876 *compare_result = (package_manager_compare_result_type_e)result;
878 return PACKAGE_MANAGER_ERROR_NONE;
881 int package_manager_is_preload_package_by_app_id(const char *app_id, bool *preload)
883 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo = NULL;
884 pkgmgrinfo_pkginfo_h pkgmgrinfo_pkginfo = NULL;
889 uid_t uid = getuid();
890 if (uid != GLOBAL_USER)
892 if (pkgmgrinfo_appinfo_get_usr_appinfo(app_id, uid, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
893 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
896 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
897 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
899 retval = pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id);
900 if (retval != PMINFO_R_OK)
902 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
903 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
905 if (uid != GLOBAL_USER)
907 if (pkgmgrinfo_pkginfo_get_usr_pkginfo(pkg_id, uid, &pkgmgrinfo_pkginfo) != PMINFO_R_OK)
909 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
910 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
911 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
915 if (pkgmgrinfo_pkginfo_get_pkginfo(pkg_id, &pkgmgrinfo_pkginfo) != PMINFO_R_OK)
917 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
918 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
919 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
922 if (pkgmgrinfo_pkginfo_is_preload(pkgmgrinfo_pkginfo, &is_preload) != PMINFO_R_OK)
924 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
925 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
926 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
934 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
935 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
937 return PACKAGE_MANAGER_ERROR_NONE;
940 int package_manager_get_permission_type(const char *app_id, package_manager_permission_type_e *permission_type)
943 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo =NULL;
944 pkgmgrinfo_permission_type permission = 0;
945 uid_t uid = getuid();
946 if (uid != GLOBAL_USER)
948 if (pkgmgrinfo_appinfo_get_usr_appinfo(app_id, uid, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
949 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
951 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
952 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
954 retval = pkgmgrinfo_appinfo_get_permission_type(pkgmgrinfo_appinfo, &permission);
955 if (retval != PMINFO_R_OK)
956 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
958 if (permission == PMINFO_PERMISSION_NORMAL)
959 *permission_type = PACKAGE_MANAGER_PERMISSION_NORMAL;
960 else if (permission == PMINFO_PERMISSION_SIGNATURE)
961 *permission_type = PACKAGE_MANAGER_PERMISSION_SIGNATURE;
962 else if (permission == PMINFO_PERMISSION_PRIVILEGE)
963 *permission_type = PACKAGE_MANAGER_PERMISSION_PRIVILEGE;
965 *permission_type = PACKAGE_MANAGER_PERMISSION_NORMAL;
967 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
968 return PACKAGE_MANAGER_ERROR_NONE;