2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
22 #include <package-manager.h>
23 #include <pkgmgr-info.h>
24 #include <tzplatform_config.h>
26 #include "package_manager.h"
27 #include "package_manager_internal.h"
29 static GHashTable *__cb_table = NULL;
31 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
32 typedef struct _event_info {
34 package_manager_event_type_e event_type;
35 package_manager_event_state_e event_state;
36 struct _event_info *next;
39 struct package_manager_s {
45 package_manager_event_cb event_cb;
46 package_manager_global_event_cb global_event_cb;
50 struct package_manager_request_s {
59 package_manager_request_event_cb event_cb;
63 struct package_manager_filter_s {
64 pkgmgrinfo_pkginfo_filter_h pkgmgrinfo_pkginfo_filter;
67 static int package_manager_request_new_id()
69 static int request_handle_id = 0;
70 return request_handle_id++;
73 static int package_manager_new_id()
75 static int manager_handle_id = 0;
76 return manager_handle_id++;
79 API int package_manager_request_create(package_manager_request_h *request)
81 struct package_manager_request_s *package_manager_request;
83 if (request == NULL) {
86 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
90 package_manager_request =
91 calloc(1, sizeof(struct package_manager_request_s));
92 if (package_manager_request == NULL) {
94 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
96 "failed to create a package_manager handle");
99 package_manager_request->ctype = PC_REQUEST;
100 package_manager_request->pc = pkgmgr_client_new(PC_REQUEST);
101 if (package_manager_request->pc == NULL) {
102 free(package_manager_request);
104 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
106 "failed to create a package_manager client");
109 package_manager_request->handle_id = package_manager_request_new_id();
111 *request = package_manager_request;
113 return PACKAGE_MANAGER_ERROR_NONE;
116 static int package_manager_client_validate_handle(package_manager_request_h
119 if (request == NULL || request->pc == NULL) {
120 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
123 return PACKAGE_MANAGER_ERROR_NONE;
126 API int package_manager_request_destroy(package_manager_request_h request)
128 if (package_manager_client_validate_handle(request)) {
130 package_manager_error
131 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
135 pkgmgr_client_free(request->pc);
139 return PACKAGE_MANAGER_ERROR_NONE;
142 API int package_manager_request_set_event_cb(package_manager_request_h request,
143 package_manager_request_event_cb
144 callback, void *user_data)
146 if (package_manager_client_validate_handle(request)) {
148 package_manager_error
149 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
153 request->event_cb = callback;
154 request->user_data = user_data;
156 return PACKAGE_MANAGER_ERROR_NONE;
159 API int package_manager_request_unset_event_cb(package_manager_request_h request)
161 // TODO: Please implement this function.
162 if (package_manager_client_validate_handle(request)) {
163 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
166 return PACKAGE_MANAGER_ERROR_NONE;
170 API int package_manager_request_set_type(package_manager_request_h request,
171 const char *pkg_type)
173 if (package_manager_client_validate_handle(request)) {
175 package_manager_error
176 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
180 request->pkg_type = pkg_type;
182 return PACKAGE_MANAGER_ERROR_NONE;
185 API int package_manager_request_set_mode(package_manager_request_h request,
186 package_manager_request_mode_e mode)
188 if (package_manager_client_validate_handle(request)) {
190 package_manager_error
191 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
195 if (mode == PACKAGE_MANAGER_REQUEST_MODE_QUIET)
196 request->mode = PM_QUIET;
198 request->mode = PM_DEFAULT;
200 return PACKAGE_MANAGER_ERROR_NONE;
203 static int package_manager_get_event_type(const char *key,
204 package_manager_event_type_e *
208 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
210 if (strcasecmp(key, "install") == 0)
211 *event_type = PACKAGE_MANAGER_EVENT_TYPE_INSTALL;
212 else if (strcasecmp(key, "uninstall") == 0)
213 *event_type = PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL;
214 else if (strcasecmp(key, "update") == 0)
215 *event_type = PACKAGE_MANAGER_EVENT_TYPE_UPDATE;
217 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
219 return PACKAGE_MANAGER_ERROR_NONE;
222 static int __add_event_info(event_info ** head, int req_id,
223 package_manager_event_type_e event_type,
224 package_manager_event_state_e event_state)
226 event_info *evt_info;
230 evt_info = (event_info *) calloc(1, sizeof(event_info));
231 if (evt_info == NULL) {
232 _LOGD("calloc failed");
235 evt_info->req_id = req_id;
236 evt_info->event_type = event_type;
237 evt_info->next = NULL;
242 current = prev = *head;
245 current = current->next;
248 prev->next = evt_info;
254 static int __find_event_info(event_info ** head, int req_id,
255 package_manager_event_type_e * event_type,
256 package_manager_event_state_e * event_state)
263 _LOGE("tmp is NULL");
267 _LOGD("tmp->req_id %d, event_type %d", tmp->req_id, event_type);
270 if (tmp->req_id == req_id) {
271 *event_type = tmp->event_type;
279 static int __update_event_info(event_info ** head, int req_id,
280 package_manager_event_type_e event_type,
281 package_manager_event_state_e event_state)
283 package_manager_event_type_e evt_type;
284 package_manager_event_state_e evt_state;
287 if (__find_event_info(head, req_id, &evt_type, &evt_state) != 0)
288 __add_event_info(head, req_id, event_type, event_state);
293 _LOGE("tmp is NULL");
298 if (tmp->req_id == req_id) {
299 tmp->event_type = event_type;
310 static int __remove_event_info(event_info **head request, int req_id)
321 if (current->next->req_id == req_id) {
323 current->next = current->next->next;
335 static int request_event_handler(uid_t target_uid, int req_id, const char *pkg_type,
336 const char *pkg_name, const char *key,
337 const char *val, const void *pmsg, void *data)
340 package_manager_event_type_e event_type = -1;
341 package_manager_event_state_e event_state = -1;
343 _LOGD("request_event_handler is called");
345 package_manager_request_h request = data;
347 if (strcasecmp(key, "start") == 0) {
348 ret = package_manager_get_event_type(val, &event_type);
349 if (ret != PACKAGE_MANAGER_ERROR_NONE)
350 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
352 __add_event_info(&(request->head), req_id, event_type,
353 PACKAGE_MANAGER_EVENT_STATE_STARTED);
355 if (request->event_cb)
356 request->event_cb(req_id, pkg_type, pkg_name,
358 PACKAGE_MANAGER_EVENT_STATE_STARTED,
359 0, PACKAGE_MANAGER_ERROR_NONE, request->user_data);
361 } else if (strcasecmp(key, "install_percent") == 0
362 || strcasecmp(key, "progress_percent") == 0) {
363 if (__find_event_info
364 (&(request->head), req_id, &event_type,
365 &event_state) == 0) {
366 __update_event_info(&(request->head), req_id,
368 PACKAGE_MANAGER_EVENT_STATE_PROCESSING);
369 if (request->event_cb)
370 request->event_cb(req_id, pkg_type, pkg_name,
372 PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
374 PACKAGE_MANAGER_ERROR_NONE,
378 } else if (strcasecmp(key, "error") == 0) {
379 if (strcasecmp(key, "0") != 0) {
380 if (__find_event_info
381 (&(request->head), req_id, &event_type,
382 &event_state) == 0) {
383 __update_event_info(&(request->head), req_id,
385 PACKAGE_MANAGER_EVENT_STATE_FAILED);
388 if (request->event_cb)
389 request->event_cb(req_id, pkg_type,
390 pkg_name, event_type,
391 PACKAGE_MANAGER_EVENT_STATE_FAILED,
393 PACKAGE_MANAGER_ERROR_NONE,
397 } else if (strcasecmp(key, "end") == 0) {
398 if (__find_event_info
399 (&(request->head), req_id, &event_type,
400 &event_state) == 0) {
401 if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
402 if (request->event_cb)
403 request->event_cb(req_id, pkg_type,
404 pkg_name, event_type,
405 PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
407 PACKAGE_MANAGER_ERROR_NONE,
411 if (strcasecmp(key, "ok") != 0)
412 if (request->event_cb)
413 request->event_cb(req_id, pkg_type,
414 pkg_name, event_type,
415 PACKAGE_MANAGER_EVENT_STATE_FAILED,
417 PACKAGE_MANAGER_ERROR_NONE,
422 return PACKAGE_MANAGER_ERROR_NONE;
425 API int package_manager_request_install(package_manager_request_h request,
426 const char *path, int *id)
428 if (package_manager_client_validate_handle(request)) {
429 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
432 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
436 request->pkg_path = path;
437 uid_t uid = getuid();
438 if (uid != GLOBAL_USER)
439 request_id = pkgmgr_client_usr_install(request->pc, request->pkg_type, NULL,
440 request->pkg_path, NULL,
441 request->mode, request_event_handler,
445 request_id = pkgmgr_client_install(request->pc, request->pkg_type, NULL,
446 request->pkg_path, NULL,
447 request->mode, request_event_handler,
450 if (request_id == PKGMGR_R_EINVAL) {
451 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
452 } else if (request_id == PKGMGR_R_ENOPKG) {
453 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
454 } else if (request_id == PKGMGR_R_ENOMEM) {
455 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
456 } else if (request_id == PKGMGR_R_EIO) {
457 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
458 } else if (request_id == PKGMGR_R_EPRIV) {
459 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
460 } else if (request_id == PKGMGR_R_ESYSTEM || request_id == PKGMGR_R_ECOMM || request_id == PKGMGR_R_ERROR) {
461 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
466 return PACKAGE_MANAGER_ERROR_NONE;
469 API int package_manager_request_uninstall(package_manager_request_h request,
470 const char *name, int *id)
472 if (package_manager_client_validate_handle(request)) {
473 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
476 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
480 request->pkg_name = name;
481 uid_t uid = getuid();
482 if (uid != GLOBAL_USER)
483 request_id = pkgmgr_client_usr_uninstall(request->pc, request->pkg_type,
484 request->pkg_name, request->mode,
485 request_event_handler, request, uid);
487 request_id = pkgmgr_client_uninstall(request->pc, request->pkg_type,
488 request->pkg_name, request->mode,
489 request_event_handler, request);
491 if (request_id == PKGMGR_R_EINVAL) {
492 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
493 } else if (request_id == PKGMGR_R_ENOPKG) {
494 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
495 } else if (request_id == PKGMGR_R_ENOMEM) {
496 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
497 } else if (request_id == PKGMGR_R_EIO) {
498 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
499 } else if (request_id == PKGMGR_R_EPRIV) {
500 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
501 } else if (request_id == PKGMGR_R_ESYSTEM || request_id == PKGMGR_R_ECOMM || request_id == PKGMGR_R_ERROR) {
502 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
507 return PACKAGE_MANAGER_ERROR_NONE;
510 API int package_manager_request_move(package_manager_request_h request,
511 const char *name, package_manager_move_type_e move_type)
513 if (package_manager_client_validate_handle(request)) {
514 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
517 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
521 request->pkg_name = name;
522 uid_t uid = getuid();
523 if (uid != GLOBAL_USER)
524 ret = pkgmgr_client_usr_move(request->pc, request->pkg_type, request->pkg_name,
525 move_type, request->mode, uid);
527 ret = pkgmgr_client_move(request->pc, request->pkg_type, request->pkg_name,
528 move_type, request->mode);
529 if (ret == PKGMGR_R_EINVAL) {
530 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
531 } else if (ret == PKGMGR_R_ENOPKG) {
532 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
533 } else if (ret == PKGMGR_R_ENOMEM) {
534 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
535 } else if (ret == PKGMGR_R_EIO) {
536 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
537 } else if (ret == PKGMGR_R_EPRIV) {
538 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
539 } else if (ret == PKGMGR_R_ESYSTEM || ret == PKGMGR_R_ECOMM || ret == PKGMGR_R_ERROR) {
540 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
544 return PACKAGE_MANAGER_ERROR_NONE;
547 API int package_manager_create(package_manager_h * manager)
549 struct package_manager_s *package_manager = NULL;
551 if (manager == NULL) {
553 package_manager_error
554 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
558 package_manager = calloc(1, sizeof(struct package_manager_s));
559 if (package_manager == NULL) {
561 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
563 "failed to create a package_manager handle");
566 package_manager->ctype = PC_LISTENING;
567 package_manager->pc = pkgmgr_client_new(PC_LISTENING);
568 if (package_manager->pc == NULL) {
569 free(package_manager);
571 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
573 "failed to create a package_manager client");
576 package_manager->handle_id = package_manager_new_id();
578 *manager = package_manager;
580 return PACKAGE_MANAGER_ERROR_NONE;
583 static int package_manager_validate_handle(package_manager_h manager)
585 if (manager == NULL || manager->pc == NULL) {
586 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
589 return PACKAGE_MANAGER_ERROR_NONE;
592 API int package_manager_destroy(package_manager_h manager)
594 if (package_manager_validate_handle(manager)) {
596 package_manager_error
597 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
601 pkgmgr_client_free(manager->pc);
605 return PACKAGE_MANAGER_ERROR_NONE;
608 static int __add_event(event_info ** head, int req_id,
609 package_manager_event_type_e event_type,
610 package_manager_event_state_e event_state)
612 event_info *evt_info;
614 evt_info = (event_info *) calloc(1, sizeof(event_info));
615 if (evt_info == NULL) {
616 _LOGD("calloc failed");
619 evt_info->req_id = req_id;
620 evt_info->event_type = event_type;
621 evt_info->next = NULL;
628 static int __find_event(event_info ** head, int req_id,
629 package_manager_event_type_e * event_type,
630 package_manager_event_state_e * event_state)
637 _LOGE("tmp is NULL");
641 *event_type = tmp->event_type;
645 static int __update_event(event_info ** head, int req_id,
646 package_manager_event_type_e event_type,
647 package_manager_event_state_e event_state)
649 package_manager_event_type_e evt_type;
650 package_manager_event_state_e evt_state;
653 if (__find_event_info(head, req_id, &evt_type, &evt_state) != 0)
654 __add_event_info(head, req_id, event_type, event_state);
659 _LOGE("tmp is NULL");
663 tmp->event_type = event_type;
670 /* App Event Listening Policy:
671 * +----------------+------------+---------------+------------------+
672 * |Listener \ Type |Global Event|My User's Event|Other user's Event|
673 * +----------------+------------+---------------+------------------+
674 * |User Process App| Grant | Grant | Deny |
675 * +----------------+------------+---------------+------------------+
676 * |Platform module | Grant | Grant | Grant |
677 * +----------------+------------+---------------+------------------+
678 * UID assignment policy:
679 * https://wiki.tizen.org/wiki/Security/User_and_group_ID_assignment_policy
681 #define REGULAR_USER 5000
682 static int __validate_event_signal(uid_t target_uid)
684 uid_t self = getuid();
686 if (self == target_uid)
689 if (self < REGULAR_USER)
695 static int global_event_handler(uid_t target_uid, int req_id, const char *pkg_type,
696 const char *pkg_name, const char *key,
697 const char *val, const void *pmsg, void *data)
700 package_manager_event_type_e event_type = -1;
701 package_manager_event_state_e event_state = -1;
703 _LOGD("global_event_handler is called");
705 package_manager_h manager = data;
707 if (__validate_event_signal(target_uid))
708 return PACKAGE_MANAGER_ERROR_NONE;
710 if (strcasecmp(key, "start") == 0) {
711 ret = package_manager_get_event_type(val, &event_type);
712 if (ret != PACKAGE_MANAGER_ERROR_NONE)
713 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
715 __add_event(&(manager->head), req_id, event_type,
716 PACKAGE_MANAGER_EVENT_STATE_STARTED);
718 if (manager->event_cb && getuid() == target_uid)
719 manager->event_cb(pkg_type, pkg_name,
721 PACKAGE_MANAGER_EVENT_STATE_STARTED,
722 0, PACKAGE_MANAGER_ERROR_NONE, manager->user_data);
723 if (manager->global_event_cb)
724 manager->global_event_cb(target_uid, pkg_type, pkg_name,
726 PACKAGE_MANAGER_EVENT_STATE_STARTED,
727 0, PACKAGE_MANAGER_ERROR_NONE, manager->user_data);
729 } else if (strcasecmp(key, "install_percent") == 0
730 || strcasecmp(key, "progress_percent") == 0) {
732 (&(manager->head), req_id, &event_type,
733 &event_state) == 0) {
734 __update_event(&(manager->head), req_id,
736 PACKAGE_MANAGER_EVENT_STATE_PROCESSING);
737 if (manager->event_cb && getuid() == target_uid)
738 manager->event_cb(pkg_type, pkg_name,
740 PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
742 PACKAGE_MANAGER_ERROR_NONE,
744 if (manager->global_event_cb)
745 manager->global_event_cb(target_uid, pkg_type, pkg_name,
747 PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
749 PACKAGE_MANAGER_ERROR_NONE,
753 } else if (strcasecmp(key, "error") == 0) {
754 if (strcasecmp(key, "0") != 0) {
756 (&(manager->head), req_id, &event_type,
757 &event_state) == 0) {
758 __update_event(&(manager->head), req_id,
760 PACKAGE_MANAGER_EVENT_STATE_FAILED);
763 if (manager->event_cb && getuid() == target_uid)
764 manager->event_cb(pkg_type,
765 pkg_name, event_type,
766 PACKAGE_MANAGER_EVENT_STATE_FAILED,
768 PACKAGE_MANAGER_ERROR_NONE,
770 if (manager->global_event_cb)
771 manager->global_event_cb(target_uid, pkg_type,
772 pkg_name, event_type,
773 PACKAGE_MANAGER_EVENT_STATE_FAILED,
775 PACKAGE_MANAGER_ERROR_NONE,
778 } else if (strcasecmp(key, "end") == 0) {
780 (&(manager->head), req_id, &event_type,
781 &event_state) == 0) {
782 if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
783 if (manager->event_cb && getuid() == target_uid)
784 manager->event_cb(pkg_type,
785 pkg_name, event_type,
786 PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
788 PACKAGE_MANAGER_ERROR_NONE,
790 if (manager->global_event_cb)
791 manager->global_event_cb(target_uid, pkg_type,
792 pkg_name, event_type,
793 PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
795 PACKAGE_MANAGER_ERROR_NONE,
799 if (strcasecmp(key, "ok") != 0) {
800 if (manager->event_cb && getuid() == target_uid)
801 manager->event_cb(pkg_type,
802 pkg_name, event_type,
803 PACKAGE_MANAGER_EVENT_STATE_FAILED,
805 PACKAGE_MANAGER_ERROR_NONE,
807 if (manager->global_event_cb)
808 manager->global_event_cb(target_uid, pkg_type,
809 pkg_name, event_type,
810 PACKAGE_MANAGER_EVENT_STATE_FAILED,
812 PACKAGE_MANAGER_ERROR_NONE,
818 return PACKAGE_MANAGER_ERROR_NONE;
821 API int package_manager_set_event_status(package_manager_h manager, int status_type)
825 if (manager == NULL){
826 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
829 retval = pkgmgrinfo_client_set_status_type(manager->pc, status_type);
832 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
835 return PACKAGE_MANAGER_ERROR_NONE;
838 API int package_manager_set_event_cb(package_manager_h manager,
839 package_manager_event_cb callback,
842 if (package_manager_validate_handle(manager)) {
844 package_manager_error
845 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
849 manager->event_cb = callback;
850 manager->user_data = user_data;
852 pkgmgr_client_listen_status(manager->pc, global_event_handler, manager);
854 return PACKAGE_MANAGER_ERROR_NONE;
857 API int package_manager_unset_event_cb(package_manager_h manager)
859 if (manager == NULL) {
861 package_manager_error
862 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
866 // TODO: Please implement this function.
867 return PACKAGE_MANAGER_ERROR_NONE;
870 API int package_manager_set_global_event_cb(package_manager_h manager,
871 package_manager_global_event_cb callback,
874 if (package_manager_validate_handle(manager)) {
876 package_manager_error
877 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
881 if (getuid() >= REGULAR_USER) {
882 _LOGE("Regular user is not allowed for this api");
883 return PACKAGE_MANAGER_ERROR_PERMISSION_DENIED;
886 manager->global_event_cb = callback;
887 manager->user_data = user_data;
889 pkgmgr_client_listen_status(manager->pc, global_event_handler, manager);
891 return PACKAGE_MANAGER_ERROR_NONE;
894 API int package_manager_unset_global_event_cb(package_manager_h manager)
896 if (manager == NULL) {
898 package_manager_error
899 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
903 // TODO: Please implement this function.
904 return PACKAGE_MANAGER_ERROR_NONE;
907 API int package_manager_get_package_id_by_app_id(const char *app_id, char **package_id)
909 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo;
912 char *pkg_id_dup = NULL;
914 if (app_id == NULL || package_id == NULL)
915 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
917 uid_t uid = getuid();
918 if (uid != GLOBAL_USER)
920 if (pkgmgrinfo_appinfo_get_usr_appinfo(app_id, uid, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
921 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
924 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
925 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
927 retval = pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id);
928 if (retval != PMINFO_R_OK)
930 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
933 pkg_id_dup = strdup(pkg_id);
934 if (pkg_id_dup == NULL)
936 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
937 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
940 *package_id = pkg_id_dup;
942 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
944 return PACKAGE_MANAGER_ERROR_NONE;
947 API int package_manager_get_package_info(const char *package_id, package_info_h *package_info)
951 retval = package_info_get_package_info(package_id, package_info);
953 if (retval != PACKAGE_MANAGER_ERROR_NONE)
954 return package_manager_error(retval, __FUNCTION__, NULL);
956 return PACKAGE_MANAGER_ERROR_NONE;
959 API int package_manager_foreach_package_info(package_manager_package_info_cb callback,
964 retval = package_info_foreach_package_info(callback, user_data);
966 if (retval != PACKAGE_MANAGER_ERROR_NONE)
967 return package_manager_error(retval, __FUNCTION__, NULL);
970 return PACKAGE_MANAGER_ERROR_NONE;
974 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)
976 pkgmgrinfo_cert_compare_result_type_e result;
977 uid_t uid = getuid();
979 if (lhs_package_id == NULL || rhs_package_id == NULL || compare_result == NULL)
980 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
981 if (uid != GLOBAL_USER)
983 if (pkgmgrinfo_pkginfo_compare_usr_pkg_cert_info(lhs_package_id, rhs_package_id, uid, &result) != PKGMGR_R_OK)
984 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
987 if (pkgmgrinfo_pkginfo_compare_pkg_cert_info(lhs_package_id, rhs_package_id, &result) != PKGMGR_R_OK)
988 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
990 *compare_result = (package_manager_compare_result_type_e)result;
992 return PACKAGE_MANAGER_ERROR_NONE;
995 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)
997 pkgmgrinfo_cert_compare_result_type_e result;
998 uid_t uid = getuid();
1000 if (lhs_app_id == NULL || rhs_app_id == NULL || compare_result == NULL)
1001 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1002 if (uid != GLOBAL_USER)
1004 if (pkgmgrinfo_pkginfo_compare_usr_app_cert_info(lhs_app_id, rhs_app_id, uid, &result) != PKGMGR_R_OK)
1005 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1008 if (pkgmgrinfo_pkginfo_compare_app_cert_info(lhs_app_id, rhs_app_id, &result) != PKGMGR_R_OK)
1009 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1012 *compare_result = (package_manager_compare_result_type_e)result;
1014 return PACKAGE_MANAGER_ERROR_NONE;
1017 API int package_manager_is_preload_package_by_app_id(const char *app_id, bool *preload)
1019 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo = NULL;
1020 pkgmgrinfo_pkginfo_h pkgmgrinfo_pkginfo = NULL;
1023 char *pkg_id = NULL;
1024 bool is_preload = 0;
1025 uid_t uid = getuid();
1026 if (uid != GLOBAL_USER)
1028 if (pkgmgrinfo_appinfo_get_usr_appinfo(app_id, uid, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1029 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1032 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1033 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1035 retval = pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id);
1036 if (retval != PMINFO_R_OK)
1038 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1039 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1041 if (uid != GLOBAL_USER)
1043 if (pkgmgrinfo_pkginfo_get_usr_pkginfo(pkg_id, uid, &pkgmgrinfo_pkginfo) != PMINFO_R_OK)
1045 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1046 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1047 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1051 if (pkgmgrinfo_pkginfo_get_pkginfo(pkg_id, &pkgmgrinfo_pkginfo) != PMINFO_R_OK)
1053 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1054 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1055 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1058 if (pkgmgrinfo_pkginfo_is_preload(pkgmgrinfo_pkginfo, &is_preload) != PMINFO_R_OK)
1060 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1061 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1062 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1070 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1071 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1073 return PACKAGE_MANAGER_ERROR_NONE;
1076 API int package_manager_get_permission_type(const char *app_id, package_manager_permission_type_e *permission_type)
1079 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo =NULL;
1080 pkgmgrinfo_permission_type permission = 0;
1081 uid_t uid = getuid();
1082 if (uid != GLOBAL_USER)
1084 if (pkgmgrinfo_appinfo_get_usr_appinfo(app_id, uid, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1085 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1087 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1088 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1090 retval = pkgmgrinfo_appinfo_get_permission_type(pkgmgrinfo_appinfo, &permission);
1091 if (retval != PMINFO_R_OK)
1092 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1094 if (permission == PMINFO_PERMISSION_NORMAL)
1095 *permission_type = PACKAGE_MANAGER_PERMISSION_NORMAL;
1096 else if (permission == PMINFO_PERMISSION_SIGNATURE)
1097 *permission_type = PACKAGE_MANAGER_PERMISSION_SIGNATURE;
1098 else if (permission == PMINFO_PERMISSION_PRIVILEGE)
1099 *permission_type = PACKAGE_MANAGER_PERMISSION_PRIVILEGE;
1101 *permission_type = PACKAGE_MANAGER_PERMISSION_NORMAL;
1103 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1104 return PACKAGE_MANAGER_ERROR_NONE;
1107 API int package_manager_clear_cache_dir(const char *package_id)
1109 int res = pkgmgr_client_usr_clear_cache_dir(package_id, getuid());
1110 if (res == PKGMGR_R_EINVAL)
1112 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1114 else if (res == PKGMGR_R_ENOPKG)
1116 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1118 else if (res == PKGMGR_R_ENOMEM)
1120 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1122 else if (res == PKGMGR_R_EIO)
1124 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1126 else if (res == PKGMGR_R_EPRIV)
1128 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
1130 else if (res == PKGMGR_R_ESYSTEM || res == PKGMGR_R_ECOMM || res == PKGMGR_R_ERROR)
1132 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1134 else if (res != PKGMGR_R_OK)
1136 _LOGE("Unexpected error");
1137 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1140 return PACKAGE_MANAGER_ERROR_NONE;
1143 API int package_manager_clear_all_cache_dir(void)
1145 return package_manager_clear_cache_dir(PKG_CLEAR_ALL_CACHE);
1148 static void __initialize_cb_table(void)
1150 __cb_table = g_hash_table_new_full(g_int_hash, g_int_equal, pkgmgr_client_free, NULL);
1153 static void __result_cb(pkgmgr_client *pc, const char *pkgid, const pkg_size_info_t *result, void *user_data)
1155 package_manager_size_info_receive_cb callback = g_hash_table_lookup(__cb_table, pc);
1156 if (callback == NULL)
1158 _LOGE("callback is null.");
1159 g_hash_table_remove(__cb_table, pc);
1163 package_size_info_t size_info;
1164 size_info.data_size = result->data_size;
1165 size_info.cache_size = result->cache_size;
1166 size_info.app_size = result->app_size;
1167 size_info.external_data_size = result->ext_data_size;
1168 size_info.external_cache_size = result->ext_cache_size;
1169 size_info.external_app_size = result->ext_app_size;
1171 callback(pkgid, &size_info, user_data);
1173 g_hash_table_remove(__cb_table, pc);
1176 static void __total_result_cb(pkgmgr_client *pc, const pkg_size_info_t *result, void *user_data)
1178 package_manager_total_size_info_receive_cb callback = g_hash_table_lookup(__cb_table, pc);
1179 if (callback == NULL)
1181 _LOGE("callback is null.");
1182 g_hash_table_remove(__cb_table, pc);
1186 package_size_info_t size_info;
1187 size_info.data_size = result->data_size;
1188 size_info.cache_size = result->cache_size;
1189 size_info.app_size = result->app_size;
1190 size_info.external_data_size = result->ext_data_size;
1191 size_info.external_cache_size = result->ext_cache_size;
1192 size_info.external_app_size = result->ext_app_size;
1194 callback(&size_info, user_data);
1196 g_hash_table_remove(__cb_table, pc);
1199 API int package_manager_get_package_size_info(const char *package_id, package_manager_size_info_receive_cb callback, void *user_data)
1201 if (package_id == NULL || callback == NULL)
1203 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1206 if (__cb_table == NULL)
1208 __initialize_cb_table();
1211 pkgmgr_client *pc = pkgmgr_client_new(PC_REQUEST);
1214 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1218 if (strcmp(package_id, PKG_SIZE_INFO_TOTAL) != 0)
1220 res = pkgmgr_client_usr_get_package_size_info(pc, package_id, __result_cb, user_data, getuid());
1224 res = pkgmgr_client_usr_get_total_package_size_info(pc, __total_result_cb, user_data, getuid());
1227 if (res == PKGMGR_R_EINVAL)
1229 pkgmgr_client_free(pc);
1230 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1232 else if (res == PKGMGR_R_ENOPKG)
1234 pkgmgr_client_free(pc);
1235 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1237 else if (res == PKGMGR_R_ENOMEM)
1239 pkgmgr_client_free(pc);
1240 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1242 else if (res == PKGMGR_R_EIO)
1244 pkgmgr_client_free(pc);
1245 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1247 else if (res == PKGMGR_R_EPRIV)
1249 pkgmgr_client_free(pc);
1250 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
1252 else if (res == PKGMGR_R_ESYSTEM || res == PKGMGR_R_ECOMM || res == PKGMGR_R_ERROR)
1254 pkgmgr_client_free(pc);
1255 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1257 else if (res != PKGMGR_R_OK)
1259 _LOGE("Unexpected error");
1260 pkgmgr_client_free(pc);
1261 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1264 g_hash_table_insert(__cb_table, pc, callback);
1266 _LOGD("Successful");
1267 return PACKAGE_MANAGER_ERROR_NONE;
1270 API int package_manager_get_total_package_size_info(package_manager_total_size_info_receive_cb callback, void *user_data)
1272 return package_manager_get_package_size_info(PKG_SIZE_INFO_TOTAL, callback, user_data);
1275 API int package_manager_filter_create(package_manager_filter_h *handle)
1278 pkgmgrinfo_pkginfo_filter_h pkgmgr_filter = NULL;
1283 package_manager_error
1284 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1288 retval = pkgmgrinfo_pkginfo_filter_create(&pkgmgr_filter);
1289 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1291 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1294 *handle = pkgmgr_filter;
1296 return PACKAGE_MANAGER_ERROR_NONE;
1299 API int package_manager_filter_destroy(package_manager_filter_h handle)
1306 package_manager_error
1307 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1311 retval = pkgmgrinfo_pkginfo_filter_destroy(handle);
1312 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1314 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1317 return PACKAGE_MANAGER_ERROR_NONE;
1320 API int package_manager_filter_add_bool(package_manager_filter_h handle,
1321 const char *property, const bool value)
1325 if ((handle == NULL) || (property == NULL))
1328 package_manager_error
1329 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1333 retval = pkgmgrinfo_pkginfo_filter_add_bool(handle, property, value);
1334 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1336 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1339 return PACKAGE_MANAGER_ERROR_NONE;
1342 API int package_manager_filter_count(package_manager_filter_h handle, int *count)
1346 if ((handle == NULL) || (count == NULL))
1348 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1351 retval = pkgmgrinfo_pkginfo_filter_count(handle, count);
1354 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1357 return PACKAGE_MANAGER_ERROR_NONE;
1360 API int package_manager_filter_foreach_package_info(package_manager_filter_h handle,
1361 package_manager_package_info_cb callback, void *user_data)
1365 retval = package_info_filter_foreach_package_info(handle, callback, user_data);
1367 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1369 return package_manager_error(retval, __FUNCTION__, NULL);
1373 return PACKAGE_MANAGER_ERROR_NONE;
1377 API int package_manager_drm_generate_license_request(const char *resp_data, char **req_data, char **license_url)
1379 if (resp_data == NULL || req_data == NULL || license_url == NULL) {
1380 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1384 return PACKAGE_MANAGER_ERROR_NONE;
1387 API int package_manager_drm_register_license(const char *resp_data)
1389 if (resp_data == NULL) {
1390 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1394 return PACKAGE_MANAGER_ERROR_NONE;
1397 API int package_manager_drm_decrypt_package(const char *drm_file_path, const char *decrypted_file_path)
1399 if (drm_file_path == NULL || decrypted_file_path == NULL) {
1400 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1404 return PACKAGE_MANAGER_ERROR_NONE;
1407 API int package_size_info_get_data_size(package_size_info_h handle, long long *data_size)
1410 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1412 package_size_info_t *size_info = (package_size_info_t *)handle;
1414 *data_size = (long long)size_info->data_size;
1415 return PACKAGE_MANAGER_ERROR_NONE;
1418 API int package_size_info_get_cache_size(package_size_info_h handle, long long *cache_size)
1421 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1423 package_size_info_t *size_info = (package_size_info_t *)handle;
1425 *cache_size = size_info->cache_size;
1426 return PACKAGE_MANAGER_ERROR_NONE;
1429 API int package_size_info_get_app_size(package_size_info_h handle, long long *app_size)
1432 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1434 package_size_info_t *size_info = (package_size_info_t *)handle;
1435 *app_size = size_info->app_size;
1436 return PACKAGE_MANAGER_ERROR_NONE;
1439 API int package_size_info_get_external_data_size(package_size_info_h handle, long long *ext_data_size)
1442 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
1444 package_size_info_t *size_info = (package_size_info_t *)handle;
1445 *ext_data_size = size_info->external_data_size;
1446 return PACKAGE_MANAGER_ERROR_NONE;
1449 API int package_size_info_get_external_cache_size(package_size_info_h handle, long long *ext_cache_size)
1452 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1454 package_size_info_t *size_info = (package_size_info_t *)handle;
1455 *ext_cache_size = size_info->external_cache_size;
1456 return PACKAGE_MANAGER_ERROR_NONE;
1459 API int package_size_info_get_external_app_size(package_size_info_h handle, long long *ext_app_size)
1462 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1464 package_size_info_t *size_info = (package_size_info_t *)handle;
1465 *ext_app_size = size_info->external_app_size;
1466 return PACKAGE_MANAGER_ERROR_NONE;