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 ret = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
278 if (ret != PACKAGE_MANAGER_ERROR_NONE)
281 return __reset_user_request_callback(request, callback, user_data);
284 API int package_manager_request_unset_event_cb(package_manager_request_h request)
286 if (package_manager_client_validate_handle(request))
287 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
289 request->event_cb = NULL;
290 request->user_data = NULL;
292 return PACKAGE_MANAGER_ERROR_NONE;
295 API int package_manager_request_set_type(package_manager_request_h request,
296 const char *pkg_type)
298 if (package_manager_client_validate_handle(request)) {
300 package_manager_error
301 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
305 request->pkg_type = strdup(pkg_type);
307 return PACKAGE_MANAGER_ERROR_NONE;
310 API int package_manager_request_set_mode(package_manager_request_h request,
311 package_manager_request_mode_e mode)
313 if (package_manager_client_validate_handle(request)) {
315 package_manager_error
316 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
320 /* request mode is not used anymore */
322 return PACKAGE_MANAGER_ERROR_NONE;
325 API int package_manager_request_set_tep(package_manager_request_h request,
326 const char *tep_path)
330 if (package_manager_client_validate_handle(request) || tep_path == NULL) {
332 package_manager_error
333 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
337 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
338 if (retval != PACKAGE_MANAGER_ERROR_NONE)
341 if (pkgmgr_client_set_tep_path(request->pc, tep_path, true))
342 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
344 return PACKAGE_MANAGER_ERROR_NONE;
347 static int package_manager_get_event_type(const char *key,
348 package_manager_event_type_e *
352 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
354 if (strcasecmp(key, PKGMGR_INSTALLER_INSTALL_EVENT_STR) == 0)
355 *event_type = PACKAGE_MANAGER_EVENT_TYPE_INSTALL;
356 else if (strcasecmp(key, PKGMGR_INSTALLER_UNINSTALL_EVENT_STR) == 0)
357 *event_type = PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL;
358 else if (strcasecmp(key, PKGMGR_INSTALLER_UPGRADE_EVENT_STR) == 0)
359 *event_type = PACKAGE_MANAGER_EVENT_TYPE_UPDATE;
360 else if (strcasecmp(key, PKGMGR_INSTALLER_MOVE_EVENT_STR) == 0)
361 *event_type = PACKAGE_MANAGER_EVENT_TYPE_MOVE;
362 else if (strcasecmp(key, PKGMGR_INSTALLER_CLEAR_EVENT_STR) == 0)
363 *event_type = PACKAGE_MANAGER_EVENT_TYPE_CLEAR;
365 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
367 return PACKAGE_MANAGER_ERROR_NONE;
370 static int __add_event_info(request_event_info **head, int req_id,
371 package_manager_event_type_e event_type,
372 package_manager_event_state_e event_state)
374 request_event_info *evt_info;
375 request_event_info *current;
376 request_event_info *prev;
378 evt_info = (request_event_info *) calloc(1, sizeof(request_event_info));
379 if (evt_info == NULL) {
380 _LOGD("calloc failed");
383 evt_info->req_id = req_id;
384 evt_info->event_type = event_type;
385 evt_info->event_state = event_state;
386 evt_info->next = NULL;
391 current = prev = *head;
394 current = current->next;
397 prev->next = evt_info;
403 static int __find_event_info(request_event_info **head, int req_id,
404 package_manager_event_type_e *event_type,
405 package_manager_event_state_e *event_state)
407 request_event_info *tmp;
412 _LOGE("tmp is NULL");
417 if (tmp->req_id == req_id) {
418 *event_type = tmp->event_type;
419 *event_state = tmp->event_state;
427 static int __update_event_info(request_event_info **head, int req_id,
428 package_manager_event_type_e event_type,
429 package_manager_event_state_e event_state)
431 package_manager_event_type_e evt_type;
432 package_manager_event_state_e evt_state;
433 request_event_info *tmp;
435 if (__find_event_info(head, req_id, &evt_type, &evt_state) != 0)
436 __add_event_info(head, req_id, event_type, event_state);
441 _LOGE("tmp is NULL");
446 if (tmp->req_id == req_id) {
447 tmp->event_type = event_type;
448 tmp->event_state = event_state;
458 static int request_event_handler(uid_t target_uid, int req_id, const char *pkg_type,
459 const char *pkg_name, const char *key,
460 const char *val, const void *pmsg, void *data)
463 package_manager_event_type_e event_type = -1;
464 package_manager_event_state_e event_state = -1;
466 package_manager_request_h request = data;
468 if (strcasecmp(key, "start") == 0) {
469 ret = package_manager_get_event_type(val, &event_type);
470 if (ret != PACKAGE_MANAGER_ERROR_NONE)
471 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
473 __add_event_info(&(request->head), req_id, event_type,
474 PACKAGE_MANAGER_EVENT_STATE_STARTED);
476 if (request->event_cb)
477 request->event_cb(req_id, pkg_type, pkg_name,
479 PACKAGE_MANAGER_EVENT_STATE_STARTED,
480 0, PACKAGE_MANAGER_ERROR_NONE, request->user_data);
482 } else if (strcasecmp(key, "install_percent") == 0
483 || strcasecmp(key, "progress_percent") == 0) {
484 if (__find_event_info
485 (&(request->head), req_id, &event_type,
486 &event_state) == 0) {
487 __update_event_info(&(request->head), req_id,
489 PACKAGE_MANAGER_EVENT_STATE_PROCESSING);
490 if (request->event_cb)
491 request->event_cb(req_id, pkg_type, pkg_name,
493 PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
495 PACKAGE_MANAGER_ERROR_NONE,
499 } else if (strcasecmp(key, "error") == 0) {
500 if (__find_event_info
501 (&(request->head), req_id, &event_type,
502 &event_state) == 0) {
503 __update_event_info(&(request->head), req_id,
505 PACKAGE_MANAGER_EVENT_STATE_FAILED);
508 if (request->event_cb)
509 request->event_cb(req_id, pkg_type,
510 pkg_name, event_type,
511 PACKAGE_MANAGER_EVENT_STATE_FAILED,
513 PACKAGE_MANAGER_ERROR_NONE,
516 } else if (strcasecmp(key, "end") == 0) {
517 if (__find_event_info
518 (&(request->head), req_id, &event_type,
519 &event_state) == 0) {
520 if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
521 if (request->event_cb)
522 request->event_cb(req_id, pkg_type,
523 pkg_name, event_type,
524 PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
526 PACKAGE_MANAGER_ERROR_NONE,
530 if (strcasecmp(key, "ok") != 0)
531 if (request->event_cb)
532 request->event_cb(req_id, pkg_type,
533 pkg_name, event_type,
534 PACKAGE_MANAGER_EVENT_STATE_FAILED,
536 PACKAGE_MANAGER_ERROR_NONE,
541 return PACKAGE_MANAGER_ERROR_NONE;
544 static int internal_request_callback(uid_t target_uid, int req_id, const char *pkg_type,
545 const char *pkg_name, const char *key,
546 const char *val, const void *pmsg, void *data)
549 package_manager_event_type_e event_type = -1;
550 package_manager_event_state_e event_state = -1;
551 struct package_manager_request_cb_info *cb_info;
552 package_manager_request_event_cb event_cb;
553 void *user_data = NULL;
555 _LOGD("request callback called, req_id[%d]", req_id);
557 package_manager_request_h request = data;
559 if (request->request_cb_table)
560 cb_info = g_hash_table_lookup(request->request_cb_table,
561 GINT_TO_POINTER(req_id));
565 if (!cb_info || (cb_info && !cb_info->callback)) {
566 _LOGE("no callback info");
570 if (cb_info->req_id != req_id) {
571 _LOGE("not matched request id");
575 event_cb = cb_info->callback;
576 user_data = cb_info->user_data;
578 if (strcasecmp(key, "start") == 0) {
579 ret = package_manager_get_event_type(val, &event_type);
580 if (ret != PACKAGE_MANAGER_ERROR_NONE)
581 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
583 __add_event_info(&request->head, req_id, event_type,
584 PACKAGE_MANAGER_EVENT_STATE_STARTED);
586 event_cb(req_id, pkg_type, pkg_name,
588 PACKAGE_MANAGER_EVENT_STATE_STARTED,
589 0, PACKAGE_MANAGER_ERROR_NONE, user_data);
590 } else if (strcasecmp(key, "install_percent") == 0) {
591 if (__find_event_info(&request->head, req_id, &event_type,
592 &event_state) == 0) {
593 __update_event_info(&request->head, req_id,
595 PACKAGE_MANAGER_EVENT_STATE_PROCESSING);
596 event_cb(req_id, pkg_type, pkg_name,
598 PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
600 PACKAGE_MANAGER_ERROR_NONE,
603 } else if (strcasecmp(key, "error") == 0) {
604 if (__find_event_info(&request->head, req_id, &event_type,
605 &event_state) == 0) {
606 __update_event_info(&request->head, req_id,
608 PACKAGE_MANAGER_EVENT_STATE_FAILED);
609 event_cb(req_id, pkg_type,
610 pkg_name, event_type,
611 PACKAGE_MANAGER_EVENT_STATE_FAILED,
613 PACKAGE_MANAGER_ERROR_NONE,
616 } else if (strcasecmp(key, "end") == 0) {
617 if (__find_event_info(&request->head, req_id, &event_type,
618 &event_state) == 0) {
619 if (request->request_cb_table) {
620 _LOGD("remove item, req_id(%d)", req_id);
621 g_hash_table_remove(request->request_cb_table,
622 GINT_TO_POINTER(req_id));
624 if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
625 if (strcasecmp(val, "ok") == 0) {
626 event_cb(req_id, pkg_type,
627 pkg_name, event_type,
628 PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
630 PACKAGE_MANAGER_ERROR_NONE,
633 event_cb(req_id, pkg_type,
634 pkg_name, event_type,
635 PACKAGE_MANAGER_EVENT_STATE_FAILED,
637 PACKAGE_MANAGER_ERROR_NONE,
642 _LOGE("unexpected end event");
649 static int __request_install(package_manager_request_h request,
650 const char *path, pkgmgr_handler event_cb, int *id)
653 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
654 if (retval != PACKAGE_MANAGER_ERROR_NONE)
657 if (package_manager_client_validate_handle(request))
658 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
661 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
664 request_id = pkgmgr_client_install(request->pc, request->pkg_type, NULL,
665 path, NULL, request->mode, event_cb ? event_cb : request_event_handler, request);
667 if (request_id == PKGMGR_R_EINVAL)
668 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
669 else if (request_id == PKGMGR_R_ENOPKG)
670 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
671 else if (request_id == PKGMGR_R_ENOMEM)
672 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
673 else if (request_id == PKGMGR_R_EIO)
674 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
675 else if (request_id == PKGMGR_R_EPRIV)
676 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
677 else if (request_id == PKGMGR_R_ESYSTEM || request_id == PKGMGR_R_ECOMM || request_id == PKGMGR_R_ERROR)
678 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
683 return PACKAGE_MANAGER_ERROR_NONE;
686 static int __request_uninstall(package_manager_request_h request,
687 const char *name, pkgmgr_handler event_cb, int *id)
690 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
691 if (retval != PACKAGE_MANAGER_ERROR_NONE)
694 if (package_manager_client_validate_handle(request))
695 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
698 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
701 request_id = pkgmgr_client_uninstall(request->pc, request->pkg_type,
702 name, request->mode, event_cb ? event_cb : request_event_handler, request);
704 if (request_id == PKGMGR_R_EINVAL)
705 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
706 else if (request_id == PKGMGR_R_ENOPKG)
707 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
708 else if (request_id == PKGMGR_R_ENOMEM)
709 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
710 else if (request_id == PKGMGR_R_EIO)
711 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
712 else if (request_id == PKGMGR_R_EPRIV)
713 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
714 else if (request_id == PKGMGR_R_ESYSTEM || request_id == PKGMGR_R_ECOMM || request_id == PKGMGR_R_ERROR)
715 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
720 return PACKAGE_MANAGER_ERROR_NONE;
723 static int __request_move(package_manager_request_h request,
724 const char *name, package_manager_move_type_e move_type,
725 pkgmgr_handler event_cb, int *id)
728 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
729 if (retval != PACKAGE_MANAGER_ERROR_NONE)
732 if (package_manager_client_validate_handle(request))
733 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
736 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
739 request_id = pkgmgr_client_request_service(PM_REQUEST_MOVE, move_type,
740 request->pc, request->pkg_type, name,
741 NULL, event_cb ? event_cb : request_event_handler, request);
743 if (request_id == PKGMGR_R_EINVAL)
744 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
745 else if (request_id == PKGMGR_R_ENOPKG)
746 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
747 else if (request_id == PKGMGR_R_ENOMEM)
748 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
749 else if (request_id == PKGMGR_R_EIO)
750 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
751 else if (request_id == PKGMGR_R_EPRIV)
752 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
753 else if (request_id == PKGMGR_R_ESYSTEM || request_id == PKGMGR_R_ECOMM || request_id == PKGMGR_R_ERROR)
754 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
759 return PACKAGE_MANAGER_ERROR_NONE;
762 static int __request_mount_install(package_manager_request_h request,
763 const char *path, pkgmgr_handler event_cb, int *id)
766 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
767 if (retval != PACKAGE_MANAGER_ERROR_NONE)
770 if (package_manager_client_validate_handle(request))
771 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
774 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
777 request_id = pkgmgr_client_mount_install(request->pc, request->pkg_type, NULL,
778 path, NULL, request->mode, event_cb ? event_cb : request_event_handler, request);
780 if (request_id == PKGMGR_R_EINVAL)
781 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
782 else if (request_id == PKGMGR_R_ENOPKG)
783 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
784 else if (request_id == PKGMGR_R_ENOMEM)
785 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
786 else if (request_id == PKGMGR_R_EIO)
787 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
788 else if (request_id == PKGMGR_R_EPRIV)
789 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
790 else if (request_id == PKGMGR_R_ESYSTEM || request_id == PKGMGR_R_ECOMM || request_id == PKGMGR_R_ERROR)
791 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
796 return PACKAGE_MANAGER_ERROR_NONE;
800 API int package_manager_request_install(package_manager_request_h request,
801 const char *path, int *id)
803 return __request_install(request, path, NULL, id);
806 API int package_manager_request_install_with_cb(package_manager_request_h request,
807 const char *path, package_manager_request_event_cb callback,
808 void *user_data, int *id)
813 if (request->request_cb_table == NULL)
814 __initialize_request_cb_table(request);
816 ret = __request_install(request, path, internal_request_callback, &req_id);
819 ret = __insert_request_cb_info(request, req_id, callback, user_data);
821 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
822 __FUNCTION__, "failed to create request cb info");
830 API int package_manager_request_uninstall(package_manager_request_h request,
831 const char *name, int *id)
833 return __request_uninstall(request, name, NULL, id);
836 API int package_manager_request_uninstall_with_cb(package_manager_request_h request,
837 const char *name, package_manager_request_event_cb callback,
838 void *user_data, int *id)
843 if (request->request_cb_table == NULL)
844 __initialize_request_cb_table(request);
846 ret = __request_uninstall(request, name, internal_request_callback, &req_id);
849 ret = __insert_request_cb_info(request, req_id, callback, user_data);
851 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
852 __FUNCTION__, "failed to create request cb info");
860 API int package_manager_request_move(package_manager_request_h request,
861 const char *name, package_manager_move_type_e move_type)
863 return __request_move(request, name, move_type, NULL, NULL);
866 API int package_manager_request_move_with_cb(package_manager_request_h request,
867 const char *name, package_manager_move_type_e move_type,
868 package_manager_request_event_cb callback, void *user_data, int *id)
873 if (request->request_cb_table == NULL)
874 __initialize_request_cb_table(request);
876 ret = __request_move(request, name, move_type, internal_request_callback, &req_id);
879 ret = __insert_request_cb_info(request, req_id, callback, user_data);
881 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
882 __FUNCTION__, "failed to create request cb info");
890 API int package_manager_request_mount_install(package_manager_request_h request,
891 const char *path, int *id)
893 return __request_mount_install(request, path, NULL, id);
896 API int package_manager_request_mount_install_with_cb(package_manager_request_h request,
897 const char *path, package_manager_request_event_cb callback,
898 void *user_data, int *id)
903 if (request->request_cb_table == NULL)
904 __initialize_request_cb_table(request);
906 ret = __request_mount_install(request, path, internal_request_callback, &req_id);
909 ret = __insert_request_cb_info(request, req_id, callback, user_data);
911 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
912 __FUNCTION__, "failed to create request cb info");
920 API int package_manager_create(package_manager_h *manager)
923 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
924 if (retval != PACKAGE_MANAGER_ERROR_NONE)
927 struct package_manager_s *package_manager = NULL;
929 if (manager == NULL) {
931 package_manager_error
932 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
936 package_manager = calloc(1, sizeof(struct package_manager_s));
937 if (package_manager == NULL) {
939 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
941 "failed to create a package_manager handle");
944 package_manager->ctype = PC_LISTENING;
945 package_manager->pc = pkgmgr_client_new(PC_LISTENING);
946 if (package_manager->pc == NULL) {
947 free(package_manager);
949 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
951 "failed to create a package_manager client");
954 package_manager->handle_id = package_manager_new_id();
956 *manager = package_manager;
958 return PACKAGE_MANAGER_ERROR_NONE;
961 static int package_manager_validate_handle(package_manager_h manager)
963 if (manager == NULL || manager->pc == NULL)
964 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
966 return PACKAGE_MANAGER_ERROR_NONE;
969 API int package_manager_destroy(package_manager_h manager)
971 if (package_manager_validate_handle(manager)) {
973 package_manager_error
974 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
978 pkgmgr_client_free(manager->pc);
979 g_hash_table_destroy(manager->event_info_table);
982 return PACKAGE_MANAGER_ERROR_NONE;
985 /* App Event Listening Policy:
986 * +----------------+------------+---------------+------------------+
987 * |Listener \ Type |Global Event|My User's Event|Other user's Event|
988 * +----------------+------------+---------------+------------------+
989 * |User Process App| Grant | Grant | Deny |
990 * +----------------+------------+---------------+------------------+
991 * |Platform module | Grant | Grant | Grant |
992 * +----------------+------------+---------------+------------------+
993 * UID assignment policy:
994 * https://wiki.tizen.org/wiki/Security/User_and_group_ID_assignment_policy
996 #define REGULAR_USER 5000
997 static int __validate_event_signal(uid_t target_uid)
999 uid_t self = getuid();
1001 if (self == target_uid)
1004 if (self < REGULAR_USER)
1010 static int internal_callback(uid_t target_uid, int req_id, const char *pkg_type,
1011 const char *pkg_name, const char *key,
1012 const char *val, const void *pmsg, void *data)
1015 package_manager_event_type_e event_type = -1;
1016 struct package_manager_event_info *info = NULL;
1017 package_manager_h manager = data;
1018 uid_t uid = target_uid;
1020 _LOGD("req_id(%d), pkg_name(%s), type(%s), key(%s), val(%s)",
1021 req_id, pkg_name, pkg_type, key, val);
1023 if (target_uid == GLOBAL_USER)
1026 if (__validate_event_signal(uid))
1027 return PACKAGE_MANAGER_ERROR_NONE;
1029 if (manager && manager->event_info_table) {
1030 info = g_hash_table_lookup(manager->event_info_table, pkg_name);
1032 _LOGE("invalid handle");
1033 return PACKAGE_MANAGER_ERROR_NONE;
1037 if (strcasecmp(key, "start") != 0) {
1038 _LOGD("unexpected signal or no info(removed)");
1039 return PACKAGE_MANAGER_ERROR_NONE;
1043 if (strcasecmp(key, "start") == 0) {
1044 ret = package_manager_get_event_type(val, &event_type);
1045 if (ret != PACKAGE_MANAGER_ERROR_NONE)
1046 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
1049 __insert_event_info(manager, pkg_name, event_type,
1050 PACKAGE_MANAGER_EVENT_STATE_STARTED);
1052 if (manager->event_cb && getuid() == uid)
1053 manager->event_cb(pkg_type, pkg_name,
1055 PACKAGE_MANAGER_EVENT_STATE_STARTED,
1057 PACKAGE_MANAGER_ERROR_NONE,
1058 manager->user_data);
1060 _LOGE("unexpected start event");
1062 } else if (strcasecmp(key, "install_percent") == 0
1063 || strcasecmp(key, "progress_percent") == 0) {
1064 info->event_state = PACKAGE_MANAGER_EVENT_STATE_PROCESSING;
1065 if (manager->event_cb && getuid() == uid)
1066 manager->event_cb(pkg_type, pkg_name,
1070 PACKAGE_MANAGER_ERROR_NONE,
1071 manager->user_data);
1072 } else if (strcasecmp(key, "error") == 0) {
1073 info->event_state = PACKAGE_MANAGER_EVENT_STATE_FAILED;
1074 if (manager->event_cb && getuid() == uid)
1075 manager->event_cb(pkg_type, pkg_name,
1079 PACKAGE_MANAGER_ERROR_NONE,
1080 manager->user_data);
1081 } else if (strcasecmp(key, "end") == 0) {
1082 if (info->event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
1083 if (manager->event_cb && getuid() == uid) {
1084 if (strcasecmp(val, "ok") == 0) {
1085 manager->event_cb(pkg_type, pkg_name,
1087 PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
1089 PACKAGE_MANAGER_ERROR_NONE,
1090 manager->user_data);
1092 manager->event_cb(pkg_type, pkg_name,
1094 PACKAGE_MANAGER_EVENT_STATE_FAILED,
1096 PACKAGE_MANAGER_ERROR_NONE,
1097 manager->user_data);
1101 g_hash_table_remove(manager->event_info_table, info->pkg_name);
1104 return PACKAGE_MANAGER_ERROR_NONE;
1107 static int __convert_status_type(package_manager_status_type_e status_type)
1111 if (status_type == PACKAGE_MANAGER_STATUS_TYPE_ALL)
1112 return PKGMGR_CLIENT_STATUS_ALL;
1114 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_INSTALL)
1115 type |= PKGMGR_CLIENT_STATUS_INSTALL;
1116 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_UNINSTALL)
1117 type |= PKGMGR_CLIENT_STATUS_UNINSTALL;
1118 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_UPGRADE)
1119 type |= PKGMGR_CLIENT_STATUS_UPGRADE;
1120 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_MOVE)
1121 type |= PKGMGR_CLIENT_STATUS_MOVE;
1122 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_CLEAR_DATA)
1123 type |= PKGMGR_CLIENT_STATUS_CLEAR_DATA;
1124 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_INSTALL_PROGRESS)
1125 type |= PKGMGR_CLIENT_STATUS_INSTALL_PROGRESS;
1126 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_GET_SIZE)
1127 type |= PKGMGR_CLIENT_STATUS_GET_SIZE;
1132 API int package_manager_set_event_status(package_manager_h manager, int status_type)
1136 int type_all = PACKAGE_MANAGER_STATUS_TYPE_INSTALL |
1137 PACKAGE_MANAGER_STATUS_TYPE_UNINSTALL |
1138 PACKAGE_MANAGER_STATUS_TYPE_UPGRADE |
1139 PACKAGE_MANAGER_STATUS_TYPE_MOVE |
1140 PACKAGE_MANAGER_STATUS_TYPE_CLEAR_DATA |
1141 PACKAGE_MANAGER_STATUS_TYPE_INSTALL_PROGRESS |
1142 PACKAGE_MANAGER_STATUS_TYPE_GET_SIZE;
1144 if (manager == NULL)
1145 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1147 if (status_type < 0 || status_type > type_all)
1148 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1150 type = __convert_status_type(status_type);
1151 retval = pkgmgr_client_set_status_type(manager->pc, type);
1154 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1156 return PACKAGE_MANAGER_ERROR_NONE;
1159 API int package_manager_set_event_cb(package_manager_h manager,
1160 package_manager_event_cb callback,
1165 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1166 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1169 if (package_manager_validate_handle(manager)) {
1171 package_manager_error
1172 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1176 manager->event_cb = callback;
1177 manager->user_data = user_data;
1179 retval = pkgmgr_client_listen_status(manager->pc,
1180 internal_callback, manager);
1182 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR,
1183 __FUNCTION__, NULL);
1186 if (!manager->event_info_table) {
1187 manager->event_info_table =
1188 g_hash_table_new_full(g_str_hash, g_str_equal,
1189 NULL, __free_event_info);
1192 return PACKAGE_MANAGER_ERROR_NONE;
1195 API int package_manager_unset_event_cb(package_manager_h manager)
1197 if (manager == NULL) {
1199 package_manager_error
1200 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1205 manager->event_cb = NULL;
1206 manager->user_data = NULL;
1208 g_hash_table_remove_all(manager->event_info_table);
1210 retval = pkgmgr_client_remove_listen_status(manager->pc);
1211 if (retval == PKGMGR_R_EINVAL)
1213 package_manager_error
1214 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1216 else if (retval == PKGMGR_R_ERROR)
1218 package_manager_error
1219 (PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__,
1222 return PACKAGE_MANAGER_ERROR_NONE;
1225 API int package_manager_get_package_id_by_app_id(const char *app_id, char **package_id)
1227 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo;
1229 char *pkg_id = NULL;
1230 char *pkg_id_dup = NULL;
1232 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1233 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1236 if (app_id == NULL || package_id == NULL)
1237 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1239 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1240 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1241 retval = pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id);
1242 if (retval != PMINFO_R_OK) {
1243 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1244 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1247 pkg_id_dup = strdup(pkg_id);
1248 if (pkg_id_dup == NULL) {
1249 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1250 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1253 *package_id = pkg_id_dup;
1255 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1257 return PACKAGE_MANAGER_ERROR_NONE;
1260 API int package_manager_get_package_info(const char *package_id, package_info_h *package_info)
1263 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1264 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1267 retval = package_info_get_package_info(package_id, package_info);
1269 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1270 return package_manager_error(retval, __FUNCTION__, NULL);
1272 return PACKAGE_MANAGER_ERROR_NONE;
1275 API int package_manager_foreach_package_info(package_manager_package_info_cb callback,
1280 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1281 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1284 retval = package_info_foreach_package_info(callback, user_data);
1286 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1287 return package_manager_error(retval, __FUNCTION__, NULL);
1289 return PACKAGE_MANAGER_ERROR_NONE;
1292 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)
1294 pkgmgrinfo_cert_compare_result_type_e result;
1296 if (lhs_package_id == NULL || rhs_package_id == NULL || compare_result == NULL)
1297 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1298 if (pkgmgrinfo_pkginfo_compare_pkg_cert_info(lhs_package_id, rhs_package_id, &result) != PKGMGR_R_OK)
1299 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1300 *compare_result = (package_manager_compare_result_type_e)result;
1302 return PACKAGE_MANAGER_ERROR_NONE;
1305 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)
1307 pkgmgrinfo_cert_compare_result_type_e result;
1309 if (lhs_app_id == NULL || rhs_app_id == NULL || compare_result == NULL)
1310 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1311 if (pkgmgrinfo_pkginfo_compare_app_cert_info(lhs_app_id, rhs_app_id, &result) != PKGMGR_R_OK)
1312 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1314 *compare_result = (package_manager_compare_result_type_e)result;
1316 return PACKAGE_MANAGER_ERROR_NONE;
1319 API int package_manager_is_preload_package_by_app_id(const char *app_id, bool *preload)
1323 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1324 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1327 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo = NULL;
1328 pkgmgrinfo_pkginfo_h pkgmgrinfo_pkginfo = NULL;
1330 char *pkg_id = NULL;
1331 bool is_preload = 0;
1332 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1333 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1335 retval = pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id);
1336 if (retval != PMINFO_R_OK) {
1337 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1338 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1340 if (pkgmgrinfo_pkginfo_get_pkginfo(pkg_id, &pkgmgrinfo_pkginfo) != PMINFO_R_OK) {
1341 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1342 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1343 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1345 if (pkgmgrinfo_pkginfo_is_preload(pkgmgrinfo_pkginfo, &is_preload) != PMINFO_R_OK) {
1346 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1347 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1348 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1356 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1357 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1359 return PACKAGE_MANAGER_ERROR_NONE;
1362 API int package_manager_get_permission_type(const char *app_id, package_manager_permission_type_e *permission_type)
1366 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1367 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1370 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo = NULL;
1371 pkgmgrinfo_permission_type permission = 0;
1372 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1373 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1374 retval = pkgmgrinfo_appinfo_get_permission_type(pkgmgrinfo_appinfo, &permission);
1375 if (retval != PMINFO_R_OK) {
1376 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1377 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1380 if (permission == PMINFO_PERMISSION_NORMAL)
1381 *permission_type = PACKAGE_MANAGER_PERMISSION_NORMAL;
1382 else if (permission == PMINFO_PERMISSION_SIGNATURE)
1383 *permission_type = PACKAGE_MANAGER_PERMISSION_SIGNATURE;
1384 else if (permission == PMINFO_PERMISSION_PRIVILEGE)
1385 *permission_type = PACKAGE_MANAGER_PERMISSION_PRIVILEGE;
1387 *permission_type = PACKAGE_MANAGER_PERMISSION_NORMAL;
1389 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1390 return PACKAGE_MANAGER_ERROR_NONE;
1393 API int package_manager_clear_cache_dir(const char *package_id)
1397 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_CACHE);
1398 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1401 int res = pkgmgr_client_clear_cache_dir(package_id);
1402 if (res == PKGMGR_R_EINVAL) {
1403 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1404 } else if (res == PKGMGR_R_ENOPKG) {
1405 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1406 } else if (res == PKGMGR_R_ENOMEM) {
1407 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1408 } else if (res == PKGMGR_R_EIO) {
1409 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1410 } else if (res == PKGMGR_R_EPRIV) {
1411 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
1412 } else if (res == PKGMGR_R_ESYSTEM || res == PKGMGR_R_ECOMM || res == PKGMGR_R_ERROR) {
1413 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1414 } else if (res != PKGMGR_R_OK) {
1415 _LOGE("Unexpected error");
1416 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1419 return PACKAGE_MANAGER_ERROR_NONE;
1422 API int package_manager_clear_data_dir(const char *package_id)
1425 pkgmgr_client *pc = NULL;
1426 char *pkg_type = NULL;
1427 pkgmgrinfo_pkginfo_h pkginfo = NULL;
1429 if (package_id == NULL)
1430 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
1432 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
1433 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1436 retval = pkgmgrinfo_pkginfo_get_pkginfo(package_id, &pkginfo);
1437 if (retval == PMINFO_R_ENOENT)
1438 return PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE;
1439 else if (retval != PMINFO_R_OK || pkginfo == NULL)
1440 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
1442 retval = pkgmgrinfo_pkginfo_get_type(pkginfo, &pkg_type);
1443 if (retval != PMINFO_R_OK || pkg_type == NULL) {
1444 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
1445 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
1448 pc = pkgmgr_client_new(PC_REQUEST);
1450 _LOGE("Out of memory");
1451 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
1452 return PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY;
1455 retval = pkgmgr_client_clear_user_data(pc, pkg_type, package_id, PM_QUIET);
1456 pkgmgr_client_free(pc);
1457 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
1459 if (retval == PKGMGR_R_EINVAL) {
1460 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1461 } else if (retval == PKGMGR_R_ENOPKG) {
1462 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1463 } else if (retval == PKGMGR_R_ENOMEM) {
1464 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1465 } else if (retval == PKGMGR_R_EIO) {
1466 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1467 } else if (retval == PKGMGR_R_EPRIV) {
1468 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
1469 } else if (retval == PKGMGR_R_ESYSTEM || retval == PKGMGR_R_ECOMM || retval == PKGMGR_R_ERROR) {
1470 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1471 } else if (retval != PKGMGR_R_OK) {
1472 _LOGE("Unexpected error");
1473 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1476 return PACKAGE_MANAGER_ERROR_NONE;
1479 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)
1668 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1669 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1672 if ((handle == NULL) || (count == NULL))
1673 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1675 retval = pkgmgrinfo_pkginfo_filter_count(handle, count);
1677 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1679 return PACKAGE_MANAGER_ERROR_NONE;
1682 API int package_manager_filter_foreach_package_info(package_manager_filter_h handle,
1683 package_manager_package_info_cb callback, void *user_data)
1687 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1688 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1691 retval = package_info_filter_foreach_package_info(handle, callback, user_data);
1693 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1694 return package_manager_error(retval, __FUNCTION__, NULL);
1696 return PACKAGE_MANAGER_ERROR_NONE;
1699 API int package_size_info_get_data_size(package_size_info_h handle, long long *data_size)
1702 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1704 package_size_info_t *size_info = (package_size_info_t *)handle;
1706 *data_size = (long long)size_info->data_size;
1707 return PACKAGE_MANAGER_ERROR_NONE;
1710 API int package_size_info_get_cache_size(package_size_info_h handle, long long *cache_size)
1713 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1715 package_size_info_t *size_info = (package_size_info_t *)handle;
1717 *cache_size = size_info->cache_size;
1718 return PACKAGE_MANAGER_ERROR_NONE;
1721 API int package_size_info_get_app_size(package_size_info_h handle, long long *app_size)
1724 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1726 package_size_info_t *size_info = (package_size_info_t *)handle;
1727 *app_size = size_info->app_size;
1728 return PACKAGE_MANAGER_ERROR_NONE;
1731 API int package_size_info_get_external_data_size(package_size_info_h handle, long long *ext_data_size)
1734 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
1736 package_size_info_t *size_info = (package_size_info_t *)handle;
1737 *ext_data_size = size_info->external_data_size;
1738 return PACKAGE_MANAGER_ERROR_NONE;
1741 API int package_size_info_get_external_cache_size(package_size_info_h handle, long long *ext_cache_size)
1744 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1746 package_size_info_t *size_info = (package_size_info_t *)handle;
1747 *ext_cache_size = size_info->external_cache_size;
1748 return PACKAGE_MANAGER_ERROR_NONE;
1751 API int package_size_info_get_external_app_size(package_size_info_h handle, long long *ext_app_size)
1754 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1756 package_size_info_t *size_info = (package_size_info_t *)handle;
1757 *ext_app_size = size_info->external_app_size;
1758 return PACKAGE_MANAGER_ERROR_NONE;
1761 API int package_manager_updateinfo_set_pkgid(package_updateinfo_request_h pkg_updateinfo_req, const char *pkgid)
1763 struct package_updateinfo_request_s *request;
1765 if (pkg_updateinfo_req == NULL || pkg_updateinfo_req->updateinfo_handle == NULL || pkgid == NULL)
1766 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1768 request = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1769 if (request->updateinfo_handle->pkgid)
1770 free(request->updateinfo_handle->pkgid);
1771 request->updateinfo_handle->pkgid = strdup(pkgid);
1772 if (request->updateinfo_handle->pkgid == NULL)
1773 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1775 return PACKAGE_MANAGER_ERROR_NONE;
1778 API int package_manager_updateinfo_set_version(package_updateinfo_request_h pkg_updateinfo_req, const char *version)
1780 struct package_updateinfo_request_s *request;
1782 if (pkg_updateinfo_req == NULL || pkg_updateinfo_req->updateinfo_handle == NULL || version == NULL)
1783 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1785 request = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1786 if (request->updateinfo_handle->version)
1787 free(request->updateinfo_handle->version);
1788 request->updateinfo_handle->version = strdup(version);
1789 if (request->updateinfo_handle->version == NULL)
1790 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1792 return PACKAGE_MANAGER_ERROR_NONE;
1795 static int package_manager_updateinfo_convert_property(package_updateinfo_type_e property, pkgmgr_updateinfo_type *converted_property)
1797 if (converted_property == NULL)
1800 if (property == PACKAGE_UPDATEINFO_TYPE_FORCE)
1801 *converted_property = PM_UPDATEINFO_TYPE_FORCE;
1802 else if (property == PACKAGE_UPDATEINFO_TYPE_OPTIONAL)
1803 *converted_property = PM_UPDATEINFO_TYPE_OPTIONAL;
1804 else if (property == PACKAGE_UPDATEINFO_TYPE_NONE)
1805 *converted_property = PM_UPDATEINFO_TYPE_NONE;
1812 API int package_manager_updateinfo_set_type(package_updateinfo_request_h pkg_updateinfo_req, package_updateinfo_type_e type)
1815 pkgmgr_updateinfo_type converted_type;
1816 struct package_updateinfo_request_s *request;
1818 if (pkg_updateinfo_req == NULL || pkg_updateinfo_req->updateinfo_handle == NULL)
1819 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1821 request = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1822 retval = package_manager_updateinfo_convert_property(type, &converted_type);
1824 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1826 request->updateinfo_handle->type = converted_type;
1827 return PACKAGE_MANAGER_ERROR_NONE;
1830 API int package_manager_updateinfo_request_destroy(package_updateinfo_request_h pkg_updateinfo_req)
1832 struct package_updateinfo_request_s *request;
1834 if (pkg_updateinfo_req == NULL)
1835 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1837 request = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1839 pkgmgr_client_free(request->pc);
1841 if (request->updateinfo_handle) {
1842 if (request->updateinfo_handle->pkgid)
1843 free(request->updateinfo_handle->pkgid);
1844 if (request->updateinfo_handle->version)
1845 free(request->updateinfo_handle->version);
1846 free(request->updateinfo_handle);
1850 return PACKAGE_MANAGER_ERROR_NONE;
1853 API int package_manager_updateinfo_request_create(package_updateinfo_request_h *pkg_updateinfo_req)
1855 struct package_updateinfo_request_s *request;
1856 pkg_update_info_t *update_info;
1858 if (pkg_updateinfo_req == NULL)
1859 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1861 request = calloc(1, sizeof(struct package_updateinfo_request_s));
1862 if (request == NULL)
1863 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1865 request->pc = pkgmgr_client_new(PC_REQUEST);
1866 if (request->pc == NULL) {
1868 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1871 update_info = calloc(1, sizeof(pkg_update_info_t));
1872 if (update_info == NULL) {
1873 pkgmgr_client_free(request->pc);
1875 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1877 request->updateinfo_handle = update_info;
1879 *pkg_updateinfo_req = request;
1880 return PACKAGE_MANAGER_ERROR_NONE;
1883 API int package_manager_updateinfo_request_register(package_updateinfo_request_h pkg_updateinfo_req)
1885 struct package_updateinfo_request_s *update_info;
1888 if (pkg_updateinfo_req == NULL)
1889 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1890 update_info = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1892 retval = pkgmgr_client_register_pkg_update_info(update_info->pc, update_info->updateinfo_handle);
1893 if (retval == PKGMGR_R_EINVAL)
1894 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1896 return PACKAGE_MANAGER_ERROR_NONE;
1899 API int package_manager_updateinfo_request_unregister(package_updateinfo_request_h pkg_updateinfo_req, const char *pkgid)
1902 struct package_updateinfo_request_s *update_info;
1904 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
1905 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1908 if (pkg_updateinfo_req == NULL || pkgid == NULL)
1909 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1911 update_info = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1912 retval = pkgmgr_client_unregister_pkg_update_info(update_info->pc, pkgid);
1913 if (retval != PMINFO_R_OK)
1914 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1916 return PACKAGE_MANAGER_ERROR_NONE;
1919 API int package_manager_updateinfo_request_unregister_all(package_updateinfo_request_h pkg_updateinfo_req)
1922 struct package_updateinfo_request_s *update_info;
1924 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
1925 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1928 if (pkg_updateinfo_req == NULL)
1929 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1931 update_info = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1932 retval = pkgmgr_client_unregister_all_pkg_update_info(update_info->pc);
1934 if (retval != PMINFO_R_OK)
1935 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1937 return PACKAGE_MANAGER_ERROR_NONE;