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 struct package_updateinfo_request_s {
84 pkg_update_info_t *updateinfo_handle;
87 static int package_manager_request_new_id()
89 static int request_handle_id = 0;
90 return request_handle_id++;
93 static int package_manager_new_id()
95 static int manager_handle_id = 0;
96 return manager_handle_id++;
99 static void __free_request_cb_info(gpointer data)
101 struct package_manager_request_cb_info *cb_info =
102 (struct package_manager_request_cb_info *)data;
107 _LOGD("request callback info removed");
110 static void __initialize_request_cb_table(void)
113 g_hash_table_new_full(g_int_hash, g_int_equal, __free_request_cb_info, NULL);
116 static int __insert_request_cb_info(int req_id, package_manager_request_event_cb callback, void *user_data)
118 struct package_manager_request_cb_info *cb_info;
120 cb_info = calloc(1, sizeof(struct package_manager_request_cb_info));
123 cb_info->req_id = req_id;
124 cb_info->callback = callback;
125 cb_info->user_data = user_data;
126 g_hash_table_insert(__request_cb_table, &cb_info->req_id, cb_info);
131 static void __clean_all_event_info(event_info *head)
133 event_info *current = head;
141 current = current->next;
147 API int package_manager_request_create(package_manager_request_h *request)
149 struct package_manager_request_s *package_manager_request;
151 if (request == NULL) {
153 package_manager_error
154 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
158 package_manager_request =
159 calloc(1, sizeof(struct package_manager_request_s));
160 if (package_manager_request == NULL) {
162 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
164 "failed to create a package_manager handle");
167 package_manager_request->ctype = PC_REQUEST;
168 package_manager_request->pc = pkgmgr_client_new(PC_REQUEST);
169 if (package_manager_request->pc == NULL) {
170 free(package_manager_request);
172 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
174 "failed to create a package_manager client");
177 package_manager_request->handle_id = package_manager_request_new_id();
179 *request = package_manager_request;
181 return PACKAGE_MANAGER_ERROR_NONE;
184 static int package_manager_client_validate_handle(package_manager_request_h
187 if (request == NULL || request->pc == NULL)
188 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
190 return PACKAGE_MANAGER_ERROR_NONE;
193 API int package_manager_request_destroy(package_manager_request_h request)
195 if (package_manager_client_validate_handle(request)) {
197 package_manager_error
198 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
202 pkgmgr_client_free(request->pc);
204 free(request->pkg_type);
205 __clean_all_event_info(request->head);
207 g_hash_table_destroy(__request_cb_table);
208 __request_cb_table = NULL;
210 return PACKAGE_MANAGER_ERROR_NONE;
213 static int __reset_user_request_callback(package_manager_request_h request,
214 package_manager_request_event_cb callback, void *user_data)
216 if (package_manager_client_validate_handle(request))
217 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
219 request->event_cb = callback;
220 request->user_data = user_data;
222 return PACKAGE_MANAGER_ERROR_NONE;
225 API int package_manager_request_set_event_cb(package_manager_request_h request,
226 package_manager_request_event_cb
227 callback, void *user_data)
231 ret = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
232 if (ret != PACKAGE_MANAGER_ERROR_NONE)
235 return __reset_user_request_callback(request, callback, user_data);
238 API int package_manager_request_unset_event_cb(package_manager_request_h request)
240 if (package_manager_client_validate_handle(request))
241 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
243 request->event_cb = NULL;
244 request->user_data = NULL;
246 return PACKAGE_MANAGER_ERROR_NONE;
249 API int package_manager_request_set_type(package_manager_request_h request,
250 const char *pkg_type)
252 if (package_manager_client_validate_handle(request)) {
254 package_manager_error
255 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
259 request->pkg_type = strdup(pkg_type);
261 return PACKAGE_MANAGER_ERROR_NONE;
264 API int package_manager_request_set_mode(package_manager_request_h request,
265 package_manager_request_mode_e mode)
267 if (package_manager_client_validate_handle(request)) {
269 package_manager_error
270 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
274 /* request mode is not used anymore */
276 return PACKAGE_MANAGER_ERROR_NONE;
279 API int package_manager_request_set_tep(package_manager_request_h request,
280 const char *tep_path)
284 if (package_manager_client_validate_handle(request) || tep_path == NULL) {
286 package_manager_error
287 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
291 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
292 if (retval != PACKAGE_MANAGER_ERROR_NONE)
295 if (pkgmgr_client_set_tep_path(request->pc, tep_path, true))
296 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
298 return PACKAGE_MANAGER_ERROR_NONE;
301 static int package_manager_get_event_type(const char *key,
302 package_manager_event_type_e *
306 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
308 if (strcasecmp(key, PKGMGR_INSTALLER_INSTALL_EVENT_STR) == 0)
309 *event_type = PACKAGE_MANAGER_EVENT_TYPE_INSTALL;
310 else if (strcasecmp(key, PKGMGR_INSTALLER_UNINSTALL_EVENT_STR) == 0)
311 *event_type = PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL;
312 else if (strcasecmp(key, PKGMGR_INSTALLER_UPGRADE_EVENT_STR) == 0)
313 *event_type = PACKAGE_MANAGER_EVENT_TYPE_UPDATE;
314 else if (strcasecmp(key, PKGMGR_INSTALLER_MOVE_EVENT_STR) == 0)
315 *event_type = PACKAGE_MANAGER_EVENT_TYPE_MOVE;
316 else if (strcasecmp(key, PKGMGR_INSTALLER_CLEAR_EVENT_STR) == 0)
317 *event_type = PACKAGE_MANAGER_EVENT_TYPE_CLEAR;
319 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
321 return PACKAGE_MANAGER_ERROR_NONE;
324 static int __add_event_info(event_info **head, int req_id,
325 package_manager_event_type_e event_type,
326 package_manager_event_state_e event_state)
328 event_info *evt_info;
332 evt_info = (event_info *) calloc(1, sizeof(event_info));
333 if (evt_info == NULL) {
334 _LOGD("calloc failed");
337 evt_info->req_id = req_id;
338 evt_info->event_type = event_type;
339 evt_info->next = NULL;
344 current = prev = *head;
347 current = current->next;
350 prev->next = evt_info;
356 static int __find_event_info(event_info **head, int req_id,
357 package_manager_event_type_e *event_type,
358 package_manager_event_state_e *event_state)
365 _LOGE("tmp is NULL");
370 if (tmp->req_id == req_id) {
371 *event_type = tmp->event_type;
379 static int __update_event_info(event_info **head, int req_id,
380 package_manager_event_type_e event_type,
381 package_manager_event_state_e event_state)
383 package_manager_event_type_e evt_type;
384 package_manager_event_state_e evt_state;
387 if (__find_event_info(head, req_id, &evt_type, &evt_state) != 0)
388 __add_event_info(head, req_id, event_type, event_state);
393 _LOGE("tmp is NULL");
398 if (tmp->req_id == req_id) {
399 tmp->event_type = event_type;
410 static int __remove_event_info(event_info **head request, int req_id)
421 if (current->next->req_id == req_id) {
423 current->next = current->next->next;
435 static int request_event_handler(uid_t target_uid, int req_id, const char *pkg_type,
436 const char *pkg_name, const char *key,
437 const char *val, const void *pmsg, void *data)
440 package_manager_event_type_e event_type = -1;
441 package_manager_event_state_e event_state = -1;
443 package_manager_request_h request = data;
445 if (strcasecmp(key, "start") == 0) {
446 ret = package_manager_get_event_type(val, &event_type);
447 if (ret != PACKAGE_MANAGER_ERROR_NONE)
448 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
450 __add_event_info(&(request->head), req_id, event_type,
451 PACKAGE_MANAGER_EVENT_STATE_STARTED);
453 if (request->event_cb)
454 request->event_cb(req_id, pkg_type, pkg_name,
456 PACKAGE_MANAGER_EVENT_STATE_STARTED,
457 0, PACKAGE_MANAGER_ERROR_NONE, request->user_data);
459 } else if (strcasecmp(key, "install_percent") == 0
460 || strcasecmp(key, "progress_percent") == 0) {
461 if (__find_event_info
462 (&(request->head), req_id, &event_type,
463 &event_state) == 0) {
464 __update_event_info(&(request->head), req_id,
466 PACKAGE_MANAGER_EVENT_STATE_PROCESSING);
467 if (request->event_cb)
468 request->event_cb(req_id, pkg_type, pkg_name,
470 PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
472 PACKAGE_MANAGER_ERROR_NONE,
476 } else if (strcasecmp(key, "error") == 0) {
477 if (strcasecmp(key, "0") != 0) {
478 if (__find_event_info
479 (&(request->head), req_id, &event_type,
480 &event_state) == 0) {
481 __update_event_info(&(request->head), req_id,
483 PACKAGE_MANAGER_EVENT_STATE_FAILED);
486 if (request->event_cb)
487 request->event_cb(req_id, pkg_type,
488 pkg_name, event_type,
489 PACKAGE_MANAGER_EVENT_STATE_FAILED,
491 PACKAGE_MANAGER_ERROR_NONE,
495 } else if (strcasecmp(key, "end") == 0) {
496 if (__find_event_info
497 (&(request->head), req_id, &event_type,
498 &event_state) == 0) {
499 if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
500 if (request->event_cb)
501 request->event_cb(req_id, pkg_type,
502 pkg_name, event_type,
503 PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
505 PACKAGE_MANAGER_ERROR_NONE,
509 if (strcasecmp(key, "ok") != 0)
510 if (request->event_cb)
511 request->event_cb(req_id, pkg_type,
512 pkg_name, event_type,
513 PACKAGE_MANAGER_EVENT_STATE_FAILED,
515 PACKAGE_MANAGER_ERROR_NONE,
520 return PACKAGE_MANAGER_ERROR_NONE;
523 static int internal_request_callback(uid_t target_uid, int req_id, const char *pkg_type,
524 const char *pkg_name, const char *key,
525 const char *val, const void *pmsg, void *data)
528 package_manager_event_type_e event_type = -1;
529 package_manager_event_state_e event_state = -1;
530 struct package_manager_request_cb_info *cb_info;
531 package_manager_request_event_cb event_cb;
532 void *user_data = NULL;
534 _LOGD("request callback called, req_id[%d]", req_id);
536 package_manager_request_h request = data;
537 cb_info = g_hash_table_lookup(__request_cb_table, &req_id);
538 if (!cb_info || (cb_info && !cb_info->callback)) {
539 _LOGE("no callback info");
543 if (cb_info->req_id != req_id) {
544 _LOGE("not matched request id");
548 event_cb = cb_info->callback;
549 user_data = cb_info->user_data;
551 if (strcasecmp(key, "start") == 0) {
552 ret = package_manager_get_event_type(val, &event_type);
553 if (ret != PACKAGE_MANAGER_ERROR_NONE)
554 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
556 __add_event_info(&request->head, req_id, event_type,
557 PACKAGE_MANAGER_EVENT_STATE_STARTED);
559 event_cb(req_id, pkg_type, pkg_name,
561 PACKAGE_MANAGER_EVENT_STATE_STARTED,
562 0, PACKAGE_MANAGER_ERROR_NONE, user_data);
563 } else if (strcasecmp(key, "install_percent") == 0) {
564 if (__find_event_info(&request->head, req_id, &event_type,
565 &event_state) == 0) {
566 __update_event_info(&request->head, req_id,
568 PACKAGE_MANAGER_EVENT_STATE_PROCESSING);
569 event_cb(req_id, pkg_type, pkg_name,
571 PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
573 PACKAGE_MANAGER_ERROR_NONE,
576 } else if (strcasecmp(key, "error") == 0) {
577 if (__find_event_info(&request->head, req_id, &event_type,
578 &event_state) == 0) {
579 __update_event_info(&request->head, req_id,
581 PACKAGE_MANAGER_EVENT_STATE_FAILED);
582 event_cb(req_id, pkg_type,
583 pkg_name, event_type,
584 PACKAGE_MANAGER_EVENT_STATE_FAILED,
586 PACKAGE_MANAGER_ERROR_NONE,
589 } else if (strcasecmp(key, "end") == 0) {
590 if (__find_event_info(&request->head, req_id, &event_type,
591 &event_state) == 0) {
592 if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
593 if (strcasecmp(val, "ok") == 0) {
594 event_cb(req_id, pkg_type,
595 pkg_name, event_type,
596 PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
598 PACKAGE_MANAGER_ERROR_NONE,
601 event_cb(req_id, pkg_type,
602 pkg_name, event_type,
603 PACKAGE_MANAGER_EVENT_STATE_FAILED,
605 PACKAGE_MANAGER_ERROR_NONE,
610 _LOGE("unexpected end event");
612 g_hash_table_remove(__request_cb_table, &req_id);
618 static int __request_install(package_manager_request_h request,
619 const char *path, pkgmgr_handler event_cb, int *id)
622 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
623 if (retval != PACKAGE_MANAGER_ERROR_NONE)
626 if (package_manager_client_validate_handle(request))
627 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
630 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
633 request_id = pkgmgr_client_install(request->pc, request->pkg_type, NULL,
634 path, NULL, request->mode, event_cb ? event_cb : request_event_handler, request);
636 if (request_id == PKGMGR_R_EINVAL)
637 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
638 else if (request_id == PKGMGR_R_ENOPKG)
639 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
640 else if (request_id == PKGMGR_R_ENOMEM)
641 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
642 else if (request_id == PKGMGR_R_EIO)
643 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
644 else if (request_id == PKGMGR_R_EPRIV)
645 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
646 else if (request_id == PKGMGR_R_ESYSTEM || request_id == PKGMGR_R_ECOMM || request_id == PKGMGR_R_ERROR)
647 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
652 return PACKAGE_MANAGER_ERROR_NONE;
655 static int __request_uninstall(package_manager_request_h request,
656 const char *name, pkgmgr_handler event_cb, int *id)
659 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
660 if (retval != PACKAGE_MANAGER_ERROR_NONE)
663 if (package_manager_client_validate_handle(request))
664 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
667 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
670 request_id = pkgmgr_client_uninstall(request->pc, request->pkg_type,
671 name, request->mode, event_cb ? event_cb : request_event_handler, request);
673 if (request_id == PKGMGR_R_EINVAL)
674 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
675 else if (request_id == PKGMGR_R_ENOPKG)
676 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
677 else if (request_id == PKGMGR_R_ENOMEM)
678 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
679 else if (request_id == PKGMGR_R_EIO)
680 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
681 else if (request_id == PKGMGR_R_EPRIV)
682 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
683 else if (request_id == PKGMGR_R_ESYSTEM || request_id == PKGMGR_R_ECOMM || request_id == PKGMGR_R_ERROR)
684 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
689 return PACKAGE_MANAGER_ERROR_NONE;
692 static int __request_move(package_manager_request_h request,
693 const char *name, package_manager_move_type_e move_type,
694 pkgmgr_handler event_cb, int *id)
697 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
698 if (retval != PACKAGE_MANAGER_ERROR_NONE)
701 if (package_manager_client_validate_handle(request))
702 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
705 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
708 request_id = pkgmgr_client_request_service(PM_REQUEST_MOVE, move_type,
709 request->pc, request->pkg_type, name,
710 NULL, event_cb ? event_cb : request_event_handler, request);
712 if (request_id == PKGMGR_R_EINVAL)
713 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
714 else if (request_id == PKGMGR_R_ENOPKG)
715 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
716 else if (request_id == PKGMGR_R_ENOMEM)
717 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
718 else if (request_id == PKGMGR_R_EIO)
719 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
720 else if (request_id == PKGMGR_R_EPRIV)
721 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
722 else if (request_id == PKGMGR_R_ESYSTEM || request_id == PKGMGR_R_ECOMM || request_id == PKGMGR_R_ERROR)
723 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
728 return PACKAGE_MANAGER_ERROR_NONE;
731 API int package_manager_request_install(package_manager_request_h request,
732 const char *path, int *id)
734 return __request_install(request, path, NULL, id);
737 API int package_manager_request_install_with_cb(package_manager_request_h request,
738 const char *path, package_manager_request_event_cb callback,
739 void *user_data, int *id)
744 if (__request_cb_table == NULL)
745 __initialize_request_cb_table();
747 ret = __request_install(request, path, internal_request_callback, &req_id);
750 ret = __insert_request_cb_info(req_id, callback, user_data);
752 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
753 __FUNCTION__, "failed to create request cb info");
761 API int package_manager_request_uninstall(package_manager_request_h request,
762 const char *name, int *id)
764 return __request_uninstall(request, name, NULL, id);
767 API int package_manager_request_uninstall_with_cb(package_manager_request_h request,
768 const char *name, package_manager_request_event_cb callback,
769 void *user_data, int *id)
774 if (__request_cb_table == NULL)
775 __initialize_request_cb_table();
777 ret = __request_uninstall(request, name, internal_request_callback, &req_id);
780 ret = __insert_request_cb_info(req_id, callback, user_data);
782 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
783 __FUNCTION__, "failed to create request cb info");
791 API int package_manager_request_move(package_manager_request_h request,
792 const char *name, package_manager_move_type_e move_type)
794 return __request_move(request, name, move_type, NULL, NULL);
797 API int package_manager_request_move_with_cb(package_manager_request_h request,
798 const char *name, package_manager_move_type_e move_type,
799 package_manager_request_event_cb callback, void *user_data, int *id)
804 if (__request_cb_table == NULL)
805 __initialize_request_cb_table();
807 ret = __request_move(request, name, move_type, internal_request_callback, &req_id);
810 ret = __insert_request_cb_info(req_id, callback, user_data);
812 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
813 __FUNCTION__, "failed to create request cb info");
821 API int package_manager_create(package_manager_h *manager)
824 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
825 if (retval != PACKAGE_MANAGER_ERROR_NONE)
828 struct package_manager_s *package_manager = NULL;
830 if (manager == NULL) {
832 package_manager_error
833 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
837 package_manager = calloc(1, sizeof(struct package_manager_s));
838 if (package_manager == NULL) {
840 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
842 "failed to create a package_manager handle");
845 package_manager->ctype = PC_LISTENING;
846 package_manager->pc = pkgmgr_client_new(PC_LISTENING);
847 if (package_manager->pc == NULL) {
848 free(package_manager);
850 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
852 "failed to create a package_manager client");
855 package_manager->handle_id = package_manager_new_id();
857 *manager = package_manager;
859 return PACKAGE_MANAGER_ERROR_NONE;
862 static int package_manager_validate_handle(package_manager_h manager)
864 if (manager == NULL || manager->pc == NULL)
865 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
867 return PACKAGE_MANAGER_ERROR_NONE;
870 API int package_manager_destroy(package_manager_h manager)
872 if (package_manager_validate_handle(manager)) {
874 package_manager_error
875 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
879 pkgmgr_client_free(manager->pc);
881 __clean_all_event_info(manager->head);
884 return PACKAGE_MANAGER_ERROR_NONE;
887 static int __add_event(event_info **head, int req_id,
888 package_manager_event_type_e event_type,
889 package_manager_event_state_e event_state)
891 event_info *evt_info;
893 evt_info = (event_info *) calloc(1, sizeof(event_info));
894 if (evt_info == NULL) {
895 _LOGD("calloc failed");
898 evt_info->req_id = req_id;
899 evt_info->event_type = event_type;
900 evt_info->event_state = event_state;
901 evt_info->next = NULL;
908 static int __find_event(event_info **head, int req_id,
909 package_manager_event_type_e *event_type,
910 package_manager_event_state_e *event_state)
917 _LOGE("tmp is NULL");
921 *event_type = tmp->event_type;
922 *event_state = tmp->event_state;
926 static int __update_event(event_info **head, int req_id,
927 package_manager_event_type_e event_type,
928 package_manager_event_state_e event_state)
930 package_manager_event_type_e evt_type;
931 package_manager_event_state_e evt_state;
934 if (__find_event_info(head, req_id, &evt_type, &evt_state) != 0)
935 __add_event_info(head, req_id, event_type, event_state);
940 _LOGE("tmp is NULL");
944 tmp->event_type = event_type;
945 tmp->event_state = event_state;
952 /* App Event Listening Policy:
953 * +----------------+------------+---------------+------------------+
954 * |Listener \ Type |Global Event|My User's Event|Other user's Event|
955 * +----------------+------------+---------------+------------------+
956 * |User Process App| Grant | Grant | Deny |
957 * +----------------+------------+---------------+------------------+
958 * |Platform module | Grant | Grant | Grant |
959 * +----------------+------------+---------------+------------------+
960 * UID assignment policy:
961 * https://wiki.tizen.org/wiki/Security/User_and_group_ID_assignment_policy
963 #define REGULAR_USER 5000
964 static int __validate_event_signal(uid_t target_uid)
966 uid_t self = getuid();
968 if (self == target_uid)
971 if (self < REGULAR_USER)
977 static int global_event_handler(uid_t target_uid, int req_id, const char *pkg_type,
978 const char *pkg_name, const char *key,
979 const char *val, const void *pmsg, void *data)
982 package_manager_event_type_e event_type = -1;
983 package_manager_event_state_e event_state = -1;
984 uid_t uid = target_uid;
986 package_manager_h manager = data;
988 if (target_uid == GLOBAL_USER)
991 if (__validate_event_signal(uid))
992 return PACKAGE_MANAGER_ERROR_NONE;
994 if (strcasecmp(key, "start") == 0) {
995 ret = package_manager_get_event_type(val, &event_type);
996 if (ret != PACKAGE_MANAGER_ERROR_NONE)
997 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
999 __add_event(&(manager->head), req_id, event_type,
1000 PACKAGE_MANAGER_EVENT_STATE_STARTED);
1002 if (manager->event_cb && getuid() == uid)
1003 manager->event_cb(pkg_type, pkg_name,
1005 PACKAGE_MANAGER_EVENT_STATE_STARTED,
1006 0, PACKAGE_MANAGER_ERROR_NONE, manager->user_data);
1007 } else if (strcasecmp(key, "install_percent") == 0
1008 || strcasecmp(key, "progress_percent") == 0) {
1010 (&(manager->head), req_id, &event_type,
1011 &event_state) == 0) {
1012 __update_event(&(manager->head), req_id,
1014 PACKAGE_MANAGER_EVENT_STATE_PROCESSING);
1015 if (manager->event_cb && getuid() == uid)
1016 manager->event_cb(pkg_type, pkg_name,
1018 PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
1020 PACKAGE_MANAGER_ERROR_NONE,
1021 manager->user_data);
1024 } else if (strcasecmp(key, "error") == 0) {
1025 if (strcasecmp(key, "0") != 0) {
1027 (&(manager->head), req_id, &event_type,
1028 &event_state) == 0) {
1029 __update_event(&(manager->head), req_id,
1031 PACKAGE_MANAGER_EVENT_STATE_FAILED);
1034 if (manager->event_cb && getuid() == uid)
1035 manager->event_cb(pkg_type,
1036 pkg_name, event_type,
1037 PACKAGE_MANAGER_EVENT_STATE_FAILED,
1039 PACKAGE_MANAGER_ERROR_NONE,
1040 manager->user_data);
1042 } else if (strcasecmp(key, "end") == 0) {
1044 (&(manager->head), req_id, &event_type,
1045 &event_state) == 0) {
1046 if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
1047 if (manager->event_cb && getuid() == uid)
1048 manager->event_cb(pkg_type,
1049 pkg_name, event_type,
1050 PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
1052 PACKAGE_MANAGER_ERROR_NONE,
1053 manager->user_data);
1056 if (strcasecmp(key, "ok") != 0) {
1057 if (manager->event_cb && getuid() == uid)
1058 manager->event_cb(pkg_type,
1059 pkg_name, event_type,
1060 PACKAGE_MANAGER_EVENT_STATE_FAILED,
1062 PACKAGE_MANAGER_ERROR_NONE,
1063 manager->user_data);
1068 return PACKAGE_MANAGER_ERROR_NONE;
1071 static int __convert_status_type(package_manager_status_type_e status_type)
1075 if (status_type == PACKAGE_MANAGER_STATUS_TYPE_ALL)
1076 return PKGMGR_CLIENT_STATUS_ALL;
1078 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_INSTALL)
1079 type |= PKGMGR_CLIENT_STATUS_INSTALL;
1080 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_UNINSTALL)
1081 type |= PKGMGR_CLIENT_STATUS_UNINSTALL;
1082 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_UPGRADE)
1083 type |= PKGMGR_CLIENT_STATUS_UPGRADE;
1084 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_MOVE)
1085 type |= PKGMGR_CLIENT_STATUS_MOVE;
1086 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_CLEAR_DATA)
1087 type |= PKGMGR_CLIENT_STATUS_CLEAR_DATA;
1088 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_INSTALL_PROGRESS)
1089 type |= PKGMGR_CLIENT_STATUS_INSTALL_PROGRESS;
1090 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_GET_SIZE)
1091 type |= PKGMGR_CLIENT_STATUS_GET_SIZE;
1096 API int package_manager_set_event_status(package_manager_h manager, int status_type)
1100 int type_all = PACKAGE_MANAGER_STATUS_TYPE_INSTALL |
1101 PACKAGE_MANAGER_STATUS_TYPE_UNINSTALL |
1102 PACKAGE_MANAGER_STATUS_TYPE_UPGRADE |
1103 PACKAGE_MANAGER_STATUS_TYPE_MOVE |
1104 PACKAGE_MANAGER_STATUS_TYPE_CLEAR_DATA |
1105 PACKAGE_MANAGER_STATUS_TYPE_INSTALL_PROGRESS |
1106 PACKAGE_MANAGER_STATUS_TYPE_GET_SIZE;
1108 if (manager == NULL)
1109 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1111 if (status_type < 0 || status_type > type_all)
1112 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1114 type = __convert_status_type(status_type);
1115 retval = pkgmgr_client_set_status_type(manager->pc, type);
1118 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1120 return PACKAGE_MANAGER_ERROR_NONE;
1123 API int package_manager_set_event_cb(package_manager_h manager,
1124 package_manager_event_cb callback,
1129 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1130 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1133 if (package_manager_validate_handle(manager)) {
1135 package_manager_error
1136 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1140 manager->event_cb = callback;
1141 manager->user_data = user_data;
1143 pkgmgr_client_listen_status(manager->pc, global_event_handler, manager);
1145 return PACKAGE_MANAGER_ERROR_NONE;
1148 API int package_manager_unset_event_cb(package_manager_h manager)
1150 if (manager == NULL) {
1152 package_manager_error
1153 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1158 manager->event_cb = NULL;
1159 manager->user_data = NULL;
1161 retval = pkgmgr_client_remove_listen_status(manager->pc);
1162 if (retval == PKGMGR_R_EINVAL)
1164 package_manager_error
1165 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1167 else if (retval == PKGMGR_R_ERROR)
1169 package_manager_error
1170 (PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__,
1173 return PACKAGE_MANAGER_ERROR_NONE;
1176 API int package_manager_get_package_id_by_app_id(const char *app_id, char **package_id)
1178 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo;
1180 char *pkg_id = NULL;
1181 char *pkg_id_dup = NULL;
1183 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1184 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1187 if (app_id == NULL || package_id == NULL)
1188 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1190 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1191 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1192 retval = pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id);
1193 if (retval != PMINFO_R_OK)
1194 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1196 pkg_id_dup = strdup(pkg_id);
1197 if (pkg_id_dup == NULL) {
1198 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1199 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1202 *package_id = pkg_id_dup;
1204 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1206 return PACKAGE_MANAGER_ERROR_NONE;
1209 API int package_manager_get_package_info(const char *package_id, package_info_h *package_info)
1212 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1213 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1216 retval = package_info_get_package_info(package_id, package_info);
1218 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1219 return package_manager_error(retval, __FUNCTION__, NULL);
1221 return PACKAGE_MANAGER_ERROR_NONE;
1224 API int package_manager_foreach_package_info(package_manager_package_info_cb callback,
1229 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1230 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1233 retval = package_info_foreach_package_info(callback, user_data);
1235 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1236 return package_manager_error(retval, __FUNCTION__, NULL);
1238 return PACKAGE_MANAGER_ERROR_NONE;
1241 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)
1243 pkgmgrinfo_cert_compare_result_type_e result;
1245 if (lhs_package_id == NULL || rhs_package_id == NULL || compare_result == NULL)
1246 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1247 if (pkgmgrinfo_pkginfo_compare_pkg_cert_info(lhs_package_id, rhs_package_id, &result) != PKGMGR_R_OK)
1248 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1249 *compare_result = (package_manager_compare_result_type_e)result;
1251 return PACKAGE_MANAGER_ERROR_NONE;
1254 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)
1256 pkgmgrinfo_cert_compare_result_type_e result;
1258 if (lhs_app_id == NULL || rhs_app_id == NULL || compare_result == NULL)
1259 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1260 if (pkgmgrinfo_pkginfo_compare_app_cert_info(lhs_app_id, rhs_app_id, &result) != PKGMGR_R_OK)
1261 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1263 *compare_result = (package_manager_compare_result_type_e)result;
1265 return PACKAGE_MANAGER_ERROR_NONE;
1268 API int package_manager_is_preload_package_by_app_id(const char *app_id, bool *preload)
1272 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1273 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1276 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo = NULL;
1277 pkgmgrinfo_pkginfo_h pkgmgrinfo_pkginfo = NULL;
1279 char *pkg_id = NULL;
1280 bool is_preload = 0;
1281 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1282 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1284 retval = pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id);
1285 if (retval != PMINFO_R_OK) {
1286 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1287 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1289 if (pkgmgrinfo_pkginfo_get_pkginfo(pkg_id, &pkgmgrinfo_pkginfo) != 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);
1294 if (pkgmgrinfo_pkginfo_is_preload(pkgmgrinfo_pkginfo, &is_preload) != PMINFO_R_OK) {
1295 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1296 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1297 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1305 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1306 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1308 return PACKAGE_MANAGER_ERROR_NONE;
1311 API int package_manager_get_permission_type(const char *app_id, package_manager_permission_type_e *permission_type)
1315 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1316 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1319 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo = NULL;
1320 pkgmgrinfo_permission_type permission = 0;
1321 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1322 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1323 retval = pkgmgrinfo_appinfo_get_permission_type(pkgmgrinfo_appinfo, &permission);
1324 if (retval != PMINFO_R_OK)
1325 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1327 if (permission == PMINFO_PERMISSION_NORMAL)
1328 *permission_type = PACKAGE_MANAGER_PERMISSION_NORMAL;
1329 else if (permission == PMINFO_PERMISSION_SIGNATURE)
1330 *permission_type = PACKAGE_MANAGER_PERMISSION_SIGNATURE;
1331 else if (permission == PMINFO_PERMISSION_PRIVILEGE)
1332 *permission_type = PACKAGE_MANAGER_PERMISSION_PRIVILEGE;
1334 *permission_type = PACKAGE_MANAGER_PERMISSION_NORMAL;
1336 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1337 return PACKAGE_MANAGER_ERROR_NONE;
1340 API int package_manager_clear_cache_dir(const char *package_id)
1344 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_CACHE);
1345 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1348 int res = pkgmgr_client_clear_cache_dir(package_id);
1349 if (res == PKGMGR_R_EINVAL) {
1350 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1351 } else if (res == PKGMGR_R_ENOPKG) {
1352 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1353 } else if (res == PKGMGR_R_ENOMEM) {
1354 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1355 } else if (res == PKGMGR_R_EIO) {
1356 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1357 } else if (res == PKGMGR_R_EPRIV) {
1358 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
1359 } else if (res == PKGMGR_R_ESYSTEM || res == PKGMGR_R_ECOMM || res == PKGMGR_R_ERROR) {
1360 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1361 } else if (res != PKGMGR_R_OK) {
1362 _LOGE("Unexpected error");
1363 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1366 return PACKAGE_MANAGER_ERROR_NONE;
1369 API int package_manager_clear_data_dir(const char *package_id)
1372 pkgmgr_client *pc = NULL;
1373 char *pkg_type = NULL;
1374 pkgmgrinfo_pkginfo_h pkginfo = NULL;
1376 if (package_id == NULL)
1377 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
1379 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
1380 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1383 retval = pkgmgrinfo_pkginfo_get_pkginfo(package_id, &pkginfo);
1384 if (retval == PMINFO_R_ENOENT)
1385 return PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE;
1386 else if (retval != PMINFO_R_OK || pkginfo == NULL)
1387 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
1389 retval = pkgmgrinfo_pkginfo_get_type(pkginfo, &pkg_type);
1390 if (retval != PMINFO_R_OK || pkg_type == NULL) {
1391 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
1392 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
1395 pc = pkgmgr_client_new(PC_REQUEST);
1397 _LOGE("Out of memory");
1398 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
1399 return PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY;
1402 retval = pkgmgr_client_clear_user_data(pc, pkg_type, package_id, PM_QUIET);
1403 pkgmgr_client_free(pc);
1404 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
1406 if (retval == PKGMGR_R_EINVAL) {
1407 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1408 } else if (retval == PKGMGR_R_ENOPKG) {
1409 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1410 } else if (retval == PKGMGR_R_ENOMEM) {
1411 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1412 } else if (retval == PKGMGR_R_EIO) {
1413 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1414 } else if (retval == PKGMGR_R_EPRIV) {
1415 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
1416 } else if (retval == PKGMGR_R_ESYSTEM || retval == PKGMGR_R_ECOMM || retval == PKGMGR_R_ERROR) {
1417 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1418 } else if (retval != PKGMGR_R_OK) {
1419 _LOGE("Unexpected error");
1420 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1423 return PACKAGE_MANAGER_ERROR_NONE;
1426 API int package_manager_clear_all_cache_dir(void)
1430 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
1431 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1434 return package_manager_clear_cache_dir(PKG_CLEAR_ALL_CACHE);
1437 static void __free_client(gpointer data)
1439 pkgmgr_client *pc = (pkgmgr_client *)data;
1440 pkgmgr_client_free(pc);
1443 static void __initialize_cb_table(void)
1445 __cb_table = g_hash_table_new_full(g_direct_hash, g_direct_equal, __free_client, NULL);
1448 static void __result_cb(pkgmgr_client *pc, const char *pkgid, const pkg_size_info_t *result, void *user_data)
1450 package_manager_size_info_receive_cb callback = g_hash_table_lookup(__cb_table, pc);
1451 if (callback == NULL) {
1452 _LOGE("callback is null.");
1453 g_hash_table_remove(__cb_table, pc);
1457 package_size_info_t size_info;
1458 size_info.data_size = result->data_size;
1459 size_info.cache_size = result->cache_size;
1460 size_info.app_size = result->app_size;
1461 size_info.external_data_size = result->ext_data_size;
1462 size_info.external_cache_size = result->ext_cache_size;
1463 size_info.external_app_size = result->ext_app_size;
1465 callback(pkgid, (package_size_info_h)&size_info, user_data);
1467 g_hash_table_remove(__cb_table, pc);
1470 static void __total_result_cb(pkgmgr_client *pc, const pkg_size_info_t *result, void *user_data)
1472 package_manager_total_size_info_receive_cb callback = g_hash_table_lookup(__cb_table, pc);
1473 if (callback == NULL) {
1474 _LOGE("callback is null.");
1475 g_hash_table_remove(__cb_table, pc);
1479 package_size_info_t size_info;
1480 size_info.data_size = result->data_size;
1481 size_info.cache_size = result->cache_size;
1482 size_info.app_size = result->app_size;
1483 size_info.external_data_size = result->ext_data_size;
1484 size_info.external_cache_size = result->ext_cache_size;
1485 size_info.external_app_size = result->ext_app_size;
1487 callback((package_size_info_h)&size_info, user_data);
1489 g_hash_table_remove(__cb_table, pc);
1492 static int _get_pkg_size_info(const char *package_id, void *callback, void *user_data)
1494 if (package_id == NULL || callback == NULL)
1495 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1497 if (__cb_table == NULL)
1498 __initialize_cb_table();
1500 pkgmgr_client *pc = pkgmgr_client_new(PC_REQUEST);
1502 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1505 if (strcmp(package_id, PKG_SIZE_INFO_TOTAL) != 0)
1506 res = pkgmgr_client_get_package_size_info(pc, package_id, __result_cb, user_data);
1508 res = pkgmgr_client_get_total_package_size_info(pc, __total_result_cb, user_data);
1510 if (res == PKGMGR_R_EINVAL) {
1511 pkgmgr_client_free(pc);
1512 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1513 } else if (res == PKGMGR_R_ENOPKG) {
1514 pkgmgr_client_free(pc);
1515 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1516 } else if (res == PKGMGR_R_ENOMEM) {
1517 pkgmgr_client_free(pc);
1518 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1519 } else if (res == PKGMGR_R_EIO) {
1520 pkgmgr_client_free(pc);
1521 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1522 } else if (res == PKGMGR_R_EPRIV) {
1523 pkgmgr_client_free(pc);
1524 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
1525 } else if (res == PKGMGR_R_ESYSTEM || res == PKGMGR_R_ECOMM || res == PKGMGR_R_ERROR) {
1526 pkgmgr_client_free(pc);
1527 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1528 } else if (res != PKGMGR_R_OK) {
1529 _LOGE("Unexpected error");
1530 pkgmgr_client_free(pc);
1531 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1534 g_hash_table_insert(__cb_table, pc, callback);
1536 return PACKAGE_MANAGER_ERROR_NONE;
1539 API int package_manager_get_package_size_info(const char *package_id, package_manager_size_info_receive_cb callback, void *user_data)
1541 return _get_pkg_size_info(package_id, (void *)callback, user_data);
1544 API int package_manager_get_total_package_size_info(package_manager_total_size_info_receive_cb callback, void *user_data)
1546 return _get_pkg_size_info(PKG_SIZE_INFO_TOTAL, (void *)callback, user_data);
1549 API int package_manager_filter_create(package_manager_filter_h *handle)
1552 pkgmgrinfo_pkginfo_filter_h pkgmgr_filter = NULL;
1554 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1555 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1558 if (handle == NULL) {
1560 package_manager_error
1561 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1565 retval = pkgmgrinfo_pkginfo_filter_create(&pkgmgr_filter);
1566 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1567 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1569 *handle = pkgmgr_filter;
1571 return PACKAGE_MANAGER_ERROR_NONE;
1574 API int package_manager_filter_destroy(package_manager_filter_h handle)
1578 if (handle == NULL) {
1580 package_manager_error
1581 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1585 retval = pkgmgrinfo_pkginfo_filter_destroy(handle);
1586 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1587 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1589 return PACKAGE_MANAGER_ERROR_NONE;
1592 API int package_manager_filter_add_bool(package_manager_filter_h handle,
1593 const char *property, const bool value)
1597 if ((handle == NULL) || (property == NULL)) {
1599 package_manager_error
1600 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1604 retval = pkgmgrinfo_pkginfo_filter_add_bool(handle, property, value);
1605 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1606 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1608 return PACKAGE_MANAGER_ERROR_NONE;
1611 API int package_manager_filter_count(package_manager_filter_h handle, int *count)
1615 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1616 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1619 if ((handle == NULL) || (count == NULL))
1620 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1622 retval = pkgmgrinfo_pkginfo_filter_count(handle, count);
1624 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1626 return PACKAGE_MANAGER_ERROR_NONE;
1629 API int package_manager_filter_foreach_package_info(package_manager_filter_h handle,
1630 package_manager_package_info_cb callback, void *user_data)
1634 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1635 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1638 retval = package_info_filter_foreach_package_info(handle, callback, user_data);
1640 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1641 return package_manager_error(retval, __FUNCTION__, NULL);
1643 return PACKAGE_MANAGER_ERROR_NONE;
1646 API int package_size_info_get_data_size(package_size_info_h handle, long long *data_size)
1649 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1651 package_size_info_t *size_info = (package_size_info_t *)handle;
1653 *data_size = (long long)size_info->data_size;
1654 return PACKAGE_MANAGER_ERROR_NONE;
1657 API int package_size_info_get_cache_size(package_size_info_h handle, long long *cache_size)
1660 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1662 package_size_info_t *size_info = (package_size_info_t *)handle;
1664 *cache_size = size_info->cache_size;
1665 return PACKAGE_MANAGER_ERROR_NONE;
1668 API int package_size_info_get_app_size(package_size_info_h handle, long long *app_size)
1671 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1673 package_size_info_t *size_info = (package_size_info_t *)handle;
1674 *app_size = size_info->app_size;
1675 return PACKAGE_MANAGER_ERROR_NONE;
1678 API int package_size_info_get_external_data_size(package_size_info_h handle, long long *ext_data_size)
1681 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
1683 package_size_info_t *size_info = (package_size_info_t *)handle;
1684 *ext_data_size = size_info->external_data_size;
1685 return PACKAGE_MANAGER_ERROR_NONE;
1688 API int package_size_info_get_external_cache_size(package_size_info_h handle, long long *ext_cache_size)
1691 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1693 package_size_info_t *size_info = (package_size_info_t *)handle;
1694 *ext_cache_size = size_info->external_cache_size;
1695 return PACKAGE_MANAGER_ERROR_NONE;
1698 API int package_size_info_get_external_app_size(package_size_info_h handle, long long *ext_app_size)
1701 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1703 package_size_info_t *size_info = (package_size_info_t *)handle;
1704 *ext_app_size = size_info->external_app_size;
1705 return PACKAGE_MANAGER_ERROR_NONE;
1708 API int package_manager_updateinfo_set_pkgid(package_updateinfo_request_h package_updateinfo, const char *pkgid)
1710 struct package_updateinfo_request_s *request;
1712 if (package_updateinfo == NULL || package_updateinfo->updateinfo_handle == NULL)
1713 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1715 request = (struct package_updateinfo_request_s *)package_updateinfo;
1716 if (request->updateinfo_handle->pkgid)
1717 free(request->updateinfo_handle->pkgid);
1718 request->updateinfo_handle->pkgid = strdup(pkgid);
1719 if (request->updateinfo_handle->pkgid == NULL)
1720 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1722 return PACKAGE_MANAGER_ERROR_NONE;
1725 API int package_manager_updateinfo_set_version(package_updateinfo_request_h package_updateinfo, const char *version)
1727 struct package_updateinfo_request_s *request;
1729 if (package_updateinfo == NULL || package_updateinfo->updateinfo_handle == NULL)
1730 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1732 request = (struct package_updateinfo_request_s *)package_updateinfo;
1733 if (request->updateinfo_handle->version)
1734 free(request->updateinfo_handle->version);
1735 request->updateinfo_handle->version = strdup(version);
1736 if (request->updateinfo_handle->pkgid == NULL)
1737 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1739 return PACKAGE_MANAGER_ERROR_NONE;
1742 static int package_manager_updateinfo_convert_property(package_update_info_type_e property, pkgmgr_updateinfo_type *converted_property)
1744 if (converted_property == NULL)
1747 if (property == PACKAGE_UPDATEINFO_TYPE_FORCE)
1748 *converted_property = PM_UPDATEINFO_TYPE_FORCE;
1749 else if (property == PACKAGE_UPDATEINFO_TYPE_OPTIONAL)
1750 *converted_property = PM_UPDATEINFO_TYPE_OPTIONAL;
1751 else if (property == PACKAGE_UPDATEINFO_TYPE_NONE)
1752 *converted_property = PM_UPDATEINFO_TYPE_NONE;
1759 API int package_manager_updateinfo_set_type(package_updateinfo_request_h package_updateinfo, package_update_info_type_e type)
1762 pkgmgr_updateinfo_type converted_type;
1763 struct package_updateinfo_request_s *request;
1765 if (package_updateinfo == NULL || package_updateinfo->updateinfo_handle == NULL)
1766 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1768 request = (struct package_updateinfo_request_s *)package_updateinfo;
1769 retval = package_manager_updateinfo_convert_property(type, &converted_type);
1771 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1773 request->updateinfo_handle->type = converted_type;
1774 return PACKAGE_MANAGER_ERROR_NONE;
1777 API int package_manager_updateinfo_request_destroy(package_updateinfo_request_h package_updateinfo)
1779 struct package_updateinfo_request_s *request;
1781 if (package_updateinfo == NULL)
1782 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1784 request = (struct package_updateinfo_request_s *)package_updateinfo;
1786 pkgmgr_client_free(request->pc);
1788 if (request->updateinfo_handle) {
1789 if (request->updateinfo_handle->pkgid)
1790 free(request->updateinfo_handle->pkgid);
1791 if (request->updateinfo_handle->version)
1792 free(request->updateinfo_handle->version);
1793 free(request->updateinfo_handle);
1797 return PACKAGE_MANAGER_ERROR_NONE;
1800 API int package_manager_updateinfo_request_create(package_updateinfo_request_h *package_updateinfo)
1802 struct package_updateinfo_request_s *request;
1803 pkg_update_info_t *update_info;
1805 if (package_updateinfo == NULL)
1806 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1808 request = calloc(1, sizeof(struct package_updateinfo_request_s));
1809 if (request == NULL)
1810 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1812 request->pc = pkgmgr_client_new(PC_REQUEST);
1813 if (request->pc == NULL)
1814 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1816 update_info = calloc(1, sizeof(pkg_update_info_t));
1817 if (update_info == NULL) {
1818 pkgmgr_client_free(request->pc);
1819 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1821 request->updateinfo_handle = update_info;
1823 *package_updateinfo = request;
1824 return PACKAGE_MANAGER_ERROR_NONE;
1827 API int package_manager_updateinfo_request_register(package_updateinfo_request_h package_updateinfo)
1829 struct package_updateinfo_request_s *update_info;
1832 if (package_updateinfo == NULL)
1833 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1834 update_info = (struct package_updateinfo_request_s *)package_updateinfo;
1836 retval = pkgmgr_client_register_pkg_update_info(update_info->pc, update_info->updateinfo_handle);
1837 if (retval == PKGMGR_R_EINVAL)
1838 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1840 return PACKAGE_MANAGER_ERROR_NONE;
1843 API int package_manager_updateinfo_request_unregister(package_updateinfo_request_h package_updateinfo, const char *pkgid)
1846 struct package_updateinfo_request_s *update_info;
1848 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
1849 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1852 if (package_updateinfo == NULL || pkgid == NULL)
1853 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1855 update_info = (struct package_updateinfo_request_s *)package_updateinfo;
1856 retval = pkgmgr_client_unregister_pkg_update_info(update_info->pc, pkgid);
1857 if (retval != PMINFO_R_OK)
1858 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1860 return PACKAGE_MANAGER_ERROR_NONE;
1863 API int package_manager_updateinfo_request_unregister_all(package_updateinfo_request_h package_updateinfo)
1866 struct package_updateinfo_request_s *update_info;
1868 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
1869 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1872 if (package_updateinfo == NULL)
1873 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1875 update_info = (struct package_updateinfo_request_s *)package_updateinfo;
1876 retval = pkgmgr_client_unregister_all_pkg_update_info(update_info->pc);
1878 if (retval != PMINFO_R_OK)
1879 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1881 return PACKAGE_MANAGER_ERROR_NONE;