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 _foreach_app_context_ {
42 package_info_app_cb callback;
44 } foreach_app_context_s;
46 API int package_info_create(const char *package, package_info_h *package_info)
48 package_info_h package_info_created;
49 pkgmgrinfo_pkginfo_h pkgmgr_pkginfo;
51 if (package == NULL || package_info == NULL)
52 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
54 if (pkgmgrinfo_pkginfo_get_pkginfo(package, &pkgmgr_pkginfo) != PKGMGR_R_OK)
55 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
57 package_info_created = calloc(1, sizeof(struct package_info_s));
59 if (package_info_created == NULL) {
60 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgr_pkginfo);
61 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
64 package_info_created->package = strdup(package);
66 if (package_info_created->package == NULL) {
67 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgr_pkginfo);
68 free(package_info_created);
69 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
72 package_info_created->pkgmgr_pkginfo = pkgmgr_pkginfo;
74 *package_info = package_info_created;
76 return PACKAGE_MANAGER_ERROR_NONE;
79 static int package_info_foreach_app_cb(const pkgmgrinfo_appinfo_h handle, void *user_data)
82 pkgmgrinfo_app_component comp;
83 foreach_app_context_s *foreach_app_context = user_data;
87 if (handle == NULL || foreach_app_context == NULL) {
88 package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
89 return PKGMGR_R_EINVAL;
92 ret = pkgmgrinfo_appinfo_get_appid(handle, &appid);
94 return PKGMGR_R_ERROR;
96 ret = pkgmgrinfo_appinfo_get_component(handle, &comp);
98 return PKGMGR_R_ERROR;
100 r = foreach_app_context->callback(comp, appid, foreach_app_context->user_data);
102 return (r == true) ? PKGMGR_R_OK : PKGMGR_R_ERROR;
105 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)
107 foreach_app_context_s foreach_app_context = {
108 .callback = callback,
109 .user_data = user_data,
112 if (package_info == NULL || callback == NULL)
113 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
115 if (comp_type == PACKAGE_INFO_ALLAPP)
116 pkgmgrinfo_appinfo_get_list(package_info->pkgmgr_pkginfo, PMINFO_ALL_APP, package_info_foreach_app_cb, &foreach_app_context);
117 if (comp_type == PACKAGE_INFO_UIAPP)
118 pkgmgrinfo_appinfo_get_list(package_info->pkgmgr_pkginfo, PMINFO_UI_APP, package_info_foreach_app_cb, &foreach_app_context);
119 if (comp_type == PACKAGE_INFO_SERVICEAPP)
120 pkgmgrinfo_appinfo_get_list(package_info->pkgmgr_pkginfo, PMINFO_SVC_APP, package_info_foreach_app_cb, &foreach_app_context);
121 return PACKAGE_MANAGER_ERROR_NONE;
124 API int package_info_destroy(package_info_h package_info)
126 if (package_info == NULL)
127 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
129 free(package_info->package);
131 pkgmgrinfo_pkginfo_destroy_pkginfo(package_info->pkgmgr_pkginfo);
135 return PACKAGE_MANAGER_ERROR_NONE;
138 API int package_info_get_package(package_info_h package_info, char **package)
142 if (package_info == NULL || package == NULL)
143 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
145 package_dup = strdup(package_info->package);
147 if (package_dup == NULL)
148 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
150 *package = package_dup;
152 return PACKAGE_MANAGER_ERROR_NONE;
155 API int package_info_get_main_app_id(package_info_h package_info, char **main_app_id)
158 char *pkg_info_value;
160 if (package_info == NULL || main_app_id == NULL)
161 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
163 if (pkgmgrinfo_pkginfo_get_mainappid(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
164 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
166 mainappid_dup = strdup(pkg_info_value);
167 if (mainappid_dup == NULL)
168 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
170 *main_app_id = mainappid_dup;
172 return PACKAGE_MANAGER_ERROR_NONE;
175 API int package_info_get_label(package_info_h package_info, char **label)
177 char *pkg_info_value = NULL;
178 char *label_dup = NULL;
180 if (package_info == NULL || label == NULL)
181 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
183 if (pkgmgrinfo_pkginfo_get_label(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
184 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
189 label_dup = strdup(pkg_info_value);
191 if (label_dup == NULL)
192 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
197 return PACKAGE_MANAGER_ERROR_NONE;
200 API int package_info_get_icon(package_info_h package_info, char **path)
202 char *pkg_info_value = NULL;
203 char *icon_dup = NULL;
205 if (package_info == NULL || path == NULL)
206 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
208 if (pkgmgrinfo_pkginfo_get_icon(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
209 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
214 icon_dup = strdup(pkg_info_value);
216 if (icon_dup == NULL)
217 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
222 return PACKAGE_MANAGER_ERROR_NONE;
225 API int package_info_get_version(package_info_h package_info, char **version)
227 char *pkg_info_value = NULL;
228 char *ver_dup = NULL;
230 if (package_info == NULL || version == NULL)
231 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
233 if (pkgmgrinfo_pkginfo_get_version(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
234 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
239 ver_dup = strdup(pkg_info_value);
242 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
247 return PACKAGE_MANAGER_ERROR_NONE;
250 API int package_info_get_type(package_info_h package_info, char **type)
252 char *pkg_info_value = NULL;
253 char *type_dup = NULL;
255 if (package_info == NULL || type == NULL)
256 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
258 if (pkgmgrinfo_pkginfo_get_type(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
259 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
264 type_dup = strdup(pkg_info_value);
266 if (type_dup == NULL)
267 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
272 return PACKAGE_MANAGER_ERROR_NONE;
275 API int package_info_get_installed_storage(package_info_h package_info, package_info_installed_storage_type_e *storage)
278 pkgmgrinfo_installed_storage pkg_info_value;
280 if (package_info == NULL || storage == NULL)
281 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
283 ret = pkgmgrinfo_pkginfo_get_installed_storage(package_info->pkgmgr_pkginfo, &pkg_info_value);
285 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
287 if (pkg_info_value == PMINFO_INTERNAL_STORAGE)
288 *storage = PACKAGE_INFO_INTERNAL_STORAGE;
289 else if (pkg_info_value == PMINFO_EXTERNAL_STORAGE)
290 *storage = PACKAGE_INFO_EXTERNAL_STORAGE;
292 return PACKAGE_MANAGER_ERROR_NONE;
295 API int package_info_get_root_path(package_info_h package_info, char **path)
297 char *pkg_info_value = NULL;
298 char *path_dup = NULL;
300 if (package_info == NULL || path == NULL)
301 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
303 if (pkgmgrinfo_pkginfo_get_root_path(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
304 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
309 path_dup = strdup(pkg_info_value);
311 if (path_dup == NULL)
312 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
317 return PACKAGE_MANAGER_ERROR_NONE;
320 API int package_info_get_tep_name(package_info_h package_info, char **name)
322 char *tepname_tmp = NULL;
325 if (package_info == NULL || package_info->package == NULL || name == NULL)
326 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
328 retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
329 if (retval != PACKAGE_MANAGER_ERROR_NONE)
332 if (pkgmgrinfo_pkginfo_get_tep_name(package_info->pkgmgr_pkginfo, &tepname_tmp) != PMINFO_R_OK)
333 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
335 if (tepname_tmp != NULL)
336 *name = strdup(tepname_tmp);
339 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
341 return PACKAGE_MANAGER_ERROR_NONE;
344 API int package_info_is_system_package(package_info_h package_info, bool *system)
346 bool pkg_info_value = false;
348 if (package_info == NULL || system == NULL)
349 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
351 if (pkgmgrinfo_pkginfo_is_system(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
352 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
354 *system = pkg_info_value;
356 return PACKAGE_MANAGER_ERROR_NONE;
359 API int package_info_is_removable_package(package_info_h package_info, bool *removable)
361 bool pkg_info_value = false;
363 if (package_info == NULL || removable == NULL)
364 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
366 if (pkgmgrinfo_pkginfo_is_removable(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
367 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
369 *removable = pkg_info_value;
371 return PACKAGE_MANAGER_ERROR_NONE;
374 API int package_info_is_preload_package(package_info_h package_info, bool *preload)
376 bool pkg_info_value = false;
378 if (package_info == NULL || preload == NULL)
379 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
381 if (pkgmgrinfo_pkginfo_is_preload(package_info->pkgmgr_pkginfo, &pkg_info_value) != PKGMGR_R_OK)
382 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
384 *preload = pkg_info_value;
386 return PACKAGE_MANAGER_ERROR_NONE;
389 API int package_info_is_equal(package_info_h lhs, package_info_h rhs, bool *equal)
391 if (lhs == NULL || rhs == NULL || equal == NULL)
392 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
394 if (!strcmp(lhs->package, rhs->package))
399 return PACKAGE_MANAGER_ERROR_NONE;
402 API int package_info_is_accessible(package_info_h package_info, bool *accessible)
405 bool pkg_info_value = false;
407 if (package_info == NULL || accessible == NULL)
408 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
410 ret = pkgmgrinfo_pkginfo_is_accessible(package_info->pkgmgr_pkginfo, &pkg_info_value);
412 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
415 *accessible = pkg_info_value;
417 return PACKAGE_MANAGER_ERROR_NONE;
420 API int package_info_get_installed_time(package_info_h package_info, int *installed_time)
425 if (package_info == NULL || installed_time == NULL)
426 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
428 ret = pkgmgrinfo_pkginfo_get_installed_time(package_info->pkgmgr_pkginfo, &time_value);
430 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
432 *installed_time = time_value;
434 return PACKAGE_MANAGER_ERROR_NONE;
437 API int package_info_clone(package_info_h *clone, package_info_h package_info)
441 if (clone == NULL || package_info == NULL)
442 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
444 retval = package_info_create(package_info->package, clone);
446 if (retval != PACKAGE_MANAGER_ERROR_NONE)
447 return package_manager_error(retval, __FUNCTION__, NULL);
449 return PACKAGE_MANAGER_ERROR_NONE;
452 API int package_info_foreach_cert_info(package_info_h package_info, package_info_cert_info_cb callback, void *user_data)
455 pkgmgrinfo_certinfo_h handle = NULL;
457 const char *cert_value = NULL;
459 if (package_info == NULL || callback == NULL)
460 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
462 retval = pkgmgrinfo_pkginfo_create_certinfo(&handle);
463 if (retval != PMINFO_R_OK)
464 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
466 retval = pkgmgrinfo_pkginfo_load_certinfo(package_info->package, handle, getuid());
467 if (retval != PMINFO_R_OK) {
468 pkgmgrinfo_pkginfo_destroy_certinfo(handle);
469 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
472 for (i = 0; i <= PACKAGE_INFO_DISTRIBUTOR2_SIGNER_CERT; i++) {
473 retval = pkgmgrinfo_pkginfo_get_cert_value(handle, i, &cert_value);
474 if (retval != PMINFO_R_OK) {
475 pkgmgrinfo_pkginfo_destroy_certinfo(handle);
476 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
479 if (cert_value && strncmp(cert_value, "(null)", strlen("(null)"))) {
480 retval = callback(package_info, (package_cert_type_e)i, cert_value, user_data);
488 pkgmgrinfo_pkginfo_destroy_certinfo(handle);
490 return PACKAGE_MANAGER_ERROR_NONE;
493 API int package_info_foreach_privilege_info(package_info_h package_info, package_info_privilege_info_cb callback, void *user_data)
497 if (package_info == NULL || callback == NULL)
498 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
500 ret = pkgmgrinfo_pkginfo_foreach_privilege(package_info->pkgmgr_pkginfo, (pkgmgrinfo_pkg_privilege_list_cb)callback, user_data);
505 int package_info_create_with_pkginfo(pkgmgrinfo_pkginfo_h pkg_handle, package_info_h *package_info)
507 package_info_h pkg_info = NULL;
508 char *pkg_name = NULL;
510 pkgmgrinfo_pkginfo_get_pkgid(pkg_handle, &pkg_name);
511 if (pkg_name == NULL)
512 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
514 pkg_info = calloc(1, sizeof(struct package_info_s));
515 if (pkg_info == NULL)
516 return PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY;
518 pkg_info->package = strdup(pkg_name);
519 if (pkg_info->package == NULL) {
521 return PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY;
524 pkg_info->pkgmgr_pkginfo = pkg_handle;
525 *package_info = pkg_info;
527 return PACKAGE_MANAGER_ERROR_NONE;
530 int package_info_destroy_handle(package_info_h handle)
533 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
535 free(handle->package);
538 return PACKAGE_MANAGER_ERROR_NONE;