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>
27 #include <package_info.h>
28 #include <package_manager.h>
29 #include <package_manager_internal.h>
30 #include <privilege_checker.h>
36 #define LOG_TAG "CAPI_APPFW_PACKAGE_MANAGER"
38 struct package_info_s {
40 pkgmgrinfo_pkginfo_h pkgmgrinfo_pkginfo;
43 struct package_cert_info_s {
45 pkgmgrinfo_certinfo_h pkgmgrinfo_certinfo;
48 typedef struct _foreach_pkg_context_{
49 package_manager_package_info_cb callback;
51 } foreach_pkg_context_s;
54 typedef struct _foreach_app_context_{
55 package_info_app_cb callback;
57 } foreach_app_context_s;
60 int package_info_create(const char *package, package_info_h *package_info)
62 package_info_h package_info_created;
63 pkgmgrinfo_pkginfo_h pkgmgrinfo_pkginfo;
65 if (package == NULL || package_info == NULL)
67 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
70 if (pkgmgrinfo_pkginfo_get_pkginfo(package, &pkgmgrinfo_pkginfo) != PKGMGR_R_OK)
72 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
75 package_info_created = calloc(1, sizeof(struct package_info_s));
77 if (package_info_created == NULL)
79 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
80 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
83 package_info_created->package = strdup(package);
85 if (package_info_created->package == NULL)
87 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
88 free(package_info_created);
89 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
92 package_info_created->pkgmgrinfo_pkginfo = pkgmgrinfo_pkginfo;
94 *package_info = package_info_created;
96 return PACKAGE_MANAGER_ERROR_NONE;
100 int package_info_get_package_info(const char *package, package_info_h *package_info)
102 return package_info_create(package, package_info);
106 static int package_info_foreach_package_info_cb(const pkgmgrinfo_pkginfo_h handle, void *user_data)
108 char *pkg_name = NULL;
109 foreach_pkg_context_s *foreach_pkg_context = user_data;
110 package_info_h package_info = NULL;
112 if (handle == NULL || foreach_pkg_context == NULL)
114 package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
115 return PKGMGR_R_EINVAL;
118 pkgmgrinfo_pkginfo_get_pkgname(handle, &pkg_name);
120 if (package_info_create(pkg_name, &package_info) == PACKAGE_MANAGER_ERROR_NONE)
122 foreach_pkg_context->callback(package_info, foreach_pkg_context->user_data);
123 package_info_destroy(package_info);
126 /* pkgmgr_get_info_list() needs to be enhanced to stop and continue callback */
131 int package_info_foreach_package_info(package_manager_package_info_cb callback, void *user_data)
133 foreach_pkg_context_s foreach_pkg_context = {
134 .callback = callback,
135 .user_data = user_data,
139 if (callback == NULL)
141 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
144 ret = pkgmgrinfo_pkginfo_get_list(package_info_foreach_package_info_cb, &foreach_pkg_context);
146 return PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE;
149 return PACKAGE_MANAGER_ERROR_NONE;
152 int package_info_filter_foreach_package_info(pkgmgrinfo_pkginfo_filter_h handle, package_manager_package_info_cb callback, void *user_data)
154 foreach_pkg_context_s foreach_pkg_context = {
155 .callback = callback,
156 .user_data = user_data,
160 if ((handle == NULL) || (callback == NULL))
162 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
165 ret = pkgmgrinfo_pkginfo_filter_foreach_pkginfo(handle, package_info_foreach_package_info_cb, &foreach_pkg_context);
167 return PACKAGE_MANAGER_ERROR_IO_ERROR;
170 return PACKAGE_MANAGER_ERROR_NONE;
173 static int package_info_foreach_app_cb (const pkgmgrinfo_appinfo_h handle, void *user_data)
176 char *comp_type = NULL;
177 pkgmgr_app_component comp = PACKAGE_INFO_UIAPP;
178 foreach_app_context_s *foreach_app_context = user_data;
181 if (handle == NULL || foreach_app_context == NULL)
183 package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
184 return PKGMGR_R_EINVAL;
187 ret = pkgmgrinfo_appinfo_get_appid(handle, &appid);
189 return PKGMGR_R_ERROR;
192 ret = pkgmgrinfo_appinfo_get_component_type(handle, &comp_type);
194 return PKGMGR_R_ERROR;
197 if (comp_type && !strncmp("svcapp", comp_type, strlen(comp_type))) {
198 comp = PACKAGE_INFO_SERVICEAPP;
199 } else if (comp_type && !strncmp("uiapp", comp_type, strlen(comp_type))) {
200 comp = PACKAGE_INFO_UIAPP;
202 comp = PACKAGE_INFO_ALLAPP;
205 ret = foreach_app_context->callback(comp, appid, foreach_app_context->user_data);
208 package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
209 return PKGMGR_R_ERROR;
217 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)
219 foreach_app_context_s foreach_app_context = {
220 .callback = callback,
221 .user_data = user_data,
223 pkgmgrinfo_pkginfo_h pkgmgrinfo_pkginfo;
226 if (package_info == NULL || callback == NULL)
228 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
231 if (pkgmgrinfo_pkginfo_get_pkginfo(package_info->package, &pkgmgrinfo_pkginfo) != PKGMGR_R_OK)
233 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
235 if (comp_type == PACKAGE_INFO_ALLAPP)
236 ret = pkgmgrinfo_appinfo_get_list(pkgmgrinfo_pkginfo, PMINFO_ALL_APP, package_info_foreach_app_cb, &foreach_app_context);
237 if (comp_type == PACKAGE_INFO_UIAPP)
238 ret = pkgmgrinfo_appinfo_get_list(pkgmgrinfo_pkginfo, PMINFO_UI_APP, package_info_foreach_app_cb, &foreach_app_context);
239 if (comp_type == PACKAGE_INFO_SERVICEAPP)
240 ret = pkgmgrinfo_appinfo_get_list(pkgmgrinfo_pkginfo, PMINFO_SVC_APP, package_info_foreach_app_cb, &foreach_app_context);
242 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
248 int package_info_destroy(package_info_h package_info)
250 if (package_info == NULL)
252 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
255 free(package_info->package);
257 pkgmgrinfo_pkginfo_destroy_pkginfo(package_info->pkgmgrinfo_pkginfo);
263 return PACKAGE_MANAGER_ERROR_NONE;
266 int package_info_get_package(package_info_h package_info, char **package)
270 if (package_info == NULL || package == NULL)
272 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
275 package_dup = strdup(package_info->package);
277 if (package_dup == NULL)
279 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
282 *package = package_dup;
284 return PACKAGE_MANAGER_ERROR_NONE;
287 int package_info_get_label(package_info_h package_info, char **label)
289 char *pkg_info_value = NULL;
290 char *label_dup = NULL;
292 if (package_info == NULL || label == NULL)
294 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
297 if (pkgmgrinfo_pkginfo_get_label(package_info->pkgmgrinfo_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
299 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
305 label_dup = strdup(pkg_info_value);
307 if (label_dup == NULL)
309 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
315 return PACKAGE_MANAGER_ERROR_NONE;
318 int package_info_get_icon(package_info_h package_info, char **path)
320 char *pkg_info_value = NULL;
321 char *icon_dup = NULL;
323 if (package_info == NULL || path == NULL)
325 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
328 if (pkgmgrinfo_pkginfo_get_icon(package_info->pkgmgrinfo_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
330 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
336 icon_dup = strdup(pkg_info_value);
338 if (icon_dup == NULL)
340 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
346 return PACKAGE_MANAGER_ERROR_NONE;
349 int package_info_get_version(package_info_h package_info, char **version)
351 char *pkg_info_value = NULL;
352 char *ver_dup = NULL;
354 if (package_info == NULL || version == NULL)
356 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
359 if (pkgmgrinfo_pkginfo_get_version(package_info->pkgmgrinfo_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
361 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
367 ver_dup = strdup(pkg_info_value);
371 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
377 return PACKAGE_MANAGER_ERROR_NONE;
380 int package_info_get_type(package_info_h package_info, char **type)
382 char *pkg_info_value = NULL;
383 char *type_dup = NULL;
385 if (package_info == NULL || type == NULL)
387 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
390 if (pkgmgrinfo_pkginfo_get_type(package_info->pkgmgrinfo_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
392 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
398 type_dup = strdup(pkg_info_value);
400 if (type_dup == NULL)
402 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
408 return PACKAGE_MANAGER_ERROR_NONE;
411 int package_info_get_installed_storage(package_info_h package_info, package_info_installed_storage_type_e *storage)
414 pkgmgr_installed_storage pkg_info_value;
416 if (package_info == NULL || storage == NULL)
418 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
421 ret = pkgmgrinfo_pkginfo_get_installed_storage(package_info->pkgmgrinfo_pkginfo, (pkgmgrinfo_installed_storage *)&pkg_info_value);
423 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
425 if (pkg_info_value == PM_INTERNAL_STORAGE)
426 *storage = PACKAGE_INFO_INTERNAL_STORAGE;
427 else if (pkg_info_value == PM_EXTERNAL_STORAGE)
428 *storage = PACKAGE_INFO_EXTERNAL_STORAGE;
430 return PACKAGE_MANAGER_ERROR_NONE;
433 int package_info_get_root_path(package_info_h package_info, char **path)
435 char *pkg_info_value = NULL;
436 char *path_dup = NULL;
438 if (package_info == NULL || path == NULL)
440 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
443 if (pkgmgrinfo_pkginfo_get_root_path(package_info->pkgmgrinfo_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
445 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
451 path_dup = strdup(pkg_info_value);
453 if (path_dup == NULL)
455 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
461 return PACKAGE_MANAGER_ERROR_NONE;
464 int package_info_get_tep_name (package_info_h package_info, char **name)
466 #ifdef _APPFW_FEATURE_EXPANSION_PKG_INSTALL
467 pkgmgrinfo_pkginfo_h pkginfo;
468 char *tepname_tmp = NULL;
471 if (package_info == NULL || package_info->package == NULL || name == NULL)
472 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
474 retval = package_manager_admin_check_privilege();
475 if (retval != PACKAGE_MANAGER_ERROR_NONE) {
479 if (pkgmgrinfo_pkginfo_get_pkginfo(package_info->package, &pkginfo) != PMINFO_R_OK)
480 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
483 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
485 if (pkgmgrinfo_pkginfo_get_tep_name(pkginfo, &tepname_tmp) != PMINFO_R_OK)
486 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
488 if (tepname_tmp != NULL)
489 *name = strdup(tepname_tmp);
492 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
494 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
496 return PACKAGE_MANAGER_ERROR_NONE;
498 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
503 int package_info_get_install_location(package_info_h package_info, package_manager_package_location_e *location)
505 pkgmgr_install_location pkg_info_value = 0;
507 if (package_info == NULL || system == NULL)
509 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
512 if (pkgmgrinfo_pkginfo_get_install_location(package_info->pkgmgrinfo_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
514 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
517 *location = (pkg_info_value==PM_INSTALL_LOCATION_INTERNAL_ONLY ? PACAKGE_MANAGER_LOCATION_INTERNAL : PACAKGE_MANAGER_LOCATION_EXTERNAL);
519 return PACKAGE_MANAGER_ERROR_NONE;
523 int package_info_is_system_package(package_info_h package_info, bool *system)
525 bool pkg_info_value = false;
527 if (package_info == NULL || system == NULL)
529 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
532 if (pkgmgrinfo_pkginfo_is_preload(package_info->pkgmgrinfo_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
534 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
537 *system = pkg_info_value;
539 return PACKAGE_MANAGER_ERROR_NONE;
542 int package_info_is_removable_package(package_info_h package_info, bool *removable)
544 bool pkg_info_value = false;
546 if (package_info == NULL || removable == NULL)
548 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
551 if (pkgmgrinfo_pkginfo_is_removable(package_info->pkgmgrinfo_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
553 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
556 *removable = pkg_info_value;
558 return PACKAGE_MANAGER_ERROR_NONE;
561 int package_info_is_preload_package(package_info_h package_info, bool *preload)
563 bool pkg_info_value = false;
565 if (package_info == NULL || preload == NULL)
567 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
570 if (pkgmgrinfo_pkginfo_is_preload(package_info->pkgmgrinfo_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
572 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
575 *preload = pkg_info_value;
577 return PACKAGE_MANAGER_ERROR_NONE;
580 int package_info_is_equal(package_info_h lhs, package_info_h rhs, bool *equal)
582 if (lhs == NULL || rhs == NULL || equal == NULL)
584 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
587 if (!strcmp(lhs->package, rhs->package))
596 return PACKAGE_MANAGER_ERROR_NONE;
599 int package_info_is_accessible(package_info_h package_info, bool *accessible)
602 bool pkg_info_value = false;
604 if (package_info == NULL || accessible == NULL)
606 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
609 ret = pkgmgrinfo_pkginfo_is_accessible(package_info->pkgmgrinfo_pkginfo, &pkg_info_value);
611 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
614 *accessible = pkg_info_value;
616 return PACKAGE_MANAGER_ERROR_NONE;
619 int package_info_clone(package_info_h *clone, package_info_h package_info)
623 if (clone == NULL || package_info == NULL)
625 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
628 retval = package_info_create(package_info->package, clone);
630 if (retval != PACKAGE_MANAGER_ERROR_NONE)
632 return package_manager_error(retval, __FUNCTION__, NULL);
635 return PACKAGE_MANAGER_ERROR_NONE;
638 int package_info_foreach_cert_info(package_info_h package_info, package_info_cert_info_cb callback, void* user_data)
641 pkgmgrinfo_certinfo_h handle = NULL;
643 const char *cert_value = NULL;
645 if (package_info == NULL || callback == NULL)
647 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
650 retval = pkgmgrinfo_pkginfo_create_certinfo(&handle);
651 if (retval != PMINFO_R_OK)
652 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
654 retval = pkgmgrinfo_pkginfo_load_certinfo(package_info->package, handle);
655 if (retval != PMINFO_R_OK)
657 pkgmgrinfo_pkginfo_destroy_certinfo(handle);
658 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
661 for( i=0; i<=PACKAGE_INFO_DISTRIBUTOR2_SIGNER_CERT; i++)
663 retval = pkgmgrinfo_pkginfo_get_cert_value(handle, i, &cert_value);
664 if (retval != PMINFO_R_OK)
666 pkgmgrinfo_pkginfo_destroy_certinfo(handle);
667 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
670 if ( cert_value && strncmp(cert_value, "(null)", strlen("(null)")) )
672 retval = callback(package_info, (package_cert_type_e)i, cert_value, user_data);
680 pkgmgrinfo_pkginfo_destroy_certinfo(handle);
682 return PACKAGE_MANAGER_ERROR_NONE;
685 int package_info_foreach_privilege_info(package_info_h package_info, package_info_privilege_info_cb callback, void *user_data)
689 if (package_info == NULL || callback == NULL)
691 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
694 ret = pkgmgrinfo_pkginfo_foreach_privilege(package_info->pkgmgrinfo_pkginfo, (pkgmgrinfo_pkg_privilege_list_cb)callback, user_data);