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;
32 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
33 typedef struct _event_info {
35 package_manager_event_type_e event_type;
36 package_manager_event_state_e event_state;
37 struct _event_info *next;
40 struct package_manager_s {
42 pkgmgr_client_type ctype;
46 package_manager_event_cb event_cb;
50 struct package_manager_request_s {
52 pkgmgr_client_type ctype;
57 package_manager_request_event_cb event_cb;
58 GHashTable *request_cb_table;
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(package_manager_request_h request)
114 request->request_cb_table =
115 g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, __free_request_cb_info);
118 static int __insert_request_cb_info(package_manager_request_h request, int req_id,
119 package_manager_request_event_cb callback, void *user_data)
121 struct package_manager_request_cb_info *cb_info;
123 if (request->request_cb_table == NULL)
126 cb_info = calloc(1, sizeof(struct package_manager_request_cb_info));
129 cb_info->req_id = req_id;
130 cb_info->callback = callback;
131 cb_info->user_data = user_data;
132 _LOGD("insert req_id(%d)", req_id);
133 g_hash_table_insert(request->request_cb_table, GINT_TO_POINTER(cb_info->req_id), cb_info);
138 static void __clean_all_event_info(event_info *head)
140 event_info *current = head;
148 current = current->next;
154 API int package_manager_request_create(package_manager_request_h *request)
156 struct package_manager_request_s *package_manager_request;
158 if (request == NULL) {
160 package_manager_error
161 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
165 package_manager_request =
166 calloc(1, sizeof(struct package_manager_request_s));
167 if (package_manager_request == NULL) {
169 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
171 "failed to create a package_manager handle");
174 package_manager_request->ctype = PC_REQUEST;
175 package_manager_request->pc = pkgmgr_client_new(PC_REQUEST);
176 if (package_manager_request->pc == NULL) {
177 free(package_manager_request);
179 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
181 "failed to create a package_manager client");
184 package_manager_request->handle_id = package_manager_request_new_id();
186 *request = package_manager_request;
188 return PACKAGE_MANAGER_ERROR_NONE;
191 static int package_manager_client_validate_handle(package_manager_request_h
194 if (request == NULL || request->pc == NULL)
195 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
197 return PACKAGE_MANAGER_ERROR_NONE;
200 API int package_manager_request_destroy(package_manager_request_h request)
202 if (package_manager_client_validate_handle(request)) {
204 package_manager_error
205 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
209 pkgmgr_client_free(request->pc);
211 free(request->pkg_type);
212 __clean_all_event_info(request->head);
213 if (request->request_cb_table) {
214 g_hash_table_destroy(request->request_cb_table);
215 request->request_cb_table = NULL;
219 return PACKAGE_MANAGER_ERROR_NONE;
222 static int __reset_user_request_callback(package_manager_request_h request,
223 package_manager_request_event_cb callback, void *user_data)
225 if (package_manager_client_validate_handle(request))
226 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
228 request->event_cb = callback;
229 request->user_data = user_data;
231 return PACKAGE_MANAGER_ERROR_NONE;
234 API int package_manager_request_set_event_cb(package_manager_request_h request,
235 package_manager_request_event_cb
236 callback, void *user_data)
240 ret = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
241 if (ret != PACKAGE_MANAGER_ERROR_NONE)
244 return __reset_user_request_callback(request, callback, user_data);
247 API int package_manager_request_unset_event_cb(package_manager_request_h request)
249 if (package_manager_client_validate_handle(request))
250 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
252 request->event_cb = NULL;
253 request->user_data = NULL;
255 return PACKAGE_MANAGER_ERROR_NONE;
258 API int package_manager_request_set_type(package_manager_request_h request,
259 const char *pkg_type)
261 if (package_manager_client_validate_handle(request)) {
263 package_manager_error
264 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
268 request->pkg_type = strdup(pkg_type);
270 return PACKAGE_MANAGER_ERROR_NONE;
273 API int package_manager_request_set_mode(package_manager_request_h request,
274 package_manager_request_mode_e mode)
276 if (package_manager_client_validate_handle(request)) {
278 package_manager_error
279 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
283 /* request mode is not used anymore */
285 return PACKAGE_MANAGER_ERROR_NONE;
288 API int package_manager_request_set_tep(package_manager_request_h request,
289 const char *tep_path)
293 if (package_manager_client_validate_handle(request) || tep_path == NULL) {
295 package_manager_error
296 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
300 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
301 if (retval != PACKAGE_MANAGER_ERROR_NONE)
304 if (pkgmgr_client_set_tep_path(request->pc, tep_path, true))
305 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
307 return PACKAGE_MANAGER_ERROR_NONE;
310 static int package_manager_get_event_type(const char *key,
311 package_manager_event_type_e *
315 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
317 if (strcasecmp(key, PKGMGR_INSTALLER_INSTALL_EVENT_STR) == 0)
318 *event_type = PACKAGE_MANAGER_EVENT_TYPE_INSTALL;
319 else if (strcasecmp(key, PKGMGR_INSTALLER_UNINSTALL_EVENT_STR) == 0)
320 *event_type = PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL;
321 else if (strcasecmp(key, PKGMGR_INSTALLER_UPGRADE_EVENT_STR) == 0)
322 *event_type = PACKAGE_MANAGER_EVENT_TYPE_UPDATE;
323 else if (strcasecmp(key, PKGMGR_INSTALLER_MOVE_EVENT_STR) == 0)
324 *event_type = PACKAGE_MANAGER_EVENT_TYPE_MOVE;
325 else if (strcasecmp(key, PKGMGR_INSTALLER_CLEAR_EVENT_STR) == 0)
326 *event_type = PACKAGE_MANAGER_EVENT_TYPE_CLEAR;
328 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
330 return PACKAGE_MANAGER_ERROR_NONE;
333 static int __add_event_info(event_info **head, int req_id,
334 package_manager_event_type_e event_type,
335 package_manager_event_state_e event_state)
337 event_info *evt_info;
341 evt_info = (event_info *) calloc(1, sizeof(event_info));
342 if (evt_info == NULL) {
343 _LOGD("calloc failed");
346 evt_info->req_id = req_id;
347 evt_info->event_type = event_type;
348 evt_info->next = NULL;
353 current = prev = *head;
356 current = current->next;
359 prev->next = evt_info;
365 static int __find_event_info(event_info **head, int req_id,
366 package_manager_event_type_e *event_type,
367 package_manager_event_state_e *event_state)
374 _LOGE("tmp is NULL");
379 if (tmp->req_id == req_id) {
380 *event_type = tmp->event_type;
388 static int __update_event_info(event_info **head, int req_id,
389 package_manager_event_type_e event_type,
390 package_manager_event_state_e event_state)
392 package_manager_event_type_e evt_type;
393 package_manager_event_state_e evt_state;
396 if (__find_event_info(head, req_id, &evt_type, &evt_state) != 0)
397 __add_event_info(head, req_id, event_type, event_state);
402 _LOGE("tmp is NULL");
407 if (tmp->req_id == req_id) {
408 tmp->event_type = event_type;
419 static int __remove_event_info(event_info **head request, int req_id)
430 if (current->next->req_id == req_id) {
432 current->next = current->next->next;
444 static int request_event_handler(uid_t target_uid, int req_id, const char *pkg_type,
445 const char *pkg_name, const char *key,
446 const char *val, const void *pmsg, void *data)
449 package_manager_event_type_e event_type = -1;
450 package_manager_event_state_e event_state = -1;
452 package_manager_request_h request = data;
454 if (strcasecmp(key, "start") == 0) {
455 ret = package_manager_get_event_type(val, &event_type);
456 if (ret != PACKAGE_MANAGER_ERROR_NONE)
457 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
459 __add_event_info(&(request->head), req_id, event_type,
460 PACKAGE_MANAGER_EVENT_STATE_STARTED);
462 if (request->event_cb)
463 request->event_cb(req_id, pkg_type, pkg_name,
465 PACKAGE_MANAGER_EVENT_STATE_STARTED,
466 0, PACKAGE_MANAGER_ERROR_NONE, request->user_data);
468 } else if (strcasecmp(key, "install_percent") == 0
469 || strcasecmp(key, "progress_percent") == 0) {
470 if (__find_event_info
471 (&(request->head), req_id, &event_type,
472 &event_state) == 0) {
473 __update_event_info(&(request->head), req_id,
475 PACKAGE_MANAGER_EVENT_STATE_PROCESSING);
476 if (request->event_cb)
477 request->event_cb(req_id, pkg_type, pkg_name,
479 PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
481 PACKAGE_MANAGER_ERROR_NONE,
485 } else if (strcasecmp(key, "error") == 0) {
486 if (strcasecmp(key, "0") != 0) {
487 if (__find_event_info
488 (&(request->head), req_id, &event_type,
489 &event_state) == 0) {
490 __update_event_info(&(request->head), req_id,
492 PACKAGE_MANAGER_EVENT_STATE_FAILED);
495 if (request->event_cb)
496 request->event_cb(req_id, pkg_type,
497 pkg_name, event_type,
498 PACKAGE_MANAGER_EVENT_STATE_FAILED,
500 PACKAGE_MANAGER_ERROR_NONE,
504 } else if (strcasecmp(key, "end") == 0) {
505 if (__find_event_info
506 (&(request->head), req_id, &event_type,
507 &event_state) == 0) {
508 if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
509 if (request->event_cb)
510 request->event_cb(req_id, pkg_type,
511 pkg_name, event_type,
512 PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
514 PACKAGE_MANAGER_ERROR_NONE,
518 if (strcasecmp(key, "ok") != 0)
519 if (request->event_cb)
520 request->event_cb(req_id, pkg_type,
521 pkg_name, event_type,
522 PACKAGE_MANAGER_EVENT_STATE_FAILED,
524 PACKAGE_MANAGER_ERROR_NONE,
529 return PACKAGE_MANAGER_ERROR_NONE;
532 static int internal_request_callback(uid_t target_uid, int req_id, const char *pkg_type,
533 const char *pkg_name, const char *key,
534 const char *val, const void *pmsg, void *data)
537 package_manager_event_type_e event_type = -1;
538 package_manager_event_state_e event_state = -1;
539 struct package_manager_request_cb_info *cb_info;
540 package_manager_request_event_cb event_cb;
541 void *user_data = NULL;
543 _LOGD("request callback called, req_id[%d]", req_id);
545 package_manager_request_h request = data;
547 if (request->request_cb_table)
548 cb_info = g_hash_table_lookup(request->request_cb_table,
549 GINT_TO_POINTER(req_id));
553 if (!cb_info || (cb_info && !cb_info->callback)) {
554 _LOGE("no callback info");
558 if (cb_info->req_id != req_id) {
559 _LOGE("not matched request id");
563 event_cb = cb_info->callback;
564 user_data = cb_info->user_data;
566 if (strcasecmp(key, "start") == 0) {
567 ret = package_manager_get_event_type(val, &event_type);
568 if (ret != PACKAGE_MANAGER_ERROR_NONE)
569 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
571 __add_event_info(&request->head, req_id, event_type,
572 PACKAGE_MANAGER_EVENT_STATE_STARTED);
574 event_cb(req_id, pkg_type, pkg_name,
576 PACKAGE_MANAGER_EVENT_STATE_STARTED,
577 0, PACKAGE_MANAGER_ERROR_NONE, user_data);
578 } else if (strcasecmp(key, "install_percent") == 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_PROCESSING);
584 event_cb(req_id, pkg_type, pkg_name,
586 PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
588 PACKAGE_MANAGER_ERROR_NONE,
591 } else if (strcasecmp(key, "error") == 0) {
592 if (__find_event_info(&request->head, req_id, &event_type,
593 &event_state) == 0) {
594 __update_event_info(&request->head, req_id,
596 PACKAGE_MANAGER_EVENT_STATE_FAILED);
597 event_cb(req_id, pkg_type,
598 pkg_name, event_type,
599 PACKAGE_MANAGER_EVENT_STATE_FAILED,
601 PACKAGE_MANAGER_ERROR_NONE,
604 } else if (strcasecmp(key, "end") == 0) {
605 if (__find_event_info(&request->head, req_id, &event_type,
606 &event_state) == 0) {
607 if (request->request_cb_table) {
608 _LOGD("remove item, req_id(%d)", req_id);
609 g_hash_table_remove(request->request_cb_table,
610 GINT_TO_POINTER(req_id));
612 if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
613 if (strcasecmp(val, "ok") == 0) {
614 event_cb(req_id, pkg_type,
615 pkg_name, event_type,
616 PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
618 PACKAGE_MANAGER_ERROR_NONE,
621 event_cb(req_id, pkg_type,
622 pkg_name, event_type,
623 PACKAGE_MANAGER_EVENT_STATE_FAILED,
625 PACKAGE_MANAGER_ERROR_NONE,
630 _LOGE("unexpected end event");
637 static int __request_install(package_manager_request_h request,
638 const char *path, pkgmgr_handler event_cb, int *id)
641 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
642 if (retval != PACKAGE_MANAGER_ERROR_NONE)
645 if (package_manager_client_validate_handle(request))
646 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
649 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
652 request_id = pkgmgr_client_install(request->pc, request->pkg_type, NULL,
653 path, NULL, request->mode, event_cb ? event_cb : request_event_handler, request);
655 if (request_id == PKGMGR_R_EINVAL)
656 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
657 else if (request_id == PKGMGR_R_ENOPKG)
658 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
659 else if (request_id == PKGMGR_R_ENOMEM)
660 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
661 else if (request_id == PKGMGR_R_EIO)
662 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
663 else if (request_id == PKGMGR_R_EPRIV)
664 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
665 else if (request_id == PKGMGR_R_ESYSTEM || request_id == PKGMGR_R_ECOMM || request_id == PKGMGR_R_ERROR)
666 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
671 return PACKAGE_MANAGER_ERROR_NONE;
674 static int __request_uninstall(package_manager_request_h request,
675 const char *name, pkgmgr_handler event_cb, int *id)
678 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
679 if (retval != PACKAGE_MANAGER_ERROR_NONE)
682 if (package_manager_client_validate_handle(request))
683 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
686 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
689 request_id = pkgmgr_client_uninstall(request->pc, request->pkg_type,
690 name, request->mode, event_cb ? event_cb : request_event_handler, request);
692 if (request_id == PKGMGR_R_EINVAL)
693 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
694 else if (request_id == PKGMGR_R_ENOPKG)
695 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
696 else if (request_id == PKGMGR_R_ENOMEM)
697 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
698 else if (request_id == PKGMGR_R_EIO)
699 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
700 else if (request_id == PKGMGR_R_EPRIV)
701 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
702 else if (request_id == PKGMGR_R_ESYSTEM || request_id == PKGMGR_R_ECOMM || request_id == PKGMGR_R_ERROR)
703 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
708 return PACKAGE_MANAGER_ERROR_NONE;
711 static int __request_move(package_manager_request_h request,
712 const char *name, package_manager_move_type_e move_type,
713 pkgmgr_handler event_cb, int *id)
716 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
717 if (retval != PACKAGE_MANAGER_ERROR_NONE)
720 if (package_manager_client_validate_handle(request))
721 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
724 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
727 request_id = pkgmgr_client_request_service(PM_REQUEST_MOVE, move_type,
728 request->pc, request->pkg_type, name,
729 NULL, event_cb ? event_cb : request_event_handler, request);
731 if (request_id == PKGMGR_R_EINVAL)
732 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
733 else if (request_id == PKGMGR_R_ENOPKG)
734 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
735 else if (request_id == PKGMGR_R_ENOMEM)
736 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
737 else if (request_id == PKGMGR_R_EIO)
738 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
739 else if (request_id == PKGMGR_R_EPRIV)
740 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
741 else if (request_id == PKGMGR_R_ESYSTEM || request_id == PKGMGR_R_ECOMM || request_id == PKGMGR_R_ERROR)
742 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
747 return PACKAGE_MANAGER_ERROR_NONE;
750 API int package_manager_request_install(package_manager_request_h request,
751 const char *path, int *id)
753 return __request_install(request, path, NULL, id);
756 API int package_manager_request_install_with_cb(package_manager_request_h request,
757 const char *path, package_manager_request_event_cb callback,
758 void *user_data, int *id)
763 if (request->request_cb_table == NULL)
764 __initialize_request_cb_table(request);
766 ret = __request_install(request, path, internal_request_callback, &req_id);
769 ret = __insert_request_cb_info(request, req_id, callback, user_data);
771 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
772 __FUNCTION__, "failed to create request cb info");
780 API int package_manager_request_uninstall(package_manager_request_h request,
781 const char *name, int *id)
783 return __request_uninstall(request, name, NULL, id);
786 API int package_manager_request_uninstall_with_cb(package_manager_request_h request,
787 const char *name, package_manager_request_event_cb callback,
788 void *user_data, int *id)
793 if (request->request_cb_table == NULL)
794 __initialize_request_cb_table(request);
796 ret = __request_uninstall(request, name, internal_request_callback, &req_id);
799 ret = __insert_request_cb_info(request, req_id, callback, user_data);
801 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
802 __FUNCTION__, "failed to create request cb info");
810 API int package_manager_request_move(package_manager_request_h request,
811 const char *name, package_manager_move_type_e move_type)
813 return __request_move(request, name, move_type, NULL, NULL);
816 API int package_manager_request_move_with_cb(package_manager_request_h request,
817 const char *name, package_manager_move_type_e move_type,
818 package_manager_request_event_cb callback, void *user_data, int *id)
823 if (request->request_cb_table == NULL)
824 __initialize_request_cb_table(request);
826 ret = __request_move(request, name, move_type, internal_request_callback, &req_id);
829 ret = __insert_request_cb_info(request, req_id, callback, user_data);
831 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
832 __FUNCTION__, "failed to create request cb info");
840 API int package_manager_create(package_manager_h *manager)
843 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
844 if (retval != PACKAGE_MANAGER_ERROR_NONE)
847 struct package_manager_s *package_manager = NULL;
849 if (manager == NULL) {
851 package_manager_error
852 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
856 package_manager = calloc(1, sizeof(struct package_manager_s));
857 if (package_manager == NULL) {
859 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
861 "failed to create a package_manager handle");
864 package_manager->ctype = PC_LISTENING;
865 package_manager->pc = pkgmgr_client_new(PC_LISTENING);
866 if (package_manager->pc == NULL) {
867 free(package_manager);
869 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
871 "failed to create a package_manager client");
874 package_manager->handle_id = package_manager_new_id();
876 *manager = package_manager;
878 return PACKAGE_MANAGER_ERROR_NONE;
881 static int package_manager_validate_handle(package_manager_h manager)
883 if (manager == NULL || manager->pc == NULL)
884 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
886 return PACKAGE_MANAGER_ERROR_NONE;
889 API int package_manager_destroy(package_manager_h manager)
891 if (package_manager_validate_handle(manager)) {
893 package_manager_error
894 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
898 pkgmgr_client_free(manager->pc);
900 __clean_all_event_info(manager->head);
903 return PACKAGE_MANAGER_ERROR_NONE;
906 static int __add_event(event_info **head, int req_id,
907 package_manager_event_type_e event_type,
908 package_manager_event_state_e event_state)
910 event_info *evt_info;
912 evt_info = (event_info *) calloc(1, sizeof(event_info));
913 if (evt_info == NULL) {
914 _LOGD("calloc failed");
917 evt_info->req_id = req_id;
918 evt_info->event_type = event_type;
919 evt_info->event_state = event_state;
920 evt_info->next = NULL;
927 static int __find_event(event_info **head, int req_id,
928 package_manager_event_type_e *event_type,
929 package_manager_event_state_e *event_state)
936 _LOGE("tmp is NULL");
940 *event_type = tmp->event_type;
941 *event_state = tmp->event_state;
945 static int __update_event(event_info **head, int req_id,
946 package_manager_event_type_e event_type,
947 package_manager_event_state_e event_state)
949 package_manager_event_type_e evt_type;
950 package_manager_event_state_e evt_state;
953 if (__find_event_info(head, req_id, &evt_type, &evt_state) != 0)
954 __add_event_info(head, req_id, event_type, event_state);
959 _LOGE("tmp is NULL");
963 tmp->event_type = event_type;
964 tmp->event_state = event_state;
971 /* App Event Listening Policy:
972 * +----------------+------------+---------------+------------------+
973 * |Listener \ Type |Global Event|My User's Event|Other user's Event|
974 * +----------------+------------+---------------+------------------+
975 * |User Process App| Grant | Grant | Deny |
976 * +----------------+------------+---------------+------------------+
977 * |Platform module | Grant | Grant | Grant |
978 * +----------------+------------+---------------+------------------+
979 * UID assignment policy:
980 * https://wiki.tizen.org/wiki/Security/User_and_group_ID_assignment_policy
982 #define REGULAR_USER 5000
983 static int __validate_event_signal(uid_t target_uid)
985 uid_t self = getuid();
987 if (self == target_uid)
990 if (self < REGULAR_USER)
996 static int global_event_handler(uid_t target_uid, int req_id, const char *pkg_type,
997 const char *pkg_name, const char *key,
998 const char *val, const void *pmsg, void *data)
1001 package_manager_event_type_e event_type = -1;
1002 package_manager_event_state_e event_state = -1;
1003 uid_t uid = target_uid;
1005 package_manager_h manager = data;
1007 if (target_uid == GLOBAL_USER)
1010 if (__validate_event_signal(uid))
1011 return PACKAGE_MANAGER_ERROR_NONE;
1013 if (strcasecmp(key, "start") == 0) {
1014 ret = package_manager_get_event_type(val, &event_type);
1015 if (ret != PACKAGE_MANAGER_ERROR_NONE)
1016 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
1018 __add_event(&(manager->head), req_id, event_type,
1019 PACKAGE_MANAGER_EVENT_STATE_STARTED);
1021 if (manager->event_cb && getuid() == uid)
1022 manager->event_cb(pkg_type, pkg_name,
1024 PACKAGE_MANAGER_EVENT_STATE_STARTED,
1025 0, PACKAGE_MANAGER_ERROR_NONE, manager->user_data);
1026 } else if (strcasecmp(key, "install_percent") == 0
1027 || strcasecmp(key, "progress_percent") == 0) {
1029 (&(manager->head), req_id, &event_type,
1030 &event_state) == 0) {
1031 __update_event(&(manager->head), req_id,
1033 PACKAGE_MANAGER_EVENT_STATE_PROCESSING);
1034 if (manager->event_cb && getuid() == uid)
1035 manager->event_cb(pkg_type, pkg_name,
1037 PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
1039 PACKAGE_MANAGER_ERROR_NONE,
1040 manager->user_data);
1043 } else if (strcasecmp(key, "error") == 0) {
1044 if (strcasecmp(key, "0") != 0) {
1046 (&(manager->head), req_id, &event_type,
1047 &event_state) == 0) {
1048 __update_event(&(manager->head), req_id,
1050 PACKAGE_MANAGER_EVENT_STATE_FAILED);
1053 if (manager->event_cb && getuid() == uid)
1054 manager->event_cb(pkg_type,
1055 pkg_name, event_type,
1056 PACKAGE_MANAGER_EVENT_STATE_FAILED,
1058 PACKAGE_MANAGER_ERROR_NONE,
1059 manager->user_data);
1061 } else if (strcasecmp(key, "end") == 0) {
1063 (&(manager->head), req_id, &event_type,
1064 &event_state) == 0) {
1065 if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
1066 if (manager->event_cb && getuid() == uid)
1067 manager->event_cb(pkg_type,
1068 pkg_name, event_type,
1069 PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
1071 PACKAGE_MANAGER_ERROR_NONE,
1072 manager->user_data);
1075 if (strcasecmp(key, "ok") != 0) {
1076 if (manager->event_cb && getuid() == uid)
1077 manager->event_cb(pkg_type,
1078 pkg_name, event_type,
1079 PACKAGE_MANAGER_EVENT_STATE_FAILED,
1081 PACKAGE_MANAGER_ERROR_NONE,
1082 manager->user_data);
1087 return PACKAGE_MANAGER_ERROR_NONE;
1090 static int __convert_status_type(package_manager_status_type_e status_type)
1094 if (status_type == PACKAGE_MANAGER_STATUS_TYPE_ALL)
1095 return PKGMGR_CLIENT_STATUS_ALL;
1097 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_INSTALL)
1098 type |= PKGMGR_CLIENT_STATUS_INSTALL;
1099 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_UNINSTALL)
1100 type |= PKGMGR_CLIENT_STATUS_UNINSTALL;
1101 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_UPGRADE)
1102 type |= PKGMGR_CLIENT_STATUS_UPGRADE;
1103 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_MOVE)
1104 type |= PKGMGR_CLIENT_STATUS_MOVE;
1105 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_CLEAR_DATA)
1106 type |= PKGMGR_CLIENT_STATUS_CLEAR_DATA;
1107 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_INSTALL_PROGRESS)
1108 type |= PKGMGR_CLIENT_STATUS_INSTALL_PROGRESS;
1109 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_GET_SIZE)
1110 type |= PKGMGR_CLIENT_STATUS_GET_SIZE;
1115 API int package_manager_set_event_status(package_manager_h manager, int status_type)
1119 int type_all = PACKAGE_MANAGER_STATUS_TYPE_INSTALL |
1120 PACKAGE_MANAGER_STATUS_TYPE_UNINSTALL |
1121 PACKAGE_MANAGER_STATUS_TYPE_UPGRADE |
1122 PACKAGE_MANAGER_STATUS_TYPE_MOVE |
1123 PACKAGE_MANAGER_STATUS_TYPE_CLEAR_DATA |
1124 PACKAGE_MANAGER_STATUS_TYPE_INSTALL_PROGRESS |
1125 PACKAGE_MANAGER_STATUS_TYPE_GET_SIZE;
1127 if (manager == NULL)
1128 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1130 if (status_type < 0 || status_type > type_all)
1131 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1133 type = __convert_status_type(status_type);
1134 retval = pkgmgr_client_set_status_type(manager->pc, type);
1137 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1139 return PACKAGE_MANAGER_ERROR_NONE;
1142 API int package_manager_set_event_cb(package_manager_h manager,
1143 package_manager_event_cb callback,
1148 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1149 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1152 if (package_manager_validate_handle(manager)) {
1154 package_manager_error
1155 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1159 manager->event_cb = callback;
1160 manager->user_data = user_data;
1162 pkgmgr_client_listen_status(manager->pc, global_event_handler, manager);
1164 return PACKAGE_MANAGER_ERROR_NONE;
1167 API int package_manager_unset_event_cb(package_manager_h manager)
1169 if (manager == NULL) {
1171 package_manager_error
1172 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1177 manager->event_cb = NULL;
1178 manager->user_data = NULL;
1180 retval = pkgmgr_client_remove_listen_status(manager->pc);
1181 if (retval == PKGMGR_R_EINVAL)
1183 package_manager_error
1184 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1186 else if (retval == PKGMGR_R_ERROR)
1188 package_manager_error
1189 (PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__,
1192 return PACKAGE_MANAGER_ERROR_NONE;
1195 API int package_manager_get_package_id_by_app_id(const char *app_id, char **package_id)
1197 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo;
1199 char *pkg_id = NULL;
1200 char *pkg_id_dup = NULL;
1202 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1203 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1206 if (app_id == NULL || package_id == NULL)
1207 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1209 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1210 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1211 retval = pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id);
1212 if (retval != PMINFO_R_OK)
1213 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1215 pkg_id_dup = strdup(pkg_id);
1216 if (pkg_id_dup == NULL) {
1217 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1218 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1221 *package_id = pkg_id_dup;
1223 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1225 return PACKAGE_MANAGER_ERROR_NONE;
1228 API int package_manager_get_package_info(const char *package_id, package_info_h *package_info)
1231 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1232 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1235 retval = package_info_get_package_info(package_id, package_info);
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_foreach_package_info(package_manager_package_info_cb callback,
1248 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1249 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1252 retval = package_info_foreach_package_info(callback, user_data);
1254 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1255 return package_manager_error(retval, __FUNCTION__, NULL);
1257 return PACKAGE_MANAGER_ERROR_NONE;
1260 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)
1262 pkgmgrinfo_cert_compare_result_type_e result;
1264 if (lhs_package_id == NULL || rhs_package_id == NULL || compare_result == NULL)
1265 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1266 if (pkgmgrinfo_pkginfo_compare_pkg_cert_info(lhs_package_id, rhs_package_id, &result) != PKGMGR_R_OK)
1267 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1268 *compare_result = (package_manager_compare_result_type_e)result;
1270 return PACKAGE_MANAGER_ERROR_NONE;
1273 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)
1275 pkgmgrinfo_cert_compare_result_type_e result;
1277 if (lhs_app_id == NULL || rhs_app_id == NULL || compare_result == NULL)
1278 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1279 if (pkgmgrinfo_pkginfo_compare_app_cert_info(lhs_app_id, rhs_app_id, &result) != PKGMGR_R_OK)
1280 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1282 *compare_result = (package_manager_compare_result_type_e)result;
1284 return PACKAGE_MANAGER_ERROR_NONE;
1287 API int package_manager_is_preload_package_by_app_id(const char *app_id, bool *preload)
1291 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1292 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1295 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo = NULL;
1296 pkgmgrinfo_pkginfo_h pkgmgrinfo_pkginfo = NULL;
1298 char *pkg_id = NULL;
1299 bool is_preload = 0;
1300 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1301 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1303 retval = pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id);
1304 if (retval != PMINFO_R_OK) {
1305 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1306 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1308 if (pkgmgrinfo_pkginfo_get_pkginfo(pkg_id, &pkgmgrinfo_pkginfo) != PMINFO_R_OK) {
1309 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1310 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1311 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1313 if (pkgmgrinfo_pkginfo_is_preload(pkgmgrinfo_pkginfo, &is_preload) != PMINFO_R_OK) {
1314 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1315 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1316 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1324 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1325 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1327 return PACKAGE_MANAGER_ERROR_NONE;
1330 API int package_manager_get_permission_type(const char *app_id, package_manager_permission_type_e *permission_type)
1334 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1335 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1338 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo = NULL;
1339 pkgmgrinfo_permission_type permission = 0;
1340 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1341 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1342 retval = pkgmgrinfo_appinfo_get_permission_type(pkgmgrinfo_appinfo, &permission);
1343 if (retval != PMINFO_R_OK)
1344 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1346 if (permission == PMINFO_PERMISSION_NORMAL)
1347 *permission_type = PACKAGE_MANAGER_PERMISSION_NORMAL;
1348 else if (permission == PMINFO_PERMISSION_SIGNATURE)
1349 *permission_type = PACKAGE_MANAGER_PERMISSION_SIGNATURE;
1350 else if (permission == PMINFO_PERMISSION_PRIVILEGE)
1351 *permission_type = PACKAGE_MANAGER_PERMISSION_PRIVILEGE;
1353 *permission_type = PACKAGE_MANAGER_PERMISSION_NORMAL;
1355 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1356 return PACKAGE_MANAGER_ERROR_NONE;
1359 API int package_manager_clear_cache_dir(const char *package_id)
1363 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_CACHE);
1364 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1367 int res = pkgmgr_client_clear_cache_dir(package_id);
1368 if (res == PKGMGR_R_EINVAL) {
1369 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1370 } else if (res == PKGMGR_R_ENOPKG) {
1371 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1372 } else if (res == PKGMGR_R_ENOMEM) {
1373 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1374 } else if (res == PKGMGR_R_EIO) {
1375 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1376 } else if (res == PKGMGR_R_EPRIV) {
1377 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
1378 } else if (res == PKGMGR_R_ESYSTEM || res == PKGMGR_R_ECOMM || res == PKGMGR_R_ERROR) {
1379 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1380 } else if (res != PKGMGR_R_OK) {
1381 _LOGE("Unexpected error");
1382 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1385 return PACKAGE_MANAGER_ERROR_NONE;
1388 API int package_manager_clear_data_dir(const char *package_id)
1391 pkgmgr_client *pc = NULL;
1392 char *pkg_type = NULL;
1393 pkgmgrinfo_pkginfo_h pkginfo = NULL;
1395 if (package_id == NULL)
1396 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
1398 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
1399 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1402 retval = pkgmgrinfo_pkginfo_get_pkginfo(package_id, &pkginfo);
1403 if (retval == PMINFO_R_ENOENT)
1404 return PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE;
1405 else if (retval != PMINFO_R_OK || pkginfo == NULL)
1406 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
1408 retval = pkgmgrinfo_pkginfo_get_type(pkginfo, &pkg_type);
1409 if (retval != PMINFO_R_OK || pkg_type == NULL) {
1410 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
1411 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
1414 pc = pkgmgr_client_new(PC_REQUEST);
1416 _LOGE("Out of memory");
1417 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
1418 return PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY;
1421 retval = pkgmgr_client_clear_user_data(pc, pkg_type, package_id, PM_QUIET);
1422 pkgmgr_client_free(pc);
1423 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
1425 if (retval == PKGMGR_R_EINVAL) {
1426 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1427 } else if (retval == PKGMGR_R_ENOPKG) {
1428 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1429 } else if (retval == PKGMGR_R_ENOMEM) {
1430 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1431 } else if (retval == PKGMGR_R_EIO) {
1432 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1433 } else if (retval == PKGMGR_R_EPRIV) {
1434 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
1435 } else if (retval == PKGMGR_R_ESYSTEM || retval == PKGMGR_R_ECOMM || retval == PKGMGR_R_ERROR) {
1436 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1437 } else if (retval != PKGMGR_R_OK) {
1438 _LOGE("Unexpected error");
1439 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1442 return PACKAGE_MANAGER_ERROR_NONE;
1445 API int package_manager_clear_all_cache_dir(void)
1449 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
1450 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1453 return package_manager_clear_cache_dir(PKG_CLEAR_ALL_CACHE);
1456 static void __free_client(gpointer data)
1458 pkgmgr_client *pc = (pkgmgr_client *)data;
1459 pkgmgr_client_free(pc);
1462 static void __initialize_cb_table(void)
1464 __cb_table = g_hash_table_new_full(g_direct_hash, g_direct_equal, __free_client, NULL);
1467 static void __result_cb(pkgmgr_client *pc, const char *pkgid, const pkg_size_info_t *result, void *user_data)
1469 package_manager_size_info_receive_cb callback = g_hash_table_lookup(__cb_table, pc);
1470 if (callback == NULL) {
1471 _LOGE("callback is null.");
1472 g_hash_table_remove(__cb_table, pc);
1476 package_size_info_t size_info;
1477 size_info.data_size = result->data_size;
1478 size_info.cache_size = result->cache_size;
1479 size_info.app_size = result->app_size;
1480 size_info.external_data_size = result->ext_data_size;
1481 size_info.external_cache_size = result->ext_cache_size;
1482 size_info.external_app_size = result->ext_app_size;
1484 callback(pkgid, (package_size_info_h)&size_info, user_data);
1486 g_hash_table_remove(__cb_table, pc);
1489 static void __total_result_cb(pkgmgr_client *pc, const pkg_size_info_t *result, void *user_data)
1491 package_manager_total_size_info_receive_cb callback = g_hash_table_lookup(__cb_table, pc);
1492 if (callback == NULL) {
1493 _LOGE("callback is null.");
1494 g_hash_table_remove(__cb_table, pc);
1498 package_size_info_t size_info;
1499 size_info.data_size = result->data_size;
1500 size_info.cache_size = result->cache_size;
1501 size_info.app_size = result->app_size;
1502 size_info.external_data_size = result->ext_data_size;
1503 size_info.external_cache_size = result->ext_cache_size;
1504 size_info.external_app_size = result->ext_app_size;
1506 callback((package_size_info_h)&size_info, user_data);
1508 g_hash_table_remove(__cb_table, pc);
1511 static int _get_pkg_size_info(const char *package_id, void *callback, void *user_data)
1513 if (package_id == NULL || callback == NULL)
1514 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1516 if (__cb_table == NULL)
1517 __initialize_cb_table();
1519 pkgmgr_client *pc = pkgmgr_client_new(PC_REQUEST);
1521 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1524 if (strcmp(package_id, PKG_SIZE_INFO_TOTAL) != 0)
1525 res = pkgmgr_client_get_package_size_info(pc, package_id, __result_cb, user_data);
1527 res = pkgmgr_client_get_total_package_size_info(pc, __total_result_cb, user_data);
1529 if (res == PKGMGR_R_EINVAL) {
1530 pkgmgr_client_free(pc);
1531 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1532 } else if (res == PKGMGR_R_ENOPKG) {
1533 pkgmgr_client_free(pc);
1534 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1535 } else if (res == PKGMGR_R_ENOMEM) {
1536 pkgmgr_client_free(pc);
1537 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1538 } else if (res == PKGMGR_R_EIO) {
1539 pkgmgr_client_free(pc);
1540 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1541 } else if (res == PKGMGR_R_EPRIV) {
1542 pkgmgr_client_free(pc);
1543 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
1544 } else if (res == PKGMGR_R_ESYSTEM || res == PKGMGR_R_ECOMM || res == PKGMGR_R_ERROR) {
1545 pkgmgr_client_free(pc);
1546 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1547 } else if (res != PKGMGR_R_OK) {
1548 _LOGE("Unexpected error");
1549 pkgmgr_client_free(pc);
1550 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1553 g_hash_table_insert(__cb_table, pc, callback);
1555 return PACKAGE_MANAGER_ERROR_NONE;
1558 API int package_manager_get_package_size_info(const char *package_id, package_manager_size_info_receive_cb callback, void *user_data)
1560 return _get_pkg_size_info(package_id, (void *)callback, user_data);
1563 API int package_manager_get_total_package_size_info(package_manager_total_size_info_receive_cb callback, void *user_data)
1565 return _get_pkg_size_info(PKG_SIZE_INFO_TOTAL, (void *)callback, user_data);
1568 API int package_manager_filter_create(package_manager_filter_h *handle)
1571 pkgmgrinfo_pkginfo_filter_h pkgmgr_filter = NULL;
1573 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1574 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1577 if (handle == NULL) {
1579 package_manager_error
1580 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1584 retval = pkgmgrinfo_pkginfo_filter_create(&pkgmgr_filter);
1585 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1586 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1588 *handle = pkgmgr_filter;
1590 return PACKAGE_MANAGER_ERROR_NONE;
1593 API int package_manager_filter_destroy(package_manager_filter_h handle)
1597 if (handle == NULL) {
1599 package_manager_error
1600 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1604 retval = pkgmgrinfo_pkginfo_filter_destroy(handle);
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_add_bool(package_manager_filter_h handle,
1612 const char *property, const bool value)
1616 if ((handle == NULL) || (property == NULL)) {
1618 package_manager_error
1619 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1623 retval = pkgmgrinfo_pkginfo_filter_add_bool(handle, property, value);
1624 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1625 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1627 return PACKAGE_MANAGER_ERROR_NONE;
1630 API int package_manager_filter_count(package_manager_filter_h handle, int *count)
1634 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1635 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1638 if ((handle == NULL) || (count == NULL))
1639 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1641 retval = pkgmgrinfo_pkginfo_filter_count(handle, count);
1643 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1645 return PACKAGE_MANAGER_ERROR_NONE;
1648 API int package_manager_filter_foreach_package_info(package_manager_filter_h handle,
1649 package_manager_package_info_cb callback, void *user_data)
1653 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1654 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1657 retval = package_info_filter_foreach_package_info(handle, callback, user_data);
1659 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1660 return package_manager_error(retval, __FUNCTION__, NULL);
1662 return PACKAGE_MANAGER_ERROR_NONE;
1665 API int package_size_info_get_data_size(package_size_info_h handle, long long *data_size)
1668 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1670 package_size_info_t *size_info = (package_size_info_t *)handle;
1672 *data_size = (long long)size_info->data_size;
1673 return PACKAGE_MANAGER_ERROR_NONE;
1676 API int package_size_info_get_cache_size(package_size_info_h handle, long long *cache_size)
1679 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1681 package_size_info_t *size_info = (package_size_info_t *)handle;
1683 *cache_size = size_info->cache_size;
1684 return PACKAGE_MANAGER_ERROR_NONE;
1687 API int package_size_info_get_app_size(package_size_info_h handle, long long *app_size)
1690 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1692 package_size_info_t *size_info = (package_size_info_t *)handle;
1693 *app_size = size_info->app_size;
1694 return PACKAGE_MANAGER_ERROR_NONE;
1697 API int package_size_info_get_external_data_size(package_size_info_h handle, long long *ext_data_size)
1700 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
1702 package_size_info_t *size_info = (package_size_info_t *)handle;
1703 *ext_data_size = size_info->external_data_size;
1704 return PACKAGE_MANAGER_ERROR_NONE;
1707 API int package_size_info_get_external_cache_size(package_size_info_h handle, long long *ext_cache_size)
1710 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1712 package_size_info_t *size_info = (package_size_info_t *)handle;
1713 *ext_cache_size = size_info->external_cache_size;
1714 return PACKAGE_MANAGER_ERROR_NONE;
1717 API int package_size_info_get_external_app_size(package_size_info_h handle, long long *ext_app_size)
1720 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1722 package_size_info_t *size_info = (package_size_info_t *)handle;
1723 *ext_app_size = size_info->external_app_size;
1724 return PACKAGE_MANAGER_ERROR_NONE;
1727 API int package_manager_updateinfo_set_pkgid(package_updateinfo_request_h pkg_updateinfo_req, const char *pkgid)
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->pkgid)
1736 free(request->updateinfo_handle->pkgid);
1737 request->updateinfo_handle->pkgid = strdup(pkgid);
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 API int package_manager_updateinfo_set_version(package_updateinfo_request_h pkg_updateinfo_req, const char *version)
1746 struct package_updateinfo_request_s *request;
1748 if (pkg_updateinfo_req == NULL || pkg_updateinfo_req->updateinfo_handle == NULL)
1749 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1751 request = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1752 if (request->updateinfo_handle->version)
1753 free(request->updateinfo_handle->version);
1754 request->updateinfo_handle->version = strdup(version);
1755 if (request->updateinfo_handle->pkgid == NULL)
1756 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1758 return PACKAGE_MANAGER_ERROR_NONE;
1761 static int package_manager_updateinfo_convert_property(package_updateinfo_type_e property, pkgmgr_updateinfo_type *converted_property)
1763 if (converted_property == NULL)
1766 if (property == PACKAGE_UPDATEINFO_TYPE_FORCE)
1767 *converted_property = PM_UPDATEINFO_TYPE_FORCE;
1768 else if (property == PACKAGE_UPDATEINFO_TYPE_OPTIONAL)
1769 *converted_property = PM_UPDATEINFO_TYPE_OPTIONAL;
1770 else if (property == PACKAGE_UPDATEINFO_TYPE_NONE)
1771 *converted_property = PM_UPDATEINFO_TYPE_NONE;
1778 API int package_manager_updateinfo_set_type(package_updateinfo_request_h pkg_updateinfo_req, package_updateinfo_type_e type)
1781 pkgmgr_updateinfo_type converted_type;
1782 struct package_updateinfo_request_s *request;
1784 if (pkg_updateinfo_req == NULL || pkg_updateinfo_req->updateinfo_handle == NULL)
1785 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1787 request = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1788 retval = package_manager_updateinfo_convert_property(type, &converted_type);
1790 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1792 request->updateinfo_handle->type = converted_type;
1793 return PACKAGE_MANAGER_ERROR_NONE;
1796 API int package_manager_updateinfo_request_destroy(package_updateinfo_request_h pkg_updateinfo_req)
1798 struct package_updateinfo_request_s *request;
1800 if (pkg_updateinfo_req == NULL)
1801 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1803 request = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1805 pkgmgr_client_free(request->pc);
1807 if (request->updateinfo_handle) {
1808 if (request->updateinfo_handle->pkgid)
1809 free(request->updateinfo_handle->pkgid);
1810 if (request->updateinfo_handle->version)
1811 free(request->updateinfo_handle->version);
1812 free(request->updateinfo_handle);
1816 return PACKAGE_MANAGER_ERROR_NONE;
1819 API int package_manager_updateinfo_request_create(package_updateinfo_request_h *pkg_updateinfo_req)
1821 struct package_updateinfo_request_s *request;
1822 pkg_update_info_t *update_info;
1824 if (pkg_updateinfo_req == NULL)
1825 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1827 request = calloc(1, sizeof(struct package_updateinfo_request_s));
1828 if (request == NULL)
1829 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1831 request->pc = pkgmgr_client_new(PC_REQUEST);
1832 if (request->pc == NULL)
1833 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1835 update_info = calloc(1, sizeof(pkg_update_info_t));
1836 if (update_info == NULL) {
1837 pkgmgr_client_free(request->pc);
1838 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1840 request->updateinfo_handle = update_info;
1842 *pkg_updateinfo_req = request;
1843 return PACKAGE_MANAGER_ERROR_NONE;
1846 API int package_manager_updateinfo_request_register(package_updateinfo_request_h pkg_updateinfo_req)
1848 struct package_updateinfo_request_s *update_info;
1851 if (pkg_updateinfo_req == NULL)
1852 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1853 update_info = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1855 retval = pkgmgr_client_register_pkg_update_info(update_info->pc, update_info->updateinfo_handle);
1856 if (retval == PKGMGR_R_EINVAL)
1857 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1859 return PACKAGE_MANAGER_ERROR_NONE;
1862 API int package_manager_updateinfo_request_unregister(package_updateinfo_request_h pkg_updateinfo_req, const char *pkgid)
1865 struct package_updateinfo_request_s *update_info;
1867 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
1868 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1871 if (pkg_updateinfo_req == NULL || pkgid == NULL)
1872 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1874 update_info = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1875 retval = pkgmgr_client_unregister_pkg_update_info(update_info->pc, pkgid);
1876 if (retval != PMINFO_R_OK)
1877 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1879 return PACKAGE_MANAGER_ERROR_NONE;
1882 API int package_manager_updateinfo_request_unregister_all(package_updateinfo_request_h pkg_updateinfo_req)
1885 struct package_updateinfo_request_s *update_info;
1887 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
1888 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1891 if (pkg_updateinfo_req == NULL)
1892 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1894 update_info = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1895 retval = pkgmgr_client_unregister_all_pkg_update_info(update_info->pc);
1897 if (retval != PMINFO_R_OK)
1898 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1900 return PACKAGE_MANAGER_ERROR_NONE;