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_installer_error.h>
25 #include <pkgmgr-info.h>
26 #include <tzplatform_config.h>
28 #include "package_manager.h"
29 #include "package_manager_internal.h"
31 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
32 #define USER_HOME tzplatform_getenv(TZ_USER_HOME)
34 #define PRIV_SHARED_RES "priv_shared_res"
36 typedef struct _request_event_info {
38 package_manager_event_type_e event_type;
39 package_manager_event_state_e event_state;
40 struct _request_event_info *next;
43 struct package_manager_event_info {
45 package_manager_event_type_e event_type;
46 package_manager_event_state_e event_state;
49 struct package_manager_s {
51 pkgmgr_client_type ctype;
54 GHashTable *event_info_table;
55 package_manager_event_cb event_cb;
56 package_manager_res_event_cb res_event_cb;
61 struct package_manager_request_s {
63 pkgmgr_client_type ctype;
67 request_event_info *head;
68 package_manager_request_event_cb event_cb;
69 GHashTable *request_cb_table;
74 struct package_manager_request_cb_info {
76 package_manager_request_event_cb callback;
77 package_manager_request_res_event_cb res_callback;
81 typedef struct package_size_info {
86 long long external_data_size;
87 long long external_cache_size;
88 long long external_app_size;
89 } package_size_info_t;
91 struct package_manager_filter_s {
92 pkgmgrinfo_pkginfo_filter_h pkgmgrinfo_pkginfo_filter;
95 struct package_updateinfo_request_s {
97 pkg_update_info_t *updateinfo_handle;
100 struct package_manager_res_event_info_s {
101 pkgmgr_res_event_info *res_event_info_handle;
104 static int package_manager_request_new_id()
106 static int request_handle_id = 0;
107 return request_handle_id++;
110 static int package_manager_new_id()
112 static int manager_handle_id = 0;
113 return manager_handle_id++;
116 static void __clean_all_event_info(request_event_info *head)
118 request_event_info *current = head;
119 request_event_info *prev;
126 current = current->next;
131 static int __insert_event_info(package_manager_h manager, const char *pkg_name,
132 package_manager_event_type_e event_type,
133 package_manager_event_state_e event_state)
135 struct package_manager_event_info *info;
137 info = calloc(1, sizeof(struct package_manager_event_info));
140 info->pkg_name = strdup(pkg_name);
141 info->event_type = event_type;
142 info->event_state = event_state;
143 g_hash_table_insert(manager->event_info_table, info->pkg_name, info);
148 static void __free_event_info(gpointer data)
150 struct package_manager_event_info *info =
151 (struct package_manager_event_info *)data;
157 free(info->pkg_name);
160 _LOGD("event_info removed");
163 static void __free_request_cb_info(gpointer data)
166 struct package_manager_request_cb_info *cb_info =
167 (struct package_manager_request_cb_info *)data;
169 req_id = cb_info->req_id;
173 _LOGD("request callback info removed, req_id(%d)", req_id);
176 static void __initialize_request_cb_table(package_manager_request_h request)
178 request->request_cb_table =
179 g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, __free_request_cb_info);
182 static int __insert_request_cb_info(package_manager_request_h request, int req_id,
183 package_manager_request_event_cb callback, void *user_data)
185 struct package_manager_request_cb_info *cb_info;
187 if (request->request_cb_table == NULL)
190 cb_info = calloc(1, sizeof(struct package_manager_request_cb_info));
193 cb_info->req_id = req_id;
194 cb_info->callback = callback;
195 cb_info->user_data = user_data;
196 _LOGD("insert req_id(%d)", req_id);
197 g_hash_table_insert(request->request_cb_table, GINT_TO_POINTER(cb_info->req_id), cb_info);
202 static int __insert_res_request_cb_info(package_manager_request_h request,
203 int req_id, package_manager_request_res_event_cb callback,
206 struct package_manager_request_cb_info *cb_info;
208 if (request->request_cb_table == NULL)
211 cb_info = calloc(1, sizeof(struct package_manager_request_cb_info));
214 cb_info->req_id = req_id;
215 cb_info->res_callback = callback;
216 cb_info->user_data = user_data;
217 _LOGD("insert req_id(%d)", req_id);
218 g_hash_table_insert(request->request_cb_table, GINT_TO_POINTER(cb_info->req_id), cb_info);
223 API int package_manager_request_create(package_manager_request_h *request)
225 struct package_manager_request_s *package_manager_request;
227 if (request == NULL) {
229 package_manager_error
230 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
234 package_manager_request =
235 calloc(1, sizeof(struct package_manager_request_s));
236 if (package_manager_request == NULL) {
238 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
240 "failed to create a package_manager handle");
243 package_manager_request->ctype = PC_REQUEST;
244 package_manager_request->pc = pkgmgr_client_new(PC_REQUEST);
245 if (package_manager_request->pc == NULL) {
246 free(package_manager_request);
248 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
250 "failed to create a package_manager client");
253 package_manager_request->handle_id = package_manager_request_new_id();
255 *request = package_manager_request;
257 return PACKAGE_MANAGER_ERROR_NONE;
260 static int package_manager_client_validate_handle(package_manager_request_h
263 if (request == NULL || request->pc == NULL)
264 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
266 return PACKAGE_MANAGER_ERROR_NONE;
269 API int package_manager_request_destroy(package_manager_request_h request)
271 if (package_manager_client_validate_handle(request)) {
273 package_manager_error
274 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
278 pkgmgr_client_free(request->pc);
280 free(request->pkg_type);
281 __clean_all_event_info(request->head);
282 if (request->request_cb_table) {
283 g_hash_table_destroy(request->request_cb_table);
284 request->request_cb_table = NULL;
288 return PACKAGE_MANAGER_ERROR_NONE;
291 static int __reset_user_request_callback(package_manager_request_h request,
292 package_manager_request_event_cb callback, void *user_data)
294 if (package_manager_client_validate_handle(request))
295 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
297 request->event_cb = callback;
298 request->user_data = user_data;
300 return PACKAGE_MANAGER_ERROR_NONE;
303 API int package_manager_request_set_event_cb(package_manager_request_h request,
304 package_manager_request_event_cb
305 callback, void *user_data)
309 if (package_manager_client_validate_handle(request))
310 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER,
313 ret = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
314 if (ret != PACKAGE_MANAGER_ERROR_NONE)
317 return __reset_user_request_callback(request, callback, user_data);
320 API int package_manager_request_unset_event_cb(package_manager_request_h request)
322 if (package_manager_client_validate_handle(request))
323 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
325 request->event_cb = NULL;
326 request->user_data = NULL;
328 return PACKAGE_MANAGER_ERROR_NONE;
331 API int package_manager_request_set_type(package_manager_request_h request,
332 const char *pkg_type)
334 if (package_manager_client_validate_handle(request)) {
336 package_manager_error
337 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
341 if (request->pkg_type)
342 free(request->pkg_type);
343 request->pkg_type = strdup(pkg_type);
345 return PACKAGE_MANAGER_ERROR_NONE;
348 API int package_manager_request_set_mode(package_manager_request_h request,
349 package_manager_request_mode_e mode)
351 if (package_manager_client_validate_handle(request)) {
353 package_manager_error
354 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
358 /* request mode is not used anymore */
360 return PACKAGE_MANAGER_ERROR_NONE;
363 API int package_manager_request_set_tep(package_manager_request_h request,
364 const char *tep_path)
368 if (package_manager_client_validate_handle(request) || tep_path == NULL) {
370 package_manager_error
371 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
375 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
376 if (retval != PACKAGE_MANAGER_ERROR_NONE)
379 if (pkgmgr_client_set_tep_path(request->pc, tep_path, true))
380 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
382 return PACKAGE_MANAGER_ERROR_NONE;
385 static int package_manager_get_event_type(const char *key,
386 package_manager_event_type_e *
390 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
392 if (strcasecmp(key, PKGMGR_INSTALLER_INSTALL_EVENT_STR) == 0)
393 *event_type = PACKAGE_MANAGER_EVENT_TYPE_INSTALL;
394 else if (strcasecmp(key, PKGMGR_INSTALLER_UNINSTALL_EVENT_STR) == 0)
395 *event_type = PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL;
396 else if (strcasecmp(key, PKGMGR_INSTALLER_UPGRADE_EVENT_STR) == 0)
397 *event_type = PACKAGE_MANAGER_EVENT_TYPE_UPDATE;
398 else if (strcasecmp(key, PKGMGR_INSTALLER_MOVE_EVENT_STR) == 0)
399 *event_type = PACKAGE_MANAGER_EVENT_TYPE_MOVE;
400 else if (strcasecmp(key, PKGMGR_INSTALLER_CLEAR_EVENT_STR) == 0)
401 *event_type = PACKAGE_MANAGER_EVENT_TYPE_CLEAR;
402 else if (strcasecmp(key, PKGMGR_INSTALLER_RES_COPY_EVENT_STR) == 0)
403 *event_type = PACKAGE_MANAGER_EVENT_TYPE_RES_COPY;
404 else if (strcasecmp(key, PKGMGR_INSTALLER_RES_CREATE_DIR_EVENT_STR) == 0)
405 *event_type = PACKAGE_MANAGER_EVENT_TYPE_RES_CREATE_DIR;
406 else if (strcasecmp(key, PKGMGR_INSTALLER_RES_REMOVE_EVENT_STR) == 0)
407 *event_type = PACKAGE_MANAGER_EVENT_TYPE_RES_REMOVE;
408 else if (strcasecmp(key, PKGMGR_INSTALLER_RES_UNINSTALL_EVENT_STR) == 0)
409 *event_type = PACKAGE_MANAGER_EVENT_TYPE_RES_UNINSTALL;
411 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
413 return PACKAGE_MANAGER_ERROR_NONE;
416 static package_manager_error_e __convert_to_error(int errcode)
419 case PKGMGR_INSTALLER_ERRCODE_UNDEFINED_ERROR:
420 case PKGMGR_INSTALLER_ERRCODE_GLOBALSYMLINK_ERROR:
421 case PKGMGR_INSTALLER_ERRCODE_GRANT_PERMISSION_ERROR:
422 case PKGMGR_INSTALLER_ERRCODE_IMAGE_ERROR:
423 case PKGMGR_INSTALLER_ERRCODE_PARSE_ERROR:
424 case PKGMGR_INSTALLER_ERRCODE_RECOVERY_ERROR:
425 case PKGMGR_INSTALLER_ERRCODE_DELTA_ERROR:
426 case PKGMGR_INSTALLER_ERRCODE_APP_DIR_ERROR:
427 case PKGMGR_INSTALLER_ERRCODE_CONFIG_ERROR:
428 case PKGMGR_INSTALLER_ERRCODE_ICON_ERROR:
429 case PKGMGR_INSTALLER_ERRCODE_MANIFEST_ERROR:
430 case PKGMGR_INSTALLER_ERRCODE_OUT_OF_SPACE:
431 case PKGMGR_INSTALLER_ERRCODE_ERROR:
432 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
433 case PKGMGR_INSTALLER_ERRCODE_UNZIP_ERROR:
434 case PKGMGR_INSTALLER_ERRCODE_SECURITY_ERROR:
435 case PKGMGR_INSTALLER_ERRCODE_REGISTER_ERROR:
436 case PKGMGR_INSTALLER_ERRCODE_PRIVILEGE_ERROR:
437 case PKGMGR_INSTALLER_ERRCODE_SIGNATURE_ERROR:
438 case PKGMGR_INSTALLER_ERRCODE_SIGNATURE_INVALID:
439 case PKGMGR_INSTALLER_ERRCODE_CERT_ERROR:
440 case PKGMGR_INSTALLER_ERRCODE_AUTHOR_CERT_NOT_MATCH:
441 case PKGMGR_INSTALLER_ERRCODE_AUTHOR_CERT_NOT_FOUND:
442 case PKGMGR_INSTALLER_ERRCODE_ICON_NOT_FOUND:
443 case PKGMGR_INSTALLER_ERRCODE_MANIFEST_NOT_FOUND:
444 return PACKAGE_MANAGER_ERROR_IO_ERROR;
445 case PKGMGR_INSTALLER_ERRCODE_PACKAGE_NOT_FOUND:
446 return PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE;
447 case PKGMGR_INSTALLER_ERRCODE_OPERATION_NOT_ALLOWED:
448 return PACKAGE_MANAGER_ERROR_PERMISSION_DENIED;
449 case PKGMGR_INSTALLER_ERRCODE_INVALID_VALUE:
450 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
451 case PKGMGR_INSTALLER_ERRCODE_OK:
452 return PACKAGE_MANAGER_ERROR_NONE;
454 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
458 static package_manager_error_e __convert_str_to_error(const char *val)
460 int errcode = atoi(val);
462 return __convert_to_error(errcode);
465 static int __add_event_info(request_event_info **head, int req_id,
466 package_manager_event_type_e event_type,
467 package_manager_event_state_e event_state)
469 request_event_info *evt_info;
470 request_event_info *current;
471 request_event_info *prev;
473 evt_info = (request_event_info *) calloc(1, sizeof(request_event_info));
474 if (evt_info == NULL) {
475 _LOGD("calloc failed");
478 evt_info->req_id = req_id;
479 evt_info->event_type = event_type;
480 evt_info->event_state = event_state;
481 evt_info->next = NULL;
486 current = prev = *head;
489 current = current->next;
492 prev->next = evt_info;
498 static int __find_event_info(request_event_info **head, int req_id,
499 package_manager_event_type_e *event_type,
500 package_manager_event_state_e *event_state)
502 request_event_info *tmp;
507 _LOGE("tmp is NULL");
512 if (tmp->req_id == req_id) {
513 *event_type = tmp->event_type;
514 *event_state = tmp->event_state;
522 static int __update_event_info(request_event_info **head, int req_id,
523 package_manager_event_type_e event_type,
524 package_manager_event_state_e event_state)
526 package_manager_event_type_e evt_type;
527 package_manager_event_state_e evt_state;
528 request_event_info *tmp;
530 if (__find_event_info(head, req_id, &evt_type, &evt_state) != 0)
531 __add_event_info(head, req_id, event_type, event_state);
536 _LOGE("tmp is NULL");
541 if (tmp->req_id == req_id) {
542 tmp->event_type = event_type;
543 tmp->event_state = event_state;
553 static int request_event_handler(uid_t target_uid, int req_id, const char *pkg_type,
554 const char *pkg_name, const char *key,
555 const char *val, const void *pmsg, void *data)
558 package_manager_event_type_e event_type = -1;
559 package_manager_event_state_e event_state = -1;
561 package_manager_request_h request = data;
563 if (strcasecmp(key, "start") == 0) {
564 ret = package_manager_get_event_type(val, &event_type);
565 if (ret != PACKAGE_MANAGER_ERROR_NONE)
566 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
568 __add_event_info(&(request->head), req_id, event_type,
569 PACKAGE_MANAGER_EVENT_STATE_STARTED);
571 if (request->event_cb)
572 request->event_cb(req_id, pkg_type, pkg_name,
574 PACKAGE_MANAGER_EVENT_STATE_STARTED,
575 0, PACKAGE_MANAGER_ERROR_NONE, request->user_data);
577 } else if (strcasecmp(key, "install_percent") == 0
578 || strcasecmp(key, "progress_percent") == 0) {
579 if (__find_event_info
580 (&(request->head), req_id, &event_type,
581 &event_state) == 0) {
582 __update_event_info(&(request->head), req_id,
584 PACKAGE_MANAGER_EVENT_STATE_PROCESSING);
585 if (request->event_cb)
586 request->event_cb(req_id, pkg_type, pkg_name,
588 PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
590 PACKAGE_MANAGER_ERROR_NONE,
594 } else if (strcasecmp(key, "error") == 0) {
595 if (__find_event_info
596 (&(request->head), req_id, &event_type,
597 &event_state) == 0) {
598 __update_event_info(&(request->head), req_id,
600 PACKAGE_MANAGER_EVENT_STATE_FAILED);
603 if (request->event_cb)
604 request->event_cb(req_id, pkg_type,
605 pkg_name, event_type,
606 PACKAGE_MANAGER_EVENT_STATE_FAILED,
608 __convert_str_to_error(val),
611 } else if (strcasecmp(key, "end") == 0) {
612 if (__find_event_info
613 (&(request->head), req_id, &event_type,
614 &event_state) == 0) {
615 if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
616 if (request->event_cb)
617 request->event_cb(req_id, pkg_type,
618 pkg_name, event_type,
619 PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
621 PACKAGE_MANAGER_ERROR_NONE,
625 if (strcasecmp(key, "ok") != 0)
626 if (request->event_cb)
627 request->event_cb(req_id, pkg_type,
628 pkg_name, event_type,
629 PACKAGE_MANAGER_EVENT_STATE_FAILED,
631 PACKAGE_MANAGER_ERROR_SYSTEM_ERROR,
636 return PACKAGE_MANAGER_ERROR_NONE;
639 static int internal_request_callback(uid_t target_uid, int req_id, const char *pkg_type,
640 const char *pkg_name, const char *key,
641 const char *val, const void *pmsg, void *data)
644 package_manager_event_type_e event_type = -1;
645 package_manager_event_state_e event_state = -1;
646 struct package_manager_request_cb_info *cb_info;
647 package_manager_request_event_cb event_cb;
648 void *user_data = NULL;
650 _LOGD("request callback called, req_id[%d]", req_id);
652 package_manager_request_h request = data;
654 if (request->request_cb_table)
655 cb_info = g_hash_table_lookup(request->request_cb_table,
656 GINT_TO_POINTER(req_id));
660 if (!cb_info || (cb_info && !cb_info->callback)) {
661 _LOGE("no callback info");
665 if (cb_info->req_id != req_id) {
666 _LOGE("not matched request id");
670 event_cb = cb_info->callback;
671 user_data = cb_info->user_data;
673 if (strcasecmp(key, "start") == 0) {
674 ret = package_manager_get_event_type(val, &event_type);
675 if (ret != PACKAGE_MANAGER_ERROR_NONE)
676 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
678 __add_event_info(&request->head, req_id, event_type,
679 PACKAGE_MANAGER_EVENT_STATE_STARTED);
681 event_cb(req_id, pkg_type, pkg_name,
683 PACKAGE_MANAGER_EVENT_STATE_STARTED,
684 0, PACKAGE_MANAGER_ERROR_NONE, user_data);
685 } else if (strcasecmp(key, "install_percent") == 0) {
686 if (__find_event_info(&request->head, req_id, &event_type,
687 &event_state) == 0) {
688 __update_event_info(&request->head, req_id,
690 PACKAGE_MANAGER_EVENT_STATE_PROCESSING);
691 event_cb(req_id, pkg_type, pkg_name,
693 PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
695 PACKAGE_MANAGER_ERROR_NONE,
698 } else if (strcasecmp(key, "error") == 0) {
699 if (__find_event_info(&request->head, req_id, &event_type,
700 &event_state) == 0) {
701 __update_event_info(&request->head, req_id,
703 PACKAGE_MANAGER_EVENT_STATE_FAILED);
704 event_cb(req_id, pkg_type,
705 pkg_name, event_type,
706 PACKAGE_MANAGER_EVENT_STATE_FAILED,
708 __convert_str_to_error(val),
711 } else if (strcasecmp(key, "end") == 0) {
712 if (__find_event_info(&request->head, req_id, &event_type,
713 &event_state) == 0) {
714 if (request->request_cb_table) {
716 if (request->n_paths < 1) {
717 _LOGD("remove item, req_id(%d)", req_id);
719 request->request_cb_table,
720 GINT_TO_POINTER(req_id));
723 if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
724 if (strcasecmp(val, "ok") == 0) {
725 event_cb(req_id, pkg_type,
726 pkg_name, event_type,
727 PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
729 PACKAGE_MANAGER_ERROR_NONE,
732 event_cb(req_id, pkg_type,
733 pkg_name, event_type,
734 PACKAGE_MANAGER_EVENT_STATE_FAILED,
736 PACKAGE_MANAGER_ERROR_SYSTEM_ERROR,
741 _LOGE("unexpected end event");
748 static void internal_res_request_callback(uid_t target_uid, int req_id,
749 const char *pkgid, const char *request_type, const char *status,
750 pkgmgr_res_event_info *handle, void *data)
753 package_manager_event_type_e event_type = -1;
754 package_manager_event_state_e event_state = -1;
755 struct package_manager_request_cb_info *cb_info;
756 package_manager_request_res_event_cb event_cb;
757 struct package_manager_res_event_info_s event_info;
758 void *user_data = NULL;
760 _LOGD("request callback called, req_id[%d]", req_id);
762 package_manager_request_h request = data;
763 event_info.res_event_info_handle = handle;
765 if (request->request_cb_table)
766 cb_info = g_hash_table_lookup(request->request_cb_table,
767 GINT_TO_POINTER(req_id));
771 if (!cb_info || (cb_info && !cb_info->res_callback)) {
772 _LOGE("no callback info");
776 if (cb_info->req_id != req_id) {
777 _LOGE("not matched request id");
781 event_cb = cb_info->res_callback;
782 user_data = cb_info->user_data;
784 ret = package_manager_get_event_type(request_type, &event_type);
785 if (ret != PACKAGE_MANAGER_ERROR_NONE)
787 if (strcasecmp(status, "start") == 0) {
788 event_state = PACKAGE_MANAGER_EVENT_STATE_STARTED;
789 } else if (strcasecmp(status, "fail") == 0) {
790 event_state = PACKAGE_MANAGER_EVENT_STATE_FAILED;
791 _LOGD("remove item, req_id(%d)", req_id);
792 g_hash_table_remove(request->request_cb_table,
793 GINT_TO_POINTER(req_id));
794 } else if (strcasecmp(status, "ok") == 0) {
795 event_state = PACKAGE_MANAGER_EVENT_STATE_COMPLETED;
796 _LOGD("remove item, req_id(%d)", req_id);
797 g_hash_table_remove(request->request_cb_table,
798 GINT_TO_POINTER(req_id));
800 _LOGE("unexpected event");
804 event_cb(req_id, pkgid, event_type, event_state,
805 &event_info, user_data);
810 static int __request_install(package_manager_request_h request,
811 const char *path, pkgmgr_handler event_cb, int *id)
814 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
815 if (retval != PACKAGE_MANAGER_ERROR_NONE)
818 if (package_manager_client_validate_handle(request))
819 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
822 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
825 request_id = pkgmgr_client_install(request->pc, request->pkg_type, NULL,
826 path, NULL, request->mode, event_cb ? event_cb : request_event_handler, request);
827 if (request_id < 0) {
828 retval = package_manager_convert_internal_error(request_id);
829 return package_manager_error(retval, __FUNCTION__, NULL);
835 return PACKAGE_MANAGER_ERROR_NONE;
838 static int __request_install_packages(package_manager_request_h request,
839 const char **paths, int n_paths, pkgmgr_handler event_cb,
843 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
844 if (retval != PACKAGE_MANAGER_ERROR_NONE)
847 if (package_manager_client_validate_handle(request))
848 return package_manager_error(
849 PACKAGE_MANAGER_ERROR_INVALID_PARAMETER,
852 if (paths == NULL || n_paths < 1)
853 return package_manager_error(
854 PACKAGE_MANAGER_ERROR_INVALID_PARAMETER,
856 request->n_paths = n_paths;
858 request_id = pkgmgr_client_install_packages(request->pc, paths,
859 n_paths, event_cb ? event_cb : request_event_handler,
861 if (request_id < 0) {
862 retval = package_manager_convert_internal_error(request_id);
863 return package_manager_error(retval, __FUNCTION__, NULL);
869 return PACKAGE_MANAGER_ERROR_NONE;
872 static int __request_uninstall(package_manager_request_h request,
873 const char *name, pkgmgr_handler event_cb, int *id)
876 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
877 if (retval != PACKAGE_MANAGER_ERROR_NONE)
880 if (package_manager_client_validate_handle(request))
881 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
884 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
887 request_id = pkgmgr_client_uninstall(request->pc, request->pkg_type,
888 name, request->mode, event_cb ? event_cb : request_event_handler, request);
889 if (request_id < 0) {
890 retval = package_manager_convert_internal_error(request_id);
891 return package_manager_error(retval, __FUNCTION__, NULL);
897 return PACKAGE_MANAGER_ERROR_NONE;
900 static int __request_move(package_manager_request_h request,
901 const char *name, package_manager_move_type_e move_type,
902 pkgmgr_handler event_cb, int *id)
905 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
906 if (retval != PACKAGE_MANAGER_ERROR_NONE)
909 if (package_manager_client_validate_handle(request))
910 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
913 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
916 request_id = pkgmgr_client_request_service(PM_REQUEST_MOVE, move_type,
917 request->pc, request->pkg_type, name,
918 NULL, event_cb ? event_cb : request_event_handler, request);
919 if (request_id < 0) {
920 retval = package_manager_convert_internal_error(request_id);
921 return package_manager_error(retval, __FUNCTION__, NULL);
926 return PACKAGE_MANAGER_ERROR_NONE;
929 static int __request_mount_install(package_manager_request_h request,
930 const char *path, pkgmgr_handler event_cb, int *id)
933 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
934 if (retval != PACKAGE_MANAGER_ERROR_NONE)
937 if (package_manager_client_validate_handle(request))
938 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
941 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
944 request_id = pkgmgr_client_mount_install(request->pc, request->pkg_type, NULL,
945 path, NULL, request->mode, event_cb ? event_cb : request_event_handler, request);
946 if (request_id < 0) {
947 retval = package_manager_convert_internal_error(request_id);
948 return package_manager_error(retval, __FUNCTION__, NULL);
954 return PACKAGE_MANAGER_ERROR_NONE;
957 static int __request_mount_install_packages(package_manager_request_h request,
958 const char **paths, int n_paths, pkgmgr_handler event_cb,
962 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
963 if (retval != PACKAGE_MANAGER_ERROR_NONE)
966 if (package_manager_client_validate_handle(request))
967 return package_manager_error(
968 PACKAGE_MANAGER_ERROR_INVALID_PARAMETER,
971 if (paths == NULL || n_paths < 1)
972 return package_manager_error(
973 PACKAGE_MANAGER_ERROR_INVALID_PARAMETER,
975 request->n_paths = n_paths;
977 request_id = pkgmgr_client_mount_install_packages(request->pc, paths,
978 n_paths, event_cb ? event_cb : request_event_handler,
980 if (request_id < 0) {
981 retval = package_manager_convert_internal_error(request_id);
982 return package_manager_error(retval, __FUNCTION__, NULL);
988 return PACKAGE_MANAGER_ERROR_NONE;
991 static int __request_res_copy(package_manager_request_h request,
992 pkgmgr_res_handler event_cb, int *id)
995 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
996 if (retval != PACKAGE_MANAGER_ERROR_NONE)
999 if (package_manager_client_validate_handle(request))
1000 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1003 request_id = pkgmgr_client_res_copy(request->pc, event_cb, request);
1004 if (request_id < 0) {
1005 retval = package_manager_convert_internal_error(request_id);
1006 return package_manager_error(retval, __FUNCTION__, NULL);
1011 return PACKAGE_MANAGER_ERROR_NONE;
1014 static int __request_res_create_dir(package_manager_request_h request,
1015 pkgmgr_res_handler event_cb, int *id)
1018 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
1019 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1022 if (package_manager_client_validate_handle(request))
1023 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1026 request_id = pkgmgr_client_res_create_dir(request->pc, event_cb, request);
1027 if (request_id < 0) {
1028 retval = package_manager_convert_internal_error(request_id);
1029 return package_manager_error(retval, __FUNCTION__, NULL);
1035 return PACKAGE_MANAGER_ERROR_NONE;
1038 static int __request_res_remove(package_manager_request_h request,
1039 pkgmgr_res_handler event_cb, int *id)
1042 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
1043 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1046 if (package_manager_client_validate_handle(request))
1047 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1050 request_id = pkgmgr_client_res_remove(request->pc, event_cb, request);
1051 if (request_id < 0) {
1052 retval = package_manager_convert_internal_error(request_id);
1053 return package_manager_error(retval, __FUNCTION__, NULL);
1059 return PACKAGE_MANAGER_ERROR_NONE;
1062 API int package_manager_request_install(package_manager_request_h request,
1063 const char *path, int *id)
1065 return __request_install(request, path, NULL, id);
1068 API int package_manager_request_install_with_cb(package_manager_request_h request,
1069 const char *path, package_manager_request_event_cb callback,
1070 void *user_data, int *id)
1075 if (request->request_cb_table == NULL)
1076 __initialize_request_cb_table(request);
1078 ret = __request_install(request, path, internal_request_callback, &req_id);
1081 ret = __insert_request_cb_info(request, req_id, callback, user_data);
1083 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
1084 __FUNCTION__, "failed to create request cb info");
1092 API int package_manager_request_install_packages(
1093 package_manager_request_h request, const char **paths,
1094 int paths_count, int *id)
1096 return __request_install_packages(request, paths, paths_count, NULL, id);
1099 API int package_manager_request_install_packages_with_cb(
1100 package_manager_request_h request, const char **paths,
1101 int paths_count, package_manager_request_event_cb callback,
1102 void *user_data, int *id)
1107 if (request->request_cb_table == NULL)
1108 __initialize_request_cb_table(request);
1110 ret = __request_install_packages(request, paths, paths_count,
1111 internal_request_callback, &req_id);
1114 ret = __insert_request_cb_info(request, req_id, callback,
1117 return package_manager_error(
1118 PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
1120 "failed to create request cb info");
1128 API int package_manager_request_uninstall(package_manager_request_h request,
1129 const char *name, int *id)
1131 return __request_uninstall(request, name, NULL, id);
1134 API int package_manager_request_uninstall_with_cb(package_manager_request_h request,
1135 const char *name, package_manager_request_event_cb callback,
1136 void *user_data, int *id)
1141 if (request->request_cb_table == NULL)
1142 __initialize_request_cb_table(request);
1144 ret = __request_uninstall(request, name, internal_request_callback, &req_id);
1147 ret = __insert_request_cb_info(request, req_id, callback, user_data);
1149 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
1150 __FUNCTION__, "failed to create request cb info");
1158 API int package_manager_request_move(package_manager_request_h request,
1159 const char *name, package_manager_move_type_e move_type)
1161 return __request_move(request, name, move_type, NULL, NULL);
1164 API int package_manager_request_move_with_cb(package_manager_request_h request,
1165 const char *name, package_manager_move_type_e move_type,
1166 package_manager_request_event_cb callback, void *user_data, int *id)
1171 if (request->request_cb_table == NULL)
1172 __initialize_request_cb_table(request);
1174 ret = __request_move(request, name, move_type, internal_request_callback, &req_id);
1177 ret = __insert_request_cb_info(request, req_id, callback, user_data);
1179 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
1180 __FUNCTION__, "failed to create request cb info");
1188 API int package_manager_request_mount_install(package_manager_request_h request,
1189 const char *path, int *id)
1191 return __request_mount_install(request, path, NULL, id);
1194 API int package_manager_request_mount_install_with_cb(package_manager_request_h request,
1195 const char *path, package_manager_request_event_cb callback,
1196 void *user_data, int *id)
1201 if (request->request_cb_table == NULL)
1202 __initialize_request_cb_table(request);
1204 ret = __request_mount_install(request, path, internal_request_callback, &req_id);
1207 ret = __insert_request_cb_info(request, req_id, callback, user_data);
1209 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
1210 __FUNCTION__, "failed to create request cb info");
1218 API int package_manager_request_mount_install_packages(
1219 package_manager_request_h request, const char **paths,
1220 int paths_count, int *id)
1222 return __request_mount_install_packages(request, paths, paths_count, NULL,
1226 API int package_manager_request_mount_install_packages_with_cb(
1227 package_manager_request_h request, const char **paths,
1228 int paths_count, package_manager_request_event_cb callback,
1229 void *user_data, int *id)
1234 if (request->request_cb_table == NULL)
1235 __initialize_request_cb_table(request);
1237 ret = __request_mount_install_packages(request, paths, paths_count,
1238 internal_request_callback, &req_id);
1241 ret = __insert_request_cb_info(request, req_id, callback,
1244 return package_manager_error(
1245 PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
1247 "failed to create request cb info");
1255 API int package_manager_create(package_manager_h *manager)
1258 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1259 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1262 struct package_manager_s *package_manager = NULL;
1264 if (manager == NULL) {
1266 package_manager_error
1267 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1271 package_manager = calloc(1, sizeof(struct package_manager_s));
1272 if (package_manager == NULL) {
1274 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
1276 "failed to create a package_manager handle");
1279 package_manager->ctype = PC_LISTENING;
1280 package_manager->pc = pkgmgr_client_new(PC_LISTENING);
1281 if (package_manager->pc == NULL) {
1282 free(package_manager);
1284 package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
1286 "failed to create a package_manager client");
1289 package_manager->handle_id = package_manager_new_id();
1290 g_mutex_init(&package_manager->mutex);
1292 *manager = package_manager;
1294 return PACKAGE_MANAGER_ERROR_NONE;
1297 static int package_manager_validate_handle(package_manager_h manager)
1299 if (manager == NULL || manager->pc == NULL)
1300 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
1302 return PACKAGE_MANAGER_ERROR_NONE;
1305 API int package_manager_destroy(package_manager_h manager)
1307 if (package_manager_validate_handle(manager)) {
1309 package_manager_error
1310 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1314 g_mutex_clear(&manager->mutex);
1315 pkgmgr_client_free(manager->pc);
1316 g_hash_table_destroy(manager->event_info_table);
1319 return PACKAGE_MANAGER_ERROR_NONE;
1322 /* App Event Listening Policy:
1323 * +----------------+------------+---------------+------------------+
1324 * |Listener \ Type |Global Event|My User's Event|Other user's Event|
1325 * +----------------+------------+---------------+------------------+
1326 * |User Process App| Grant | Grant | Deny |
1327 * +----------------+------------+---------------+------------------+
1328 * |Platform module | Grant | Grant | Grant |
1329 * +----------------+------------+---------------+------------------+
1330 * UID assignment policy:
1331 * https://wiki.tizen.org/wiki/Security/User_and_group_ID_assignment_policy
1333 #define REGULAR_USER 5000
1334 static int __validate_event_signal(uid_t target_uid)
1336 uid_t self = getuid();
1338 if (self == target_uid)
1341 if (self < REGULAR_USER)
1347 static int internal_callback(uid_t target_uid, int req_id, const char *pkg_type,
1348 const char *pkg_name, const char *key,
1349 const char *val, const void *pmsg, void *data)
1351 struct package_manager_event_info *info = NULL;
1353 package_manager_h manager = data;
1354 uid_t uid = target_uid;
1355 bool invoke_callback = false;
1356 package_manager_event_type_e event_type = -1;
1357 package_manager_event_state_e event_state;
1359 package_manager_error_e error = PACKAGE_MANAGER_ERROR_NONE;
1361 _LOGD("req_id(%d), pkg_name(%s), type(%s), key(%s), val(%s)",
1362 req_id, pkg_name, pkg_type, key, val);
1364 if (target_uid == GLOBAL_USER)
1367 if (__validate_event_signal(uid))
1368 return PACKAGE_MANAGER_ERROR_NONE;
1370 if (manager && manager->event_info_table) {
1371 g_mutex_lock(&manager->mutex);
1372 info = g_hash_table_lookup(manager->event_info_table, pkg_name);
1374 _LOGE("invalid handle");
1375 return PACKAGE_MANAGER_ERROR_NONE;
1379 if (strcasecmp(key, "start") != 0) {
1380 _LOGD("unexpected signal or no info(removed)");
1381 g_mutex_unlock(&manager->mutex);
1382 return PACKAGE_MANAGER_ERROR_NONE;
1386 if (strcasecmp(key, "start") == 0) {
1387 ret = package_manager_get_event_type(val, &event_type);
1388 if (ret != PACKAGE_MANAGER_ERROR_NONE) {
1389 g_mutex_unlock(&manager->mutex);
1390 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
1394 __insert_event_info(manager, pkg_name, event_type,
1395 PACKAGE_MANAGER_EVENT_STATE_STARTED);
1397 event_state = PACKAGE_MANAGER_EVENT_STATE_STARTED;
1399 error = PACKAGE_MANAGER_ERROR_NONE;
1400 invoke_callback = true;
1402 _LOGE("unexpected start event");
1404 } else if (strcasecmp(key, "install_percent") == 0
1405 || strcasecmp(key, "progress_percent") == 0) {
1406 info->event_state = PACKAGE_MANAGER_EVENT_STATE_PROCESSING;
1407 event_type = info->event_type;
1408 event_state = info->event_state;
1409 progress = atoi(val);
1410 error = PACKAGE_MANAGER_ERROR_NONE;
1411 invoke_callback = true;
1412 } else if (strcasecmp(key, "error") == 0) {
1413 info->event_state = PACKAGE_MANAGER_EVENT_STATE_FAILED;
1414 event_type = info->event_type;
1415 event_state = info->event_state;
1417 error = __convert_str_to_error(val);
1418 invoke_callback = true;
1419 } else if (strcasecmp(key, "end") == 0) {
1420 if (info->event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
1421 if (strcasecmp(val, "ok") == 0) {
1422 event_type = info->event_type;
1424 PACKAGE_MANAGER_EVENT_STATE_COMPLETED;
1426 error = PACKAGE_MANAGER_ERROR_NONE;
1427 invoke_callback = true;
1429 event_type = info->event_type;
1431 PACKAGE_MANAGER_EVENT_STATE_FAILED;
1433 error = PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
1434 invoke_callback = true;
1437 g_hash_table_remove(manager->event_info_table, info->pkg_name);
1439 g_mutex_unlock(&manager->mutex);
1441 if (invoke_callback && manager->event_cb && getuid() == uid) {
1442 manager->event_cb(pkg_type, pkg_name, event_type, event_state,
1443 progress, error, manager->user_data);
1446 return PACKAGE_MANAGER_ERROR_NONE;
1449 static void internal_res_callback(uid_t target_uid, int req_id,
1450 const char *pkgid, const char *request_type, const char *status,
1451 pkgmgr_res_event_info *handle, void *data)
1454 package_manager_h manager = data;
1455 uid_t uid = target_uid;
1456 package_manager_event_type_e event_type = -1;
1457 package_manager_event_state_e event_state;
1458 struct package_manager_res_event_info_s event_info;
1460 event_info.res_event_info_handle = handle;
1462 _LOGD("req_id(%d), pkg_name(%s), request_type(%s), status(%s)",
1463 req_id, pkgid, request_type, status);
1465 if (target_uid == GLOBAL_USER)
1468 if (__validate_event_signal(uid))
1472 g_mutex_lock(&manager->mutex);
1474 _LOGE("invalid handle");
1477 ret = package_manager_get_event_type(request_type, &event_type);
1478 if (ret != PACKAGE_MANAGER_ERROR_NONE) {
1479 g_mutex_unlock(&manager->mutex);
1483 if (strcasecmp(status, "start") == 0) {
1484 event_state = PACKAGE_MANAGER_EVENT_STATE_STARTED;
1485 } else if (strcasecmp(status, "fail") == 0) {
1486 event_state = PACKAGE_MANAGER_EVENT_STATE_FAILED;
1487 } else if (strcasecmp(status, "ok") == 0) {
1488 event_state = PACKAGE_MANAGER_EVENT_STATE_COMPLETED;
1490 _LOGE("unexpected event");
1491 g_mutex_unlock(&manager->mutex);
1494 g_mutex_unlock(&manager->mutex);
1496 if (manager->res_event_cb && getuid() == uid) {
1497 _LOGE("call callback");
1498 manager->res_event_cb(pkgid, event_type, event_state,
1499 &event_info, manager->user_data);
1501 if (!manager->res_event_cb)
1502 _LOGE("res_event_cb is null");
1503 if (getuid() != uid)
1504 _LOGE("getuid : %d, uid : %d", getuid(), uid);
1510 static int __convert_status_type(package_manager_status_type_e status_type)
1514 if (status_type == PACKAGE_MANAGER_STATUS_TYPE_ALL)
1515 return PKGMGR_CLIENT_STATUS_ALL;
1517 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_INSTALL)
1518 type |= PKGMGR_CLIENT_STATUS_INSTALL;
1519 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_UNINSTALL)
1520 type |= PKGMGR_CLIENT_STATUS_UNINSTALL;
1521 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_UPGRADE)
1522 type |= PKGMGR_CLIENT_STATUS_UPGRADE;
1523 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_MOVE)
1524 type |= PKGMGR_CLIENT_STATUS_MOVE;
1525 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_CLEAR_DATA)
1526 type |= PKGMGR_CLIENT_STATUS_CLEAR_DATA;
1527 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_INSTALL_PROGRESS)
1528 type |= PKGMGR_CLIENT_STATUS_INSTALL_PROGRESS;
1529 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_GET_SIZE)
1530 type |= PKGMGR_CLIENT_STATUS_GET_SIZE;
1531 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_RES_COPY)
1532 type |= PKGMGR_CLIENT_STATUS_RES_COPY;
1533 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_RES_CREATE_DIR)
1534 type |= PKGMGR_CLIENT_STATUS_RES_CREATE_DIR;
1535 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_RES_REMOVE)
1536 type |= PKGMGR_CLIENT_STATUS_RES_REMOVE;
1537 if (status_type & PACKAGE_MANAGER_STATUS_TYPE_RES_UNINSTALL)
1538 type |= PKGMGR_CLIENT_STATUS_RES_UNINSTALL;
1543 API int package_manager_set_event_status(package_manager_h manager, int status_type)
1547 int type_all = PACKAGE_MANAGER_STATUS_TYPE_INSTALL |
1548 PACKAGE_MANAGER_STATUS_TYPE_UNINSTALL |
1549 PACKAGE_MANAGER_STATUS_TYPE_UPGRADE |
1550 PACKAGE_MANAGER_STATUS_TYPE_MOVE |
1551 PACKAGE_MANAGER_STATUS_TYPE_CLEAR_DATA |
1552 PACKAGE_MANAGER_STATUS_TYPE_INSTALL_PROGRESS |
1553 PACKAGE_MANAGER_STATUS_TYPE_GET_SIZE |
1554 PACKAGE_MANAGER_STATUS_TYPE_RES_COPY |
1555 PACKAGE_MANAGER_STATUS_TYPE_RES_CREATE_DIR |
1556 PACKAGE_MANAGER_STATUS_TYPE_RES_REMOVE |
1557 PACKAGE_MANAGER_STATUS_TYPE_RES_UNINSTALL;
1559 if (manager == NULL)
1560 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1562 if (status_type < 0 || status_type > type_all)
1563 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1565 type = __convert_status_type(status_type);
1566 retval = pkgmgr_client_set_status_type(manager->pc, type);
1569 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1571 return PACKAGE_MANAGER_ERROR_NONE;
1574 API int package_manager_set_event_cb(package_manager_h manager,
1575 package_manager_event_cb callback,
1579 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1580 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1583 if (package_manager_validate_handle(manager)) {
1585 package_manager_error
1586 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1590 manager->event_cb = callback;
1591 manager->user_data = user_data;
1593 retval = pkgmgr_client_remove_listen_status(manager->pc);
1595 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR,
1596 __FUNCTION__, NULL);
1599 retval = pkgmgr_client_listen_status(manager->pc,
1600 internal_callback, manager);
1602 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR,
1603 __FUNCTION__, NULL);
1606 if (!manager->event_info_table) {
1607 manager->event_info_table =
1608 g_hash_table_new_full(g_str_hash, g_str_equal,
1609 NULL, __free_event_info);
1612 return PACKAGE_MANAGER_ERROR_NONE;
1615 API int package_manager_set_res_event_cb(package_manager_h manager,
1616 package_manager_res_event_cb callback, void *user_data)
1619 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
1620 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1623 if (package_manager_validate_handle(manager)) {
1625 package_manager_error
1626 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1630 manager->res_event_cb = callback;
1631 manager->user_data = user_data;
1633 retval = pkgmgr_client_remove_listen_status(manager->pc);
1635 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR,
1636 __FUNCTION__, NULL);
1639 retval = pkgmgr_client_listen_res_status(manager->pc,
1640 internal_res_callback, manager);
1642 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR,
1643 __FUNCTION__, NULL);
1646 return PACKAGE_MANAGER_ERROR_NONE;
1649 API int package_manager_unset_event_cb(package_manager_h manager)
1651 if (manager == NULL) {
1653 package_manager_error
1654 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1659 manager->event_cb = NULL;
1660 manager->res_event_cb = NULL;
1661 manager->user_data = NULL;
1663 g_mutex_lock(&manager->mutex);
1664 g_hash_table_remove_all(manager->event_info_table);
1665 g_mutex_unlock(&manager->mutex);
1667 retval = pkgmgr_client_remove_listen_status(manager->pc);
1668 if (retval == PKGMGR_R_EINVAL)
1670 package_manager_error
1671 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1673 else if (retval == PKGMGR_R_ERROR)
1675 package_manager_error
1676 (PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__,
1679 return PACKAGE_MANAGER_ERROR_NONE;
1682 API int package_manager_get_package_id_by_app_id(const char *app_id, char **package_id)
1684 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo;
1686 char *pkg_id = NULL;
1687 char *pkg_id_dup = NULL;
1689 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1690 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1693 if (app_id == NULL || package_id == NULL)
1694 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1696 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1697 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1698 retval = pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id);
1699 if (retval != PMINFO_R_OK) {
1700 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1701 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1704 pkg_id_dup = strdup(pkg_id);
1705 if (pkg_id_dup == NULL) {
1706 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1707 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1710 *package_id = pkg_id_dup;
1712 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1714 return PACKAGE_MANAGER_ERROR_NONE;
1717 API int package_manager_get_package_info(const char *package_id, package_info_h *package_info)
1720 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1721 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1724 retval = package_info_get_package_info(package_id, package_info);
1726 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1727 return package_manager_error(retval, __FUNCTION__, NULL);
1729 return PACKAGE_MANAGER_ERROR_NONE;
1732 API int package_manager_foreach_package_info(package_manager_package_info_cb callback,
1736 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1737 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1740 retval = package_info_foreach_package_info(callback, user_data);
1742 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1743 return package_manager_error(retval, __FUNCTION__, NULL);
1745 return PACKAGE_MANAGER_ERROR_NONE;
1748 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)
1750 pkgmgrinfo_cert_compare_result_type_e result;
1752 if (lhs_package_id == NULL || rhs_package_id == NULL || compare_result == NULL)
1753 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1754 if (pkgmgrinfo_pkginfo_compare_pkg_cert_info(lhs_package_id, rhs_package_id, &result) != PKGMGR_R_OK)
1755 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1756 *compare_result = (package_manager_compare_result_type_e)result;
1758 return PACKAGE_MANAGER_ERROR_NONE;
1761 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)
1763 pkgmgrinfo_cert_compare_result_type_e result;
1765 if (lhs_app_id == NULL || rhs_app_id == NULL || compare_result == NULL)
1766 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1767 if (pkgmgrinfo_pkginfo_compare_app_cert_info(lhs_app_id, rhs_app_id, &result) != PKGMGR_R_OK)
1768 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1770 *compare_result = (package_manager_compare_result_type_e)result;
1772 return PACKAGE_MANAGER_ERROR_NONE;
1775 API int package_manager_is_preload_package_by_app_id(const char *app_id, bool *preload)
1778 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1779 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1782 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo = NULL;
1783 pkgmgrinfo_pkginfo_h pkgmgrinfo_pkginfo = NULL;
1785 char *pkg_id = NULL;
1786 bool is_preload = 0;
1787 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1788 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1790 retval = pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id);
1791 if (retval != PMINFO_R_OK) {
1792 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1793 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1795 if (pkgmgrinfo_pkginfo_get_pkginfo(pkg_id, &pkgmgrinfo_pkginfo) != PMINFO_R_OK) {
1796 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1797 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1798 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1800 if (pkgmgrinfo_pkginfo_is_preload(pkgmgrinfo_pkginfo, &is_preload) != PMINFO_R_OK) {
1801 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1802 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1803 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1811 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1812 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1814 return PACKAGE_MANAGER_ERROR_NONE;
1817 API int package_manager_get_permission_type(const char *app_id, package_manager_permission_type_e *permission_type)
1820 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1821 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1824 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo = NULL;
1825 pkgmgrinfo_permission_type permission = 0;
1826 if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1827 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1828 retval = pkgmgrinfo_appinfo_get_permission_type(pkgmgrinfo_appinfo, &permission);
1829 if (retval != PMINFO_R_OK) {
1830 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1831 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1834 if (permission == PMINFO_PERMISSION_NORMAL)
1835 *permission_type = PACKAGE_MANAGER_PERMISSION_NORMAL;
1836 else if (permission == PMINFO_PERMISSION_SIGNATURE)
1837 *permission_type = PACKAGE_MANAGER_PERMISSION_SIGNATURE;
1838 else if (permission == PMINFO_PERMISSION_PRIVILEGE)
1839 *permission_type = PACKAGE_MANAGER_PERMISSION_PRIVILEGE;
1841 *permission_type = PACKAGE_MANAGER_PERMISSION_NORMAL;
1843 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1844 return PACKAGE_MANAGER_ERROR_NONE;
1847 API int package_manager_clear_cache_dir(const char *package_id)
1850 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_CACHE);
1851 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1854 int res = pkgmgr_client_clear_cache_dir(package_id);
1856 retval = package_manager_convert_internal_error(res);
1857 return package_manager_error(retval, __FUNCTION__, NULL);
1860 return PACKAGE_MANAGER_ERROR_NONE;
1863 API int package_manager_clear_data_dir(const char *package_id)
1866 pkgmgr_client *pc = NULL;
1867 char *pkg_type = NULL;
1868 pkgmgrinfo_pkginfo_h pkginfo = NULL;
1870 if (package_id == NULL)
1871 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
1873 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
1874 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1877 retval = pkgmgrinfo_pkginfo_get_pkginfo(package_id, &pkginfo);
1878 if (retval == PMINFO_R_ENOENT)
1879 return PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE;
1880 else if (retval != PMINFO_R_OK || pkginfo == NULL)
1881 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
1883 retval = pkgmgrinfo_pkginfo_get_type(pkginfo, &pkg_type);
1884 if (retval != PMINFO_R_OK || pkg_type == NULL) {
1885 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
1886 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
1889 pc = pkgmgr_client_new(PC_REQUEST);
1891 _LOGE("Out of memory");
1892 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
1893 return PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY;
1896 retval = pkgmgr_client_clear_user_data(pc, pkg_type, package_id, PM_QUIET);
1897 pkgmgr_client_free(pc);
1898 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
1901 retval = package_manager_convert_internal_error(retval);
1902 return package_manager_error(retval, __FUNCTION__, NULL);
1905 return PACKAGE_MANAGER_ERROR_NONE;
1909 API int package_manager_clear_user_data_with_path(const char *package_id,
1910 const char *file_path)
1913 pkgmgr_client *pc = NULL;
1914 char *pkg_type = NULL;
1915 pkgmgrinfo_pkginfo_h pkginfo = NULL;
1917 if (package_id == NULL || file_path == NULL)
1918 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
1920 retval = pkgmgrinfo_pkginfo_get_pkginfo(package_id, &pkginfo);
1921 if (retval == PMINFO_R_ENOENT)
1922 return PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE;
1923 if (retval != PMINFO_R_OK || pkginfo == NULL)
1924 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
1926 retval = pkgmgrinfo_pkginfo_get_type(pkginfo, &pkg_type);
1927 if (retval != PMINFO_R_OK || pkg_type == NULL) {
1928 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
1929 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
1932 pc = pkgmgr_client_new(PC_REQUEST);
1934 _LOGE("Out of memory");
1935 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
1936 return PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY;
1939 retval = pkgmgr_client_clear_user_data_with_path(pc, pkg_type,
1940 package_id, file_path, PM_QUIET);
1941 pkgmgr_client_free(pc);
1942 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
1945 retval = package_manager_convert_internal_error(retval);
1946 return package_manager_error(retval, __FUNCTION__, NULL);
1949 return PACKAGE_MANAGER_ERROR_NONE;
1952 API int package_manager_clear_all_cache_dir(void)
1955 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
1956 if (retval != PACKAGE_MANAGER_ERROR_NONE)
1959 return package_manager_clear_cache_dir(PKG_CLEAR_ALL_CACHE);
1962 struct getsize_cbdata {
1968 static void __free_getsize_cbdata(struct getsize_cbdata *cbdata)
1970 pkgmgr_client_free(cbdata->pc);
1974 static void __copy_size_info(const pkg_size_info_t *src, package_size_info_t *dst)
1976 if (src == NULL || dst == NULL) {
1977 _LOGE("src or dst size info is NULL");
1981 dst->data_size = src->data_size;
1982 dst->cache_size = src->cache_size;
1983 dst->app_size = src->app_size;
1984 dst->external_data_size = src->ext_data_size;
1985 dst->external_cache_size = src->ext_cache_size;
1986 dst->external_app_size = src->ext_app_size;
1989 static void __result_cb(pkgmgr_client *pc, const char *pkgid, const pkg_size_info_t *result, void *user_data)
1991 struct getsize_cbdata *cbdata = (struct getsize_cbdata *)user_data;
1992 package_manager_size_info_receive_cb callback = cbdata->cb;
1993 if (callback == NULL) {
1994 _LOGE("callback is null.");
1995 __free_getsize_cbdata(cbdata);
1999 package_size_info_t size_info;
2000 __copy_size_info(result, &size_info);
2002 callback(pkgid, (package_size_info_h)&size_info, cbdata->user_data);
2004 __free_getsize_cbdata(cbdata);
2007 static void __total_result_cb(pkgmgr_client *pc, const pkg_size_info_t *result, void *user_data)
2009 struct getsize_cbdata *cbdata = (struct getsize_cbdata *)user_data;
2010 package_manager_total_size_info_receive_cb callback = cbdata->cb;
2011 if (callback == NULL) {
2012 _LOGE("callback is null.");
2013 __free_getsize_cbdata(cbdata);
2017 package_size_info_t size_info;
2018 __copy_size_info(result, &size_info);
2020 callback((package_size_info_h)&size_info, cbdata->user_data);
2022 __free_getsize_cbdata(cbdata);
2025 static int _get_pkg_size_info(const char *package_id, void *callback, void *user_data)
2027 struct getsize_cbdata *cbdata;
2029 if (package_id == NULL || callback == NULL)
2030 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
2032 cbdata = malloc(sizeof(struct getsize_cbdata));
2034 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
2036 pkgmgr_client *pc = pkgmgr_client_new(PC_REQUEST);
2039 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
2043 cbdata->cb = callback;
2044 cbdata->user_data = user_data;
2047 if (strcmp(package_id, PKG_SIZE_INFO_TOTAL) != 0)
2048 res = pkgmgr_client_get_package_size_info(pc, package_id, __result_cb, cbdata);
2050 res = pkgmgr_client_get_total_package_size_info(pc, __total_result_cb, cbdata);
2052 if (res != PKGMGR_R_OK) {
2053 __free_getsize_cbdata(cbdata);
2054 res = package_manager_convert_internal_error(res);
2055 return package_manager_error(res, __FUNCTION__, NULL);
2058 return PACKAGE_MANAGER_ERROR_NONE;
2061 API int package_manager_get_package_size_info(const char *package_id, package_manager_size_info_receive_cb callback, void *user_data)
2063 return _get_pkg_size_info(package_id, (void *)callback, user_data);
2066 API int package_manager_get_total_package_size_info(package_manager_total_size_info_receive_cb callback, void *user_data)
2068 return _get_pkg_size_info(PKG_SIZE_INFO_TOTAL, (void *)callback, user_data);
2071 API int package_manager_filter_create(package_manager_filter_h *handle)
2074 pkgmgrinfo_pkginfo_filter_h pkgmgr_filter = NULL;
2076 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
2077 if (retval != PACKAGE_MANAGER_ERROR_NONE)
2080 if (handle == NULL) {
2082 package_manager_error
2083 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
2087 retval = pkgmgrinfo_pkginfo_filter_create(&pkgmgr_filter);
2088 if (retval != PACKAGE_MANAGER_ERROR_NONE)
2089 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
2091 *handle = pkgmgr_filter;
2093 return PACKAGE_MANAGER_ERROR_NONE;
2096 API int package_manager_filter_destroy(package_manager_filter_h handle)
2100 if (handle == NULL) {
2102 package_manager_error
2103 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
2107 retval = pkgmgrinfo_pkginfo_filter_destroy(handle);
2108 if (retval != PACKAGE_MANAGER_ERROR_NONE)
2109 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
2111 return PACKAGE_MANAGER_ERROR_NONE;
2114 API int package_manager_filter_add_bool(package_manager_filter_h handle,
2115 const char *property, const bool value)
2119 if ((handle == NULL) || (property == NULL)) {
2121 package_manager_error
2122 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
2126 retval = pkgmgrinfo_pkginfo_filter_add_bool(handle, property, value);
2127 if (retval != PACKAGE_MANAGER_ERROR_NONE)
2128 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
2130 return PACKAGE_MANAGER_ERROR_NONE;
2134 API int package_manager_filter_add_string(package_manager_filter_h handle, const char *property, const char *value)
2138 if ((handle == NULL) || (property == NULL) || (value == NULL)) {
2140 package_manager_error
2141 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
2145 retval = pkgmgrinfo_pkginfo_filter_add_string(handle, property, value);
2146 if (retval != PACKAGE_MANAGER_ERROR_NONE)
2147 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
2149 return PACKAGE_MANAGER_ERROR_NONE;
2152 API int package_manager_filter_count(package_manager_filter_h handle, int *count)
2155 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
2156 if (retval != PACKAGE_MANAGER_ERROR_NONE)
2159 if ((handle == NULL) || (count == NULL))
2160 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
2162 retval = pkgmgrinfo_pkginfo_filter_count(handle, count);
2164 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
2166 return PACKAGE_MANAGER_ERROR_NONE;
2169 API int package_manager_filter_foreach_package_info(package_manager_filter_h handle,
2170 package_manager_package_info_cb callback, void *user_data)
2173 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
2174 if (retval != PACKAGE_MANAGER_ERROR_NONE)
2177 retval = package_info_filter_foreach_package_info(handle, callback, user_data);
2179 if (retval != PACKAGE_MANAGER_ERROR_NONE)
2180 return package_manager_error(retval, __FUNCTION__, NULL);
2182 return PACKAGE_MANAGER_ERROR_NONE;
2185 API int package_size_info_get_data_size(package_size_info_h handle, long long *data_size)
2188 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
2190 package_size_info_t *size_info = (package_size_info_t *)handle;
2192 *data_size = (long long)size_info->data_size;
2193 return PACKAGE_MANAGER_ERROR_NONE;
2196 API int package_size_info_get_cache_size(package_size_info_h handle, long long *cache_size)
2199 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
2201 package_size_info_t *size_info = (package_size_info_t *)handle;
2203 *cache_size = size_info->cache_size;
2204 return PACKAGE_MANAGER_ERROR_NONE;
2207 API int package_size_info_get_app_size(package_size_info_h handle, long long *app_size)
2210 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
2212 package_size_info_t *size_info = (package_size_info_t *)handle;
2213 *app_size = size_info->app_size;
2214 return PACKAGE_MANAGER_ERROR_NONE;
2217 API int package_size_info_get_external_data_size(package_size_info_h handle, long long *ext_data_size)
2220 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
2222 package_size_info_t *size_info = (package_size_info_t *)handle;
2223 *ext_data_size = size_info->external_data_size;
2224 return PACKAGE_MANAGER_ERROR_NONE;
2227 API int package_size_info_get_external_cache_size(package_size_info_h handle, long long *ext_cache_size)
2230 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
2232 package_size_info_t *size_info = (package_size_info_t *)handle;
2233 *ext_cache_size = size_info->external_cache_size;
2234 return PACKAGE_MANAGER_ERROR_NONE;
2237 API int package_size_info_get_external_app_size(package_size_info_h handle, long long *ext_app_size)
2240 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
2242 package_size_info_t *size_info = (package_size_info_t *)handle;
2243 *ext_app_size = size_info->external_app_size;
2244 return PACKAGE_MANAGER_ERROR_NONE;
2247 API int package_manager_updateinfo_set_pkgid(package_updateinfo_request_h pkg_updateinfo_req, const char *pkgid)
2249 struct package_updateinfo_request_s *request;
2251 if (pkg_updateinfo_req == NULL || pkg_updateinfo_req->updateinfo_handle == NULL || pkgid == NULL)
2252 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
2254 request = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
2255 if (request->updateinfo_handle->pkgid)
2256 free(request->updateinfo_handle->pkgid);
2257 request->updateinfo_handle->pkgid = strdup(pkgid);
2258 if (request->updateinfo_handle->pkgid == NULL)
2259 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
2261 return PACKAGE_MANAGER_ERROR_NONE;
2264 API int package_manager_updateinfo_set_version(package_updateinfo_request_h pkg_updateinfo_req, const char *version)
2266 struct package_updateinfo_request_s *request;
2268 if (pkg_updateinfo_req == NULL || pkg_updateinfo_req->updateinfo_handle == NULL || version == NULL)
2269 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
2271 request = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
2272 if (request->updateinfo_handle->version)
2273 free(request->updateinfo_handle->version);
2274 request->updateinfo_handle->version = strdup(version);
2275 if (request->updateinfo_handle->version == NULL)
2276 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
2278 return PACKAGE_MANAGER_ERROR_NONE;
2281 static int package_manager_updateinfo_convert_property(package_updateinfo_type_e property, pkgmgr_updateinfo_type *converted_property)
2283 if (converted_property == NULL)
2286 if (property == PACKAGE_UPDATEINFO_TYPE_FORCE)
2287 *converted_property = PM_UPDATEINFO_TYPE_FORCE;
2288 else if (property == PACKAGE_UPDATEINFO_TYPE_OPTIONAL)
2289 *converted_property = PM_UPDATEINFO_TYPE_OPTIONAL;
2290 else if (property == PACKAGE_UPDATEINFO_TYPE_NONE)
2291 *converted_property = PM_UPDATEINFO_TYPE_NONE;
2298 API int package_manager_updateinfo_set_type(package_updateinfo_request_h pkg_updateinfo_req, package_updateinfo_type_e type)
2301 pkgmgr_updateinfo_type converted_type;
2302 struct package_updateinfo_request_s *request;
2304 if (pkg_updateinfo_req == NULL || pkg_updateinfo_req->updateinfo_handle == NULL)
2305 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
2307 request = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
2308 retval = package_manager_updateinfo_convert_property(type, &converted_type);
2310 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
2312 request->updateinfo_handle->type = converted_type;
2313 return PACKAGE_MANAGER_ERROR_NONE;
2316 API int package_manager_updateinfo_request_destroy(package_updateinfo_request_h pkg_updateinfo_req)
2318 struct package_updateinfo_request_s *request;
2320 if (pkg_updateinfo_req == NULL)
2321 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
2323 request = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
2325 pkgmgr_client_free(request->pc);
2327 if (request->updateinfo_handle) {
2328 if (request->updateinfo_handle->pkgid)
2329 free(request->updateinfo_handle->pkgid);
2330 if (request->updateinfo_handle->version)
2331 free(request->updateinfo_handle->version);
2332 free(request->updateinfo_handle);
2336 return PACKAGE_MANAGER_ERROR_NONE;
2339 API int package_manager_updateinfo_request_create(package_updateinfo_request_h *pkg_updateinfo_req)
2341 struct package_updateinfo_request_s *request;
2342 pkg_update_info_t *update_info;
2344 if (pkg_updateinfo_req == NULL)
2345 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
2347 request = calloc(1, sizeof(struct package_updateinfo_request_s));
2348 if (request == NULL)
2349 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
2351 request->pc = pkgmgr_client_new(PC_REQUEST);
2352 if (request->pc == NULL) {
2354 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
2357 update_info = calloc(1, sizeof(pkg_update_info_t));
2358 if (update_info == NULL) {
2359 pkgmgr_client_free(request->pc);
2361 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
2363 request->updateinfo_handle = update_info;
2365 *pkg_updateinfo_req = request;
2366 return PACKAGE_MANAGER_ERROR_NONE;
2369 API int package_manager_updateinfo_request_register(package_updateinfo_request_h pkg_updateinfo_req)
2371 struct package_updateinfo_request_s *update_info;
2374 if (pkg_updateinfo_req == NULL)
2375 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
2376 update_info = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
2378 retval = pkgmgr_client_register_pkg_update_info(update_info->pc, update_info->updateinfo_handle);
2379 if (retval == PKGMGR_R_EINVAL)
2380 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
2382 return PACKAGE_MANAGER_ERROR_NONE;
2385 API int package_manager_updateinfo_request_unregister(package_updateinfo_request_h pkg_updateinfo_req, const char *pkgid)
2388 struct package_updateinfo_request_s *update_info;
2390 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
2391 if (retval != PACKAGE_MANAGER_ERROR_NONE)
2394 if (pkg_updateinfo_req == NULL || pkgid == NULL)
2395 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
2397 update_info = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
2398 retval = pkgmgr_client_unregister_pkg_update_info(update_info->pc, pkgid);
2399 if (retval != PMINFO_R_OK)
2400 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
2402 return PACKAGE_MANAGER_ERROR_NONE;
2405 API int package_manager_updateinfo_request_unregister_all(package_updateinfo_request_h pkg_updateinfo_req)
2408 struct package_updateinfo_request_s *update_info;
2410 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
2411 if (retval != PACKAGE_MANAGER_ERROR_NONE)
2414 if (pkg_updateinfo_req == NULL)
2415 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
2417 update_info = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
2418 retval = pkgmgr_client_unregister_all_pkg_update_info(update_info->pc);
2420 if (retval != PMINFO_R_OK)
2421 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
2423 return PACKAGE_MANAGER_ERROR_NONE;
2426 API int package_manager_request_add_res_copy_path(
2427 package_manager_request_h request,
2428 const char *src_path, const char *dest_path)
2432 if (package_manager_client_validate_handle(request)
2433 || src_path == NULL || dest_path == NULL) {
2435 package_manager_error
2436 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
2440 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
2441 if (retval != PACKAGE_MANAGER_ERROR_NONE)
2444 if (pkgmgr_client_add_res_copy_path(request->pc, src_path, dest_path))
2445 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
2447 return PACKAGE_MANAGER_ERROR_NONE;
2450 API int package_manager_request_res_copy_with_cb(package_manager_request_h request,
2451 package_manager_request_res_event_cb callback,
2452 void *user_data, int *id)
2457 if (package_manager_client_validate_handle(request)
2458 || callback == NULL || id == NULL) {
2459 return package_manager_error(
2460 PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
2463 ret = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
2464 if (ret != PACKAGE_MANAGER_ERROR_NONE)
2467 if (request->request_cb_table == NULL)
2468 __initialize_request_cb_table(request);
2470 ret = __request_res_copy(request, internal_res_request_callback, &req_id);
2473 ret = __insert_res_request_cb_info(request, req_id,
2474 callback, user_data);
2476 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
2477 __FUNCTION__, "failed to create request cb info");
2485 API int package_manager_request_add_res_create_dir_path(
2486 package_manager_request_h request, const char *dir_path)
2490 if (package_manager_client_validate_handle(request)
2491 || dir_path == NULL) {
2493 package_manager_error
2494 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
2498 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
2499 if (retval != PACKAGE_MANAGER_ERROR_NONE)
2502 if (pkgmgr_client_add_res_create_dir_path(request->pc, dir_path))
2503 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
2505 return PACKAGE_MANAGER_ERROR_NONE;
2508 API int package_manager_request_res_create_dir_with_cb(
2509 package_manager_request_h request,
2510 package_manager_request_res_event_cb callback,
2511 void *user_data, int *id)
2516 if (package_manager_client_validate_handle(request)
2517 || callback == NULL || id == NULL) {
2518 return package_manager_error(
2519 PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
2522 if (request->request_cb_table == NULL)
2523 __initialize_request_cb_table(request);
2525 ret = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
2526 if (ret != PACKAGE_MANAGER_ERROR_NONE)
2529 ret = __request_res_create_dir(request, internal_res_request_callback, &req_id);
2532 ret = __insert_res_request_cb_info(request, req_id,
2533 callback, user_data);
2535 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
2536 __FUNCTION__, "failed to create request cb info");
2544 API int package_manager_request_add_res_remove_path(
2545 package_manager_request_h request, const char *res_path)
2549 if (package_manager_client_validate_handle(request)
2550 || res_path == NULL) {
2552 package_manager_error
2553 (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
2557 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
2558 if (retval != PACKAGE_MANAGER_ERROR_NONE)
2561 if (pkgmgr_client_add_res_remove_path(request->pc, res_path))
2562 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
2564 return PACKAGE_MANAGER_ERROR_NONE;
2567 API int package_manager_request_res_remove_with_cb(
2568 package_manager_request_h request,
2569 package_manager_request_res_event_cb callback,
2570 void *user_data, int *id)
2575 if (package_manager_client_validate_handle(request)
2576 || callback == NULL || id == NULL) {
2577 return package_manager_error(
2578 PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
2581 ret = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
2582 if (ret != PACKAGE_MANAGER_ERROR_NONE)
2585 if (request->request_cb_table == NULL)
2586 __initialize_request_cb_table(request);
2588 ret = __request_res_remove(request, internal_res_request_callback, &req_id);
2591 ret = __insert_res_request_cb_info(request, req_id,
2592 callback, user_data);
2594 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
2595 __FUNCTION__, "failed to create request cb info");
2603 API int package_manager_res_event_info_get_error_code(
2604 package_manager_res_event_info_h handle,
2605 package_manager_error_e *error)
2610 ret = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
2611 if (ret != PACKAGE_MANAGER_ERROR_NONE)
2614 if (handle == NULL || error == NULL)
2615 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
2617 struct package_manager_res_event_info_s *event_info =
2618 (struct package_manager_res_event_info_s *)handle;
2620 if (event_info->res_event_info_handle == NULL)
2621 return package_manager_error(
2622 PACKAGE_MANAGER_ERROR_INVALID_PARAMETER,
2623 __FUNCTION__, NULL);
2625 if (pkgmgr_res_event_info_get_error_code(
2626 event_info->res_event_info_handle, &error_code))
2627 return package_manager_error(
2628 PACKAGE_MANAGER_ERROR_INVALID_PARAMETER,
2629 __FUNCTION__, NULL);
2631 *error = __convert_to_error(error_code);
2633 return PACKAGE_MANAGER_ERROR_NONE;
2636 typedef struct _foreach_res_event_path_context_ {
2637 package_manager_res_event_path_cb callback;
2639 } foreach_res_event_path_context_s;
2641 static int package_res_event_info_foreach_path_cb(const char *path,
2642 pkgmgr_res_event_path_state state, void *user_data)
2644 foreach_res_event_path_context_s *foreach_context = user_data;
2645 package_manager_res_event_path_state_e path_state =
2646 PACKAGE_MANAGER_RES_EVENT_PATH_STATE_NONE;
2649 if (foreach_context == NULL) {
2650 package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER,
2651 __FUNCTION__, NULL);
2655 if (state == PM_RES_EVENT_PATH_STATE_NONE) {
2656 path_state = PACKAGE_MANAGER_RES_EVENT_PATH_STATE_NONE;
2657 } else if (state == PM_RES_EVENT_PATH_STATE_OK) {
2658 path_state = PACKAGE_MANAGER_RES_EVENT_PATH_STATE_OK;
2659 } else if (state == PM_RES_EVENT_PATH_STATE_FAILED) {
2660 path_state = PACKAGE_MANAGER_RES_EVENT_PATH_STATE_FAILED;
2662 package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER,
2663 __FUNCTION__, NULL);
2667 r = foreach_context->callback(path, path_state,
2668 foreach_context->user_data);
2675 API int package_manager_res_event_info_foreach_path(
2676 package_manager_res_event_info_h handle,
2677 package_manager_res_event_path_cb callback, void *user_data)
2680 foreach_res_event_path_context_s foreach_res_event_path_context = {
2681 .callback = callback,
2682 .user_data = user_data,
2685 ret = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
2686 if (ret != PACKAGE_MANAGER_ERROR_NONE)
2689 if (handle == NULL || callback == NULL)
2690 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
2692 struct package_manager_res_event_info_s *event_info =
2693 (struct package_manager_res_event_info_s *)handle;
2695 if (event_info->res_event_info_handle == NULL)
2696 return package_manager_error(
2697 PACKAGE_MANAGER_ERROR_INVALID_PARAMETER,
2698 __FUNCTION__, NULL);
2700 ret = pkgmgr_res_event_info_foreach_path(
2701 event_info->res_event_info_handle,
2702 package_res_event_info_foreach_path_cb,
2703 &foreach_res_event_path_context);
2704 if (ret != PKGMGR_R_OK) {
2705 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR,
2706 __FUNCTION__, NULL);
2709 return PACKAGE_MANAGER_ERROR_NONE;
2712 API int package_manager_get_priv_shared_res_path(const char *package_id, char **path)
2718 ret = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
2719 if (ret != PACKAGE_MANAGER_ERROR_NONE)
2722 if (package_id == NULL || path == NULL)
2723 return package_manager_error(
2724 PACKAGE_MANAGER_ERROR_INVALID_PARAMETER,
2725 __FUNCTION__, NULL);
2727 snprintf(buf, sizeof(buf), "%s/%s/%s", USER_HOME,
2728 PRIV_SHARED_RES, package_id);
2730 path_dup = strdup(buf);
2731 if (path_dup == NULL)
2732 return package_manager_error(
2733 PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
2734 __FUNCTION__, NULL);
2737 return PACKAGE_MANAGER_ERROR_NONE;