4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>,
7 * Jaeho Lee <jaeho81.lee@samsung.com>, Shobhit Srivastava <shobhit.s@samsung.com>
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
30 #include <sys/smack.h>
31 #include <linux/limits.h>
38 #include "pkgmgrinfo_basic.h"
39 #include "pkgmgrinfo_private.h"
40 #include "pkgmgrinfo_debug.h"
41 #include "pkgmgr-info.h"
42 #include "manager/pkginfo_manager.h"
44 static bool _get_bool_value(const char *str)
46 if (str && !strcmp(str, "true"))
52 static gint __compare_func(gconstpointer data1, gconstpointer data2)
54 pkgmgrinfo_node_x *node1 = (pkgmgrinfo_node_x *)data1;
55 pkgmgrinfo_node_x *node2 = (pkgmgrinfo_node_x *)data2;
56 if (node1->prop == node2->prop)
58 else if (node1->prop > node2->prop)
64 static gint __pkg_disable_chk_func(gconstpointer data1, gconstpointer data2)
66 pkgmgrinfo_node_x *node = (pkgmgrinfo_node_x *)data1;
68 if (node->prop == E_PMINFO_PKGINFO_PROP_PACKAGE_DISABLE)
74 static void __destroy_each_node(gpointer data, gpointer user_data)
77 pkgmgrinfo_node_x *node = (pkgmgrinfo_node_x *)data;
90 static void __destroy_metadata_node(gpointer data)
92 pkgmgrinfo_metadata_node_x *node = (pkgmgrinfo_metadata_node_x *)data;
100 static void __cleanup_pkginfo(pkgmgr_pkginfo_x *data)
102 ret_if(data == NULL);
104 free((void *)data->locale);
108 pkgmgrinfo_basic_free_package(data->pkg_info);
114 static void __free_packages(gpointer data)
116 pkgmgrinfo_basic_free_package((package_x *)data);
119 static bool __check_disable_filter_exist(pkgmgrinfo_filter_x *filter)
126 link = g_slist_find_custom(filter->list, NULL, __pkg_disable_chk_func);
133 static int _pkginfo_get_filtered_foreach_pkginfo(uid_t uid,
134 pkgmgrinfo_filter_x *filter, int flag,
135 pkgmgrinfo_pkg_list_cb pkg_list_cb, void *user_data)
139 pkgmgr_pkginfo_x info;
144 list = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
147 return PMINFO_R_ERROR;
149 if (__check_disable_filter_exist(filter) == false) {
150 ret = pkgmgrinfo_pkginfo_filter_add_bool(filter,
151 PMINFO_PKGINFO_PROP_PACKAGE_DISABLE, false);
152 if (ret != PMINFO_R_OK) {
153 _LOGE("Failed to add filter");
154 g_hash_table_destroy(list);
155 return PMINFO_R_ERROR;
159 ret = _pkginfo_get_packages(uid, filter, flag, list);
160 pkgmgrinfo_pkginfo_filter_destroy(filter);
161 if (ret != PMINFO_R_OK) {
162 g_hash_table_destroy(list);
163 return PMINFO_R_ERROR;
166 g_hash_table_iter_init(&iter, list);
167 while (g_hash_table_iter_next(&iter, NULL, &value)) {
168 pkg = (package_x *)value;
171 info.locale = pkg->locale;
172 if (pkg_list_cb(&info, user_data) < 0)
176 g_hash_table_destroy(list);
181 static int _pkgmgrinfo_get_pkginfo(const char *pkgid, uid_t uid,
182 pkgmgrinfo_pkginfo_filter_h filter, pkgmgrinfo_pkginfo_h *handle)
186 pkgmgr_pkginfo_x *info;
188 if (pkgid == NULL || filter == NULL || handle == NULL) {
189 LOGE("invalid parameter");
190 return PMINFO_R_EINVAL;
193 list = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
196 return PMINFO_R_ERROR;
198 ret = _pkginfo_get_packages(uid, filter, PMINFO_PKGINFO_GET_ALL, list);
199 if (ret != PMINFO_R_OK) {
200 g_hash_table_destroy(list);
204 if (!g_hash_table_size(list)) {
205 _LOGD("pkginfo for [%s] is not existed for user [%d]",
207 g_hash_table_destroy(list);
208 return PMINFO_R_ENOENT;
211 info = calloc(1, sizeof(pkgmgr_pkginfo_x));
213 _LOGE("out of memory");
214 g_hash_table_destroy(list);
215 return PMINFO_R_ERROR;
219 info->pkg_info = (package_x *)g_hash_table_lookup(list, pkgid);
220 info->locale = strdup(info->pkg_info->locale);
221 if (info->locale == NULL) {
222 _LOGE("Out of memory");
223 g_hash_table_destroy(list);
225 return PMINFO_R_ERROR;
228 /* just free list only */
229 g_hash_table_steal(list, (gconstpointer)pkgid);
230 g_hash_table_destroy(list);
237 API int pkgmgrinfo_pkginfo_get_usr_pkginfo(const char *pkgid, uid_t uid,
238 pkgmgrinfo_pkginfo_h *handle)
241 pkgmgrinfo_pkginfo_filter_h filter;
244 if (pkgid == NULL || handle == NULL) {
245 LOGE("invalid parameter");
246 return PMINFO_R_EINVAL;
249 list = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
252 return PMINFO_R_ERROR;
254 ret = pkgmgrinfo_pkginfo_filter_create(&filter);
255 if (ret != PMINFO_R_OK)
258 ret = pkgmgrinfo_pkginfo_filter_add_string(filter,
259 PMINFO_PKGINFO_PROP_PACKAGE_ID, pkgid);
260 if (ret != PMINFO_R_OK) {
261 pkgmgrinfo_pkginfo_filter_destroy(filter);
262 return PMINFO_R_ERROR;
265 ret = pkgmgrinfo_pkginfo_filter_add_bool(filter,
266 PMINFO_PKGINFO_PROP_PACKAGE_DISABLE, false);
267 if (ret != PMINFO_R_OK) {
268 pkgmgrinfo_pkginfo_filter_destroy(filter);
269 return PMINFO_R_ERROR;
271 ret = _pkgmgrinfo_get_pkginfo(pkgid, uid, filter, handle);
272 pkgmgrinfo_pkginfo_filter_destroy(filter);
277 API int pkgmgrinfo_pkginfo_get_pkginfo(const char *pkgid,
278 pkgmgrinfo_pkginfo_h *handle)
280 return pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, _getuid(), handle);
283 API int pkgmgrinfo_pkginfo_get_usr_disabled_pkginfo(const char *pkgid,
284 uid_t uid, pkgmgrinfo_pkginfo_h *handle)
287 pkgmgrinfo_pkginfo_filter_h filter;
289 if (pkgid == NULL || handle == NULL) {
290 LOGE("invalid parameter");
291 return PMINFO_R_EINVAL;
294 ret = pkgmgrinfo_pkginfo_filter_create(&filter);
295 if (ret != PMINFO_R_OK) {
299 ret = pkgmgrinfo_pkginfo_filter_add_string(filter,
300 PMINFO_PKGINFO_PROP_PACKAGE_ID, pkgid);
301 if (ret != PMINFO_R_OK) {
302 pkgmgrinfo_pkginfo_filter_destroy(filter);
303 return PMINFO_R_ERROR;
306 ret = pkgmgrinfo_pkginfo_filter_add_bool(filter,
307 PMINFO_PKGINFO_PROP_PACKAGE_DISABLE, true);
308 if (ret != PMINFO_R_OK) {
309 pkgmgrinfo_pkginfo_filter_destroy(filter);
310 return PMINFO_R_ERROR;
313 ret = _pkgmgrinfo_get_pkginfo(pkgid, uid, filter, handle);
314 if (ret == PMINFO_R_ENOENT)
315 LOGE("disabled pkginfo for [%s] is not existed for user [%d]",
317 pkgmgrinfo_pkginfo_filter_destroy(filter);
321 API int pkgmgrinfo_pkginfo_get_usr_all_pkginfo(const char *pkgid, uid_t uid,
322 pkgmgrinfo_pkginfo_h *handle)
325 pkgmgrinfo_pkginfo_filter_h filter;
327 if (pkgid == NULL || handle == NULL) {
328 LOGE("invalid parameter");
329 return PMINFO_R_EINVAL;
332 ret = pkgmgrinfo_pkginfo_filter_create(&filter);
333 if (ret != PMINFO_R_OK)
336 ret = pkgmgrinfo_pkginfo_filter_add_string(filter,
337 PMINFO_PKGINFO_PROP_PACKAGE_ID, pkgid);
338 if (ret != PMINFO_R_OK) {
339 pkgmgrinfo_pkginfo_filter_destroy(filter);
340 return PMINFO_R_ERROR;
343 ret = pkgmgrinfo_pkginfo_filter_add_bool(filter,
344 PMINFO_PKGINFO_PROP_PACKAGE_CHECK_STORAGE, false);
345 if (ret != PMINFO_R_OK) {
346 pkgmgrinfo_pkginfo_filter_destroy(filter);
347 return PMINFO_R_ERROR;
350 ret = _pkgmgrinfo_get_pkginfo(pkgid, uid, filter, handle);
351 pkgmgrinfo_pkginfo_filter_destroy(filter);
356 API int pkgmgrinfo_pkginfo_get_disabled_pkginfo(const char *pkgid,
357 pkgmgrinfo_pkginfo_h *handle)
359 return pkgmgrinfo_pkginfo_get_usr_disabled_pkginfo(pkgid, _getuid(),
363 API int pkgmgrinfo_pkginfo_get_all_pkginfo(const char *pkgid,
364 pkgmgrinfo_pkginfo_h *handle)
366 return pkgmgrinfo_pkginfo_get_usr_all_pkginfo(pkgid, _getuid(), handle);
369 API int pkgmgrinfo_pkginfo_get_usr_list_full(pkgmgrinfo_pkg_list_cb pkg_list_cb,
370 int flag, void *user_data, uid_t uid)
373 pkgmgrinfo_pkginfo_filter_h filter;
375 if (pkg_list_cb == NULL) {
376 LOGE("invalid parameter");
377 return PMINFO_R_EINVAL;
380 /* create an empty filter */
381 ret = pkgmgrinfo_pkginfo_filter_create(&filter);
382 if (ret != PMINFO_R_OK)
385 ret = _pkginfo_get_filtered_foreach_pkginfo(uid, filter, flag,
386 pkg_list_cb, user_data);
388 pkgmgrinfo_pkginfo_filter_destroy(filter);
393 API int pkgmgrinfo_pkginfo_get_list_full(pkgmgrinfo_pkg_list_cb pkg_list_cb,
394 int flag, void *user_data)
396 return pkgmgrinfo_pkginfo_get_usr_list_full(pkg_list_cb, flag,
397 user_data, _getuid());
400 API int pkgmgrinfo_pkginfo_get_usr_list(pkgmgrinfo_pkg_list_cb pkg_list_cb,
401 void *user_data, uid_t uid)
404 pkgmgrinfo_pkginfo_filter_h filter;
406 if (pkg_list_cb == NULL) {
407 LOGE("invalid parameter");
408 return PMINFO_R_EINVAL;
411 /* create an empty filter */
412 ret = pkgmgrinfo_pkginfo_filter_create(&filter);
413 if (ret != PMINFO_R_OK)
416 ret = _pkginfo_get_filtered_foreach_pkginfo(uid, filter,
417 PMINFO_PKGINFO_GET_ALL, pkg_list_cb, user_data);
419 pkgmgrinfo_pkginfo_filter_destroy(filter);
424 API int pkgmgrinfo_pkginfo_get_list(pkgmgrinfo_pkg_list_cb pkg_list_cb,
427 return pkgmgrinfo_pkginfo_get_usr_list(pkg_list_cb, user_data,
431 API int pkgmgrinfo_pkginfo_get_usr_disabled_list(
432 pkgmgrinfo_pkg_list_cb pkg_list_cb, void *user_data, uid_t uid)
435 pkgmgrinfo_pkginfo_filter_h filter;
437 if (pkg_list_cb == NULL) {
438 LOGE("invalid parameter");
439 return PMINFO_R_EINVAL;
442 ret = pkgmgrinfo_pkginfo_filter_create(&filter);
443 if (ret != PMINFO_R_OK)
446 ret = pkgmgrinfo_pkginfo_filter_add_bool(filter,
447 PMINFO_PKGINFO_PROP_PACKAGE_DISABLE, true);
448 if (ret != PMINFO_R_OK) {
449 pkgmgrinfo_pkginfo_filter_destroy(filter);
450 return PMINFO_R_ERROR;
453 ret = _pkginfo_get_filtered_foreach_pkginfo(uid, filter,
454 PMINFO_PKGINFO_GET_ALL, pkg_list_cb, user_data);
456 pkgmgrinfo_pkginfo_filter_destroy(filter);
461 API int pkgmgrinfo_pkginfo_get_disabled_list(pkgmgrinfo_pkg_list_cb pkg_list_cb,
464 return pkgmgrinfo_pkginfo_get_usr_disabled_list(pkg_list_cb, user_data,
468 API int pkgmgrinfo_pkginfo_get_pkgname(pkgmgrinfo_pkginfo_h handle, char **pkg_name)
470 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
472 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
473 retvm_if(pkg_name == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
475 if (info->pkg_info == NULL || info->pkg_info->package == NULL)
476 return PMINFO_R_ERROR;
478 *pkg_name = (char *)info->pkg_info->package;
483 API int pkgmgrinfo_pkginfo_get_pkgid(pkgmgrinfo_pkginfo_h handle, char **pkgid)
485 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
487 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
488 retvm_if(pkgid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
490 if (info->pkg_info == NULL || info->pkg_info->package == NULL)
491 return PMINFO_R_ERROR;
493 *pkgid = (char *)info->pkg_info->package;
498 API int pkgmgrinfo_pkginfo_get_type(pkgmgrinfo_pkginfo_h handle, char **type)
500 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
502 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
503 retvm_if(type == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
505 if (info->pkg_info == NULL)
506 return PMINFO_R_ERROR;
508 if (info->pkg_info->type == NULL)
511 *type = (char *)info->pkg_info->type;
516 API int pkgmgrinfo_pkginfo_get_version(pkgmgrinfo_pkginfo_h handle, char **version)
518 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
520 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
521 retvm_if(version == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
523 if (info->pkg_info == NULL)
524 return PMINFO_R_ERROR;
526 if (info->pkg_info->version == NULL)
529 *version = (char *)info->pkg_info->version;
534 API int pkgmgrinfo_pkginfo_get_api_version(pkgmgrinfo_pkginfo_h handle, char **api_version)
536 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
538 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
539 retvm_if(api_version == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
541 if (info->pkg_info == NULL)
542 return PMINFO_R_ERROR;
544 if (info->pkg_info->api_version == NULL)
547 *api_version = (char *)info->pkg_info->api_version;
552 API int pkgmgrinfo_pkginfo_get_tep_name(pkgmgrinfo_pkginfo_h handle, char **tep_name)
554 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
556 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
557 retvm_if(tep_name == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
559 if (info->pkg_info == NULL || info->pkg_info->tep_name == NULL)
560 return PMINFO_R_ERROR;
562 *tep_name = (char *)info->pkg_info->tep_name;
567 API int pkgmgrinfo_pkginfo_get_zip_mount_file(pkgmgrinfo_pkginfo_h handle, char **zip_mount_file)
569 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
571 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
572 retvm_if(zip_mount_file == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
574 if (info->pkg_info == NULL)
575 return PMINFO_R_ERROR;
577 if (info->pkg_info->zip_mount_file == NULL)
578 *zip_mount_file = "";
580 *zip_mount_file = (char *)info->pkg_info->zip_mount_file;
585 API int pkgmgrinfo_pkginfo_get_external_image_path(pkgmgrinfo_pkginfo_h handle, char **ext_image_path)
587 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
589 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
590 retvm_if(ext_image_path == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
592 if (info->pkg_info == NULL)
593 return PMINFO_R_ERROR;
595 if (info->pkg_info->external_path == NULL)
596 return PMINFO_R_ENOENT;
598 *ext_image_path = (char *)info->pkg_info->external_path;
603 API int pkgmgrinfo_pkginfo_get_install_location(pkgmgrinfo_pkginfo_h handle, pkgmgrinfo_install_location *location)
606 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
608 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
609 retvm_if(location == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
611 if (info->pkg_info == NULL || info->pkg_info->installlocation == NULL)
612 return PMINFO_R_ERROR;
614 val = (char *)info->pkg_info->installlocation;
615 if (strcmp(val, "internal-only") == 0)
616 *location = PMINFO_INSTALL_LOCATION_INTERNAL_ONLY;
617 else if (strcmp(val, "prefer-external") == 0)
618 *location = PMINFO_INSTALL_LOCATION_PREFER_EXTERNAL;
620 *location = PMINFO_INSTALL_LOCATION_AUTO;
625 API int pkgmgrinfo_pkginfo_get_package_size(pkgmgrinfo_pkginfo_h handle, int *size)
627 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
630 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
631 retvm_if(size == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
633 if (info->pkg_info == NULL)
634 return PMINFO_R_ERROR;
636 if (info->pkg_info->package_size == NULL) {
639 _LOGE("out of memory");
640 return PMINFO_R_ERROR;
642 info->pkg_info->package_size = temp;
646 *size = atoi((char *)info->pkg_info->package_size);
651 API int pkgmgrinfo_pkginfo_get_icon(pkgmgrinfo_pkginfo_h handle, char **icon)
654 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
656 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL");
657 retvm_if(icon == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL");
659 if (info->pkg_info == NULL || info->pkg_info->icon == NULL)
660 return PMINFO_R_ERROR;
662 ptr = (icon_x *)info->pkg_info->icon->data;
664 return PMINFO_R_ERROR;
666 /* TODO : should we return empty string if there was no icon? */
667 if (ptr->text == NULL)
675 API int pkgmgrinfo_pkginfo_get_label(pkgmgrinfo_pkginfo_h handle, char **label)
678 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
680 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL");
681 retvm_if(label == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL");
683 if (info->pkg_info == NULL || info->pkg_info->label == NULL)
684 return PMINFO_R_ERROR;
686 ptr = (label_x *)info->pkg_info->label->data;
688 return PMINFO_R_ERROR;
690 /* TODO : should we return empty string if there was no label? */
691 if (ptr->text == NULL)
699 API int pkgmgrinfo_pkginfo_get_description(pkgmgrinfo_pkginfo_h handle, char **description)
702 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
704 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
705 retvm_if(description == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
707 if (info->pkg_info == NULL || info->pkg_info->description == NULL)
708 return PMINFO_R_ERROR;
710 ptr = (description_x *)info->pkg_info->description->data;
712 return PMINFO_R_ERROR;
714 if (ptr->text == NULL)
717 *description = (char *)ptr->text;
722 API int pkgmgrinfo_pkginfo_get_author_name(pkgmgrinfo_pkginfo_h handle, char **author_name)
724 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
727 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
728 retvm_if(author_name == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
730 if (info->pkg_info == NULL || info->pkg_info->author == NULL)
731 return PMINFO_R_ERROR;
733 author = (author_x *)info->pkg_info->author->data;
735 return PMINFO_R_ERROR;
737 if (author->text == NULL)
740 *author_name = (char *)author->text;
745 API int pkgmgrinfo_pkginfo_get_author_email(pkgmgrinfo_pkginfo_h handle, char **author_email)
747 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
750 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
751 retvm_if(author_email == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
753 if (info->pkg_info == NULL || info->pkg_info->author == NULL)
754 return PMINFO_R_ERROR;
756 author = (author_x *)info->pkg_info->author->data;
758 return PMINFO_R_ERROR;
760 if (author->email == NULL)
763 *author_email = (char *)author->email;
768 API int pkgmgrinfo_pkginfo_get_author_href(pkgmgrinfo_pkginfo_h handle, char **author_href)
770 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
773 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
774 retvm_if(author_href == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
776 if (info->pkg_info == NULL || info->pkg_info->author == NULL)
777 return PMINFO_R_ERROR;
779 author = (author_x *)info->pkg_info->author->data;
781 return PMINFO_R_ERROR;
783 if (author->href == NULL)
786 *author_href = (char *)author->href;
791 API int pkgmgrinfo_pkginfo_get_installed_storage(pkgmgrinfo_pkginfo_h handle, pkgmgrinfo_installed_storage *storage)
793 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
795 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
796 retvm_if(storage == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
798 if (info->pkg_info == NULL || info->pkg_info->installed_storage == NULL)
799 return PMINFO_R_ERROR;
801 if (strcmp(info->pkg_info->installed_storage, "installed_internal") == 0)
802 *storage = PMINFO_INTERNAL_STORAGE;
803 else if (strcmp(info->pkg_info->installed_storage, "installed_external") == 0)
804 *storage = PMINFO_EXTERNAL_STORAGE;
805 else if (strcmp(info->pkg_info->installed_storage, "installed_extended") == 0)
806 *storage = PMINFO_EXTENDED_STORAGE;
808 return PMINFO_R_ERROR;
813 API int pkgmgrinfo_pkginfo_get_installed_time(pkgmgrinfo_pkginfo_h handle, int *installed_time)
815 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
817 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
818 retvm_if(installed_time == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
820 if (info->pkg_info == NULL || info->pkg_info->installed_time == NULL)
821 return PMINFO_R_ERROR;
823 *installed_time = atoi(info->pkg_info->installed_time);
828 API int pkgmgrinfo_pkginfo_get_storeclientid(pkgmgrinfo_pkginfo_h handle, char **storeclientid)
830 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
832 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
833 retvm_if(storeclientid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
835 if (info->pkg_info == NULL)
836 return PMINFO_R_ERROR;
838 if (info->pkg_info->storeclient_id == NULL)
841 *storeclientid = (char *)info->pkg_info->storeclient_id;
846 API int pkgmgrinfo_pkginfo_get_mainappid(pkgmgrinfo_pkginfo_h handle, char **mainappid)
848 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
850 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
851 retvm_if(mainappid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
853 if (info->pkg_info == NULL || info->pkg_info->mainapp_id == NULL)
854 return PMINFO_R_ERROR;
856 *mainappid = (char *)info->pkg_info->mainapp_id;
861 API int pkgmgrinfo_pkginfo_get_url(pkgmgrinfo_pkginfo_h handle, char **url)
863 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
865 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
866 retvm_if(url == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
868 if (info->pkg_info == NULL)
869 return PMINFO_R_ERROR;
871 if (info->pkg_info->package_url == NULL)
874 *url = (char *)info->pkg_info->package_url;
879 API int pkgmgrinfo_pkginfo_get_root_path(pkgmgrinfo_pkginfo_h handle, char **path)
881 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
883 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
884 retvm_if(path == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
886 if (info->pkg_info == NULL || info->pkg_info->root_path == NULL)
887 return PMINFO_R_ERROR;
889 *path = (char *)info->pkg_info->root_path;
894 API int pkgmgrinfo_pkginfo_get_csc_path(pkgmgrinfo_pkginfo_h handle, char **path)
896 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
898 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
899 retvm_if(path == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
901 if (info->pkg_info == NULL)
902 return PMINFO_R_ERROR;
904 if (info->pkg_info->csc_path == NULL)
907 *path = (char *)info->pkg_info->csc_path;
912 API int pkgmgrinfo_pkginfo_get_support_mode(pkgmgrinfo_pkginfo_h handle, int *support_mode)
914 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
915 retvm_if(support_mode == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
917 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
918 if (info->pkg_info->support_mode)
919 *support_mode = atoi(info->pkg_info->support_mode);
926 API int pkgmgrinfo_pkginfo_is_accessible(pkgmgrinfo_pkginfo_h handle, bool *accessible)
928 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
929 retvm_if(accessible == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
931 #if 0 /* smack issue occured, check later */
933 pkgmgrinfo_pkginfo_get_pkgid(handle, &pkgid);
935 _LOGD("invalid func parameters\n");
936 return PMINFO_R_ERROR;
938 _LOGD("pkgmgr_get_pkg_external_validation() called\n");
941 char app_mmc_path[FILENAME_MAX] = { 0, };
942 char app_dir_path[FILENAME_MAX] = { 0, };
943 char app_mmc_internal_path[FILENAME_MAX] = { 0, };
944 snprintf(app_dir_path, FILENAME_MAX, "%s%s", PKG_INSTALLATION_PATH, pkgid);
945 snprintf(app_mmc_path, FILENAME_MAX, "%s%s", PKG_SD_PATH, pkgid);
946 snprintf(app_mmc_internal_path, FILENAME_MAX, "%s%s/.mmc", PKG_INSTALLATION_PATH, pkgid);
948 /*check whether application is in external memory or not */
949 fp = fopen(app_mmc_path, "r");
951 _LOGD(" app path in external memory not accesible\n");
956 _LOGD("pkgmgr_get_pkg_external_validation() : SD_CARD \n");
960 /*check whether application is in internal or not */
962 _LOGD(" app path in internal memory not accesible\n");
964 return PMINFO_R_ERROR;
967 /*check whether the application is installed in SD card
968 but SD card is not present*/
969 fp = fopen(app_mmc_internal_path, "r");
972 _LOGD("pkgmgr_get_pkg_external_validation() : INTERNAL_MEM \n");
976 _LOGD("pkgmgr_get_pkg_external_validation() : ERROR_MMC_STATUS \n");
981 _LOGD("pkgmgr_get_pkg_external_validation() end\n");
988 API int pkgmgrinfo_pkginfo_is_removable(pkgmgrinfo_pkginfo_h handle, bool *removable)
990 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
992 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
993 retvm_if(removable == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
995 if (info->pkg_info == NULL || info->pkg_info->removable == NULL)
996 return PMINFO_R_ERROR;
998 *removable = _get_bool_value(info->pkg_info->removable);
1003 API int pkgmgrinfo_pkginfo_is_movable(pkgmgrinfo_pkginfo_h handle, bool *movable)
1006 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1008 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1009 retvm_if(movable == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1011 if (info->pkg_info == NULL || info->pkg_info->installlocation == NULL)
1012 return PMINFO_R_ERROR;
1014 val = (char *)info->pkg_info->installlocation;
1015 if (strcmp(val, "internal-only") == 0)
1023 API int pkgmgrinfo_pkginfo_is_preload(pkgmgrinfo_pkginfo_h handle, bool *preload)
1025 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1027 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1028 retvm_if(preload == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1030 if (info->pkg_info == NULL || info->pkg_info->preload == NULL)
1031 return PMINFO_R_ERROR;
1033 *preload = _get_bool_value(info->pkg_info->preload);
1038 API int pkgmgrinfo_pkginfo_is_system(pkgmgrinfo_pkginfo_h handle, bool *system)
1040 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1042 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1043 retvm_if(system == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1045 if (info->pkg_info == NULL || info->pkg_info->system == NULL)
1046 return PMINFO_R_ERROR;
1048 *system = _get_bool_value(info->pkg_info->system);
1053 API int pkgmgrinfo_pkginfo_is_readonly(pkgmgrinfo_pkginfo_h handle, bool *readonly)
1055 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1057 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1058 retvm_if(readonly == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1060 if (info->pkg_info == NULL || info->pkg_info->readonly == NULL)
1061 return PMINFO_R_ERROR;
1063 *readonly = _get_bool_value(info->pkg_info->readonly);
1068 API int pkgmgrinfo_pkginfo_is_update(pkgmgrinfo_pkginfo_h handle, bool *update)
1070 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1072 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1073 retvm_if(update == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1075 if (info->pkg_info == NULL || info->pkg_info->update == NULL)
1076 return PMINFO_R_ERROR;
1078 *update = _get_bool_value(info->pkg_info->update);
1083 API int pkgmgrinfo_pkginfo_is_support_disable(pkgmgrinfo_pkginfo_h handle, bool *support_disable)
1085 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1087 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1088 retvm_if(support_disable == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1090 if (info->pkg_info == NULL || info->pkg_info->support_disable == NULL)
1091 return PMINFO_R_ERROR;
1093 *support_disable = _get_bool_value(info->pkg_info->support_disable);
1098 API int pkgmgrinfo_pkginfo_is_global(pkgmgrinfo_pkginfo_h handle, bool *global)
1100 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1102 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1103 retvm_if(global == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1105 if (info->pkg_info == NULL || info->pkg_info->for_all_users == NULL)
1106 return PMINFO_R_ERROR;
1108 *global = _get_bool_value(info->pkg_info->for_all_users);
1113 API int pkgmgrinfo_pkginfo_is_for_all_users(pkgmgrinfo_pkginfo_h handle, bool *for_all_users)
1115 return pkgmgrinfo_pkginfo_is_global(handle, for_all_users);
1118 API int pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo_h handle)
1120 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1122 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1124 __cleanup_pkginfo(info);
1129 API int pkgmgrinfo_pkginfo_filter_create(pkgmgrinfo_pkginfo_filter_h *handle)
1131 pkgmgrinfo_filter_x *filter;
1133 retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle output parameter is NULL\n");
1135 filter = (pkgmgrinfo_filter_x *)calloc(1, sizeof(pkgmgrinfo_filter_x));
1136 if (filter == NULL) {
1137 _LOGE("Out of Memory!!!");
1138 return PMINFO_R_ERROR;
1146 API int pkgmgrinfo_pkginfo_filter_destroy(pkgmgrinfo_pkginfo_filter_h handle)
1148 pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x *)handle;
1150 retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1153 g_slist_foreach(filter->list, __destroy_each_node, NULL);
1154 g_slist_free(filter->list);
1157 g_slist_free_full(filter->list_metadata, __destroy_metadata_node);
1164 API int pkgmgrinfo_pkginfo_filter_add_int(pkgmgrinfo_pkginfo_filter_h handle,
1165 const char *property, const int value)
1167 char buf[PKG_VALUE_STRING_LEN_MAX] = {'\0'};
1171 pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x *)handle;
1172 pkgmgrinfo_node_x *node;
1174 retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1175 retvm_if(property == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1177 prop = _pminfo_pkginfo_convert_to_prop_int(property);
1178 if (prop < E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_INT ||
1179 prop > E_PMINFO_PKGINFO_PROP_PACKAGE_MAX_INT) {
1180 _LOGE("Invalid Integer Property\n");
1181 return PMINFO_R_EINVAL;
1183 node = (pkgmgrinfo_node_x *)calloc(1, sizeof(pkgmgrinfo_node_x));
1185 _LOGE("Out of Memory!!!\n");
1186 return PMINFO_R_ERROR;
1188 snprintf(buf, PKG_VALUE_STRING_LEN_MAX - 1, "%d", value);
1189 val = strndup(buf, PKG_VALUE_STRING_LEN_MAX - 1);
1191 _LOGE("Out of Memory\n");
1193 return PMINFO_R_ERROR;
1197 /*If API is called multiple times for same property, we should override the previous values.
1198 Last value set will be used for filtering.*/
1199 link = g_slist_find_custom(filter->list, (gconstpointer)node, __compare_func);
1201 filter->list = g_slist_delete_link(filter->list, link);
1202 filter->list = g_slist_append(filter->list, (gpointer)node);
1207 API int pkgmgrinfo_pkginfo_filter_add_bool(pkgmgrinfo_pkginfo_filter_h handle,
1208 const char *property, const bool value)
1213 pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x *)handle;
1214 pkgmgrinfo_node_x *node;
1216 retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1217 retvm_if(property == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1219 prop = _pminfo_pkginfo_convert_to_prop_bool(property);
1220 if (prop < E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_BOOL ||
1221 prop > E_PMINFO_PKGINFO_PROP_PACKAGE_MAX_BOOL) {
1222 _LOGE("Invalid Boolean Property\n");
1223 return PMINFO_R_EINVAL;
1225 node = (pkgmgrinfo_node_x *)calloc(1, sizeof(pkgmgrinfo_node_x));
1227 _LOGE("Out of Memory!!!\n");
1228 return PMINFO_R_ERROR;
1231 val = strndup("true", 4);
1233 val = strndup("false", 5);
1235 _LOGE("Out of Memory\n");
1237 return PMINFO_R_ERROR;
1241 /*If API is called multiple times for same property, we should override the previous values.
1242 Last value set will be used for filtering.*/
1243 link = g_slist_find_custom(filter->list, (gconstpointer)node, __compare_func);
1245 filter->list = g_slist_delete_link(filter->list, link);
1246 filter->list = g_slist_append(filter->list, (gpointer)node);
1251 API int pkgmgrinfo_pkginfo_filter_add_string(pkgmgrinfo_pkginfo_filter_h handle,
1252 const char *property, const char *value)
1257 pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x *)handle;
1258 pkgmgrinfo_node_x *node;
1260 retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1261 retvm_if(property == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1262 retvm_if(value == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1264 prop = _pminfo_pkginfo_convert_to_prop_str(property);
1265 if (prop < E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_STR ||
1266 prop > E_PMINFO_PKGINFO_PROP_PACKAGE_MAX_STR) {
1267 _LOGE("Invalid String Property\n");
1268 return PMINFO_R_EINVAL;
1270 node = (pkgmgrinfo_node_x *)calloc(1, sizeof(pkgmgrinfo_node_x));
1272 _LOGE("Out of Memory!!!\n");
1273 return PMINFO_R_ERROR;
1275 if (strcmp(value, PMINFO_PKGINFO_INSTALL_LOCATION_AUTO) == 0)
1276 val = strndup("auto", PKG_STRING_LEN_MAX - 1);
1277 else if (strcmp(value, PMINFO_PKGINFO_INSTALL_LOCATION_INTERNAL) == 0)
1278 val = strndup("internal-only", PKG_STRING_LEN_MAX - 1);
1279 else if (strcmp(value, PMINFO_PKGINFO_INSTALL_LOCATION_EXTERNAL) == 0)
1280 val = strndup("prefer-external", PKG_STRING_LEN_MAX - 1);
1281 else if (strcmp(value, "installed_internal") == 0)
1282 val = strndup("installed_internal", PKG_STRING_LEN_MAX - 1);
1283 else if (strcmp(value, "installed_external") == 0)
1284 val = strndup("installed_external", PKG_STRING_LEN_MAX - 1);
1286 val = strndup(value, PKG_STRING_LEN_MAX - 1);
1288 _LOGE("Out of Memory\n");
1290 return PMINFO_R_ERROR;
1294 /*If API is called multiple times for same property, we should override the previous values.
1295 Last value set will be used for filtering.*/
1296 link = g_slist_find_custom(filter->list, (gconstpointer)node, __compare_func);
1298 filter->list = g_slist_delete_link(filter->list, link);
1299 filter->list = g_slist_append(filter->list, (gpointer)node);
1304 API int pkgmgrinfo_pkginfo_usr_filter_count(pkgmgrinfo_pkginfo_filter_h handle, int *count, uid_t uid)
1307 GHashTable *list = NULL;
1309 if (handle == NULL || count == NULL) {
1310 _LOGE("invalid parameter");
1311 return PMINFO_R_EINVAL;
1314 list = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
1317 return PMINFO_R_ERROR;
1319 if (__check_disable_filter_exist((pkgmgrinfo_filter_x *)handle) == false) {
1320 ret = pkgmgrinfo_pkginfo_filter_add_bool(handle,
1321 PMINFO_PKGINFO_PROP_PACKAGE_DISABLE, false);
1322 if (ret != PMINFO_R_OK) {
1323 g_hash_table_destroy(list);
1324 return PMINFO_R_ERROR;
1328 ret = _pkginfo_get_packages(uid, handle, PMINFO_PKGINFO_GET_BASICINFO, list);
1329 if (ret != PMINFO_R_OK) {
1330 g_hash_table_destroy(list);
1331 return PMINFO_R_ERROR;
1333 *count = g_hash_table_size(list);
1335 g_hash_table_destroy(list);
1340 API int pkgmgrinfo_pkginfo_filter_count(pkgmgrinfo_pkginfo_filter_h handle, int *count)
1342 return pkgmgrinfo_pkginfo_usr_filter_count(handle, count, _getuid());
1345 API int pkgmgrinfo_pkginfo_usr_filter_foreach_pkginfo(
1346 pkgmgrinfo_pkginfo_filter_h handle,
1347 pkgmgrinfo_pkg_list_cb pkg_cb, void *user_data, uid_t uid)
1349 if (handle == NULL || pkg_cb == NULL) {
1350 LOGE("invalid parameter");
1351 return PMINFO_R_EINVAL;
1354 return _pkginfo_get_filtered_foreach_pkginfo(uid, handle,
1355 PMINFO_PKGINFO_GET_ALL, pkg_cb, user_data);
1358 API int pkgmgrinfo_pkginfo_filter_foreach_pkginfo(pkgmgrinfo_pkginfo_filter_h handle,
1359 pkgmgrinfo_pkg_list_cb pkg_cb, void *user_data)
1361 return pkgmgrinfo_pkginfo_usr_filter_foreach_pkginfo(handle, pkg_cb, user_data, _getuid());
1364 API int pkgmgrinfo_pkginfo_foreach_privilege(pkgmgrinfo_pkginfo_h handle,
1365 pkgmgrinfo_pkg_privilege_list_cb privilege_func, void *user_data)
1367 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL");
1368 retvm_if(privilege_func == NULL, PMINFO_R_EINVAL, "Callback function is NULL");
1370 privilege_x *privilege;
1371 appdefined_privilege_x *appdefined_privilege;
1373 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1375 if (info->pkg_info == NULL)
1376 return PMINFO_R_ERROR;
1378 for (tmp = info->pkg_info->privileges; tmp; tmp = tmp->next) {
1379 privilege = (privilege_x *)tmp->data;
1380 if (privilege == NULL)
1382 ret = privilege_func(privilege->value, user_data);
1387 for (tmp = info->pkg_info->appdefined_privileges; tmp;
1389 appdefined_privilege = (appdefined_privilege_x *)tmp->data;
1390 if (appdefined_privilege == NULL)
1392 ret = privilege_func(appdefined_privilege->value, user_data);
1399 API int pkgmgrinfo_pkginfo_foreach_plugin(pkgmgrinfo_pkginfo_h handle,
1400 pkgmgrinfo_plugin_list_cb plugin_func, void *user_data)
1402 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL");
1403 retvm_if(plugin_func == NULL, PMINFO_R_EINVAL,
1404 "Callback function is NULL");
1408 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1410 if (info->pkg_info == NULL)
1411 return PMINFO_R_ERROR;
1413 for (tmp = info->pkg_info->plugin; tmp; tmp = tmp->next) {
1414 plugin = (plugin_x *)tmp->data;
1417 ret = plugin_func(plugin->pkgid, plugin->appid,
1418 plugin->plugin_type, plugin->plugin_name, user_data);
1426 API int pkgmgrinfo_pkginfo_foreach_appdefined_privilege(
1427 pkgmgrinfo_pkginfo_h handle,
1428 pkgmgrinfo_pkg_appdefined_privilege_list_cb privilege_func,
1431 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL");
1432 retvm_if(privilege_func == NULL, PMINFO_R_EINVAL,
1433 "Callback function is NULL");
1435 appdefined_privilege_x *privilege;
1437 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1439 if (info->pkg_info == NULL)
1440 return PMINFO_R_ERROR;
1442 for (tmp = info->pkg_info->appdefined_privileges; tmp;
1444 privilege = (appdefined_privilege_x *)tmp->data;
1445 if (privilege == NULL)
1447 ret = privilege_func(privilege->value, privilege->license,
1455 API int pkgmgrinfo_pkginfo_foreach_dependency(pkgmgrinfo_pkginfo_h handle,
1456 pkgmgrinfo_pkg_dependency_list_cb dependency_cb,
1460 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1462 dependency_x *dependency;
1464 if (handle == NULL || dependency_cb == NULL) {
1465 LOGE("invalid parameter");
1466 return PMINFO_R_EINVAL;
1469 if (info->pkg_info == NULL)
1470 return PMINFO_R_ERROR;
1472 for (tmp = info->pkg_info->dependencies; tmp; tmp = tmp->next) {
1473 dependency = (dependency_x *)tmp->data;
1474 if (dependency == NULL)
1476 ret = dependency_cb(info->pkg_info->package,
1477 dependency->depends_on, dependency->type,
1478 dependency->required_version, user_data);
1493 static int _get_depends_on(sqlite3 *db, const char *pkgid, GQueue **queue,
1494 GHashTable **table, GList **pkg_list)
1496 static const char query[] =
1497 "SELECT package, depends_on, type, required_version "
1498 "FROM package_dependency_info WHERE depends_on=?";
1501 struct depends_on *req;
1503 /* already checked */
1504 if (!g_hash_table_insert(*table, strdup(pkgid), GINT_TO_POINTER(1)))
1507 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1508 if (ret != SQLITE_OK) {
1509 LOGE("prepare failed: %s", sqlite3_errmsg(db));
1510 return PMINFO_R_ERROR;
1513 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_STATIC);
1514 if (ret != SQLITE_OK) {
1515 LOGE("bind failed: %s", sqlite3_errmsg(db));
1516 sqlite3_finalize(stmt);
1517 return PMINFO_R_ERROR;
1520 while (sqlite3_step(stmt) == SQLITE_ROW) {
1521 req = calloc(1, sizeof(struct depends_on));
1523 LOGE("out of memory");
1524 sqlite3_finalize(stmt);
1525 return PMINFO_R_ERROR;
1527 _save_column_str(stmt, 0, &req->from);
1528 _save_column_str(stmt, 1, &req->to);
1529 _save_column_str(stmt, 2, &req->type);
1530 _save_column_str(stmt, 3, &req->version);
1532 *pkg_list = g_list_prepend(*pkg_list, req);
1533 g_queue_push_tail(*queue, strdup(req->from));
1536 sqlite3_finalize(stmt);
1541 static int _pkginfo_foreach_depends_on(uid_t uid, const char *pkgid,
1551 dbpath = getUserPkgParserDBPathUID(uid);
1553 return PMINFO_R_ERROR;
1555 ret = __open_db(dbpath, &db, SQLITE_OPEN_READONLY);
1556 if (ret != SQLITE_OK) {
1557 LOGD("failed to open db(%s): %d", dbpath, ret);
1559 return PMINFO_R_ERROR;
1563 queue = g_queue_new();
1564 if (queue == NULL) {
1565 LOGE("out of memory");
1566 sqlite3_close_v2(db);
1567 return PMINFO_R_ERROR;
1570 table = g_hash_table_new_full(g_str_hash, g_str_equal, free, NULL);
1572 g_queue_push_tail(queue, strdup(pkgid));
1573 while (!g_queue_is_empty(queue)) {
1574 item = g_queue_pop_head(queue);
1575 ret = _get_depends_on(db, item, &queue, &table, pkg_list);
1577 if (ret != PMINFO_R_OK) {
1578 LOGE("failed to get pkgs depends on %s", pkgid);
1579 g_hash_table_destroy(table);
1580 g_queue_free_full(queue, free);
1581 sqlite3_close_v2(db);
1582 return PMINFO_R_ERROR;
1586 g_hash_table_destroy(table);
1587 g_queue_free_full(queue, free);
1588 sqlite3_close_v2(db);
1593 static void __free_depends_on(gpointer data)
1595 struct depends_on *dep = (struct depends_on *)data;
1604 // TODO: need to change this
1605 API int pkgmgrinfo_pkginfo_foreach_depends_on(pkgmgrinfo_pkginfo_h handle,
1606 pkgmgrinfo_pkg_dependency_list_cb dependency_cb,
1610 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1611 GList *pkg_list = NULL;
1613 struct depends_on *dep;
1615 if (handle == NULL || dependency_cb == NULL || info->pkg_info == NULL) {
1616 LOGE("invalid parameter");
1617 return PMINFO_R_EINVAL;
1620 ret = _pkginfo_foreach_depends_on(info->uid, info->pkg_info->package,
1622 if (ret == PMINFO_R_OK && info->uid != GLOBAL_USER)
1623 ret = _pkginfo_foreach_depends_on(GLOBAL_USER,
1624 info->pkg_info->package, &pkg_list);
1626 if (ret != PMINFO_R_OK) {
1627 g_list_free_full(pkg_list, __free_depends_on);
1631 for (l = pkg_list; l != NULL; l = l->next) {
1632 dep = (struct depends_on *)l->data;
1633 ret = dependency_cb(dep->from, dep->to, dep->type, dep->version,
1639 g_list_free_full(pkg_list, __free_depends_on);
1644 int __compare_package_version(const char *version, int *major,
1645 int *minor, int *macro, int *nano)
1647 char *version_temp = NULL;
1648 char *major_str = NULL;
1649 char *minor_str = NULL;
1650 char *macro_str = NULL;
1651 char *nano_str = NULL;
1652 char *save_str = NULL;
1654 if (version == NULL || major == NULL || minor == NULL ||
1655 macro == NULL || nano == NULL) {
1656 return PMINFO_R_EINVAL;
1659 version_temp = strdup(version);
1660 if (version_temp == NULL) {
1661 LOGE("Out of memory");
1662 return PMINFO_R_ERROR;
1665 major_str = strtok_r(version_temp, ".", &save_str);
1666 if (major_str == NULL) {
1667 _LOGE("major version is NULL");
1669 return PMINFO_R_ERROR;
1672 minor_str = strtok_r(NULL, ".", &save_str);
1673 if (minor_str == NULL) {
1674 _LOGE("minor version is NULL");
1676 return PMINFO_R_ERROR;
1679 *major = atoi(major_str);
1680 *minor = atoi(minor_str);
1683 macro_str = strtok_r(NULL, ".", &save_str);
1684 if (macro_str == NULL) {
1685 _LOGD("macro version is NULL");
1687 *macro = atoi(macro_str);
1688 nano_str = strtok_r(NULL, ".", &save_str);
1690 *nano = atoi(nano_str);
1691 _LOGD("nano version exists");
1694 _LOGD("version = [%s] -> major = [%d], minor = [%d]," \
1695 " macro = [%d], nano = [%d]", version, *major,
1696 *minor, *macro, *nano);
1703 API int pkgmgrinfo_compare_package_version(const char *current_version,
1704 const char *target_version,
1705 pkgmgrinfo_version_compare_type *res)
1708 int current_version_major = 0;
1709 int current_version_minor = 0;
1710 int current_version_macro = 0;
1711 int current_version_nano = 0;
1712 int target_version_major = 0;
1713 int target_version_minor = 0;
1714 int target_version_macro = 0;
1715 int target_version_nano = 0;
1717 if (current_version == NULL || target_version == NULL ||
1719 _LOGE("Invalid parameter");
1720 return PMINFO_R_EINVAL;
1723 ret = __compare_package_version(target_version,
1724 &target_version_major, &target_version_minor,
1725 &target_version_macro, &target_version_nano);
1727 _LOGE("Failed to compare target version(%d)", ret);
1728 return PMINFO_R_ERROR;
1731 ret = __compare_package_version(current_version,
1732 ¤t_version_major, ¤t_version_minor,
1733 ¤t_version_macro, ¤t_version_nano);
1735 _LOGE("Failed to compare current version(%d)", ret);
1736 return PMINFO_R_ERROR;
1739 _LOGD("new[%d.%d.%d.%d] old[%d.%d.%d.%d]", target_version_major,
1740 target_version_minor, target_version_macro,
1741 target_version_nano, current_version_major,
1742 current_version_minor, current_version_macro,
1743 target_version_nano);
1745 if (target_version_major > current_version_major)
1746 *res = PMINFO_VERSION_NEW;
1747 else if (target_version_major < current_version_major)
1748 *res = PMINFO_VERSION_OLD;
1749 else if (target_version_minor > current_version_minor)
1750 *res = PMINFO_VERSION_NEW;
1751 else if (target_version_minor < current_version_minor)
1752 *res = PMINFO_VERSION_OLD;
1753 else if (target_version_macro > current_version_macro)
1754 *res = PMINFO_VERSION_NEW;
1755 else if (target_version_macro < current_version_macro)
1756 *res = PMINFO_VERSION_OLD;
1757 else if (target_version_nano > current_version_nano)
1758 *res = PMINFO_VERSION_NEW;
1759 else if (target_version_nano < current_version_nano)
1760 *res = PMINFO_VERSION_OLD;
1762 *res = PMINFO_VERSION_SAME;