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 _request_event_info {
35 package_manager_event_type_e event_type;
36 package_manager_event_state_e event_state;
37 struct _request_event_info *next;
40 struct package_manager_event_info {
42 package_manager_event_type_e event_type;
43 package_manager_event_state_e event_state;
46 struct package_manager_s {
48 pkgmgr_client_type ctype;
51 GHashTable *event_info_table;
52 package_manager_event_cb event_cb;
56 struct package_manager_request_s {
58 pkgmgr_client_type ctype;
62 request_event_info *head;
63 package_manager_request_event_cb event_cb;
64 GHashTable *request_cb_table;
68 struct package_manager_request_cb_info {
70 package_manager_request_event_cb callback;
74 typedef struct package_size_info {
79 long long external_data_size;
80 long long external_cache_size;
81 long long external_app_size;
82 } package_size_info_t;
84 struct package_manager_filter_s {
85 pkgmgrinfo_pkginfo_filter_h pkgmgrinfo_pkginfo_filter;
88 struct package_updateinfo_request_s {
90 pkg_update_info_t *updateinfo_handle;
93 static int package_manager_request_new_id()
95 static int request_handle_id = 0;
96 return request_handle_id++;
99 static int package_manager_new_id()
101 static int manager_handle_id = 0;
102 return manager_handle_id++;
105 static void __clean_all_event_info(request_event_info *head)
107 request_event_info *current = head;
108 request_event_info *prev;
115 current = current->next;
120 static int __insert_event_info(package_manager_h manager, const char *pkg_name,
121 package_manager_event_type_e event_type,
122 package_manager_event_state_e event_state)
124 struct package_manager_event_info *info;
126 info = calloc(1, sizeof(struct package_manager_event_info));
129 info->pkg_name = strdup(pkg_name);
130 info->event_type = event_type;
131 info->event_state = event_state;
132 g_hash_table_insert(manager->event_info_table, info->pkg_name, info);
137 static void __free_event_info(gpointer data)
139 struct package_manager_event_info *info =
140 (struct package_manager_event_info *)data;
146 free(info->pkg_name);
149 _LOGD("event_info removed");
152 static void __free_request_cb_info(gpointer data)
155 struct package_manager_request_cb_info *cb_info =
156 (struct package_manager_request_cb_info *)data;
158 req_id = cb_info->req_id;
162 _LOGD("request callback info removed, req_id(%d)", req_id);
165 static void __initialize_request_cb_table(package_manager_request_h request)
167 request->request_cb_table =
168 g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, __free_request_cb_info);
171 static int __insert_request_cb_info(package_manager_request_h request, int req_id,
172 package_manager_request_event_cb callback, void *user_data)
174 struct package_manager_request_cb_info *cb_info;
176 if (request->request_cb_table == NULL)
179 cb_info = calloc(1, sizeof(struct package_manager_request_cb_info));
182 cb_info->req_id = req_id;
183 cb_info->callback = callback;
184 cb_info->user_data = user_data;
185 _LOGD("insert req_id(%d)", req_id);
186 g_hash_table_insert(request->request_cb_table, GINT_TO_POINTER(cb_info->req_id), cb_info);
191 API int package_manager_request_create(package_manager_request_h *request)
193 struct package_manager_request_s *package_manager_request;
195 if (request == NULL) {
197 package_manager_error
198 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
202 package_manager_request =
203 calloc(1, sizeof(struct package_manager_request_s));
204 if (package_manager_request == NULL) {
206 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
208 "failed to create a package_manager handle");
211 package_manager_request->ctype = PC_REQUEST;
212 package_manager_request->pc = pkgmgr_client_new(PC_REQUEST);
213 if (package_manager_request->pc == NULL) {
214 free(package_manager_request);
216 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
218 "failed to create a package_manager client");
221 package_manager_request->handle_id = package_manager_request_new_id();
223 *request = package_manager_request;
225 return PACKAGE_MANAGER_ERROR_NONE;
228 static int package_manager_client_validate_handle(package_manager_request_h
231 if (request == NULL || request->pc == NULL)
232 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
234 return PACKAGE_MANAGER_ERROR_NONE;
237 API int package_manager_request_destroy(package_manager_request_h request)
239 if (package_manager_client_validate_handle(request)) {
241 package_manager_error
242 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
246 pkgmgr_client_free(request->pc);
248 free(request->pkg_type);
249 __clean_all_event_info(request->head);
250 if (request->request_cb_table) {
251 g_hash_table_destroy(request->request_cb_table);
252 request->request_cb_table = NULL;
256 return PACKAGE_MANAGER_ERROR_NONE;
259 static int __reset_user_request_callback(package_manager_request_h request,
260 package_manager_request_event_cb callback, void *user_data)
262 if (package_manager_client_validate_handle(request))
263 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
265 request->event_cb = callback;
266 request->user_data = user_data;
268 return PACKAGE_MANAGER_ERROR_NONE;
271 API int package_manager_request_set_event_cb(package_manager_request_h request,
272 package_manager_request_event_cb
273 callback, void *user_data)
277 if (package_manager_client_validate_handle(request))
278 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER,
281 ret = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
282 if (ret != PACKAGE_MANAGER_ERROR_NONE)
285 return __reset_user_request_callback(request, callback, user_data);
288 API int package_manager_request_unset_event_cb(package_manager_request_h request)
290 if (package_manager_client_validate_handle(request))
291 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
293 request->event_cb = NULL;
294 request->user_data = NULL;
296 return PACKAGE_MANAGER_ERROR_NONE;
299 API int package_manager_request_set_type(package_manager_request_h request,
300 const char *pkg_type)
302 if (package_manager_client_validate_handle(request)) {
304 package_manager_error
305 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
309 if (request->pkg_type)
310 free(request->pkg_type);
311 request->pkg_type = strdup(pkg_type);
313 return PACKAGE_MANAGER_ERROR_NONE;
316 API int package_manager_request_set_mode(package_manager_request_h request,
317 package_manager_request_mode_e mode)
319 if (package_manager_client_validate_handle(request)) {
321 package_manager_error
322 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
326 /* request mode is not used anymore */
328 return PACKAGE_MANAGER_ERROR_NONE;
331 API int package_manager_request_set_tep(package_manager_request_h request,
332 const char *tep_path)
336 if (package_manager_client_validate_handle(request) || tep_path == NULL) {
338 package_manager_error
339 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
343 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
344 if (retval != PACKAGE_MANAGER_ERROR_NONE)
347 if (pkgmgr_client_set_tep_path(request->pc, tep_path, true))
348 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
350 return PACKAGE_MANAGER_ERROR_NONE;
353 static int package_manager_get_event_type(const char *key,
354 package_manager_event_type_e *
358 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
360 if (strcasecmp(key, PKGMGR_INSTALLER_INSTALL_EVENT_STR) == 0)
361 *event_type = PACKAGE_MANAGER_EVENT_TYPE_INSTALL;
362 else if (strcasecmp(key, PKGMGR_INSTALLER_UNINSTALL_EVENT_STR) == 0)
363 *event_type = PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL;
364 else if (strcasecmp(key, PKGMGR_INSTALLER_UPGRADE_EVENT_STR) == 0)
365 *event_type = PACKAGE_MANAGER_EVENT_TYPE_UPDATE;
366 else if (strcasecmp(key, PKGMGR_INSTALLER_MOVE_EVENT_STR) == 0)
367 *event_type = PACKAGE_MANAGER_EVENT_TYPE_MOVE;
368 else if (strcasecmp(key, PKGMGR_INSTALLER_CLEAR_EVENT_STR) == 0)
369 *event_type = PACKAGE_MANAGER_EVENT_TYPE_CLEAR;
371 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
373 return PACKAGE_MANAGER_ERROR_NONE;
376 static int __add_event_info(request_event_info **head, int req_id,
377 package_manager_event_type_e event_type,
378 package_manager_event_state_e event_state)
380 request_event_info *evt_info;
381 request_event_info *current;
382 request_event_info *prev;
384 evt_info = (request_event_info *) calloc(1, sizeof(request_event_info));
385 if (evt_info == NULL) {
386 _LOGD("calloc failed");
389 evt_info->req_id = req_id;
390 evt_info->event_type = event_type;
391 evt_info->event_state = event_state;
392 evt_info->next = NULL;
397 current = prev = *head;
400 current = current->next;
403 prev->next = evt_info;
409 static int __find_event_info(request_event_info **head, int req_id,
410 package_manager_event_type_e *event_type,
411 package_manager_event_state_e *event_state)
413 request_event_info *tmp;
418 _LOGE("tmp is NULL");
423 if (tmp->req_id == req_id) {
424 *event_type = tmp->event_type;
425 *event_state = tmp->event_state;
433 static int __update_event_info(request_event_info **head, int req_id,
434 package_manager_event_type_e event_type,
435 package_manager_event_state_e event_state)
437 package_manager_event_type_e evt_type;
438 package_manager_event_state_e evt_state;
439 request_event_info *tmp;
441 if (__find_event_info(head, req_id, &evt_type, &evt_state) != 0)
442 __add_event_info(head, req_id, event_type, event_state);
447 _LOGE("tmp is NULL");
452 if (tmp->req_id == req_id) {
453 tmp->event_type = event_type;
454 tmp->event_state = event_state;
464 static int request_event_handler(uid_t target_uid, int req_id, const char *pkg_type,
465 const char *pkg_name, const char *key,
466 const char *val, const void *pmsg, void *data)
469 package_manager_event_type_e event_type = -1;
470 package_manager_event_state_e event_state = -1;
472 package_manager_request_h request = data;
474 if (strcasecmp(key, "start") == 0) {
475 ret = package_manager_get_event_type(val, &event_type);
476 if (ret != PACKAGE_MANAGER_ERROR_NONE)
477 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
479 __add_event_info(&(request->head), req_id, event_type,
480 PACKAGE_MANAGER_EVENT_STATE_STARTED);
482 if (request->event_cb)
483 request->event_cb(req_id, pkg_type, pkg_name,
485 PACKAGE_MANAGER_EVENT_STATE_STARTED,
486 0, PACKAGE_MANAGER_ERROR_NONE, request->user_data);
488 } else if (strcasecmp(key, "install_percent") == 0
489 || strcasecmp(key, "progress_percent") == 0) {
490 if (__find_event_info
491 (&(request->head), req_id, &event_type,
492 &event_state) == 0) {
493 __update_event_info(&(request->head), req_id,
495 PACKAGE_MANAGER_EVENT_STATE_PROCESSING);
496 if (request->event_cb)
497 request->event_cb(req_id, pkg_type, pkg_name,
499 PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
501 PACKAGE_MANAGER_ERROR_NONE,
505 } else if (strcasecmp(key, "error") == 0) {
506 if (__find_event_info
507 (&(request->head), req_id, &event_type,
508 &event_state) == 0) {
509 __update_event_info(&(request->head), req_id,
511 PACKAGE_MANAGER_EVENT_STATE_FAILED);
514 if (request->event_cb)
515 request->event_cb(req_id, pkg_type,
516 pkg_name, event_type,
517 PACKAGE_MANAGER_EVENT_STATE_FAILED,
519 PACKAGE_MANAGER_ERROR_NONE,
522 } else if (strcasecmp(key, "end") == 0) {
523 if (__find_event_info
524 (&(request->head), req_id, &event_type,
525 &event_state) == 0) {
526 if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
527 if (request->event_cb)
528 request->event_cb(req_id, pkg_type,
529 pkg_name, event_type,
530 PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
532 PACKAGE_MANAGER_ERROR_NONE,
536 if (strcasecmp(key, "ok") != 0)
537 if (request->event_cb)
538 request->event_cb(req_id, pkg_type,
539 pkg_name, event_type,
540 PACKAGE_MANAGER_EVENT_STATE_FAILED,
542 PACKAGE_MANAGER_ERROR_NONE,
547 return PACKAGE_MANAGER_ERROR_NONE;
550 static int internal_request_callback(uid_t target_uid, int req_id, const char *pkg_type,
551 const char *pkg_name, const char *key,
552 const char *val, const void *pmsg, void *data)
555 package_manager_event_type_e event_type = -1;
556 package_manager_event_state_e event_state = -1;
557 struct package_manager_request_cb_info *cb_info;
558 package_manager_request_event_cb event_cb;
559 void *user_data = NULL;
561 _LOGD("request callback called, req_id[%d]", req_id);
563 package_manager_request_h request = data;
565 if (request->request_cb_table)
566 cb_info = g_hash_table_lookup(request->request_cb_table,
567 GINT_TO_POINTER(req_id));
571 if (!cb_info || (cb_info && !cb_info->callback)) {
572 _LOGE("no callback info");
576 if (cb_info->req_id != req_id) {
577 _LOGE("not matched request id");
581 event_cb = cb_info->callback;
582 user_data = cb_info->user_data;
584 if (strcasecmp(key, "start") == 0) {
585 ret = package_manager_get_event_type(val, &event_type);
586 if (ret != PACKAGE_MANAGER_ERROR_NONE)
587 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
589 __add_event_info(&request->head, req_id, event_type,
590 PACKAGE_MANAGER_EVENT_STATE_STARTED);
592 event_cb(req_id, pkg_type, pkg_name,
594 PACKAGE_MANAGER_EVENT_STATE_STARTED,
595 0, PACKAGE_MANAGER_ERROR_NONE, user_data);
596 } else if (strcasecmp(key, "install_percent") == 0) {
597 if (__find_event_info(&request->head, req_id, &event_type,
598 &event_state) == 0) {
599 __update_event_info(&request->head, req_id,
601 PACKAGE_MANAGER_EVENT_STATE_PROCESSING);
602 event_cb(req_id, pkg_type, pkg_name,
604 PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
606 PACKAGE_MANAGER_ERROR_NONE,
609 } else if (strcasecmp(key, "error") == 0) {
610 if (__find_event_info(&request->head, req_id, &event_type,
611 &event_state) == 0) {
612 __update_event_info(&request->head, req_id,
614 PACKAGE_MANAGER_EVENT_STATE_FAILED);
615 event_cb(req_id, pkg_type,
616 pkg_name, event_type,
617 PACKAGE_MANAGER_EVENT_STATE_FAILED,
619 PACKAGE_MANAGER_ERROR_NONE,
622 } else if (strcasecmp(key, "end") == 0) {
623 if (__find_event_info(&request->head, req_id, &event_type,
624 &event_state) == 0) {
625 if (request->request_cb_table) {
626 _LOGD("remove item, req_id(%d)", req_id);
627 g_hash_table_remove(request->request_cb_table,
628 GINT_TO_POINTER(req_id));
630 if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
631 if (strcasecmp(val, "ok") == 0) {
632 event_cb(req_id, pkg_type,
633 pkg_name, event_type,
634 PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
636 PACKAGE_MANAGER_ERROR_NONE,
639 event_cb(req_id, pkg_type,
640 pkg_name, event_type,
641 PACKAGE_MANAGER_EVENT_STATE_FAILED,
643 PACKAGE_MANAGER_ERROR_NONE,
648 _LOGE("unexpected end event");
655 static int __request_install(package_manager_request_h request,
656 const char *path, pkgmgr_handler event_cb, int *id)
659 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
660 if (retval != PACKAGE_MANAGER_ERROR_NONE)
663 if (package_manager_client_validate_handle(request))
664 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
667 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
670 request_id = pkgmgr_client_install(request->pc, request->pkg_type, NULL,
671 path, NULL, request->mode, event_cb ? event_cb : request_event_handler, request);
673 if (request_id == PKGMGR_R_EINVAL)
674 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
675 else if (request_id == PKGMGR_R_ENOPKG)
676 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
677 else if (request_id == PKGMGR_R_ENOMEM)
678 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
679 else if (request_id == PKGMGR_R_EIO)
680 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
681 else if (request_id == PKGMGR_R_EPRIV)
682 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
683 else if (request_id == PKGMGR_R_ESYSTEM || request_id == PKGMGR_R_ECOMM || request_id == PKGMGR_R_ERROR)
684 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
689 return PACKAGE_MANAGER_ERROR_NONE;
692 static int __request_uninstall(package_manager_request_h request,
693 const char *name, pkgmgr_handler event_cb, int *id)
696 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
697 if (retval != PACKAGE_MANAGER_ERROR_NONE)
700 if (package_manager_client_validate_handle(request))
701 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
704 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
707 request_id = pkgmgr_client_uninstall(request->pc, request->pkg_type,
708 name, request->mode, event_cb ? event_cb : request_event_handler, request);
710 if (request_id == PKGMGR_R_EINVAL)
711 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
712 else if (request_id == PKGMGR_R_ENOPKG)
713 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
714 else if (request_id == PKGMGR_R_ENOMEM)
715 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
716 else if (request_id == PKGMGR_R_EIO)
717 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
718 else if (request_id == PKGMGR_R_EPRIV)
719 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
720 else if (request_id == PKGMGR_R_ESYSTEM || request_id == PKGMGR_R_ECOMM || request_id == PKGMGR_R_ERROR)
721 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
726 return PACKAGE_MANAGER_ERROR_NONE;
729 static int __request_move(package_manager_request_h request,
730 const char *name, package_manager_move_type_e move_type,
731 pkgmgr_handler event_cb, int *id)
734 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
735 if (retval != PACKAGE_MANAGER_ERROR_NONE)
738 if (package_manager_client_validate_handle(request))
739 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
742 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
745 request_id = pkgmgr_client_request_service(PM_REQUEST_MOVE, move_type,
746 request->pc, request->pkg_type, name,
747 NULL, event_cb ? event_cb : request_event_handler, request);
749 if (request_id == PKGMGR_R_EINVAL)
750 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
751 else if (request_id == PKGMGR_R_ENOPKG)
752 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
753 else if (request_id == PKGMGR_R_ENOMEM)
754 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
755 else if (request_id == PKGMGR_R_EIO)
756 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
757 else if (request_id == PKGMGR_R_EPRIV)
758 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
759 else if (request_id == PKGMGR_R_ESYSTEM || request_id == PKGMGR_R_ECOMM || request_id == PKGMGR_R_ERROR)
760 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
765 return PACKAGE_MANAGER_ERROR_NONE;
768 static int __request_mount_install(package_manager_request_h request,
769 const char *path, pkgmgr_handler event_cb, int *id)
772 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
773 if (retval != PACKAGE_MANAGER_ERROR_NONE)
776 if (package_manager_client_validate_handle(request))
777 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
780 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
783 request_id = pkgmgr_client_mount_install(request->pc, request->pkg_type, NULL,
784 path, NULL, request->mode, event_cb ? event_cb : request_event_handler, request);
786 if (request_id == PKGMGR_R_EINVAL)
787 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
788 else if (request_id == PKGMGR_R_ENOPKG)
789 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
790 else if (request_id == PKGMGR_R_ENOMEM)
791 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
792 else if (request_id == PKGMGR_R_EIO)
793 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
794 else if (request_id == PKGMGR_R_EPRIV)
795 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
796 else if (request_id == PKGMGR_R_ESYSTEM || request_id == PKGMGR_R_ECOMM || request_id == PKGMGR_R_ERROR)
797 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
802 return PACKAGE_MANAGER_ERROR_NONE;
806 API int package_manager_request_install(package_manager_request_h request,
807 const char *path, int *id)
809 return __request_install(request, path, NULL, id);
812 API int package_manager_request_install_with_cb(package_manager_request_h request,
813 const char *path, package_manager_request_event_cb callback,
814 void *user_data, int *id)
819 if (request->request_cb_table == NULL)
820 __initialize_request_cb_table(request);
822 ret = __request_install(request, path, internal_request_callback, &req_id);
825 ret = __insert_request_cb_info(request, req_id, callback, user_data);
827 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
828 __FUNCTION__, "failed to create request cb info");
836 API int package_manager_request_uninstall(package_manager_request_h request,
837 const char *name, int *id)
839 return __request_uninstall(request, name, NULL, id);
842 API int package_manager_request_uninstall_with_cb(package_manager_request_h request,
843 const char *name, package_manager_request_event_cb callback,
844 void *user_data, int *id)
849 if (request->request_cb_table == NULL)
850 __initialize_request_cb_table(request);
852 ret = __request_uninstall(request, name, internal_request_callback, &req_id);
855 ret = __insert_request_cb_info(request, req_id, callback, user_data);
857 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
858 __FUNCTION__, "failed to create request cb info");
866 API int package_manager_request_move(package_manager_request_h request,
867 const char *name, package_manager_move_type_e move_type)
869 return __request_move(request, name, move_type, NULL, NULL);
872 API int package_manager_request_move_with_cb(package_manager_request_h request,
873 const char *name, package_manager_move_type_e move_type,
874 package_manager_request_event_cb callback, void *user_data, int *id)
879 if (request->request_cb_table == NULL)
880 __initialize_request_cb_table(request);
882 ret = __request_move(request, name, move_type, internal_request_callback, &req_id);
885 ret = __insert_request_cb_info(request, req_id, callback, user_data);
887 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
888 __FUNCTION__, "failed to create request cb info");
896 API int package_manager_request_mount_install(package_manager_request_h request,
897 const char *path, int *id)
899 return __request_mount_install(request, path, NULL, id);
902 API int package_manager_request_mount_install_with_cb(package_manager_request_h request,
903 const char *path, package_manager_request_event_cb callback,
904 void *user_data, int *id)
909 if (request->request_cb_table == NULL)
910 __initialize_request_cb_table(request);
912 ret = __request_mount_install(request, path, internal_request_callback, &req_id);
915 ret = __insert_request_cb_info(request, req_id, callback, user_data);
917 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
918 __FUNCTION__, "failed to create request cb info");
926 API int package_manager_create(package_manager_h *manager)
929 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
930 if (retval != PACKAGE_MANAGER_ERROR_NONE)
933 struct package_manager_s *package_manager = NULL;
935 if (manager == NULL) {
937 package_manager_error
938 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
942 package_manager = calloc(1, sizeof(struct package_manager_s));
943 if (package_manager == NULL) {
945 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
947 "failed to create a package_manager handle");
950 package_manager->ctype = PC_LISTENING;
951 package_manager->pc = pkgmgr_client_new(PC_LISTENING);
952 if (package_manager->pc == NULL) {
953 free(package_manager);
955 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
957 "failed to create a package_manager client");
960 package_manager->handle_id = package_manager_new_id();
962 *manager = package_manager;
964 return PACKAGE_MANAGER_ERROR_NONE;
967 static int package_manager_validate_handle(package_manager_h manager)
969 if (manager == NULL || manager->pc == NULL)
970 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
972 return PACKAGE_MANAGER_ERROR_NONE;
975 API int package_manager_destroy(package_manager_h manager)
977 if (package_manager_validate_handle(manager)) {
979 package_manager_error
980 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
984 pkgmgr_client_free(manager->pc);
985 g_hash_table_destroy(manager->event_info_table);
988 return PACKAGE_MANAGER_ERROR_NONE;
991 /* App Event Listening Policy:
992 * +----------------+------------+---------------+------------------+
993 * |Listener \ Type |Global Event|My User's Event|Other user's Event|
994 * +----------------+------------+---------------+------------------+
995 * |User Process App| Grant | Grant | Deny |
996 * +----------------+------------+---------------+------------------+
997 * |Platform module | Grant | Grant | Grant |
998 * +----------------+------------+---------------+------------------+
999 * UID assignment policy:
1000 * https://wiki.tizen.org/wiki/Security/User_and_group_ID_assignment_policy
1002 #define REGULAR_USER 5000
1003 static int __validate_event_signal(uid_t target_uid)
1005 uid_t self = getuid();
1007 if (self == target_uid)
1010 if (self < REGULAR_USER)
1016 static int internal_callback(uid_t target_uid, int req_id, const char *pkg_type,
1017 const char *pkg_name, const char *key,
1018 const char *val, const void *pmsg, void *data)
1021 package_manager_event_type_e event_type = -1;
1022 struct package_manager_event_info *info = NULL;
1023 package_manager_h manager = data;
1024 uid_t uid = target_uid;
1026 _LOGD("req_id(%d), pkg_name(%s), type(%s), key(%s), val(%s)",
1027 req_id, pkg_name, pkg_type, key, val);
1029 if (target_uid == GLOBAL_USER)
1032 if (__validate_event_signal(uid))
1033 return PACKAGE_MANAGER_ERROR_NONE;
1035 if (manager && manager->event_info_table) {
1036 info = g_hash_table_lookup(manager->event_info_table, pkg_name);
1038 _LOGE("invalid handle");
1039 return PACKAGE_MANAGER_ERROR_NONE;
1043 if (strcasecmp(key, "start") != 0) {
1044 _LOGD("unexpected signal or no info(removed)");
1045 return PACKAGE_MANAGER_ERROR_NONE;
1049 if (strcasecmp(key, "start") == 0) {
1050 ret = package_manager_get_event_type(val, &event_type);
1051 if (ret != PACKAGE_MANAGER_ERROR_NONE)
1052 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
1055 __insert_event_info(manager, pkg_name, event_type,
1056 PACKAGE_MANAGER_EVENT_STATE_STARTED);
1058 if (manager->event_cb && getuid() == uid)
1059 manager->event_cb(pkg_type, pkg_name,
1061 PACKAGE_MANAGER_EVENT_STATE_STARTED,
1063 PACKAGE_MANAGER_ERROR_NONE,
1064 manager->user_data);
1066 _LOGE("unexpected start event");
1068 } else if (strcasecmp(key, "install_percent") == 0
1069 || strcasecmp(key, "progress_percent") == 0) {
1070 info->event_state = PACKAGE_MANAGER_EVENT_STATE_PROCESSING;
1071 if (manager->event_cb && getuid() == uid)
1072 manager->event_cb(pkg_type, pkg_name,
1076 PACKAGE_MANAGER_ERROR_NONE,
1077 manager->user_data);
1078 } else if (strcasecmp(key, "error") == 0) {
1079 info->event_state = PACKAGE_MANAGER_EVENT_STATE_FAILED;
1080 if (manager->event_cb && getuid() == uid)
1081 manager->event_cb(pkg_type, pkg_name,
1085 PACKAGE_MANAGER_ERROR_NONE,
1086 manager->user_data);
1087 } else if (strcasecmp(key, "end") == 0) {
1088 if (info->event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
1089 if (manager->event_cb && getuid() == uid) {
1090 if (strcasecmp(val, "ok") == 0) {
1091 manager->event_cb(pkg_type, pkg_name,
1093 PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
1095 PACKAGE_MANAGER_ERROR_NONE,
1096 manager->user_data);
1098 manager->event_cb(pkg_type, pkg_name,
1100 PACKAGE_MANAGER_EVENT_STATE_FAILED,
1102 PACKAGE_MANAGER_ERROR_NONE,
1103 manager->user_data);
1107 g_hash_table_remove(manager->event_info_table, info->pkg_name);
1110 return PACKAGE_MANAGER_ERROR_NONE;
1113 static int __convert_status_type(package_manager_status_type_e status_type)
1117 if (status_type == PACKAGE_MANAGER_STATUS_TYPE_ALL)
1118 return PKGMGR_CLIENT_STATUS_ALL;
1120 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_INSTALL)
1121 type |= PKGMGR_CLIENT_STATUS_INSTALL;
1122 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_UNINSTALL)
1123 type |= PKGMGR_CLIENT_STATUS_UNINSTALL;
1124 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_UPGRADE)
1125 type |= PKGMGR_CLIENT_STATUS_UPGRADE;
1126 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_MOVE)
1127 type |= PKGMGR_CLIENT_STATUS_MOVE;
1128 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_CLEAR_DATA)
1129 type |= PKGMGR_CLIENT_STATUS_CLEAR_DATA;
1130 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_INSTALL_PROGRESS)
1131 type |= PKGMGR_CLIENT_STATUS_INSTALL_PROGRESS;
1132 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_GET_SIZE)
1133 type |= PKGMGR_CLIENT_STATUS_GET_SIZE;
1138 API int package_manager_set_event_status(package_manager_h manager, int status_type)
1142 int type_all = PACKAGE_MANAGER_STATUS_TYPE_INSTALL |
1143 PACKAGE_MANAGER_STATUS_TYPE_UNINSTALL |
1144 PACKAGE_MANAGER_STATUS_TYPE_UPGRADE |
1145 PACKAGE_MANAGER_STATUS_TYPE_MOVE |
1146 PACKAGE_MANAGER_STATUS_TYPE_CLEAR_DATA |
1147 PACKAGE_MANAGER_STATUS_TYPE_INSTALL_PROGRESS |
1148 PACKAGE_MANAGER_STATUS_TYPE_GET_SIZE;
1150 if (manager == NULL)
1151 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1153 if (status_type < 0 || status_type > type_all)
1154 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1156 type = __convert_status_type(status_type);
1157 retval = pkgmgr_client_set_status_type(manager->pc, type);
1160 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1162 return PACKAGE_MANAGER_ERROR_NONE;
1165 API int package_manager_set_event_cb(package_manager_h manager,
1166 package_manager_event_cb callback,
1170 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1171 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1174 if (package_manager_validate_handle(manager)) {
1176 package_manager_error
1177 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1181 manager->event_cb = callback;
1182 manager->user_data = user_data;
1184 retval = pkgmgr_client_listen_status(manager->pc,
1185 internal_callback, manager);
1187 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR,
1188 __FUNCTION__, NULL);
1191 if (!manager->event_info_table) {
1192 manager->event_info_table =
1193 g_hash_table_new_full(g_str_hash, g_str_equal,
1194 NULL, __free_event_info);
1197 return PACKAGE_MANAGER_ERROR_NONE;
1200 API int package_manager_unset_event_cb(package_manager_h manager)
1202 if (manager == NULL) {
1204 package_manager_error
1205 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1210 manager->event_cb = NULL;
1211 manager->user_data = NULL;
1213 g_hash_table_remove_all(manager->event_info_table);
1215 retval = pkgmgr_client_remove_listen_status(manager->pc);
1216 if (retval == PKGMGR_R_EINVAL)
1218 package_manager_error
1219 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1221 else if (retval == PKGMGR_R_ERROR)
1223 package_manager_error
1224 (PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__,
1227 return PACKAGE_MANAGER_ERROR_NONE;
1230 API int package_manager_get_package_id_by_app_id(const char *app_id, char **package_id)
1232 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo;
1234 char *pkg_id = NULL;
1235 char *pkg_id_dup = NULL;
1237 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1238 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1241 if (app_id == NULL || package_id == NULL)
1242 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1244 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1245 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1246 retval = pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id);
1247 if (retval != PMINFO_R_OK) {
1248 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1249 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1252 pkg_id_dup = strdup(pkg_id);
1253 if (pkg_id_dup == NULL) {
1254 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1255 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1258 *package_id = pkg_id_dup;
1260 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1262 return PACKAGE_MANAGER_ERROR_NONE;
1265 API int package_manager_get_package_info(const char *package_id, package_info_h *package_info)
1268 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1269 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1272 retval = package_info_get_package_info(package_id, package_info);
1274 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1275 return package_manager_error(retval, __FUNCTION__, NULL);
1277 return PACKAGE_MANAGER_ERROR_NONE;
1280 API int package_manager_foreach_package_info(package_manager_package_info_cb callback,
1284 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1285 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1288 retval = package_info_foreach_package_info(callback, user_data);
1290 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1291 return package_manager_error(retval, __FUNCTION__, NULL);
1293 return PACKAGE_MANAGER_ERROR_NONE;
1296 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)
1298 pkgmgrinfo_cert_compare_result_type_e result;
1300 if (lhs_package_id == NULL || rhs_package_id == NULL || compare_result == NULL)
1301 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1302 if (pkgmgrinfo_pkginfo_compare_pkg_cert_info(lhs_package_id, rhs_package_id, &result) != PKGMGR_R_OK)
1303 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1304 *compare_result = (package_manager_compare_result_type_e)result;
1306 return PACKAGE_MANAGER_ERROR_NONE;
1309 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)
1311 pkgmgrinfo_cert_compare_result_type_e result;
1313 if (lhs_app_id == NULL || rhs_app_id == NULL || compare_result == NULL)
1314 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1315 if (pkgmgrinfo_pkginfo_compare_app_cert_info(lhs_app_id, rhs_app_id, &result) != PKGMGR_R_OK)
1316 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1318 *compare_result = (package_manager_compare_result_type_e)result;
1320 return PACKAGE_MANAGER_ERROR_NONE;
1323 API int package_manager_is_preload_package_by_app_id(const char *app_id, bool *preload)
1326 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1327 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1330 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo = NULL;
1331 pkgmgrinfo_pkginfo_h pkgmgrinfo_pkginfo = NULL;
1333 char *pkg_id = NULL;
1334 bool is_preload = 0;
1335 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1336 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1338 retval = pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id);
1339 if (retval != PMINFO_R_OK) {
1340 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1341 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1343 if (pkgmgrinfo_pkginfo_get_pkginfo(pkg_id, &pkgmgrinfo_pkginfo) != PMINFO_R_OK) {
1344 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1345 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1346 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1348 if (pkgmgrinfo_pkginfo_is_preload(pkgmgrinfo_pkginfo, &is_preload) != PMINFO_R_OK) {
1349 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1350 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1351 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1359 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1360 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1362 return PACKAGE_MANAGER_ERROR_NONE;
1365 API int package_manager_get_permission_type(const char *app_id, package_manager_permission_type_e *permission_type)
1368 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1369 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1372 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo = NULL;
1373 pkgmgrinfo_permission_type permission = 0;
1374 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1375 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1376 retval = pkgmgrinfo_appinfo_get_permission_type(pkgmgrinfo_appinfo, &permission);
1377 if (retval != PMINFO_R_OK) {
1378 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1379 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1382 if (permission == PMINFO_PERMISSION_NORMAL)
1383 *permission_type = PACKAGE_MANAGER_PERMISSION_NORMAL;
1384 else if (permission == PMINFO_PERMISSION_SIGNATURE)
1385 *permission_type = PACKAGE_MANAGER_PERMISSION_SIGNATURE;
1386 else if (permission == PMINFO_PERMISSION_PRIVILEGE)
1387 *permission_type = PACKAGE_MANAGER_PERMISSION_PRIVILEGE;
1389 *permission_type = PACKAGE_MANAGER_PERMISSION_NORMAL;
1391 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1392 return PACKAGE_MANAGER_ERROR_NONE;
1395 API int package_manager_clear_cache_dir(const char *package_id)
1398 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_CACHE);
1399 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1402 int res = pkgmgr_client_clear_cache_dir(package_id);
1403 if (res == PKGMGR_R_EINVAL) {
1404 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1405 } else if (res == PKGMGR_R_ENOPKG) {
1406 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1407 } else if (res == PKGMGR_R_ENOMEM) {
1408 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1409 } else if (res == PKGMGR_R_EIO) {
1410 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1411 } else if (res == PKGMGR_R_EPRIV) {
1412 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
1413 } else if (res == PKGMGR_R_ESYSTEM || res == PKGMGR_R_ECOMM || res == PKGMGR_R_ERROR) {
1414 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1415 } else if (res != PKGMGR_R_OK) {
1416 _LOGE("Unexpected error");
1417 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1420 return PACKAGE_MANAGER_ERROR_NONE;
1423 API int package_manager_clear_data_dir(const char *package_id)
1426 pkgmgr_client *pc = NULL;
1427 char *pkg_type = NULL;
1428 pkgmgrinfo_pkginfo_h pkginfo = NULL;
1430 if (package_id == NULL)
1431 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
1433 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
1434 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1437 retval = pkgmgrinfo_pkginfo_get_pkginfo(package_id, &pkginfo);
1438 if (retval == PMINFO_R_ENOENT)
1439 return PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE;
1440 else if (retval != PMINFO_R_OK || pkginfo == NULL)
1441 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
1443 retval = pkgmgrinfo_pkginfo_get_type(pkginfo, &pkg_type);
1444 if (retval != PMINFO_R_OK || pkg_type == NULL) {
1445 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
1446 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
1449 pc = pkgmgr_client_new(PC_REQUEST);
1451 _LOGE("Out of memory");
1452 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
1453 return PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY;
1456 retval = pkgmgr_client_clear_user_data(pc, pkg_type, package_id, PM_QUIET);
1457 pkgmgr_client_free(pc);
1458 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
1460 if (retval == PKGMGR_R_EINVAL) {
1461 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1462 } else if (retval == PKGMGR_R_ENOPKG) {
1463 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1464 } else if (retval == PKGMGR_R_ENOMEM) {
1465 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1466 } else if (retval == PKGMGR_R_EIO) {
1467 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1468 } else if (retval == PKGMGR_R_EPRIV) {
1469 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
1470 } else if (retval == PKGMGR_R_ESYSTEM || retval == PKGMGR_R_ECOMM || retval == PKGMGR_R_ERROR) {
1471 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1472 } else if (retval != PKGMGR_R_OK) {
1473 _LOGE("Unexpected error");
1474 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1477 return PACKAGE_MANAGER_ERROR_NONE;
1480 API int package_manager_clear_all_cache_dir(void)
1483 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
1484 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1487 return package_manager_clear_cache_dir(PKG_CLEAR_ALL_CACHE);
1490 static void __free_client(gpointer data)
1492 pkgmgr_client *pc = (pkgmgr_client *)data;
1493 pkgmgr_client_free(pc);
1496 static void __initialize_cb_table(void)
1498 __cb_table = g_hash_table_new_full(g_direct_hash, g_direct_equal, __free_client, NULL);
1501 static void __result_cb(pkgmgr_client *pc, const char *pkgid, const pkg_size_info_t *result, void *user_data)
1503 package_manager_size_info_receive_cb callback = g_hash_table_lookup(__cb_table, pc);
1504 if (callback == NULL) {
1505 _LOGE("callback is null.");
1506 g_hash_table_remove(__cb_table, pc);
1510 package_size_info_t size_info;
1511 size_info.data_size = result->data_size;
1512 size_info.cache_size = result->cache_size;
1513 size_info.app_size = result->app_size;
1514 size_info.external_data_size = result->ext_data_size;
1515 size_info.external_cache_size = result->ext_cache_size;
1516 size_info.external_app_size = result->ext_app_size;
1518 callback(pkgid, (package_size_info_h)&size_info, user_data);
1520 g_hash_table_remove(__cb_table, pc);
1523 static void __total_result_cb(pkgmgr_client *pc, const pkg_size_info_t *result, void *user_data)
1525 package_manager_total_size_info_receive_cb callback = g_hash_table_lookup(__cb_table, pc);
1526 if (callback == NULL) {
1527 _LOGE("callback is null.");
1528 g_hash_table_remove(__cb_table, pc);
1532 package_size_info_t size_info;
1533 size_info.data_size = result->data_size;
1534 size_info.cache_size = result->cache_size;
1535 size_info.app_size = result->app_size;
1536 size_info.external_data_size = result->ext_data_size;
1537 size_info.external_cache_size = result->ext_cache_size;
1538 size_info.external_app_size = result->ext_app_size;
1540 callback((package_size_info_h)&size_info, user_data);
1542 g_hash_table_remove(__cb_table, pc);
1545 static int _get_pkg_size_info(const char *package_id, void *callback, void *user_data)
1547 if (package_id == NULL || callback == NULL)
1548 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1550 if (__cb_table == NULL)
1551 __initialize_cb_table();
1553 pkgmgr_client *pc = pkgmgr_client_new(PC_REQUEST);
1555 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1558 if (strcmp(package_id, PKG_SIZE_INFO_TOTAL) != 0)
1559 res = pkgmgr_client_get_package_size_info(pc, package_id, __result_cb, user_data);
1561 res = pkgmgr_client_get_total_package_size_info(pc, __total_result_cb, user_data);
1563 if (res == PKGMGR_R_EINVAL) {
1564 pkgmgr_client_free(pc);
1565 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1566 } else if (res == PKGMGR_R_ENOPKG) {
1567 pkgmgr_client_free(pc);
1568 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1569 } else if (res == PKGMGR_R_ENOMEM) {
1570 pkgmgr_client_free(pc);
1571 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1572 } else if (res == PKGMGR_R_EIO) {
1573 pkgmgr_client_free(pc);
1574 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1575 } else if (res == PKGMGR_R_EPRIV) {
1576 pkgmgr_client_free(pc);
1577 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
1578 } else if (res == PKGMGR_R_ESYSTEM || res == PKGMGR_R_ECOMM || res == PKGMGR_R_ERROR) {
1579 pkgmgr_client_free(pc);
1580 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1581 } else if (res != PKGMGR_R_OK) {
1582 _LOGE("Unexpected error");
1583 pkgmgr_client_free(pc);
1584 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1587 g_hash_table_insert(__cb_table, pc, callback);
1589 return PACKAGE_MANAGER_ERROR_NONE;
1592 API int package_manager_get_package_size_info(const char *package_id, package_manager_size_info_receive_cb callback, void *user_data)
1594 return _get_pkg_size_info(package_id, (void *)callback, user_data);
1597 API int package_manager_get_total_package_size_info(package_manager_total_size_info_receive_cb callback, void *user_data)
1599 return _get_pkg_size_info(PKG_SIZE_INFO_TOTAL, (void *)callback, user_data);
1602 API int package_manager_filter_create(package_manager_filter_h *handle)
1605 pkgmgrinfo_pkginfo_filter_h pkgmgr_filter = NULL;
1607 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1608 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1611 if (handle == NULL) {
1613 package_manager_error
1614 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1618 retval = pkgmgrinfo_pkginfo_filter_create(&pkgmgr_filter);
1619 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1620 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1622 *handle = pkgmgr_filter;
1624 return PACKAGE_MANAGER_ERROR_NONE;
1627 API int package_manager_filter_destroy(package_manager_filter_h handle)
1631 if (handle == NULL) {
1633 package_manager_error
1634 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1638 retval = pkgmgrinfo_pkginfo_filter_destroy(handle);
1639 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1640 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1642 return PACKAGE_MANAGER_ERROR_NONE;
1645 API int package_manager_filter_add_bool(package_manager_filter_h handle,
1646 const char *property, const bool value)
1650 if ((handle == NULL) || (property == NULL)) {
1652 package_manager_error
1653 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1657 retval = pkgmgrinfo_pkginfo_filter_add_bool(handle, property, value);
1658 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1659 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1661 return PACKAGE_MANAGER_ERROR_NONE;
1664 API int package_manager_filter_count(package_manager_filter_h handle, int *count)
1667 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1668 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1671 if ((handle == NULL) || (count == NULL))
1672 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1674 retval = pkgmgrinfo_pkginfo_filter_count(handle, count);
1676 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1678 return PACKAGE_MANAGER_ERROR_NONE;
1681 API int package_manager_filter_foreach_package_info(package_manager_filter_h handle,
1682 package_manager_package_info_cb callback, void *user_data)
1685 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1686 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1689 retval = package_info_filter_foreach_package_info(handle, callback, user_data);
1691 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1692 return package_manager_error(retval, __FUNCTION__, NULL);
1694 return PACKAGE_MANAGER_ERROR_NONE;
1697 API int package_size_info_get_data_size(package_size_info_h handle, long long *data_size)
1700 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1702 package_size_info_t *size_info = (package_size_info_t *)handle;
1704 *data_size = (long long)size_info->data_size;
1705 return PACKAGE_MANAGER_ERROR_NONE;
1708 API int package_size_info_get_cache_size(package_size_info_h handle, long long *cache_size)
1711 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1713 package_size_info_t *size_info = (package_size_info_t *)handle;
1715 *cache_size = size_info->cache_size;
1716 return PACKAGE_MANAGER_ERROR_NONE;
1719 API int package_size_info_get_app_size(package_size_info_h handle, long long *app_size)
1722 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1724 package_size_info_t *size_info = (package_size_info_t *)handle;
1725 *app_size = size_info->app_size;
1726 return PACKAGE_MANAGER_ERROR_NONE;
1729 API int package_size_info_get_external_data_size(package_size_info_h handle, long long *ext_data_size)
1732 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
1734 package_size_info_t *size_info = (package_size_info_t *)handle;
1735 *ext_data_size = size_info->external_data_size;
1736 return PACKAGE_MANAGER_ERROR_NONE;
1739 API int package_size_info_get_external_cache_size(package_size_info_h handle, long long *ext_cache_size)
1742 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1744 package_size_info_t *size_info = (package_size_info_t *)handle;
1745 *ext_cache_size = size_info->external_cache_size;
1746 return PACKAGE_MANAGER_ERROR_NONE;
1749 API int package_size_info_get_external_app_size(package_size_info_h handle, long long *ext_app_size)
1752 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1754 package_size_info_t *size_info = (package_size_info_t *)handle;
1755 *ext_app_size = size_info->external_app_size;
1756 return PACKAGE_MANAGER_ERROR_NONE;
1759 API int package_manager_updateinfo_set_pkgid(package_updateinfo_request_h pkg_updateinfo_req, const char *pkgid)
1761 struct package_updateinfo_request_s *request;
1763 if (pkg_updateinfo_req == NULL || pkg_updateinfo_req->updateinfo_handle == NULL || pkgid == NULL)
1764 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1766 request = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1767 if (request->updateinfo_handle->pkgid)
1768 free(request->updateinfo_handle->pkgid);
1769 request->updateinfo_handle->pkgid = strdup(pkgid);
1770 if (request->updateinfo_handle->pkgid == NULL)
1771 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1773 return PACKAGE_MANAGER_ERROR_NONE;
1776 API int package_manager_updateinfo_set_version(package_updateinfo_request_h pkg_updateinfo_req, const char *version)
1778 struct package_updateinfo_request_s *request;
1780 if (pkg_updateinfo_req == NULL || pkg_updateinfo_req->updateinfo_handle == NULL || version == NULL)
1781 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1783 request = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1784 if (request->updateinfo_handle->version)
1785 free(request->updateinfo_handle->version);
1786 request->updateinfo_handle->version = strdup(version);
1787 if (request->updateinfo_handle->version == NULL)
1788 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1790 return PACKAGE_MANAGER_ERROR_NONE;
1793 static int package_manager_updateinfo_convert_property(package_updateinfo_type_e property, pkgmgr_updateinfo_type *converted_property)
1795 if (converted_property == NULL)
1798 if (property == PACKAGE_UPDATEINFO_TYPE_FORCE)
1799 *converted_property = PM_UPDATEINFO_TYPE_FORCE;
1800 else if (property == PACKAGE_UPDATEINFO_TYPE_OPTIONAL)
1801 *converted_property = PM_UPDATEINFO_TYPE_OPTIONAL;
1802 else if (property == PACKAGE_UPDATEINFO_TYPE_NONE)
1803 *converted_property = PM_UPDATEINFO_TYPE_NONE;
1810 API int package_manager_updateinfo_set_type(package_updateinfo_request_h pkg_updateinfo_req, package_updateinfo_type_e type)
1813 pkgmgr_updateinfo_type converted_type;
1814 struct package_updateinfo_request_s *request;
1816 if (pkg_updateinfo_req == NULL || pkg_updateinfo_req->updateinfo_handle == NULL)
1817 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1819 request = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1820 retval = package_manager_updateinfo_convert_property(type, &converted_type);
1822 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1824 request->updateinfo_handle->type = converted_type;
1825 return PACKAGE_MANAGER_ERROR_NONE;
1828 API int package_manager_updateinfo_request_destroy(package_updateinfo_request_h pkg_updateinfo_req)
1830 struct package_updateinfo_request_s *request;
1832 if (pkg_updateinfo_req == NULL)
1833 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1835 request = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1837 pkgmgr_client_free(request->pc);
1839 if (request->updateinfo_handle) {
1840 if (request->updateinfo_handle->pkgid)
1841 free(request->updateinfo_handle->pkgid);
1842 if (request->updateinfo_handle->version)
1843 free(request->updateinfo_handle->version);
1844 free(request->updateinfo_handle);
1848 return PACKAGE_MANAGER_ERROR_NONE;
1851 API int package_manager_updateinfo_request_create(package_updateinfo_request_h *pkg_updateinfo_req)
1853 struct package_updateinfo_request_s *request;
1854 pkg_update_info_t *update_info;
1856 if (pkg_updateinfo_req == NULL)
1857 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1859 request = calloc(1, sizeof(struct package_updateinfo_request_s));
1860 if (request == NULL)
1861 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1863 request->pc = pkgmgr_client_new(PC_REQUEST);
1864 if (request->pc == NULL) {
1866 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1869 update_info = calloc(1, sizeof(pkg_update_info_t));
1870 if (update_info == NULL) {
1871 pkgmgr_client_free(request->pc);
1873 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1875 request->updateinfo_handle = update_info;
1877 *pkg_updateinfo_req = request;
1878 return PACKAGE_MANAGER_ERROR_NONE;
1881 API int package_manager_updateinfo_request_register(package_updateinfo_request_h pkg_updateinfo_req)
1883 struct package_updateinfo_request_s *update_info;
1886 if (pkg_updateinfo_req == NULL)
1887 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1888 update_info = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1890 retval = pkgmgr_client_register_pkg_update_info(update_info->pc, update_info->updateinfo_handle);
1891 if (retval == PKGMGR_R_EINVAL)
1892 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1894 return PACKAGE_MANAGER_ERROR_NONE;
1897 API int package_manager_updateinfo_request_unregister(package_updateinfo_request_h pkg_updateinfo_req, const char *pkgid)
1900 struct package_updateinfo_request_s *update_info;
1902 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
1903 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1906 if (pkg_updateinfo_req == NULL || pkgid == NULL)
1907 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1909 update_info = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1910 retval = pkgmgr_client_unregister_pkg_update_info(update_info->pc, pkgid);
1911 if (retval != PMINFO_R_OK)
1912 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1914 return PACKAGE_MANAGER_ERROR_NONE;
1917 API int package_manager_updateinfo_request_unregister_all(package_updateinfo_request_h pkg_updateinfo_req)
1920 struct package_updateinfo_request_s *update_info;
1922 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
1923 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1926 if (pkg_updateinfo_req == NULL)
1927 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1929 update_info = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1930 retval = pkgmgr_client_unregister_all_pkg_update_info(update_info->pc);
1932 if (retval != PMINFO_R_OK)
1933 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1935 return PACKAGE_MANAGER_ERROR_NONE;