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 _pkginfo_get_pkginfo(const char *pkgid, uid_t uid,
50 pkgmgr_pkginfo_x **pkginfo);
51 static char *_get_filtered_query(const char *query_raw,
52 pkgmgrinfo_filter_x *filter);
54 static bool _get_bool_value(const char *str)
58 else if (!strcasecmp(str, "true"))
64 static gint __compare_func(gconstpointer data1, gconstpointer data2)
66 pkgmgrinfo_node_x *node1 = (pkgmgrinfo_node_x*)data1;
67 pkgmgrinfo_node_x *node2 = (pkgmgrinfo_node_x*)data2;
68 if (node1->prop == node2->prop)
70 else if (node1->prop > node2->prop)
76 static void __destroy_each_node(gpointer data, gpointer user_data)
79 pkgmgrinfo_node_x *node = (pkgmgrinfo_node_x*)data;
92 static void __cleanup_pkginfo(pkgmgr_pkginfo_x *data)
96 free((void *)data->locale);
100 pkgmgrinfo_basic_free_package(data->pkg_info);
106 static int __child_element(xmlTextReaderPtr reader, int depth)
108 int ret = xmlTextReaderRead(reader);
109 int cur = xmlTextReaderDepth(reader);
112 switch (xmlTextReaderNodeType(reader)) {
113 case XML_READER_TYPE_ELEMENT:
114 if (cur == depth + 1)
117 case XML_READER_TYPE_TEXT:
118 /*text is handled by each function separately*/
119 if (cur == depth + 1)
122 case XML_READER_TYPE_END_ELEMENT:
131 ret = xmlTextReaderRead(reader);
132 cur = xmlTextReaderDepth(reader);
137 long long _pkgmgr_calculate_dir_size(char *dirname)
141 int q = 0; /*quotient*/
142 int r = 0; /*remainder*/
144 struct dirent *ep = NULL;
145 struct stat fileinfo;
146 char abs_filename[FILENAME_MAX] = { 0, };
147 retvm_if(dirname == NULL, PMINFO_R_ERROR, "dirname is NULL");
149 dp = opendir(dirname);
151 while ((ep = readdir(dp)) != NULL) {
152 if (!strcmp(ep->d_name, ".") ||
153 !strcmp(ep->d_name, "..")) {
156 snprintf(abs_filename, FILENAME_MAX, "%s/%s", dirname,
158 if (lstat(abs_filename, &fileinfo) < 0)
159 perror(abs_filename);
161 if (S_ISDIR(fileinfo.st_mode)) {
162 total += fileinfo.st_size;
163 if (strcmp(ep->d_name, ".")
164 && strcmp(ep->d_name, "..")) {
165 ret = _pkgmgr_calculate_dir_size
169 } else if (S_ISLNK(fileinfo.st_mode)) {
172 /*It is a file. Calculate the actual
173 size occupied (in terms of 4096 blocks)*/
174 q = (fileinfo.st_size / BLOCK_SIZE);
175 r = (fileinfo.st_size % BLOCK_SIZE);
179 total += q * BLOCK_SIZE;
185 _LOGE("Couldn't open the directory\n");
192 static gint __list_strcmp(gconstpointer a, gconstpointer b)
194 return strcmp((char *)a, (char *)b);
197 static int _pkginfo_get_list(sqlite3 *db, const char *locale,
198 pkgmgrinfo_filter_x *filter, GList **list)
200 static const char query_raw[] =
201 "SELECT DISTINCT package_info.package FROM package_info"
202 " LEFT OUTER JOIN package_localized_info"
203 " ON package_info.package=package_localized_info.package"
204 " AND package_localized_info.package_locale=%Q "
205 " LEFT OUTER JOIN package_privilege_info"
206 " ON package_info.package=package_privilege_info.package";
209 char *query_localized;
213 query = _get_filtered_query(query_raw, filter);
216 query_localized = sqlite3_mprintf(query, locale);
218 if (query_localized == NULL)
221 ret = sqlite3_prepare_v2(db, query_localized,
222 strlen(query_localized), &stmt, NULL);
223 sqlite3_free(query_localized);
224 if (ret != SQLITE_OK) {
225 LOGE("prepare failed: %s", sqlite3_errmsg(db));
229 while (sqlite3_step(stmt) == SQLITE_ROW) {
230 _save_column_str(stmt, 0, (const char **)&pkgid);
232 *list = g_list_insert_sorted(*list, pkgid,
236 sqlite3_finalize(stmt);
241 static int _pkginfo_get_filtered_list(pkgmgrinfo_filter_x *filter, uid_t uid,
251 locale = _get_system_locale();
253 return PMINFO_R_ERROR;
255 dbpath = getUserPkgParserDBPathUID(uid);
256 if (dbpath == NULL) {
258 return PMINFO_R_ERROR;
261 ret = sqlite3_open_v2(dbpath, &db, SQLITE_OPEN_READONLY, NULL);
262 if (ret != SQLITE_OK) {
263 _LOGE("failed to open db: %d", ret);
265 return PMINFO_R_ERROR;
268 if (_pkginfo_get_list(db, locale, filter, list)) {
270 sqlite3_close_v2(db);
271 return PMINFO_R_ERROR;
273 sqlite3_close_v2(db);
275 if (uid == GLOBAL_USER) {
280 /* search again from global */
281 dbpath = getUserPkgParserDBPathUID(GLOBAL_USER);
282 if (dbpath == NULL) {
284 return PMINFO_R_ERROR;
287 ret = sqlite3_open_v2(dbpath, &db, SQLITE_OPEN_READONLY, NULL);
288 if (ret != SQLITE_OK) {
289 _LOGE("failed to open db: %d", ret);
291 return PMINFO_R_ERROR;
294 if (_pkginfo_get_list(db, locale, filter, list)) {
296 sqlite3_close_v2(db);
297 return PMINFO_R_ERROR;
299 sqlite3_close_v2(db);
301 /* remove duplicate element:
302 * since the list is sorted, we can remove duplicates in linear time
304 for (tmp = *list, tmp2 = g_list_next(tmp); tmp;
305 tmp = tmp2, tmp2 = g_list_next(tmp)) {
306 if (tmp->prev == NULL || tmp->data == NULL)
308 if (strcmp((const char *)tmp->prev->data,
309 (const char *)tmp->data) == 0)
310 *list = g_list_delete_link(*list, tmp);
319 static int _pkginfo_get_filtered_foreach_pkginfo(pkgmgrinfo_filter_x *filter,
320 pkgmgrinfo_pkg_list_cb pkg_list_cb, void *user_data, uid_t uid)
323 pkgmgr_pkginfo_x *info;
329 ret = _pkginfo_get_filtered_list(filter, uid, &list);
330 if (ret != PMINFO_R_OK)
331 return PMINFO_R_ERROR;
333 for (tmp = list; tmp; tmp = tmp->next) {
334 pkgid = (char *)tmp->data;
336 ret = _pkginfo_get_pkginfo(pkgid, uid, &info);
337 if (ret == PMINFO_R_ENOENT && uid != GLOBAL_USER)
338 ret = _pkginfo_get_pkginfo(pkgid, GLOBAL_USER,
340 if (ret != PMINFO_R_OK) {
344 if (pkg_list_cb(info, user_data) < 0)
346 pkgmgrinfo_pkginfo_destroy_pkginfo(info);
356 API int pkgmgrinfo_pkginfo_get_usr_list(pkgmgrinfo_pkg_list_cb pkg_list_cb,
357 void *user_data, uid_t uid)
359 if (pkg_list_cb == NULL) {
360 LOGE("invalid parameter");
361 return PMINFO_R_EINVAL;
364 return _pkginfo_get_filtered_foreach_pkginfo(NULL, pkg_list_cb,
368 API int pkgmgrinfo_pkginfo_get_list(pkgmgrinfo_pkg_list_cb pkg_list_cb, void *user_data)
370 return pkgmgrinfo_pkginfo_get_usr_list(pkg_list_cb, user_data, GLOBAL_USER);
373 static int _pkginfo_get_author(sqlite3 *db, const char *pkgid,
376 static const char query_raw[] =
377 "SELECT author_name, author_email, author_href "
378 "FROM package_info WHERE package=%Q";
385 query = sqlite3_mprintf(query_raw, pkgid);
387 LOGE("out of memory");
388 return PMINFO_R_ERROR;
391 ret = sqlite3_prepare_v2(db, query, strlen(query),
394 if (ret != SQLITE_OK) {
395 LOGE("prepare failed: %s", sqlite3_errmsg(db));
396 return PMINFO_R_ERROR;
399 if (sqlite3_step(stmt) == SQLITE_ERROR) {
400 LOGE("step error: %s", sqlite3_errmsg(db));
401 sqlite3_finalize(stmt);
402 return PMINFO_R_ERROR;
405 /* one author per one package */
406 info = calloc(1, sizeof(author_x));
408 LOGE("out of memory");
409 sqlite3_finalize(stmt);
410 return PMINFO_R_ERROR;
413 _save_column_str(stmt, idx++, &info->text);
414 _save_column_str(stmt, idx++, &info->email);
415 _save_column_str(stmt, idx++, &info->href);
418 *author = g_list_append(*author, info);
420 sqlite3_finalize(stmt);
425 static int _pkginfo_get_label(sqlite3 *db, const char *pkgid,
426 const char *locale, GList **label)
428 static const char query_raw[] =
429 "SELECT package_label, package_locale "
430 "FROM package_localized_info "
431 "WHERE package=%Q AND package_locale IN (%Q, %Q)";
438 query = sqlite3_mprintf(query_raw, pkgid, locale, DEFAULT_LOCALE);
440 LOGE("out of memory");
441 return PMINFO_R_ERROR;
444 ret = sqlite3_prepare_v2(db, query, strlen(query),
447 if (ret != SQLITE_OK) {
448 LOGE("prepare failed: %s", sqlite3_errmsg(db));
449 return PMINFO_R_ERROR;
452 while (sqlite3_step(stmt) == SQLITE_ROW) {
453 info = calloc(1, sizeof(label_x));
455 LOGE("out of memory");
456 sqlite3_finalize(stmt);
457 return PMINFO_R_ERROR;
460 _save_column_str(stmt, idx++, &info->text);
461 _save_column_str(stmt, idx++, &info->lang);
462 *label = g_list_append(*label, info);
465 sqlite3_finalize(stmt);
470 static int _pkginfo_get_icon(sqlite3 *db, const char *pkgid, const char *locale,
473 static const char query_raw[] =
474 "SELECT package_icon, package_locale "
475 "FROM package_localized_info "
476 "WHERE package=%Q AND package_locale IN (%Q, %Q)";
483 query = sqlite3_mprintf(query_raw, pkgid, locale, DEFAULT_LOCALE);
485 LOGE("out of memory");
486 return PMINFO_R_ERROR;
489 ret = sqlite3_prepare_v2(db, query, strlen(query),
492 if (ret != SQLITE_OK) {
493 LOGE("prepare failed: %s", sqlite3_errmsg(db));
494 return PMINFO_R_ERROR;
497 while (sqlite3_step(stmt) == SQLITE_ROW) {
498 info = calloc(1, sizeof(icon_x));
500 LOGE("out of memory");
501 sqlite3_finalize(stmt);
502 return PMINFO_R_ERROR;
505 _save_column_str(stmt, idx++, &info->text);
506 _save_column_str(stmt, idx++, &info->lang);
507 *icon = g_list_append(*icon, info);
510 sqlite3_finalize(stmt);
515 static int _pkginfo_get_description(sqlite3 *db, const char *pkgid,
516 const char *locale, GList **description)
518 static const char query_raw[] =
519 "SELECT package_description, package_locale "
520 "FROM package_localized_info "
521 "WHERE package=%Q AND package_locale IN (%Q, %Q)";
528 query = sqlite3_mprintf(query_raw, pkgid, locale, DEFAULT_LOCALE);
530 LOGE("out of memory");
531 return PMINFO_R_ERROR;
534 ret = sqlite3_prepare_v2(db, query, strlen(query),
537 if (ret != SQLITE_OK) {
538 LOGE("prepare failed: %s", sqlite3_errmsg(db));
539 return PMINFO_R_ERROR;
542 while (sqlite3_step(stmt) == SQLITE_ROW) {
543 info = calloc(1, sizeof(description_x));
545 LOGE("out of memory");
546 sqlite3_finalize(stmt);
547 return PMINFO_R_ERROR;
550 _save_column_str(stmt, idx++, &info->text);
551 _save_column_str(stmt, idx++, &info->lang);
552 *description = g_list_append(*description, info);
555 sqlite3_finalize(stmt);
560 static int _pkginfo_get_privilege(sqlite3 *db, const char *pkgid,
563 static const char query_raw[] =
564 "SELECT privilege FROM package_privilege_info WHERE package=%Q";
568 const char *privilege;
570 query = sqlite3_mprintf(query_raw, pkgid);
572 LOGE("out of memory");
573 return PMINFO_R_ERROR;
576 ret = sqlite3_prepare_v2(db, query, strlen(query),
579 if (ret != SQLITE_OK) {
580 LOGE("prepare failed: %s", sqlite3_errmsg(db));
581 return PMINFO_R_ERROR;
584 while (sqlite3_step(stmt) == SQLITE_ROW) {
586 _save_column_str(stmt, 0, &privilege);
588 *privileges = g_list_append(*privileges,
589 (gpointer)privilege);
592 sqlite3_finalize(stmt);
597 static char *_get_filtered_query(const char *query_raw,
598 pkgmgrinfo_filter_x *filter)
600 char buf[MAX_QUERY_LEN] = { 0, };
609 strncat(buf, query_raw, MAX_QUERY_LEN - 1);
611 for (list = head; list; list = list->next) {
612 /* TODO: revise condition getter function */
613 __get_filter_condition(list->data, &condition);
614 if (condition == NULL)
616 if (buf[strlen(query_raw)] == '\0') {
617 len += strlen(" WHERE ");
618 strncat(buf, " WHERE ", MAX_QUERY_LEN - len - 1);
620 len += strlen(" AND ");
621 strncat(buf, " AND ", MAX_QUERY_LEN -len - 1);
623 len += strlen(condition);
624 strncat(buf, condition, sizeof(buf) - len - 1);
632 static int _pkginfo_get_package(sqlite3 *db, const char *pkgid,
633 const char *locale, package_x **package)
635 static const char query_raw[] =
636 "SELECT package, package_version, "
637 "install_location, package_removable, package_preload, "
638 "package_readonly, package_update, package_appsetting, "
639 "package_system, package_type, package_size, installed_time, "
640 "installed_storage, storeclient_id, mainapp_id, package_url, "
641 "root_path, csc_path, package_nodisplay, package_api_version, "
642 "package_support_disable "
643 "FROM package_info WHERE package=%Q";
650 query = sqlite3_mprintf(query_raw, pkgid);
652 LOGE("out of memory");
653 return PMINFO_R_ERROR;
656 ret = sqlite3_prepare_v2(db, query, strlen(query),
659 if (ret != SQLITE_OK) {
660 LOGE("prepare failed: %s", sqlite3_errmsg(db));
661 return PMINFO_R_ERROR;
664 ret = sqlite3_step(stmt);
665 if (ret == SQLITE_DONE) {
666 sqlite3_finalize(stmt);
667 return PMINFO_R_ENOENT;
668 } else if (ret != SQLITE_ROW) {
669 LOGE("step failed: %s", sqlite3_errmsg(db));
670 sqlite3_finalize(stmt);
671 return PMINFO_R_ERROR;
674 info = calloc(1, sizeof(package_x));
676 LOGE("out of memory");
677 sqlite3_finalize(stmt);
678 return PMINFO_R_ERROR;
681 _save_column_str(stmt, idx++, &info->package);
682 _save_column_str(stmt, idx++, &info->version);
683 _save_column_str(stmt, idx++, &info->installlocation);
684 _save_column_str(stmt, idx++, &info->removable);
685 _save_column_str(stmt, idx++, &info->preload);
686 _save_column_str(stmt, idx++, &info->readonly);
687 _save_column_str(stmt, idx++, &info->update);
688 _save_column_str(stmt, idx++, &info->appsetting);
689 _save_column_str(stmt, idx++, &info->system);
690 _save_column_str(stmt, idx++, &info->type);
691 _save_column_str(stmt, idx++, &info->package_size);
692 _save_column_str(stmt, idx++, &info->installed_time);
693 _save_column_str(stmt, idx++, &info->installed_storage);
694 _save_column_str(stmt, idx++, &info->storeclient_id);
695 _save_column_str(stmt, idx++, &info->mainapp_id);
696 _save_column_str(stmt, idx++, &info->package_url);
697 _save_column_str(stmt, idx++, &info->root_path);
698 _save_column_str(stmt, idx++, &info->csc_path);
699 _save_column_str(stmt, idx++, &info->nodisplay_setting);
700 _save_column_str(stmt, idx++, &info->api_version);
701 _save_column_str(stmt, idx++, &info->support_disable);
703 if (_pkginfo_get_author(db, info->package, &info->author)) {
704 pkgmgrinfo_basic_free_package(info);
705 sqlite3_finalize(stmt);
706 return PMINFO_R_ERROR;
709 if (_pkginfo_get_label(db, info->package, locale, &info->label)) {
710 pkgmgrinfo_basic_free_package(info);
711 sqlite3_finalize(stmt);
712 return PMINFO_R_ERROR;
715 if (_pkginfo_get_icon(db, info->package, locale, &info->icon)) {
716 pkgmgrinfo_basic_free_package(info);
717 sqlite3_finalize(stmt);
718 return PMINFO_R_ERROR;
721 if (_pkginfo_get_description(db, info->package, locale,
722 &info->description)) {
723 pkgmgrinfo_basic_free_package(info);
724 sqlite3_finalize(stmt);
725 return PMINFO_R_ERROR;
728 if (_pkginfo_get_privilege(db, info->package, &info->privileges)) {
729 pkgmgrinfo_basic_free_package(info);
730 sqlite3_finalize(stmt);
731 return PMINFO_R_ERROR;
735 sqlite3_finalize(stmt);
740 static int _pkginfo_get_pkginfo(const char *pkgid, uid_t uid,
741 pkgmgr_pkginfo_x **pkginfo)
747 pkgmgr_pkginfo_x *info;
749 dbpath = getUserPkgParserDBPathUID(uid);
751 return PMINFO_R_ERROR;
753 locale = _get_system_locale();
755 return PMINFO_R_ERROR;
757 ret = sqlite3_open_v2(dbpath, &db, SQLITE_OPEN_READONLY, NULL);
758 if (ret != SQLITE_OK) {
759 _LOGE("failed to open db: %d", ret);
761 return PMINFO_R_ERROR;
764 info = calloc(1, sizeof(pkgmgr_pkginfo_x));
766 _LOGE("out of memory");
768 sqlite3_close_v2(db);
769 return PMINFO_R_ERROR;
772 ret = _pkginfo_get_package(db, pkgid, locale, &info->pkg_info);
773 if (ret != PMINFO_R_OK) {
776 sqlite3_close_v2(db);
780 info->locale = locale;
782 info->pkg_info->for_all_users = strdup(
783 uid != GLOBAL_USER ? "false" : "true");
787 sqlite3_close_v2(db);
792 API int pkgmgrinfo_pkginfo_get_usr_pkginfo(const char *pkgid, uid_t uid,
793 pkgmgrinfo_pkginfo_h *handle)
797 if (pkgid == NULL || handle == NULL) {
798 LOGE("invalid parameter");
799 return PMINFO_R_EINVAL;
802 ret = _pkginfo_get_pkginfo(pkgid, uid, (pkgmgr_pkginfo_x **)handle);
803 if (ret == PMINFO_R_ENOENT && uid != GLOBAL_USER)
804 ret = _pkginfo_get_pkginfo(pkgid, GLOBAL_USER,
805 (pkgmgr_pkginfo_x **)handle);
807 if (ret != PMINFO_R_OK)
808 _LOGE("failed to get pkginfo of %s for user %d", pkgid, uid);
813 API int pkgmgrinfo_pkginfo_get_pkginfo(const char *pkgid, pkgmgrinfo_pkginfo_h *handle)
815 return pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, GLOBAL_USER, handle);
818 API int pkgmgrinfo_pkginfo_get_pkgname(pkgmgrinfo_pkginfo_h handle, char **pkg_name)
820 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
822 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
823 retvm_if(pkg_name == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
825 if (info->pkg_info == NULL || info->pkg_info->package == NULL)
826 return PMINFO_R_ERROR;
828 *pkg_name = (char *)info->pkg_info->package;
833 API int pkgmgrinfo_pkginfo_get_pkgid(pkgmgrinfo_pkginfo_h handle, char **pkgid)
835 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
837 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
838 retvm_if(pkgid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
840 if (info->pkg_info == NULL || info->pkg_info->package == NULL)
841 return PMINFO_R_ERROR;
843 *pkgid = (char *)info->pkg_info->package;
848 API int pkgmgrinfo_pkginfo_get_type(pkgmgrinfo_pkginfo_h handle, char **type)
850 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
852 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
853 retvm_if(type == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
855 if (info->pkg_info == NULL || info->pkg_info->type == NULL)
856 return PMINFO_R_ERROR;
858 *type = (char *)info->pkg_info->type;
863 API int pkgmgrinfo_pkginfo_get_version(pkgmgrinfo_pkginfo_h handle, char **version)
865 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
867 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
868 retvm_if(version == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
870 if (info->pkg_info == NULL || info->pkg_info->version == NULL)
871 return PMINFO_R_ERROR;
873 *version = (char *)info->pkg_info->version;
878 API int pkgmgrinfo_pkginfo_get_install_location(pkgmgrinfo_pkginfo_h handle, pkgmgrinfo_install_location *location)
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(location == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
886 if (info->pkg_info == NULL || info->pkg_info->installlocation == NULL)
887 return PMINFO_R_ERROR;
889 val = (char *)info->pkg_info->installlocation;
890 if (strcmp(val, "internal-only") == 0)
891 *location = PMINFO_INSTALL_LOCATION_INTERNAL_ONLY;
892 else if (strcmp(val, "prefer-external") == 0)
893 *location = PMINFO_INSTALL_LOCATION_PREFER_EXTERNAL;
895 *location = PMINFO_INSTALL_LOCATION_AUTO;
900 API int pkgmgrinfo_pkginfo_get_package_size(pkgmgrinfo_pkginfo_h handle, int *size)
902 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
904 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
905 retvm_if(size == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
907 if (info->pkg_info == NULL || info->pkg_info->package_size == NULL)
908 return PMINFO_R_ERROR;
910 *size = atoi((char *)info->pkg_info->package_size);
915 API int pkgmgrinfo_pkginfo_get_total_size(pkgmgrinfo_pkginfo_h handle, int *size)
918 char device_path[PKG_STRING_LEN_MAX] = { '\0', };
919 long long rw_size = 0;
920 long long ro_size = 0;
921 long long tmp_size = 0;
922 long long total_size = 0;
923 struct stat fileinfo;
926 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
927 retvm_if(size == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
929 ret = pkgmgrinfo_pkginfo_get_pkgid(handle, &pkgid);
931 return PMINFO_R_ERROR;
934 snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/bin", PKG_RW_PATH, pkgid);
935 if (lstat(device_path, &fileinfo) == 0) {
936 if (!S_ISLNK(fileinfo.st_mode)) {
937 tmp_size = _pkgmgr_calculate_dir_size(device_path);
943 snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/info", PKG_RW_PATH, pkgid);
944 if (lstat(device_path, &fileinfo) == 0) {
945 if (!S_ISLNK(fileinfo.st_mode)) {
946 tmp_size = _pkgmgr_calculate_dir_size(device_path);
952 snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/res", PKG_RW_PATH, pkgid);
953 if (lstat(device_path, &fileinfo) == 0) {
954 if (!S_ISLNK(fileinfo.st_mode)) {
955 tmp_size = _pkgmgr_calculate_dir_size(device_path);
961 snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/data", PKG_RW_PATH, pkgid);
962 if (lstat(device_path, &fileinfo) == 0) {
963 if (!S_ISLNK(fileinfo.st_mode)) {
964 tmp_size = _pkgmgr_calculate_dir_size(device_path);
970 snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/shared", PKG_RW_PATH, pkgid);
971 if (lstat(device_path, &fileinfo) == 0) {
972 if (!S_ISLNK(fileinfo.st_mode)) {
973 tmp_size = _pkgmgr_calculate_dir_size(device_path);
979 snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/setting", PKG_RW_PATH, pkgid);
980 if (lstat(device_path, &fileinfo) == 0) {
981 if (!S_ISLNK(fileinfo.st_mode)) {
982 tmp_size = _pkgmgr_calculate_dir_size(device_path);
989 snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/bin", PKG_RO_PATH, pkgid);
990 if (lstat(device_path, &fileinfo) == 0) {
991 if (!S_ISLNK(fileinfo.st_mode)) {
992 tmp_size = _pkgmgr_calculate_dir_size(device_path);
998 snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/info", PKG_RO_PATH, pkgid);
999 if (lstat(device_path, &fileinfo) == 0) {
1000 if (!S_ISLNK(fileinfo.st_mode)) {
1001 tmp_size = _pkgmgr_calculate_dir_size(device_path);
1003 ro_size += tmp_size;
1007 snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/res", PKG_RO_PATH, pkgid);
1008 if (lstat(device_path, &fileinfo) == 0) {
1009 if (!S_ISLNK(fileinfo.st_mode)) {
1010 tmp_size = _pkgmgr_calculate_dir_size(device_path);
1012 ro_size += tmp_size;
1016 snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/data", PKG_RO_PATH, pkgid);
1017 if (lstat(device_path, &fileinfo) == 0) {
1018 if (!S_ISLNK(fileinfo.st_mode)) {
1019 tmp_size = _pkgmgr_calculate_dir_size(device_path);
1021 ro_size += tmp_size;
1025 snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/shared", PKG_RO_PATH, pkgid);
1026 if (lstat(device_path, &fileinfo) == 0) {
1027 if (!S_ISLNK(fileinfo.st_mode)) {
1028 tmp_size = _pkgmgr_calculate_dir_size(device_path);
1030 ro_size += tmp_size;
1034 snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/setting", PKG_RO_PATH, pkgid);
1035 if (lstat(device_path, &fileinfo) == 0) {
1036 if (!S_ISLNK(fileinfo.st_mode)) {
1037 tmp_size = _pkgmgr_calculate_dir_size(device_path);
1039 ro_size += tmp_size;
1044 total_size = rw_size + ro_size;
1045 *size = (int)total_size;
1050 API int pkgmgrinfo_pkginfo_get_data_size(pkgmgrinfo_pkginfo_h handle, int *size)
1053 char device_path[PKG_STRING_LEN_MAX] = { '\0', };
1054 long long total_size = 0;
1056 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1057 retvm_if(size == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1059 if (pkgmgrinfo_pkginfo_get_pkgid(handle, &pkgid) < 0)
1060 return PMINFO_R_ERROR;
1062 snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/data", PKG_RW_PATH, pkgid);
1063 if (access(device_path, R_OK) == 0)
1064 total_size = _pkgmgr_calculate_dir_size(device_path);
1066 return PMINFO_R_ERROR;
1068 *size = (int)total_size;
1073 API int pkgmgrinfo_pkginfo_get_icon(pkgmgrinfo_pkginfo_h handle, char **icon)
1078 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1080 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL");
1081 retvm_if(icon == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL");
1083 locale = info->locale;
1084 retvm_if(locale == NULL, PMINFO_R_ERROR, "manifest locale is NULL");
1086 if (info->pkg_info == NULL)
1087 return PMINFO_R_ERROR;
1089 for (tmp = info->pkg_info->icon; tmp; tmp = tmp->next) {
1090 ptr = (icon_x *)tmp->data;
1091 if (ptr == NULL || ptr->text == NULL || ptr->lang == NULL ||
1092 strcmp(ptr->lang, locale))
1094 *icon = (char *)ptr->text;
1098 locale = DEFAULT_LOCALE;
1099 for (tmp = info->pkg_info->icon; tmp; tmp = tmp->next) {
1100 ptr = (icon_x *)tmp->data;
1101 if (ptr == NULL || ptr->text == NULL || ptr->lang == NULL ||
1102 strcmp(ptr->lang, locale))
1104 *icon = (char *)ptr->text;
1108 return PMINFO_R_ERROR;
1111 API int pkgmgrinfo_pkginfo_get_label(pkgmgrinfo_pkginfo_h handle, char **label)
1116 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1118 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL");
1119 retvm_if(label == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL");
1121 locale = info->locale;
1122 retvm_if(locale == NULL, PMINFO_R_ERROR, "manifest locale is NULL");
1124 for (tmp = info->pkg_info->label; tmp != NULL; tmp = tmp->next) {
1125 ptr = (label_x *)tmp->data;
1126 if (ptr == NULL || ptr->text == NULL || ptr->lang == NULL ||
1127 strcmp(ptr->lang, locale))
1129 *label = (char *)ptr->text;
1133 locale = DEFAULT_LOCALE;
1134 for (tmp = info->pkg_info->label; tmp != NULL; tmp = tmp->next) {
1135 ptr = (label_x *)tmp->data;
1136 if (ptr == NULL || ptr->text == NULL || ptr->lang == NULL ||
1137 strcmp(ptr->lang, locale))
1139 *label = (char *)ptr->text;
1143 return PMINFO_R_ERROR;
1146 API int pkgmgrinfo_pkginfo_get_description(pkgmgrinfo_pkginfo_h handle, char **description)
1151 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1153 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1154 retvm_if(description == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1156 locale = info->locale;
1157 retvm_if(locale == NULL, PMINFO_R_ERROR, "manifest locale is NULL");
1159 for (tmp = info->pkg_info->description; tmp; tmp = tmp->next) {
1160 ptr = (description_x *)tmp->data;
1161 if (ptr == NULL || ptr->text == NULL || ptr->lang == NULL ||
1162 strcmp(ptr->lang, locale))
1164 *description = (char *)ptr->text;
1168 locale = DEFAULT_LOCALE;
1169 for (tmp = info->pkg_info->description; tmp; tmp = tmp->next) {
1170 ptr = (description_x *)tmp->data;
1171 if (ptr == NULL || ptr->text == NULL || ptr->lang == NULL ||
1172 strcmp(ptr->lang, locale))
1174 *description = (char *)ptr->text;
1178 return PMINFO_R_ERROR;
1181 API int pkgmgrinfo_pkginfo_get_author_name(pkgmgrinfo_pkginfo_h handle, char **author_name)
1183 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1186 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1187 retvm_if(author_name == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1189 if (info->pkg_info == NULL || info->pkg_info->author == NULL)
1190 return PMINFO_R_ERROR;
1192 author = (author_x *)info->pkg_info->author->data;
1193 if (author == NULL || author->text == NULL)
1194 return PMINFO_R_ERROR;
1196 *author_name = (char *)author->text;
1201 API int pkgmgrinfo_pkginfo_get_author_email(pkgmgrinfo_pkginfo_h handle, char **author_email)
1203 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1206 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1207 retvm_if(author_email == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1209 if (info->pkg_info == NULL || info->pkg_info->author == NULL)
1210 return PMINFO_R_ERROR;
1212 author = (author_x *)info->pkg_info->author->data;
1213 if (author == NULL || author->email == NULL)
1214 return PMINFO_R_ERROR;
1216 *author_email = (char *)author->email;
1221 API int pkgmgrinfo_pkginfo_get_author_href(pkgmgrinfo_pkginfo_h handle, char **author_href)
1223 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1226 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1227 retvm_if(author_href == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1229 if (info->pkg_info == NULL || info->pkg_info->author == NULL)
1230 return PMINFO_R_ERROR;
1232 author = (author_x *)info->pkg_info->author->data;
1233 if (author == NULL || author->href == NULL)
1234 return PMINFO_R_ERROR;
1236 *author_href = (char *)author->href;
1241 API int pkgmgrinfo_pkginfo_get_installed_storage(pkgmgrinfo_pkginfo_h handle, pkgmgrinfo_installed_storage *storage)
1243 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1245 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1246 retvm_if(storage == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1248 if (info->pkg_info == NULL || info->pkg_info->installed_storage == NULL)
1249 return PMINFO_R_ERROR;
1251 if (strcmp(info->pkg_info->installed_storage,"installed_internal") == 0)
1252 *storage = PMINFO_INTERNAL_STORAGE;
1253 else if (strcmp(info->pkg_info->installed_storage,"installed_external") == 0)
1254 *storage = PMINFO_EXTERNAL_STORAGE;
1256 return PMINFO_R_ERROR;
1261 API int pkgmgrinfo_pkginfo_get_installed_time(pkgmgrinfo_pkginfo_h handle, int *installed_time)
1263 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1265 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1266 retvm_if(installed_time == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1268 if (info->pkg_info == NULL || info->pkg_info->installed_time == NULL)
1269 return PMINFO_R_ERROR;
1271 *installed_time = atoi(info->pkg_info->installed_time);
1276 API int pkgmgrinfo_pkginfo_get_storeclientid(pkgmgrinfo_pkginfo_h handle, char **storeclientid)
1278 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1280 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1281 retvm_if(storeclientid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1283 if (info->pkg_info == NULL || info->pkg_info->storeclient_id == NULL)
1284 return PMINFO_R_ERROR;
1286 *storeclientid = (char *)info->pkg_info->storeclient_id;
1291 API int pkgmgrinfo_pkginfo_get_mainappid(pkgmgrinfo_pkginfo_h handle, char **mainappid)
1293 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1295 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1296 retvm_if(mainappid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1298 if (info->pkg_info == NULL || info->pkg_info->mainapp_id == NULL)
1299 return PMINFO_R_ERROR;
1301 *mainappid = (char *)info->pkg_info->mainapp_id;
1306 API int pkgmgrinfo_pkginfo_get_url(pkgmgrinfo_pkginfo_h handle, char **url)
1308 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1310 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1311 retvm_if(url == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1313 if (info->pkg_info == NULL || info->pkg_info->package_url == NULL)
1314 return PMINFO_R_ERROR;
1316 *url = (char *)info->pkg_info->package_url;
1321 API int pkgmgrinfo_pkginfo_get_size_from_xml(const char *manifest, int *size)
1323 const char *val = NULL;
1324 const xmlChar *node;
1325 xmlTextReaderPtr reader;
1326 retvm_if(manifest == NULL, PMINFO_R_EINVAL, "Input argument is NULL\n");
1327 retvm_if(size == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1330 reader = xmlReaderForFile(manifest, NULL, 0);
1333 if (__child_element(reader, -1)) {
1334 node = xmlTextReaderConstName(reader);
1336 _LOGE("xmlTextReaderConstName value is NULL\n");
1337 xmlFreeTextReader(reader);
1339 return PMINFO_R_ERROR;
1342 if (!strcmp(ASC_CHAR(node), "manifest")) {
1343 if (xmlTextReaderGetAttribute(reader, XML_CHAR("size")))
1344 val = ASC_CHAR(xmlTextReaderGetAttribute(reader, XML_CHAR("size")));
1350 _LOGE("package size is not specified\n");
1351 xmlFreeTextReader(reader);
1353 return PMINFO_R_ERROR;
1356 _LOGE("Unable to create xml reader\n");
1357 xmlFreeTextReader(reader);
1359 return PMINFO_R_ERROR;
1363 _LOGE("xmlReaderForFile value is NULL\n");
1365 return PMINFO_R_ERROR;
1368 xmlFreeTextReader(reader);
1374 API int pkgmgrinfo_pkginfo_get_location_from_xml(const char *manifest, pkgmgrinfo_install_location *location)
1376 const char *val = NULL;
1377 const xmlChar *node;
1378 xmlTextReaderPtr reader;
1379 retvm_if(manifest == NULL, PMINFO_R_EINVAL, "Input argument is NULL\n");
1380 retvm_if(location == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1383 reader = xmlReaderForFile(manifest, NULL, 0);
1386 if ( __child_element(reader, -1)) {
1387 node = xmlTextReaderConstName(reader);
1389 _LOGE("xmlTextReaderConstName value is NULL\n");
1390 xmlFreeTextReader(reader);
1392 return PMINFO_R_ERROR;
1395 if (!strcmp(ASC_CHAR(node), "manifest")) {
1396 if (xmlTextReaderGetAttribute(reader, XML_CHAR("install-location")))
1397 val = ASC_CHAR(xmlTextReaderGetAttribute(reader, XML_CHAR("install-location")));
1400 if (strcmp(val, "internal-only") == 0)
1401 *location = PMINFO_INSTALL_LOCATION_INTERNAL_ONLY;
1402 else if (strcmp(val, "prefer-external") == 0)
1403 *location = PMINFO_INSTALL_LOCATION_PREFER_EXTERNAL;
1405 *location = PMINFO_INSTALL_LOCATION_AUTO;
1408 _LOGE("Unable to create xml reader\n");
1409 xmlFreeTextReader(reader);
1411 return PMINFO_R_ERROR;
1415 _LOGE("xmlReaderForFile value is NULL\n");
1417 return PMINFO_R_ERROR;
1420 xmlFreeTextReader(reader);
1427 API int pkgmgrinfo_pkginfo_get_root_path(pkgmgrinfo_pkginfo_h handle, char **path)
1429 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1431 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1432 retvm_if(path == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1434 if (info->pkg_info == NULL || info->pkg_info->root_path == NULL)
1435 return PMINFO_R_ERROR;
1437 *path = (char *)info->pkg_info->root_path;
1442 API int pkgmgrinfo_pkginfo_get_csc_path(pkgmgrinfo_pkginfo_h handle, char **path)
1444 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1446 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1447 retvm_if(path == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1449 if (info->pkg_info == NULL || info->pkg_info->csc_path == NULL)
1450 return PMINFO_R_ERROR;
1452 *path = (char *)info->pkg_info->csc_path;
1458 API int pkgmgrinfo_pkginfo_is_accessible(pkgmgrinfo_pkginfo_h handle, bool *accessible)
1460 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1461 retvm_if(accessible == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1463 #if 0 //smack issue occured, check later
1465 pkgmgrinfo_pkginfo_get_pkgid(handle, &pkgid);
1467 _LOGD("invalid func parameters\n");
1468 return PMINFO_R_ERROR;
1470 _LOGD("pkgmgr_get_pkg_external_validation() called\n");
1473 char app_mmc_path[FILENAME_MAX] = { 0, };
1474 char app_dir_path[FILENAME_MAX] = { 0, };
1475 char app_mmc_internal_path[FILENAME_MAX] = { 0, };
1476 snprintf(app_dir_path, FILENAME_MAX,"%s%s", PKG_INSTALLATION_PATH, pkgid);
1477 snprintf(app_mmc_path, FILENAME_MAX,"%s%s", PKG_SD_PATH, pkgid);
1478 snprintf(app_mmc_internal_path, FILENAME_MAX,"%s%s/.mmc", PKG_INSTALLATION_PATH, pkgid);
1480 /*check whether application is in external memory or not */
1481 fp = fopen(app_mmc_path, "r");
1483 _LOGD(" app path in external memory not accesible\n");
1488 _LOGD("pkgmgr_get_pkg_external_validation() : SD_CARD \n");
1492 /*check whether application is in internal or not */
1493 fp = fopen(app_dir_path, "r");
1495 _LOGD(" app path in internal memory not accesible\n");
1497 return PMINFO_R_ERROR;
1500 /*check whether the application is installed in SD card
1501 but SD card is not present*/
1502 fp = fopen(app_mmc_internal_path, "r");
1505 _LOGD("pkgmgr_get_pkg_external_validation() : INTERNAL_MEM \n");
1510 _LOGD("pkgmgr_get_pkg_external_validation() : ERROR_MMC_STATUS \n");
1515 _LOGD("pkgmgr_get_pkg_external_validation() end\n");
1522 API int pkgmgrinfo_pkginfo_is_removable(pkgmgrinfo_pkginfo_h handle, bool *removable)
1524 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1526 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1527 retvm_if(removable == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1529 if (info->pkg_info == NULL || info->pkg_info->removable == NULL)
1530 return PMINFO_R_ERROR;
1532 *removable = _get_bool_value(info->pkg_info->removable);
1537 API int pkgmgrinfo_pkginfo_is_movable(pkgmgrinfo_pkginfo_h handle, bool *movable)
1540 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1542 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1543 retvm_if(movable == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1545 if (info->pkg_info == NULL || info->pkg_info->installlocation == NULL)
1546 return PMINFO_R_ERROR;
1548 val = (char *)info->pkg_info->installlocation;
1549 if (strcmp(val, "internal-only") == 0)
1551 else if (strcmp(val, "prefer-external") == 0)
1559 API int pkgmgrinfo_pkginfo_is_preload(pkgmgrinfo_pkginfo_h handle, bool *preload)
1561 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1563 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1564 retvm_if(preload == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1566 if (info->pkg_info == NULL || info->pkg_info->preload == NULL)
1567 return PMINFO_R_ERROR;
1569 *preload = _get_bool_value(info->pkg_info->preload);
1574 API int pkgmgrinfo_pkginfo_is_system(pkgmgrinfo_pkginfo_h handle, bool *system)
1576 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1578 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1579 retvm_if(system == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1581 if (info->pkg_info == NULL || info->pkg_info->system == NULL)
1582 return PMINFO_R_ERROR;
1584 *system = _get_bool_value(info->pkg_info->system);
1589 API int pkgmgrinfo_pkginfo_is_readonly(pkgmgrinfo_pkginfo_h handle, bool *readonly)
1591 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1593 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1594 retvm_if(readonly == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1596 if (info->pkg_info == NULL || info->pkg_info->readonly == NULL)
1597 return PMINFO_R_ERROR;
1599 *readonly = _get_bool_value(info->pkg_info->readonly);
1604 API int pkgmgrinfo_pkginfo_is_update(pkgmgrinfo_pkginfo_h handle, bool *update)
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(update == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1611 if (info->pkg_info == NULL || info->pkg_info->update == NULL)
1612 return PMINFO_R_ERROR;
1614 *update = _get_bool_value(info->pkg_info->update);
1619 API int pkgmgrinfo_pkginfo_is_support_disable(pkgmgrinfo_pkginfo_h handle, bool *support_disable)
1621 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1623 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1624 retvm_if(support_disable == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1626 if (info->pkg_info == NULL || info->pkg_info->support_disable == NULL)
1627 return PMINFO_R_ERROR;
1629 *support_disable = _get_bool_value(info->pkg_info->support_disable);
1634 API int pkgmgrinfo_pkginfo_is_global(pkgmgrinfo_pkginfo_h handle, bool *global)
1636 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1638 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1639 retvm_if(global == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1641 if (info->pkg_info == NULL || info->pkg_info->for_all_users == NULL)
1642 return PMINFO_R_ERROR;
1644 *global = _get_bool_value(info->pkg_info->for_all_users);
1649 API int pkgmgrinfo_pkginfo_is_for_all_users(pkgmgrinfo_pkginfo_h handle, bool *for_all_users)
1651 return pkgmgrinfo_pkginfo_is_global(handle, for_all_users);
1654 API int pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo_h handle)
1656 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1658 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1660 __cleanup_pkginfo(info);
1665 API int pkgmgrinfo_pkginfo_filter_create(pkgmgrinfo_pkginfo_filter_h *handle)
1667 pkgmgrinfo_filter_x *filter;
1669 retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle output parameter is NULL\n");
1671 filter = (pkgmgrinfo_filter_x*)calloc(1, sizeof(pkgmgrinfo_filter_x));
1672 if (filter == NULL) {
1673 _LOGE("Out of Memory!!!");
1674 return PMINFO_R_ERROR;
1682 API int pkgmgrinfo_pkginfo_filter_destroy(pkgmgrinfo_pkginfo_filter_h handle)
1684 pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x *)handle;
1686 retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1689 g_slist_foreach(filter->list, __destroy_each_node, NULL);
1690 g_slist_free(filter->list);
1698 API int pkgmgrinfo_pkginfo_filter_add_int(pkgmgrinfo_pkginfo_filter_h handle,
1699 const char *property, const int value)
1701 char buf[PKG_VALUE_STRING_LEN_MAX] = {'\0'};
1705 pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x *)handle;
1706 pkgmgrinfo_node_x *node;
1708 retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1709 retvm_if(property == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1711 prop = _pminfo_pkginfo_convert_to_prop_int(property);
1712 if (prop < E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_INT ||
1713 prop > E_PMINFO_PKGINFO_PROP_PACKAGE_MAX_INT) {
1714 _LOGE("Invalid Integer Property\n");
1715 return PMINFO_R_EINVAL;
1717 node = (pkgmgrinfo_node_x *)calloc(1, sizeof(pkgmgrinfo_node_x));
1719 _LOGE("Out of Memory!!!\n");
1720 return PMINFO_R_ERROR;
1722 snprintf(buf, PKG_VALUE_STRING_LEN_MAX - 1, "%d", value);
1723 val = strndup(buf, PKG_VALUE_STRING_LEN_MAX - 1);
1725 _LOGE("Out of Memory\n");
1727 return PMINFO_R_ERROR;
1731 /*If API is called multiple times for same property, we should override the previous values.
1732 Last value set will be used for filtering.*/
1733 link = g_slist_find_custom(filter->list, (gconstpointer)node, __compare_func);
1735 filter->list = g_slist_delete_link(filter->list, link);
1736 filter->list = g_slist_append(filter->list, (gpointer)node);
1741 API int pkgmgrinfo_pkginfo_filter_add_bool(pkgmgrinfo_pkginfo_filter_h handle,
1742 const char *property, const bool value)
1747 pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x *)handle;
1748 pkgmgrinfo_node_x *node;
1750 retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1751 retvm_if(property == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1753 prop = _pminfo_pkginfo_convert_to_prop_bool(property);
1754 if (prop < E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_BOOL ||
1755 prop > E_PMINFO_PKGINFO_PROP_PACKAGE_MAX_BOOL) {
1756 _LOGE("Invalid Boolean Property\n");
1757 return PMINFO_R_EINVAL;
1759 node = (pkgmgrinfo_node_x *)calloc(1, sizeof(pkgmgrinfo_node_x));
1761 _LOGE("Out of Memory!!!\n");
1762 return PMINFO_R_ERROR;
1765 val = strndup("('true','True')", 15);
1767 val = strndup("('false','False')", 17);
1769 _LOGE("Out of Memory\n");
1771 return PMINFO_R_ERROR;
1775 /*If API is called multiple times for same property, we should override the previous values.
1776 Last value set will be used for filtering.*/
1777 link = g_slist_find_custom(filter->list, (gconstpointer)node, __compare_func);
1779 filter->list = g_slist_delete_link(filter->list, link);
1780 filter->list = g_slist_append(filter->list, (gpointer)node);
1785 API int pkgmgrinfo_pkginfo_filter_add_string(pkgmgrinfo_pkginfo_filter_h handle,
1786 const char *property, const char *value)
1791 pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x *)handle;
1792 pkgmgrinfo_node_x *node;
1794 retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1795 retvm_if(property == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1796 retvm_if(value == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1798 prop = _pminfo_pkginfo_convert_to_prop_str(property);
1799 if (prop < E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_STR ||
1800 prop > E_PMINFO_PKGINFO_PROP_PACKAGE_MAX_STR) {
1801 _LOGE("Invalid String Property\n");
1802 return PMINFO_R_EINVAL;
1804 node = (pkgmgrinfo_node_x *)calloc(1, sizeof(pkgmgrinfo_node_x));
1806 _LOGE("Out of Memory!!!\n");
1807 return PMINFO_R_ERROR;
1809 if (strcmp(value, PMINFO_PKGINFO_INSTALL_LOCATION_AUTO) == 0)
1810 val = strndup("auto", PKG_STRING_LEN_MAX - 1);
1811 else if (strcmp(value, PMINFO_PKGINFO_INSTALL_LOCATION_INTERNAL) == 0)
1812 val = strndup("internal-only", PKG_STRING_LEN_MAX - 1);
1813 else if (strcmp(value, PMINFO_PKGINFO_INSTALL_LOCATION_EXTERNAL) == 0)
1814 val = strndup("prefer-external", PKG_STRING_LEN_MAX - 1);
1815 else if (strcmp(value, "installed_internal") == 0)
1816 val = strndup("installed_internal", PKG_STRING_LEN_MAX - 1);
1817 else if (strcmp(value, "installed_external") == 0)
1818 val = strndup("installed_external", PKG_STRING_LEN_MAX - 1);
1820 val = strndup(value, PKG_STRING_LEN_MAX - 1);
1822 _LOGE("Out of Memory\n");
1824 return PMINFO_R_ERROR;
1828 /*If API is called multiple times for same property, we should override the previous values.
1829 Last value set will be used for filtering.*/
1830 link = g_slist_find_custom(filter->list, (gconstpointer)node, __compare_func);
1832 filter->list = g_slist_delete_link(filter->list, link);
1833 filter->list = g_slist_append(filter->list, (gpointer)node);
1838 API int pkgmgrinfo_pkginfo_usr_filter_count(pkgmgrinfo_pkginfo_filter_h handle, int *count, uid_t uid)
1843 if (handle == NULL || count == NULL) {
1844 _LOGE("invalid parameter");
1845 return PMINFO_R_EINVAL;
1848 ret = _pkginfo_get_filtered_list((pkgmgrinfo_filter_x *)handle, uid, &list);
1849 if (ret != PMINFO_R_OK)
1850 return PMINFO_R_ERROR;
1852 *count = g_list_length(list);
1854 g_list_free_full(list, free);
1859 API int pkgmgrinfo_pkginfo_filter_count(pkgmgrinfo_pkginfo_filter_h handle, int *count)
1861 return pkgmgrinfo_pkginfo_usr_filter_count(handle, count, GLOBAL_USER);
1864 API int pkgmgrinfo_pkginfo_usr_filter_foreach_pkginfo(
1865 pkgmgrinfo_pkginfo_filter_h handle,
1866 pkgmgrinfo_pkg_list_cb pkg_cb, void *user_data, uid_t uid)
1868 if (handle == NULL || pkg_cb == NULL) {
1869 LOGE("invalid parameter");
1870 return PMINFO_R_EINVAL;
1873 return _pkginfo_get_filtered_foreach_pkginfo(handle, pkg_cb, user_data,
1877 API int pkgmgrinfo_pkginfo_filter_foreach_pkginfo(pkgmgrinfo_pkginfo_filter_h handle,
1878 pkgmgrinfo_pkg_list_cb pkg_cb, void *user_data)
1880 return pkgmgrinfo_pkginfo_usr_filter_foreach_pkginfo(handle, pkg_cb, user_data, GLOBAL_USER);
1883 API int pkgmgrinfo_pkginfo_foreach_privilege(pkgmgrinfo_pkginfo_h handle,
1884 pkgmgrinfo_pkg_privilege_list_cb privilege_func, void *user_data)
1886 retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL");
1887 retvm_if(privilege_func == NULL, PMINFO_R_EINVAL, "Callback function is NULL");
1889 const char *privilege;
1891 pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1893 if (info->pkg_info == NULL)
1894 return PMINFO_R_ERROR;
1896 for (tmp = info->pkg_info->privileges; tmp; tmp = tmp->next) {
1897 privilege = (const char *)tmp->data;
1898 if (privilege == NULL)
1900 ret = privilege_func(privilege, user_data);
1907 API int pkgmgrinfo_create_pkgusrdbinfo(const char *pkgid, uid_t uid, pkgmgrinfo_pkgdbinfo_h *handle)
1909 retvm_if(!pkgid, PMINFO_R_EINVAL, "pkgid is NULL");
1910 retvm_if(!handle, PMINFO_R_EINVAL, "Argument supplied is NULL");
1912 char *manifest = NULL;
1913 manifest_x *mfx = NULL;
1915 manifest = pkgmgr_parser_get_usr_manifest_file(pkgid, uid);
1916 retvm_if(manifest == NULL, PMINFO_R_EINVAL, "pkg[%s] dont have manifest file", pkgid);
1918 mfx = pkgmgr_parser_usr_process_manifest_xml(manifest, uid);
1923 retvm_if(mfx == NULL, PMINFO_R_EINVAL, "pkg[%s] parsing fail", pkgid);
1925 *handle = (void *)mfx;
1930 API int pkgmgrinfo_create_pkgdbinfo(const char *pkgid, pkgmgrinfo_pkgdbinfo_h *handle)
1932 retvm_if(!pkgid, PMINFO_R_EINVAL, "pkgid is NULL");
1933 retvm_if(!handle, PMINFO_R_EINVAL, "Argument supplied is NULL");
1935 char *manifest = NULL;
1936 manifest_x *mfx = NULL;
1938 manifest = pkgmgr_parser_get_manifest_file(pkgid);
1939 retvm_if(manifest == NULL, PMINFO_R_EINVAL, "pkg[%s] dont have manifest file", pkgid);
1941 mfx = pkgmgr_parser_process_manifest_xml(manifest);
1946 retvm_if(mfx == NULL, PMINFO_R_EINVAL, "pkg[%s] parsing fail", pkgid);
1948 *handle = (void *)mfx;
1953 API int pkgmgrinfo_set_type_to_pkgdbinfo(pkgmgrinfo_pkgdbinfo_h handle, const char *type)
1956 manifest_x *mfx = (manifest_x *)handle;
1958 retvm_if(!type, PMINFO_R_EINVAL, "Argument supplied is NULL");
1959 retvm_if(!handle, PMINFO_R_EINVAL, "Argument supplied is NULL");
1962 retvm_if(len > PKG_TYPE_STRING_LEN_MAX, PMINFO_R_EINVAL, "pkg type length exceeds the max limit");
1965 free((void *)mfx->type);
1967 mfx->type = strndup(type, PKG_TYPE_STRING_LEN_MAX);
1972 API int pkgmgrinfo_set_version_to_pkgdbinfo(pkgmgrinfo_pkgdbinfo_h handle, const char *version)
1975 manifest_x *mfx = (manifest_x *)handle;
1977 retvm_if(!version, PMINFO_R_EINVAL, "Argument supplied is NULL");
1978 retvm_if(!handle, PMINFO_R_EINVAL, "Argument supplied is NULL");
1980 len = strlen(version);
1981 retvm_if(len > PKG_TYPE_STRING_LEN_MAX, PMINFO_R_EINVAL, "pkg type length exceeds the max limit");
1984 free((void *)mfx->version);
1986 mfx->version = strndup(version, PKG_VERSION_STRING_LEN_MAX);
1990 API int pkgmgrinfo_set_install_location_to_pkgdbinfo(pkgmgrinfo_pkgdbinfo_h handle, INSTALL_LOCATION location)
1992 manifest_x *mfx = (manifest_x *)handle;
1994 retvm_if(!handle, PMINFO_R_EINVAL, "Argument supplied is NULL");
1995 retvm_if((location < 0) || (location > 1), PMINFO_R_EINVAL, "Argument supplied is NULL");
1997 if (mfx->installlocation)
1998 free((void *)mfx->installlocation);
2000 if (location == INSTALL_INTERNAL)
2001 mfx->installlocation = strdup("internal-only");
2002 else if (location == INSTALL_EXTERNAL)
2003 mfx->installlocation = strdup("prefer-external");
2008 API int pkgmgrinfo_set_size_to_pkgdbinfo(pkgmgrinfo_pkgdbinfo_h handle, const char *size)
2010 manifest_x *mfx = (manifest_x *)handle;
2012 retvm_if(!handle, PMINFO_R_EINVAL, "Argument supplied is NULL");
2013 retvm_if(size == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL");
2015 if (mfx->package_size)
2016 free((void *)mfx->package_size);
2018 mfx->package_size = strdup(size);
2023 API int pkgmgrinfo_set_label_to_pkgdbinfo(pkgmgrinfo_pkgdbinfo_h handle, const char *label_txt, const char *locale)
2026 manifest_x *mfx = (manifest_x *)handle;
2029 retvm_if(!handle, PMINFO_R_EINVAL, "Argument supplied is NULL");
2030 retvm_if(!label_txt, PMINFO_R_EINVAL, "Argument supplied is NULL");
2032 len = strlen(label_txt);
2033 retvm_if(len > PKG_TYPE_STRING_LEN_MAX, PMINFO_R_EINVAL, "pkg type length exceeds the max limit");
2035 label = calloc(1, sizeof(label_x));
2036 retvm_if(label == NULL, PMINFO_R_EINVAL, "Malloc Failed");
2039 label->lang = strdup(locale);
2041 label->lang = strdup(DEFAULT_LOCALE);
2042 label->text = strdup(label_txt);
2043 mfx->label = g_list_append(mfx->label, label);
2048 API int pkgmgrinfo_set_icon_to_pkgdbinfo(pkgmgrinfo_pkgdbinfo_h handle, const char *icon_txt, const char *locale)
2051 manifest_x *mfx = (manifest_x *)handle;
2054 retvm_if(!handle, PMINFO_R_EINVAL, "Argument supplied is NULL");
2055 retvm_if(!icon_txt, PMINFO_R_EINVAL, "Argument supplied is NULL");
2057 len = strlen(icon_txt);
2058 retvm_if(len > PKG_TYPE_STRING_LEN_MAX, PMINFO_R_EINVAL, "pkg type length exceeds the max limit");
2060 icon = calloc(1, sizeof(icon_x));
2061 retvm_if(icon == NULL, PMINFO_R_EINVAL, "Malloc Failed");
2064 icon->lang = strdup(locale);
2066 icon->lang = strdup(DEFAULT_LOCALE);
2067 icon->text = strdup(icon_txt);
2068 mfx->icon = g_list_append(mfx->icon, icon);
2073 API int pkgmgrinfo_set_description_to_pkgdbinfo(pkgmgrinfo_pkgdbinfo_h handle, const char *desc_txt, const char *locale)
2075 int len = strlen(desc_txt);
2076 manifest_x *mfx = (manifest_x *)handle;
2077 description_x *description;
2079 retvm_if(!handle, PMINFO_R_EINVAL, "Argument supplied is NULL");
2080 retvm_if(!desc_txt, PMINFO_R_EINVAL, "Argument supplied is NULL");
2082 len = strlen(desc_txt);
2083 retvm_if(len > PKG_TYPE_STRING_LEN_MAX, PMINFO_R_EINVAL, "pkg type length exceeds the max limit");
2085 description = calloc(1, sizeof(description_x));
2086 retvm_if(description == NULL, PMINFO_R_EINVAL, "Malloc Failed");
2089 description->lang = strdup(locale);
2091 description->lang = strdup(DEFAULT_LOCALE);
2092 description->text = strdup(desc_txt);
2093 mfx->description = g_list_append(mfx->description, description);
2098 API int pkgmgrinfo_set_author_to_pkgdbinfo(pkgmgrinfo_pkgdbinfo_h handle, const char *author_name,
2099 const char *author_email, const char *author_href, const char *locale)
2101 manifest_x *mfx = (manifest_x *)handle;
2104 retvm_if(!handle, PMINFO_R_EINVAL, "Argument supplied is NULL");
2106 author = calloc(1, sizeof(author_x));
2107 retvm_if(author == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL");
2110 author->text = strdup(author_name);
2112 author->email = strdup(author_email);
2114 author->href = strdup(author_href);
2116 author->lang = strdup(locale);
2118 author->lang = strdup(DEFAULT_LOCALE);
2119 mfx->author = g_list_append(mfx->author, author);
2123 API int pkgmgrinfo_set_removable_to_pkgdbinfo(pkgmgrinfo_pkgdbinfo_h handle, int removable)
2125 manifest_x *mfx = (manifest_x *)handle;
2127 retvm_if(!handle, PMINFO_R_EINVAL, "Argument supplied is NULL");
2128 retvm_if((removable < 0) || (removable > 1), PMINFO_R_EINVAL, "Argument supplied is NULL");
2131 free((void *)mfx->removable);
2134 mfx->removable = strdup("false");
2135 else if (removable == 1)
2136 mfx->removable = strdup("true");
2141 API int pkgmgrinfo_set_preload_to_pkgdbinfo(pkgmgrinfo_pkgdbinfo_h handle, int preload)
2143 manifest_x *mfx = (manifest_x *)handle;
2145 retvm_if(!handle, PMINFO_R_EINVAL, "Argument supplied is NULL");
2146 retvm_if((preload < 0) || (preload > 1), PMINFO_R_EINVAL, "Argument supplied is NULL");
2149 free((void *)mfx->preload);
2152 mfx->preload = strdup("false");
2153 else if (preload == 1)
2154 mfx->preload = strdup("true");
2159 API int pkgmgrinfo_set_installed_storage_to_pkgdbinfo(pkgmgrinfo_pkgdbinfo_h handle, INSTALL_LOCATION location)
2161 manifest_x *mfx = (manifest_x *)handle;
2163 retvm_if(!handle, PMINFO_R_EINVAL, "Argument supplied is NULL");
2164 retvm_if((location < 0) || (location > 1), PMINFO_R_EINVAL, "Argument supplied is NULL");
2166 if (mfx->installed_storage)
2167 free((void *)mfx->installed_storage);
2169 if (location == INSTALL_INTERNAL)
2170 mfx->installed_storage = strdup("installed_internal");
2171 else if (location == INSTALL_EXTERNAL)
2172 mfx->installed_storage = strdup("installed_external");
2177 API int pkgmgrinfo_save_pkgdbinfo(pkgmgrinfo_pkgdbinfo_h handle)
2180 manifest_x *mfx = (manifest_x *)handle;
2181 mfx = (manifest_x *)handle;
2183 retvm_if(!handle, PMINFO_R_EINVAL, "Argument supplied is NULL");
2185 ret = pkgmgr_parser_update_manifest_info_in_db(mfx);
2187 _LOGE("Successfully stored info in DB\n");
2190 _LOGE("Failed to store info in DB\n");
2191 return PMINFO_R_ERROR;
2195 API int pkgmgrinfo_save_pkgusrdbinfo(pkgmgrinfo_pkgdbinfo_h handle, uid_t uid)
2198 manifest_x *mfx = (manifest_x *)handle;
2200 retvm_if(!handle, PMINFO_R_EINVAL, "Argument supplied is NULL");
2202 ret = pkgmgr_parser_update_manifest_info_in_usr_db(mfx, uid);
2204 _LOGE("Successfully stored info in DB\n");
2207 _LOGE("Failed to store info in DB\n");
2208 return PMINFO_R_ERROR;
2212 API int pkgmgrinfo_destroy_pkgdbinfo(pkgmgrinfo_pkgdbinfo_h handle)
2214 manifest_x *mfx = (manifest_x *)handle;
2216 retvm_if(!handle, PMINFO_R_EINVAL, "Argument supplied is NULL");
2218 pkgmgrinfo_basic_free_package(mfx);