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)
102 struct package_manager_request_cb_info *cb_info =
103 (struct package_manager_request_cb_info *)data;
105 req_id = cb_info->req_id;
109 _LOGD("request callback info removed, req_id(%d)", req_id);
112 static void __initialize_request_cb_table(void)
115 g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, __free_request_cb_info);
118 static int __insert_request_cb_info(int req_id, package_manager_request_event_cb callback, void *user_data)
120 struct package_manager_request_cb_info *cb_info;
122 cb_info = calloc(1, sizeof(struct package_manager_request_cb_info));
125 cb_info->req_id = req_id;
126 cb_info->callback = callback;
127 cb_info->user_data = user_data;
128 g_hash_table_insert(__request_cb_table, GINT_TO_POINTER(cb_info->req_id), cb_info);
133 static void __clean_all_event_info(event_info *head)
135 event_info *current = head;
143 current = current->next;
149 API int package_manager_request_create(package_manager_request_h *request)
151 struct package_manager_request_s *package_manager_request;
153 if (request == NULL) {
155 package_manager_error
156 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
160 package_manager_request =
161 calloc(1, sizeof(struct package_manager_request_s));
162 if (package_manager_request == NULL) {
164 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
166 "failed to create a package_manager handle");
169 package_manager_request->ctype = PC_REQUEST;
170 package_manager_request->pc = pkgmgr_client_new(PC_REQUEST);
171 if (package_manager_request->pc == NULL) {
172 free(package_manager_request);
174 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
176 "failed to create a package_manager client");
179 package_manager_request->handle_id = package_manager_request_new_id();
181 *request = package_manager_request;
183 return PACKAGE_MANAGER_ERROR_NONE;
186 static int package_manager_client_validate_handle(package_manager_request_h
189 if (request == NULL || request->pc == NULL)
190 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
192 return PACKAGE_MANAGER_ERROR_NONE;
195 API int package_manager_request_destroy(package_manager_request_h request)
197 if (package_manager_client_validate_handle(request)) {
199 package_manager_error
200 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
204 pkgmgr_client_free(request->pc);
206 free(request->pkg_type);
207 __clean_all_event_info(request->head);
209 g_hash_table_destroy(__request_cb_table);
210 __request_cb_table = NULL;
212 return PACKAGE_MANAGER_ERROR_NONE;
215 static int __reset_user_request_callback(package_manager_request_h request,
216 package_manager_request_event_cb callback, void *user_data)
218 if (package_manager_client_validate_handle(request))
219 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
221 request->event_cb = callback;
222 request->user_data = user_data;
224 return PACKAGE_MANAGER_ERROR_NONE;
227 API int package_manager_request_set_event_cb(package_manager_request_h request,
228 package_manager_request_event_cb
229 callback, void *user_data)
233 ret = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
234 if (ret != PACKAGE_MANAGER_ERROR_NONE)
237 return __reset_user_request_callback(request, callback, user_data);
240 API int package_manager_request_unset_event_cb(package_manager_request_h request)
242 if (package_manager_client_validate_handle(request))
243 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
245 request->event_cb = NULL;
246 request->user_data = NULL;
248 return PACKAGE_MANAGER_ERROR_NONE;
251 API int package_manager_request_set_type(package_manager_request_h request,
252 const char *pkg_type)
254 if (package_manager_client_validate_handle(request)) {
256 package_manager_error
257 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
261 request->pkg_type = strdup(pkg_type);
263 return PACKAGE_MANAGER_ERROR_NONE;
266 API int package_manager_request_set_mode(package_manager_request_h request,
267 package_manager_request_mode_e mode)
269 if (package_manager_client_validate_handle(request)) {
271 package_manager_error
272 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
276 /* request mode is not used anymore */
278 return PACKAGE_MANAGER_ERROR_NONE;
281 API int package_manager_request_set_tep(package_manager_request_h request,
282 const char *tep_path)
286 if (package_manager_client_validate_handle(request) || tep_path == NULL) {
288 package_manager_error
289 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
293 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
294 if (retval != PACKAGE_MANAGER_ERROR_NONE)
297 if (pkgmgr_client_set_tep_path(request->pc, tep_path, true))
298 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
300 return PACKAGE_MANAGER_ERROR_NONE;
303 static int package_manager_get_event_type(const char *key,
304 package_manager_event_type_e *
308 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
310 if (strcasecmp(key, PKGMGR_INSTALLER_INSTALL_EVENT_STR) == 0)
311 *event_type = PACKAGE_MANAGER_EVENT_TYPE_INSTALL;
312 else if (strcasecmp(key, PKGMGR_INSTALLER_UNINSTALL_EVENT_STR) == 0)
313 *event_type = PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL;
314 else if (strcasecmp(key, PKGMGR_INSTALLER_UPGRADE_EVENT_STR) == 0)
315 *event_type = PACKAGE_MANAGER_EVENT_TYPE_UPDATE;
316 else if (strcasecmp(key, PKGMGR_INSTALLER_MOVE_EVENT_STR) == 0)
317 *event_type = PACKAGE_MANAGER_EVENT_TYPE_MOVE;
318 else if (strcasecmp(key, PKGMGR_INSTALLER_CLEAR_EVENT_STR) == 0)
319 *event_type = PACKAGE_MANAGER_EVENT_TYPE_CLEAR;
321 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
323 return PACKAGE_MANAGER_ERROR_NONE;
326 static int __add_event_info(event_info **head, int req_id,
327 package_manager_event_type_e event_type,
328 package_manager_event_state_e event_state)
330 event_info *evt_info;
334 evt_info = (event_info *) calloc(1, sizeof(event_info));
335 if (evt_info == NULL) {
336 _LOGD("calloc failed");
339 evt_info->req_id = req_id;
340 evt_info->event_type = event_type;
341 evt_info->next = NULL;
346 current = prev = *head;
349 current = current->next;
352 prev->next = evt_info;
358 static int __find_event_info(event_info **head, int req_id,
359 package_manager_event_type_e *event_type,
360 package_manager_event_state_e *event_state)
367 _LOGE("tmp is NULL");
372 if (tmp->req_id == req_id) {
373 *event_type = tmp->event_type;
381 static int __update_event_info(event_info **head, int req_id,
382 package_manager_event_type_e event_type,
383 package_manager_event_state_e event_state)
385 package_manager_event_type_e evt_type;
386 package_manager_event_state_e evt_state;
389 if (__find_event_info(head, req_id, &evt_type, &evt_state) != 0)
390 __add_event_info(head, req_id, event_type, event_state);
395 _LOGE("tmp is NULL");
400 if (tmp->req_id == req_id) {
401 tmp->event_type = event_type;
412 static int __remove_event_info(event_info **head request, int req_id)
423 if (current->next->req_id == req_id) {
425 current->next = current->next->next;
437 static int request_event_handler(uid_t target_uid, int req_id, const char *pkg_type,
438 const char *pkg_name, const char *key,
439 const char *val, const void *pmsg, void *data)
442 package_manager_event_type_e event_type = -1;
443 package_manager_event_state_e event_state = -1;
445 package_manager_request_h request = data;
447 if (strcasecmp(key, "start") == 0) {
448 ret = package_manager_get_event_type(val, &event_type);
449 if (ret != PACKAGE_MANAGER_ERROR_NONE)
450 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
452 __add_event_info(&(request->head), req_id, event_type,
453 PACKAGE_MANAGER_EVENT_STATE_STARTED);
455 if (request->event_cb)
456 request->event_cb(req_id, pkg_type, pkg_name,
458 PACKAGE_MANAGER_EVENT_STATE_STARTED,
459 0, PACKAGE_MANAGER_ERROR_NONE, request->user_data);
461 } else if (strcasecmp(key, "install_percent") == 0
462 || strcasecmp(key, "progress_percent") == 0) {
463 if (__find_event_info
464 (&(request->head), req_id, &event_type,
465 &event_state) == 0) {
466 __update_event_info(&(request->head), req_id,
468 PACKAGE_MANAGER_EVENT_STATE_PROCESSING);
469 if (request->event_cb)
470 request->event_cb(req_id, pkg_type, pkg_name,
472 PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
474 PACKAGE_MANAGER_ERROR_NONE,
478 } else if (strcasecmp(key, "error") == 0) {
479 if (strcasecmp(key, "0") != 0) {
480 if (__find_event_info
481 (&(request->head), req_id, &event_type,
482 &event_state) == 0) {
483 __update_event_info(&(request->head), req_id,
485 PACKAGE_MANAGER_EVENT_STATE_FAILED);
488 if (request->event_cb)
489 request->event_cb(req_id, pkg_type,
490 pkg_name, event_type,
491 PACKAGE_MANAGER_EVENT_STATE_FAILED,
493 PACKAGE_MANAGER_ERROR_NONE,
497 } else if (strcasecmp(key, "end") == 0) {
498 if (__find_event_info
499 (&(request->head), req_id, &event_type,
500 &event_state) == 0) {
501 if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
502 if (request->event_cb)
503 request->event_cb(req_id, pkg_type,
504 pkg_name, event_type,
505 PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
507 PACKAGE_MANAGER_ERROR_NONE,
511 if (strcasecmp(key, "ok") != 0)
512 if (request->event_cb)
513 request->event_cb(req_id, pkg_type,
514 pkg_name, event_type,
515 PACKAGE_MANAGER_EVENT_STATE_FAILED,
517 PACKAGE_MANAGER_ERROR_NONE,
522 return PACKAGE_MANAGER_ERROR_NONE;
525 static int internal_request_callback(uid_t target_uid, int req_id, const char *pkg_type,
526 const char *pkg_name, const char *key,
527 const char *val, const void *pmsg, void *data)
530 package_manager_event_type_e event_type = -1;
531 package_manager_event_state_e event_state = -1;
532 struct package_manager_request_cb_info *cb_info;
533 package_manager_request_event_cb event_cb;
534 void *user_data = NULL;
536 _LOGD("request callback called, req_id[%d]", req_id);
538 package_manager_request_h request = data;
539 cb_info = g_hash_table_lookup(__request_cb_table, GINT_TO_POINTER(req_id));
540 if (!cb_info || (cb_info && !cb_info->callback)) {
541 _LOGE("no callback info");
545 if (cb_info->req_id != req_id) {
546 _LOGE("not matched request id");
550 event_cb = cb_info->callback;
551 user_data = cb_info->user_data;
553 if (strcasecmp(key, "start") == 0) {
554 ret = package_manager_get_event_type(val, &event_type);
555 if (ret != PACKAGE_MANAGER_ERROR_NONE)
556 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
558 __add_event_info(&request->head, req_id, event_type,
559 PACKAGE_MANAGER_EVENT_STATE_STARTED);
561 event_cb(req_id, pkg_type, pkg_name,
563 PACKAGE_MANAGER_EVENT_STATE_STARTED,
564 0, PACKAGE_MANAGER_ERROR_NONE, user_data);
565 } else if (strcasecmp(key, "install_percent") == 0) {
566 if (__find_event_info(&request->head, req_id, &event_type,
567 &event_state) == 0) {
568 __update_event_info(&request->head, req_id,
570 PACKAGE_MANAGER_EVENT_STATE_PROCESSING);
571 event_cb(req_id, pkg_type, pkg_name,
573 PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
575 PACKAGE_MANAGER_ERROR_NONE,
578 } else if (strcasecmp(key, "error") == 0) {
579 if (__find_event_info(&request->head, req_id, &event_type,
580 &event_state) == 0) {
581 __update_event_info(&request->head, req_id,
583 PACKAGE_MANAGER_EVENT_STATE_FAILED);
584 event_cb(req_id, pkg_type,
585 pkg_name, event_type,
586 PACKAGE_MANAGER_EVENT_STATE_FAILED,
588 PACKAGE_MANAGER_ERROR_NONE,
591 } else if (strcasecmp(key, "end") == 0) {
592 if (__find_event_info(&request->head, req_id, &event_type,
593 &event_state) == 0) {
594 if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
595 if (strcasecmp(val, "ok") == 0) {
596 event_cb(req_id, pkg_type,
597 pkg_name, event_type,
598 PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
600 PACKAGE_MANAGER_ERROR_NONE,
603 event_cb(req_id, pkg_type,
604 pkg_name, event_type,
605 PACKAGE_MANAGER_EVENT_STATE_FAILED,
607 PACKAGE_MANAGER_ERROR_NONE,
612 _LOGE("unexpected end event");
614 g_hash_table_remove(__request_cb_table, GINT_TO_POINTER(req_id));
620 static int __request_install(package_manager_request_h request,
621 const char *path, pkgmgr_handler event_cb, int *id)
624 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
625 if (retval != PACKAGE_MANAGER_ERROR_NONE)
628 if (package_manager_client_validate_handle(request))
629 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
632 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
635 request_id = pkgmgr_client_install(request->pc, request->pkg_type, NULL,
636 path, NULL, request->mode, event_cb ? event_cb : request_event_handler, request);
638 if (request_id == PKGMGR_R_EINVAL)
639 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
640 else if (request_id == PKGMGR_R_ENOPKG)
641 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
642 else if (request_id == PKGMGR_R_ENOMEM)
643 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
644 else if (request_id == PKGMGR_R_EIO)
645 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
646 else if (request_id == PKGMGR_R_EPRIV)
647 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
648 else if (request_id == PKGMGR_R_ESYSTEM || request_id == PKGMGR_R_ECOMM || request_id == PKGMGR_R_ERROR)
649 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
654 return PACKAGE_MANAGER_ERROR_NONE;
657 static int __request_uninstall(package_manager_request_h request,
658 const char *name, pkgmgr_handler event_cb, int *id)
661 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
662 if (retval != PACKAGE_MANAGER_ERROR_NONE)
665 if (package_manager_client_validate_handle(request))
666 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
669 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
672 request_id = pkgmgr_client_uninstall(request->pc, request->pkg_type,
673 name, request->mode, event_cb ? event_cb : request_event_handler, request);
675 if (request_id == PKGMGR_R_EINVAL)
676 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
677 else if (request_id == PKGMGR_R_ENOPKG)
678 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
679 else if (request_id == PKGMGR_R_ENOMEM)
680 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
681 else if (request_id == PKGMGR_R_EIO)
682 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
683 else if (request_id == PKGMGR_R_EPRIV)
684 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
685 else if (request_id == PKGMGR_R_ESYSTEM || request_id == PKGMGR_R_ECOMM || request_id == PKGMGR_R_ERROR)
686 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
691 return PACKAGE_MANAGER_ERROR_NONE;
694 static int __request_move(package_manager_request_h request,
695 const char *name, package_manager_move_type_e move_type,
696 pkgmgr_handler event_cb, int *id)
699 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
700 if (retval != PACKAGE_MANAGER_ERROR_NONE)
703 if (package_manager_client_validate_handle(request))
704 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
707 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
710 request_id = pkgmgr_client_request_service(PM_REQUEST_MOVE, move_type,
711 request->pc, request->pkg_type, name,
712 NULL, event_cb ? event_cb : request_event_handler, request);
714 if (request_id == PKGMGR_R_EINVAL)
715 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
716 else if (request_id == PKGMGR_R_ENOPKG)
717 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
718 else if (request_id == PKGMGR_R_ENOMEM)
719 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
720 else if (request_id == PKGMGR_R_EIO)
721 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
722 else if (request_id == PKGMGR_R_EPRIV)
723 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
724 else if (request_id == PKGMGR_R_ESYSTEM || request_id == PKGMGR_R_ECOMM || request_id == PKGMGR_R_ERROR)
725 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
730 return PACKAGE_MANAGER_ERROR_NONE;
733 API int package_manager_request_install(package_manager_request_h request,
734 const char *path, int *id)
736 return __request_install(request, path, NULL, id);
739 API int package_manager_request_install_with_cb(package_manager_request_h request,
740 const char *path, package_manager_request_event_cb callback,
741 void *user_data, int *id)
746 if (__request_cb_table == NULL)
747 __initialize_request_cb_table();
749 ret = __request_install(request, path, internal_request_callback, &req_id);
752 ret = __insert_request_cb_info(req_id, callback, user_data);
754 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
755 __FUNCTION__, "failed to create request cb info");
763 API int package_manager_request_uninstall(package_manager_request_h request,
764 const char *name, int *id)
766 return __request_uninstall(request, name, NULL, id);
769 API int package_manager_request_uninstall_with_cb(package_manager_request_h request,
770 const char *name, package_manager_request_event_cb callback,
771 void *user_data, int *id)
776 if (__request_cb_table == NULL)
777 __initialize_request_cb_table();
779 ret = __request_uninstall(request, name, internal_request_callback, &req_id);
782 ret = __insert_request_cb_info(req_id, callback, user_data);
784 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
785 __FUNCTION__, "failed to create request cb info");
793 API int package_manager_request_move(package_manager_request_h request,
794 const char *name, package_manager_move_type_e move_type)
796 return __request_move(request, name, move_type, NULL, NULL);
799 API int package_manager_request_move_with_cb(package_manager_request_h request,
800 const char *name, package_manager_move_type_e move_type,
801 package_manager_request_event_cb callback, void *user_data, int *id)
806 if (__request_cb_table == NULL)
807 __initialize_request_cb_table();
809 ret = __request_move(request, name, move_type, internal_request_callback, &req_id);
812 ret = __insert_request_cb_info(req_id, callback, user_data);
814 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
815 __FUNCTION__, "failed to create request cb info");
823 API int package_manager_create(package_manager_h *manager)
826 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
827 if (retval != PACKAGE_MANAGER_ERROR_NONE)
830 struct package_manager_s *package_manager = NULL;
832 if (manager == NULL) {
834 package_manager_error
835 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
839 package_manager = calloc(1, sizeof(struct package_manager_s));
840 if (package_manager == NULL) {
842 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
844 "failed to create a package_manager handle");
847 package_manager->ctype = PC_LISTENING;
848 package_manager->pc = pkgmgr_client_new(PC_LISTENING);
849 if (package_manager->pc == NULL) {
850 free(package_manager);
852 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
854 "failed to create a package_manager client");
857 package_manager->handle_id = package_manager_new_id();
859 *manager = package_manager;
861 return PACKAGE_MANAGER_ERROR_NONE;
864 static int package_manager_validate_handle(package_manager_h manager)
866 if (manager == NULL || manager->pc == NULL)
867 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
869 return PACKAGE_MANAGER_ERROR_NONE;
872 API int package_manager_destroy(package_manager_h manager)
874 if (package_manager_validate_handle(manager)) {
876 package_manager_error
877 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
881 pkgmgr_client_free(manager->pc);
883 __clean_all_event_info(manager->head);
886 return PACKAGE_MANAGER_ERROR_NONE;
889 static int __add_event(event_info **head, int req_id,
890 package_manager_event_type_e event_type,
891 package_manager_event_state_e event_state)
893 event_info *evt_info;
895 evt_info = (event_info *) calloc(1, sizeof(event_info));
896 if (evt_info == NULL) {
897 _LOGD("calloc failed");
900 evt_info->req_id = req_id;
901 evt_info->event_type = event_type;
902 evt_info->event_state = event_state;
903 evt_info->next = NULL;
910 static int __find_event(event_info **head, int req_id,
911 package_manager_event_type_e *event_type,
912 package_manager_event_state_e *event_state)
919 _LOGE("tmp is NULL");
923 *event_type = tmp->event_type;
924 *event_state = tmp->event_state;
928 static int __update_event(event_info **head, int req_id,
929 package_manager_event_type_e event_type,
930 package_manager_event_state_e event_state)
932 package_manager_event_type_e evt_type;
933 package_manager_event_state_e evt_state;
936 if (__find_event_info(head, req_id, &evt_type, &evt_state) != 0)
937 __add_event_info(head, req_id, event_type, event_state);
942 _LOGE("tmp is NULL");
946 tmp->event_type = event_type;
947 tmp->event_state = event_state;
954 /* App Event Listening Policy:
955 * +----------------+------------+---------------+------------------+
956 * |Listener \ Type |Global Event|My User's Event|Other user's Event|
957 * +----------------+------------+---------------+------------------+
958 * |User Process App| Grant | Grant | Deny |
959 * +----------------+------------+---------------+------------------+
960 * |Platform module | Grant | Grant | Grant |
961 * +----------------+------------+---------------+------------------+
962 * UID assignment policy:
963 * https://wiki.tizen.org/wiki/Security/User_and_group_ID_assignment_policy
965 #define REGULAR_USER 5000
966 static int __validate_event_signal(uid_t target_uid)
968 uid_t self = getuid();
970 if (self == target_uid)
973 if (self < REGULAR_USER)
979 static int global_event_handler(uid_t target_uid, int req_id, const char *pkg_type,
980 const char *pkg_name, const char *key,
981 const char *val, const void *pmsg, void *data)
984 package_manager_event_type_e event_type = -1;
985 package_manager_event_state_e event_state = -1;
986 uid_t uid = target_uid;
988 package_manager_h manager = data;
990 if (target_uid == GLOBAL_USER)
993 if (__validate_event_signal(uid))
994 return PACKAGE_MANAGER_ERROR_NONE;
996 if (strcasecmp(key, "start") == 0) {
997 ret = package_manager_get_event_type(val, &event_type);
998 if (ret != PACKAGE_MANAGER_ERROR_NONE)
999 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
1001 __add_event(&(manager->head), req_id, event_type,
1002 PACKAGE_MANAGER_EVENT_STATE_STARTED);
1004 if (manager->event_cb && getuid() == uid)
1005 manager->event_cb(pkg_type, pkg_name,
1007 PACKAGE_MANAGER_EVENT_STATE_STARTED,
1008 0, PACKAGE_MANAGER_ERROR_NONE, manager->user_data);
1009 } else if (strcasecmp(key, "install_percent") == 0
1010 || strcasecmp(key, "progress_percent") == 0) {
1012 (&(manager->head), req_id, &event_type,
1013 &event_state) == 0) {
1014 __update_event(&(manager->head), req_id,
1016 PACKAGE_MANAGER_EVENT_STATE_PROCESSING);
1017 if (manager->event_cb && getuid() == uid)
1018 manager->event_cb(pkg_type, pkg_name,
1020 PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
1022 PACKAGE_MANAGER_ERROR_NONE,
1023 manager->user_data);
1026 } else if (strcasecmp(key, "error") == 0) {
1027 if (strcasecmp(key, "0") != 0) {
1029 (&(manager->head), req_id, &event_type,
1030 &event_state) == 0) {
1031 __update_event(&(manager->head), req_id,
1033 PACKAGE_MANAGER_EVENT_STATE_FAILED);
1036 if (manager->event_cb && getuid() == uid)
1037 manager->event_cb(pkg_type,
1038 pkg_name, event_type,
1039 PACKAGE_MANAGER_EVENT_STATE_FAILED,
1041 PACKAGE_MANAGER_ERROR_NONE,
1042 manager->user_data);
1044 } else if (strcasecmp(key, "end") == 0) {
1046 (&(manager->head), req_id, &event_type,
1047 &event_state) == 0) {
1048 if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
1049 if (manager->event_cb && getuid() == uid)
1050 manager->event_cb(pkg_type,
1051 pkg_name, event_type,
1052 PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
1054 PACKAGE_MANAGER_ERROR_NONE,
1055 manager->user_data);
1058 if (strcasecmp(key, "ok") != 0) {
1059 if (manager->event_cb && getuid() == uid)
1060 manager->event_cb(pkg_type,
1061 pkg_name, event_type,
1062 PACKAGE_MANAGER_EVENT_STATE_FAILED,
1064 PACKAGE_MANAGER_ERROR_NONE,
1065 manager->user_data);
1070 return PACKAGE_MANAGER_ERROR_NONE;
1073 static int __convert_status_type(package_manager_status_type_e status_type)
1077 if (status_type == PACKAGE_MANAGER_STATUS_TYPE_ALL)
1078 return PKGMGR_CLIENT_STATUS_ALL;
1080 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_INSTALL)
1081 type |= PKGMGR_CLIENT_STATUS_INSTALL;
1082 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_UNINSTALL)
1083 type |= PKGMGR_CLIENT_STATUS_UNINSTALL;
1084 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_UPGRADE)
1085 type |= PKGMGR_CLIENT_STATUS_UPGRADE;
1086 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_MOVE)
1087 type |= PKGMGR_CLIENT_STATUS_MOVE;
1088 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_CLEAR_DATA)
1089 type |= PKGMGR_CLIENT_STATUS_CLEAR_DATA;
1090 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_INSTALL_PROGRESS)
1091 type |= PKGMGR_CLIENT_STATUS_INSTALL_PROGRESS;
1092 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_GET_SIZE)
1093 type |= PKGMGR_CLIENT_STATUS_GET_SIZE;
1098 API int package_manager_set_event_status(package_manager_h manager, int status_type)
1102 int type_all = PACKAGE_MANAGER_STATUS_TYPE_INSTALL |
1103 PACKAGE_MANAGER_STATUS_TYPE_UNINSTALL |
1104 PACKAGE_MANAGER_STATUS_TYPE_UPGRADE |
1105 PACKAGE_MANAGER_STATUS_TYPE_MOVE |
1106 PACKAGE_MANAGER_STATUS_TYPE_CLEAR_DATA |
1107 PACKAGE_MANAGER_STATUS_TYPE_INSTALL_PROGRESS |
1108 PACKAGE_MANAGER_STATUS_TYPE_GET_SIZE;
1110 if (manager == NULL)
1111 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1113 if (status_type < 0 || status_type > type_all)
1114 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1116 type = __convert_status_type(status_type);
1117 retval = pkgmgr_client_set_status_type(manager->pc, type);
1120 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1122 return PACKAGE_MANAGER_ERROR_NONE;
1125 API int package_manager_set_event_cb(package_manager_h manager,
1126 package_manager_event_cb callback,
1131 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1132 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1135 if (package_manager_validate_handle(manager)) {
1137 package_manager_error
1138 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1142 manager->event_cb = callback;
1143 manager->user_data = user_data;
1145 pkgmgr_client_listen_status(manager->pc, global_event_handler, manager);
1147 return PACKAGE_MANAGER_ERROR_NONE;
1150 API int package_manager_unset_event_cb(package_manager_h manager)
1152 if (manager == NULL) {
1154 package_manager_error
1155 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1160 manager->event_cb = NULL;
1161 manager->user_data = NULL;
1163 retval = pkgmgr_client_remove_listen_status(manager->pc);
1164 if (retval == PKGMGR_R_EINVAL)
1166 package_manager_error
1167 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1169 else if (retval == PKGMGR_R_ERROR)
1171 package_manager_error
1172 (PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__,
1175 return PACKAGE_MANAGER_ERROR_NONE;
1178 API int package_manager_get_package_id_by_app_id(const char *app_id, char **package_id)
1180 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo;
1182 char *pkg_id = NULL;
1183 char *pkg_id_dup = NULL;
1185 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1186 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1189 if (app_id == NULL || package_id == NULL)
1190 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1192 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1193 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1194 retval = pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id);
1195 if (retval != PMINFO_R_OK)
1196 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1198 pkg_id_dup = strdup(pkg_id);
1199 if (pkg_id_dup == NULL) {
1200 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1201 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1204 *package_id = pkg_id_dup;
1206 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1208 return PACKAGE_MANAGER_ERROR_NONE;
1211 API int package_manager_get_package_info(const char *package_id, package_info_h *package_info)
1214 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1215 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1218 retval = package_info_get_package_info(package_id, package_info);
1220 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1221 return package_manager_error(retval, __FUNCTION__, NULL);
1223 return PACKAGE_MANAGER_ERROR_NONE;
1226 API int package_manager_foreach_package_info(package_manager_package_info_cb callback,
1231 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1232 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1235 retval = package_info_foreach_package_info(callback, user_data);
1237 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1238 return package_manager_error(retval, __FUNCTION__, NULL);
1240 return PACKAGE_MANAGER_ERROR_NONE;
1243 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)
1245 pkgmgrinfo_cert_compare_result_type_e result;
1247 if (lhs_package_id == NULL || rhs_package_id == NULL || compare_result == NULL)
1248 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1249 if (pkgmgrinfo_pkginfo_compare_pkg_cert_info(lhs_package_id, rhs_package_id, &result) != PKGMGR_R_OK)
1250 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1251 *compare_result = (package_manager_compare_result_type_e)result;
1253 return PACKAGE_MANAGER_ERROR_NONE;
1256 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)
1258 pkgmgrinfo_cert_compare_result_type_e result;
1260 if (lhs_app_id == NULL || rhs_app_id == NULL || compare_result == NULL)
1261 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1262 if (pkgmgrinfo_pkginfo_compare_app_cert_info(lhs_app_id, rhs_app_id, &result) != PKGMGR_R_OK)
1263 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1265 *compare_result = (package_manager_compare_result_type_e)result;
1267 return PACKAGE_MANAGER_ERROR_NONE;
1270 API int package_manager_is_preload_package_by_app_id(const char *app_id, bool *preload)
1274 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1275 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1278 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo = NULL;
1279 pkgmgrinfo_pkginfo_h pkgmgrinfo_pkginfo = NULL;
1281 char *pkg_id = NULL;
1282 bool is_preload = 0;
1283 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1284 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1286 retval = pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id);
1287 if (retval != PMINFO_R_OK) {
1288 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1289 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1291 if (pkgmgrinfo_pkginfo_get_pkginfo(pkg_id, &pkgmgrinfo_pkginfo) != PMINFO_R_OK) {
1292 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1293 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1294 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1296 if (pkgmgrinfo_pkginfo_is_preload(pkgmgrinfo_pkginfo, &is_preload) != PMINFO_R_OK) {
1297 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1298 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1299 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1307 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1308 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1310 return PACKAGE_MANAGER_ERROR_NONE;
1313 API int package_manager_get_permission_type(const char *app_id, package_manager_permission_type_e *permission_type)
1317 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1318 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1321 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo = NULL;
1322 pkgmgrinfo_permission_type permission = 0;
1323 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1324 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1325 retval = pkgmgrinfo_appinfo_get_permission_type(pkgmgrinfo_appinfo, &permission);
1326 if (retval != PMINFO_R_OK)
1327 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1329 if (permission == PMINFO_PERMISSION_NORMAL)
1330 *permission_type = PACKAGE_MANAGER_PERMISSION_NORMAL;
1331 else if (permission == PMINFO_PERMISSION_SIGNATURE)
1332 *permission_type = PACKAGE_MANAGER_PERMISSION_SIGNATURE;
1333 else if (permission == PMINFO_PERMISSION_PRIVILEGE)
1334 *permission_type = PACKAGE_MANAGER_PERMISSION_PRIVILEGE;
1336 *permission_type = PACKAGE_MANAGER_PERMISSION_NORMAL;
1338 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1339 return PACKAGE_MANAGER_ERROR_NONE;
1342 API int package_manager_clear_cache_dir(const char *package_id)
1346 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_CACHE);
1347 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1350 int res = pkgmgr_client_clear_cache_dir(package_id);
1351 if (res == PKGMGR_R_EINVAL) {
1352 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1353 } else if (res == PKGMGR_R_ENOPKG) {
1354 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1355 } else if (res == PKGMGR_R_ENOMEM) {
1356 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1357 } else if (res == PKGMGR_R_EIO) {
1358 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1359 } else if (res == PKGMGR_R_EPRIV) {
1360 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
1361 } else if (res == PKGMGR_R_ESYSTEM || res == PKGMGR_R_ECOMM || res == PKGMGR_R_ERROR) {
1362 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1363 } else if (res != PKGMGR_R_OK) {
1364 _LOGE("Unexpected error");
1365 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1368 return PACKAGE_MANAGER_ERROR_NONE;
1371 API int package_manager_clear_data_dir(const char *package_id)
1374 pkgmgr_client *pc = NULL;
1375 char *pkg_type = NULL;
1376 pkgmgrinfo_pkginfo_h pkginfo = NULL;
1378 if (package_id == NULL)
1379 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
1381 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
1382 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1385 retval = pkgmgrinfo_pkginfo_get_pkginfo(package_id, &pkginfo);
1386 if (retval == PMINFO_R_ENOENT)
1387 return PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE;
1388 else if (retval != PMINFO_R_OK || pkginfo == NULL)
1389 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
1391 retval = pkgmgrinfo_pkginfo_get_type(pkginfo, &pkg_type);
1392 if (retval != PMINFO_R_OK || pkg_type == NULL) {
1393 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
1394 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
1397 pc = pkgmgr_client_new(PC_REQUEST);
1399 _LOGE("Out of memory");
1400 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
1401 return PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY;
1404 retval = pkgmgr_client_clear_user_data(pc, pkg_type, package_id, PM_QUIET);
1405 pkgmgr_client_free(pc);
1406 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
1408 if (retval == PKGMGR_R_EINVAL) {
1409 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1410 } else if (retval == PKGMGR_R_ENOPKG) {
1411 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1412 } else if (retval == PKGMGR_R_ENOMEM) {
1413 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1414 } else if (retval == PKGMGR_R_EIO) {
1415 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1416 } else if (retval == PKGMGR_R_EPRIV) {
1417 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
1418 } else if (retval == PKGMGR_R_ESYSTEM || retval == PKGMGR_R_ECOMM || retval == PKGMGR_R_ERROR) {
1419 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1420 } else if (retval != PKGMGR_R_OK) {
1421 _LOGE("Unexpected error");
1422 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1425 return PACKAGE_MANAGER_ERROR_NONE;
1428 API int package_manager_clear_all_cache_dir(void)
1432 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
1433 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1436 return package_manager_clear_cache_dir(PKG_CLEAR_ALL_CACHE);
1439 static void __free_client(gpointer data)
1441 pkgmgr_client *pc = (pkgmgr_client *)data;
1442 pkgmgr_client_free(pc);
1445 static void __initialize_cb_table(void)
1447 __cb_table = g_hash_table_new_full(g_direct_hash, g_direct_equal, __free_client, NULL);
1450 static void __result_cb(pkgmgr_client *pc, const char *pkgid, const pkg_size_info_t *result, void *user_data)
1452 package_manager_size_info_receive_cb callback = g_hash_table_lookup(__cb_table, pc);
1453 if (callback == NULL) {
1454 _LOGE("callback is null.");
1455 g_hash_table_remove(__cb_table, pc);
1459 package_size_info_t size_info;
1460 size_info.data_size = result->data_size;
1461 size_info.cache_size = result->cache_size;
1462 size_info.app_size = result->app_size;
1463 size_info.external_data_size = result->ext_data_size;
1464 size_info.external_cache_size = result->ext_cache_size;
1465 size_info.external_app_size = result->ext_app_size;
1467 callback(pkgid, (package_size_info_h)&size_info, user_data);
1469 g_hash_table_remove(__cb_table, pc);
1472 static void __total_result_cb(pkgmgr_client *pc, const pkg_size_info_t *result, void *user_data)
1474 package_manager_total_size_info_receive_cb callback = g_hash_table_lookup(__cb_table, pc);
1475 if (callback == NULL) {
1476 _LOGE("callback is null.");
1477 g_hash_table_remove(__cb_table, pc);
1481 package_size_info_t size_info;
1482 size_info.data_size = result->data_size;
1483 size_info.cache_size = result->cache_size;
1484 size_info.app_size = result->app_size;
1485 size_info.external_data_size = result->ext_data_size;
1486 size_info.external_cache_size = result->ext_cache_size;
1487 size_info.external_app_size = result->ext_app_size;
1489 callback((package_size_info_h)&size_info, user_data);
1491 g_hash_table_remove(__cb_table, pc);
1494 static int _get_pkg_size_info(const char *package_id, void *callback, void *user_data)
1496 if (package_id == NULL || callback == NULL)
1497 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1499 if (__cb_table == NULL)
1500 __initialize_cb_table();
1502 pkgmgr_client *pc = pkgmgr_client_new(PC_REQUEST);
1504 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1507 if (strcmp(package_id, PKG_SIZE_INFO_TOTAL) != 0)
1508 res = pkgmgr_client_get_package_size_info(pc, package_id, __result_cb, user_data);
1510 res = pkgmgr_client_get_total_package_size_info(pc, __total_result_cb, user_data);
1512 if (res == PKGMGR_R_EINVAL) {
1513 pkgmgr_client_free(pc);
1514 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1515 } else if (res == PKGMGR_R_ENOPKG) {
1516 pkgmgr_client_free(pc);
1517 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1518 } else if (res == PKGMGR_R_ENOMEM) {
1519 pkgmgr_client_free(pc);
1520 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1521 } else if (res == PKGMGR_R_EIO) {
1522 pkgmgr_client_free(pc);
1523 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1524 } else if (res == PKGMGR_R_EPRIV) {
1525 pkgmgr_client_free(pc);
1526 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
1527 } else if (res == PKGMGR_R_ESYSTEM || res == PKGMGR_R_ECOMM || res == PKGMGR_R_ERROR) {
1528 pkgmgr_client_free(pc);
1529 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1530 } else if (res != PKGMGR_R_OK) {
1531 _LOGE("Unexpected error");
1532 pkgmgr_client_free(pc);
1533 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1536 g_hash_table_insert(__cb_table, pc, callback);
1538 return PACKAGE_MANAGER_ERROR_NONE;
1541 API int package_manager_get_package_size_info(const char *package_id, package_manager_size_info_receive_cb callback, void *user_data)
1543 return _get_pkg_size_info(package_id, (void *)callback, user_data);
1546 API int package_manager_get_total_package_size_info(package_manager_total_size_info_receive_cb callback, void *user_data)
1548 return _get_pkg_size_info(PKG_SIZE_INFO_TOTAL, (void *)callback, user_data);
1551 API int package_manager_filter_create(package_manager_filter_h *handle)
1554 pkgmgrinfo_pkginfo_filter_h pkgmgr_filter = NULL;
1556 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1557 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1560 if (handle == NULL) {
1562 package_manager_error
1563 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1567 retval = pkgmgrinfo_pkginfo_filter_create(&pkgmgr_filter);
1568 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1569 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1571 *handle = pkgmgr_filter;
1573 return PACKAGE_MANAGER_ERROR_NONE;
1576 API int package_manager_filter_destroy(package_manager_filter_h handle)
1580 if (handle == NULL) {
1582 package_manager_error
1583 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1587 retval = pkgmgrinfo_pkginfo_filter_destroy(handle);
1588 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1589 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1591 return PACKAGE_MANAGER_ERROR_NONE;
1594 API int package_manager_filter_add_bool(package_manager_filter_h handle,
1595 const char *property, const bool value)
1599 if ((handle == NULL) || (property == NULL)) {
1601 package_manager_error
1602 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1606 retval = pkgmgrinfo_pkginfo_filter_add_bool(handle, property, value);
1607 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1608 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1610 return PACKAGE_MANAGER_ERROR_NONE;
1613 API int package_manager_filter_count(package_manager_filter_h handle, int *count)
1617 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1618 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1621 if ((handle == NULL) || (count == NULL))
1622 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1624 retval = pkgmgrinfo_pkginfo_filter_count(handle, count);
1626 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1628 return PACKAGE_MANAGER_ERROR_NONE;
1631 API int package_manager_filter_foreach_package_info(package_manager_filter_h handle,
1632 package_manager_package_info_cb callback, void *user_data)
1636 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1637 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1640 retval = package_info_filter_foreach_package_info(handle, callback, user_data);
1642 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1643 return package_manager_error(retval, __FUNCTION__, NULL);
1645 return PACKAGE_MANAGER_ERROR_NONE;
1648 API int package_size_info_get_data_size(package_size_info_h handle, long long *data_size)
1651 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1653 package_size_info_t *size_info = (package_size_info_t *)handle;
1655 *data_size = (long long)size_info->data_size;
1656 return PACKAGE_MANAGER_ERROR_NONE;
1659 API int package_size_info_get_cache_size(package_size_info_h handle, long long *cache_size)
1662 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1664 package_size_info_t *size_info = (package_size_info_t *)handle;
1666 *cache_size = size_info->cache_size;
1667 return PACKAGE_MANAGER_ERROR_NONE;
1670 API int package_size_info_get_app_size(package_size_info_h handle, long long *app_size)
1673 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1675 package_size_info_t *size_info = (package_size_info_t *)handle;
1676 *app_size = size_info->app_size;
1677 return PACKAGE_MANAGER_ERROR_NONE;
1680 API int package_size_info_get_external_data_size(package_size_info_h handle, long long *ext_data_size)
1683 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
1685 package_size_info_t *size_info = (package_size_info_t *)handle;
1686 *ext_data_size = size_info->external_data_size;
1687 return PACKAGE_MANAGER_ERROR_NONE;
1690 API int package_size_info_get_external_cache_size(package_size_info_h handle, long long *ext_cache_size)
1693 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1695 package_size_info_t *size_info = (package_size_info_t *)handle;
1696 *ext_cache_size = size_info->external_cache_size;
1697 return PACKAGE_MANAGER_ERROR_NONE;
1700 API int package_size_info_get_external_app_size(package_size_info_h handle, long long *ext_app_size)
1703 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1705 package_size_info_t *size_info = (package_size_info_t *)handle;
1706 *ext_app_size = size_info->external_app_size;
1707 return PACKAGE_MANAGER_ERROR_NONE;
1710 API int package_manager_updateinfo_set_pkgid(package_updateinfo_request_h pkg_updateinfo_req, const char *pkgid)
1712 struct package_updateinfo_request_s *request;
1714 if (pkg_updateinfo_req == NULL || pkg_updateinfo_req->updateinfo_handle == NULL)
1715 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1717 request = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1718 if (request->updateinfo_handle->pkgid)
1719 free(request->updateinfo_handle->pkgid);
1720 request->updateinfo_handle->pkgid = strdup(pkgid);
1721 if (request->updateinfo_handle->pkgid == NULL)
1722 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1724 return PACKAGE_MANAGER_ERROR_NONE;
1727 API int package_manager_updateinfo_set_version(package_updateinfo_request_h pkg_updateinfo_req, const char *version)
1729 struct package_updateinfo_request_s *request;
1731 if (pkg_updateinfo_req == NULL || pkg_updateinfo_req->updateinfo_handle == NULL)
1732 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1734 request = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1735 if (request->updateinfo_handle->version)
1736 free(request->updateinfo_handle->version);
1737 request->updateinfo_handle->version = strdup(version);
1738 if (request->updateinfo_handle->pkgid == NULL)
1739 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1741 return PACKAGE_MANAGER_ERROR_NONE;
1744 static int package_manager_updateinfo_convert_property(package_updateinfo_type_e property, pkgmgr_updateinfo_type *converted_property)
1746 if (converted_property == NULL)
1749 if (property == PACKAGE_UPDATEINFO_TYPE_FORCE)
1750 *converted_property = PM_UPDATEINFO_TYPE_FORCE;
1751 else if (property == PACKAGE_UPDATEINFO_TYPE_OPTIONAL)
1752 *converted_property = PM_UPDATEINFO_TYPE_OPTIONAL;
1753 else if (property == PACKAGE_UPDATEINFO_TYPE_NONE)
1754 *converted_property = PM_UPDATEINFO_TYPE_NONE;
1761 API int package_manager_updateinfo_set_type(package_updateinfo_request_h pkg_updateinfo_req, package_updateinfo_type_e type)
1764 pkgmgr_updateinfo_type converted_type;
1765 struct package_updateinfo_request_s *request;
1767 if (pkg_updateinfo_req == NULL || pkg_updateinfo_req->updateinfo_handle == NULL)
1768 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1770 request = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1771 retval = package_manager_updateinfo_convert_property(type, &converted_type);
1773 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1775 request->updateinfo_handle->type = converted_type;
1776 return PACKAGE_MANAGER_ERROR_NONE;
1779 API int package_manager_updateinfo_request_destroy(package_updateinfo_request_h pkg_updateinfo_req)
1781 struct package_updateinfo_request_s *request;
1783 if (pkg_updateinfo_req == NULL)
1784 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1786 request = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1788 pkgmgr_client_free(request->pc);
1790 if (request->updateinfo_handle) {
1791 if (request->updateinfo_handle->pkgid)
1792 free(request->updateinfo_handle->pkgid);
1793 if (request->updateinfo_handle->version)
1794 free(request->updateinfo_handle->version);
1795 free(request->updateinfo_handle);
1799 return PACKAGE_MANAGER_ERROR_NONE;
1802 API int package_manager_updateinfo_request_create(package_updateinfo_request_h *pkg_updateinfo_req)
1804 struct package_updateinfo_request_s *request;
1805 pkg_update_info_t *update_info;
1807 if (pkg_updateinfo_req == NULL)
1808 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1810 request = calloc(1, sizeof(struct package_updateinfo_request_s));
1811 if (request == NULL)
1812 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1814 request->pc = pkgmgr_client_new(PC_REQUEST);
1815 if (request->pc == NULL)
1816 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1818 update_info = calloc(1, sizeof(pkg_update_info_t));
1819 if (update_info == NULL) {
1820 pkgmgr_client_free(request->pc);
1821 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1823 request->updateinfo_handle = update_info;
1825 *pkg_updateinfo_req = request;
1826 return PACKAGE_MANAGER_ERROR_NONE;
1829 API int package_manager_updateinfo_request_register(package_updateinfo_request_h pkg_updateinfo_req)
1831 struct package_updateinfo_request_s *update_info;
1834 if (pkg_updateinfo_req == NULL)
1835 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1836 update_info = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1838 retval = pkgmgr_client_register_pkg_update_info(update_info->pc, update_info->updateinfo_handle);
1839 if (retval == PKGMGR_R_EINVAL)
1840 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1842 return PACKAGE_MANAGER_ERROR_NONE;
1845 API int package_manager_updateinfo_request_unregister(package_updateinfo_request_h pkg_updateinfo_req, const char *pkgid)
1848 struct package_updateinfo_request_s *update_info;
1850 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
1851 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1854 if (pkg_updateinfo_req == NULL || pkgid == NULL)
1855 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1857 update_info = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1858 retval = pkgmgr_client_unregister_pkg_update_info(update_info->pc, pkgid);
1859 if (retval != PMINFO_R_OK)
1860 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1862 return PACKAGE_MANAGER_ERROR_NONE;
1865 API int package_manager_updateinfo_request_unregister_all(package_updateinfo_request_h pkg_updateinfo_req)
1868 struct package_updateinfo_request_s *update_info;
1870 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
1871 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1874 if (pkg_updateinfo_req == NULL)
1875 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1877 update_info = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1878 retval = pkgmgr_client_unregister_all_pkg_update_info(update_info->pc);
1880 if (retval != PMINFO_R_OK)
1881 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1883 return PACKAGE_MANAGER_ERROR_NONE;