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.
23 #include <package-manager.h>
24 #include <pkgmgr-info.h>
25 #include <tzplatform_config.h>
27 #include "package_info.h"
28 #include "package_manager.h"
29 #include "package_manager_internal.h"
31 struct package_info_s {
33 pkgmgrinfo_pkginfo_h pkgmgr_pkginfo;
36 struct package_cert_info_s {
38 pkgmgrinfo_certinfo_h pkgmgrinfo_certinfo;
41 typedef struct package_updateinfo_s {
42 pkgmgrinfo_updateinfo_h update_info;
43 } package_updateinfo_s;
45 typedef struct allowed_package_required_privilege_s {
46 required_privilege_h priv;
47 } allowed_package_required_privilege_s;
49 typedef struct _foreach_app_context_ {
50 package_info_app_cb callback;
52 } foreach_app_context_s;
54 typedef struct _foreach_updateinfo_ {
55 package_info_updateinfo_cb callback;
57 } foreach_updateinfo_context_s;
59 typedef struct _foreach_privilege_ {
60 package_info_privilege_info_cb callback;
62 } foreach_privilege_s;
64 typedef struct _foreach_dependency_ {
65 package_info_dependency_info_cb callback;
67 } foreach_dependency_s;
69 typedef struct _foreach_res_allowed_package_ {
70 package_info_res_allowed_package_cb callback;
72 } foreach_res_allowed_package_s;
74 static int package_info_foreach_updateinfo_cb(const pkgmgrinfo_updateinfo_h handle, void *user_data)
76 foreach_updateinfo_context_s *foreach_updateinfo = user_data;
79 if (handle == NULL || foreach_updateinfo == NULL)
80 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
81 iteration_next = foreach_updateinfo->callback(handle, foreach_updateinfo->user_data);
82 if (iteration_next == true)
85 return PMINFO_R_ERROR;
88 static int package_info_updateinfo_convert_type(pkgmgrinfo_updateinfo_update_type type, package_updateinfo_type_e *converted_type)
90 if (type == PMINFO_UPDATEINFO_NONE)
91 *converted_type = PACKAGE_UPDATEINFO_TYPE_NONE;
92 else if (type == PMINFO_UPDATEINFO_FORCE)
93 *converted_type = PACKAGE_UPDATEINFO_TYPE_FORCE;
94 else if (type == PMINFO_UPDATEINFO_OPTIONAL)
95 *converted_type = PACKAGE_UPDATEINFO_TYPE_OPTIONAL;
102 API int package_info_create(const char *package, package_info_h *package_info)
104 package_info_h package_info_created;
105 pkgmgrinfo_pkginfo_h pkgmgr_pkginfo;
107 if (package == NULL || package_info == NULL)
108 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
110 if (pkgmgrinfo_pkginfo_get_pkginfo(package, &pkgmgr_pkginfo) != PKGMGR_R_OK)
111 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
113 package_info_created = calloc(1, sizeof(struct package_info_s));
115 if (package_info_created == NULL) {
116 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgr_pkginfo);
117 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
120 package_info_created->package = strdup(package);
122 if (package_info_created->package == NULL) {
123 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgr_pkginfo);
124 free(package_info_created);
125 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
128 package_info_created->pkgmgr_pkginfo = pkgmgr_pkginfo;
130 *package_info = package_info_created;
132 return PACKAGE_MANAGER_ERROR_NONE;
135 static int package_info_foreach_app_cb(const pkgmgrinfo_appinfo_h handle, void *user_data)
138 pkgmgrinfo_app_component comp;
139 foreach_app_context_s *foreach_app_context = user_data;
143 if (handle == NULL || foreach_app_context == NULL) {
144 package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
145 return PKGMGR_R_EINVAL;
148 ret = pkgmgrinfo_appinfo_get_appid(handle, &appid);
150 return PKGMGR_R_ERROR;
152 ret = pkgmgrinfo_appinfo_get_component(handle, &comp);
154 return PKGMGR_R_ERROR;
156 r = foreach_app_context->callback(comp, appid, foreach_app_context->user_data);
158 return (r == true) ? PKGMGR_R_OK : PKGMGR_R_ERROR;
161 API int package_info_foreach_app_from_package(package_info_h package_info, package_info_app_component_type_e comp_type, package_info_app_cb callback, void *user_data)
163 foreach_app_context_s foreach_app_context = {
164 .callback = callback,
165 .user_data = user_data,
168 if (package_info == NULL || callback == NULL)
169 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
171 if (comp_type == PACKAGE_INFO_APP_COMPONENT_TYPE_ALL)
172 pkgmgrinfo_appinfo_get_list(package_info->pkgmgr_pkginfo, PMINFO_ALL_APP, package_info_foreach_app_cb, &foreach_app_context);
173 if (comp_type == PACKAGE_INFO_APP_COMPONENT_TYPE_UI)
174 pkgmgrinfo_appinfo_get_list(package_info->pkgmgr_pkginfo, PMINFO_UI_APP, package_info_foreach_app_cb, &foreach_app_context);
175 if (comp_type == PACKAGE_INFO_APP_COMPONENT_TYPE_SERVICE)
176 pkgmgrinfo_appinfo_get_list(package_info->pkgmgr_pkginfo, PMINFO_SVC_APP, package_info_foreach_app_cb, &foreach_app_context);
177 if (comp_type == PACKAGE_INFO_APP_COMPONENT_TYPE_WIDGET)
178 pkgmgrinfo_appinfo_get_list(package_info->pkgmgr_pkginfo, PMINFO_WIDGET_APP, package_info_foreach_app_cb, &foreach_app_context);
179 if (comp_type == PACKAGE_INFO_APP_COMPONENT_TYPE_WATCH)
180 pkgmgrinfo_appinfo_get_list(package_info->pkgmgr_pkginfo, PMINFO_WATCH_APP, package_info_foreach_app_cb, &foreach_app_context);
181 if (comp_type == PACKAGE_INFO_APP_COMPONENT_TYPE_COMPONENT_BASED)
182 pkgmgrinfo_appinfo_get_list(package_info->pkgmgr_pkginfo, PMINFO_COMPONENT_BASED_APP, package_info_foreach_app_cb, &foreach_app_context);
184 return PACKAGE_MANAGER_ERROR_NONE;
187 API int package_info_destroy(package_info_h package_info)
189 if (package_info == NULL)
190 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
192 free(package_info->package);
194 pkgmgrinfo_pkginfo_destroy_pkginfo(package_info->pkgmgr_pkginfo);
198 return PACKAGE_MANAGER_ERROR_NONE;
201 API int package_info_get_package(package_info_h package_info, char **package)
205 if (package_info == NULL || package == NULL)
206 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
208 package_dup = strdup(package_info->package);
210 if (package_dup == NULL)
211 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
213 *package = package_dup;
215 return PACKAGE_MANAGER_ERROR_NONE;
218 API int package_info_get_main_app_id(package_info_h package_info, char **main_app_id)
221 char *pkg_info_value;
223 if (package_info == NULL || main_app_id == NULL)
224 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
226 if (pkgmgrinfo_pkginfo_get_mainappid(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
227 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
229 mainappid_dup = strdup(pkg_info_value);
230 if (mainappid_dup == NULL)
231 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
233 *main_app_id = mainappid_dup;
235 return PACKAGE_MANAGER_ERROR_NONE;
238 API int package_info_get_label(package_info_h package_info, char **label)
240 char *pkg_info_value = NULL;
241 char *label_dup = NULL;
243 if (package_info == NULL || label == NULL)
244 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
246 if (pkgmgrinfo_pkginfo_get_label(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
247 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
252 label_dup = strdup(pkg_info_value);
254 if (label_dup == NULL)
255 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
260 return PACKAGE_MANAGER_ERROR_NONE;
263 API int package_info_get_icon(package_info_h package_info, char **path)
265 char *pkg_info_value = NULL;
266 char *icon_dup = NULL;
268 if (package_info == NULL || path == NULL)
269 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
271 if (pkgmgrinfo_pkginfo_get_icon(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
272 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
277 icon_dup = strdup(pkg_info_value);
279 if (icon_dup == NULL)
280 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
285 return PACKAGE_MANAGER_ERROR_NONE;
288 API int package_info_get_version(package_info_h package_info, char **version)
290 char *pkg_info_value = NULL;
291 char *ver_dup = NULL;
293 if (package_info == NULL || version == NULL)
294 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
296 if (pkgmgrinfo_pkginfo_get_version(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
297 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
302 ver_dup = strdup(pkg_info_value);
305 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
310 return PACKAGE_MANAGER_ERROR_NONE;
313 API int package_info_get_type(package_info_h package_info, char **type)
315 char *pkg_info_value = NULL;
316 char *type_dup = NULL;
318 if (package_info == NULL || type == NULL)
319 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
321 if (pkgmgrinfo_pkginfo_get_type(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
322 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
327 type_dup = strdup(pkg_info_value);
329 if (type_dup == NULL)
330 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
335 return PACKAGE_MANAGER_ERROR_NONE;
338 API int package_info_get_installed_storage(package_info_h package_info, package_info_installed_storage_type_e *storage)
341 pkgmgrinfo_installed_storage pkg_info_value;
343 if (package_info == NULL || storage == NULL)
344 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
346 ret = pkgmgrinfo_pkginfo_get_installed_storage(package_info->pkgmgr_pkginfo, &pkg_info_value);
348 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
350 if (pkg_info_value == PMINFO_INTERNAL_STORAGE)
351 *storage = PACKAGE_INFO_INTERNAL_STORAGE;
352 else if (pkg_info_value == PMINFO_EXTERNAL_STORAGE)
353 *storage = PACKAGE_INFO_EXTERNAL_STORAGE;
354 else if (pkg_info_value == PMINFO_EXTENDED_STORAGE)
355 *storage = PACKAGE_INFO_EXTENDED_STORAGE;
357 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
359 return PACKAGE_MANAGER_ERROR_NONE;
362 API int package_info_get_root_path(package_info_h package_info, char **path)
364 char *pkg_info_value = NULL;
365 char *path_dup = NULL;
367 if (package_info == NULL || path == NULL)
368 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
370 if (pkgmgrinfo_pkginfo_get_root_path(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
371 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
376 path_dup = strdup(pkg_info_value);
378 if (path_dup == NULL)
379 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
384 return PACKAGE_MANAGER_ERROR_NONE;
387 API int package_info_get_tep_name(package_info_h package_info, char **name)
389 char *tepname_tmp = NULL;
392 if (package_info == NULL || package_info->package == NULL || name == NULL)
393 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
395 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
396 if (retval != PACKAGE_MANAGER_ERROR_NONE)
399 if (pkgmgrinfo_pkginfo_get_tep_name(package_info->pkgmgr_pkginfo, &tepname_tmp) != PMINFO_R_OK)
400 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
402 if (tepname_tmp != NULL)
403 *name = strdup(tepname_tmp);
406 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
408 return PACKAGE_MANAGER_ERROR_NONE;
411 API int package_info_get_res_type(package_info_h package_info, char **res_type)
413 char *pkg_info_value = NULL;
414 char *res_type_dup = NULL;
416 if (package_info == NULL || res_type == NULL)
417 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
419 if (pkgmgrinfo_pkginfo_get_res_type(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
420 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
422 res_type_dup = strdup(pkg_info_value);
424 if (res_type_dup == NULL)
425 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
428 *res_type = res_type_dup;
430 return PACKAGE_MANAGER_ERROR_NONE;
433 API int package_info_get_res_version(package_info_h package_info, char **res_version)
435 char *pkg_info_value = NULL;
436 char *res_version_dup = NULL;
438 if (package_info == NULL || res_version == NULL)
439 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
441 if (pkgmgrinfo_pkginfo_get_res_version(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
442 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
444 res_version_dup = strdup(pkg_info_value);
446 if (res_version_dup == NULL)
447 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
450 *res_version = res_version_dup;
452 return PACKAGE_MANAGER_ERROR_NONE;
455 API int package_info_is_system_package(package_info_h package_info, bool *system)
457 bool pkg_info_value = false;
459 if (package_info == NULL || system == NULL)
460 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
462 if (pkgmgrinfo_pkginfo_is_system(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
463 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
465 *system = pkg_info_value;
467 return PACKAGE_MANAGER_ERROR_NONE;
470 API int package_info_is_removable_package(package_info_h package_info, bool *removable)
472 bool pkg_info_value = false;
474 if (package_info == NULL || removable == NULL)
475 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
477 if (pkgmgrinfo_pkginfo_is_removable(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
478 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
480 *removable = pkg_info_value;
482 return PACKAGE_MANAGER_ERROR_NONE;
485 API int package_info_is_preload_package(package_info_h package_info, bool *preload)
487 bool pkg_info_value = false;
489 if (package_info == NULL || preload == NULL)
490 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
492 if (pkgmgrinfo_pkginfo_is_preload(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
493 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
495 *preload = pkg_info_value;
497 return PACKAGE_MANAGER_ERROR_NONE;
500 API int package_info_is_equal(package_info_h lhs, package_info_h rhs, bool *equal)
502 if (lhs == NULL || rhs == NULL || equal == NULL)
503 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
505 if (!strcmp(lhs->package, rhs->package))
510 return PACKAGE_MANAGER_ERROR_NONE;
513 API int package_info_is_accessible(package_info_h package_info, bool *accessible)
516 bool pkg_info_value = false;
518 if (package_info == NULL || accessible == NULL)
519 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
521 ret = pkgmgrinfo_pkginfo_is_accessible(package_info->pkgmgr_pkginfo, &pkg_info_value);
523 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
526 *accessible = pkg_info_value;
528 return PACKAGE_MANAGER_ERROR_NONE;
531 API int package_info_get_installed_time(package_info_h package_info, int *installed_time)
536 if (package_info == NULL || installed_time == NULL)
537 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
539 ret = pkgmgrinfo_pkginfo_get_installed_time(package_info->pkgmgr_pkginfo, &time_value);
541 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
543 *installed_time = time_value;
545 return PACKAGE_MANAGER_ERROR_NONE;
548 API int package_info_clone(package_info_h *clone, package_info_h package_info)
552 if (clone == NULL || package_info == NULL)
553 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
555 retval = package_info_create(package_info->package, clone);
557 if (retval != PACKAGE_MANAGER_ERROR_NONE)
558 return package_manager_error(retval, __FUNCTION__, NULL);
560 return PACKAGE_MANAGER_ERROR_NONE;
563 API int package_info_foreach_cert_info(package_info_h package_info, package_info_cert_info_cb callback, void *user_data)
566 pkgmgrinfo_certinfo_h handle = NULL;
568 const char *cert_value = NULL;
570 if (package_info == NULL || callback == NULL)
571 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
573 retval = pkgmgrinfo_pkginfo_create_certinfo(&handle);
574 if (retval != PMINFO_R_OK)
575 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
577 retval = pkgmgrinfo_pkginfo_load_certinfo(package_info->package, handle, getuid());
578 if (retval != PMINFO_R_OK) {
579 pkgmgrinfo_pkginfo_destroy_certinfo(handle);
580 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
583 for (i = 0; i <= PACKAGE_INFO_DISTRIBUTOR2_SIGNER_CERT; i++) {
584 retval = pkgmgrinfo_pkginfo_get_cert_value(handle, i, &cert_value);
585 if (retval != PMINFO_R_OK) {
586 pkgmgrinfo_pkginfo_destroy_certinfo(handle);
587 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
590 if (cert_value && strncmp(cert_value, "(null)", strlen("(null)"))) {
591 retval = callback(package_info, (package_cert_type_e)i, cert_value, user_data);
599 pkgmgrinfo_pkginfo_destroy_certinfo(handle);
601 return PACKAGE_MANAGER_ERROR_NONE;
604 static int package_info_foreach_privilege_cb(const char *privilege_name, void *user_data)
606 foreach_privilege_s *foreach_privilege = (foreach_privilege_s *)user_data;
608 if (!foreach_privilege->callback(privilege_name, foreach_privilege->user_data))
614 API int package_info_foreach_privilege_info(package_info_h package_info, package_info_privilege_info_cb callback, void *user_data)
617 foreach_privilege_s foreach_privilege = {
618 .callback = callback,
619 .user_data = user_data,
622 if (package_info == NULL || callback == NULL)
623 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
625 ret = pkgmgrinfo_pkginfo_foreach_privilege(package_info->pkgmgr_pkginfo, package_info_foreach_privilege_cb, &foreach_privilege);
630 static int package_info_foreach_dependency_cb(const char *from, const char *to, const char *type, const char *required_version, void *user_data)
632 foreach_dependency_s *foreach_dependency = (foreach_dependency_s *)user_data;
634 if (!foreach_dependency->callback(from, to, type, required_version, user_data))
640 API int package_info_foreach_dependency_info(package_info_h package_info, package_info_dependency_info_cb callback, void *user_data)
643 foreach_dependency_s foreach_dependency = {
644 .callback = callback,
645 .user_data = user_data,
648 if (package_info == NULL || callback == NULL)
649 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
651 ret = pkgmgrinfo_pkginfo_foreach_dependency(package_info->pkgmgr_pkginfo, package_info_foreach_dependency_cb, &foreach_dependency);
652 if (ret == PMINFO_R_EINVAL)
653 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
654 else if (ret == PMINFO_R_ERROR)
655 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
657 return PACKAGE_MANAGER_ERROR_NONE;
660 API int package_info_foreach_dependency_info_depends_on(package_info_h package_info, package_info_dependency_info_cb callback, void *user_data)
663 foreach_dependency_s foreach_dependency = {
664 .callback = callback,
665 .user_data = user_data,
668 if (package_info == NULL || callback == NULL)
669 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
671 ret = pkgmgrinfo_pkginfo_foreach_depends_on(package_info->pkgmgr_pkginfo, package_info_foreach_dependency_cb, &foreach_dependency);
672 if (ret == PMINFO_R_EINVAL)
673 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
674 else if (ret == PMINFO_R_ERROR)
675 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
677 return PACKAGE_MANAGER_ERROR_NONE;
680 static int package_info_foreach_res_allowed_package_cb(const char *allowed_package, required_privilege_h privilege_handle, void *user_data)
682 foreach_res_allowed_package_s *foreach_res_allowed_package = (foreach_res_allowed_package_s *)user_data;
683 allowed_package_required_privilege_s allowed_package_required_privilege = {
684 .priv = privilege_handle,
687 if (!foreach_res_allowed_package->callback(allowed_package, &allowed_package_required_privilege, foreach_res_allowed_package->user_data))
693 API int package_info_foreach_res_allowed_package(package_info_h package_info, package_info_res_allowed_package_cb callback, void *user_data)
696 foreach_res_allowed_package_s foreach_res_allowed_package = {
697 .callback = callback,
698 .user_data = user_data,
701 if (package_info == NULL || callback == NULL)
702 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
704 ret = pkgmgrinfo_pkginfo_foreach_res_allowed_package(package_info->pkgmgr_pkginfo, package_info_foreach_res_allowed_package_cb, &foreach_res_allowed_package);
705 if (ret == PMINFO_R_EINVAL)
706 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
707 else if (ret == PMINFO_R_ERROR)
708 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
710 return PACKAGE_MANAGER_ERROR_NONE;
713 API int package_info_foreach_required_privilege(allowed_package_required_privilege_h priv_info, package_info_privilege_info_cb callback, void *user_data)
716 foreach_privilege_s foreach_privilege = {
717 .callback = callback,
718 .user_data = user_data,
721 if (priv_info == NULL || callback == NULL)
722 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
724 ret = pkgmgrinfo_pkginfo_foreach_required_privilege(priv_info->priv, package_info_foreach_privilege_cb, &foreach_privilege);
725 if (ret == PMINFO_R_EINVAL)
726 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
728 return PACKAGE_MANAGER_ERROR_NONE;
731 API int package_info_updateinfo_create(const char *pkgid, package_updateinfo_h *info)
734 package_updateinfo_s *update_info;
736 if (pkgid == NULL || info == NULL)
737 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
739 update_info = calloc(1, sizeof(package_updateinfo_s));
740 if (update_info == NULL)
741 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
743 ret = pkgmgrinfo_updateinfo_get_updateinfo(pkgid, &update_info->update_info);
744 if (ret == PMINFO_R_ENOENT) {
746 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
747 } else if (ret == PMINFO_R_EINVAL) {
749 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
750 } else if (ret == PMINFO_R_ERROR) {
752 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
756 return PACKAGE_MANAGER_ERROR_NONE;
759 API int package_info_updateinfo_get_pkgid(package_updateinfo_h info, char **package)
762 char *pkg_updateinfo_value = NULL;
764 package_updateinfo_s *update_info;
766 if (package == NULL || info == NULL)
767 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
769 update_info = (package_updateinfo_s *)info;
770 ret = pkgmgrinfo_updateinfo_get_pkgid(update_info->update_info, &pkg_updateinfo_value);
771 if (ret != PMINFO_R_OK || pkg_updateinfo_value == NULL)
772 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
774 pkgid_dup = strdup(pkg_updateinfo_value);
775 if (pkgid_dup == NULL)
776 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
778 *package = pkgid_dup;
779 return PACKAGE_MANAGER_ERROR_NONE;
782 API int package_info_updateinfo_get_version(package_updateinfo_h info, char **version)
785 char *pkg_updateinfo_value = NULL;
787 package_updateinfo_s *update_info;
789 if (info == NULL || version == NULL)
790 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
792 update_info = (package_updateinfo_s *)info;
793 ret = pkgmgrinfo_updateinfo_get_version(update_info->update_info, &pkg_updateinfo_value);
794 if (ret != PMINFO_R_OK || pkg_updateinfo_value == NULL)
795 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
797 ver_dup = strdup(pkg_updateinfo_value);
799 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
802 return PACKAGE_MANAGER_ERROR_NONE;
805 API int package_info_updateinfo_get_type(package_updateinfo_h info, package_updateinfo_type_e *type)
808 pkgmgrinfo_updateinfo_update_type pkg_updateinfo_value;
809 package_updateinfo_type_e converted_type;
810 package_updateinfo_s *update_info;
812 if (info == NULL || type == NULL)
813 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
815 update_info = (package_updateinfo_s *)info;
816 ret = pkgmgrinfo_updateinfo_get_update_type(update_info->update_info, &pkg_updateinfo_value);
817 if (ret != PMINFO_R_OK)
818 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
820 ret = package_info_updateinfo_convert_type(pkg_updateinfo_value, &converted_type);
822 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
824 *type = converted_type;
825 return PACKAGE_MANAGER_ERROR_NONE;
828 API int package_info_updateinfo_destroy(package_updateinfo_h info)
830 package_updateinfo_s *update_info;
833 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
835 update_info = (package_updateinfo_s *)info;
836 pkgmgrinfo_updateinfo_destroy(update_info->update_info);
839 return PACKAGE_MANAGER_ERROR_NONE;
842 API int package_info_updateinfo_foreach_info(package_info_updateinfo_cb callback, void *user_data)
846 if (callback == NULL)
847 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
849 foreach_updateinfo_context_s foreach_updateinfo = {
850 .callback = callback,
851 .user_data = user_data,
854 ret = pkgmgrinfo_updateinfo_foreach_updateinfo(package_info_foreach_updateinfo_cb, &foreach_updateinfo);
855 if (ret != PMINFO_R_OK)
856 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
858 return PACKAGE_MANAGER_ERROR_NONE;
861 int package_info_create_with_pkginfo(pkgmgrinfo_pkginfo_h pkg_handle, package_info_h *package_info)
863 package_info_h pkg_info = NULL;
864 char *pkg_name = NULL;
867 ret = pkgmgrinfo_pkginfo_get_pkgid(pkg_handle, &pkg_name);
868 if (ret != PMINFO_R_OK)
869 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
871 pkg_info = calloc(1, sizeof(struct package_info_s));
872 if (pkg_info == NULL)
873 return PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY;
875 pkg_info->package = strdup(pkg_name);
876 if (pkg_info->package == NULL) {
878 return PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY;
881 pkg_info->pkgmgr_pkginfo = pkg_handle;
882 *package_info = pkg_info;
884 return PACKAGE_MANAGER_ERROR_NONE;
887 int package_info_destroy_handle(package_info_h handle)
890 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
892 free(handle->package);
895 return PACKAGE_MANAGER_ERROR_NONE;