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,
1171 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1172 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1175 if (package_manager_validate_handle(manager)) {
1177 package_manager_error
1178 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1182 manager->event_cb = callback;
1183 manager->user_data = user_data;
1185 retval = pkgmgr_client_listen_status(manager->pc,
1186 internal_callback, manager);
1188 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR,
1189 __FUNCTION__, NULL);
1192 if (!manager->event_info_table) {
1193 manager->event_info_table =
1194 g_hash_table_new_full(g_str_hash, g_str_equal,
1195 NULL, __free_event_info);
1198 return PACKAGE_MANAGER_ERROR_NONE;
1201 API int package_manager_unset_event_cb(package_manager_h manager)
1203 if (manager == NULL) {
1205 package_manager_error
1206 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1211 manager->event_cb = NULL;
1212 manager->user_data = NULL;
1214 g_hash_table_remove_all(manager->event_info_table);
1216 retval = pkgmgr_client_remove_listen_status(manager->pc);
1217 if (retval == PKGMGR_R_EINVAL)
1219 package_manager_error
1220 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1222 else if (retval == PKGMGR_R_ERROR)
1224 package_manager_error
1225 (PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__,
1228 return PACKAGE_MANAGER_ERROR_NONE;
1231 API int package_manager_get_package_id_by_app_id(const char *app_id, char **package_id)
1233 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo;
1235 char *pkg_id = NULL;
1236 char *pkg_id_dup = NULL;
1238 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1239 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1242 if (app_id == NULL || package_id == NULL)
1243 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1245 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1246 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1247 retval = pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id);
1248 if (retval != PMINFO_R_OK) {
1249 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1250 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1253 pkg_id_dup = strdup(pkg_id);
1254 if (pkg_id_dup == NULL) {
1255 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1256 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1259 *package_id = pkg_id_dup;
1261 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1263 return PACKAGE_MANAGER_ERROR_NONE;
1266 API int package_manager_get_package_info(const char *package_id, package_info_h *package_info)
1269 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1270 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1273 retval = package_info_get_package_info(package_id, package_info);
1275 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1276 return package_manager_error(retval, __FUNCTION__, NULL);
1278 return PACKAGE_MANAGER_ERROR_NONE;
1281 API int package_manager_foreach_package_info(package_manager_package_info_cb callback,
1286 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1287 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1290 retval = package_info_foreach_package_info(callback, user_data);
1292 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1293 return package_manager_error(retval, __FUNCTION__, NULL);
1295 return PACKAGE_MANAGER_ERROR_NONE;
1298 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)
1300 pkgmgrinfo_cert_compare_result_type_e result;
1302 if (lhs_package_id == NULL || rhs_package_id == NULL || compare_result == NULL)
1303 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1304 if (pkgmgrinfo_pkginfo_compare_pkg_cert_info(lhs_package_id, rhs_package_id, &result) != PKGMGR_R_OK)
1305 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1306 *compare_result = (package_manager_compare_result_type_e)result;
1308 return PACKAGE_MANAGER_ERROR_NONE;
1311 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)
1313 pkgmgrinfo_cert_compare_result_type_e result;
1315 if (lhs_app_id == NULL || rhs_app_id == NULL || compare_result == NULL)
1316 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1317 if (pkgmgrinfo_pkginfo_compare_app_cert_info(lhs_app_id, rhs_app_id, &result) != PKGMGR_R_OK)
1318 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1320 *compare_result = (package_manager_compare_result_type_e)result;
1322 return PACKAGE_MANAGER_ERROR_NONE;
1325 API int package_manager_is_preload_package_by_app_id(const char *app_id, bool *preload)
1329 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1330 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1333 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo = NULL;
1334 pkgmgrinfo_pkginfo_h pkgmgrinfo_pkginfo = NULL;
1336 char *pkg_id = NULL;
1337 bool is_preload = 0;
1338 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1339 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1341 retval = pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id);
1342 if (retval != PMINFO_R_OK) {
1343 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1344 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1346 if (pkgmgrinfo_pkginfo_get_pkginfo(pkg_id, &pkgmgrinfo_pkginfo) != PMINFO_R_OK) {
1347 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1348 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1349 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1351 if (pkgmgrinfo_pkginfo_is_preload(pkgmgrinfo_pkginfo, &is_preload) != PMINFO_R_OK) {
1352 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1353 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1354 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1362 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1363 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1365 return PACKAGE_MANAGER_ERROR_NONE;
1368 API int package_manager_get_permission_type(const char *app_id, package_manager_permission_type_e *permission_type)
1372 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1373 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1376 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo = NULL;
1377 pkgmgrinfo_permission_type permission = 0;
1378 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1379 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1380 retval = pkgmgrinfo_appinfo_get_permission_type(pkgmgrinfo_appinfo, &permission);
1381 if (retval != PMINFO_R_OK) {
1382 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1383 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1386 if (permission == PMINFO_PERMISSION_NORMAL)
1387 *permission_type = PACKAGE_MANAGER_PERMISSION_NORMAL;
1388 else if (permission == PMINFO_PERMISSION_SIGNATURE)
1389 *permission_type = PACKAGE_MANAGER_PERMISSION_SIGNATURE;
1390 else if (permission == PMINFO_PERMISSION_PRIVILEGE)
1391 *permission_type = PACKAGE_MANAGER_PERMISSION_PRIVILEGE;
1393 *permission_type = PACKAGE_MANAGER_PERMISSION_NORMAL;
1395 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1396 return PACKAGE_MANAGER_ERROR_NONE;
1399 API int package_manager_clear_cache_dir(const char *package_id)
1403 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_CACHE);
1404 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1407 int res = pkgmgr_client_clear_cache_dir(package_id);
1408 if (res == PKGMGR_R_EINVAL) {
1409 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1410 } else if (res == PKGMGR_R_ENOPKG) {
1411 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1412 } else if (res == PKGMGR_R_ENOMEM) {
1413 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1414 } else if (res == PKGMGR_R_EIO) {
1415 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1416 } else if (res == PKGMGR_R_EPRIV) {
1417 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
1418 } else if (res == PKGMGR_R_ESYSTEM || res == PKGMGR_R_ECOMM || res == PKGMGR_R_ERROR) {
1419 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1420 } else if (res != PKGMGR_R_OK) {
1421 _LOGE("Unexpected error");
1422 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1425 return PACKAGE_MANAGER_ERROR_NONE;
1428 API int package_manager_clear_data_dir(const char *package_id)
1431 pkgmgr_client *pc = NULL;
1432 char *pkg_type = NULL;
1433 pkgmgrinfo_pkginfo_h pkginfo = NULL;
1435 if (package_id == NULL)
1436 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
1438 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
1439 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1442 retval = pkgmgrinfo_pkginfo_get_pkginfo(package_id, &pkginfo);
1443 if (retval == PMINFO_R_ENOENT)
1444 return PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE;
1445 else if (retval != PMINFO_R_OK || pkginfo == NULL)
1446 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
1448 retval = pkgmgrinfo_pkginfo_get_type(pkginfo, &pkg_type);
1449 if (retval != PMINFO_R_OK || pkg_type == NULL) {
1450 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
1451 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
1454 pc = pkgmgr_client_new(PC_REQUEST);
1456 _LOGE("Out of memory");
1457 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
1458 return PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY;
1461 retval = pkgmgr_client_clear_user_data(pc, pkg_type, package_id, PM_QUIET);
1462 pkgmgr_client_free(pc);
1463 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
1465 if (retval == PKGMGR_R_EINVAL) {
1466 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1467 } else if (retval == PKGMGR_R_ENOPKG) {
1468 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1469 } else if (retval == PKGMGR_R_ENOMEM) {
1470 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1471 } else if (retval == PKGMGR_R_EIO) {
1472 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1473 } else if (retval == PKGMGR_R_EPRIV) {
1474 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
1475 } else if (retval == PKGMGR_R_ESYSTEM || retval == PKGMGR_R_ECOMM || retval == PKGMGR_R_ERROR) {
1476 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1477 } else if (retval != PKGMGR_R_OK) {
1478 _LOGE("Unexpected error");
1479 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1482 return PACKAGE_MANAGER_ERROR_NONE;
1485 API int package_manager_clear_all_cache_dir(void)
1489 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
1490 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1493 return package_manager_clear_cache_dir(PKG_CLEAR_ALL_CACHE);
1496 static void __free_client(gpointer data)
1498 pkgmgr_client *pc = (pkgmgr_client *)data;
1499 pkgmgr_client_free(pc);
1502 static void __initialize_cb_table(void)
1504 __cb_table = g_hash_table_new_full(g_direct_hash, g_direct_equal, __free_client, NULL);
1507 static void __result_cb(pkgmgr_client *pc, const char *pkgid, const pkg_size_info_t *result, void *user_data)
1509 package_manager_size_info_receive_cb callback = g_hash_table_lookup(__cb_table, pc);
1510 if (callback == NULL) {
1511 _LOGE("callback is null.");
1512 g_hash_table_remove(__cb_table, pc);
1516 package_size_info_t size_info;
1517 size_info.data_size = result->data_size;
1518 size_info.cache_size = result->cache_size;
1519 size_info.app_size = result->app_size;
1520 size_info.external_data_size = result->ext_data_size;
1521 size_info.external_cache_size = result->ext_cache_size;
1522 size_info.external_app_size = result->ext_app_size;
1524 callback(pkgid, (package_size_info_h)&size_info, user_data);
1526 g_hash_table_remove(__cb_table, pc);
1529 static void __total_result_cb(pkgmgr_client *pc, const pkg_size_info_t *result, void *user_data)
1531 package_manager_total_size_info_receive_cb callback = g_hash_table_lookup(__cb_table, pc);
1532 if (callback == NULL) {
1533 _LOGE("callback is null.");
1534 g_hash_table_remove(__cb_table, pc);
1538 package_size_info_t size_info;
1539 size_info.data_size = result->data_size;
1540 size_info.cache_size = result->cache_size;
1541 size_info.app_size = result->app_size;
1542 size_info.external_data_size = result->ext_data_size;
1543 size_info.external_cache_size = result->ext_cache_size;
1544 size_info.external_app_size = result->ext_app_size;
1546 callback((package_size_info_h)&size_info, user_data);
1548 g_hash_table_remove(__cb_table, pc);
1551 static int _get_pkg_size_info(const char *package_id, void *callback, void *user_data)
1553 if (package_id == NULL || callback == NULL)
1554 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1556 if (__cb_table == NULL)
1557 __initialize_cb_table();
1559 pkgmgr_client *pc = pkgmgr_client_new(PC_REQUEST);
1561 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1564 if (strcmp(package_id, PKG_SIZE_INFO_TOTAL) != 0)
1565 res = pkgmgr_client_get_package_size_info(pc, package_id, __result_cb, user_data);
1567 res = pkgmgr_client_get_total_package_size_info(pc, __total_result_cb, user_data);
1569 if (res == PKGMGR_R_EINVAL) {
1570 pkgmgr_client_free(pc);
1571 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1572 } else if (res == PKGMGR_R_ENOPKG) {
1573 pkgmgr_client_free(pc);
1574 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1575 } else if (res == PKGMGR_R_ENOMEM) {
1576 pkgmgr_client_free(pc);
1577 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1578 } else if (res == PKGMGR_R_EIO) {
1579 pkgmgr_client_free(pc);
1580 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1581 } else if (res == PKGMGR_R_EPRIV) {
1582 pkgmgr_client_free(pc);
1583 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
1584 } else if (res == PKGMGR_R_ESYSTEM || res == PKGMGR_R_ECOMM || res == PKGMGR_R_ERROR) {
1585 pkgmgr_client_free(pc);
1586 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1587 } else if (res != PKGMGR_R_OK) {
1588 _LOGE("Unexpected error");
1589 pkgmgr_client_free(pc);
1590 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1593 g_hash_table_insert(__cb_table, pc, callback);
1595 return PACKAGE_MANAGER_ERROR_NONE;
1598 API int package_manager_get_package_size_info(const char *package_id, package_manager_size_info_receive_cb callback, void *user_data)
1600 return _get_pkg_size_info(package_id, (void *)callback, user_data);
1603 API int package_manager_get_total_package_size_info(package_manager_total_size_info_receive_cb callback, void *user_data)
1605 return _get_pkg_size_info(PKG_SIZE_INFO_TOTAL, (void *)callback, user_data);
1608 API int package_manager_filter_create(package_manager_filter_h *handle)
1611 pkgmgrinfo_pkginfo_filter_h pkgmgr_filter = NULL;
1613 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1614 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1617 if (handle == NULL) {
1619 package_manager_error
1620 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1624 retval = pkgmgrinfo_pkginfo_filter_create(&pkgmgr_filter);
1625 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1626 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1628 *handle = pkgmgr_filter;
1630 return PACKAGE_MANAGER_ERROR_NONE;
1633 API int package_manager_filter_destroy(package_manager_filter_h handle)
1637 if (handle == NULL) {
1639 package_manager_error
1640 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1644 retval = pkgmgrinfo_pkginfo_filter_destroy(handle);
1645 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1646 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1648 return PACKAGE_MANAGER_ERROR_NONE;
1651 API int package_manager_filter_add_bool(package_manager_filter_h handle,
1652 const char *property, const bool value)
1656 if ((handle == NULL) || (property == NULL)) {
1658 package_manager_error
1659 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1663 retval = pkgmgrinfo_pkginfo_filter_add_bool(handle, property, value);
1664 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1665 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1667 return PACKAGE_MANAGER_ERROR_NONE;
1670 API int package_manager_filter_count(package_manager_filter_h handle, int *count)
1674 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1675 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1678 if ((handle == NULL) || (count == NULL))
1679 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1681 retval = pkgmgrinfo_pkginfo_filter_count(handle, count);
1683 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1685 return PACKAGE_MANAGER_ERROR_NONE;
1688 API int package_manager_filter_foreach_package_info(package_manager_filter_h handle,
1689 package_manager_package_info_cb callback, void *user_data)
1693 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1694 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1697 retval = package_info_filter_foreach_package_info(handle, callback, user_data);
1699 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1700 return package_manager_error(retval, __FUNCTION__, NULL);
1702 return PACKAGE_MANAGER_ERROR_NONE;
1705 API int package_size_info_get_data_size(package_size_info_h handle, long long *data_size)
1708 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1710 package_size_info_t *size_info = (package_size_info_t *)handle;
1712 *data_size = (long long)size_info->data_size;
1713 return PACKAGE_MANAGER_ERROR_NONE;
1716 API int package_size_info_get_cache_size(package_size_info_h handle, long long *cache_size)
1719 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1721 package_size_info_t *size_info = (package_size_info_t *)handle;
1723 *cache_size = size_info->cache_size;
1724 return PACKAGE_MANAGER_ERROR_NONE;
1727 API int package_size_info_get_app_size(package_size_info_h handle, long long *app_size)
1730 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1732 package_size_info_t *size_info = (package_size_info_t *)handle;
1733 *app_size = size_info->app_size;
1734 return PACKAGE_MANAGER_ERROR_NONE;
1737 API int package_size_info_get_external_data_size(package_size_info_h handle, long long *ext_data_size)
1740 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
1742 package_size_info_t *size_info = (package_size_info_t *)handle;
1743 *ext_data_size = size_info->external_data_size;
1744 return PACKAGE_MANAGER_ERROR_NONE;
1747 API int package_size_info_get_external_cache_size(package_size_info_h handle, long long *ext_cache_size)
1750 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1752 package_size_info_t *size_info = (package_size_info_t *)handle;
1753 *ext_cache_size = size_info->external_cache_size;
1754 return PACKAGE_MANAGER_ERROR_NONE;
1757 API int package_size_info_get_external_app_size(package_size_info_h handle, long long *ext_app_size)
1760 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1762 package_size_info_t *size_info = (package_size_info_t *)handle;
1763 *ext_app_size = size_info->external_app_size;
1764 return PACKAGE_MANAGER_ERROR_NONE;
1767 API int package_manager_updateinfo_set_pkgid(package_updateinfo_request_h pkg_updateinfo_req, const char *pkgid)
1769 struct package_updateinfo_request_s *request;
1771 if (pkg_updateinfo_req == NULL || pkg_updateinfo_req->updateinfo_handle == NULL || pkgid == NULL)
1772 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1774 request = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1775 if (request->updateinfo_handle->pkgid)
1776 free(request->updateinfo_handle->pkgid);
1777 request->updateinfo_handle->pkgid = strdup(pkgid);
1778 if (request->updateinfo_handle->pkgid == NULL)
1779 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1781 return PACKAGE_MANAGER_ERROR_NONE;
1784 API int package_manager_updateinfo_set_version(package_updateinfo_request_h pkg_updateinfo_req, const char *version)
1786 struct package_updateinfo_request_s *request;
1788 if (pkg_updateinfo_req == NULL || pkg_updateinfo_req->updateinfo_handle == NULL || version == NULL)
1789 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1791 request = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1792 if (request->updateinfo_handle->version)
1793 free(request->updateinfo_handle->version);
1794 request->updateinfo_handle->version = strdup(version);
1795 if (request->updateinfo_handle->version == NULL)
1796 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1798 return PACKAGE_MANAGER_ERROR_NONE;
1801 static int package_manager_updateinfo_convert_property(package_updateinfo_type_e property, pkgmgr_updateinfo_type *converted_property)
1803 if (converted_property == NULL)
1806 if (property == PACKAGE_UPDATEINFO_TYPE_FORCE)
1807 *converted_property = PM_UPDATEINFO_TYPE_FORCE;
1808 else if (property == PACKAGE_UPDATEINFO_TYPE_OPTIONAL)
1809 *converted_property = PM_UPDATEINFO_TYPE_OPTIONAL;
1810 else if (property == PACKAGE_UPDATEINFO_TYPE_NONE)
1811 *converted_property = PM_UPDATEINFO_TYPE_NONE;
1818 API int package_manager_updateinfo_set_type(package_updateinfo_request_h pkg_updateinfo_req, package_updateinfo_type_e type)
1821 pkgmgr_updateinfo_type converted_type;
1822 struct package_updateinfo_request_s *request;
1824 if (pkg_updateinfo_req == NULL || pkg_updateinfo_req->updateinfo_handle == NULL)
1825 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1827 request = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1828 retval = package_manager_updateinfo_convert_property(type, &converted_type);
1830 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1832 request->updateinfo_handle->type = converted_type;
1833 return PACKAGE_MANAGER_ERROR_NONE;
1836 API int package_manager_updateinfo_request_destroy(package_updateinfo_request_h pkg_updateinfo_req)
1838 struct package_updateinfo_request_s *request;
1840 if (pkg_updateinfo_req == NULL)
1841 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1843 request = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1845 pkgmgr_client_free(request->pc);
1847 if (request->updateinfo_handle) {
1848 if (request->updateinfo_handle->pkgid)
1849 free(request->updateinfo_handle->pkgid);
1850 if (request->updateinfo_handle->version)
1851 free(request->updateinfo_handle->version);
1852 free(request->updateinfo_handle);
1856 return PACKAGE_MANAGER_ERROR_NONE;
1859 API int package_manager_updateinfo_request_create(package_updateinfo_request_h *pkg_updateinfo_req)
1861 struct package_updateinfo_request_s *request;
1862 pkg_update_info_t *update_info;
1864 if (pkg_updateinfo_req == NULL)
1865 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1867 request = calloc(1, sizeof(struct package_updateinfo_request_s));
1868 if (request == NULL)
1869 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1871 request->pc = pkgmgr_client_new(PC_REQUEST);
1872 if (request->pc == NULL) {
1874 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1877 update_info = calloc(1, sizeof(pkg_update_info_t));
1878 if (update_info == NULL) {
1879 pkgmgr_client_free(request->pc);
1881 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1883 request->updateinfo_handle = update_info;
1885 *pkg_updateinfo_req = request;
1886 return PACKAGE_MANAGER_ERROR_NONE;
1889 API int package_manager_updateinfo_request_register(package_updateinfo_request_h pkg_updateinfo_req)
1891 struct package_updateinfo_request_s *update_info;
1894 if (pkg_updateinfo_req == NULL)
1895 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1896 update_info = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1898 retval = pkgmgr_client_register_pkg_update_info(update_info->pc, update_info->updateinfo_handle);
1899 if (retval == PKGMGR_R_EINVAL)
1900 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1902 return PACKAGE_MANAGER_ERROR_NONE;
1905 API int package_manager_updateinfo_request_unregister(package_updateinfo_request_h pkg_updateinfo_req, const char *pkgid)
1908 struct package_updateinfo_request_s *update_info;
1910 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
1911 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1914 if (pkg_updateinfo_req == NULL || pkgid == NULL)
1915 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1917 update_info = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1918 retval = pkgmgr_client_unregister_pkg_update_info(update_info->pc, pkgid);
1919 if (retval != PMINFO_R_OK)
1920 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1922 return PACKAGE_MANAGER_ERROR_NONE;
1925 API int package_manager_updateinfo_request_unregister_all(package_updateinfo_request_h pkg_updateinfo_req)
1928 struct package_updateinfo_request_s *update_info;
1930 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
1931 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1934 if (pkg_updateinfo_req == NULL)
1935 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1937 update_info = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1938 retval = pkgmgr_client_unregister_all_pkg_update_info(update_info->pc);
1940 if (retval != PMINFO_R_OK)
1941 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1943 return PACKAGE_MANAGER_ERROR_NONE;