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_installer.h>
24 #include <pkgmgr-info.h>
25 #include <tzplatform_config.h>
27 #include "package_manager.h"
28 #include "package_manager_internal.h"
30 static GHashTable *__cb_table = NULL;
31 static GHashTable *__request_cb_table = NULL;
33 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
34 typedef struct _event_info {
36 package_manager_event_type_e event_type;
37 package_manager_event_state_e event_state;
38 struct _event_info *next;
41 struct package_manager_s {
43 pkgmgr_client_type ctype;
47 package_manager_event_cb event_cb;
51 struct package_manager_request_s {
53 pkgmgr_client_type ctype;
58 package_manager_request_event_cb event_cb;
62 struct package_manager_request_cb_info {
64 package_manager_request_event_cb callback;
68 typedef struct package_size_info {
73 long long external_data_size;
74 long long external_cache_size;
75 long long external_app_size;
76 } package_size_info_t;
78 struct package_manager_filter_s {
79 pkgmgrinfo_pkginfo_filter_h pkgmgrinfo_pkginfo_filter;
82 static int package_manager_request_new_id()
84 static int request_handle_id = 0;
85 return request_handle_id++;
88 static int package_manager_new_id()
90 static int manager_handle_id = 0;
91 return manager_handle_id++;
94 static void __free_request_cb_info(gpointer data)
96 struct package_manager_request_cb_info *cb_info =
97 (struct package_manager_request_cb_info *)data;
102 _LOGD("request callback info removed");
105 static void __initialize_request_cb_table(void)
108 g_hash_table_new_full(g_int_hash, g_int_equal, __free_request_cb_info, NULL);
111 static int __insert_request_cb_info(int req_id, package_manager_request_event_cb callback, void *user_data)
113 struct package_manager_request_cb_info *cb_info;
115 cb_info = calloc(1, sizeof(struct package_manager_request_cb_info));
118 cb_info->req_id = req_id;
119 cb_info->callback = callback;
120 cb_info->user_data = user_data;
121 g_hash_table_insert(__request_cb_table, &cb_info->req_id, cb_info);
126 static void __clean_all_event_info(event_info *head)
128 event_info *current = head;
136 current = current->next;
142 API int package_manager_request_create(package_manager_request_h *request)
144 struct package_manager_request_s *package_manager_request;
146 if (request == NULL) {
148 package_manager_error
149 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
153 package_manager_request =
154 calloc(1, sizeof(struct package_manager_request_s));
155 if (package_manager_request == NULL) {
157 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
159 "failed to create a package_manager handle");
162 package_manager_request->ctype = PC_REQUEST;
163 package_manager_request->pc = pkgmgr_client_new(PC_REQUEST);
164 if (package_manager_request->pc == NULL) {
165 free(package_manager_request);
167 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
169 "failed to create a package_manager client");
172 package_manager_request->handle_id = package_manager_request_new_id();
174 *request = package_manager_request;
176 return PACKAGE_MANAGER_ERROR_NONE;
179 static int package_manager_client_validate_handle(package_manager_request_h
182 if (request == NULL || request->pc == NULL)
183 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
185 return PACKAGE_MANAGER_ERROR_NONE;
188 API int package_manager_request_destroy(package_manager_request_h request)
190 if (package_manager_client_validate_handle(request)) {
192 package_manager_error
193 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
197 pkgmgr_client_free(request->pc);
199 free(request->pkg_type);
200 __clean_all_event_info(request->head);
202 g_hash_table_destroy(__request_cb_table);
203 __request_cb_table = NULL;
205 return PACKAGE_MANAGER_ERROR_NONE;
208 static int __reset_user_request_callback(package_manager_request_h request,
209 package_manager_request_event_cb callback, void *user_data)
211 if (package_manager_client_validate_handle(request))
212 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
214 request->event_cb = callback;
215 request->user_data = user_data;
217 return PACKAGE_MANAGER_ERROR_NONE;
220 API int package_manager_request_set_event_cb(package_manager_request_h request,
221 package_manager_request_event_cb
222 callback, void *user_data)
226 ret = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
227 if (ret != PACKAGE_MANAGER_ERROR_NONE)
230 return __reset_user_request_callback(request, callback, user_data);
233 API int package_manager_request_unset_event_cb(package_manager_request_h request)
235 if (package_manager_client_validate_handle(request))
236 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
238 request->event_cb = NULL;
239 request->user_data = NULL;
241 return PACKAGE_MANAGER_ERROR_NONE;
244 API int package_manager_request_set_type(package_manager_request_h request,
245 const char *pkg_type)
247 if (package_manager_client_validate_handle(request)) {
249 package_manager_error
250 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
254 request->pkg_type = strdup(pkg_type);
256 return PACKAGE_MANAGER_ERROR_NONE;
259 API int package_manager_request_set_mode(package_manager_request_h request,
260 package_manager_request_mode_e mode)
262 if (package_manager_client_validate_handle(request)) {
264 package_manager_error
265 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
269 /* request mode is not used anymore */
271 return PACKAGE_MANAGER_ERROR_NONE;
274 API int package_manager_request_set_tep(package_manager_request_h request,
275 const char *tep_path)
279 if (package_manager_client_validate_handle(request) || tep_path == NULL) {
281 package_manager_error
282 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
286 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
287 if (retval != PACKAGE_MANAGER_ERROR_NONE)
290 if (pkgmgr_client_set_tep_path(request->pc, tep_path, true))
291 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
293 return PACKAGE_MANAGER_ERROR_NONE;
296 static int package_manager_get_event_type(const char *key,
297 package_manager_event_type_e *
301 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
303 if (strcasecmp(key, PKGMGR_INSTALLER_INSTALL_EVENT_STR) == 0)
304 *event_type = PACKAGE_MANAGER_EVENT_TYPE_INSTALL;
305 else if (strcasecmp(key, PKGMGR_INSTALLER_UNINSTALL_EVENT_STR) == 0)
306 *event_type = PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL;
307 else if (strcasecmp(key, PKGMGR_INSTALLER_UPGRADE_EVENT_STR) == 0)
308 *event_type = PACKAGE_MANAGER_EVENT_TYPE_UPDATE;
309 else if (strcasecmp(key, PKGMGR_INSTALLER_MOVE_EVENT_STR) == 0)
310 *event_type = PACKAGE_MANAGER_EVENT_TYPE_MOVE;
311 else if (strcasecmp(key, PKGMGR_INSTALLER_CLEAR_EVENT_STR) == 0)
312 *event_type = PACKAGE_MANAGER_EVENT_TYPE_CLEAR;
314 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
316 return PACKAGE_MANAGER_ERROR_NONE;
319 static int __add_event_info(event_info **head, int req_id,
320 package_manager_event_type_e event_type,
321 package_manager_event_state_e event_state)
323 event_info *evt_info;
327 evt_info = (event_info *) calloc(1, sizeof(event_info));
328 if (evt_info == NULL) {
329 _LOGD("calloc failed");
332 evt_info->req_id = req_id;
333 evt_info->event_type = event_type;
334 evt_info->next = NULL;
339 current = prev = *head;
342 current = current->next;
345 prev->next = evt_info;
351 static int __find_event_info(event_info **head, int req_id,
352 package_manager_event_type_e *event_type,
353 package_manager_event_state_e *event_state)
360 _LOGE("tmp is NULL");
365 if (tmp->req_id == req_id) {
366 *event_type = tmp->event_type;
374 static int __update_event_info(event_info **head, int req_id,
375 package_manager_event_type_e event_type,
376 package_manager_event_state_e event_state)
378 package_manager_event_type_e evt_type;
379 package_manager_event_state_e evt_state;
382 if (__find_event_info(head, req_id, &evt_type, &evt_state) != 0)
383 __add_event_info(head, req_id, event_type, event_state);
388 _LOGE("tmp is NULL");
393 if (tmp->req_id == req_id) {
394 tmp->event_type = event_type;
405 static int __remove_event_info(event_info **head request, int req_id)
416 if (current->next->req_id == req_id) {
418 current->next = current->next->next;
430 static int request_event_handler(uid_t target_uid, int req_id, const char *pkg_type,
431 const char *pkg_name, const char *key,
432 const char *val, const void *pmsg, void *data)
435 package_manager_event_type_e event_type = -1;
436 package_manager_event_state_e event_state = -1;
438 package_manager_request_h request = data;
440 if (strcasecmp(key, "start") == 0) {
441 ret = package_manager_get_event_type(val, &event_type);
442 if (ret != PACKAGE_MANAGER_ERROR_NONE)
443 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
445 __add_event_info(&(request->head), req_id, event_type,
446 PACKAGE_MANAGER_EVENT_STATE_STARTED);
448 if (request->event_cb)
449 request->event_cb(req_id, pkg_type, pkg_name,
451 PACKAGE_MANAGER_EVENT_STATE_STARTED,
452 0, PACKAGE_MANAGER_ERROR_NONE, request->user_data);
454 } else if (strcasecmp(key, "install_percent") == 0
455 || strcasecmp(key, "progress_percent") == 0) {
456 if (__find_event_info
457 (&(request->head), req_id, &event_type,
458 &event_state) == 0) {
459 __update_event_info(&(request->head), req_id,
461 PACKAGE_MANAGER_EVENT_STATE_PROCESSING);
462 if (request->event_cb)
463 request->event_cb(req_id, pkg_type, pkg_name,
465 PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
467 PACKAGE_MANAGER_ERROR_NONE,
471 } else if (strcasecmp(key, "error") == 0) {
472 if (strcasecmp(key, "0") != 0) {
473 if (__find_event_info
474 (&(request->head), req_id, &event_type,
475 &event_state) == 0) {
476 __update_event_info(&(request->head), req_id,
478 PACKAGE_MANAGER_EVENT_STATE_FAILED);
481 if (request->event_cb)
482 request->event_cb(req_id, pkg_type,
483 pkg_name, event_type,
484 PACKAGE_MANAGER_EVENT_STATE_FAILED,
486 PACKAGE_MANAGER_ERROR_NONE,
490 } else if (strcasecmp(key, "end") == 0) {
491 if (__find_event_info
492 (&(request->head), req_id, &event_type,
493 &event_state) == 0) {
494 if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
495 if (request->event_cb)
496 request->event_cb(req_id, pkg_type,
497 pkg_name, event_type,
498 PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
500 PACKAGE_MANAGER_ERROR_NONE,
504 if (strcasecmp(key, "ok") != 0)
505 if (request->event_cb)
506 request->event_cb(req_id, pkg_type,
507 pkg_name, event_type,
508 PACKAGE_MANAGER_EVENT_STATE_FAILED,
510 PACKAGE_MANAGER_ERROR_NONE,
515 return PACKAGE_MANAGER_ERROR_NONE;
518 static int internal_request_callback(uid_t target_uid, int req_id, const char *pkg_type,
519 const char *pkg_name, const char *key,
520 const char *val, const void *pmsg, void *data)
523 package_manager_event_type_e event_type = -1;
524 package_manager_event_state_e event_state = -1;
525 struct package_manager_request_cb_info *cb_info;
526 package_manager_request_event_cb event_cb;
527 void *user_data = NULL;
529 _LOGD("request callback called, req_id[%d]", req_id);
531 package_manager_request_h request = data;
532 cb_info = g_hash_table_lookup(__request_cb_table, &req_id);
533 if (!cb_info || (cb_info && !cb_info->callback)) {
534 _LOGE("no callback info");
538 if (cb_info->req_id != req_id) {
539 _LOGE("not matched request id");
543 event_cb = cb_info->callback;
544 user_data = cb_info->user_data;
546 if (strcasecmp(key, "start") == 0) {
547 ret = package_manager_get_event_type(val, &event_type);
548 if (ret != PACKAGE_MANAGER_ERROR_NONE)
549 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
551 __add_event_info(&request->head, req_id, event_type,
552 PACKAGE_MANAGER_EVENT_STATE_STARTED);
554 event_cb(req_id, pkg_type, pkg_name,
556 PACKAGE_MANAGER_EVENT_STATE_STARTED,
557 0, PACKAGE_MANAGER_ERROR_NONE, user_data);
558 } else if (strcasecmp(key, "install_percent") == 0) {
559 if (__find_event_info(&request->head, req_id, &event_type,
560 &event_state) == 0) {
561 __update_event_info(&request->head, req_id,
563 PACKAGE_MANAGER_EVENT_STATE_PROCESSING);
564 event_cb(req_id, pkg_type, pkg_name,
566 PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
568 PACKAGE_MANAGER_ERROR_NONE,
571 } else if (strcasecmp(key, "error") == 0) {
572 if (__find_event_info(&request->head, req_id, &event_type,
573 &event_state) == 0) {
574 __update_event_info(&request->head, req_id,
576 PACKAGE_MANAGER_EVENT_STATE_FAILED);
577 event_cb(req_id, pkg_type,
578 pkg_name, event_type,
579 PACKAGE_MANAGER_EVENT_STATE_FAILED,
581 PACKAGE_MANAGER_ERROR_NONE,
584 } else if (strcasecmp(key, "end") == 0) {
585 if (__find_event_info(&request->head, req_id, &event_type,
586 &event_state) == 0) {
587 if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
588 if (strcasecmp(val, "ok") == 0) {
589 event_cb(req_id, pkg_type,
590 pkg_name, event_type,
591 PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
593 PACKAGE_MANAGER_ERROR_NONE,
596 event_cb(req_id, pkg_type,
597 pkg_name, event_type,
598 PACKAGE_MANAGER_EVENT_STATE_FAILED,
600 PACKAGE_MANAGER_ERROR_NONE,
605 _LOGE("unexpected end event");
607 g_hash_table_remove(__request_cb_table, &req_id);
613 static int __request_install(package_manager_request_h request,
614 const char *path, pkgmgr_handler event_cb, int *id)
617 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
618 if (retval != PACKAGE_MANAGER_ERROR_NONE)
621 if (package_manager_client_validate_handle(request))
622 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
625 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
628 request_id = pkgmgr_client_install(request->pc, request->pkg_type, NULL,
629 path, NULL, request->mode, event_cb ? event_cb : request_event_handler, request);
631 if (request_id == PKGMGR_R_EINVAL)
632 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
633 else if (request_id == PKGMGR_R_ENOPKG)
634 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
635 else if (request_id == PKGMGR_R_ENOMEM)
636 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
637 else if (request_id == PKGMGR_R_EIO)
638 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
639 else if (request_id == PKGMGR_R_EPRIV)
640 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
641 else if (request_id == PKGMGR_R_ESYSTEM || request_id == PKGMGR_R_ECOMM || request_id == PKGMGR_R_ERROR)
642 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
647 return PACKAGE_MANAGER_ERROR_NONE;
650 static int __request_uninstall(package_manager_request_h request,
651 const char *name, pkgmgr_handler event_cb, int *id)
654 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
655 if (retval != PACKAGE_MANAGER_ERROR_NONE)
658 if (package_manager_client_validate_handle(request))
659 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
662 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
665 request_id = pkgmgr_client_uninstall(request->pc, request->pkg_type,
666 name, request->mode, event_cb ? event_cb : request_event_handler, request);
668 if (request_id == PKGMGR_R_EINVAL)
669 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
670 else if (request_id == PKGMGR_R_ENOPKG)
671 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
672 else if (request_id == PKGMGR_R_ENOMEM)
673 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
674 else if (request_id == PKGMGR_R_EIO)
675 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
676 else if (request_id == PKGMGR_R_EPRIV)
677 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
678 else if (request_id == PKGMGR_R_ESYSTEM || request_id == PKGMGR_R_ECOMM || request_id == PKGMGR_R_ERROR)
679 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
684 return PACKAGE_MANAGER_ERROR_NONE;
687 static int __request_move(package_manager_request_h request,
688 const char *name, package_manager_move_type_e move_type,
689 pkgmgr_handler event_cb, int *id)
692 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
693 if (retval != PACKAGE_MANAGER_ERROR_NONE)
696 if (package_manager_client_validate_handle(request))
697 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
700 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
703 request_id = pkgmgr_client_request_service(PM_REQUEST_MOVE, move_type,
704 request->pc, request->pkg_type, name,
705 NULL, event_cb ? event_cb : request_event_handler, request);
707 if (request_id == PKGMGR_R_EINVAL)
708 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
709 else if (request_id == PKGMGR_R_ENOPKG)
710 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
711 else if (request_id == PKGMGR_R_ENOMEM)
712 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
713 else if (request_id == PKGMGR_R_EIO)
714 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
715 else if (request_id == PKGMGR_R_EPRIV)
716 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
717 else if (request_id == PKGMGR_R_ESYSTEM || request_id == PKGMGR_R_ECOMM || request_id == PKGMGR_R_ERROR)
718 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
723 return PACKAGE_MANAGER_ERROR_NONE;
726 API int package_manager_request_install(package_manager_request_h request,
727 const char *path, int *id)
729 return __request_install(request, path, NULL, id);
732 API int package_manager_request_install_with_cb(package_manager_request_h request,
733 const char *path, package_manager_request_event_cb callback,
734 void *user_data, int *id)
739 if (__request_cb_table == NULL)
740 __initialize_request_cb_table();
742 ret = __request_install(request, path, internal_request_callback, &req_id);
745 ret = __insert_request_cb_info(req_id, callback, user_data);
747 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
748 __FUNCTION__, "failed to create request cb info");
756 API int package_manager_request_uninstall(package_manager_request_h request,
757 const char *name, int *id)
759 return __request_uninstall(request, name, NULL, id);
762 API int package_manager_request_uninstall_with_cb(package_manager_request_h request,
763 const char *name, package_manager_request_event_cb callback,
764 void *user_data, int *id)
769 if (__request_cb_table == NULL)
770 __initialize_request_cb_table();
772 ret = __request_uninstall(request, name, internal_request_callback, &req_id);
775 ret = __insert_request_cb_info(req_id, callback, user_data);
777 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
778 __FUNCTION__, "failed to create request cb info");
786 API int package_manager_request_move(package_manager_request_h request,
787 const char *name, package_manager_move_type_e move_type)
789 return __request_move(request, name, move_type, NULL, NULL);
792 API int package_manager_request_move_with_cb(package_manager_request_h request,
793 const char *name, package_manager_move_type_e move_type,
794 package_manager_request_event_cb callback, void *user_data, int *id)
799 if (__request_cb_table == NULL)
800 __initialize_request_cb_table();
802 ret = __request_move(request, name, move_type, internal_request_callback, &req_id);
805 ret = __insert_request_cb_info(req_id, callback, user_data);
807 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
808 __FUNCTION__, "failed to create request cb info");
816 API int package_manager_create(package_manager_h *manager)
819 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
820 if (retval != PACKAGE_MANAGER_ERROR_NONE)
823 struct package_manager_s *package_manager = NULL;
825 if (manager == NULL) {
827 package_manager_error
828 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
832 package_manager = calloc(1, sizeof(struct package_manager_s));
833 if (package_manager == NULL) {
835 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
837 "failed to create a package_manager handle");
840 package_manager->ctype = PC_LISTENING;
841 package_manager->pc = pkgmgr_client_new(PC_LISTENING);
842 if (package_manager->pc == NULL) {
843 free(package_manager);
845 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
847 "failed to create a package_manager client");
850 package_manager->handle_id = package_manager_new_id();
852 *manager = package_manager;
854 return PACKAGE_MANAGER_ERROR_NONE;
857 static int package_manager_validate_handle(package_manager_h manager)
859 if (manager == NULL || manager->pc == NULL)
860 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
862 return PACKAGE_MANAGER_ERROR_NONE;
865 API int package_manager_destroy(package_manager_h manager)
867 if (package_manager_validate_handle(manager)) {
869 package_manager_error
870 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
874 pkgmgr_client_free(manager->pc);
876 __clean_all_event_info(manager->head);
879 return PACKAGE_MANAGER_ERROR_NONE;
882 static int __add_event(event_info **head, int req_id,
883 package_manager_event_type_e event_type,
884 package_manager_event_state_e event_state)
886 event_info *evt_info;
888 evt_info = (event_info *) calloc(1, sizeof(event_info));
889 if (evt_info == NULL) {
890 _LOGD("calloc failed");
893 evt_info->req_id = req_id;
894 evt_info->event_type = event_type;
895 evt_info->event_state = event_state;
896 evt_info->next = NULL;
903 static int __find_event(event_info **head, int req_id,
904 package_manager_event_type_e *event_type,
905 package_manager_event_state_e *event_state)
912 _LOGE("tmp is NULL");
916 *event_type = tmp->event_type;
917 *event_state = tmp->event_state;
921 static int __update_event(event_info **head, int req_id,
922 package_manager_event_type_e event_type,
923 package_manager_event_state_e event_state)
925 package_manager_event_type_e evt_type;
926 package_manager_event_state_e evt_state;
929 if (__find_event_info(head, req_id, &evt_type, &evt_state) != 0)
930 __add_event_info(head, req_id, event_type, event_state);
935 _LOGE("tmp is NULL");
939 tmp->event_type = event_type;
940 tmp->event_state = event_state;
947 /* App Event Listening Policy:
948 * +----------------+------------+---------------+------------------+
949 * |Listener \ Type |Global Event|My User's Event|Other user's Event|
950 * +----------------+------------+---------------+------------------+
951 * |User Process App| Grant | Grant | Deny |
952 * +----------------+------------+---------------+------------------+
953 * |Platform module | Grant | Grant | Grant |
954 * +----------------+------------+---------------+------------------+
955 * UID assignment policy:
956 * https://wiki.tizen.org/wiki/Security/User_and_group_ID_assignment_policy
958 #define REGULAR_USER 5000
959 static int __validate_event_signal(uid_t target_uid)
961 uid_t self = getuid();
963 if (self == target_uid)
966 if (self < REGULAR_USER)
972 static int global_event_handler(uid_t target_uid, int req_id, const char *pkg_type,
973 const char *pkg_name, const char *key,
974 const char *val, const void *pmsg, void *data)
977 package_manager_event_type_e event_type = -1;
978 package_manager_event_state_e event_state = -1;
979 uid_t uid = target_uid;
981 package_manager_h manager = data;
983 if (target_uid == GLOBAL_USER)
986 if (__validate_event_signal(uid))
987 return PACKAGE_MANAGER_ERROR_NONE;
989 if (strcasecmp(key, "start") == 0) {
990 ret = package_manager_get_event_type(val, &event_type);
991 if (ret != PACKAGE_MANAGER_ERROR_NONE)
992 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
994 __add_event(&(manager->head), req_id, event_type,
995 PACKAGE_MANAGER_EVENT_STATE_STARTED);
997 if (manager->event_cb && getuid() == uid)
998 manager->event_cb(pkg_type, pkg_name,
1000 PACKAGE_MANAGER_EVENT_STATE_STARTED,
1001 0, PACKAGE_MANAGER_ERROR_NONE, manager->user_data);
1002 } else if (strcasecmp(key, "install_percent") == 0
1003 || strcasecmp(key, "progress_percent") == 0) {
1005 (&(manager->head), req_id, &event_type,
1006 &event_state) == 0) {
1007 __update_event(&(manager->head), req_id,
1009 PACKAGE_MANAGER_EVENT_STATE_PROCESSING);
1010 if (manager->event_cb && getuid() == uid)
1011 manager->event_cb(pkg_type, pkg_name,
1013 PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
1015 PACKAGE_MANAGER_ERROR_NONE,
1016 manager->user_data);
1019 } else if (strcasecmp(key, "error") == 0) {
1020 if (strcasecmp(key, "0") != 0) {
1022 (&(manager->head), req_id, &event_type,
1023 &event_state) == 0) {
1024 __update_event(&(manager->head), req_id,
1026 PACKAGE_MANAGER_EVENT_STATE_FAILED);
1029 if (manager->event_cb && getuid() == uid)
1030 manager->event_cb(pkg_type,
1031 pkg_name, event_type,
1032 PACKAGE_MANAGER_EVENT_STATE_FAILED,
1034 PACKAGE_MANAGER_ERROR_NONE,
1035 manager->user_data);
1037 } else if (strcasecmp(key, "end") == 0) {
1039 (&(manager->head), req_id, &event_type,
1040 &event_state) == 0) {
1041 if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
1042 if (manager->event_cb && getuid() == uid)
1043 manager->event_cb(pkg_type,
1044 pkg_name, event_type,
1045 PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
1047 PACKAGE_MANAGER_ERROR_NONE,
1048 manager->user_data);
1051 if (strcasecmp(key, "ok") != 0) {
1052 if (manager->event_cb && getuid() == uid)
1053 manager->event_cb(pkg_type,
1054 pkg_name, event_type,
1055 PACKAGE_MANAGER_EVENT_STATE_FAILED,
1057 PACKAGE_MANAGER_ERROR_NONE,
1058 manager->user_data);
1063 return PACKAGE_MANAGER_ERROR_NONE;
1066 static int __convert_status_type(package_manager_status_type_e status_type)
1070 if (status_type == PACKAGE_MANAGER_STATUS_TYPE_ALL)
1071 return PKGMGR_CLIENT_STATUS_ALL;
1073 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_INSTALL)
1074 type |= PKGMGR_CLIENT_STATUS_INSTALL;
1075 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_UNINSTALL)
1076 type |= PKGMGR_CLIENT_STATUS_UNINSTALL;
1077 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_UPGRADE)
1078 type |= PKGMGR_CLIENT_STATUS_UPGRADE;
1079 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_MOVE)
1080 type |= PKGMGR_CLIENT_STATUS_MOVE;
1081 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_CLEAR_DATA)
1082 type |= PKGMGR_CLIENT_STATUS_CLEAR_DATA;
1083 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_INSTALL_PROGRESS)
1084 type |= PKGMGR_CLIENT_STATUS_INSTALL_PROGRESS;
1085 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_GET_SIZE)
1086 type |= PKGMGR_CLIENT_STATUS_GET_SIZE;
1091 API int package_manager_set_event_status(package_manager_h manager, int status_type)
1095 int type_all = PACKAGE_MANAGER_STATUS_TYPE_INSTALL |
1096 PACKAGE_MANAGER_STATUS_TYPE_UNINSTALL |
1097 PACKAGE_MANAGER_STATUS_TYPE_UPGRADE |
1098 PACKAGE_MANAGER_STATUS_TYPE_MOVE |
1099 PACKAGE_MANAGER_STATUS_TYPE_CLEAR_DATA |
1100 PACKAGE_MANAGER_STATUS_TYPE_INSTALL_PROGRESS |
1101 PACKAGE_MANAGER_STATUS_TYPE_GET_SIZE;
1103 if (manager == NULL)
1104 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1106 if (status_type < 0 || status_type > type_all)
1107 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1109 type = __convert_status_type(status_type);
1110 retval = pkgmgr_client_set_status_type(manager->pc, type);
1113 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1115 return PACKAGE_MANAGER_ERROR_NONE;
1118 API int package_manager_set_event_cb(package_manager_h manager,
1119 package_manager_event_cb callback,
1124 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1125 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1128 if (package_manager_validate_handle(manager)) {
1130 package_manager_error
1131 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1135 manager->event_cb = callback;
1136 manager->user_data = user_data;
1138 pkgmgr_client_listen_status(manager->pc, global_event_handler, manager);
1140 return PACKAGE_MANAGER_ERROR_NONE;
1143 API int package_manager_unset_event_cb(package_manager_h manager)
1145 if (manager == NULL) {
1147 package_manager_error
1148 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1153 manager->event_cb = NULL;
1154 manager->user_data = NULL;
1156 retval = pkgmgr_client_remove_listen_status(manager->pc);
1157 if (retval == PKGMGR_R_EINVAL)
1159 package_manager_error
1160 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1162 else if (retval == PKGMGR_R_ERROR)
1164 package_manager_error
1165 (PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__,
1168 return PACKAGE_MANAGER_ERROR_NONE;
1171 API int package_manager_get_package_id_by_app_id(const char *app_id, char **package_id)
1173 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo;
1175 char *pkg_id = NULL;
1176 char *pkg_id_dup = NULL;
1178 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1179 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1182 if (app_id == NULL || package_id == NULL)
1183 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1185 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1186 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1187 retval = pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id);
1188 if (retval != PMINFO_R_OK)
1189 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1191 pkg_id_dup = strdup(pkg_id);
1192 if (pkg_id_dup == NULL) {
1193 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1194 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1197 *package_id = pkg_id_dup;
1199 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1201 return PACKAGE_MANAGER_ERROR_NONE;
1204 API int package_manager_get_package_info(const char *package_id, package_info_h *package_info)
1207 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1208 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1211 retval = package_info_get_package_info(package_id, package_info);
1213 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1214 return package_manager_error(retval, __FUNCTION__, NULL);
1216 return PACKAGE_MANAGER_ERROR_NONE;
1219 API int package_manager_foreach_package_info(package_manager_package_info_cb callback,
1224 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1225 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1228 retval = package_info_foreach_package_info(callback, user_data);
1230 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1231 return package_manager_error(retval, __FUNCTION__, NULL);
1233 return PACKAGE_MANAGER_ERROR_NONE;
1236 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)
1238 pkgmgrinfo_cert_compare_result_type_e result;
1240 if (lhs_package_id == NULL || rhs_package_id == NULL || compare_result == NULL)
1241 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1242 if (pkgmgrinfo_pkginfo_compare_pkg_cert_info(lhs_package_id, rhs_package_id, &result) != PKGMGR_R_OK)
1243 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1244 *compare_result = (package_manager_compare_result_type_e)result;
1246 return PACKAGE_MANAGER_ERROR_NONE;
1249 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)
1251 pkgmgrinfo_cert_compare_result_type_e result;
1253 if (lhs_app_id == NULL || rhs_app_id == NULL || compare_result == NULL)
1254 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1255 if (pkgmgrinfo_pkginfo_compare_app_cert_info(lhs_app_id, rhs_app_id, &result) != PKGMGR_R_OK)
1256 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1258 *compare_result = (package_manager_compare_result_type_e)result;
1260 return PACKAGE_MANAGER_ERROR_NONE;
1263 API int package_manager_is_preload_package_by_app_id(const char *app_id, bool *preload)
1267 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1268 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1271 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo = NULL;
1272 pkgmgrinfo_pkginfo_h pkgmgrinfo_pkginfo = NULL;
1274 char *pkg_id = NULL;
1275 bool is_preload = 0;
1276 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1277 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1279 retval = pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id);
1280 if (retval != PMINFO_R_OK) {
1281 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1282 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1284 if (pkgmgrinfo_pkginfo_get_pkginfo(pkg_id, &pkgmgrinfo_pkginfo) != PMINFO_R_OK) {
1285 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1286 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1287 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1289 if (pkgmgrinfo_pkginfo_is_preload(pkgmgrinfo_pkginfo, &is_preload) != PMINFO_R_OK) {
1290 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1291 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1292 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1300 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1301 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1303 return PACKAGE_MANAGER_ERROR_NONE;
1306 API int package_manager_get_permission_type(const char *app_id, package_manager_permission_type_e *permission_type)
1310 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1311 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1314 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo = NULL;
1315 pkgmgrinfo_permission_type permission = 0;
1316 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1317 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1318 retval = pkgmgrinfo_appinfo_get_permission_type(pkgmgrinfo_appinfo, &permission);
1319 if (retval != PMINFO_R_OK)
1320 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1322 if (permission == PMINFO_PERMISSION_NORMAL)
1323 *permission_type = PACKAGE_MANAGER_PERMISSION_NORMAL;
1324 else if (permission == PMINFO_PERMISSION_SIGNATURE)
1325 *permission_type = PACKAGE_MANAGER_PERMISSION_SIGNATURE;
1326 else if (permission == PMINFO_PERMISSION_PRIVILEGE)
1327 *permission_type = PACKAGE_MANAGER_PERMISSION_PRIVILEGE;
1329 *permission_type = PACKAGE_MANAGER_PERMISSION_NORMAL;
1331 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1332 return PACKAGE_MANAGER_ERROR_NONE;
1335 API int package_manager_clear_cache_dir(const char *package_id)
1339 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_CACHE);
1340 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1343 int res = pkgmgr_client_clear_cache_dir(package_id);
1344 if (res == PKGMGR_R_EINVAL) {
1345 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1346 } else if (res == PKGMGR_R_ENOPKG) {
1347 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1348 } else if (res == PKGMGR_R_ENOMEM) {
1349 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1350 } else if (res == PKGMGR_R_EIO) {
1351 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1352 } else if (res == PKGMGR_R_EPRIV) {
1353 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
1354 } else if (res == PKGMGR_R_ESYSTEM || res == PKGMGR_R_ECOMM || res == PKGMGR_R_ERROR) {
1355 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1356 } else if (res != PKGMGR_R_OK) {
1357 _LOGE("Unexpected error");
1358 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1361 return PACKAGE_MANAGER_ERROR_NONE;
1364 API int package_manager_clear_data_dir(const char *package_id)
1367 pkgmgr_client *pc = NULL;
1368 char *pkg_type = NULL;
1369 pkgmgrinfo_pkginfo_h pkginfo = NULL;
1371 if (package_id == NULL)
1372 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
1374 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
1375 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1378 retval = pkgmgrinfo_pkginfo_get_pkginfo(package_id, &pkginfo);
1379 if (retval == PMINFO_R_ENOENT)
1380 return PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE;
1381 else if (retval != PMINFO_R_OK || pkginfo == NULL)
1382 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
1384 retval = pkgmgrinfo_pkginfo_get_type(pkginfo, &pkg_type);
1385 if (retval != PMINFO_R_OK || pkg_type == NULL) {
1386 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
1387 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
1390 pc = pkgmgr_client_new(PC_REQUEST);
1392 _LOGE("Out of memory");
1393 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
1394 return PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY;
1397 retval = pkgmgr_client_clear_user_data(pc, pkg_type, package_id, PM_QUIET);
1398 pkgmgr_client_free(pc);
1399 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
1401 if (retval == PKGMGR_R_EINVAL) {
1402 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1403 } else if (retval == PKGMGR_R_ENOPKG) {
1404 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1405 } else if (retval == PKGMGR_R_ENOMEM) {
1406 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1407 } else if (retval == PKGMGR_R_EIO) {
1408 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1409 } else if (retval == PKGMGR_R_EPRIV) {
1410 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
1411 } else if (retval == PKGMGR_R_ESYSTEM || retval == PKGMGR_R_ECOMM || retval == PKGMGR_R_ERROR) {
1412 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1413 } else if (retval != PKGMGR_R_OK) {
1414 _LOGE("Unexpected error");
1415 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1418 return PACKAGE_MANAGER_ERROR_NONE;
1421 API int package_manager_clear_all_cache_dir(void)
1425 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
1426 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1429 return package_manager_clear_cache_dir(PKG_CLEAR_ALL_CACHE);
1432 static void __free_client(gpointer data)
1434 pkgmgr_client *pc = (pkgmgr_client *)data;
1435 pkgmgr_client_free(pc);
1438 static void __initialize_cb_table(void)
1440 __cb_table = g_hash_table_new_full(g_direct_hash, g_direct_equal, __free_client, NULL);
1443 static void __result_cb(pkgmgr_client *pc, const char *pkgid, const pkg_size_info_t *result, void *user_data)
1445 package_manager_size_info_receive_cb callback = g_hash_table_lookup(__cb_table, pc);
1446 if (callback == NULL) {
1447 _LOGE("callback is null.");
1448 g_hash_table_remove(__cb_table, pc);
1452 package_size_info_t size_info;
1453 size_info.data_size = result->data_size;
1454 size_info.cache_size = result->cache_size;
1455 size_info.app_size = result->app_size;
1456 size_info.external_data_size = result->ext_data_size;
1457 size_info.external_cache_size = result->ext_cache_size;
1458 size_info.external_app_size = result->ext_app_size;
1460 callback(pkgid, (package_size_info_h)&size_info, user_data);
1462 g_hash_table_remove(__cb_table, pc);
1465 static void __total_result_cb(pkgmgr_client *pc, const pkg_size_info_t *result, void *user_data)
1467 package_manager_total_size_info_receive_cb callback = g_hash_table_lookup(__cb_table, pc);
1468 if (callback == NULL) {
1469 _LOGE("callback is null.");
1470 g_hash_table_remove(__cb_table, pc);
1474 package_size_info_t size_info;
1475 size_info.data_size = result->data_size;
1476 size_info.cache_size = result->cache_size;
1477 size_info.app_size = result->app_size;
1478 size_info.external_data_size = result->ext_data_size;
1479 size_info.external_cache_size = result->ext_cache_size;
1480 size_info.external_app_size = result->ext_app_size;
1482 callback((package_size_info_h)&size_info, user_data);
1484 g_hash_table_remove(__cb_table, pc);
1487 static int _get_pkg_size_info(const char *package_id, void *callback, void *user_data)
1489 if (package_id == NULL || callback == NULL)
1490 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1492 if (__cb_table == NULL)
1493 __initialize_cb_table();
1495 pkgmgr_client *pc = pkgmgr_client_new(PC_REQUEST);
1497 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1500 if (strcmp(package_id, PKG_SIZE_INFO_TOTAL) != 0)
1501 res = pkgmgr_client_get_package_size_info(pc, package_id, __result_cb, user_data);
1503 res = pkgmgr_client_get_total_package_size_info(pc, __total_result_cb, user_data);
1505 if (res == PKGMGR_R_EINVAL) {
1506 pkgmgr_client_free(pc);
1507 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1508 } else if (res == PKGMGR_R_ENOPKG) {
1509 pkgmgr_client_free(pc);
1510 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1511 } else if (res == PKGMGR_R_ENOMEM) {
1512 pkgmgr_client_free(pc);
1513 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1514 } else if (res == PKGMGR_R_EIO) {
1515 pkgmgr_client_free(pc);
1516 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1517 } else if (res == PKGMGR_R_EPRIV) {
1518 pkgmgr_client_free(pc);
1519 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
1520 } else if (res == PKGMGR_R_ESYSTEM || res == PKGMGR_R_ECOMM || res == PKGMGR_R_ERROR) {
1521 pkgmgr_client_free(pc);
1522 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1523 } else if (res != PKGMGR_R_OK) {
1524 _LOGE("Unexpected error");
1525 pkgmgr_client_free(pc);
1526 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1529 g_hash_table_insert(__cb_table, pc, callback);
1531 return PACKAGE_MANAGER_ERROR_NONE;
1534 API int package_manager_get_package_size_info(const char *package_id, package_manager_size_info_receive_cb callback, void *user_data)
1536 return _get_pkg_size_info(package_id, (void *)callback, user_data);
1539 API int package_manager_get_total_package_size_info(package_manager_total_size_info_receive_cb callback, void *user_data)
1541 return _get_pkg_size_info(PKG_SIZE_INFO_TOTAL, (void *)callback, user_data);
1544 API int package_manager_filter_create(package_manager_filter_h *handle)
1547 pkgmgrinfo_pkginfo_filter_h pkgmgr_filter = NULL;
1549 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1550 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1553 if (handle == NULL) {
1555 package_manager_error
1556 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1560 retval = pkgmgrinfo_pkginfo_filter_create(&pkgmgr_filter);
1561 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1562 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1564 *handle = pkgmgr_filter;
1566 return PACKAGE_MANAGER_ERROR_NONE;
1569 API int package_manager_filter_destroy(package_manager_filter_h handle)
1573 if (handle == NULL) {
1575 package_manager_error
1576 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1580 retval = pkgmgrinfo_pkginfo_filter_destroy(handle);
1581 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1582 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1584 return PACKAGE_MANAGER_ERROR_NONE;
1587 API int package_manager_filter_add_bool(package_manager_filter_h handle,
1588 const char *property, const bool value)
1592 if ((handle == NULL) || (property == NULL)) {
1594 package_manager_error
1595 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1599 retval = pkgmgrinfo_pkginfo_filter_add_bool(handle, property, value);
1600 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1601 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1603 return PACKAGE_MANAGER_ERROR_NONE;
1606 API int package_manager_filter_count(package_manager_filter_h handle, int *count)
1610 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1611 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1614 if ((handle == NULL) || (count == NULL))
1615 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1617 retval = pkgmgrinfo_pkginfo_filter_count(handle, count);
1619 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1621 return PACKAGE_MANAGER_ERROR_NONE;
1624 API int package_manager_filter_foreach_package_info(package_manager_filter_h handle,
1625 package_manager_package_info_cb callback, void *user_data)
1629 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1630 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1633 retval = package_info_filter_foreach_package_info(handle, callback, user_data);
1635 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1636 return package_manager_error(retval, __FUNCTION__, NULL);
1638 return PACKAGE_MANAGER_ERROR_NONE;
1641 API int package_size_info_get_data_size(package_size_info_h handle, long long *data_size)
1644 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1646 package_size_info_t *size_info = (package_size_info_t *)handle;
1648 *data_size = (long long)size_info->data_size;
1649 return PACKAGE_MANAGER_ERROR_NONE;
1652 API int package_size_info_get_cache_size(package_size_info_h handle, long long *cache_size)
1655 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1657 package_size_info_t *size_info = (package_size_info_t *)handle;
1659 *cache_size = size_info->cache_size;
1660 return PACKAGE_MANAGER_ERROR_NONE;
1663 API int package_size_info_get_app_size(package_size_info_h handle, long long *app_size)
1666 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1668 package_size_info_t *size_info = (package_size_info_t *)handle;
1669 *app_size = size_info->app_size;
1670 return PACKAGE_MANAGER_ERROR_NONE;
1673 API int package_size_info_get_external_data_size(package_size_info_h handle, long long *ext_data_size)
1676 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
1678 package_size_info_t *size_info = (package_size_info_t *)handle;
1679 *ext_data_size = size_info->external_data_size;
1680 return PACKAGE_MANAGER_ERROR_NONE;
1683 API int package_size_info_get_external_cache_size(package_size_info_h handle, long long *ext_cache_size)
1686 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1688 package_size_info_t *size_info = (package_size_info_t *)handle;
1689 *ext_cache_size = size_info->external_cache_size;
1690 return PACKAGE_MANAGER_ERROR_NONE;
1693 API int package_size_info_get_external_app_size(package_size_info_h handle, long long *ext_app_size)
1696 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1698 package_size_info_t *size_info = (package_size_info_t *)handle;
1699 *ext_app_size = size_info->external_app_size;
1700 return PACKAGE_MANAGER_ERROR_NONE;