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>
35 #include <libxml/parser.h>
36 #include <libxml/xmlreader.h>
37 #include <libxml/xmlschemas.h>
41 #include "pkgmgr_parser.h"
42 #include "pkgmgrinfo_basic.h"
43 #include "pkgmgrinfo_private.h"
44 #include "pkgmgrinfo_debug.h"
45 #include "pkgmgr-info.h"
46 #include "pkgmgr_parser_db.h"
47 #include "pkgmgr_parser_internal.h"
49 static int _get_filtered_query(pkgmgrinfo_filter_x *filter, char **query, GList **bind_params);
52 static bool _get_bool_value(const char *str)
56 else if (!strcasecmp(str, "true"))
62 static gint __compare_func(gconstpointer data1, gconstpointer data2)
64 pkgmgrinfo_node_x *node1 = (pkgmgrinfo_node_x*)data1;
65 pkgmgrinfo_node_x *node2 = (pkgmgrinfo_node_x*)data2;
66 if (node1->prop == node2->prop)
68 else if (node1->prop > node2->prop)
74 static void __destroy_each_node(gpointer data, gpointer user_data)
77 pkgmgrinfo_node_x *node = (pkgmgrinfo_node_x*)data;
90 static void __cleanup_pkginfo(pkgmgr_pkginfo_x *data)
94 free((void *)data->locale);
98 pkgmgrinfo_basic_free_package(data->pkg_info);
104 static int __child_element(xmlTextReaderPtr reader, int depth)
106 int ret = xmlTextReaderRead(reader);
107 int cur = xmlTextReaderDepth(reader);
110 switch (xmlTextReaderNodeType(reader)) {
111 case XML_READER_TYPE_ELEMENT:
112 if (cur == depth + 1)
115 case XML_READER_TYPE_TEXT:
116 /*text is handled by each function separately*/
117 if (cur == depth + 1)
120 case XML_READER_TYPE_END_ELEMENT:
129 ret = xmlTextReaderRead(reader);
130 cur = xmlTextReaderDepth(reader);
135 long long _pkgmgr_calculate_dir_size(char *dirname)
139 int q = 0; /*quotient*/
140 int r = 0; /*remainder*/
142 struct dirent ep, *result;
143 struct stat fileinfo;
144 char abs_filename[FILENAME_MAX] = { 0, };
145 retvm_if(dirname == NULL, PMINFO_R_ERROR, "dirname is NULL");
147 dp = opendir(dirname);
149 _LOGE("Couldn't open the directory\n");
153 for (ret = readdir_r(dp, &ep, &result);
154 ret == 0 && result != NULL;
155 ret = readdir_r(dp, &ep, &result)) {
156 if (!strcmp(ep.d_name, ".") ||
157 !strcmp(ep.d_name, "..")) {
160 snprintf(abs_filename, FILENAME_MAX, "%s/%s", dirname,
162 if (lstat(abs_filename, &fileinfo) < 0)
163 perror(abs_filename);
165 if (S_ISDIR(fileinfo.st_mode)) {
166 total += fileinfo.st_size;
167 if (strcmp(ep.d_name, ".")
168 && strcmp(ep.d_name, "..")) {
169 ret = _pkgmgr_calculate_dir_size
173 } else if (S_ISLNK(fileinfo.st_mode)) {
176 /*It is a file. Calculate the actual
177 size occupied (in terms of 4096 blocks)*/
178 q = (fileinfo.st_size / BLOCK_SIZE);
179 r = (fileinfo.st_size % BLOCK_SIZE);
183 total += q * BLOCK_SIZE;
192 static int _pkginfo_get_author(sqlite3 *db, const char *pkgid,
195 static const char query_raw[] =
196 "SELECT author_name, author_email, author_href "
197 "FROM package_info WHERE package=%Q";
204 query = sqlite3_mprintf(query_raw, pkgid);
206 LOGE("out of memory");
207 return PMINFO_R_ERROR;
210 ret = sqlite3_prepare_v2(db, query, strlen(query),
213 if (ret != SQLITE_OK) {
214 LOGE("prepare failed: %s", sqlite3_errmsg(db));
215 return PMINFO_R_ERROR;
218 if (sqlite3_step(stmt) == SQLITE_ERROR) {
219 LOGE("step error: %s", sqlite3_errmsg(db));
220 sqlite3_finalize(stmt);
221 return PMINFO_R_ERROR;
224 /* one author per one package */
225 info = calloc(1, sizeof(author_x));
227 LOGE("out of memory");
228 sqlite3_finalize(stmt);
229 return PMINFO_R_ERROR;
232 _save_column_str(stmt, idx++, &info->text);
233 _save_column_str(stmt, idx++, &info->email);
234 _save_column_str(stmt, idx++, &info->href);
237 *author = g_list_append(*author, info);
239 sqlite3_finalize(stmt);
244 static int _pkginfo_get_label(sqlite3 *db, const char *pkgid,
245 const char *locale, GList **label)
247 static const char query_raw[] =
248 "SELECT package_label, package_locale "
249 "FROM package_localized_info "
250 "WHERE package=%Q AND package_locale IN (%Q, %Q)";
257 query = sqlite3_mprintf(query_raw, pkgid, locale, DEFAULT_LOCALE);
259 LOGE("out of memory");
260 return PMINFO_R_ERROR;
263 ret = sqlite3_prepare_v2(db, query, strlen(query),
266 if (ret != SQLITE_OK) {
267 LOGE("prepare failed: %s", sqlite3_errmsg(db));
268 return PMINFO_R_ERROR;
271 while (sqlite3_step(stmt) == SQLITE_ROW) {
272 info = calloc(1, sizeof(label_x));
274 LOGE("out of memory");
275 sqlite3_finalize(stmt);
276 return PMINFO_R_ERROR;
279 _save_column_str(stmt, idx++, &info->text);
280 _save_column_str(stmt, idx++, &info->lang);
281 *label = g_list_append(*label, info);
284 sqlite3_finalize(stmt);
289 static int _pkginfo_get_icon(sqlite3 *db, const char *pkgid, const char *locale,
292 static const char query_raw[] =
293 "SELECT package_icon, package_locale "
294 "FROM package_localized_info "
295 "WHERE package=%Q AND package_locale IN (%Q, %Q)";
302 query = sqlite3_mprintf(query_raw, pkgid, locale, DEFAULT_LOCALE);
304 LOGE("out of memory");
305 return PMINFO_R_ERROR;
308 ret = sqlite3_prepare_v2(db, query, strlen(query),
311 if (ret != SQLITE_OK) {
312 LOGE("prepare failed: %s", sqlite3_errmsg(db));
313 return PMINFO_R_ERROR;
316 while (sqlite3_step(stmt) == SQLITE_ROW) {
317 info = calloc(1, sizeof(icon_x));
319 LOGE("out of memory");
320 sqlite3_finalize(stmt);
321 return PMINFO_R_ERROR;
324 _save_column_str(stmt, idx++, &info->text);
325 _save_column_str(stmt, idx++, &info->lang);
326 *icon = g_list_append(*icon, info);
329 sqlite3_finalize(stmt);
334 static int _pkginfo_get_description(sqlite3 *db, const char *pkgid,
335 const char *locale, GList **description)
337 static const char query_raw[] =
338 "SELECT package_description, package_locale "
339 "FROM package_localized_info "
340 "WHERE package=%Q AND package_locale IN (%Q, %Q)";
347 query = sqlite3_mprintf(query_raw, pkgid, locale, DEFAULT_LOCALE);
349 LOGE("out of memory");
350 return PMINFO_R_ERROR;
353 ret = sqlite3_prepare_v2(db, query, strlen(query),
356 if (ret != SQLITE_OK) {
357 LOGE("prepare failed: %s", sqlite3_errmsg(db));
358 return PMINFO_R_ERROR;
361 while (sqlite3_step(stmt) == SQLITE_ROW) {
362 info = calloc(1, sizeof(description_x));
364 LOGE("out of memory");
365 sqlite3_finalize(stmt);
366 return PMINFO_R_ERROR;
369 _save_column_str(stmt, idx++, &info->text);
370 _save_column_str(stmt, idx++, &info->lang);
371 *description = g_list_append(*description, info);
374 sqlite3_finalize(stmt);
379 static int _pkginfo_get_privilege(sqlite3 *db, const char *pkgid,
382 static const char query_raw[] =
383 "SELECT privilege FROM package_privilege_info WHERE package=%Q";
389 query = sqlite3_mprintf(query_raw, pkgid);
391 LOGE("out of memory");
392 return PMINFO_R_ERROR;
395 ret = sqlite3_prepare_v2(db, query, strlen(query),
398 if (ret != SQLITE_OK) {
399 LOGE("prepare failed: %s", sqlite3_errmsg(db));
400 return PMINFO_R_ERROR;
403 while (sqlite3_step(stmt) == SQLITE_ROW) {
405 _save_column_str(stmt, 0, &privilege);
407 *privileges = g_list_append(*privileges,
408 (gpointer)privilege);
411 sqlite3_finalize(stmt);
416 static int _get_filtered_query(pkgmgrinfo_filter_x *filter, char **query, GList **bind_params)
418 char buf[MAX_QUERY_LEN] = { '\0' };
419 char *condition = NULL;
426 len += strlen(" WHERE 1=1 ");
427 strncat(buf, " WHERE 1=1 ", MAX_QUERY_LEN - len - 1);
428 for (list = filter->list; list; list = list->next) {
429 __get_filter_condition(list->data, &condition, bind_params);
430 if (condition == NULL)
433 len += strlen(" AND ");
434 strncat(buf, " AND ", MAX_QUERY_LEN - len - 1);
436 len += strlen(condition);
437 strncat(buf, condition, sizeof(buf) - len - 1);
442 *query = strdup(buf);
444 return PMINFO_R_ERROR;
449 static void __free_packages(gpointer data)
451 pkgmgrinfo_basic_free_package((package_x *)data);
454 static int __bind_params(sqlite3_stmt *stmt, GList *params)
456 GList *tmp_list = NULL;
460 if (stmt == NULL || params == NULL)
461 return PMINFO_R_EINVAL;
465 ret = sqlite3_bind_text(stmt, ++idx, (char *)tmp_list->data, -1, SQLITE_STATIC);
466 if (ret != SQLITE_OK)
467 return PMINFO_R_ERROR;
468 tmp_list = tmp_list->next;
474 static int _pkginfo_get_packages(uid_t uid, const char *locale,
475 pkgmgrinfo_filter_x *filter, int flag, GHashTable *packages)
477 static const char query_raw[] =
478 "SELECT DISTINCT pi.package, pi.package_version, "
479 "pi.install_location, pi.package_removable, "
480 "pi.package_preload, pi.package_readonly, pi.package_update, "
481 "pi.package_appsetting, pi.package_system, pi.package_type, "
482 "pi.package_size, pi.installed_time, pi.installed_storage, "
483 "pi.storeclient_id, pi.mainapp_id, pi.package_url, "
484 "pi.root_path, pi.csc_path, pi.package_nodisplay, "
485 "pi.package_api_version, pi.package_support_disable, "
486 "pi.package_tep_name, pi.package_zip_mount_file "
487 "FROM package_info as pi ";
488 int ret = PMINFO_R_ERROR;
491 char *constraints = NULL;
492 char query[MAX_QUERY_LEN] = { '\0' };
493 package_x *info = NULL;
494 GList *bind_params = NULL;
497 pkgmgrinfo_filter_x *tmp_filter = NULL;
499 dbpath = getUserPkgParserDBPathUID(uid);
501 return PMINFO_R_ERROR;
503 ret = sqlite3_open_v2(dbpath, &db, SQLITE_OPEN_READONLY, NULL);
504 if (ret != SQLITE_OK) {
505 _LOGD("failed to open db: %d", ret);
506 return PMINFO_R_ERROR;
509 if (filter != NULL) {
512 ret = pkgmgrinfo_pkginfo_filter_create((void *)&tmp_filter);
513 if (ret != PMINFO_R_OK) {
514 _LOGE("Failed to create filter");
515 return PMINFO_R_ERROR;
519 /* add package_disable='false' clause by default */
520 pkgmgrinfo_pkginfo_filter_add_bool(tmp_filter, PMINFO_PKGINFO_PROP_PACKAGE_DISABLE, false);
522 ret = _get_filtered_query(tmp_filter, &constraints, &bind_params);
523 if (ret != PMINFO_R_OK) {
524 LOGE("Failed to get WHERE clause");
529 snprintf(query, MAX_QUERY_LEN - 1, "%s%s", query_raw, constraints);
531 snprintf(query, MAX_QUERY_LEN - 1, "%s", query_raw);
533 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
534 if (ret != SQLITE_OK) {
535 LOGE("prepare failed: %s", sqlite3_errmsg(db));
536 ret = PMINFO_R_ERROR;
540 ret = __bind_params(stmt, bind_params);
541 if (ret != SQLITE_OK) {
542 LOGE("Failed to bind parameters");
546 while (sqlite3_step(stmt) == SQLITE_ROW) {
547 info = calloc(1, sizeof(package_x));
549 LOGE("out of memory");
550 sqlite3_finalize(stmt);
551 sqlite3_close_v2(db);
552 return PMINFO_R_ERROR;
555 _save_column_str(stmt, idx++, &info->package);
556 if (g_hash_table_contains(packages,
557 (gconstpointer)info->package)) {
562 _save_column_str(stmt, idx++, &info->version);
563 _save_column_str(stmt, idx++, &info->installlocation);
564 _save_column_str(stmt, idx++, &info->removable);
565 _save_column_str(stmt, idx++, &info->preload);
566 _save_column_str(stmt, idx++, &info->readonly);
567 _save_column_str(stmt, idx++, &info->update);
568 _save_column_str(stmt, idx++, &info->appsetting);
569 _save_column_str(stmt, idx++, &info->system);
570 _save_column_str(stmt, idx++, &info->type);
571 _save_column_str(stmt, idx++, &info->package_size);
572 _save_column_str(stmt, idx++, &info->installed_time);
573 _save_column_str(stmt, idx++, &info->installed_storage);
574 _save_column_str(stmt, idx++, &info->storeclient_id);
575 _save_column_str(stmt, idx++, &info->mainapp_id);
576 _save_column_str(stmt, idx++, &info->package_url);
577 _save_column_str(stmt, idx++, &info->root_path);
578 _save_column_str(stmt, idx++, &info->csc_path);
579 _save_column_str(stmt, idx++, &info->nodisplay_setting);
580 _save_column_str(stmt, idx++, &info->api_version);
581 _save_column_str(stmt, idx++, &info->support_disable);
582 _save_column_str(stmt, idx++, &info->tep_name);
583 _save_column_str(stmt, idx++, &info->zip_mount_file);
584 info->for_all_users =
585 strdup((uid != GLOBAL_USER) ? "false" : "true");
587 if (flag & PMINFO_PKGINFO_GET_AUTHOR) {
588 if (_pkginfo_get_author(db, info->package,
590 pkgmgrinfo_basic_free_package(info);
591 sqlite3_finalize(stmt);
592 sqlite3_close_v2(db);
593 return PMINFO_R_ERROR;
597 if (flag & PMINFO_PKGINFO_GET_LABEL) {
598 if (_pkginfo_get_label(db, info->package, locale,
600 pkgmgrinfo_basic_free_package(info);
601 sqlite3_finalize(stmt);
602 sqlite3_close_v2(db);
603 return PMINFO_R_ERROR;
607 if (flag & PMINFO_PKGINFO_GET_ICON) {
608 if (_pkginfo_get_icon(db, info->package, locale,
610 pkgmgrinfo_basic_free_package(info);
611 sqlite3_finalize(stmt);
612 sqlite3_close_v2(db);
613 return PMINFO_R_ERROR;
617 if (flag & PMINFO_PKGINFO_GET_DESCRIPTION) {
618 if (_pkginfo_get_description(db, info->package, locale,
619 &info->description)) {
620 pkgmgrinfo_basic_free_package(info);
621 sqlite3_finalize(stmt);
622 sqlite3_close_v2(db);
623 return PMINFO_R_ERROR;
627 if (flag & PMINFO_PKGINFO_GET_PRIVILEGE) {
628 if (_pkginfo_get_privilege(db, info->package,
629 &info->privileges)) {
630 pkgmgrinfo_basic_free_package(info);
631 sqlite3_finalize(stmt);
632 sqlite3_close_v2(db);
633 return PMINFO_R_ERROR;
637 g_hash_table_insert(packages, (gpointer)info->package,
647 if (ret != PMINFO_R_OK && info != NULL)
648 pkgmgrinfo_basic_free_package(info);
651 pkgmgrinfo_pkginfo_filter_destroy(tmp_filter);
653 g_list_free_full(bind_params, free);
654 sqlite3_close_v2(db);
655 sqlite3_finalize(stmt);
660 static int _pkginfo_get_filtered_foreach_pkginfo(uid_t uid,
661 pkgmgrinfo_filter_x *filter, int flag,
662 pkgmgrinfo_pkg_list_cb pkg_list_cb, void *user_data)
667 pkgmgr_pkginfo_x info;
672 locale = _get_system_locale();
674 return PMINFO_R_ERROR;
676 list = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
680 return PMINFO_R_ERROR;
683 ret = _pkginfo_get_packages(uid, locale, filter, flag, list);
684 if (ret == PMINFO_R_OK && uid != GLOBAL_USER)
685 ret = _pkginfo_get_packages(GLOBAL_USER, locale, filter,
688 if (ret != PMINFO_R_OK) {
689 g_hash_table_destroy(list);
691 return PMINFO_R_ERROR;
694 g_hash_table_iter_init(&iter, list);
695 while (g_hash_table_iter_next(&iter, NULL, &value)) {
696 pkg = (package_x *)value;
699 info.locale = locale;
700 if (pkg_list_cb(&info, user_data) < 0)
704 g_hash_table_destroy(list);
710 API int pkgmgrinfo_pkginfo_get_usr_pkginfo(const char *pkgid, uid_t uid,
711 pkgmgrinfo_pkginfo_h *handle)
716 pkgmgrinfo_pkginfo_filter_h filter;
717 pkgmgr_pkginfo_x *info;
719 if (pkgid == NULL || handle == NULL) {
720 LOGE("invalid parameter");
721 return PMINFO_R_EINVAL;
724 locale = _get_system_locale();
726 return PMINFO_R_ERROR;
728 ret = pkgmgrinfo_pkginfo_filter_create(&filter);
729 if (ret != PMINFO_R_OK) {
734 ret = pkgmgrinfo_pkginfo_filter_add_string(filter,
735 PMINFO_PKGINFO_PROP_PACKAGE_ID, pkgid);
736 if (ret != PMINFO_R_OK) {
737 pkgmgrinfo_pkginfo_filter_destroy(filter);
739 return PMINFO_R_ERROR;
742 list = g_hash_table_new(g_str_hash, g_str_equal);
744 pkgmgrinfo_pkginfo_filter_destroy(filter);
746 return PMINFO_R_ERROR;
749 ret = _pkginfo_get_packages(uid, locale, filter,
750 PMINFO_PKGINFO_GET_ALL, list);
751 if (!g_hash_table_size(list) && uid != GLOBAL_USER)
752 ret = _pkginfo_get_packages(GLOBAL_USER, locale, filter,
753 PMINFO_PKGINFO_GET_ALL, list);
755 pkgmgrinfo_pkginfo_filter_destroy(filter);
756 if (ret != PMINFO_R_OK) {
757 g_hash_table_destroy(list);
762 if (!g_hash_table_size(list)) {
763 _LOGI("pkginfo for [%s] is not existed for user [%d]",
765 g_hash_table_destroy(list);
767 return PMINFO_R_ENOENT;
770 info = calloc(1, sizeof(pkgmgr_pkginfo_x));
772 _LOGE("out of memory");
773 g_hash_table_destroy(list);
775 return PMINFO_R_ERROR;
779 info->pkg_info = (package_x *)g_hash_table_lookup(list, pkgid);
780 info->locale = locale;
782 /* just free list only */
783 g_hash_table_destroy(list);
790 API int pkgmgrinfo_pkginfo_get_pkginfo(const char *pkgid,
791 pkgmgrinfo_pkginfo_h *handle)
793 return pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, _getuid(), handle);
796 API int pkgmgrinfo_pkginfo_get_usr_list_full(pkgmgrinfo_pkg_list_cb pkg_list_cb,
797 int flag, void *user_data, uid_t uid)
799 if (pkg_list_cb == NULL) {
800 LOGE("invalid parameter");
801 return PMINFO_R_EINVAL;
804 return _pkginfo_get_filtered_foreach_pkginfo(uid, NULL, flag,
805 pkg_list_cb, user_data);
808 API int pkgmgrinfo_pkginfo_get_list_full(pkgmgrinfo_pkg_list_cb pkg_list_cb,
809 int flag, void *user_data)
811 return pkgmgrinfo_pkginfo_get_usr_list_full(pkg_list_cb, flag,
812 user_data, _getuid());
815 API int pkgmgrinfo_pkginfo_get_usr_list(pkgmgrinfo_pkg_list_cb pkg_list_cb,
816 void *user_data, uid_t uid)
818 if (pkg_list_cb == NULL) {
819 LOGE("invalid parameter");
820 return PMINFO_R_EINVAL;
823 return _pkginfo_get_filtered_foreach_pkginfo(uid, NULL,
824 PMINFO_PKGINFO_GET_ALL, pkg_list_cb, user_data);
827 API int pkgmgrinfo_pkginfo_get_list(pkgmgrinfo_pkg_list_cb pkg_list_cb,
830 return pkgmgrinfo_pkginfo_get_usr_list(pkg_list_cb, user_data,
834 API int pkgmgrinfo_pkginfo_get_pkgname(pkgmgrinfo_pkginfo_h handle, char **pkg_name)
836 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
838 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
839 retvm_if(pkg_name == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
841 if (info->pkg_info == NULL || info->pkg_info->package == NULL)
842 return PMINFO_R_ERROR;
844 *pkg_name = (char *)info->pkg_info->package;
849 API int pkgmgrinfo_pkginfo_get_pkgid(pkgmgrinfo_pkginfo_h handle, char **pkgid)
851 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
853 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
854 retvm_if(pkgid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
856 if (info->pkg_info == NULL || info->pkg_info->package == NULL)
857 return PMINFO_R_ERROR;
859 *pkgid = (char *)info->pkg_info->package;
864 API int pkgmgrinfo_pkginfo_get_type(pkgmgrinfo_pkginfo_h handle, char **type)
866 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
868 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
869 retvm_if(type == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
871 if (info->pkg_info == NULL || info->pkg_info->type == NULL)
872 return PMINFO_R_ERROR;
874 *type = (char *)info->pkg_info->type;
879 API int pkgmgrinfo_pkginfo_get_version(pkgmgrinfo_pkginfo_h handle, char **version)
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(version == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
886 if (info->pkg_info == NULL || info->pkg_info->version == NULL)
887 return PMINFO_R_ERROR;
889 *version = (char *)info->pkg_info->version;
894 API int pkgmgrinfo_pkginfo_get_api_version(pkgmgrinfo_pkginfo_h handle, char **api_version)
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(api_version == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
901 if (info->pkg_info == NULL || info->pkg_info->api_version == NULL)
902 return PMINFO_R_ERROR;
904 *api_version = (char *)info->pkg_info->api_version;
909 API int pkgmgrinfo_pkginfo_get_tep_name(pkgmgrinfo_pkginfo_h handle, char **tep_name)
911 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
913 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
914 retvm_if(tep_name == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
916 if (info->pkg_info == NULL || info->pkg_info->tep_name == NULL)
917 return PMINFO_R_ERROR;
919 if (strlen(info->pkg_info->tep_name) == 0)
920 return PMINFO_R_ERROR;
922 *tep_name = (char *)info->pkg_info->tep_name;
927 API int pkgmgrinfo_pkginfo_get_zip_mount_file(pkgmgrinfo_pkginfo_h handle, char **zip_mount_file)
929 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
931 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
932 retvm_if(zip_mount_file == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
934 if (info->pkg_info == NULL)
935 return PMINFO_R_ERROR;
937 if (strlen(info->pkg_info->zip_mount_file) > 0)
938 *zip_mount_file = (char *)info->pkg_info->zip_mount_file;
943 API int pkgmgrinfo_pkginfo_get_install_location(pkgmgrinfo_pkginfo_h handle, pkgmgrinfo_install_location *location)
946 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
948 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
949 retvm_if(location == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
951 if (info->pkg_info == NULL || info->pkg_info->installlocation == NULL)
952 return PMINFO_R_ERROR;
954 val = (char *)info->pkg_info->installlocation;
955 if (strcmp(val, "internal-only") == 0)
956 *location = PMINFO_INSTALL_LOCATION_INTERNAL_ONLY;
957 else if (strcmp(val, "prefer-external") == 0)
958 *location = PMINFO_INSTALL_LOCATION_PREFER_EXTERNAL;
960 *location = PMINFO_INSTALL_LOCATION_AUTO;
965 API int pkgmgrinfo_pkginfo_get_package_size(pkgmgrinfo_pkginfo_h handle, int *size)
967 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
969 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
970 retvm_if(size == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
972 if (info->pkg_info == NULL || info->pkg_info->package_size == NULL)
973 return PMINFO_R_ERROR;
975 *size = atoi((char *)info->pkg_info->package_size);
980 API int pkgmgrinfo_pkginfo_get_total_size(pkgmgrinfo_pkginfo_h handle, int *size)
983 char device_path[PKG_STRING_LEN_MAX] = { '\0', };
984 long long rw_size = 0;
985 long long ro_size = 0;
986 long long tmp_size = 0;
987 long long total_size = 0;
988 struct stat fileinfo;
991 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
992 retvm_if(size == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
994 ret = pkgmgrinfo_pkginfo_get_pkgid(handle, &pkgid);
996 return PMINFO_R_ERROR;
999 snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/bin", PKG_RW_PATH, pkgid);
1000 if (lstat(device_path, &fileinfo) == 0) {
1001 if (!S_ISLNK(fileinfo.st_mode)) {
1002 tmp_size = _pkgmgr_calculate_dir_size(device_path);
1004 rw_size += tmp_size;
1008 snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/info", PKG_RW_PATH, pkgid);
1009 if (lstat(device_path, &fileinfo) == 0) {
1010 if (!S_ISLNK(fileinfo.st_mode)) {
1011 tmp_size = _pkgmgr_calculate_dir_size(device_path);
1013 rw_size += tmp_size;
1017 snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/res", PKG_RW_PATH, pkgid);
1018 if (lstat(device_path, &fileinfo) == 0) {
1019 if (!S_ISLNK(fileinfo.st_mode)) {
1020 tmp_size = _pkgmgr_calculate_dir_size(device_path);
1022 rw_size += tmp_size;
1026 snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/data", PKG_RW_PATH, pkgid);
1027 if (lstat(device_path, &fileinfo) == 0) {
1028 if (!S_ISLNK(fileinfo.st_mode)) {
1029 tmp_size = _pkgmgr_calculate_dir_size(device_path);
1031 rw_size += tmp_size;
1035 snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/shared", PKG_RW_PATH, pkgid);
1036 if (lstat(device_path, &fileinfo) == 0) {
1037 if (!S_ISLNK(fileinfo.st_mode)) {
1038 tmp_size = _pkgmgr_calculate_dir_size(device_path);
1040 rw_size += tmp_size;
1044 snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/setting", PKG_RW_PATH, pkgid);
1045 if (lstat(device_path, &fileinfo) == 0) {
1046 if (!S_ISLNK(fileinfo.st_mode)) {
1047 tmp_size = _pkgmgr_calculate_dir_size(device_path);
1049 rw_size += tmp_size;
1054 snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/bin", PKG_RO_PATH, pkgid);
1055 if (lstat(device_path, &fileinfo) == 0) {
1056 if (!S_ISLNK(fileinfo.st_mode)) {
1057 tmp_size = _pkgmgr_calculate_dir_size(device_path);
1059 ro_size += tmp_size;
1063 snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/info", PKG_RO_PATH, pkgid);
1064 if (lstat(device_path, &fileinfo) == 0) {
1065 if (!S_ISLNK(fileinfo.st_mode)) {
1066 tmp_size = _pkgmgr_calculate_dir_size(device_path);
1068 ro_size += tmp_size;
1072 snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/res", PKG_RO_PATH, pkgid);
1073 if (lstat(device_path, &fileinfo) == 0) {
1074 if (!S_ISLNK(fileinfo.st_mode)) {
1075 tmp_size = _pkgmgr_calculate_dir_size(device_path);
1077 ro_size += tmp_size;
1081 snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/data", PKG_RO_PATH, pkgid);
1082 if (lstat(device_path, &fileinfo) == 0) {
1083 if (!S_ISLNK(fileinfo.st_mode)) {
1084 tmp_size = _pkgmgr_calculate_dir_size(device_path);
1086 ro_size += tmp_size;
1090 snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/shared", PKG_RO_PATH, pkgid);
1091 if (lstat(device_path, &fileinfo) == 0) {
1092 if (!S_ISLNK(fileinfo.st_mode)) {
1093 tmp_size = _pkgmgr_calculate_dir_size(device_path);
1095 ro_size += tmp_size;
1099 snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/setting", PKG_RO_PATH, pkgid);
1100 if (lstat(device_path, &fileinfo) == 0) {
1101 if (!S_ISLNK(fileinfo.st_mode)) {
1102 tmp_size = _pkgmgr_calculate_dir_size(device_path);
1104 ro_size += tmp_size;
1109 total_size = rw_size + ro_size;
1110 *size = (int)total_size;
1115 API int pkgmgrinfo_pkginfo_get_data_size(pkgmgrinfo_pkginfo_h handle, int *size)
1118 char device_path[PKG_STRING_LEN_MAX] = { '\0', };
1119 long long total_size = 0;
1121 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1122 retvm_if(size == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1124 if (pkgmgrinfo_pkginfo_get_pkgid(handle, &pkgid) < 0)
1125 return PMINFO_R_ERROR;
1127 snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/data", PKG_RW_PATH, pkgid);
1128 if (access(device_path, R_OK) == 0)
1129 total_size = _pkgmgr_calculate_dir_size(device_path);
1131 return PMINFO_R_ERROR;
1133 *size = (int)total_size;
1138 API int pkgmgrinfo_pkginfo_get_icon(pkgmgrinfo_pkginfo_h handle, char **icon)
1143 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1145 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL");
1146 retvm_if(icon == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL");
1148 locale = info->locale;
1149 retvm_if(locale == NULL, PMINFO_R_ERROR, "manifest locale is NULL");
1151 if (info->pkg_info == NULL)
1152 return PMINFO_R_ERROR;
1154 for (tmp = info->pkg_info->icon; tmp; tmp = tmp->next) {
1155 ptr = (icon_x *)tmp->data;
1156 if (ptr == NULL || ptr->text == NULL || ptr->lang == NULL ||
1157 !strcasecmp(ptr->text, "(null)") ||
1158 strcmp(ptr->lang, locale))
1160 *icon = (char *)ptr->text;
1164 locale = DEFAULT_LOCALE;
1165 for (tmp = info->pkg_info->icon; tmp; tmp = tmp->next) {
1166 ptr = (icon_x *)tmp->data;
1167 if (ptr == NULL || ptr->text == NULL || ptr->lang == NULL ||
1168 strcmp(ptr->lang, locale))
1170 *icon = (char *)ptr->text;
1174 return PMINFO_R_ERROR;
1177 API int pkgmgrinfo_pkginfo_get_label(pkgmgrinfo_pkginfo_h handle, char **label)
1182 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1184 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL");
1185 retvm_if(label == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL");
1187 locale = info->locale;
1188 retvm_if(locale == NULL, PMINFO_R_ERROR, "manifest locale is NULL");
1190 for (tmp = info->pkg_info->label; tmp != NULL; tmp = tmp->next) {
1191 ptr = (label_x *)tmp->data;
1192 if (ptr == NULL || ptr->text == NULL || ptr->lang == NULL ||
1193 strcmp(ptr->lang, locale))
1195 *label = (char *)ptr->text;
1199 locale = DEFAULT_LOCALE;
1200 for (tmp = info->pkg_info->label; tmp != NULL; tmp = tmp->next) {
1201 ptr = (label_x *)tmp->data;
1202 if (ptr == NULL || ptr->text == NULL || ptr->lang == NULL ||
1203 strcmp(ptr->lang, locale))
1205 *label = (char *)ptr->text;
1209 return PMINFO_R_ERROR;
1212 API int pkgmgrinfo_pkginfo_get_description(pkgmgrinfo_pkginfo_h handle, char **description)
1217 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1219 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1220 retvm_if(description == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1222 locale = info->locale;
1223 retvm_if(locale == NULL, PMINFO_R_ERROR, "manifest locale is NULL");
1225 for (tmp = info->pkg_info->description; tmp; tmp = tmp->next) {
1226 ptr = (description_x *)tmp->data;
1227 if (ptr == NULL || ptr->text == NULL || ptr->lang == NULL ||
1228 strcmp(ptr->lang, locale))
1230 *description = (char *)ptr->text;
1234 locale = DEFAULT_LOCALE;
1235 for (tmp = info->pkg_info->description; tmp; tmp = tmp->next) {
1236 ptr = (description_x *)tmp->data;
1237 if (ptr == NULL || ptr->text == NULL || ptr->lang == NULL ||
1238 strcmp(ptr->lang, locale))
1240 *description = (char *)ptr->text;
1244 return PMINFO_R_ERROR;
1247 API int pkgmgrinfo_pkginfo_get_author_name(pkgmgrinfo_pkginfo_h handle, char **author_name)
1249 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1252 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1253 retvm_if(author_name == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1255 if (info->pkg_info == NULL || info->pkg_info->author == NULL)
1256 return PMINFO_R_ERROR;
1258 author = (author_x *)info->pkg_info->author->data;
1259 if (author == NULL || author->text == NULL)
1260 return PMINFO_R_ERROR;
1262 *author_name = (char *)author->text;
1267 API int pkgmgrinfo_pkginfo_get_author_email(pkgmgrinfo_pkginfo_h handle, char **author_email)
1269 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1272 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1273 retvm_if(author_email == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1275 if (info->pkg_info == NULL || info->pkg_info->author == NULL)
1276 return PMINFO_R_ERROR;
1278 author = (author_x *)info->pkg_info->author->data;
1279 if (author == NULL || author->email == NULL)
1280 return PMINFO_R_ERROR;
1282 *author_email = (char *)author->email;
1287 API int pkgmgrinfo_pkginfo_get_author_href(pkgmgrinfo_pkginfo_h handle, char **author_href)
1289 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1292 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1293 retvm_if(author_href == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1295 if (info->pkg_info == NULL || info->pkg_info->author == NULL)
1296 return PMINFO_R_ERROR;
1298 author = (author_x *)info->pkg_info->author->data;
1299 if (author == NULL || author->href == NULL)
1300 return PMINFO_R_ERROR;
1302 *author_href = (char *)author->href;
1307 API int pkgmgrinfo_pkginfo_get_installed_storage(pkgmgrinfo_pkginfo_h handle, pkgmgrinfo_installed_storage *storage)
1309 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1311 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1312 retvm_if(storage == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1314 if (info->pkg_info == NULL || info->pkg_info->installed_storage == NULL)
1315 return PMINFO_R_ERROR;
1317 if (strcmp(info->pkg_info->installed_storage,"installed_internal") == 0)
1318 *storage = PMINFO_INTERNAL_STORAGE;
1319 else if (strcmp(info->pkg_info->installed_storage,"installed_external") == 0)
1320 *storage = PMINFO_EXTERNAL_STORAGE;
1322 return PMINFO_R_ERROR;
1327 API int pkgmgrinfo_pkginfo_get_installed_time(pkgmgrinfo_pkginfo_h handle, int *installed_time)
1329 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1331 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1332 retvm_if(installed_time == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1334 if (info->pkg_info == NULL || info->pkg_info->installed_time == NULL)
1335 return PMINFO_R_ERROR;
1337 *installed_time = atoi(info->pkg_info->installed_time);
1342 API int pkgmgrinfo_pkginfo_get_storeclientid(pkgmgrinfo_pkginfo_h handle, char **storeclientid)
1344 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1346 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1347 retvm_if(storeclientid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1349 if (info->pkg_info == NULL || info->pkg_info->storeclient_id == NULL)
1350 return PMINFO_R_ERROR;
1352 *storeclientid = (char *)info->pkg_info->storeclient_id;
1357 API int pkgmgrinfo_pkginfo_get_mainappid(pkgmgrinfo_pkginfo_h handle, char **mainappid)
1359 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1361 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1362 retvm_if(mainappid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1364 if (info->pkg_info == NULL || info->pkg_info->mainapp_id == NULL)
1365 return PMINFO_R_ERROR;
1367 *mainappid = (char *)info->pkg_info->mainapp_id;
1372 API int pkgmgrinfo_pkginfo_get_url(pkgmgrinfo_pkginfo_h handle, char **url)
1374 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1376 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1377 retvm_if(url == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1379 if (info->pkg_info == NULL || info->pkg_info->package_url == NULL)
1380 return PMINFO_R_ERROR;
1382 *url = (char *)info->pkg_info->package_url;
1387 API int pkgmgrinfo_pkginfo_get_size_from_xml(const char *manifest, int *size)
1389 const char *val = NULL;
1390 const xmlChar *node;
1391 xmlTextReaderPtr reader;
1392 retvm_if(manifest == NULL, PMINFO_R_EINVAL, "Input argument is NULL\n");
1393 retvm_if(size == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1396 reader = xmlReaderForFile(manifest, NULL, 0);
1399 if (__child_element(reader, -1)) {
1400 node = xmlTextReaderConstName(reader);
1402 _LOGE("xmlTextReaderConstName value is NULL\n");
1403 xmlFreeTextReader(reader);
1405 return PMINFO_R_ERROR;
1408 if (!strcmp(ASC_CHAR(node), "manifest")) {
1409 if (xmlTextReaderGetAttribute(reader, XML_CHAR("size")))
1410 val = ASC_CHAR(xmlTextReaderGetAttribute(reader, XML_CHAR("size")));
1416 _LOGE("package size is not specified\n");
1417 xmlFreeTextReader(reader);
1419 return PMINFO_R_ERROR;
1422 _LOGE("Unable to create xml reader\n");
1423 xmlFreeTextReader(reader);
1425 return PMINFO_R_ERROR;
1429 _LOGE("xmlReaderForFile value is NULL\n");
1431 return PMINFO_R_ERROR;
1434 xmlFreeTextReader(reader);
1440 API int pkgmgrinfo_pkginfo_get_location_from_xml(const char *manifest, pkgmgrinfo_install_location *location)
1442 const char *val = NULL;
1443 const xmlChar *node;
1444 xmlTextReaderPtr reader;
1445 retvm_if(manifest == NULL, PMINFO_R_EINVAL, "Input argument is NULL\n");
1446 retvm_if(location == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1449 reader = xmlReaderForFile(manifest, NULL, 0);
1452 if ( __child_element(reader, -1)) {
1453 node = xmlTextReaderConstName(reader);
1455 _LOGE("xmlTextReaderConstName value is NULL\n");
1456 xmlFreeTextReader(reader);
1458 return PMINFO_R_ERROR;
1461 if (!strcmp(ASC_CHAR(node), "manifest")) {
1462 if (xmlTextReaderGetAttribute(reader, XML_CHAR("install-location")))
1463 val = ASC_CHAR(xmlTextReaderGetAttribute(reader, XML_CHAR("install-location")));
1466 if (strcmp(val, "internal-only") == 0)
1467 *location = PMINFO_INSTALL_LOCATION_INTERNAL_ONLY;
1468 else if (strcmp(val, "prefer-external") == 0)
1469 *location = PMINFO_INSTALL_LOCATION_PREFER_EXTERNAL;
1471 *location = PMINFO_INSTALL_LOCATION_AUTO;
1474 _LOGE("Unable to create xml reader\n");
1475 xmlFreeTextReader(reader);
1477 return PMINFO_R_ERROR;
1481 _LOGE("xmlReaderForFile value is NULL\n");
1483 return PMINFO_R_ERROR;
1486 xmlFreeTextReader(reader);
1493 API int pkgmgrinfo_pkginfo_get_root_path(pkgmgrinfo_pkginfo_h handle, char **path)
1495 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1497 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1498 retvm_if(path == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1500 if (info->pkg_info == NULL || info->pkg_info->root_path == NULL)
1501 return PMINFO_R_ERROR;
1503 *path = (char *)info->pkg_info->root_path;
1508 API int pkgmgrinfo_pkginfo_get_csc_path(pkgmgrinfo_pkginfo_h handle, char **path)
1510 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1512 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1513 retvm_if(path == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1515 if (info->pkg_info == NULL || info->pkg_info->csc_path == NULL)
1516 return PMINFO_R_ERROR;
1518 *path = (char *)info->pkg_info->csc_path;
1524 API int pkgmgrinfo_pkginfo_is_accessible(pkgmgrinfo_pkginfo_h handle, bool *accessible)
1526 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1527 retvm_if(accessible == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1529 #if 0 //smack issue occured, check later
1531 pkgmgrinfo_pkginfo_get_pkgid(handle, &pkgid);
1533 _LOGD("invalid func parameters\n");
1534 return PMINFO_R_ERROR;
1536 _LOGD("pkgmgr_get_pkg_external_validation() called\n");
1539 char app_mmc_path[FILENAME_MAX] = { 0, };
1540 char app_dir_path[FILENAME_MAX] = { 0, };
1541 char app_mmc_internal_path[FILENAME_MAX] = { 0, };
1542 snprintf(app_dir_path, FILENAME_MAX,"%s%s", PKG_INSTALLATION_PATH, pkgid);
1543 snprintf(app_mmc_path, FILENAME_MAX,"%s%s", PKG_SD_PATH, pkgid);
1544 snprintf(app_mmc_internal_path, FILENAME_MAX,"%s%s/.mmc", PKG_INSTALLATION_PATH, pkgid);
1546 /*check whether application is in external memory or not */
1547 fp = fopen(app_mmc_path, "r");
1549 _LOGD(" app path in external memory not accesible\n");
1554 _LOGD("pkgmgr_get_pkg_external_validation() : SD_CARD \n");
1558 /*check whether application is in internal or not */
1559 fp = fopen(app_dir_path, "r");
1561 _LOGD(" app path in internal memory not accesible\n");
1563 return PMINFO_R_ERROR;
1566 /*check whether the application is installed in SD card
1567 but SD card is not present*/
1568 fp = fopen(app_mmc_internal_path, "r");
1571 _LOGD("pkgmgr_get_pkg_external_validation() : INTERNAL_MEM \n");
1576 _LOGD("pkgmgr_get_pkg_external_validation() : ERROR_MMC_STATUS \n");
1581 _LOGD("pkgmgr_get_pkg_external_validation() end\n");
1588 API int pkgmgrinfo_pkginfo_is_removable(pkgmgrinfo_pkginfo_h handle, bool *removable)
1590 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1592 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1593 retvm_if(removable == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1595 if (info->pkg_info == NULL || info->pkg_info->removable == NULL)
1596 return PMINFO_R_ERROR;
1598 *removable = _get_bool_value(info->pkg_info->removable);
1603 API int pkgmgrinfo_pkginfo_is_movable(pkgmgrinfo_pkginfo_h handle, bool *movable)
1606 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1608 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1609 retvm_if(movable == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1611 if (info->pkg_info == NULL || info->pkg_info->installlocation == NULL)
1612 return PMINFO_R_ERROR;
1614 val = (char *)info->pkg_info->installlocation;
1615 if (strcmp(val, "internal-only") == 0)
1617 else if (strcmp(val, "prefer-external") == 0)
1625 API int pkgmgrinfo_pkginfo_is_preload(pkgmgrinfo_pkginfo_h handle, bool *preload)
1627 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1629 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1630 retvm_if(preload == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1632 if (info->pkg_info == NULL || info->pkg_info->preload == NULL)
1633 return PMINFO_R_ERROR;
1635 *preload = _get_bool_value(info->pkg_info->preload);
1640 API int pkgmgrinfo_pkginfo_is_system(pkgmgrinfo_pkginfo_h handle, bool *system)
1642 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1644 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1645 retvm_if(system == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1647 if (info->pkg_info == NULL || info->pkg_info->system == NULL)
1648 return PMINFO_R_ERROR;
1650 *system = _get_bool_value(info->pkg_info->system);
1655 API int pkgmgrinfo_pkginfo_is_readonly(pkgmgrinfo_pkginfo_h handle, bool *readonly)
1657 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1659 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1660 retvm_if(readonly == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1662 if (info->pkg_info == NULL || info->pkg_info->readonly == NULL)
1663 return PMINFO_R_ERROR;
1665 *readonly = _get_bool_value(info->pkg_info->readonly);
1670 API int pkgmgrinfo_pkginfo_is_update(pkgmgrinfo_pkginfo_h handle, bool *update)
1672 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1674 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1675 retvm_if(update == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1677 if (info->pkg_info == NULL || info->pkg_info->update == NULL)
1678 return PMINFO_R_ERROR;
1680 *update = _get_bool_value(info->pkg_info->update);
1685 API int pkgmgrinfo_pkginfo_is_support_disable(pkgmgrinfo_pkginfo_h handle, bool *support_disable)
1687 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1689 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1690 retvm_if(support_disable == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1692 if (info->pkg_info == NULL || info->pkg_info->support_disable == NULL)
1693 return PMINFO_R_ERROR;
1695 *support_disable = _get_bool_value(info->pkg_info->support_disable);
1700 API int pkgmgrinfo_pkginfo_is_global(pkgmgrinfo_pkginfo_h handle, bool *global)
1702 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1704 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1705 retvm_if(global == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1707 if (info->pkg_info == NULL || info->pkg_info->for_all_users == NULL)
1708 return PMINFO_R_ERROR;
1710 *global = _get_bool_value(info->pkg_info->for_all_users);
1715 API int pkgmgrinfo_pkginfo_is_for_all_users(pkgmgrinfo_pkginfo_h handle, bool *for_all_users)
1717 return pkgmgrinfo_pkginfo_is_global(handle, for_all_users);
1720 API int pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo_h handle)
1722 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1724 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1726 __cleanup_pkginfo(info);
1731 API int pkgmgrinfo_pkginfo_filter_create(pkgmgrinfo_pkginfo_filter_h *handle)
1733 pkgmgrinfo_filter_x *filter;
1735 retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle output parameter is NULL\n");
1737 filter = (pkgmgrinfo_filter_x*)calloc(1, sizeof(pkgmgrinfo_filter_x));
1738 if (filter == NULL) {
1739 _LOGE("Out of Memory!!!");
1740 return PMINFO_R_ERROR;
1748 API int pkgmgrinfo_pkginfo_filter_destroy(pkgmgrinfo_pkginfo_filter_h handle)
1750 pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x *)handle;
1752 retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1755 g_slist_foreach(filter->list, __destroy_each_node, NULL);
1756 g_slist_free(filter->list);
1764 API int pkgmgrinfo_pkginfo_filter_add_int(pkgmgrinfo_pkginfo_filter_h handle,
1765 const char *property, const int value)
1767 char buf[PKG_VALUE_STRING_LEN_MAX] = {'\0'};
1771 pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x *)handle;
1772 pkgmgrinfo_node_x *node;
1774 retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1775 retvm_if(property == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1777 prop = _pminfo_pkginfo_convert_to_prop_int(property);
1778 if (prop < E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_INT ||
1779 prop > E_PMINFO_PKGINFO_PROP_PACKAGE_MAX_INT) {
1780 _LOGE("Invalid Integer Property\n");
1781 return PMINFO_R_EINVAL;
1783 node = (pkgmgrinfo_node_x *)calloc(1, sizeof(pkgmgrinfo_node_x));
1785 _LOGE("Out of Memory!!!\n");
1786 return PMINFO_R_ERROR;
1788 snprintf(buf, PKG_VALUE_STRING_LEN_MAX - 1, "%d", value);
1789 val = strndup(buf, PKG_VALUE_STRING_LEN_MAX - 1);
1791 _LOGE("Out of Memory\n");
1793 return PMINFO_R_ERROR;
1797 /*If API is called multiple times for same property, we should override the previous values.
1798 Last value set will be used for filtering.*/
1799 link = g_slist_find_custom(filter->list, (gconstpointer)node, __compare_func);
1801 filter->list = g_slist_delete_link(filter->list, link);
1802 filter->list = g_slist_append(filter->list, (gpointer)node);
1807 API int pkgmgrinfo_pkginfo_filter_add_bool(pkgmgrinfo_pkginfo_filter_h handle,
1808 const char *property, const bool value)
1813 pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x *)handle;
1814 pkgmgrinfo_node_x *node;
1816 retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1817 retvm_if(property == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1819 prop = _pminfo_pkginfo_convert_to_prop_bool(property);
1820 if (prop < E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_BOOL ||
1821 prop > E_PMINFO_PKGINFO_PROP_PACKAGE_MAX_BOOL) {
1822 _LOGE("Invalid Boolean Property\n");
1823 return PMINFO_R_EINVAL;
1825 node = (pkgmgrinfo_node_x *)calloc(1, sizeof(pkgmgrinfo_node_x));
1827 _LOGE("Out of Memory!!!\n");
1828 return PMINFO_R_ERROR;
1831 val = strndup("true", 4);
1833 val = strndup("false", 5);
1835 _LOGE("Out of Memory\n");
1837 return PMINFO_R_ERROR;
1841 /*If API is called multiple times for same property, we should override the previous values.
1842 Last value set will be used for filtering.*/
1843 link = g_slist_find_custom(filter->list, (gconstpointer)node, __compare_func);
1845 filter->list = g_slist_delete_link(filter->list, link);
1846 filter->list = g_slist_append(filter->list, (gpointer)node);
1851 API int pkgmgrinfo_pkginfo_filter_add_string(pkgmgrinfo_pkginfo_filter_h handle,
1852 const char *property, const char *value)
1857 pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x *)handle;
1858 pkgmgrinfo_node_x *node;
1860 retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1861 retvm_if(property == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1862 retvm_if(value == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1864 prop = _pminfo_pkginfo_convert_to_prop_str(property);
1865 if (prop < E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_STR ||
1866 prop > E_PMINFO_PKGINFO_PROP_PACKAGE_MAX_STR) {
1867 _LOGE("Invalid String Property\n");
1868 return PMINFO_R_EINVAL;
1870 node = (pkgmgrinfo_node_x *)calloc(1, sizeof(pkgmgrinfo_node_x));
1872 _LOGE("Out of Memory!!!\n");
1873 return PMINFO_R_ERROR;
1875 if (strcmp(value, PMINFO_PKGINFO_INSTALL_LOCATION_AUTO) == 0)
1876 val = strndup("auto", PKG_STRING_LEN_MAX - 1);
1877 else if (strcmp(value, PMINFO_PKGINFO_INSTALL_LOCATION_INTERNAL) == 0)
1878 val = strndup("internal-only", PKG_STRING_LEN_MAX - 1);
1879 else if (strcmp(value, PMINFO_PKGINFO_INSTALL_LOCATION_EXTERNAL) == 0)
1880 val = strndup("prefer-external", PKG_STRING_LEN_MAX - 1);
1881 else if (strcmp(value, "installed_internal") == 0)
1882 val = strndup("installed_internal", PKG_STRING_LEN_MAX - 1);
1883 else if (strcmp(value, "installed_external") == 0)
1884 val = strndup("installed_external", PKG_STRING_LEN_MAX - 1);
1886 val = strndup(value, PKG_STRING_LEN_MAX - 1);
1888 _LOGE("Out of Memory\n");
1890 return PMINFO_R_ERROR;
1894 /*If API is called multiple times for same property, we should override the previous values.
1895 Last value set will be used for filtering.*/
1896 link = g_slist_find_custom(filter->list, (gconstpointer)node, __compare_func);
1898 filter->list = g_slist_delete_link(filter->list, link);
1899 filter->list = g_slist_append(filter->list, (gpointer)node);
1904 API int pkgmgrinfo_pkginfo_usr_filter_count(pkgmgrinfo_pkginfo_filter_h handle, int *count, uid_t uid)
1908 GHashTable *list = NULL;
1910 if (handle == NULL || count == NULL) {
1911 _LOGE("invalid parameter");
1912 return PMINFO_R_EINVAL;
1915 locale = _get_system_locale();
1917 return PMINFO_R_ERROR;
1919 list = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
1923 return PMINFO_R_ERROR;
1926 ret = _pkginfo_get_packages(uid, locale,
1927 (pkgmgrinfo_filter_x *)handle, 0, list);
1928 if (ret == PMINFO_R_OK && uid != GLOBAL_USER)
1929 ret = _pkginfo_get_packages(GLOBAL_USER, locale, handle, 0,
1932 if (ret != PMINFO_R_OK) {
1933 g_hash_table_destroy(list);
1935 return PMINFO_R_ERROR;
1938 *count = g_hash_table_size(list);
1940 g_hash_table_destroy(list);
1946 API int pkgmgrinfo_pkginfo_filter_count(pkgmgrinfo_pkginfo_filter_h handle, int *count)
1948 return pkgmgrinfo_pkginfo_usr_filter_count(handle, count, _getuid());
1951 API int pkgmgrinfo_pkginfo_usr_filter_foreach_pkginfo(
1952 pkgmgrinfo_pkginfo_filter_h handle,
1953 pkgmgrinfo_pkg_list_cb pkg_cb, void *user_data, uid_t uid)
1955 if (handle == NULL || pkg_cb == NULL) {
1956 LOGE("invalid parameter");
1957 return PMINFO_R_EINVAL;
1960 return _pkginfo_get_filtered_foreach_pkginfo(uid, handle,
1961 PMINFO_PKGINFO_GET_ALL, pkg_cb, user_data);
1964 API int pkgmgrinfo_pkginfo_filter_foreach_pkginfo(pkgmgrinfo_pkginfo_filter_h handle,
1965 pkgmgrinfo_pkg_list_cb pkg_cb, void *user_data)
1967 return pkgmgrinfo_pkginfo_usr_filter_foreach_pkginfo(handle, pkg_cb, user_data, _getuid());
1970 API int pkgmgrinfo_pkginfo_foreach_privilege(pkgmgrinfo_pkginfo_h handle,
1971 pkgmgrinfo_pkg_privilege_list_cb privilege_func, void *user_data)
1973 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL");
1974 retvm_if(privilege_func == NULL, PMINFO_R_EINVAL, "Callback function is NULL");
1976 const char *privilege;
1978 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1980 if (info->pkg_info == NULL)
1981 return PMINFO_R_ERROR;
1983 for (tmp = info->pkg_info->privileges; tmp; tmp = tmp->next) {
1984 privilege = (const char *)tmp->data;
1985 if (privilege == NULL)
1987 ret = privilege_func(privilege, user_data);