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)
397 return package_manager_error(retval, __FUNCTION__, NULL);
399 if (pkgmgrinfo_pkginfo_get_tep_name(package_info->pkgmgr_pkginfo, &tepname_tmp) != PMINFO_R_OK)
400 /* just return error without error log, because most of packages doesn't use tep */
401 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
403 if (tepname_tmp != NULL)
404 *name = strdup(tepname_tmp);
407 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
409 return PACKAGE_MANAGER_ERROR_NONE;
412 API int package_info_get_res_type(package_info_h package_info, char **res_type)
414 char *pkg_info_value = NULL;
415 char *res_type_dup = NULL;
417 if (package_info == NULL || res_type == NULL)
418 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
420 if (pkgmgrinfo_pkginfo_get_res_type(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
421 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
423 res_type_dup = strdup(pkg_info_value);
425 if (res_type_dup == NULL)
426 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);
449 *res_version = res_version_dup;
451 return PACKAGE_MANAGER_ERROR_NONE;
454 API int package_info_is_system_package(package_info_h package_info, bool *system)
456 bool pkg_info_value = false;
458 if (package_info == NULL || system == NULL)
459 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
461 if (pkgmgrinfo_pkginfo_is_system(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
462 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
464 *system = pkg_info_value;
466 return PACKAGE_MANAGER_ERROR_NONE;
469 API int package_info_is_removable_package(package_info_h package_info, bool *removable)
471 bool pkg_info_value = false;
473 if (package_info == NULL || removable == NULL)
474 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
476 if (pkgmgrinfo_pkginfo_is_removable(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
477 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
479 *removable = pkg_info_value;
481 return PACKAGE_MANAGER_ERROR_NONE;
484 API int package_info_is_preload_package(package_info_h package_info, bool *preload)
486 bool pkg_info_value = false;
488 if (package_info == NULL || preload == NULL)
489 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
491 if (pkgmgrinfo_pkginfo_is_preload(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
492 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
494 *preload = pkg_info_value;
496 return PACKAGE_MANAGER_ERROR_NONE;
499 API int package_info_is_equal(package_info_h lhs, package_info_h rhs, bool *equal)
501 if (lhs == NULL || rhs == NULL || equal == NULL)
502 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
504 if (!strcmp(lhs->package, rhs->package))
509 return PACKAGE_MANAGER_ERROR_NONE;
512 API int package_info_is_accessible(package_info_h package_info, bool *accessible)
515 bool pkg_info_value = false;
517 if (package_info == NULL || accessible == NULL)
518 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
520 ret = pkgmgrinfo_pkginfo_is_accessible(package_info->pkgmgr_pkginfo, &pkg_info_value);
522 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
525 *accessible = pkg_info_value;
527 return PACKAGE_MANAGER_ERROR_NONE;
530 API int package_info_get_installed_time(package_info_h package_info, int *installed_time)
535 if (package_info == NULL || installed_time == NULL)
536 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
538 ret = pkgmgrinfo_pkginfo_get_installed_time(package_info->pkgmgr_pkginfo, &time_value);
540 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
542 *installed_time = time_value;
544 return PACKAGE_MANAGER_ERROR_NONE;
547 API int package_info_clone(package_info_h *clone, package_info_h package_info)
551 if (clone == NULL || package_info == NULL)
552 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
554 retval = package_info_create(package_info->package, clone);
556 if (retval != PACKAGE_MANAGER_ERROR_NONE)
557 return package_manager_error(retval, __FUNCTION__, NULL);
559 return PACKAGE_MANAGER_ERROR_NONE;
562 API int package_info_foreach_cert_info(package_info_h package_info, package_info_cert_info_cb callback, void *user_data)
565 pkgmgrinfo_certinfo_h handle = NULL;
567 const char *cert_value = NULL;
569 if (package_info == NULL || callback == NULL)
570 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
572 retval = pkgmgrinfo_pkginfo_create_certinfo(&handle);
573 if (retval != PMINFO_R_OK)
574 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
576 retval = pkgmgrinfo_pkginfo_load_certinfo(package_info->package, handle, getuid());
577 if (retval != PMINFO_R_OK) {
578 pkgmgrinfo_pkginfo_destroy_certinfo(handle);
579 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
582 for (i = 0; i <= PACKAGE_INFO_DISTRIBUTOR2_SIGNER_CERT; i++) {
583 retval = pkgmgrinfo_pkginfo_get_cert_value(handle, i, &cert_value);
584 if (retval != PMINFO_R_OK) {
585 pkgmgrinfo_pkginfo_destroy_certinfo(handle);
586 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
589 if (cert_value && strncmp(cert_value, "(null)", strlen("(null)"))) {
590 retval = callback(package_info, (package_cert_type_e)i, cert_value, user_data);
598 pkgmgrinfo_pkginfo_destroy_certinfo(handle);
600 return PACKAGE_MANAGER_ERROR_NONE;
603 static int package_info_foreach_privilege_cb(const char *privilege_name, void *user_data)
605 foreach_privilege_s *foreach_privilege = (foreach_privilege_s *)user_data;
607 if (!foreach_privilege->callback(privilege_name, foreach_privilege->user_data))
613 API int package_info_foreach_privilege_info(package_info_h package_info, package_info_privilege_info_cb callback, void *user_data)
616 foreach_privilege_s foreach_privilege = {
617 .callback = callback,
618 .user_data = user_data,
621 if (package_info == NULL || callback == NULL)
622 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
624 ret = pkgmgrinfo_pkginfo_foreach_privilege(package_info->pkgmgr_pkginfo, package_info_foreach_privilege_cb, &foreach_privilege);
629 static int package_info_foreach_dependency_cb(const char *from, const char *to, const char *type, const char *required_version, void *user_data)
631 foreach_dependency_s *foreach_dependency = (foreach_dependency_s *)user_data;
633 if (!foreach_dependency->callback(from, to, type, required_version, user_data))
639 API int package_info_foreach_dependency_info(package_info_h package_info, package_info_dependency_info_cb callback, void *user_data)
642 foreach_dependency_s foreach_dependency = {
643 .callback = callback,
644 .user_data = user_data,
647 if (package_info == NULL || callback == NULL)
648 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
650 ret = pkgmgrinfo_pkginfo_foreach_dependency(package_info->pkgmgr_pkginfo, package_info_foreach_dependency_cb, &foreach_dependency);
651 if (ret == PMINFO_R_EINVAL)
652 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
653 else if (ret == PMINFO_R_ERROR)
654 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
656 return PACKAGE_MANAGER_ERROR_NONE;
659 API int package_info_foreach_dependency_info_depends_on(package_info_h package_info, package_info_dependency_info_cb callback, void *user_data)
662 foreach_dependency_s foreach_dependency = {
663 .callback = callback,
664 .user_data = user_data,
667 if (package_info == NULL || callback == NULL)
668 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
670 ret = pkgmgrinfo_pkginfo_foreach_depends_on(package_info->pkgmgr_pkginfo, package_info_foreach_dependency_cb, &foreach_dependency);
671 if (ret == PMINFO_R_EINVAL)
672 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
673 else if (ret == PMINFO_R_ERROR)
674 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
676 return PACKAGE_MANAGER_ERROR_NONE;
679 static int package_info_foreach_res_allowed_package_cb(const char *allowed_package, required_privilege_h privilege_handle, void *user_data)
681 foreach_res_allowed_package_s *foreach_res_allowed_package = (foreach_res_allowed_package_s *)user_data;
682 allowed_package_required_privilege_s allowed_package_required_privilege = {
683 .priv = privilege_handle,
686 if (!foreach_res_allowed_package->callback(allowed_package, &allowed_package_required_privilege, foreach_res_allowed_package->user_data))
692 API int package_info_foreach_res_allowed_package(package_info_h package_info, package_info_res_allowed_package_cb callback, void *user_data)
695 foreach_res_allowed_package_s foreach_res_allowed_package = {
696 .callback = callback,
697 .user_data = user_data,
700 if (package_info == NULL || callback == NULL)
701 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
703 ret = pkgmgrinfo_pkginfo_foreach_res_allowed_package(package_info->pkgmgr_pkginfo, package_info_foreach_res_allowed_package_cb, &foreach_res_allowed_package);
704 if (ret == PMINFO_R_EINVAL)
705 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
706 else if (ret == PMINFO_R_ERROR)
707 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
709 return PACKAGE_MANAGER_ERROR_NONE;
712 API int package_info_foreach_required_privilege(allowed_package_required_privilege_h priv_info, package_info_privilege_info_cb callback, void *user_data)
715 foreach_privilege_s foreach_privilege = {
716 .callback = callback,
717 .user_data = user_data,
720 if (priv_info == NULL || callback == NULL)
721 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
723 ret = pkgmgrinfo_pkginfo_foreach_required_privilege(priv_info->priv, package_info_foreach_privilege_cb, &foreach_privilege);
724 if (ret == PMINFO_R_EINVAL)
725 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
727 return PACKAGE_MANAGER_ERROR_NONE;
730 API int package_info_updateinfo_create(const char *pkgid, package_updateinfo_h *info)
733 package_updateinfo_s *update_info;
735 if (pkgid == NULL || info == NULL)
736 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
738 update_info = calloc(1, sizeof(package_updateinfo_s));
739 if (update_info == NULL)
740 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
742 ret = pkgmgrinfo_updateinfo_get_updateinfo(pkgid, &update_info->update_info);
743 if (ret == PMINFO_R_ENOENT) {
745 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
746 } else if (ret == PMINFO_R_EINVAL) {
748 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
749 } else if (ret == PMINFO_R_ERROR) {
751 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
755 return PACKAGE_MANAGER_ERROR_NONE;
758 API int package_info_updateinfo_get_pkgid(package_updateinfo_h info, char **package)
761 char *pkg_updateinfo_value = NULL;
763 package_updateinfo_s *update_info;
765 if (package == NULL || info == NULL)
766 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
768 update_info = (package_updateinfo_s *)info;
769 ret = pkgmgrinfo_updateinfo_get_pkgid(update_info->update_info, &pkg_updateinfo_value);
770 if (ret != PMINFO_R_OK || pkg_updateinfo_value == NULL)
771 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
773 pkgid_dup = strdup(pkg_updateinfo_value);
774 if (pkgid_dup == NULL)
775 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
777 *package = pkgid_dup;
778 return PACKAGE_MANAGER_ERROR_NONE;
781 API int package_info_updateinfo_get_version(package_updateinfo_h info, char **version)
784 char *pkg_updateinfo_value = NULL;
786 package_updateinfo_s *update_info;
788 if (info == NULL || version == NULL)
789 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
791 update_info = (package_updateinfo_s *)info;
792 ret = pkgmgrinfo_updateinfo_get_version(update_info->update_info, &pkg_updateinfo_value);
793 if (ret != PMINFO_R_OK || pkg_updateinfo_value == NULL)
794 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
796 ver_dup = strdup(pkg_updateinfo_value);
798 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
801 return PACKAGE_MANAGER_ERROR_NONE;
804 API int package_info_updateinfo_get_type(package_updateinfo_h info, package_updateinfo_type_e *type)
807 pkgmgrinfo_updateinfo_update_type pkg_updateinfo_value;
808 package_updateinfo_type_e converted_type;
809 package_updateinfo_s *update_info;
811 if (info == NULL || type == NULL)
812 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
814 update_info = (package_updateinfo_s *)info;
815 ret = pkgmgrinfo_updateinfo_get_update_type(update_info->update_info, &pkg_updateinfo_value);
816 if (ret != PMINFO_R_OK)
817 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
819 ret = package_info_updateinfo_convert_type(pkg_updateinfo_value, &converted_type);
821 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
823 *type = converted_type;
824 return PACKAGE_MANAGER_ERROR_NONE;
827 API int package_info_updateinfo_destroy(package_updateinfo_h info)
829 package_updateinfo_s *update_info;
832 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
834 update_info = (package_updateinfo_s *)info;
835 pkgmgrinfo_updateinfo_destroy(update_info->update_info);
838 return PACKAGE_MANAGER_ERROR_NONE;
841 API int package_info_updateinfo_foreach_info(package_info_updateinfo_cb callback, void *user_data)
845 if (callback == NULL)
846 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
848 foreach_updateinfo_context_s foreach_updateinfo = {
849 .callback = callback,
850 .user_data = user_data,
853 ret = pkgmgrinfo_updateinfo_foreach_updateinfo(package_info_foreach_updateinfo_cb, &foreach_updateinfo);
854 if (ret != PMINFO_R_OK)
855 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
857 return PACKAGE_MANAGER_ERROR_NONE;
860 int package_info_create_with_pkginfo(pkgmgrinfo_pkginfo_h pkg_handle, package_info_h *package_info)
862 package_info_h pkg_info = NULL;
863 char *pkg_name = NULL;
866 ret = pkgmgrinfo_pkginfo_get_pkgid(pkg_handle, &pkg_name);
867 if (ret != PMINFO_R_OK)
868 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
870 pkg_info = calloc(1, sizeof(struct package_info_s));
871 if (pkg_info == NULL)
872 return PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY;
874 pkg_info->package = strdup(pkg_name);
875 if (pkg_info->package == NULL) {
877 return PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY;
880 pkg_info->pkgmgr_pkginfo = pkg_handle;
881 *package_info = pkg_info;
883 return PACKAGE_MANAGER_ERROR_NONE;
886 int package_info_destroy_handle(package_info_h handle)
889 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
891 free(handle->package);
894 return PACKAGE_MANAGER_ERROR_NONE;