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_APP_COMPONENT_TYPE_ALL)
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_APP_COMPONENT_TYPE_UI)
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_APP_COMPONENT_TYPE_SERVICE)
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_APP_COMPONENT_TYPE_WIDGET)
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_APP_COMPONENT_TYPE_WATCH)
171 pkgmgrinfo_appinfo_get_list(package_info->pkgmgr_pkginfo, PMINFO_WATCH_APP, package_info_foreach_app_cb, &foreach_app_context);
172 if (comp_type == PACKAGE_INFO_APP_COMPONENT_TYPE_COMPONENT_BASED)
173 pkgmgrinfo_appinfo_get_list(package_info->pkgmgr_pkginfo, PMINFO_COMPONENT_BASED_APP, package_info_foreach_app_cb, &foreach_app_context);
175 return PACKAGE_MANAGER_ERROR_NONE;
178 API int package_info_destroy(package_info_h package_info)
180 if (package_info == NULL)
181 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
183 free(package_info->package);
185 pkgmgrinfo_pkginfo_destroy_pkginfo(package_info->pkgmgr_pkginfo);
189 return PACKAGE_MANAGER_ERROR_NONE;
192 API int package_info_get_package(package_info_h package_info, char **package)
196 if (package_info == NULL || package == NULL)
197 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
199 package_dup = strdup(package_info->package);
201 if (package_dup == NULL)
202 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
204 *package = package_dup;
206 return PACKAGE_MANAGER_ERROR_NONE;
209 API int package_info_get_main_app_id(package_info_h package_info, char **main_app_id)
212 char *pkg_info_value;
214 if (package_info == NULL || main_app_id == NULL)
215 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
217 if (pkgmgrinfo_pkginfo_get_mainappid(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
218 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
220 mainappid_dup = strdup(pkg_info_value);
221 if (mainappid_dup == NULL)
222 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
224 *main_app_id = mainappid_dup;
226 return PACKAGE_MANAGER_ERROR_NONE;
229 API int package_info_get_label(package_info_h package_info, char **label)
231 char *pkg_info_value = NULL;
232 char *label_dup = NULL;
234 if (package_info == NULL || label == NULL)
235 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
237 if (pkgmgrinfo_pkginfo_get_label(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
238 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
243 label_dup = strdup(pkg_info_value);
245 if (label_dup == NULL)
246 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
251 return PACKAGE_MANAGER_ERROR_NONE;
254 API int package_info_get_icon(package_info_h package_info, char **path)
256 char *pkg_info_value = NULL;
257 char *icon_dup = NULL;
259 if (package_info == NULL || path == NULL)
260 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
262 if (pkgmgrinfo_pkginfo_get_icon(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
263 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
268 icon_dup = strdup(pkg_info_value);
270 if (icon_dup == NULL)
271 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
276 return PACKAGE_MANAGER_ERROR_NONE;
279 API int package_info_get_version(package_info_h package_info, char **version)
281 char *pkg_info_value = NULL;
282 char *ver_dup = NULL;
284 if (package_info == NULL || version == NULL)
285 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
287 if (pkgmgrinfo_pkginfo_get_version(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
288 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
293 ver_dup = strdup(pkg_info_value);
296 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
301 return PACKAGE_MANAGER_ERROR_NONE;
304 API int package_info_get_type(package_info_h package_info, char **type)
306 char *pkg_info_value = NULL;
307 char *type_dup = NULL;
309 if (package_info == NULL || type == NULL)
310 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
312 if (pkgmgrinfo_pkginfo_get_type(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
313 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
318 type_dup = strdup(pkg_info_value);
320 if (type_dup == NULL)
321 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
326 return PACKAGE_MANAGER_ERROR_NONE;
329 API int package_info_get_installed_storage(package_info_h package_info, package_info_installed_storage_type_e *storage)
332 pkgmgrinfo_installed_storage pkg_info_value;
334 if (package_info == NULL || storage == NULL)
335 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
337 ret = pkgmgrinfo_pkginfo_get_installed_storage(package_info->pkgmgr_pkginfo, &pkg_info_value);
339 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
341 if (pkg_info_value == PMINFO_INTERNAL_STORAGE)
342 *storage = PACKAGE_INFO_INTERNAL_STORAGE;
343 else if (pkg_info_value == PMINFO_EXTERNAL_STORAGE)
344 *storage = PACKAGE_INFO_EXTERNAL_STORAGE;
345 else if (pkg_info_value == PMINFO_EXTENDED_STORAGE)
346 *storage = PACKAGE_INFO_EXTENDED_STORAGE;
348 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
350 return PACKAGE_MANAGER_ERROR_NONE;
353 API int package_info_get_root_path(package_info_h package_info, char **path)
355 char *pkg_info_value = NULL;
356 char *path_dup = NULL;
358 if (package_info == NULL || path == NULL)
359 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
361 if (pkgmgrinfo_pkginfo_get_root_path(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
362 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
367 path_dup = strdup(pkg_info_value);
369 if (path_dup == NULL)
370 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
375 return PACKAGE_MANAGER_ERROR_NONE;
378 API int package_info_get_tep_name(package_info_h package_info, char **name)
380 char *tepname_tmp = NULL;
383 if (package_info == NULL || package_info->package == NULL || name == NULL)
384 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
386 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
387 if (retval != PACKAGE_MANAGER_ERROR_NONE)
390 if (pkgmgrinfo_pkginfo_get_tep_name(package_info->pkgmgr_pkginfo, &tepname_tmp) != PMINFO_R_OK)
391 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
393 if (tepname_tmp != NULL)
394 *name = strdup(tepname_tmp);
397 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
399 return PACKAGE_MANAGER_ERROR_NONE;
402 API int package_info_is_system_package(package_info_h package_info, bool *system)
404 bool pkg_info_value = false;
406 if (package_info == NULL || system == NULL)
407 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
409 if (pkgmgrinfo_pkginfo_is_system(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
410 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
412 *system = pkg_info_value;
414 return PACKAGE_MANAGER_ERROR_NONE;
417 API int package_info_is_removable_package(package_info_h package_info, bool *removable)
419 bool pkg_info_value = false;
421 if (package_info == NULL || removable == NULL)
422 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
424 if (pkgmgrinfo_pkginfo_is_removable(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
425 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
427 *removable = pkg_info_value;
429 return PACKAGE_MANAGER_ERROR_NONE;
432 API int package_info_is_preload_package(package_info_h package_info, bool *preload)
434 bool pkg_info_value = false;
436 if (package_info == NULL || preload == NULL)
437 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
439 if (pkgmgrinfo_pkginfo_is_preload(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
440 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
442 *preload = pkg_info_value;
444 return PACKAGE_MANAGER_ERROR_NONE;
447 API int package_info_is_equal(package_info_h lhs, package_info_h rhs, bool *equal)
449 if (lhs == NULL || rhs == NULL || equal == NULL)
450 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
452 if (!strcmp(lhs->package, rhs->package))
457 return PACKAGE_MANAGER_ERROR_NONE;
460 API int package_info_is_accessible(package_info_h package_info, bool *accessible)
463 bool pkg_info_value = false;
465 if (package_info == NULL || accessible == NULL)
466 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
468 ret = pkgmgrinfo_pkginfo_is_accessible(package_info->pkgmgr_pkginfo, &pkg_info_value);
470 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
473 *accessible = pkg_info_value;
475 return PACKAGE_MANAGER_ERROR_NONE;
478 API int package_info_get_installed_time(package_info_h package_info, int *installed_time)
483 if (package_info == NULL || installed_time == NULL)
484 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
486 ret = pkgmgrinfo_pkginfo_get_installed_time(package_info->pkgmgr_pkginfo, &time_value);
488 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
490 *installed_time = time_value;
492 return PACKAGE_MANAGER_ERROR_NONE;
495 API int package_info_clone(package_info_h *clone, package_info_h package_info)
499 if (clone == NULL || package_info == NULL)
500 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
502 retval = package_info_create(package_info->package, clone);
504 if (retval != PACKAGE_MANAGER_ERROR_NONE)
505 return package_manager_error(retval, __FUNCTION__, NULL);
507 return PACKAGE_MANAGER_ERROR_NONE;
510 API int package_info_foreach_cert_info(package_info_h package_info, package_info_cert_info_cb callback, void *user_data)
513 pkgmgrinfo_certinfo_h handle = NULL;
515 const char *cert_value = NULL;
517 if (package_info == NULL || callback == NULL)
518 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
520 retval = pkgmgrinfo_pkginfo_create_certinfo(&handle);
521 if (retval != PMINFO_R_OK)
522 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
524 retval = pkgmgrinfo_pkginfo_load_certinfo(package_info->package, handle, getuid());
525 if (retval != PMINFO_R_OK) {
526 pkgmgrinfo_pkginfo_destroy_certinfo(handle);
527 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
530 for (i = 0; i <= PACKAGE_INFO_DISTRIBUTOR2_SIGNER_CERT; i++) {
531 retval = pkgmgrinfo_pkginfo_get_cert_value(handle, i, &cert_value);
532 if (retval != PMINFO_R_OK) {
533 pkgmgrinfo_pkginfo_destroy_certinfo(handle);
534 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
537 if (cert_value && strncmp(cert_value, "(null)", strlen("(null)"))) {
538 retval = callback(package_info, (package_cert_type_e)i, cert_value, user_data);
546 pkgmgrinfo_pkginfo_destroy_certinfo(handle);
548 return PACKAGE_MANAGER_ERROR_NONE;
551 static int package_info_foreach_privilege_cb(const char *privilege_name, void *user_data)
553 foreach_privilege_s *foreach_privilege = (foreach_privilege_s *)user_data;
555 if (!foreach_privilege->callback(privilege_name, foreach_privilege->user_data))
561 API int package_info_foreach_privilege_info(package_info_h package_info, package_info_privilege_info_cb callback, void *user_data)
564 foreach_privilege_s foreach_privilege = {
565 .callback = callback,
566 .user_data = user_data,
569 if (package_info == NULL || callback == NULL)
570 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
572 ret = pkgmgrinfo_pkginfo_foreach_privilege(package_info->pkgmgr_pkginfo, package_info_foreach_privilege_cb, &foreach_privilege);
577 static int package_info_foreach_dependency_cb(const char *from, const char *to, const char *type, const char *required_version, void *user_data)
579 foreach_dependency_s *foreach_dependency = (foreach_dependency_s *)user_data;
581 if (!foreach_dependency->callback(from, to, type, required_version, user_data))
587 API int package_info_foreach_dependency_info(package_info_h package_info, package_info_dependency_info_cb callback, void *user_data)
590 foreach_dependency_s foreach_dependency = {
591 .callback = callback,
592 .user_data = user_data,
595 if (package_info == NULL || callback == NULL)
596 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
598 ret = pkgmgrinfo_pkginfo_foreach_dependency(package_info->pkgmgr_pkginfo, package_info_foreach_dependency_cb, &foreach_dependency);
599 if (ret == PMINFO_R_EINVAL)
600 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
601 else if (ret == PMINFO_R_ERROR)
602 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
604 return PACKAGE_MANAGER_ERROR_NONE;
607 API int package_info_foreach_dependency_info_depends_on(package_info_h package_info, package_info_dependency_info_cb callback, void *user_data)
610 foreach_dependency_s foreach_dependency = {
611 .callback = callback,
612 .user_data = user_data,
615 if (package_info == NULL || callback == NULL)
616 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
618 ret = pkgmgrinfo_pkginfo_foreach_depends_on(package_info->pkgmgr_pkginfo, package_info_foreach_dependency_cb, &foreach_dependency);
619 if (ret == PMINFO_R_EINVAL)
620 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
621 else if (ret == PMINFO_R_ERROR)
622 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
624 return PACKAGE_MANAGER_ERROR_NONE;
627 API int package_info_updateinfo_create(const char *pkgid, package_updateinfo_h *info)
630 package_updateinfo_s *update_info;
632 if (pkgid == NULL || info == NULL)
633 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
635 update_info = calloc(1, sizeof(package_updateinfo_s));
636 if (update_info == NULL)
637 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
639 ret = pkgmgrinfo_updateinfo_get_updateinfo(pkgid, &update_info->update_info);
640 if (ret == PMINFO_R_ENOENT) {
642 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
643 } else if (ret == PMINFO_R_EINVAL) {
645 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
646 } else if (ret == PMINFO_R_ERROR) {
648 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
652 return PACKAGE_MANAGER_ERROR_NONE;
655 API int package_info_updateinfo_get_pkgid(package_updateinfo_h info, char **package)
658 char *pkg_updateinfo_value = NULL;
660 package_updateinfo_s *update_info;
662 if (package == NULL || info == NULL)
663 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
665 update_info = (package_updateinfo_s *)info;
666 ret = pkgmgrinfo_updateinfo_get_pkgid(update_info->update_info, &pkg_updateinfo_value);
667 if (ret != PMINFO_R_OK || pkg_updateinfo_value == NULL)
668 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
670 pkgid_dup = strdup(pkg_updateinfo_value);
671 if (pkgid_dup == NULL)
672 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
674 *package = pkgid_dup;
675 return PACKAGE_MANAGER_ERROR_NONE;
678 API int package_info_updateinfo_get_version(package_updateinfo_h info, char **version)
681 char *pkg_updateinfo_value = NULL;
683 package_updateinfo_s *update_info;
685 if (info == NULL || version == NULL)
686 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
688 update_info = (package_updateinfo_s *)info;
689 ret = pkgmgrinfo_updateinfo_get_version(update_info->update_info, &pkg_updateinfo_value);
690 if (ret != PMINFO_R_OK || pkg_updateinfo_value == NULL)
691 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
693 ver_dup = strdup(pkg_updateinfo_value);
695 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
698 return PACKAGE_MANAGER_ERROR_NONE;
701 API int package_info_updateinfo_get_type(package_updateinfo_h info, package_updateinfo_type_e *type)
704 pkgmgrinfo_updateinfo_update_type pkg_updateinfo_value;
705 package_updateinfo_type_e converted_type;
706 package_updateinfo_s *update_info;
708 if (info == NULL || type == NULL)
709 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
711 update_info = (package_updateinfo_s *)info;
712 ret = pkgmgrinfo_updateinfo_get_update_type(update_info->update_info, &pkg_updateinfo_value);
713 if (ret != PMINFO_R_OK)
714 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
716 ret = package_info_updateinfo_convert_type(pkg_updateinfo_value, &converted_type);
718 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
720 *type = converted_type;
721 return PACKAGE_MANAGER_ERROR_NONE;
724 API int package_info_updateinfo_destroy(package_updateinfo_h info)
726 package_updateinfo_s *update_info;
729 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
731 update_info = (package_updateinfo_s *)info;
732 pkgmgrinfo_updateinfo_destroy(update_info->update_info);
735 return PACKAGE_MANAGER_ERROR_NONE;
738 API int package_info_updateinfo_foreach_info(package_info_updateinfo_cb callback, void *user_data)
742 if (callback == NULL)
743 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
745 foreach_updateinfo_context_s foreach_updateinfo = {
746 .callback = callback,
747 .user_data = user_data,
750 ret = pkgmgrinfo_updateinfo_foreach_updateinfo(package_info_foreach_updateinfo_cb, &foreach_updateinfo);
751 if (ret != PMINFO_R_OK)
752 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
754 return PACKAGE_MANAGER_ERROR_NONE;
757 int package_info_create_with_pkginfo(pkgmgrinfo_pkginfo_h pkg_handle, package_info_h *package_info)
759 package_info_h pkg_info = NULL;
760 char *pkg_name = NULL;
763 ret = pkgmgrinfo_pkginfo_get_pkgid(pkg_handle, &pkg_name);
764 if (ret != PMINFO_R_OK)
765 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
767 pkg_info = calloc(1, sizeof(struct package_info_s));
768 if (pkg_info == NULL)
769 return PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY;
771 pkg_info->package = strdup(pkg_name);
772 if (pkg_info->package == NULL) {
774 return PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY;
777 pkg_info->pkgmgr_pkginfo = pkg_handle;
778 *package_info = pkg_info;
780 return PACKAGE_MANAGER_ERROR_NONE;
783 int package_info_destroy_handle(package_info_h handle)
786 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
788 free(handle->package);
791 return PACKAGE_MANAGER_ERROR_NONE;