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 _foreach_app_context_ {
46 package_info_app_cb callback;
48 } foreach_app_context_s;
50 typedef struct _foreach_updateinfo_ {
51 package_info_updateinfo_cb callback;
53 } foreach_updateinfo_context_s;
55 typedef struct _foreach_privilege_ {
56 package_info_privilege_info_cb callback;
58 } foreach_privilege_s;
60 typedef struct _foreach_dependency_ {
61 package_info_dependency_info_cb callback;
63 } foreach_dependency_s;
65 static int package_info_foreach_updateinfo_cb(const pkgmgrinfo_updateinfo_h handle, void *user_data)
67 foreach_updateinfo_context_s *foreach_updateinfo = user_data;
70 if (handle == NULL || foreach_updateinfo == NULL)
71 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
72 iteration_next = foreach_updateinfo->callback(handle, foreach_updateinfo->user_data);
73 if (iteration_next == true)
76 return PMINFO_R_ERROR;
79 static int package_info_updateinfo_convert_type(pkgmgrinfo_updateinfo_update_type type, package_updateinfo_type_e *converted_type)
81 if (type == PMINFO_UPDATEINFO_NONE)
82 *converted_type = PACKAGE_UPDATEINFO_TYPE_NONE;
83 else if (type == PMINFO_UPDATEINFO_FORCE)
84 *converted_type = PACKAGE_UPDATEINFO_TYPE_FORCE;
85 else if (type == PMINFO_UPDATEINFO_OPTIONAL)
86 *converted_type = PACKAGE_UPDATEINFO_TYPE_OPTIONAL;
93 API int package_info_create(const char *package, package_info_h *package_info)
95 package_info_h package_info_created;
96 pkgmgrinfo_pkginfo_h pkgmgr_pkginfo;
98 if (package == NULL || package_info == NULL)
99 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
101 if (pkgmgrinfo_pkginfo_get_pkginfo(package, &pkgmgr_pkginfo) != PKGMGR_R_OK)
102 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
104 package_info_created = calloc(1, sizeof(struct package_info_s));
106 if (package_info_created == NULL) {
107 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgr_pkginfo);
108 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
111 package_info_created->package = strdup(package);
113 if (package_info_created->package == NULL) {
114 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgr_pkginfo);
115 free(package_info_created);
116 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
119 package_info_created->pkgmgr_pkginfo = pkgmgr_pkginfo;
121 *package_info = package_info_created;
123 return PACKAGE_MANAGER_ERROR_NONE;
126 static int package_info_foreach_app_cb(const pkgmgrinfo_appinfo_h handle, void *user_data)
129 pkgmgrinfo_app_component comp;
130 foreach_app_context_s *foreach_app_context = user_data;
134 if (handle == NULL || foreach_app_context == NULL) {
135 package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
136 return PKGMGR_R_EINVAL;
139 ret = pkgmgrinfo_appinfo_get_appid(handle, &appid);
141 return PKGMGR_R_ERROR;
143 ret = pkgmgrinfo_appinfo_get_component(handle, &comp);
145 return PKGMGR_R_ERROR;
147 r = foreach_app_context->callback(comp, appid, foreach_app_context->user_data);
149 return (r == true) ? PKGMGR_R_OK : PKGMGR_R_ERROR;
152 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)
154 foreach_app_context_s foreach_app_context = {
155 .callback = callback,
156 .user_data = user_data,
159 if (package_info == NULL || callback == NULL)
160 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
162 if (comp_type == PACKAGE_INFO_ALLAPP)
163 pkgmgrinfo_appinfo_get_list(package_info->pkgmgr_pkginfo, PMINFO_ALL_APP, package_info_foreach_app_cb, &foreach_app_context);
164 if (comp_type == PACKAGE_INFO_UIAPP)
165 pkgmgrinfo_appinfo_get_list(package_info->pkgmgr_pkginfo, PMINFO_UI_APP, package_info_foreach_app_cb, &foreach_app_context);
166 if (comp_type == PACKAGE_INFO_SERVICEAPP)
167 pkgmgrinfo_appinfo_get_list(package_info->pkgmgr_pkginfo, PMINFO_SVC_APP, package_info_foreach_app_cb, &foreach_app_context);
168 if (comp_type == PACKAGE_INFO_WIDGETAPP)
169 pkgmgrinfo_appinfo_get_list(package_info->pkgmgr_pkginfo, PMINFO_WIDGET_APP, package_info_foreach_app_cb, &foreach_app_context);
170 if (comp_type == PACKAGE_INFO_WATCHAPP)
171 pkgmgrinfo_appinfo_get_list(package_info->pkgmgr_pkginfo, PMINFO_WATCH_APP, package_info_foreach_app_cb, &foreach_app_context);
173 return PACKAGE_MANAGER_ERROR_NONE;
176 API int package_info_destroy(package_info_h package_info)
178 if (package_info == NULL)
179 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
181 free(package_info->package);
183 pkgmgrinfo_pkginfo_destroy_pkginfo(package_info->pkgmgr_pkginfo);
187 return PACKAGE_MANAGER_ERROR_NONE;
190 API int package_info_get_package(package_info_h package_info, char **package)
194 if (package_info == NULL || package == NULL)
195 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
197 package_dup = strdup(package_info->package);
199 if (package_dup == NULL)
200 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
202 *package = package_dup;
204 return PACKAGE_MANAGER_ERROR_NONE;
207 API int package_info_get_main_app_id(package_info_h package_info, char **main_app_id)
210 char *pkg_info_value;
212 if (package_info == NULL || main_app_id == NULL)
213 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
215 if (pkgmgrinfo_pkginfo_get_mainappid(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
216 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
218 mainappid_dup = strdup(pkg_info_value);
219 if (mainappid_dup == NULL)
220 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
222 *main_app_id = mainappid_dup;
224 return PACKAGE_MANAGER_ERROR_NONE;
227 API int package_info_get_label(package_info_h package_info, char **label)
229 char *pkg_info_value = NULL;
230 char *label_dup = NULL;
232 if (package_info == NULL || label == NULL)
233 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
235 if (pkgmgrinfo_pkginfo_get_label(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
236 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
241 label_dup = strdup(pkg_info_value);
243 if (label_dup == NULL)
244 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
249 return PACKAGE_MANAGER_ERROR_NONE;
252 API int package_info_get_icon(package_info_h package_info, char **path)
254 char *pkg_info_value = NULL;
255 char *icon_dup = NULL;
257 if (package_info == NULL || path == NULL)
258 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
260 if (pkgmgrinfo_pkginfo_get_icon(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
261 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
266 icon_dup = strdup(pkg_info_value);
268 if (icon_dup == NULL)
269 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
274 return PACKAGE_MANAGER_ERROR_NONE;
277 API int package_info_get_version(package_info_h package_info, char **version)
279 char *pkg_info_value = NULL;
280 char *ver_dup = NULL;
282 if (package_info == NULL || version == NULL)
283 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
285 if (pkgmgrinfo_pkginfo_get_version(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
286 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
291 ver_dup = strdup(pkg_info_value);
294 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
299 return PACKAGE_MANAGER_ERROR_NONE;
302 API int package_info_get_type(package_info_h package_info, char **type)
304 char *pkg_info_value = NULL;
305 char *type_dup = NULL;
307 if (package_info == NULL || type == NULL)
308 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
310 if (pkgmgrinfo_pkginfo_get_type(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
311 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
316 type_dup = strdup(pkg_info_value);
318 if (type_dup == NULL)
319 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
324 return PACKAGE_MANAGER_ERROR_NONE;
327 API int package_info_get_installed_storage(package_info_h package_info, package_info_installed_storage_type_e *storage)
330 pkgmgrinfo_installed_storage pkg_info_value;
332 if (package_info == NULL || storage == NULL)
333 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
335 ret = pkgmgrinfo_pkginfo_get_installed_storage(package_info->pkgmgr_pkginfo, &pkg_info_value);
337 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
339 if (pkg_info_value == PMINFO_INTERNAL_STORAGE)
340 *storage = PACKAGE_INFO_INTERNAL_STORAGE;
341 else if (pkg_info_value == PMINFO_EXTERNAL_STORAGE)
342 *storage = PACKAGE_INFO_EXTERNAL_STORAGE;
343 else if (pkg_info_value == PMINFO_EXTENDED_STORAGE)
344 *storage = PACKAGE_INFO_EXTENDED_STORAGE;
346 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
348 return PACKAGE_MANAGER_ERROR_NONE;
351 API int package_info_get_root_path(package_info_h package_info, char **path)
353 char *pkg_info_value = NULL;
354 char *path_dup = NULL;
356 if (package_info == NULL || path == NULL)
357 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
359 if (pkgmgrinfo_pkginfo_get_root_path(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
360 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
365 path_dup = strdup(pkg_info_value);
367 if (path_dup == NULL)
368 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
373 return PACKAGE_MANAGER_ERROR_NONE;
376 API int package_info_get_tep_name(package_info_h package_info, char **name)
378 char *tepname_tmp = NULL;
381 if (package_info == NULL || package_info->package == NULL || name == NULL)
382 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
384 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
385 if (retval != PACKAGE_MANAGER_ERROR_NONE)
388 if (pkgmgrinfo_pkginfo_get_tep_name(package_info->pkgmgr_pkginfo, &tepname_tmp) != PMINFO_R_OK)
389 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
391 if (tepname_tmp != NULL)
392 *name = strdup(tepname_tmp);
395 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
397 return PACKAGE_MANAGER_ERROR_NONE;
400 API int package_info_is_system_package(package_info_h package_info, bool *system)
402 bool pkg_info_value = false;
404 if (package_info == NULL || system == NULL)
405 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
407 if (pkgmgrinfo_pkginfo_is_system(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
408 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
410 *system = pkg_info_value;
412 return PACKAGE_MANAGER_ERROR_NONE;
415 API int package_info_is_removable_package(package_info_h package_info, bool *removable)
417 bool pkg_info_value = false;
419 if (package_info == NULL || removable == NULL)
420 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
422 if (pkgmgrinfo_pkginfo_is_removable(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
423 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
425 *removable = pkg_info_value;
427 return PACKAGE_MANAGER_ERROR_NONE;
430 API int package_info_is_preload_package(package_info_h package_info, bool *preload)
432 bool pkg_info_value = false;
434 if (package_info == NULL || preload == NULL)
435 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
437 if (pkgmgrinfo_pkginfo_is_preload(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
438 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
440 *preload = pkg_info_value;
442 return PACKAGE_MANAGER_ERROR_NONE;
445 API int package_info_is_equal(package_info_h lhs, package_info_h rhs, bool *equal)
447 if (lhs == NULL || rhs == NULL || equal == NULL)
448 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
450 if (!strcmp(lhs->package, rhs->package))
455 return PACKAGE_MANAGER_ERROR_NONE;
458 API int package_info_is_accessible(package_info_h package_info, bool *accessible)
461 bool pkg_info_value = false;
463 if (package_info == NULL || accessible == NULL)
464 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
466 ret = pkgmgrinfo_pkginfo_is_accessible(package_info->pkgmgr_pkginfo, &pkg_info_value);
468 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
471 *accessible = pkg_info_value;
473 return PACKAGE_MANAGER_ERROR_NONE;
476 API int package_info_get_installed_time(package_info_h package_info, int *installed_time)
481 if (package_info == NULL || installed_time == NULL)
482 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
484 ret = pkgmgrinfo_pkginfo_get_installed_time(package_info->pkgmgr_pkginfo, &time_value);
486 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
488 *installed_time = time_value;
490 return PACKAGE_MANAGER_ERROR_NONE;
493 API int package_info_clone(package_info_h *clone, package_info_h package_info)
497 if (clone == NULL || package_info == NULL)
498 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
500 retval = package_info_create(package_info->package, clone);
502 if (retval != PACKAGE_MANAGER_ERROR_NONE)
503 return package_manager_error(retval, __FUNCTION__, NULL);
505 return PACKAGE_MANAGER_ERROR_NONE;
508 API int package_info_foreach_cert_info(package_info_h package_info, package_info_cert_info_cb callback, void *user_data)
511 pkgmgrinfo_certinfo_h handle = NULL;
513 const char *cert_value = NULL;
515 if (package_info == NULL || callback == NULL)
516 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
518 retval = pkgmgrinfo_pkginfo_create_certinfo(&handle);
519 if (retval != PMINFO_R_OK)
520 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
522 retval = pkgmgrinfo_pkginfo_load_certinfo(package_info->package, handle, getuid());
523 if (retval != PMINFO_R_OK) {
524 pkgmgrinfo_pkginfo_destroy_certinfo(handle);
525 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
528 for (i = 0; i <= PACKAGE_INFO_DISTRIBUTOR2_SIGNER_CERT; i++) {
529 retval = pkgmgrinfo_pkginfo_get_cert_value(handle, i, &cert_value);
530 if (retval != PMINFO_R_OK) {
531 pkgmgrinfo_pkginfo_destroy_certinfo(handle);
532 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
535 if (cert_value && strncmp(cert_value, "(null)", strlen("(null)"))) {
536 retval = callback(package_info, (package_cert_type_e)i, cert_value, user_data);
544 pkgmgrinfo_pkginfo_destroy_certinfo(handle);
546 return PACKAGE_MANAGER_ERROR_NONE;
549 static int package_info_foreach_privilege_cb(const char *privilege_name, void *user_data)
551 foreach_privilege_s *foreach_privilege = (foreach_privilege_s *)user_data;
553 if (!foreach_privilege->callback(privilege_name, foreach_privilege->user_data))
559 API int package_info_foreach_privilege_info(package_info_h package_info, package_info_privilege_info_cb callback, void *user_data)
562 foreach_privilege_s foreach_privilege = {
563 .callback = callback,
564 .user_data = user_data,
567 if (package_info == NULL || callback == NULL)
568 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
570 ret = pkgmgrinfo_pkginfo_foreach_privilege(package_info->pkgmgr_pkginfo, package_info_foreach_privilege_cb, &foreach_privilege);
575 static int package_info_foreach_dependency_cb(const char *from, const char *to, const char *type, const char *required_version, void *user_data)
577 foreach_dependency_s *foreach_dependency = (foreach_dependency_s *)user_data;
579 if (!foreach_dependency->callback(from, to, type, required_version, user_data))
585 API int package_info_foreach_dependency_info(package_info_h package_info, package_info_dependency_info_cb callback, void *user_data)
588 foreach_dependency_s foreach_dependency = {
589 .callback = callback,
590 .user_data = user_data,
593 if (package_info == NULL || callback == NULL)
594 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
596 ret = pkgmgrinfo_pkginfo_foreach_dependency(package_info->pkgmgr_pkginfo, package_info_foreach_dependency_cb, &foreach_dependency);
597 if (ret == PMINFO_R_EINVAL)
598 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
599 else if (ret == PMINFO_R_ERROR)
600 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
602 return PACKAGE_MANAGER_ERROR_NONE;
605 API int package_info_foreach_dependency_info_depends_on(package_info_h package_info, package_info_dependency_info_cb callback, void *user_data)
608 foreach_dependency_s foreach_dependency = {
609 .callback = callback,
610 .user_data = user_data,
613 if (package_info == NULL || callback == NULL)
614 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
616 ret = pkgmgrinfo_pkginfo_foreach_depends_on(package_info->pkgmgr_pkginfo, package_info_foreach_dependency_cb, &foreach_dependency);
617 if (ret == PMINFO_R_EINVAL)
618 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
619 else if (ret == PMINFO_R_ERROR)
620 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
622 return PACKAGE_MANAGER_ERROR_NONE;
625 API int package_info_updateinfo_create(const char *pkgid, package_updateinfo_h *info)
628 package_updateinfo_s *update_info;
630 if (pkgid == NULL || info == NULL)
631 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
633 update_info = calloc(1, sizeof(package_updateinfo_s));
634 if (update_info == NULL)
635 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
637 ret = pkgmgrinfo_updateinfo_get_updateinfo(pkgid, &update_info->update_info);
638 if (ret == PMINFO_R_ENOENT) {
640 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
641 } else if (ret == PMINFO_R_EINVAL) {
643 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
644 } else if (ret == PMINFO_R_ERROR) {
646 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
650 return PACKAGE_MANAGER_ERROR_NONE;
653 API int package_info_updateinfo_get_pkgid(package_updateinfo_h info, char **package)
656 char *pkg_updateinfo_value = NULL;
658 package_updateinfo_s *update_info;
660 if (package == NULL || info == NULL)
661 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
663 update_info = (package_updateinfo_s *)info;
664 ret = pkgmgrinfo_updateinfo_get_pkgid(update_info->update_info, &pkg_updateinfo_value);
665 if (ret != PMINFO_R_OK || pkg_updateinfo_value == NULL)
666 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
668 pkgid_dup = strdup(pkg_updateinfo_value);
669 if (pkgid_dup == NULL)
670 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
672 *package = pkgid_dup;
673 return PACKAGE_MANAGER_ERROR_NONE;
676 API int package_info_updateinfo_get_version(package_updateinfo_h info, char **version)
679 char *pkg_updateinfo_value = NULL;
681 package_updateinfo_s *update_info;
683 if (info == NULL || version == NULL)
684 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
686 update_info = (package_updateinfo_s *)info;
687 ret = pkgmgrinfo_updateinfo_get_version(update_info->update_info, &pkg_updateinfo_value);
688 if (ret != PMINFO_R_OK || pkg_updateinfo_value == NULL)
689 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
691 ver_dup = strdup(pkg_updateinfo_value);
693 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
696 return PACKAGE_MANAGER_ERROR_NONE;
699 API int package_info_updateinfo_get_type(package_updateinfo_h info, package_updateinfo_type_e *type)
702 pkgmgrinfo_updateinfo_update_type pkg_updateinfo_value;
703 package_updateinfo_type_e converted_type;
704 package_updateinfo_s *update_info;
706 if (info == NULL || type == NULL)
707 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
709 update_info = (package_updateinfo_s *)info;
710 ret = pkgmgrinfo_updateinfo_get_update_type(update_info->update_info, &pkg_updateinfo_value);
711 if (ret != PMINFO_R_OK)
712 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
714 ret = package_info_updateinfo_convert_type(pkg_updateinfo_value, &converted_type);
716 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
718 *type = converted_type;
719 return PACKAGE_MANAGER_ERROR_NONE;
722 API int package_info_updateinfo_destroy(package_updateinfo_h info)
724 package_updateinfo_s *update_info;
727 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
729 update_info = (package_updateinfo_s *)info;
730 pkgmgrinfo_updateinfo_destroy(update_info->update_info);
733 return PACKAGE_MANAGER_ERROR_NONE;
736 API int package_info_updateinfo_foreach_info(package_info_updateinfo_cb callback, void *user_data)
740 if (callback == NULL)
741 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
743 foreach_updateinfo_context_s foreach_updateinfo = {
744 .callback = callback,
745 .user_data = user_data,
748 ret = pkgmgrinfo_updateinfo_foreach_updateinfo(package_info_foreach_updateinfo_cb, &foreach_updateinfo);
749 if (ret != PMINFO_R_OK)
750 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
752 return PACKAGE_MANAGER_ERROR_NONE;
755 int package_info_create_with_pkginfo(pkgmgrinfo_pkginfo_h pkg_handle, package_info_h *package_info)
757 package_info_h pkg_info = NULL;
758 char *pkg_name = NULL;
761 ret = pkgmgrinfo_pkginfo_get_pkgid(pkg_handle, &pkg_name);
762 if (ret != PMINFO_R_OK)
763 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
765 pkg_info = calloc(1, sizeof(struct package_info_s));
766 if (pkg_info == NULL)
767 return PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY;
769 pkg_info->package = strdup(pkg_name);
770 if (pkg_info->package == NULL) {
772 return PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY;
775 pkg_info->pkgmgr_pkginfo = pkg_handle;
776 *package_info = pkg_info;
778 return PACKAGE_MANAGER_ERROR_NONE;
781 int package_info_destroy_handle(package_info_h handle)
784 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
786 free(handle->package);
789 return PACKAGE_MANAGER_ERROR_NONE;