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 /* 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);
429 *res_type = res_type_dup;
431 return PACKAGE_MANAGER_ERROR_NONE;
434 API int package_info_get_res_version(package_info_h package_info, char **res_version)
436 char *pkg_info_value = NULL;
437 char *res_version_dup = NULL;
439 if (package_info == NULL || res_version == NULL)
440 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
442 if (pkgmgrinfo_pkginfo_get_res_version(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
443 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
445 res_version_dup = strdup(pkg_info_value);
447 if (res_version_dup == NULL)
448 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
451 *res_version = res_version_dup;
453 return PACKAGE_MANAGER_ERROR_NONE;
456 API int package_info_is_system_package(package_info_h package_info, bool *system)
458 bool pkg_info_value = false;
460 if (package_info == NULL || system == NULL)
461 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
463 if (pkgmgrinfo_pkginfo_is_system(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
464 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
466 *system = pkg_info_value;
468 return PACKAGE_MANAGER_ERROR_NONE;
471 API int package_info_is_removable_package(package_info_h package_info, bool *removable)
473 bool pkg_info_value = false;
475 if (package_info == NULL || removable == NULL)
476 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
478 if (pkgmgrinfo_pkginfo_is_removable(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
479 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
481 *removable = pkg_info_value;
483 return PACKAGE_MANAGER_ERROR_NONE;
486 API int package_info_is_preload_package(package_info_h package_info, bool *preload)
488 bool pkg_info_value = false;
490 if (package_info == NULL || preload == NULL)
491 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
493 if (pkgmgrinfo_pkginfo_is_preload(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
494 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
496 *preload = pkg_info_value;
498 return PACKAGE_MANAGER_ERROR_NONE;
501 API int package_info_is_equal(package_info_h lhs, package_info_h rhs, bool *equal)
503 if (lhs == NULL || rhs == NULL || equal == NULL)
504 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
506 if (!strcmp(lhs->package, rhs->package))
511 return PACKAGE_MANAGER_ERROR_NONE;
514 API int package_info_is_accessible(package_info_h package_info, bool *accessible)
517 bool pkg_info_value = false;
519 if (package_info == NULL || accessible == NULL)
520 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
522 ret = pkgmgrinfo_pkginfo_is_accessible(package_info->pkgmgr_pkginfo, &pkg_info_value);
524 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
527 *accessible = pkg_info_value;
529 return PACKAGE_MANAGER_ERROR_NONE;
532 API int package_info_get_installed_time(package_info_h package_info, int *installed_time)
537 if (package_info == NULL || installed_time == NULL)
538 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
540 ret = pkgmgrinfo_pkginfo_get_installed_time(package_info->pkgmgr_pkginfo, &time_value);
542 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
544 *installed_time = time_value;
546 return PACKAGE_MANAGER_ERROR_NONE;
549 API int package_info_clone(package_info_h *clone, package_info_h package_info)
553 if (clone == NULL || package_info == NULL)
554 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
556 retval = package_info_create(package_info->package, clone);
558 if (retval != PACKAGE_MANAGER_ERROR_NONE)
559 return package_manager_error(retval, __FUNCTION__, NULL);
561 return PACKAGE_MANAGER_ERROR_NONE;
564 API int package_info_foreach_cert_info(package_info_h package_info, package_info_cert_info_cb callback, void *user_data)
567 pkgmgrinfo_certinfo_h handle = NULL;
569 const char *cert_value = NULL;
571 if (package_info == NULL || callback == NULL)
572 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
574 retval = pkgmgrinfo_pkginfo_create_certinfo(&handle);
575 if (retval != PMINFO_R_OK)
576 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
578 retval = pkgmgrinfo_pkginfo_load_certinfo(package_info->package, handle, getuid());
579 if (retval != PMINFO_R_OK) {
580 pkgmgrinfo_pkginfo_destroy_certinfo(handle);
581 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
584 for (i = 0; i <= PACKAGE_INFO_DISTRIBUTOR2_SIGNER_CERT; i++) {
585 retval = pkgmgrinfo_pkginfo_get_cert_value(handle, i, &cert_value);
586 if (retval != PMINFO_R_OK) {
587 pkgmgrinfo_pkginfo_destroy_certinfo(handle);
588 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
591 if (cert_value && strncmp(cert_value, "(null)", strlen("(null)"))) {
592 retval = callback(package_info, (package_cert_type_e)i, cert_value, user_data);
600 pkgmgrinfo_pkginfo_destroy_certinfo(handle);
602 return PACKAGE_MANAGER_ERROR_NONE;
605 static int package_info_foreach_privilege_cb(const char *privilege_name, void *user_data)
607 foreach_privilege_s *foreach_privilege = (foreach_privilege_s *)user_data;
609 if (!foreach_privilege->callback(privilege_name, foreach_privilege->user_data))
615 API int package_info_foreach_privilege_info(package_info_h package_info, package_info_privilege_info_cb callback, void *user_data)
618 foreach_privilege_s foreach_privilege = {
619 .callback = callback,
620 .user_data = user_data,
623 if (package_info == NULL || callback == NULL)
624 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
626 ret = pkgmgrinfo_pkginfo_foreach_privilege(package_info->pkgmgr_pkginfo, package_info_foreach_privilege_cb, &foreach_privilege);
631 static int package_info_foreach_dependency_cb(const char *from, const char *to, const char *type, const char *required_version, void *user_data)
633 foreach_dependency_s *foreach_dependency = (foreach_dependency_s *)user_data;
635 if (!foreach_dependency->callback(from, to, type, required_version, user_data))
641 API int package_info_foreach_dependency_info(package_info_h package_info, package_info_dependency_info_cb callback, void *user_data)
644 foreach_dependency_s foreach_dependency = {
645 .callback = callback,
646 .user_data = user_data,
649 if (package_info == NULL || callback == NULL)
650 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
652 ret = pkgmgrinfo_pkginfo_foreach_dependency(package_info->pkgmgr_pkginfo, package_info_foreach_dependency_cb, &foreach_dependency);
653 if (ret == PMINFO_R_EINVAL)
654 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
655 else if (ret == PMINFO_R_ERROR)
656 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
658 return PACKAGE_MANAGER_ERROR_NONE;
661 API int package_info_foreach_dependency_info_depends_on(package_info_h package_info, package_info_dependency_info_cb callback, void *user_data)
664 foreach_dependency_s foreach_dependency = {
665 .callback = callback,
666 .user_data = user_data,
669 if (package_info == NULL || callback == NULL)
670 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
672 ret = pkgmgrinfo_pkginfo_foreach_depends_on(package_info->pkgmgr_pkginfo, package_info_foreach_dependency_cb, &foreach_dependency);
673 if (ret == PMINFO_R_EINVAL)
674 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
675 else if (ret == PMINFO_R_ERROR)
676 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
678 return PACKAGE_MANAGER_ERROR_NONE;
681 static int package_info_foreach_res_allowed_package_cb(const char *allowed_package, required_privilege_h privilege_handle, void *user_data)
683 foreach_res_allowed_package_s *foreach_res_allowed_package = (foreach_res_allowed_package_s *)user_data;
684 allowed_package_required_privilege_s allowed_package_required_privilege = {
685 .priv = privilege_handle,
688 if (!foreach_res_allowed_package->callback(allowed_package, &allowed_package_required_privilege, foreach_res_allowed_package->user_data))
694 API int package_info_foreach_res_allowed_package(package_info_h package_info, package_info_res_allowed_package_cb callback, void *user_data)
697 foreach_res_allowed_package_s foreach_res_allowed_package = {
698 .callback = callback,
699 .user_data = user_data,
702 if (package_info == NULL || callback == NULL)
703 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
705 ret = pkgmgrinfo_pkginfo_foreach_res_allowed_package(package_info->pkgmgr_pkginfo, package_info_foreach_res_allowed_package_cb, &foreach_res_allowed_package);
706 if (ret == PMINFO_R_EINVAL)
707 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
708 else if (ret == PMINFO_R_ERROR)
709 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
711 return PACKAGE_MANAGER_ERROR_NONE;
714 API int package_info_foreach_required_privilege(allowed_package_required_privilege_h priv_info, package_info_privilege_info_cb callback, void *user_data)
717 foreach_privilege_s foreach_privilege = {
718 .callback = callback,
719 .user_data = user_data,
722 if (priv_info == NULL || callback == NULL)
723 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
725 ret = pkgmgrinfo_pkginfo_foreach_required_privilege(priv_info->priv, package_info_foreach_privilege_cb, &foreach_privilege);
726 if (ret == PMINFO_R_EINVAL)
727 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
729 return PACKAGE_MANAGER_ERROR_NONE;
732 API int package_info_updateinfo_create(const char *pkgid, package_updateinfo_h *info)
735 package_updateinfo_s *update_info;
737 if (pkgid == NULL || info == NULL)
738 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
740 update_info = calloc(1, sizeof(package_updateinfo_s));
741 if (update_info == NULL)
742 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
744 ret = pkgmgrinfo_updateinfo_get_updateinfo(pkgid, &update_info->update_info);
745 if (ret == PMINFO_R_ENOENT) {
747 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
748 } else if (ret == PMINFO_R_EINVAL) {
750 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
751 } else if (ret == PMINFO_R_ERROR) {
753 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
757 return PACKAGE_MANAGER_ERROR_NONE;
760 API int package_info_updateinfo_get_pkgid(package_updateinfo_h info, char **package)
763 char *pkg_updateinfo_value = NULL;
765 package_updateinfo_s *update_info;
767 if (package == NULL || info == NULL)
768 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
770 update_info = (package_updateinfo_s *)info;
771 ret = pkgmgrinfo_updateinfo_get_pkgid(update_info->update_info, &pkg_updateinfo_value);
772 if (ret != PMINFO_R_OK || pkg_updateinfo_value == NULL)
773 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
775 pkgid_dup = strdup(pkg_updateinfo_value);
776 if (pkgid_dup == NULL)
777 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
779 *package = pkgid_dup;
780 return PACKAGE_MANAGER_ERROR_NONE;
783 API int package_info_updateinfo_get_version(package_updateinfo_h info, char **version)
786 char *pkg_updateinfo_value = NULL;
788 package_updateinfo_s *update_info;
790 if (info == NULL || version == NULL)
791 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
793 update_info = (package_updateinfo_s *)info;
794 ret = pkgmgrinfo_updateinfo_get_version(update_info->update_info, &pkg_updateinfo_value);
795 if (ret != PMINFO_R_OK || pkg_updateinfo_value == NULL)
796 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
798 ver_dup = strdup(pkg_updateinfo_value);
800 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
803 return PACKAGE_MANAGER_ERROR_NONE;
806 API int package_info_updateinfo_get_type(package_updateinfo_h info, package_updateinfo_type_e *type)
809 pkgmgrinfo_updateinfo_update_type pkg_updateinfo_value;
810 package_updateinfo_type_e converted_type;
811 package_updateinfo_s *update_info;
813 if (info == NULL || type == NULL)
814 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
816 update_info = (package_updateinfo_s *)info;
817 ret = pkgmgrinfo_updateinfo_get_update_type(update_info->update_info, &pkg_updateinfo_value);
818 if (ret != PMINFO_R_OK)
819 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
821 ret = package_info_updateinfo_convert_type(pkg_updateinfo_value, &converted_type);
823 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
825 *type = converted_type;
826 return PACKAGE_MANAGER_ERROR_NONE;
829 API int package_info_updateinfo_destroy(package_updateinfo_h info)
831 package_updateinfo_s *update_info;
834 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
836 update_info = (package_updateinfo_s *)info;
837 pkgmgrinfo_updateinfo_destroy(update_info->update_info);
840 return PACKAGE_MANAGER_ERROR_NONE;
843 API int package_info_updateinfo_foreach_info(package_info_updateinfo_cb callback, void *user_data)
847 if (callback == NULL)
848 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
850 foreach_updateinfo_context_s foreach_updateinfo = {
851 .callback = callback,
852 .user_data = user_data,
855 ret = pkgmgrinfo_updateinfo_foreach_updateinfo(package_info_foreach_updateinfo_cb, &foreach_updateinfo);
856 if (ret != PMINFO_R_OK)
857 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
859 return PACKAGE_MANAGER_ERROR_NONE;
862 int package_info_create_with_pkginfo(pkgmgrinfo_pkginfo_h pkg_handle, package_info_h *package_info)
864 package_info_h pkg_info = NULL;
865 char *pkg_name = NULL;
868 ret = pkgmgrinfo_pkginfo_get_pkgid(pkg_handle, &pkg_name);
869 if (ret != PMINFO_R_OK)
870 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
872 pkg_info = calloc(1, sizeof(struct package_info_s));
873 if (pkg_info == NULL)
874 return PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY;
876 pkg_info->package = strdup(pkg_name);
877 if (pkg_info->package == NULL) {
879 return PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY;
882 pkg_info->pkgmgr_pkginfo = pkg_handle;
883 *package_info = pkg_info;
885 return PACKAGE_MANAGER_ERROR_NONE;
888 int package_info_destroy_handle(package_info_h handle)
891 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
893 free(handle->package);
896 return PACKAGE_MANAGER_ERROR_NONE;