From: jk7744.park Date: Tue, 8 Sep 2015 13:15:51 +0000 (+0900) Subject: tizen 2.3.1 release X-Git-Tag: submit/tizen_2.3.1/20150915.080320^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d3c08281f58b97f127f0f126b07c0a25a7144f3d;p=framework%2Fappfw%2Fpkgmgr-info.git tizen 2.3.1 release --- diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100755 index 0000000..fbc53a7 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,74 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +#SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true) + +PROJECT(pkgmgr-info C) + +SET(VERSION 0.0.17) +SET(VERSION_MAJOR 0) + +SET(PREFIX ${CMAKE_INSTALL_PREFIX}) +SET(EXEC_PREFIX "\${prefix}") +SET(INCLUDEDIR "\${prefix}/include") + +set(CMAKE_SKIP_BUILD_RPATH true) + +### Local include directories +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/src ${CMAKE_SOURCE_DIR}/parser) + +### Required packages +INCLUDE(FindPkgConfig) +pkg_check_modules(pkgs REQUIRED openssl glib-2.0 dlog vconf sqlite3 db-util libxml-2.0 dbus-1 dbus-glib-1 journal) + +FOREACH(flag ${pkgs_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + + +pkg_check_modules(libpkgs REQUIRED openssl glib-2.0 dlog vconf sqlite3 db-util libxml-2.0 dbus-1 dbus-glib-1 journal) + +FOREACH(flag ${libpkgs_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") + +## About debug +SET(debug_type "-DPM_CONSOLE_USE") # for debug - use console window + +## Additional flag +SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fvisibility=hidden") +SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -g -Wall") +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") + +################## ## build comm libraries +add_subdirectory(parser) + +## build pkgmgr-info library +add_library(pkgmgr-info SHARED src/pkgmgrinfo_client.c src/pkgmgrinfo_db.c src/pkgmgrinfo_certinfo.c + src/pkgmgrinfo_appinfo.c src/pkgmgrinfo_pkginfo.c + src/pkgmgrinfo_private.c + src/pkgmgrinfo_basic.c + src/pkgmgrinfo_feature.c + ) + + +SET_TARGET_PROPERTIES(pkgmgr-info PROPERTIES SOVERSION ${VERSION_MAJOR}) +SET_TARGET_PROPERTIES(pkgmgr-info PROPERTIES VERSION ${VERSION}) +TARGET_LINK_LIBRARIES(pkgmgr-info pkgmgr_parser ${libpkgs_LDFLAGS}) + +CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/pkgmgr-info.pc.in ${CMAKE_BINARY_DIR}/pkgmgr-info.pc @ONLY) +configure_file(parser_path.conf.in parser_path.conf @ONLY) +configure_file(pkgmgr-info.manifest.in pkgmgr-info.manifest @ONLY) +configure_file(pkgmgr-parser.manifest.in pkgmgr-parser.manifest @ONLY) +configure_file(dump_pkgmgr.sh.in dump_pkgmgr.sh @ONLY) + +INSTALL(TARGETS pkgmgr-info DESTINATION ${LIB_INSTALL_DIR} COMPONENT RuntimeLibraries) +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/pkgmgr-info.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/pkgmgr-info.h DESTINATION include) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/pkgmgrinfo_basic.h DESTINATION include) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/pkgmgrinfo_feature.h DESTINATION include) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/pkgmgrinfo_type.h DESTINATION include) +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/parser_path.conf DESTINATION ${PREFIX}/etc/package-manager/) +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/dump_pkgmgr.sh DESTINATION /opt/etc/dump.d/module.d/) + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..9c13a9b --- /dev/null +++ b/LICENSE @@ -0,0 +1,204 @@ +Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/debian/changelog b/debian/changelog new file mode 100755 index 0000000..ef8ebf6 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,8 @@ +pkgmgr-info (0.2.1) unstable; urgency=low + + * Initial release + * Git: slp/pkgs/a/pkgmgr-info + * Tag: pkgmgr-info_0.2.1 + + -- Jaeho Lee Thu, 24 May 2012 12:04:51 +0530 + diff --git a/debian/compat b/debian/compat new file mode 100755 index 0000000..7ed6ff8 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +5 diff --git a/debian/control b/debian/control new file mode 100755 index 0000000..60bd677 --- /dev/null +++ b/debian/control @@ -0,0 +1,27 @@ +Source: pkgmgr-info +Section: devel +Priority: extra +Maintainer: Garima Shrivastava , Jaeho Lee +Build-Depends: debhelper (>= 5),libssl-dev, libslp-setting-dev, libslp-db-util-dev +Standards-Version: 3.7.2 + +Package: pkgmgr-info +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: + +Package: pkgmgr-info-dev +Architecture: any +Depends: app2sd (= ${Source-Version}) +Description: App2sd dev package + +Package: pkgmgr-info-doc +Architecture: all +Description: + +Package: pkgmgr-info-dbg +Section: debug +Architecture: any +Depends: pkgmgr-info (= ${Source-Version}) +Description: pkgmgr-info dbg package + diff --git a/debian/copyright b/debian/copyright new file mode 100755 index 0000000..37b94ac --- /dev/null +++ b/debian/copyright @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2012 - 2013 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ diff --git a/debian/dirs b/debian/dirs new file mode 100755 index 0000000..ca882bb --- /dev/null +++ b/debian/dirs @@ -0,0 +1,2 @@ +usr/bin +usr/sbin diff --git a/debian/pkgmgr-info-dev.install.in b/debian/pkgmgr-info-dev.install.in new file mode 100755 index 0000000..7920b49 --- /dev/null +++ b/debian/pkgmgr-info-dev.install.in @@ -0,0 +1,2 @@ +@PREFIX@/include/pkgmgr-info.h +@PREFIX@/lib/pkgconfig/*.pc diff --git a/debian/pkgmgr-info.install.in b/debian/pkgmgr-info.install.in new file mode 100755 index 0000000..bf766f0 --- /dev/null +++ b/debian/pkgmgr-info.install.in @@ -0,0 +1 @@ +@PREFIX@/lib/*.so* diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..f902937 --- /dev/null +++ b/debian/rules @@ -0,0 +1,126 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# Sample debian/rules that uses debhelper. +# This file was originally written by Joey Hess and Craig Small. +# As a special exception, when this file is copied by dh-make into a +# dh-make output file, you may use that output file without restriction. +# This special exception was added by Craig Small in version 0.37 of dh-make. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + + +# These are used for cross-compiling and for saving the configure script +# from having to guess our platform (since we know it already) +DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) +DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) +DEB_HOST_ARCH ?= $(shell dpkg-architecture -qDEB_HOST_ARCH) +DEB_HOST_ARCH_OS ?= $(shell dpkg-architecture -qDEB_HOST_GNU_OS) + +CFLAGS ?= -Wall -g +LDFLAGS ?= +PREFIX ?= /usr +DATADIR ?= /opt + +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 +else + CFLAGS += -O2 +endif + +# architecture is not arm +ifneq (, $(findstring arm, $(DEB_HOST_ARCH))) + # do something here +else + # do something here for arm +endif + +CFLAGS += -fvisibility=hidden -fPIC +LDFLAGS += -Wl,--rpath=$(PREFIX)/lib -Wl,--as-needed + +CMAKE_TMP_DIR = $(CURDIR)/cmake_tmp + +config.status: + +configure: configure-stamp + +configure-stamp: + dh_testdir + mkdir -p $(CMAKE_TMP_DIR); + export LD_LIBRARY_PATH=$(LD_LIBRARY_PATH):$(CMAKE_TMP_DIR) && cd $(CMAKE_TMP_DIR); CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" LDFLAGS="$(LDFLAGS)" cmake .. -DCMAKE_INSTALL_PREFIX=$(PREFIX) + touch configure-stamp + +build: build-stamp + +build-stamp: configure-stamp + dh_testdir + # Add here commands to compile the package. + cd $(CMAKE_TMP_DIR) && $(MAKE) all + + for f in `find $(CURDIR)/debian/ -name "*.in"`; do \ + cat $$f > $${f%.in}; \ + sed -i -e "s#@PREFIX@#$(PREFIX)#g" $${f%.in}; \ + sed -i -e "s#@DATADIR@#$(DATADIR)#g" $${f%.in}; \ + done + + touch $@ + +clean: + dh_testdir + dh_testroot + rm -f *-stamp + + rm -rf $(CMAKE_TMP_DIR) + + for f in `find $(CURDIR)/debian/ -name "*.in"`; do \ + rm -f $${f%.in}; \ + done + + dh_clean + +install: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + # Add here commands to install the package into debian/ncurses. + cd $(CMAKE_TMP_DIR) && $(MAKE) DESTDIR=$(CURDIR)/debian/tmp install + +# Build architecture-independent files here. +binary-indep: build install +# We have nothing to do by default. + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir + dh_testroot + dh_installchangelogs +# dh_installdocs + dh_installexamples + dh_install --list-missing --sourcedir=debian/tmp +# dh_installmenu +# dh_installdebconf +# dh_installlogrotate +# dh_installemacsen +# dh_installpam +# dh_installmime +# dh_python +# dh_installinit +# dh_installcron +# dh_installinfo + dh_installman + dh_link + dh_strip --dbg-package=app2sd-dbg + dh_compress + dh_fixperms +# dh_perl + dh_makeshlibs + dh_installdeb + dh_shlibdeps + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install diff --git a/dump_pkgmgr.sh.in b/dump_pkgmgr.sh.in new file mode 100644 index 0000000..e63f879 --- /dev/null +++ b/dump_pkgmgr.sh.in @@ -0,0 +1,10 @@ +#!/bin/sh +#-------------------------------------- +# dump pkgmgr db +#-------------------------------------- + +PKGMGR_DB_DEBUG=$1/pkgmgr +mkdir -p ${PKGMGR_DB_DEBUG} +/bin/cp /opt/dbspace/.pkgmgr_cert.db* ${PKGMGR_DB_DEBUG} +/bin/cp /opt/dbspace/.pkgmgr_parser.db* ${PKGMGR_DB_DEBUG} +/bin/cp -r /opt/usr/data/pkgmgr/ ${PKGMGR_DB_DEBUG} diff --git a/images/SLP_pkgmgr_info.png b/images/SLP_pkgmgr_info.png new file mode 100755 index 0000000..604c6e3 Binary files /dev/null and b/images/SLP_pkgmgr_info.png differ diff --git a/images/SLP_pkgmgr_parser.png b/images/SLP_pkgmgr_parser.png new file mode 100755 index 0000000..91ae136 Binary files /dev/null and b/images/SLP_pkgmgr_parser.png differ diff --git a/include/SLP_pkgmgr_info_PG.h b/include/SLP_pkgmgr_info_PG.h new file mode 100755 index 0000000..92ff532 --- /dev/null +++ b/include/SLP_pkgmgr_info_PG.h @@ -0,0 +1,301 @@ +/* + * pkgmgr-info + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +/** + + * + * @ingroup SLP_PG + * @defgroup PackageManagerInfoGuide + + +@par Package Manager Information Library Programming Guide + +

Introduction

+

Purpose of this document

+The purpose of this document is to describe how applications can use Package Manager Information APIs.\n +This document gives only programming guidelines to application developers. + +

Scope

+The scope of this document is limited to Samsung platform Package Manager Info API usage. + +

Architecture

+

Architecture overview

+Package Manager Information Library is responsible for getting/setting manifest file information from/to manifest DB.\n + +The library provides APIs to parse the package's manifest file\n +It also provides APIs to insert/update/delete this parsed data from manifest DB. + + +

Features

+Package Manager Info Library has the following features:\n + + - Get /Set Package Information in DB + - It provides API to get package manifest data from DB. + - It provides API to get package certificate data from DB. + - It provides API to set package manifest data in DB. + - It provides API to set package certificate data in DB. + +@image html SLP_pkgmgr_info.png "High-Level Architure depicting get/set operation" + + - Filter Package/Application Information + - It provides API to filter package information query result. + - It provides API to filter application information query result. + + - Manifest Parser + - It provides API to parse package manifest file. + - It provides API to insert/update/delete manifest data in DB. + +@image html SLP_pkgmgr_parser.png "High-Level Architure depicting manifest parsing" + +

Package Manager API descriptions

+ SEE API manual + +

Package Manager Features with sample code

+

Get /Set Package Information in DB

+ +Client application +- Get package version from manifest DB + +@code +#include + +static int get_pkg_version(const char *pkgid) +{ + int ret = 0; + char *version = NULL; + pkgmgrinfo_pkginfo_h handle; + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_get_version(handle, &version); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + printf("pkg version: %s\n", version); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return 0; +} +@endcode + +- Get package author root certificate from manifest DB + +@code +static int get_cert_info(const char *pkgid) +{ + int ret = 0; + pkgmgrinfo_certinfo_h handle; + char *auth_cert = NULL; + ret = pkgmgrinfo_pkginfo_create_certinfo(&handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_load_certinfo(pkgid, handle); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_certinfo(handle); + return -1; + } + ret = pkgmgrinfo_pkginfo_get_cert_value(handle, PMINFO_AUTHOR_ROOT_CERT, &auth_cert); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_certinfo(handle); + return -1; + } + printf("Author root certificate: %s\n", auth_root); + pkgmgrinfo_pkginfo_destroy_certinfo(handle); + return 0; +} +@endcode + +- Set package version in manifest DB + +@code +#include + +static int set_pkg_version_in_db(const char *pkgid) +{ + int ret = 0; + pkgmgrinfo_pkgdbinfo_h handle; + ret = pkgmgrinfo_create_pkgdbinfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_set_version_to_pkgdbinfo(handle, "0.0.1"); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_destroy_pkgdbinfo(handle); + return -1; + } + ret = pkgmgrinfo_save_pkgdbinfo(handle); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_destroy_pkgdbinfo(handle); + return -1; + } + pkgmgrinfo_destroy_pkgdbinfo(handle); + return 0; +} +@endcode + +- Set package author root certificate in manifest DB + +@code +static int set_cert_in_db(const char *pkgid) +{ + int ret = 0; + pkgmgrinfo_instcertinfo_h handle; + ret = pkgmgrinfo_create_certinfo_set_handle(&handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_set_cert_value(handle, PMINFO_SET_AUTHOR_ROOT_CERT, "author root certificate"); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_destroy_certinfo_set_handle(handle); + return -1; + } + ret = pkgmgrinfo_save_pkgdbinfo(pkgid, handle); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_destroy_certinfo_set_handle(handle); + return -1; + } + pkgmgrinfo_destroy_certinfo_set_handle(handle); + return 0; +} +@endcode + + +

Filter Package/Application Information

+ +- Filter number of installed rpm packages out of total number of packages installed. + +@code +#include +int pkg_list_cb(pkgmgrinfo_pkginfo_h handle, void *user_data) +{ + char *pkgid = NULL; + pkgmgrinfo_pkginfo_get_pkgname(handle, &pkgid); + printf("pkg id : %s\n", pkgid); + return 0; +} + +static int get_rpm_pkg_list() +{ + int ret = 0; + pkgmgrinfo_pkginfo_filter_h handle; + ret = pkgmgrinfo_pkginfo_filter_create(&handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_filter_add_string(handle, PMINFO_PKGINFO_PROP_PACKAGE_TYPE, "rpm"); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_filter_destroy(handle); + return -1; + } + ret = pkgmgrinfo_pkginfo_filter_foreach_pkginfo(handle, pkg_list_cb, NULL); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_filter_destroy(handle); + return -1; + } + pkgmgrinfo_pkginfo_filter_destroy(handle); + return 0; +} +@endcode + +- Filter number of installed applications which are of type "capp". + +@code +#include + +static int get_capp_count() +{ + int ret = 0; + int count = 0; + pkgmgrinfo_appinfo_filter_h handle; + ret = pkgmgrinfo_appinfo_filter_create(&handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_filter_add_string(handle, PMINFO_APPINFO_PROP_APP_TYPE, "capp"); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_filter_destroy(handle); + return -1; + } + ret = pkgmgrinfo_appinfo_filter_count(handle, &count); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_filter_destroy(handle); + return -1; + } + printf("No of capp: %d\n", count); + pkgmgrinfo_appinfo_filter_destroy(handle); + return 0; +} +@endcode + +

Manifest Parser

+ +- Parse the package manifest file and insert the parsed data in manifest DB. + +@code +#include + +static int parse_manifest_file_for_installation(const char *manifest) +{ + int ret = 0; + ret = pkgmgr_parser_parse_manifest_for_installation(manifest, NULL); + if (ret) + return -1; + return 0; +} +@endcode + + +- Parse the package manifest file and update the manifest DB with the parsed data. + +@code +#include + +static int parse_manifest_file_for_upgrade(const char *manifest) +{ + int ret = 0; + ret = pkgmgr_parser_parse_manifest_for_upgrade(manifest, NULL); + if (ret) + return -1; + return 0; +} +@endcode + +- Parse the package manifest file and delete the parsed data from manifest DB. + +@code +#include + +static int parse_manifest_file_for_uninstallation(const char *manifest) +{ + int ret = 0; + ret = pkgmgr_parser_parse_manifest_for_uninstallation(manifest, NULL); + if (ret) + return -1; + return 0; +} +@endcode + + +*/ + +/** +@} +*/ + + diff --git a/include/pkgmgr-info.h b/include/pkgmgr-info.h new file mode 100755 index 0000000..08f8700 --- /dev/null +++ b/include/pkgmgr-info.h @@ -0,0 +1,5682 @@ +/* + * pkgmgr-info + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + + + + +/** + * @file pkgmgr-info.h + * @author Sewook Park + * @author Shobhit Srivastava + * @version 0.1 + * @brief This file declares API of pkgmgr-info library + * + * @addtogroup APPLICATION_FRAMEWORK + * @{ + * + * @defgroup PackageManagerInfo + * @section Header Header file to include: + * @code + * #include + * @endcode + * + * @} + */ + +#ifndef __PKG_INFO_H__ +#define __PKG_INFO_H__ + +#include +#include + +#include "pkgmgrinfo_type.h" +#include "pkgmgrinfo_feature.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @mainpage + * + * This is package information library + * + * Package Information Library is used to get package related information.\n + * It uses the package manifest information database to get any package related information\n + * It also provides API to set information in the package info database\n + * + */ + +/** + * @file pkgmgr-info.h + * @brief Package Information Library Header File + * + * Generated by Sewook Park + */ + + +/** + * @brief Value to be used when filtering based on install location + */ +#define PMINFO_PKGINFO_INSTALL_LOCATION_AUTO "LOCATION_AUTO" + +/** + * @brief Value to be used when filtering based on install location + */ +#define PMINFO_PKGINFO_INSTALL_LOCATION_INTERNAL "LOCATION_INTERNAL" + +/** + * @brief Value to be used when filtering based on install location + */ +#define PMINFO_PKGINFO_INSTALL_LOCATION_EXTERNAL "LOCATION_EXTERNAL" + + /** String property for filtering based on package info*/ +#define PMINFO_PKGINFO_PROP_PACKAGE_ID "PMINFO_PKGINFO_PROP_PACKAGE_ID" + /** String property for filtering based on package info*/ +#define PMINFO_PKGINFO_PROP_PACKAGE_TYPE "PMINFO_PKGINFO_PROP_PACKAGE_TYPE" + /** String property for filtering based on package info*/ +#define PMINFO_PKGINFO_PROP_PACKAGE_VERSION "PMINFO_PKGINFO_PROP_PACKAGE_VERSION" + /** String property for filtering based on package info*/ +#define PMINFO_PKGINFO_PROP_PACKAGE_INSTALL_LOCATION "PMINFO_PKGINFO_PROP_PACKAGE_INSTALL_LOCATION" + /** String property for filtering based on package info*/ +#define PMINFO_PKGINFO_PROP_PACKAGE_INSTALLED_STORAGE "PMINFO_PKGINFO_PROP_PACKAGE_INSTALLED_STORAGE" + /** String property for filtering based on package info*/ +#define PMINFO_PKGINFO_PROP_PACKAGE_AUTHOR_NAME "PMINFO_PKGINFO_PROP_PACKAGE_AUTHOR_NAME" + /** String property for filtering based on package info*/ +#define PMINFO_PKGINFO_PROP_PACKAGE_AUTHOR_EMAIL "PMINFO_PKGINFO_PROP_PACKAGE_AUTHOR_EMAIL" + /** String property for filtering based on package info*/ +#define PMINFO_PKGINFO_PROP_PACKAGE_AUTHOR_HREF "PMINFO_PKGINFO_PROP_PACKAGE_AUTHOR_HREF" + /** String property for filtering based on package info*/ +#define PMINFO_PKGINFO_PROP_PACKAGE_STORECLIENT_ID "PMINFO_PKGINFO_PROP_PACKAGE_STORECLIENT_ID" + + /** Boolean property for filtering based on package info*/ +#define PMINFO_PKGINFO_PROP_PACKAGE_REMOVABLE "PMINFO_PKGINFO_PROP_PACKAGE_REMOVABLE" + /** Boolean property for filtering based on package info*/ +#define PMINFO_PKGINFO_PROP_PACKAGE_PRELOAD "PMINFO_PKGINFO_PROP_PACKAGE_PRELOAD" + /** Boolean property for filtering based on package info*/ +#define PMINFO_PKGINFO_PROP_PACKAGE_READONLY "PMINFO_PKGINFO_PROP_PACKAGE_READONLY" + /** Boolean property for filtering based on package info*/ +#define PMINFO_PKGINFO_PROP_PACKAGE_UPDATE "PMINFO_PKGINFO_PROP_PACKAGE_UPDATE" + /** Boolean property for filtering based on package info*/ +#define PMINFO_PKGINFO_PROP_PACKAGE_APPSETTING "PMINFO_PKGINFO_PROP_PACKAGE_APPSETTING" + /** Boolean property for filtering based on package info*/ +#define PMINFO_PKGINFO_PROP_PACKAGE_NODISPLAY_SETTING "PMINFO_PKGINFO_PROP_PACKAGE_NODISPLAY_SETTING" + /** Boolean property for filtering based on package info*/ +#define PMINFO_PKGINFO_PROP_PACKAGE_SUPPORT_DISABLE "PMINFO_PKGINFO_PROP_PACKAGE_SUPPORT_DISABLE" + /** Boolean property for filtering based on package info*/ +#define PMINFO_PKGINFO_PROP_PACKAGE_DISABLE "PMINFO_PKGINFO_PROP_PACKAGE_DISABLE" + /** Boolean property for filtering based on package info*/ +#define PMINFO_PKGINFO_PROP_PACKAGE_USE_RESET "PMINFO_PKGINFO_PROP_PACKAGE_USE_RESET" + + /** Integer property for filtering based on package info*/ +#define PMINFO_PKGINFO_PROP_PACKAGE_SIZE "PMINFO_PKGINFO_PROP_PACKAGE_SIZE" + /** Integer property for filtering based on package info*/ +#define PMINFO_PKGINFO_PROP_PACKAGE_SUPPORT_MODE "PMINFO_PKGINFO_PROP_PACKAGE_SUPPORT_MODE" + + /** String property for filtering based on app info*/ +#define PMINFO_APPINFO_PROP_APP_ID "PMINFO_APPINFO_PROP_APP_ID" + /** String property for filtering based on app info*/ +#define PMINFO_APPINFO_PROP_APP_COMPONENT "PMINFO_APPINFO_PROP_APP_COMPONENT" + /** String property for filtering based on app info*/ +#define PMINFO_APPINFO_PROP_APP_COMPONENT_TYPE "PMINFO_APPINFO_PROP_APP_COMPONENT_TYPE" + /** String property for filtering based on app info*/ +#define PMINFO_APPINFO_PROP_APP_EXEC "PMINFO_APPINFO_PROP_APP_EXEC" + /** String property for filtering based on app info*/ +#define PMINFO_APPINFO_PROP_APP_AMBIENT_SUPPORT "PMINFO_APPINFO_PROP_APP_AMBIENT_SUPPORT" + /** String property for filtering based on app info*/ +#define PMINFO_APPINFO_PROP_APP_ICON "PMINFO_APPINFO_PROP_APP_ICON" + /** String property for filtering based on app info*/ +#define PMINFO_APPINFO_PROP_APP_TYPE "PMINFO_APPINFO_PROP_APP_TYPE" + /** String property for filtering based on app info*/ +#define PMINFO_APPINFO_PROP_APP_OPERATION "PMINFO_APPINFO_PROP_APP_OPERATION" + /** String property for filtering based on app info*/ +#define PMINFO_APPINFO_PROP_APP_URI "PMINFO_APPINFO_PROP_APP_URI" + /** String property for filtering based on app info*/ +#define PMINFO_APPINFO_PROP_APP_MIME "PMINFO_APPINFO_PROP_APP_MIME" + /** String property for filtering based on app info*/ +#define PMINFO_APPINFO_PROP_APP_CATEGORY "PMINFO_APPINFO_PROP_APP_CATEGORY" + /** String property for filtering based on app info*/ +#define PMINFO_APPINFO_PROP_APP_HWACCELERATION "PMINFO_APPINFO_PROP_APP_HWACCELERATION" + /** String property for filtering based on app info*/ +#define PMINFO_APPINFO_PROP_APP_SCREENREADER "PMINFO_APPINFO_PROP_APP_SCREENREADER" + + /** Boolean property for filtering based on app info*/ +#define PMINFO_APPINFO_PROP_APP_NODISPLAY "PMINFO_APPINFO_PROP_APP_NODISPLAY" + /** Boolean property for filtering based on app info*/ +#define PMINFO_APPINFO_PROP_APP_MULTIPLE "PMINFO_APPINFO_PROP_APP_MULTIPLE" + /** Boolean property for filtering based on app info*/ +#define PMINFO_APPINFO_PROP_APP_ONBOOT "PMINFO_APPINFO_PROP_APP_ONBOOT" + /** Boolean property for filtering based on app info*/ +#define PMINFO_APPINFO_PROP_APP_AUTORESTART "PMINFO_APPINFO_PROP_APP_AUTORESTART" + /** Boolean property for filtering based on app info*/ +#define PMINFO_APPINFO_PROP_APP_TASKMANAGE "PMINFO_APPINFO_PROP_APP_TASKMANAGE" + /** Boolean property for filtering based on app info*/ +#define PMINFO_APPINFO_PROP_APP_LAUNCHCONDITION "PMINFO_APPINFO_PROP_APP_LAUNCHCONDITION" + /** Boolean property for filtering based on app info*/ +#define PMINFO_APPINFO_PROP_APP_SUPPORT_DISABLE "PMINFO_APPINFO_PROP_APP_SUPPORT_DISABLE" + /** Boolean property for filtering based on app info*/ +#define PMINFO_APPINFO_PROP_APP_DISABLE "PMINFO_APPINFO_PROP_APP_DISABLE" + /** Boolean property for filtering based on app info*/ +#define PMINFO_APPINFO_PROP_APP_REMOVABLE "PMINFO_APPINFO_PROP_APP_REMOVABLE" + + /** Integer property for filtering based on app info*/ +#define PMINFO_APPINFO_PROP_APP_SUPPORT_MODE "PMINFO_APPINFO_PROP_APP_SUPPORT_MODE" + + /** will be updated*/ + /** string property for filtering based on pkg info*/ +#define PMINFO_PKGINFO_PROP_RANGE_BASIC "PMINFO_PKGINFO_PROP_RANGE_BASIC" + +/** Integer property for mode*/ +#define PMINFO_MODE_PROP_ULTRA_POWER_SAVING 0x00000001 +#define PMINFO_MODE_PROP_COOL_DOWN 0x00000002 +#define PMINFO_MODE_PROP_SCREEN_READER 0x00000004 + + + +/** + * @fn int pkgmgrinfo_pkginfo_get_list(pkgmgrinfo_pkg_list_cb pkg_list_cb, void *user_data) + * @brief This API gets list of installed packages + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * @param[in] pkg_list_cb iteration function for list + * @param[in] user_data user data to be passed to callback function + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre None + * @post None + * @code +int pkg_list_cb(pkgmgrinfo_pkginfo_h handle, void *user_data) +{ + char *pkgid1 = NULL; + char *pkgid2 = NULL; + pkgid1 = (char *)user_data; + pkgmgrinfo_pkginfo_get_pkgid(handle, &pkgid2); + if (strcmp(pkgid1, pkgid2) == 0) { + return -1; + } else { + return 0; + } +} + +static int list_pkgs() +{ + int ret = 0; + char *name = "helloworld"; + ret = pkgmgrinfo_pkginfo_get_list(pkg_list_cb, (void *)name); + if (ret != PMINFO_R_OK) { + return -1; + } + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_get_list(pkgmgrinfo_pkg_list_cb pkg_list_cb, void *user_data); + +/** + * @fn int pkgmgrinfo_pkginfo_get_mounted_list(pkgmgrinfo_pkg_list_cb pkg_list_cb, void *user_data); + * @brief This API gets list of package which are installed in sd card when sd card is mounted + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * @param[in] pkg_list_cb iteration function for list + * @param[in] user_data user data to be passed to callback function + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre None + * @post None + * @code +int pkg_list_cb(pkgmgrinfo_pkginfo_h handle, void *user_data) +{ + char *pkgid2 = NULL; + + pkgmgrinfo_pkginfo_get_pkgid(handle, &pkgid2); + printf("appid: %s\n", pkgid2); + + return 0; +} + +static int mounted_list_pkgs() +{ + int ret = 0; + + ret = pkgmgrinfo_pkginfo_get_mounted_list(pkg_list_cb, NULL); + if (ret != PMINFO_R_OK) { + return -1; + } + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_get_mounted_list(pkgmgrinfo_pkg_list_cb pkg_list_cb, void *user_data); + +/** + * @fn int pkgmgrinfo_pkginfo_get_unmounted_list(pkgmgrinfo_pkg_list_cb pkg_list_cb, void *user_data); + * @brief This API gets list of package which are installed in sd card when sd card is unmounted + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * @param[in] pkg_list_cb iteration function for list + * @param[in] user_data user data to be passed to callback function + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre None + * @post None + * @code +int pkg_list_cb(pkgmgrinfo_pkginfo_h handle, void *user_data) +{ + char *pkgid2 = NULL; + + pkgmgrinfo_pkginfo_get_pkgid(handle, &pkgid2); + printf("appid: %s\n", pkgid2); + + return 0; +} + +static int unmounted_list_pkgs() +{ + int ret = 0; + + ret = pkgmgrinfo_pkginfo_get_unmounted_list(pkg_list_cb, NULL); + if (ret != PMINFO_R_OK) { + return -1; + } + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_get_unmounted_list(pkgmgrinfo_pkg_list_cb pkg_list_cb, void *user_data); + +/** + * @fn int pkgmgrinfo_pkginfo_get_unmounted_pkginfo(const char *pkgid, pkgmgrinfo_pkginfo_h *handle) + * @brief This API creates the package information handle from db + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] pkgid pointer to package ID + * @param[out] handle pointer to the package info handle. + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre None + * @post pkgmgrinfo_pkginfo_destroy_pkginfo() + * @see pkgmgrinfo_pkginfo_get_pkgid() + * @see pkgmgrinfo_pkginfo_is_removable() + * @code +static int get_pkg_type(const char *pkgid) +{ + int ret = 0; + char *type = NULL; + pkgmgrinfo_pkginfo_h handle; + ret = pkgmgrinfo_pkginfo_get_unmounted_pkginfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_get_type(handle, &type); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + printf("pkgtype: %s\n", type); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_get_unmounted_pkginfo(const char *pkgid, pkgmgrinfo_pkginfo_h *handle); + +/** + * @fn int pkgmgrinfo_pkginfo_get_pkginfo(const char *pkgid, pkgmgrinfo_pkginfo_h *handle) + * @brief This API creates the package information handle from db + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] pkgid pointer to package ID + * @param[out] handle pointer to the package info handle. + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre None + * @post pkgmgrinfo_pkginfo_destroy_pkginfo() + * @see pkgmgrinfo_pkginfo_get_pkgid() + * @see pkgmgrinfo_pkginfo_is_removable() + * @code +static int get_pkg_type(const char *pkgid) +{ + int ret = 0; + char *type = NULL; + pkgmgrinfo_pkginfo_h handle; + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_get_type(handle, &type); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + printf("pkgtype: %s\n", type); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_get_pkginfo(const char *pkgid, pkgmgrinfo_pkginfo_h *handle); + +/** + * @fn int pkgmgrinfo_pkginfo_get_pkgname(pkgmgrinfo_pkginfo_h handle, char **pkg_name) + * @brief This API gets the package name from the package ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to package info handle + * @param[out] pkg_name pointer to hold package name + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_get_pkginfo() + * @post pkgmgrinfo_pkginfo_destroy_pkginfo() + * @see pkgmgrinfo_pkginfo_get_type() + * @see pkgmgrinfo_pkginfo_is_removable() + * @code +static int get_pkg_name(const char *pkgid) +{ + int ret = 0; + char *pkgname = NULL; + pkgmgrinfo_pkginfo_h handle; + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_get_pkgname(handle, &pkgname); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + printf("pkgname: %s\n", pkgname); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_get_pkgname(pkgmgrinfo_pkginfo_h handle, char **pkg_name); + +/** + * @fn int pkgmgrinfo_pkginfo_get_pkgid(pkgmgrinfo_pkginfo_h handle, char **pkgid) + * @brief This API gets the package id from the package ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to package info handle + * @param[out] pkgid pointer to hold package id + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_get_pkginfo() + * @post pkgmgrinfo_pkginfo_destroy_pkginfo() + * @see pkgmgrinfo_pkginfo_get_type() + * @see pkgmgrinfo_pkginfo_is_removable() + * @code +static int get_pkgid(const char *pkgid) +{ + int ret = 0; + char *pkg_id = NULL; + pkgmgrinfo_pkginfo_h handle; + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_get_pkgid(handle, &pkg_id); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + printf("pkg id: %s\n", pkg_id); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_get_pkgid(pkgmgrinfo_pkginfo_h handle, char **pkgid); + +/** + * @fn int pkgmgrinfo_pkginfo_get_type(pkgmgrinfo_pkginfo_h handle, char **type) + * @brief This API gets the package type from the package ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to package info handle + * @param[out] type pointer to hold package type + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_get_pkginfo() + * @post pkgmgrinfo_pkginfo_destroy_pkginfo() + * @see pkgmgrinfo_pkginfo_get_pkgid() + * @see pkgmgrinfo_pkginfo_is_removable() + * @code +static int get_pkg_type(const char *pkgid) +{ + int ret = 0; + char *type = NULL; + pkgmgrinfo_pkginfo_h handle; + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_get_type(handle, &type); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + printf("pkgtype: %s\n", type); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_get_type(pkgmgrinfo_pkginfo_h handle, char **type); + +/** + * @fn int pkgmgrinfo_pkginfo_get_version(pkgmgrinfo_pkginfo_h handle, char **version) + * @brief This API gets the package version from the package ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to package info handle + * @param[out] version pointer to hold package version + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_get_pkginfo() + * @post pkgmgrinfo_pkginfo_destroy_pkginfo() + * @see pkgmgrinfo_pkginfo_get_pkgid() + * @see pkgmgrinfo_pkginfo_is_removable() + * @code +static int get_pkg_version(const char *pkgid) +{ + int ret = 0; + char *version = NULL; + pkgmgrinfo_pkginfo_h handle; + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_get_version(handle, &version); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + printf("pkg version: %s\n", version); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_get_version(pkgmgrinfo_pkginfo_h handle, char **version); + +/** + * @fn int pkgmgrinfo_pkginfo_get_install_location(pkgmgrinfo_pkginfo_h handle, pkgmgrinfo_install_location *location) + * @brief This API gets the package install location from the package ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to package info handle + * @param[out] location pointer to hold package install location + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_get_pkginfo() + * @post pkgmgrinfo_pkginfo_destroy_pkginfo() + * @see pkgmgrinfo_pkginfo_get_pkgid() + * @see pkgmgrinfo_pkginfo_is_removable() + * @code +static int get_pkg_install_location(const char *pkgid) +{ + int ret = 0; + pkgmgrinfo_install_location location; + pkgmgrinfo_pkginfo_h handle; + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_get_install_location(handle, &location); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + printf("pkg install location: %d\n", location); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_get_install_location(pkgmgrinfo_pkginfo_h handle, pkgmgrinfo_install_location *location); + +/** + * @fn int pkgmgrinfo_pkginfo_get_icon(pkgmgrinfo_pkginfo_h handle, char **icon) + * @brief This API gets the package icon from the package ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to package info handle + * @param[out] icon pointer to hold package icon + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_get_pkginfo() + * @post pkgmgrinfo_pkginfo_destroy_pkginfo() + * @see pkgmgrinfo_pkginfo_get_pkgid() + * @see pkgmgrinfo_pkginfo_is_removable() + * @code +static int get_pkg_icon(const char *pkgid) +{ + int ret = 0; + char *icon = NULL; + pkgmgrinfo_pkginfo_h handle; + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_get_icon(handle, &icon); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + printf("pkg icon: %s\n", icon); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_get_icon(pkgmgrinfo_pkginfo_h handle, char **icon); + +/** + * @fn int pkgmgrinfo_pkginfo_get_label(pkgmgrinfo_pkginfo_h handle, char **label) + * @brief This API gets the package label from the package ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to package info handle + * @param[out] label pointer to hold package label + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_get_pkginfo() + * @post pkgmgrinfo_pkginfo_destroy_pkginfo() + * @see pkgmgrinfo_pkginfo_get_pkgid() + * @see pkgmgrinfo_pkginfo_is_removable() + * @code +static int get_pkg_label(const char *pkgid) +{ + int ret = 0; + char *label = NULL; + pkgmgrinfo_pkginfo_h handle; + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_get_label(handle, &label); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + printf("pkg label: %s\n", label); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_get_label(pkgmgrinfo_pkginfo_h handle, char **label); + +/** + * @fn int pkgmgrinfo_pkginfo_get_description(pkgmgrinfo_pkginfo_h handle, char **description) + * @brief This API gets the package description from the package ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to package info handle + * @param[out] description pointer to hold package description + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_get_pkginfo() + * @post pkgmgrinfo_pkginfo_destroy_pkginfo() + * @see pkgmgrinfo_pkginfo_get_pkgid() + * @see pkgmgrinfo_pkginfo_is_removable() + * @code +static int get_pkg_description(const char *pkgid) +{ + int ret = 0; + char *description = NULL; + pkgmgrinfo_pkginfo_h handle; + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_get_description(handle, &description); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + printf("pkg description: %s\n", description); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_get_description(pkgmgrinfo_pkginfo_h handle, char **description); + +/** + * @fn int pkgmgrinfo_pkginfo_get_author_name(pkgmgrinfo_pkginfo_h handle, char **author_name) + * @brief This API gets the package's author name from the package ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to package info handle + * @param[out] author_name pointer to hold package author name + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_get_pkginfo() + * @post pkgmgrinfo_pkginfo_destroy_pkginfo() + * @see pkgmgrinfo_pkginfo_get_pkgid() + * @see pkgmgrinfo_pkginfo_is_removable() + * @code +static int get_pkg_author_name(const char *pkgid) +{ + int ret = 0; + char *author_name = NULL; + pkgmgrinfo_pkginfo_h handle; + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_get_author_name(handle, &author_name); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + printf("pkg author name: %s\n", author_name); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_get_author_name(pkgmgrinfo_pkginfo_h handle, char **author_name); + +/** + * @fn int pkgmgrinfo_pkginfo_get_author_email(pkgmgrinfo_pkginfo_h handle, char **author_email) + * @brief This API gets the package's author email from the package ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to package info handle + * @param[out] author_email pointer to hold package author email + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_get_pkginfo() + * @post pkgmgrinfo_pkginfo_destroy_pkginfo() + * @see pkgmgrinfo_pkginfo_get_pkgid() + * @see pkgmgrinfo_pkginfo_is_removable() + * @code +static int get_pkg_author_email(const char *pkgid) +{ + int ret = 0; + char *author_email = NULL; + pkgmgrinfo_pkginfo_h handle; + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_get_author_email(handle, &author_email); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + printf("pkg author email: %s\n", author_email); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_get_author_email(pkgmgrinfo_pkginfo_h handle, char **author_email); + +/** + * @fn int pkgmgrinfo_pkginfo_get_author_href(pkgmgrinfo_pkginfo_h handle, char **author_href) + * @brief This API gets the package's author href from the package ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to package info handle + * @param[out] author_href pointer to hold package author href + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_get_pkginfo() + * @post pkgmgrinfo_pkginfo_destroy_pkginfo() + * @see pkgmgrinfo_pkginfo_get_pkgid() + * @see pkgmgrinfo_pkginfo_is_removable() + * @code +static int get_pkg_author_href(const char *pkgid) +{ + int ret = 0; + char *author_href = NULL; + pkgmgrinfo_pkginfo_h handle; + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_get_author_href(handle, &author_href); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + printf("pkg author href: %s\n", author_href); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_get_author_href(pkgmgrinfo_pkginfo_h handle, char **author_href); + +/** + * @fn int pkgmgrinfo_pkginfo_get_installed_storage(pkgmgrinfo_pkginfo_h handle, pkgmgrinfo_installed_storage *storage) + * @brief This API gets the package installed storagae value from the package ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to package info handle + * @param[out] storage pointer to hold package installed storage + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_get_pkginfo() + * @post pkgmgrinfo_pkginfo_destroy_pkginfo() + * @see pkgmgrinfo_pkginfo_get_pkgid() + * @see pkgmgrinfo_pkginfo_is_removable() + * @code +static int get_pkg_installed_storage(const char *pkgid) +{ + int ret = 0; + pkgmgrinfo_installed_storage storage; + pkgmgrinfo_pkginfo_h handle; + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_get_installed_storage(handle, &storage); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + printf("pkg installed storage: %d\n", storage); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_get_installed_storage(pkgmgrinfo_pkginfo_h handle, pkgmgrinfo_installed_storage *storage); + +/** + * @fn int pkgmgrinfo_pkginfo_get_installed_time(pkgmgrinfo_pkginfo_h handle, int *installed_time) + * @brief This API gets the installed time of package from the package ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to package info handle + * @param[out] installed_time pointer to hold installed time of package + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_get_pkginfo() + * @post pkgmgrinfo_pkginfo_destroy_pkginfo() + * @see pkgmgrinfo_pkginfo_get_pkgid() + * @see pkgmgrinfo_pkginfo_is_removable() + * @code +static int get_pkg_installed_time(const char *pkgid) +{ + int ret = 0; + int installed_time = 0; + pkgmgrinfo_pkginfo_h handle; + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_get_installed_time(handle, &installed_time); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + printf("installed_time: %d\n", installed_time); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_get_installed_time(pkgmgrinfo_pkginfo_h handle, int *installed_time); + +/** + * @fn int pkgmgrinfo_pkginfo_get_storeclientid(pkgmgrinfo_pkginfo_h handle, char **storeclientid) + * @brief This API gets the store client id of package from the package ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to package info handle + * @param[out] storeclientid pointer to hold store client id of package + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_get_pkginfo() + * @post pkgmgrinfo_pkginfo_destroy_pkginfo() + * @see pkgmgrinfo_pkginfo_get_pkgid() + * @see pkgmgrinfo_pkginfo_is_removable() + * @code +static int get_pkg_storeclientid(const char *pkgid) +{ + int ret = 0; + char *storeclientid = 0; + pkgmgrinfo_pkginfo_h handle; + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_get_storeclientid(handle, &storeclientid); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + printf(store client id: %s\n", storeclientid); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_get_storeclientid(pkgmgrinfo_pkginfo_h handle, char **storeclientid); + +/** + * @fn int pkgmgrinfo_pkginfo_get_mainappid(pkgmgrinfo_pkginfo_h handle, char **mainappid) + * @brief This API gets the main app id of package from the package ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to package info handle + * @param[out] mainappid pointer to hold main app id of package + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_get_pkginfo() + * @post pkgmgrinfo_pkginfo_destroy_pkginfo() + * @see pkgmgrinfo_pkginfo_get_pkgid() + * @see pkgmgrinfo_pkginfo_is_removable() + * @code +static int get_pkg_mainappid(const char *pkgid) +{ + int ret = 0; + char *mainappid = 0; + pkgmgrinfo_pkginfo_h handle; + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_get_mainappid(handle, &mainappid); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + printf(main app id: %s\n", mainappid); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_get_mainappid(pkgmgrinfo_pkginfo_h handle, char **mainappid); + +/** + * @fn int pkgmgrinfo_pkginfo_get_url(pkgmgrinfo_pkginfo_h handle, char **url) + * @brief This API gets the url of package from the package ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to package info handle + * @param[out] url pointer to hold url of package + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_get_pkginfo() + * @post pkgmgrinfo_pkginfo_destroy_pkginfo() + * @see pkgmgrinfo_pkginfo_get_pkgid() + * @see pkgmgrinfo_pkginfo_is_removable() + * @code +static int get_pkg_url(const char *pkgid) +{ + int ret = 0; + char *url = 0; + pkgmgrinfo_pkginfo_h handle; + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_get_url(handle, &url); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + printf("url : %s\n", url); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_get_url(pkgmgrinfo_pkginfo_h handle, char **url); + + +/** + * @fn int pkgmgrinfo_pkginfo_get_root_path(pkgmgrinfo_pkginfo_h handle, char **path) + * @brief This API gets the root path of package + * + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to package info handle + * @param[out] path pointer to hold root path of package + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @code +static int get_root_path(const char *pkgid) +{ + int ret = 0; + char *path = 0; + pkgmgrinfo_pkginfo_h handle; + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + + ret = pkgmgrinfo_pkginfo_get_root_path(handle, &path); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + printf("path : %s\n", path); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_get_root_path(pkgmgrinfo_pkginfo_h handle, char **path); + + +/** + * @fn int pkgmgrinfo_pkginfo_get_csc_path(pkgmgrinfo_pkginfo_h handle, char **path) + * @brief This API gets the csc path of package + * + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to package info handle + * @param[out] path pointer to hold csc path of package + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @code +static int get_csc_path(const char *pkgid) +{ + int ret = 0; + char *path = 0; + pkgmgrinfo_pkginfo_h handle; + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + + ret = pkgmgrinfo_pkginfo_get_csc_path(handle, &path); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + printf("path : %s\n", path); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_get_csc_path(pkgmgrinfo_pkginfo_h handle, char **path); + +/** + * @fn int pkgmgrinfo_pkginfo_get_support_mode(pkgmgrinfo_pkginfo_h handle, int *support_mode) + * @brief This API gets the support_mode of package + * + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to package info handle + * @param[out] support_mode pointer to hold support_mode of package + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @code +static int get_support_mode(const char *pkgid) +{ + int ret = 0; + int *support_mode = 0; + pkgmgrinfo_pkginfo_h handle = NULL; + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + + ret = pkgmgrinfo_pkginfo_get_support_mode(handle, &support_mode); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + printf("support_mode : %s\n", support_mode); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_get_support_mode(pkgmgrinfo_pkginfo_h handle, int *support_mode); + + +/** + * @fn int pkgmgrinfo_pkginfo_get_hash(pkgmgrinfo_pkginfo_h handle, char **hash) + * @brief This API gets the package_hash of package + * + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to package info handle + * @param[out] hash pointer to hold package_hash of package + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @code +static int get_package_hash(const char *pkgid) +{ + int ret = 0; + int *hash = NULL;; + pkgmgrinfo_pkginfo_h handle = NULL; + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + + ret = pkgmgrinfo_pkginfo_get_hash(handle, &hash); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + printf("package_hash : %s\n", hash); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + + return 0; +} + * @endcode +*/ + +int pkgmgrinfo_pkginfo_get_hash(pkgmgrinfo_pkginfo_h handle, char **hash); + +/** + * @fn int pkgmgrinfo_pkginfo_get_support_reset(pkgmgrinfo_pkginfo_h handle, char **support_reset) + * @brief This API gets the support reset of package + * + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to package info handle + * @param[out] support_reset pointer to hold support reset of package + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @code +static int get_support_reset(const char *pkgid) +{ + int ret = 0; + char *support_reset = 0; + pkgmgrinfo_pkginfo_h handle = NULL; + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + + ret = pkgmgrinfo_pkginfo_get_support_reset(handle, &support_reset); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + printf("support_reset : %s\n", support_reset); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_get_support_reset(pkgmgrinfo_pkginfo_h handle, char **support_reset); + +/** + * @fn int pkgmgrinfo_pkginfo_get_groupid(pkgmgrinfo_pkginfo_h handle, char **groupid) + * @brief This API gets the groupid of package + * + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to package info handle + * @param[out] groupid pointer to hold groupid of package + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @code +static int get_groupid(const char *pkgid) +{ + int ret = 0; + char *groupid = 0; + pkgmgrinfo_pkginfo_h handle = NULL; + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + + ret = pkgmgrinfo_pkginfo_get_groupid(handle, &groupid); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + printf("groupid : %s\n", groupid); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_get_groupid(pkgmgrinfo_pkginfo_h handle, char **groupid); + +/** + * @fn int pkgmgrinfo_pkginfo_compare_pkg_cert_info(const char *lhs_package_id, const char *rhs_package_id, pkgmgrinfo_cert_compare_result_type_e *compare_result) + * @brief This API compare the cert information from given package id + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] lhs_package_id pointer to first package ID + * @param[in] rhs_package_id pointer to second package ID + * @param[out] compare_result pointer to the compare result. + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre None + * @post pkgmgrinfo_pkginfo_destroy_pkginfo() + * @see pkgmgrinfo_pkginfo_get_pkgid() + * @see pkgmgrinfo_pkginfo_is_removable() + * @code +static int compare_pkg_cert_info(const char *lhs_package_id, const char *rhs_package_id, pkgmgrinfo_cert_compare_result_type_e *compare_result) +{ + int ret = 0; + pkgmgrinfo_cert_compare_result_type_e result; + + ret = pkgmgrinfo_pkginfo_compare_pkg_cert_info(lhs_package_id, rhs_package_id, &result); + if (ret != PMINFO_R_OK) { + return -1; + } + printf("result: %d\n", result); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_compare_pkg_cert_info(const char *lhs_package_id, const char *rhs_package_id, pkgmgrinfo_cert_compare_result_type_e *compare_result); + +/** + * @fn int pkgmgrinfo_pkginfo_compare_app_cert_info(const char *lhs_app_id, const char *rhs_app_id, pkgmgrinfo_cert_compare_result_type_e *compare_result) + * @brief This API compare the cert information from given app id + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] lhs_app_id pointer to first app ID + * @param[in] rhs_app_id pointer to second app ID + * @param[out] compare_result pointer to the compare result. + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre None + * @post pkgmgrinfo_pkginfo_destroy_pkginfo() + * @see pkgmgrinfo_pkginfo_get_pkgid() + * @see pkgmgrinfo_pkginfo_is_removable() + * @code +static int compare_app_cert_info(const char *lhs_app_id, const char *rhs_app_id, pkgmgrinfo_cert_compare_result_type_e *compare_result) +{ + int ret = 0; + pkgmgrinfo_cert_compare_result_type_e result; + + ret = pkgmgrinfo_pkginfo_compare_app_cert_info(lhs_app_id, rhs_app_id, &result); + if (ret != PMINFO_R_OK) { + return -1; + } + printf("result: %d\n", result); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_compare_app_cert_info(const char *lhs_app_id, const char *rhs_app_id, pkgmgrinfo_cert_compare_result_type_e *compare_result); + +/** + * @fn int pkgmgrinfo_pkginfo_is_removable(pkgmgrinfo_pkginfo_h handle, bool *removable) + * @brief This API gets the package 'removable' value from the package ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to package info handle + * @param[out] removable pointer to hold package removable value + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_get_pkginfo() + * @post pkgmgrinfo_pkginfo_destroy_pkginfo() + * @see pkgmgrinfo_pkginfo_get_pkgid() + * @see pkgmgrinfo_pkginfo_is_readonly() + * @code +static int get_pkg_removable(const char *pkgid) +{ + int ret = 0; + bool removable; + pkgmgrinfo_pkginfo_h handle; + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_is_removable(handle, &removable); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + printf("pkg removable: %d\n", removable); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_is_removable(pkgmgrinfo_pkginfo_h handle, bool *removable); + +/** + * @fn int pkgmgrinfo_pkginfo_is_movable(pkgmgrinfo_pkginfo_h handle, bool *movable) + * @brief This API check that the package can move internal storage to external storage or external storage to internal storage from the package ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to package info handle + * @param[out] movable pointer to hold package movable state + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_get_pkginfo() + * @post pkgmgrinfo_pkginfo_destroy_pkginfo() + * @see pkgmgrinfo_pkginfo_get_pkgid() + * @code +static int get_pkg_movable(const char *pkgid) +{ + int ret = 0; + bool movable; + pkgmgrinfo_pkginfo_h handle; + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_is_movable(handle, &movable); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + printf("pkg movable: %d\n", movable); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_is_movable(pkgmgrinfo_pkginfo_h handle, bool *movable); + +/** + * @fn int pkgmgrinfo_pkginfo_is_preload(pkgmgrinfo_pkginfo_h handle, bool *preload) + * @brief This API gets the package 'preload' value from the package ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to package info handle + * @param[out] preload pointer to hold package preload value + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_get_pkginfo() + * @post pkgmgrinfo_pkginfo_destroy_pkginfo() + * @see pkgmgrinfo_pkginfo_get_pkgid() + * @see pkgmgrinfo_pkginfo_is_readonly() + * @code +static int get_pkg_preload(const char *pkgid) +{ + int ret = 0; + bool preload; + pkgmgrinfo_pkginfo_h handle; + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_is_preload(handle, &preload); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + printf("pkg preload: %d\n", preload); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_is_preload(pkgmgrinfo_pkginfo_h handle, bool *preload); + +/** + * @fn int pkgmgrinfo_pkginfo_is_system(pkgmgrinfo_pkginfo_h handle, bool *system) + * @brief This API gets the value for given handle is system or not + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to package info handle + * @param[out] system pointer to hold system is or not + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_get_pkginfo() + * @post pkgmgrinfo_pkginfo_destroy_pkginfo() + * @see pkgmgrinfo_pkginfo_get_pkgid() + * @see pkgmgrinfo_pkginfo_is_readonly() + * @code +static int get_pkg_system(const char *pkgid) +{ + int ret = 0; + bool system = false; + pkgmgrinfo_pkginfo_h handle = NULL; + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_is_system(handle, &system); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + printf("pkg system: %d\n", system); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_is_system(pkgmgrinfo_pkginfo_h handle, bool *system); + +/** + * @fn int pkgmgrinfo_pkginfo_is_readonly(pkgmgrinfo_pkginfo_h handle, bool *readonly) + * @brief This API gets the package 'readonly' value from the package ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to package info handle + * @param[out] readonly pointer to hold package readonly value + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_get_pkginfo() + * @post pkgmgrinfo_pkginfo_destroy_pkginfo() + * @see pkgmgrinfo_pkginfo_get_pkgid() + * @see pkgmgrinfo_pkginfo_is_removable() + * @code +static int get_pkg_readonly(const char *pkgid) +{ + int ret = 0; + bool readonly; + pkgmgrinfo_pkginfo_h handle; + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_is_readonly(handle, &readonly); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + printf("pkg readonly: %d\n", readonly); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_is_readonly(pkgmgrinfo_pkginfo_h handle, bool *readonly); + + +/** + * @fn int pkgmgrinfo_pkginfo_is_update(pkgmgrinfo_pkginfo_h handle, bool *update) + * @brief This API gets the package 'upate' value from the package ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to package info handle + * @param[out] update pointer to hold package update value + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_get_pkginfo() + * @post pkgmgrinfo_pkginfo_destroy_pkginfo() + * @see pkgmgrinfo_pkginfo_get_pkgid() + * @code +static int get_pkg_update(const char *pkgid) +{ + int ret = 0; + bool update; + pkgmgrinfo_pkginfo_h handle; + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_is_update(handle, &update); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + printf("pkg update: %d\n", update); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_is_update(pkgmgrinfo_pkginfo_h handle, bool *update); + +/** + * @fn int pkgmgrinfo_pkginfo_is_support_disable(pkgmgrinfo_pkginfo_h handle, bool *support_disable) + * @brief This API gets the package 'support_disable' value from the package ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to package info handle + * @param[out] support_disable pointer to hold package support_disable value + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_get_pkginfo() + * @post pkgmgrinfo_pkginfo_destroy_pkginfo() + * @see pkgmgrinfo_pkginfo_get_pkgid() + * @code +static int get_pkg_support_disable(const char *pkgid) +{ + int ret = 0; + bool support_disable; + pkgmgrinfo_pkginfo_h handle; + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_is_support_disable(handle, &support_disable); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + printf("pkg support_disable: %d\n", support_disable); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_is_support_disable(pkgmgrinfo_pkginfo_h handle, bool *support_disable); + +/** + * @fn int pkgmgrinfo_pkginfo_is_accessible(pkgmgrinfo_pkginfo_h handle, bool *accessible) + * @brief This API gets the package 'accessible' value from the package ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to package info handle + * @param[out] accessible pointer to hold package accessible value + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_get_pkginfo() + * @post pkgmgrinfo_pkginfo_destroy_pkginfo() + * @see pkgmgrinfo_pkginfo_get_pkgid() + * @see pkgmgrinfo_pkginfo_is_readonly() + * @code +static int get_pkg_accessible(const char *pkgid) +{ + int ret = 0; + bool accessible; + pkgmgrinfo_pkginfo_h handle; + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_is_accessible(handle, &accessible); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + printf("pkg accessible: %d\n", accessible); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_is_accessible(pkgmgrinfo_pkginfo_h handle, bool *accessible); + + +/** + * @fn int pkgmgrinfo_pkginfo_is_mother_package(pkgmgrinfo_pkginfo_h handle, bool *mother_package) + * @brief This API gets the package 'mother_package' value from the package ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to package info handle + * @param[out] mother_package pointer to hold package mother_package value + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_get_pkginfo() + * @post pkgmgrinfo_pkginfo_destroy_pkginfo() + * @see pkgmgrinfo_pkginfo_get_pkgid() + * @see pkgmgrinfo_pkginfo_is_readonly() + * @code +static int get_pkg_mother_package(const char *pkgid) +{ + int ret = 0; + bool mother_package = false; + pkgmgrinfo_pkginfo_h handle = NULL; + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_is_mother_package(handle, &mother_package); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + printf("pkg mother_package: %d\n", mother_package); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_is_mother_package(pkgmgrinfo_pkginfo_h handle, bool *mother_package); + +/** + * @fn int pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo_h handle) + * @brief This API destroys the package information handle freeing up all the resources + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the package info handle + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_get_pkginfo() + * @post None + * @see pkgmgrinfo_pkginfo_get_pkgid() + * @see pkgmgrinfo_pkginfo_is_removable() + * @code +static int get_pkg_type(const char *pkgid) +{ + int ret = 0; + char *type = NULL; + pkgmgrinfo_pkginfo_h handle; + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_get_type(handle, &type); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + printf("pkgtype: %s\n", type); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo_h handle); + +/** + * @fn int pkgmgrinfo_pkginfo_filter_create(pkgmgrinfo_pkginfo_filter_h *handle) + * @brief This API creates the package information filter handle from db. All filter properties will be ANDed. + The query will search the entire package information collected from the manifest file of all the installed packages + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[out] handle pointer to the package info filter handle. + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre None + * @post pkgmgrinfo_pkginfo_filter_destroy() + * @see pkgmgrinfo_pkginfo_filter_count() + * @see pkgmgrinfo_pkginfo_filter_foreach_pkginfo() + * @code +static int get_rpm_pkg_count() +{ + int ret = 0; + int count = 0; + pkgmgrinfo_pkginfo_filter_h handle; + ret = pkgmgrinfo_pkginfo_filter_create(&handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_filter_add_string(handle, PMINFO_PKGINFO_PROP_PACKAGE_TYPE, "rpm"); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_filter_destroy(handle); + return -1; + } + ret = pkgmgrinfo_pkginfo_filter_count(handle, &count); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_filter_destroy(handle); + return -1; + } + printf("No of rpm pkgs: %d\n", count); + pkgmgrinfo_pkginfo_filter_destroy(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_filter_create(pkgmgrinfo_pkginfo_filter_h *handle); + +/** + * @fn int pkgmgrinfo_pkginfo_filter_destroy(pkgmgrinfo_pkginfo_filter_h handle) + * @brief This API destroys the package information filter handle freeing up all the resources + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the package info filter handle. + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_filter_create() + * @post None + * @see pkgmgrinfo_pkginfo_filter_count() + * @see pkgmgrinfo_pkginfo_filter_foreach_pkginfo() + * @code +static int get_rpm_pkg_count() +{ + int ret = 0; + int count = 0; + pkgmgrinfo_pkginfo_filter_h handle; + ret = pkgmgrinfo_pkginfo_filter_create(&handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_filter_add_string(handle, PMINFO_PKGINFO_PROP_PACKAGE_TYPE, "rpm"); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_filter_destroy(handle); + return -1; + } + ret = pkgmgrinfo_pkginfo_filter_count(handle, &count); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_filter_destroy(handle); + return -1; + } + printf("No of rpm pkgs: %d\n", count); + pkgmgrinfo_pkginfo_filter_destroy(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_filter_destroy(pkgmgrinfo_pkginfo_filter_h handle); + +/** + * @fn int pkgmgrinfo_pkginfo_filter_add_bool(pkgmgrinfo_pkginfo_filter_h handle, const char *property, const bool value) + * @brief This API adds a boolean filter property to the filter handle + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the package info filter handle. + * @param[in] property boolean property name. + * @param[in] value value corresponding to the property. + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_filter_create() + * @post pkgmgrinfo_pkginfo_filter_destroy() + * @see pkgmgrinfo_pkginfo_filter_count() + * @see pkgmgrinfo_pkginfo_filter_foreach_pkginfo() + * @code +static int get_preload_pkg_count() +{ + int ret = 0; + int count = 0; + pkgmgrinfo_pkginfo_filter_h handle; + ret = pkgmgrinfo_pkginfo_filter_create(&handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_filter_add_bool(handle, PMINFO_PKGINFO_PROP_PACKAGE_PRELOAD, 1); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_filter_destroy(handle); + return -1; + } + ret = pkgmgrinfo_pkginfo_filter_count(handle, &count); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_filter_destroy(handle); + return -1; + } + printf("No of preload pkgs: %d\n", count); + pkgmgrinfo_pkginfo_filter_destroy(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_filter_add_bool(pkgmgrinfo_pkginfo_filter_h handle, + const char *property, const bool value); + +/** + * @fn int pkgmgrinfo_pkginfo_filter_add_int(pkgmgrinfo_pkginfo_filter_h handle, const char *property, const int value) + * @brief This API adds an integer filter property to the filter handle + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the package info filter handle. + * @param[in] property integer property name. + * @param[in] value value corresponding to the property. + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_filter_create() + * @post pkgmgrinfo_pkginfo_filter_destroy() + * @see pkgmgrinfo_pkginfo_filter_count() + * @see pkgmgrinfo_pkginfo_filter_foreach_pkginfo() + * @code +static int get_pkg_count() +{ + int ret = 0; + int count = 0; + pkgmgrinfo_pkginfo_filter_h handle; + ret = pkgmgrinfo_pkginfo_filter_create(&handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_filter_add_int(handle, PMINFO_PKGINFO_PROP_PACKAGE_SIZE, 10); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_filter_destroy(handle); + return -1; + } + ret = pkgmgrinfo_pkginfo_filter_count(handle, &count); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_filter_destroy(handle); + return -1; + } + printf("No of preload pkgs: %d\n", count); + pkgmgrinfo_pkginfo_filter_destroy(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_filter_add_int(pkgmgrinfo_pkginfo_filter_h handle, + const char *property, const int value); + +/** + * @fn int pkgmgrinfo_pkginfo_filter_add_string(pkgmgrinfo_pkginfo_filter_h handle, const char *property, const char *value) + * @brief This API adds a string filter property to the filter handle + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the package info filter handle. + * @param[in] property string property name. + * @param[in] value value corresponding to the property. + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_filter_create() + * @post pkgmgrinfo_pkginfo_filter_destroy() + * @see pkgmgrinfo_pkginfo_filter_count() + * @see pkgmgrinfo_pkginfo_filter_foreach_pkginfo() + * @code +static int get_rpm_pkg_count() +{ + int ret = 0; + int count = 0; + pkgmgrinfo_pkginfo_filter_h handle; + ret = pkgmgrinfo_pkginfo_filter_create(&handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_filter_add_string(handle, PMINFO_PKGINFO_PROP_PACKAGE_TYPE, "rpm"); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_filter_destroy(handle); + return -1; + } + ret = pkgmgrinfo_pkginfo_filter_count(handle, &count); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_filter_destroy(handle); + return -1; + } + printf("No of rpm pkgs: %d\n", count); + pkgmgrinfo_pkginfo_filter_destroy(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_filter_add_string(pkgmgrinfo_pkginfo_filter_h handle, + const char *property, const char *value); + +/** + * @fn int pkgmgrinfo_pkginfo_filter_foreach_pkginfo(pkgmgrinfo_pkginfo_filter_h handle, pkgmgrinfo_pkg_list_cb pkg_cb, void *user_data) + * @brief This API executes the user supplied callback function for each package that satisfy the filter conditions + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the package info filter handle. + * @param[in] pkg_cb callback function. + * @param[in] user_data user data to be passed to the callback function + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_filter_create() + * @post pkgmgrinfo_pkginfo_filter_destroy() + * @see pkgmgrinfo_pkginfo_filter_count() + * @code +int pkg_list_cb(pkgmgrinfo_pkginfo_h handle, void *user_data) +{ + char *pkgid = NULL; + pkgmgrinfo_pkginfo_get_pkgid(handle, &pkgid); + printf("pkg id : %s\n", pkgid); + return 0; +} + +static int get_rpm_pkg_list() +{ + int ret = 0; + pkgmgrinfo_pkginfo_filter_h handle; + ret = pkgmgrinfo_pkginfo_filter_create(&handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_filter_add_string(handle, PMINFO_PKGINFO_PROP_PACKAGE_TYPE, "rpm"); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_filter_destroy(handle); + return -1; + } + ret = pkgmgrinfo_pkginfo_filter_foreach_pkginfo(handle, pkg_list_cb, NULL); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_filter_destroy(handle); + return -1; + } + pkgmgrinfo_pkginfo_filter_destroy(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_filter_foreach_pkginfo(pkgmgrinfo_pkginfo_filter_h handle, + pkgmgrinfo_pkg_list_cb pkg_cb, void *user_data); + +/** + * @fn int pkgmgrinfo_pkginfo_filter_count(pkgmgrinfo_pkginfo_filter_h handle, int *count) + * @brief This API counts the package that satisfy the filter conditions + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the package info filter handle. + * @param[in] count pointer to store the count value. + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_filter_create() + * @post pkgmgrinfo_pkginfo_filter_destroy() + * @see pkgmgrinfo_pkginfo_filter_foreach_pkginfo() + * @code +static int get_rpm_pkg_count() +{ + int ret = 0; + int count = 0; + pkgmgrinfo_pkginfo_filter_h handle; + ret = pkgmgrinfo_pkginfo_filter_create(&handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_filter_add_string(handle, PMINFO_PKGINFO_PROP_PACKAGE_TYPE, "rpm"); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_filter_destroy(handle); + return -1; + } + ret = pkgmgrinfo_pkginfo_filter_count(handle, &count); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_filter_destroy(handle); + return -1; + } + printf("No of rpm pkgs: %d\n", count); + pkgmgrinfo_pkginfo_filter_destroy(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_filter_count(pkgmgrinfo_pkginfo_filter_h handle, int *count); + +/** + * @fn int pkgmgrinfo_pkginfo_privilege_filter_foreach(const char *privilege, + pkgmgrinfo_pkg_list_cb pkg_list_cb, void *user_data); + * @brief This API gets the list of package id for a particular privilege + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * @param[in] privilege privilege to find package id list. + * @param[in] pkg_list_cb iteration function for list + * @param[in] user_data user data to be passed to callback function + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @code +int pkg_list_cb(const pkgmgrinfo_pkginfo_h handle, void *user_data) +{ + int ret = PMINFO_R_OK; + char *pkgid = NULL; + ret = pkgmgrinfo_pkginfo_get_pkgid(handle, &pkgid); + if (ret != PMINFO_R_OK) { + return -1; + } else { + printf("pkgid : %s\n", pkgid); + } + + return 0; +} + +static int list_pkgid_by_privilege(const char *privilege) +{ + int ret = PMINFO_R_OK; + + ret = pkgmgrinfo_pkginfo_privilege_filter_foreach(privilege, pkg_list_cb, NULL); + + return ret; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_privilege_filter_foreach(const char *privilege, + pkgmgrinfo_pkg_list_cb pkg_list_cb, void *user_data); + +/** + * @fn int pkgmgrinfo_pkginfo_foreach_privilege(pkgmgrinfo_pkginfo_h handle, + pkgmgrinfo_pkg_privilege_list_cb privilege_func, void *user_data); + * @brief This API gets the list of privilege for a particular package + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * @param[in] handle pointer to the package info handle. + * @param[in] privilege_func callback function for list + * @param[in] user_data user data to be passed to callback function + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_get_pkginfo() + * @post pkgmgrinfo_pkginfo_destroy_pkginfo() + * @code +int privilege_func(const char *name, void *user_data) +{ + if (strcmp(name, (char *)user_data) == 0) + return -1; + else + return 0; +} + +static int list_privilege(const char *package, char *privilege) +{ + int ret = 0; + pkgmgrinfo_pkginfo_h handle; + ret = pkgmgrinfo_pkginfo_get_pkginfo(package, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_foreach_privilege(handle, privilege_func, (void *)privilege); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_foreach_privilege(pkgmgrinfo_pkginfo_h handle, + pkgmgrinfo_pkg_privilege_list_cb privilege_func, void *user_data); + +/** + * @fn int pkgmgrinfo_appinfo_get_list(pkgmgrinfo_pkginfo_h handle, pkgmgrinfo_app_component component, + pkgmgrinfo_app_list_cb app_func, void *user_data) + * @brief This API gets list of installed applications for a particular package + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * @param[in] handle package info handle + * @param[in] component application component + * @param[in] app_func iteration function for list + * @param[in] user_data user data to be passed to callback function + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_get_pkginfo() + * @post pkgmgrinfo_pkginfo_destroy_pkginfo() + * @code +int app_func(pkgmgrinfo_appinfo_h handle, void *user_data) +{ + char *appid = NULL; + pkgmgrinfo_appinfo_get_appid(handle, &appid); + printf("appid : %s\n", appid); + return 0; +} + +static int list_apps(const char *pkgid) +{ + int ret = 0; + pkgmgrinfo_pkginfo_h handle; + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_get_list(handle, PMINFO_UI_APP, app_func, NULL); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; + } + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_list(pkgmgrinfo_pkginfo_h handle, pkgmgrinfo_app_component component, + pkgmgrinfo_app_list_cb app_func, void *user_data); +/** + * @fn int pkgmgrinfo_appinfo_get_install_list(pkgmgrinfo_app_list_cb app_func, void *user_data); + * @brief This API gets list of installed applications from all packages with minimum informaion. + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * @param[in] app_func iteration function for list + * @param[in] user_data user data to be passed to callback function + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre None + * @post None + * @code +int app_list_cb(pkgmgrinfo_appinfo_h handle, void *user_data) +{ + char *pkgid1 = NULL; + char *pkgid2 = NULL; + pkgid1 = (char *)user_data; + pkgmgrinfo_appinfo_get_pkgid(handle, &pkgid2); + if (strcmp(pkgid1, pkgid2) == 0) { + return -1; + } else { + return 0; + } +} + +static int list_apps() +{ + int ret = 0; + char *name = "helloworld"; + ret = pkgmgrinfo_appinfo_get_install_list(app_list_cb, (void *)name); + if (ret != PMINFO_R_OK) { + return -1; + } + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_install_list(pkgmgrinfo_app_list_cb app_func, void *user_data); + +/** + * @fn int pkgmgrinfo_appinfo_get_installed_list(pkgmgrinfo_app_list_cb app_func, void *user_data); + * @brief This API gets list of installed applications from all packages. + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * @param[in] app_func iteration function for list + * @param[in] user_data user data to be passed to callback function + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre None + * @post None + * @code +int app_list_cb(pkgmgrinfo_appinfo_h handle, void *user_data) +{ + char *pkgid1 = NULL; + char *pkgid2 = NULL; + pkgid1 = (char *)user_data; + pkgmgrinfo_appinfo_get_pkgid(handle, &pkgid2); + if (strcmp(pkgid1, pkgid2) == 0) { + return -1; + } else { + return 0; + } +} + +static int list_apps() +{ + int ret = 0; + char *name = "helloworld"; + ret = pkgmgrinfo_appinfo_get_installed_list(app_list_cb, (void *)name); + if (ret != PMINFO_R_OK) { + return -1; + } + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_installed_list(pkgmgrinfo_app_list_cb app_func, void *user_data); + +/** + * @fn int pkgmgrinfo_appinfo_get_mounted_list(pkgmgrinfo_app_list_cb app_func, void *user_data); + * @brief This API gets list of applications which are installed in sd card when sd card is mounted + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * @param[in] app_func iteration function for list + * @param[in] user_data user data to be passed to callback function + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre None + * @post None + * @code +int app_list_cb(pkgmgrinfo_appinfo_h handle, void *user_data) +{ + char *appid = NULL; + + pkgmgrinfo_appinfo_get_appid(handle, &appid); + printf("appid: %s\n", appid); + + return 0; +} + +static int mounted_list_apps() +{ + int ret = 0; + + ret = pkgmgrinfo_appinfo_get_mounted_list(app_list_cb, NULL); + if (ret != PMINFO_R_OK) { + return -1; + } + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_mounted_list(pkgmgrinfo_app_list_cb app_func, void *user_data); + +/** + * @fn int pkgmgrinfo_appinfo_get_unmounted_list(pkgmgrinfo_app_list_cb app_func, void *user_data); + * @brief This API gets list of applications which are installed in sd card when sd card is unmounted + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * @param[in] app_func iteration function for list + * @param[in] user_data user data to be passed to callback function + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre None + * @post None + * @code +int app_list_cb(pkgmgrinfo_appinfo_h handle, void *user_data) +{ + char *appid = NULL; + + pkgmgrinfo_appinfo_get_appid(handle, &appid); + printf("appid: %s\n", appid); + + return 0; +} + +static int unmounted_list_apps() +{ + int ret = 0; + + ret = pkgmgrinfo_appinfo_get_unmounted_list(app_list_cb, NULL); + if (ret != PMINFO_R_OK) { + return -1; + } + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_unmounted_list(pkgmgrinfo_app_list_cb app_func, void *user_data); + +/** + * @fn int pkgmgrinfo_appinfo_get_unmounted_appinfo(const char *appid, pkgmgrinfo_appinfo_h *handle) + * @brief This API creates the application information handle from db + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] appid pointer to appid + * @param[out] handle pointer to the application info handle. + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre None + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_pkgid() + * @see pkgmgrinfo_appinfo_is_multiple() + * @code +static int get_app_type(const char *appid) +{ + int ret = 0; + char *type = NULL; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_unmounted_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_get_apptype(handle, &type); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("apptype: %s\n", type); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_unmounted_appinfo(const char *appid, pkgmgrinfo_appinfo_h *handle); + +/** + * @fn int pkgmgrinfo_appinfo_get_appinfo(const char *appid, pkgmgrinfo_appinfo_h *handle) + * @brief This API creates the application information handle from db + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] appid pointer to appid + * @param[out] handle pointer to the application info handle. + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre None + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_pkgid() + * @see pkgmgrinfo_appinfo_is_multiple() + * @code +static int get_app_type(const char *appid) +{ + int ret = 0; + char *type = NULL; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_get_apptype(handle, &type); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("apptype: %s\n", type); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_appinfo(const char *appid, pkgmgrinfo_appinfo_h *handle); + +/** + * @fn int pkgmgrinfo_appinfo_get_appid(pkgmgrinfo_appinfo_h handle, char **appid) + * @brief This API gets the application ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the application info handle. + * @param[out] appid pointer to hold appid + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_pkgid() + * @see pkgmgrinfo_appinfo_is_multiple() + * @code +static int get_app_id(const char *appid) +{ + int ret = 0; + char *app_id = NULL; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_get_appid(handle, &app_id); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("app id: %s\n", app_id); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_appid(pkgmgrinfo_appinfo_h handle, char **appid); + +/** + * @fn int pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo_h handle, char **pkg_name) + * @brief This API gets the package name of the application + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the application info handle. + * @param[out] pkg_name pointer to hold package name + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @see pkgmgrinfo_appinfo_is_multiple() + * @code +static int get_app_pkgname(const char *appid) +{ + int ret = 0; + char *pkgname = NULL; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_get_pkgname(handle, &pkgname); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("pkg name: %s\n", pkgname); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo_h handle, char **pkg_name); + +/** + * @fn int pkgmgrinfo_appinfo_get_pkgid(pkgmgrinfo_appinfo_h handle, char **pkgid) + * @brief This API gets the package id of the application + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the application info handle. + * @param[out] pkgid pointer to hold package id + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @see pkgmgrinfo_appinfo_is_multiple() + * @code +static int get_app_pkgid(const char *appid) +{ + int ret = 0; + char *pkgid = NULL; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_get_pkgid(handle, &pkgid); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("pkg id: %s\n", pkgid); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_pkgid(pkgmgrinfo_appinfo_h handle, char **pkgid); + +/** + * @fn int pkgmgrinfo_appinfo_get_pkgtype(pkgmgrinfo_appinfo_h handle, char **pkgtype) + * @brief This API gets the package type of the application + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the application info handle. + * @param[out] pkgtype pointer to hold package type + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @see pkgmgrinfo_appinfo_is_multiple() + * @code +static int get_app_pkgtype(const char *appid) +{ + int ret = 0; + char *pkgtype = NULL; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_get_pkgtype(handle, &pkgtype); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("pkgtype: %s\n", pkgtype); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_pkgtype(pkgmgrinfo_appinfo_h handle, char **pkgtype); + +/** + * @fn int pkgmgrinfo_appinfo_get_exec(pkgmgrinfo_appinfo_h handle, char **exec) + * @brief This API gets the executable name of the application + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the application info handle. + * @param[out] exec pointer to hold app exec name + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @see pkgmgrinfo_appinfo_is_multiple() + * @code +static int get_app_exec(const char *appid) +{ + int ret = 0; + char *exec = NULL; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_get_exec(handle, &exec); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("exec name: %s\n", exec); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_exec(pkgmgrinfo_appinfo_h handle, char **exec); + +/** + * @fn int pkgmgrinfo_appinfo_get_ambient_support(pkgmgrinfo_appinfo_h handle, bool *ambient_support) + * @brief This API gets the ambient_support of the application + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the application info handle. + * @param[out] ambient_support pointer to hold app ambient_support + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @see pkgmgrinfo_appinfo_is_multiple() + * @code +static int get_ambient_support(const char *appid) +{ + int ret = 0; + bool ambient_support; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_get_ambient_support(handle, &ambient_support); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("ambient_support? : %d\n", ambient_support); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_ambient_support(pkgmgrinfo_appinfo_h handle, bool *ambient_support); + + +/** + * @fn int pkgmgrinfo_appinfo_get_icon(pkgmgrinfo_appinfo_h handle, char **icon) + * @brief This API gets the icon name of the application + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the application info handle. + * @param[out] icon pointer to hold app icon name + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @see pkgmgrinfo_appinfo_is_multiple() + * @code +static int get_app_icon(const char *appid) +{ + int ret = 0; + char *icon = NULL; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_get_icon(handle, &icon); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("icon name: %s\n", icon); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_icon(pkgmgrinfo_appinfo_h handle, char **icon); + +/** + * @fn int pkgmgrinfo_appinfo_get_label(pkgmgrinfo_appinfo_h handle, char **label) + * @brief This API gets the label of the application + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the application info handle. + * @param[out] label pointer to hold app label + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @see pkgmgrinfo_appinfo_is_multiple() + * @code +static int get_app_label(const char *appid) +{ + int ret = 0; + char *label = NULL; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_get_label(handle, &label); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("label : %s\n", label); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_label(pkgmgrinfo_appinfo_h handle, char **label); + +/** + * @fn int pkgmgrinfo_appinfo_get_component(pkgmgrinfo_appinfo_h handle, pkgmgrinfo_app_component *component) + * @brief This API gets the component of the application + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the application info handle. + * @param[out] component pointer to hold app component + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @see pkgmgrinfo_appinfo_is_multiple() + * @code +static int get_app_component(const char *appid) +{ + int ret = 0; + pkgmgrinfo_app_component component; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_get_component(handle, &component); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("component : %s\n", component); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_component(pkgmgrinfo_appinfo_h handle, pkgmgrinfo_app_component *component); + +/** + * @fn int pkgmgrinfo_appinfo_get_apptype(pkgmgrinfo_appinfo_h handle, char **app_type) + * @brief This API gets the apptype of the application + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the application info handle. + * @param[out] app_type pointer to hold apptype + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @see pkgmgrinfo_appinfo_is_multiple() + * @code +static int get_app_type(const char *appid) +{ + int ret = 0; + char *apptype = NULL; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_get_apptype(handle, &apptype); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("apptype : %s\n", apptype); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_apptype(pkgmgrinfo_appinfo_h handle, char **app_type); + +/** + * @fn int pkgmgrinfo_appinfo_get_operation(pkgmgrinfo_appcontrol_h handle, + int *operation_count, char ***operation) + * @brief This API gets the list of operation of the application + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the appcontrol handle. + * @param[out] operation_count pointer to hold number of operations + * @param[out] operation pointer to hold list of operations + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_uri() + * @see pkgmgrinfo_appinfo_get_mime() + * @code +int appcontrol_func(pkgmgrinfo_appcontrol_h handle, void *user_data) +{ + int oc = 0; + int i = 0; + char **operation; + pkgmgrinfo_appinfo_get_operation(handle, &oc, &operation); + for (i = 0; i < oc; i++) { + if (strcmp(operation[i], (char *)user_data) == 0) + return -1; + else + return 0; + } +} + +static int check_operation(const char *appid, char *operation) +{ + int ret = 0; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_foreach_appcontrol(handle, appcontrol_func, (void *)operation); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_operation(pkgmgrinfo_appcontrol_h handle, + int *operation_count, char ***operation); + +/** + * @fn int pkgmgrinfo_appinfo_get_uri(pkgmgrinfo_appcontrol_h handle, + int *uri_count, char ***uri) + * @brief This API gets the list of uri of the application + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the appcontrol handle. + * @param[out] uri_count pointer to hold number of uris + * @param[out] uri pointer to hold list of uris + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_operation() + * @see pkgmgrinfo_appinfo_get_mime() + * @code +int appcontrol_func(pkgmgrinfo_appcontrol_h handle, void *user_data) +{ + int uc = 0; + int i = 0; + char **uri; + pkgmgrinfo_appinfo_get_uri(handle, &uc, &uri); + for (i = 0; i < uc; i++) { + if (strcmp(uri[i], (char *)user_data) == 0) + return -1; + else + return 0; + } +} + +static int check_uri(const char *appid, char *uri) +{ + int ret = 0; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_foreach_appcontrol(handle, appcontrol_func, (void *)uri); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_uri(pkgmgrinfo_appcontrol_h handle, + int *uri_count, char ***uri); + +/** + * @fn int pkgmgrinfo_appinfo_get_mime(pkgmgrinfo_appcontrol_h handle, + int *mime_count, char ***mime) + * @brief This API gets the list of mime of the application + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the appcontrol handle. + * @param[out] mime_count pointer to hold number of mimes + * @param[out] mime pointer to hold list of mimes + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_uri() + * @see pkgmgrinfo_appinfo_get_operation() + * @code +int appcontrol_func(pkgmgrinfo_appcontrol_h handle, void *user_data) +{ + int mc = 0; + int i = 0; + char **mime; + pkgmgrinfo_appinfo_get_operation(handle, &mc, &mime); + for (i = 0; i < mc; i++) { + if (strcmp(mime[i], (char *)user_data) == 0) + return -1; + else + return 0; + } +} + +static int check_mime(const char *appid, char *mime) +{ + int ret = 0; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_foreach_appcontrol(handle, appcontrol_func, (void *)mime); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_mime(pkgmgrinfo_appcontrol_h handle, + int *mime_count, char ***mime); + +/** + * @fn int pkgmgrinfo_appinfo_get_subapp(pkgmgrinfo_appcontrol_h handle, + int *subapp_count, char ***subapp) + * @brief This API gets the list of subapp of the application + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the appcontrol handle. + * @param[out] subapp_count pointer to hold number of subapp + * @param[out] subapp pointer to hold list of subapp + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_uri() + * @see pkgmgrinfo_appinfo_get_operation() + * @code +int appcontrol_func(pkgmgrinfo_appcontrol_h handle, void *user_data) +{ + int sc = 0; + int i = 0; + char **subapp = NULL; + pkgmgrinfo_appinfo_get_subapp(handle, &sc, &subapp); + for (i = 0; i < sc; i++) { + if (strcmp(subapp[i], (char *)user_data) == 0) + return -1; + else + return 0; + } +} + +static int check_subapp(const char *appid, char *subapp) +{ + int ret = 0; + pkgmgrinfo_appinfo_h handle = NULL; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_foreach_appcontrol(handle, appcontrol_func, (void *)subapp); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_subapp(pkgmgrinfo_appcontrol_h handle, + int *subapp_count, char ***subapp); + +/** + * @fn int pkgmgrinfo_appinfo_get_notification_icon(pkgmgrinfo_appinfo_h handle, char **icon) + * @brief This API gets the notification icon of the application + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the application info handle. + * @param[out] icon pointer to hold notification icon + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @see pkgmgrinfo_appinfo_is_multiple() + * @code +static int get_app_notification_icon(const char *appid) +{ + int ret = 0; + char *notification_icon = NULL; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_get_notification_icon(handle, ¬ification_icon); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("notification icon : %s\n", notification_icon); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_notification_icon(pkgmgrinfo_appinfo_h handle, char **icon); + +/** + * @fn int pkgmgrinfo_appinfo_get_setting_icon(pkgmgrinfo_appinfo_h handle, char **icon) + * @brief This API gets the setting icon of the application + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the application info handle. + * @param[out] icon pointer to hold setting icon + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @see pkgmgrinfo_appinfo_is_multiple() + * @code +static int get_app_setting_icon(const char *appid) +{ + int ret = 0; + char *setting_icon = NULL; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_get_setting_icon(handle, &setting_icon); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("setting icon : %s\n", setting_icon); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_setting_icon(pkgmgrinfo_appinfo_h handle, char **icon); + +/** + * @fn int pkgmgrinfo_appinfo_get_small_icon(pkgmgrinfo_appinfo_h handle, char **icon) + * @brief This API gets the small icon of the application + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the application info handle. + * @param[out] icon pointer to hold small icon + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @see pkgmgrinfo_appinfo_is_multiple() + * @code +static int get_app_small_icon(const char *appid) +{ + int ret = 0; + char *small_icon = NULL; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_get_small_icon(handle, &small_icon); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("small icon : %s\n", small_icon); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_small_icon(pkgmgrinfo_appinfo_h handle, char **icon); + +/** + * @fn int pkgmgrinfo_appinfo_get_recent_image_type(pkgmgrinfo_appinfo_h handle, pkgmgrinfo_app_recentimage *type) + * @brief This API gets the type of recent image on app-tray + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the application info handle. + * @param[out] type pointer to hold image type + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @see pkgmgrinfo_appinfo_is_multiple() + * @code +static int get_app_recent_image_type(const char *appid) +{ + int ret = 0; + pkgmgrinfo_app_recentimage type; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_get_recent_image_type(handle, &type); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("recent image type: %d\n", type); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_recent_image_type(pkgmgrinfo_appinfo_h handle, pkgmgrinfo_app_recentimage *type); + + +/** + * @fn int pkgmgrinfo_appinfo_get_preview_image(pkgmgrinfo_appinfo_h handle, char **preview_img) + * @brief This API gets the preview image of application + * + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the application info handle. + * @param[out] preview_img pointer to hold preview image path + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @code +static int get_app_previewimage(const char *appid) +{ + int ret = 0; + char *preview = NULL; + pkgmgrinfo_appinfo_h handle = NULL; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_get_preview_image(handle, &preview); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("preview image path : %s\n", preview); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_preview_image(pkgmgrinfo_appinfo_h handle, char **preview_img); + + +/** + * @fn int pkgmgrinfo_appinfo_get_permission_type(pkgmgrinfo_appinfo_h handle, pkgmgrinfo_permission_type *permission) + * @brief This API gets the package permission type of the application + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the application info handle. + * @param[out] permission pointer to hold package permission + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @code +static int get_app_permission(const char *appid) +{ + int ret = 0; + pkgmgrinfo_permission_type permission = 0; + pkgmgrinfo_appinfo_h handle; + + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_get_permission_type(handle, &permission); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("permission type: %d\n", permission); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_permission_type(pkgmgrinfo_appinfo_h handle, pkgmgrinfo_permission_type *permission); + +/** + * @fn int pkgmgrinfo_appinfo_get_component_type(pkgmgrinfo_appinfo_h handle, char **component_type) + * @brief This API gets the component_type + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the application info handle. + * @param[out] component_type pointer to hold component_type + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_pkgid() + * @see pkgmgrinfo_appinfo_is_multiple() + * @code +static int get_component_type(const char *appid) +{ + int ret = 0; + char *component_type = NULL; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_get_component_type(handle, &component_type); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("component_type: %s\n", component_type); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_component_type(pkgmgrinfo_appinfo_h handle, char **component_type); + +/** + * @fn int pkgmgrinfo_appinfo_get_hwacceleration(pkgmgrinfo_appinfo_h handle, pkgmgrinfo_app_hwacceleration *hwacceleration) + * @brief This API gets the application 'hwacceleration' value from the app ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to application info handle + * @param[out] hwacceleration pointer to hold package hwacceleration value + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @see pkgmgrinfo_appinfo_is_multiple() + * @code +static int get_app_hwacceleration(const char *appid) +{ + int ret = 0; + pkgmgrinfo_app_hwacceleration hwacceleration; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_get_hwacceleration(handle, &hwacceleration); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("app hwacceleration: %d\n", hwacceleration); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_hwacceleration(pkgmgrinfo_appinfo_h handle, pkgmgrinfo_app_hwacceleration *hwacceleration); + +/** + * @fn int pkgmgrinfo_appinfo_get_screenreader(pkgmgrinfo_appinfo_h handle, pkgmgrinfo_app_screenreader *screenreader) + * @brief This API gets the application 'screenreader' value from the app ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to application info handle + * @param[out] screenreader pointer to hold package accessibility value + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @see pkgmgrinfo_appinfo_is_multiple() + * @code +static int get_app_screenreader(const char *appid) +{ + int ret = 0; + pkgmgrinfo_app_screenreader screenreader = PMINFO_USE_SYSTEM_SETTING; + pkgmgrinfo_appinfo_h handle = NULL; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_get_screenreader(handle, &screenreader); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("app screenreader: %d\n", screenreader); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_screenreader(pkgmgrinfo_appinfo_h handle, pkgmgrinfo_app_screenreader *screenreader); + +/** + * @fn int pkgmgrinfo_appinfo_get_effectimage(pkgmgrinfo_appinfo_h handle, char **portrait_img, char **landscape_img) + * @brief This API gets the application's landscape & portrait effect images + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to application info handle + * @param[out] portrait_img contains portrait mode effect image + * @param[out] landscape_img contains landscape mode effect image + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @see pkgmgrinfo_appinfo_is_nodisplay() + * @code +static int get_app_effectimages(const char *appid) +{ + int ret = 0; + char *portraitimg = NULL; + char *landscapeimg = NULL; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_get_effectimage(handle, &portraitimg, &landscapeimg); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("app effect image portrait: %s, app effect image landscape : %s\n", portraitimg, landscapeimg); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_effectimage(pkgmgrinfo_appinfo_h handle, char **portrait_img, char **landscape_img); + +/** + * @fn int pkgmgrinfo_appinfo_get_effectimage_type(pkgmgrinfo_appinfo_h handle, char **effectimg_type) + * @brief This API gets the application's effect image type + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to application info handle + * @param[out] effectimg_type contains effect image type + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @see pkgmgrinfo_appinfo_is_nodisplay() + * @code +static int get_app_effectimage_type(const char *appid) +{ + int ret = 0; + char *effectimg_type = NULL; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_get_effectimage_type(handle, &effectimg_type); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("app effect image type: %s\n", effectimg_type); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_effectimage_type(pkgmgrinfo_appinfo_h handle, char **effectimg_type); + +/** + * @fn int pkgmgrinfo_appinfo_get_submode_mainid(pkgmgrinfo_appinfo_h handle, char **submode_mainid) + * @brief This API gets the submode_mainid of the application + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the application info handle. + * @param[out] submode_mainid pointer to hold package name + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @see pkgmgrinfo_appinfo_is_multiple() + * @code +static int get_app_submode_mainid(const char *appid) +{ + int ret = 0; + char *submode_mainid = NULL; + pkgmgrinfo_appinfo_h handle = NULL; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_get_submode_mainid(handle, &submode_mainid); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("submode_mainid: %s\n", submode_mainid); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_submode_mainid(pkgmgrinfo_appinfo_h handle, char **submode_mainid); + +/** + * @fn int pkgmgrinfo_appinfo_get_localed_label(const char *appid, const char *locale, char **label) + * @brief This API gets exactly matched label by given appid and locale + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] appid pointer to appid + * @param[in] locale pointer to locale + * @param[out] label pointer to hold app label + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @code +static int get_localed_label(const char *appid, const char *locale) +{ + int ret = 0; + char *label = NULL; + + ret = pkgmgrinfo_appinfo_get_localed_label(appid, locale, &label); + if (ret != PMINFO_R_OK) + return -1; + + printf("localed label: %s\n", label); + + free(label); + + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_localed_label(const char *appid, const char *locale, char **label); + +/** + * @fn int pkgmgrinfo_appinfo_get_metadata_value(pkgmgrinfo_appinfo_h handle, const char *metadata_key, char **metadata_value) + * @brief This API gets metadata value by given metadata key + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the application info handle + * @param[in] metadata_key metadata key + * @param[out] metadata_value pointer to hold metadata value + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @code +static int get_metadata_value(const char *appid, const char *metadata_key) +{ + int ret = 0; + pkgmgrinfo_appinfo_h handle; + char *metadata_value = NULL; + + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + + ret = pkgmgrinfo_appinfo_get_metadata_value(handle, metadata_key, &metadata_value); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_metadata_value(pkgmgrinfo_appinfo_h handle, const char *metadata_key, char **metadata_value); + +/** + * @fn int pkgmgrinfo_appinfo_get_multi_instance_mainid(pkgmgrinfo_appinfo_h handle, char **multi_instance_mainid) + * @brief This API gets the multi_instance_mainid of the application + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the application info handle. + * @param[out] multi_instance_mainid pointer to hold app multi_instance_mainid + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @see pkgmgrinfo_appinfo_is_multiple() + * @code +static int get_app_multi_instance_mainid(const char *appid) +{ + int ret = 0; + char *multi_instance_mainid = NULL; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_get_multi_instance_mainid(handle, &multi_instance_mainid); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("multi_instance_mainid: %s\n", multi_instance_mainid); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_multi_instance_mainid(pkgmgrinfo_appinfo_h handle, char **multi_instance_mainid); + +/** + * @fn int pkgmgrinfo_appinfo_get_datacontrol_info(const char *providerid, const char *type, char **appid, char **access); + * @brief This API gets the datacontrol info + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] providerid pointer to the providerid of dataconltrol. + * @param[in] type pointer to the type of dataconltrol. + * @param[out] appid pointer to hold appid, need to free after using + * @param[out] access pointer to hold access, need to free after using + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @endcode + */ +int pkgmgrinfo_appinfo_get_datacontrol_info(const char *providerid, const char *type, char **appid, char **access); + +/** + * @fn int pkgmgrinfo_appinfo_get_datacontrol_appid(const char *providerid, char **appid); + * @brief This API gets the appid of datacontrol + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] providerid pointer to the providerid of dataconltrol. + * @param[out] appid pointer to hold appid, need to free after using + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @endcode + */ +int pkgmgrinfo_appinfo_get_datacontrol_appid(const char *providerid, char **appid); + +/** + * @fn int pkgmgrinfo_appinfo_get_support_mode(pkgmgrinfo_appinfo_h handle, int *support_mode) + * @brief This API gets the support_mode of the application + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the application info handle. + * @param[out] support_mode pointer to hold app support_mode + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @code +static int get_app_support_mode(const char *appid) +{ + int ret = 0; + int support_mode = 0; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_get_support_mode(handle, &support_mode); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("support_mode: %s\n", support_mode); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_support_mode(pkgmgrinfo_appinfo_h handle, int *support_mode); + + +/** + * @fn int pkgmgrinfo_appinfo_get_support_feature(pkgmgrinfo_appinfo_h handle, int *support_feature) + * @brief This API gets the support_funtion of the application + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the application info handle. + * @param[out] support_feature pointer to hold app support_feature + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @code +static int get_app_support_feature(const char *appid) +{ + int ret = 0; + int support_feature = 0; + pkgmgrinfo_appinfo_h handle = NULL; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_get_support_feature(handle, &support_feature); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("support_feature: %d\n", support_feature); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_support_feature(pkgmgrinfo_appinfo_h handle, int *support_feature); + +/** + * @fn int pkgmgrinfo_appinfo_get_uginfo(const char *ug_name, pkgmgrinfo_appinfo_h *handle) + * @brief This API creates the application information handle from ug_name + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] ug_name pointer to ug_name + * @param[out] handle pointer to the application info handle. + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre None + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @code +static int get_app_uginfo(const char *ug_name) +{ + int ret = 0; + char *appid = NULL; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_uginfo(ug_name, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_get_appid(handle, &appid); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("appid: %s\n", appid); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_uginfo(const char *ug_name, pkgmgrinfo_appinfo_h *handle); + + +/** + * @fn int pkgmgrinfo_appinfo_get_aliasid(const char *app_id, char** alias_id) + * @brief This API get alias_id for an appid from pkgmgr DB. + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] appid pointer to application id + * @param[out] alias_id pointer to pointer of alias id. + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre None + * @post None + * @code +static int get_app_aliasid(const char *appid) +{ + int ret = 0; + char *alias_id = NULL; + ret = pkgmgrinfo_appinfo_get_aliasid(appid, &alias_id); + if (ret != PMINFO_R_OK){ + printf("Failed to get the aliasid for [%s]\n",appid); + return -1; + } + if(alias_id) + printf("aliasid: %s\n", alias_id); + else + printf("No alias_id found for %s\n",appid); + + if(alias_id) + free(alias_id); + return ret; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_aliasid(const char* appid, char** alias_id); + +/** + * @fn int pkgmgrinfo_appinfo_get_installed_time(pkgmgrinfo_appinfo_h handle, int *installed_time) + * @brief This API gets the installed_time of the application + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the application info handle. + * @param[out] installed_time pointer to hold installed_time + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @see pkgmgrinfo_appinfo_is_multiple() + * @code +static int get_app_installed_time(const char *appid) +{ + int ret = 0; + int installed_time = 0; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_get_installed_time(handle, &installed_time); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("installed_time: %d\n", installed_time); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_get_installed_time(pkgmgrinfo_appinfo_h handle, int *installed_time); + +/** + * @fn int pkgmgrinfo_appinfo_foreach_permission(pkgmgrinfo_appinfo_h handle, + pkgmgrinfo_app_permission_list_cb permission_func, void *user_data); + * @brief This API gets the list of permission for a particular application + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * @param[in] handle pointer to the application info handle. + * @param[in] permission_func callback function for list + * @param[in] user_data user data to be passed to callback function + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @code +int permission_func(const char *name, void *user_data) +{ + if (strcmp(name, (char *)user_data) == 0) + return -1; + else + return 0; +} + +static int list_permission(const char *appid, char *permission) +{ + int ret = 0; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_foreach_permission(handle, permission_func, (void *)permission); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_foreach_permission(pkgmgrinfo_appinfo_h handle, + pkgmgrinfo_app_permission_list_cb permission_func, void *user_data); + +/** + * @fn int pkgmgrinfo_appinfo_foreach_category(pkgmgrinfo_appinfo_h handle, + pkgmgrinfo_app_category_list_cb category_func, void *user_data); + * @brief This API gets the list of category for a particular application + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * @param[in] handle pointer to the application info handle. + * @param[in] category_func callback function for list + * @param[in] user_data user data to be passed to callback function + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @code +int category_func(const char *name, void *user_data) +{ + if (strcmp(name, (char *)user_data) == 0) + return -1; + else + return 0; +} + +static int list_category(const char *appid, char *category) +{ + int ret = 0; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_foreach_category(handle, category_func, (void *)category); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_foreach_category(pkgmgrinfo_appinfo_h handle, + pkgmgrinfo_app_category_list_cb category_func, void *user_data); + +/** + * @fn int pkgmgrinfo_appinfo_foreach_metadata(pkgmgrinfo_appinfo_h handle, + pkgmgrinfo_app_metadata_list_cb metadata_func, void *user_data); + * @brief This API gets the list of metadata for a particular application + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * @param[in] handle pointer to the application info handle. + * @param[in] metadata_func callback function for list + * @param[in] user_data user data to be passed to callback function + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @code +int metadata_func(const char *key, const char *value, void *user_data) +{ + if (strcmp(key, (char *)user_data) == 0) { + printf("Value is %s\n", value); + return -1; + } + else + return 0; +} + +static int list_metadata(const char *appid, char *key) +{ + int ret = 0; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_foreach_metadata(handle, metadata_func, (void *)key); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_foreach_metadata(pkgmgrinfo_appinfo_h handle, + pkgmgrinfo_app_metadata_list_cb metadata_func, void *user_data); + + +/** + * @fn int pkgmgrinfo_appinfo_foreach_appcontrol(pkgmgrinfo_appinfo_h handle, + pkgmgrinfo_app_control_list_cb appcontrol_func, void *user_data); + * @brief This API gets the list of app-control for a particular application + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * @param[in] handle pointer to the application info handle. + * @param[in] appcontrol_func callback function for list + * @param[in] user_data user data to be passed to callback function + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @code +int appcontrol_func(pkgmgrinfo_appcontrol_h handle, void *user_data) +{ + int oc = 0; + int i = 0; + char **operation; + pkgmgrinfo_appinfo_get_operation(handle, &oc, &operation); + for (i = 0; i < oc; i++) { + if (strcmp(operation[i], (char *)user_data) == 0) + return -1; + else + return 0; + } +} + +static int check_operation(const char *appid, char *operation) +{ + int ret = 0; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_foreach_appcontrol(handle, appcontrol_func, (void *)operation); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_foreach_appcontrol(pkgmgrinfo_appinfo_h handle, + pkgmgrinfo_app_control_list_cb appcontrol_func, void *user_data); + +/** + * @fn int pkgmgrinfo_appinfo_is_nodisplay(pkgmgrinfo_appinfo_h handle, bool *nodisplay) + * @brief This API gets the application 'nodisplay' value from the app ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to application info handle + * @param[out] nodisplay pointer to hold package nodisplay value + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @see pkgmgrinfo_appinfo_is_multiple() + * @code +static int get_app_nodisplay(const char *appid) +{ + int ret = 0; + bool nodisplay; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_is_nodisplay(handle, &nodisplay); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("app nodisplay: %d\n", nodisplay); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_is_nodisplay(pkgmgrinfo_appinfo_h handle, bool *nodisplay); + +/** + * @fn int pkgmgrinfo_appinfo_is_multiple(pkgmgrinfo_appinfo_h handle, bool *multiple) + * @brief This API gets the application 'multiple' value from the app ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to application info handle + * @param[out] multiple pointer to hold package multiple value + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @see pkgmgrinfo_appinfo_is_nodisplay() + * @code +static int get_app_multiple(const char *appid) +{ + int ret = 0; + bool multiple; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_is_multiple(handle, &multiple); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("app multiple: %d\n", multiple); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_is_multiple(pkgmgrinfo_appinfo_h handle, bool *multiple); + +/** + * @fn int pkgmgrinfo_appinfo_is_indicator_display_allowed(pkgmgrinfo_appinfo_h handle, bool *indicator_disp) + * @brief This API gets the application 'indicatordisplay' value. If true, indicator will be displayed during + * application launching effect. If fales, indicator will be hidden during application launching effect + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to application info handle + * @param[out] indicator_disp contains indicator display status for application launching effect + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @see pkgmgrinfo_appinfo_is_nodisplay() + * @code +static int get_app_indicator_display(const char *appid) +{ + int ret = 0; + bool indicator_disp; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_is_indicator_display_allowed(handle, &indicator_disp); + if (ret != PMINFO_R_OK){ + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("app indicator disp : %d\n", indicator_disp); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_is_indicator_display_allowed(pkgmgrinfo_appinfo_h handle, bool *indicator_disp); + +/** + * @fn int pkgmgrinfo_appinfo_is_taskmanage(pkgmgrinfo_appinfo_h handle, bool *taskmanage) + * @brief This API gets the application 'taskmanage' value from the app ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to application info handle + * @param[out] taskmanage pointer to hold package taskmanage value + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @see pkgmgrinfo_appinfo_is_multiple() + * @code +static int get_app_taskmanage(const char *appid) +{ + int ret = 0; + bool taskmanage; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_is_taskmanage(handle, &taskmanage); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("app taskmanage: %d\n", taskmanage); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_is_taskmanage(pkgmgrinfo_appinfo_h handle, bool *taskmanage); + +/** + * @fn int pkgmgrinfo_appinfo_is_enabled(pkgmgrinfo_appinfo_h handle, bool *enabled) + * @brief This API gets the application 'taskmanage' value from the app ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to application info handle + * @param[out] enabled pointer to hold package enabled value + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @see pkgmgrinfo_appinfo_is_multiple() + * @code +static int get_app_enabled(const char *appid) +{ + int ret = 0; + bool enabled; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_is_taskmanage(handle, &enabled); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("app enabled: %d\n", enabled); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_is_enabled(pkgmgrinfo_appinfo_h handle, bool *enabled); + +/** + * @fn int pkgmgrinfo_appinfo_is_onboot(pkgmgrinfo_appinfo_h handle, bool *onboot) + * @brief This API gets the application 'onboot' value from the app ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to application info handle + * @param[out] onboot pointer to hold package onboot value + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @see pkgmgrinfo_appinfo_is_multiple() + * @code +static int get_app_onboot(const char *appid) +{ + int ret = 0; + bool onboot; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_is_onboot(handle, &onboot); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("app onboot: %d\n", onboot); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_is_onboot(pkgmgrinfo_appinfo_h handle, bool *onboot); + +/** + * @fn int pkgmgrinfo_appinfo_is_autorestart(pkgmgrinfo_appinfo_h handle, bool *autorestart) + * @brief This API gets the application 'autorestart' value from the app ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to application info handle + * @param[out] autorestart pointer to hold package autorestart value + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @see pkgmgrinfo_appinfo_is_multiple() + * @code +static int get_app_autorestart(const char *appid) +{ + int ret = 0; + bool autorestart; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_is_autorestart(handle, &autorestart); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("app autorestart: %d\n", autorestart); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_is_autorestart(pkgmgrinfo_appinfo_h handle, bool *autorestart); + +/** + * @fn int pkgmgrinfo_appinfo_is_mainapp(pkgmgrinfo_appinfo_h handle, bool *mainapp) + * @brief This API gets the value for given application is main app or not from handle + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to application info handle + * @param[out] mainapp pointer to hold package mainapp is or not + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @see pkgmgrinfo_appinfo_is_multiple() + * @code +static int get_app_mainapp(const char *appid) +{ + int ret = 0; + bool mainapp; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_is_mainapp(handle, &mainapp); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("mainapp: %d\n", mainapp); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_is_mainapp(pkgmgrinfo_appinfo_h handle, bool *mainapp); + + +/** + * @fn int pkgmgrinfo_appinfo_is_preload(pkgmgrinfo_appinfo_h handle, bool *preload) + * @brief This API gets the value for given application is preload or not from handle + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to application info handle + * @param[out] preload pointer to hold preload is or not + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @see pkgmgrinfo_appinfo_is_multiple() + * @code +static int get_app_preload(const char *appid) +{ + int ret = 0; + bool preload = 0; + pkgmgrinfo_appinfo_h handle = NULL; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_is_preload(handle, &preload); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("preload: %d\n", preload); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_is_preload(pkgmgrinfo_appinfo_h handle, bool *preload); + +/** + * @fn int pkgmgrinfo_appinfo_is_submode(pkgmgrinfo_appinfo_h handle, bool *submode) + * @brief This API gets the value for given application is submode or not from handle + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to application info handle + * @param[out] submode pointer to hold submode is or not + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @see pkgmgrinfo_appinfo_is_multiple() + * @code +static int get_app_submode(const char *appid) +{ + int ret = 0; + bool submode = 0; + pkgmgrinfo_appinfo_h handle = NULL; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_is_submode(handle, &submode); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("submode: %d\n", submode); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_is_submode(pkgmgrinfo_appinfo_h handle, bool *submode); + +/** + * @fn int int pkgmgrinfo_appinfo_is_process_pool(pkgmgrinfo_appinfo_h handle, bool *process_pool) + * @brief This API gets the value for given application is process_pool or not from handle + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to application info handle + * @param[out] process_pool pointer to hold process_pool is or not + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @code +static int get_app_process_pool(const char *appid) +{ + int ret = 0; + bool process_pool = 0; + pkgmgrinfo_appinfo_h handle = NULL; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_is_process_pool(handle, &process_pool); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("process_pool: %d\n", process_pool); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_is_process_pool(pkgmgrinfo_appinfo_h handle, bool *process_pool); + +/** + * @fn int pkgmgrinfo_appinfo_is_category_exist(pkgmgrinfo_appinfo_h handle, const char *category, bool *exist) + * @brief This API checks if the application has the given category + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the application info handle + * @param[in] category category + * @param[out] exist value Gets whether the application has the given category + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @code +static int is_category_exist(const char *appid, const char *category) +{ + int ret = 0; + pkgmgrinfo_appinfo_h handle; + bool exist = false; + + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + + ret = pkgmgrinfo_appinfo_is_category_exist(handle, category, &exist); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_is_category_exist(pkgmgrinfo_appinfo_h handle, const char *category, bool *exist); + + +/** + * @fn int pkgmgrinfo_appinfo_is_multi_instance(pkgmgrinfo_appinfo_h handle, bool *multi_instance) + * @brief This API gets the application 'multi_instance' value from the app ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to application info handle + * @param[out] multi_instance pointer to hold package multi_instance value + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @see pkgmgrinfo_appinfo_is_multiple() + * @code +static int get_app_multi_instance(const char *appid) +{ + int ret = 0; + bool multi_instance; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_is_multi_instance(handle, &multi_instance); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("app multi_instance: %d\n", multi_instance); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_is_multi_instance(pkgmgrinfo_appinfo_h handle, bool *multi_instance); + +/** + * @fn int pkgmgrinfo_appinfo_is_multi_window(pkgmgrinfo_appinfo_h handle, bool *multi_window) + * @brief This API gets the application 'multi_window' value from the app ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to application info handle + * @param[out] multi_window pointer to hold package multi_window value + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @see pkgmgrinfo_appinfo_is_multiple() + * @code +static int get_app_multi_window(const char *appid) +{ + int ret = 0; + bool multi_window; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_is_multi_window(handle, &multi_window); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("app multi_window: %d\n", multi_window); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_is_multi_window(pkgmgrinfo_appinfo_h handle, bool *multi_window); + +/** + * @fn int pkgmgrinfo_appinfo_is_support_disable(pkgmgrinfo_appinfo_h handle, bool *support_disable) + * @brief This API gets the application 'support_disable' value from the app ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to application info handle + * @param[out] support_disable pointer to hold package support_disable value + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @code +static int get_app_support_disable(const char *appid) +{ + int ret = 0; + bool support_disable; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_is_support_disable(handle, &support_disable); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("app support_disable: %d\n", support_disable); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_is_support_disable(pkgmgrinfo_appinfo_h handle, bool *support_disable); + +/** + * @fn int pkgmgrinfo_appinfo_is_ui_gadget(pkgmgrinfo_appinfo_h handle, bool *ui_gadget) + * @brief This API gets the application 'ui_gadget' value from the app ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to application info handle + * @param[out] ui_gadget pointer to hold package ui_gadget value + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @code +static int get_app_ui_gadget(const char *appid) +{ + int ret = 0; + bool ui_gadget; + pkgmgrinfo_appinfo_h handle = NULL; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_is_ui_gadget(handle, &ui_gadget); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("app ui_gadget: %d\n", ui_gadget); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_is_ui_gadget(pkgmgrinfo_appinfo_h handle, bool *ui_gadget); + +/** + * @fn int pkgmgrinfo_appinfo_is_removable(pkgmgrinfo_appinfo_h handle, bool *removable) + * @brief This API gets the application 'removable' value from the app ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to application info handle + * @param[out] removable pointer to hold package removable value + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @code +static int get_app_removable(const char *appid) +{ + int ret = 0; + bool removable; + pkgmgrinfo_appinfo_h handle = NULL; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_is_removable(handle, &removable); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("app removable: %d\n", removable); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_is_removable(pkgmgrinfo_appinfo_h handle, bool *removable); + +/** + * @fn int pkgmgrinfo_appinfo_is_system(pkgmgrinfo_appinfo_h handle, bool *system) + * @brief This API gets the application 'system' value from the app ID + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to application info handle + * @param[out] system pointer to hold package system value + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post pkgmgrinfo_appinfo_destroy_appinfo() + * @see pkgmgrinfo_appinfo_get_appid() + * @code +static int get_app_system(const char *appid) +{ + int ret = 0; + bool system = false; + pkgmgrinfo_appinfo_h handle = NULL; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_is_system(handle, &system); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("app system: %d\n", system); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_is_system(pkgmgrinfo_appinfo_h handle, bool *system); + +/** + * @fn int pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo_h handle) + * @brief This API destroys the application information handle freeing up all the resources + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the application info handle. + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_get_appinfo() + * @post None + * @see pkgmgrinfo_appinfo_get_pkgid() + * @see pkgmgrinfo_appinfo_is_multiple() + * @code +static int get_app_type(const char *appid) +{ + int ret = 0; + char *type = NULL; + pkgmgrinfo_appinfo_h handle; + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_get_apptype(handle, &type); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return -1; + } + printf("apptype: %s\n", type); + pkgmgrinfo_appinfo_destroy_appinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo_h handle); + +/** + * @fn int pkgmgrinfo_appinfo_filter_create(pkgmgrinfo_appinfo_filter_h *handle) + * @brief This API creates the application information filter handle from db. All filter properties will be ANDed. + The query will search the entire application information collected from the manifest file of all the installed packages + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[out] handle pointer to the application info filter handle. + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre None + * @post pkgmgrinfo_appinfo_filter_destroy() + * @see pkgmgrinfo_appinfo_filter_count() + * @see pkgmgrinfo_appinfo_filter_foreach_appinfo() + * @code +static int get_capp_count() +{ + int ret = 0; + int count = 0; + pkgmgrinfo_appinfo_filter_h handle; + ret = pkgmgrinfo_appinfo_filter_create(&handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_filter_add_string(handle, PMINFO_APPINFO_PROP_APP_TYPE, "capp"); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_filter_destroy(handle); + return -1; + } + ret = pkgmgrinfo_appinfo_filter_count(handle, &count); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_filter_destroy(handle); + return -1; + } + printf("No of capp: %d\n", count); + pkgmgrinfo_appinfo_filter_destroy(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_filter_create(pkgmgrinfo_appinfo_filter_h *handle); + +/** + * @fn int pkgmgrinfo_appinfo_filter_destroy(pkgmgrinfo_appinfo_filter_h handle) + * @brief This API destroys the application information filter handle freeing up all the resources + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the application info filter handle. + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_filter_create() + * @post None + * @see pkgmgrinfo_appinfo_filter_count() + * @see pkgmgrinfo_appinfo_filter_foreach_appinfo() + * @code +static int get_capp_count() +{ + int ret = 0; + int count = 0; + pkgmgrinfo_appinfo_filter_h handle; + ret = pkgmgrinfo_appinfo_filter_create(&handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_filter_add_string(handle, PMINFO_APPINFO_PROP_APP_TYPE, "capp"); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_filter_destroy(handle); + return -1; + } + ret = pkgmgrinfo_appinfo_filter_count(handle, &count); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_filter_destroy(handle); + return -1; + } + printf("No of capp: %d\n", count); + pkgmgrinfo_appinfo_filter_destroy(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_filter_destroy(pkgmgrinfo_appinfo_filter_h handle); + +/** + * @fn int pkgmgrinfo_appinfo_filter_add_bool(pkgmgrinfo_appinfo_filter_h handle, const char *property, const bool value) + * @brief This API adds a boolean filter property to the filter handle + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the application info filter handle. + * @param[in] property boolean property name. + * @param[in] value value corresponding to the property. + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_filter_create() + * @post pkgmgrinfo_appinfo_filter_destroy() + * @see pkgmgrinfo_appinfo_filter_count() + * @see pkgmgrinfo_appinfo_filter_foreach_appinfo() + * @code +static int get_taskmanageable_app_count() +{ + int ret = 0; + int count = 0; + pkgmgrinfo_appinfo_filter_h handle; + ret = pkgmgrinfo_appinfo_filter_create(&handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_filter_add_bool(handle, PMINFO_APPINFO_PROP_APP_TASKMANAGE, 1); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_filter_destroy(handle); + return -1; + } + ret = pkgmgrinfo_appinfo_filter_count(handle, &count); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_filter_destroy(handle); + return -1; + } + printf("No of taskmanageable apps: %d\n", count); + pkgmgrinfo_appinfo_filter_destroy(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_filter_add_bool(pkgmgrinfo_appinfo_filter_h handle, + const char *property, const bool value); + +/** + * @fn int pkgmgrinfo_appinfo_filter_add_int(pkgmgrinfo_appinfo_filter_h handle, const char *property, const int value) + * @brief This API adds an integer filter property to the filter handle + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the application info filter handle. + * @param[in] property integer property name. + * @param[in] value value corresponding to the property. + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_filter_create() + * @post pkgmgrinfo_appinfo_filter_destroy() + * @see pkgmgrinfo_appinfo_filter_count() + * @see pkgmgrinfo_appinfo_filter_foreach_appinfo() + * @code +static int get_taskmanageable_app_count() +{ + int ret = 0; + int count = 0; + pkgmgrinfo_appinfo_filter_h handle; + ret = pkgmgrinfo_appinfo_filter_create(&handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_filter_add_bool(handle, PMINFO_APPINFO_PROP_APP_XXX, 10); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_filter_destroy(handle); + return -1; + } + ret = pkgmgrinfo_appinfo_filter_count(handle, &count); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_filter_destroy(handle); + return -1; + } + printf("No of apps: %d\n", count); + pkgmgrinfo_appinfo_filter_destroy(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_filter_add_int(pkgmgrinfo_appinfo_filter_h handle, + const char *property, const int value); + +/** + * @fn int pkgmgrinfo_appinfo_filter_add_string(pkgmgrinfo_appinfo_filter_h handle, const char *property, const char *value) + * @brief This API adds a string filter property to the filter handle + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the application info filter handle. + * @param[in] property string property name. + * @param[in] value value corresponding to the property. + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_filter_create() + * @post pkgmgrinfo_appinfo_filter_destroy() + * @see pkgmgrinfo_appinfo_filter_count() + * @see pkgmgrinfo_appinfo_filter_foreach_appinfo() + * @code +static int get_capp_count() +{ + int ret = 0; + int count = 0; + pkgmgrinfo_appinfo_filter_h handle; + ret = pkgmgrinfo_appinfo_filter_create(&handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_filter_add_string(handle, PMINFO_APPINFO_PROP_APP_TYPE, "capp"); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_filter_destroy(handle); + return -1; + } + ret = pkgmgrinfo_appinfo_filter_count(handle, &count); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_filter_destroy(handle); + return -1; + } + printf("No of capp: %d\n", count); + pkgmgrinfo_appinfo_filter_destroy(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_filter_add_string(pkgmgrinfo_appinfo_filter_h handle, + const char *property, const char *value); + +/** + * @fn int pkgmgrinfo_appinfo_filter_foreach_appinfo(pkgmgrinfo_appinfo_filter_h handle, pkgmgrinfo_app_list_cb app_cb, void *user_data) + * @brief This API executes the user supplied callback function for each application that satisfy the filter conditions + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the application info filter handle. + * @param[in] app_cb callback function. + * @param[in] user_data user data to be passed to the callback function + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_filter_create() + * @post pkgmgrinfo_appinfo_filter_destroy() + * @see pkgmgrinfo_appinfo_filter_count() + * @code +int app_list_cb(pkgmgrinfo_appinfo_h handle, void *user_data) +{ + char *appid = NULL; + pkgmgrinfo_appinfo_get_appid(handle, &appid); + printf("appid : %s\n", appid); + return 0; +} + +static int get_capp_list() +{ + int ret = 0; + pkgmgrinfo_appinfo_filter_h handle; + ret = pkgmgrinfo_appinfo_filter_create(&handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_filter_add_string(handle, PMINFO_APPINFO_PROP_APP_TYPE, "capp"); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_filter_destroy(handle); + return -1; + } + ret = pkgmgrinfo_appinfo_filter_foreach_appinfo(handle, app_list_cb, NULL); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_filter_destroy(handle); + return -1; + } + pkgmgrinfo_appinfo_filter_destroy(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_filter_foreach_appinfo(pkgmgrinfo_appinfo_filter_h handle, + pkgmgrinfo_app_list_cb app_cb, void *user_data); + +/** + * @fn int pkgmgrinfo_appinfo_filter_count(pkgmgrinfo_appinfo_filter_h handle, int *count) + * @brief This API counts the application that satisfy the filter conditions + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the application info filter handle. + * @param[in] count pointer to store count value + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_filter_create() + * @post pkgmgrinfo_appinfo_filter_destroy() + * @see pkgmgrinfo_appinfo_filter_foreach_appinfo() + * @code +static int get_capp_count() +{ + int ret = 0; + int count = 0; + pkgmgrinfo_appinfo_filter_h handle; + ret = pkgmgrinfo_appinfo_filter_create(&handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_filter_add_string(handle, PMINFO_APPINFO_PROP_APP_TYPE, "capp"); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_filter_destroy(handle); + return -1; + } + ret = pkgmgrinfo_appinfo_filter_count(handle, &count); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_filter_destroy(handle); + return -1; + } + printf("No of capp: %d\n", count); + pkgmgrinfo_appinfo_filter_destroy(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_filter_count(pkgmgrinfo_appinfo_filter_h handle, int *count); + +/** + * @fn int pkgmgrinfo_appinfo_metadata_filter_create(pkgmgrinfo_appinfo_metadata_filter_h *handle) + * @brief This API creates the application's metadata information filter handle from db. + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[out] handle pointer to the application metadata info filter handle. + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre None + * @post pkgmgrinfo_appinfo_metadata_filter_destroy() + * @see pkgmgrinfo_appinfo_metadata_filter_foreach() + * @code +int app_list_cb(pkgmgrinfo_appinfo_h handle, void *user_data) +{ + char *appid = NULL; + pkgmgrinfo_appinfo_get_appid(handle, &appid); + printf("appid : %s\n", appid); + return 0; +} + +static int get_app_list(const char *mkey, const char *mvalue) +{ + int ret = 0; + pkgmgrinfo_appinfo_metadata_filter_h handle; + ret = pkgmgrinfo_appinfo_metadata_filter_create(&handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_metadata_filter_add(handle, mkey, mvalue); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_metadata_filter_destroy(handle); + return -1; + } + ret = pkgmgrinfo_appinfo_metadata_filter_foreach(handle, app_list_cb, NULL); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_metadata_filter_destroy(handle); + return -1; + } + pkgmgrinfo_appinfo_metadata_filter_destroy(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_metadata_filter_create(pkgmgrinfo_appinfo_metadata_filter_h *handle); + +/** + * @fn int pkgmgrinfo_appinfo_metadata_filter_destroy(pkgmgrinfo_appinfo_metadata_filter_h handle) + * @brief This API destroys the application's metadata information filter handle. + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the application metadata info filter handle. + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_metadata_filter_create() + * @post None + * @see pkgmgrinfo_appinfo_metadata_filter_foreach() + * @code +int app_list_cb(pkgmgrinfo_appinfo_h handle, void *user_data) +{ + char *appid = NULL; + pkgmgrinfo_appinfo_get_appid(handle, &appid); + printf("appid : %s\n", appid); + return 0; +} + +static int get_app_list(const char *mkey, const char *mvalue) +{ + int ret = 0; + pkgmgrinfo_appinfo_metadata_filter_h handle; + ret = pkgmgrinfo_appinfo_metadata_filter_create(&handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_metadata_filter_add(handle, mkey, mvalue); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_metadata_filter_destroy(handle); + return -1; + } + ret = pkgmgrinfo_appinfo_metadata_filter_foreach(handle, app_list_cb, NULL); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_metadata_filter_destroy(handle); + return -1; + } + pkgmgrinfo_appinfo_metadata_filter_destroy(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_metadata_filter_destroy(pkgmgrinfo_appinfo_metadata_filter_h handle); + +/** + * @fn int pkgmgrinfo_appinfo_metadata_filter_add(pkgmgrinfo_appinfo_metadata_filter_h handle, const char *key, const char *value) + * @brief This API adds filter condition for the query API. The query will search the entire application metadata information collected from + * the manifest file of all the installed packages. You can specify value as NULL to search based on key only. + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the application metadata info filter handle. + * @param[in] key pointer to metadata key + * @param[in] value pointer to metadata value + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_metadata_filter_create() + * @post pkgmgrinfo_appinfo_metadata_filter_foreach(), pkgmgrinfo_appinfo_metadata_filter_destroy() + * @see pkgmgrinfo_appinfo_metadata_filter_foreach() + * @code +int app_list_cb(pkgmgrinfo_appinfo_h handle, void *user_data) +{ + char *appid = NULL; + pkgmgrinfo_appinfo_get_appid(handle, &appid); + printf("appid : %s\n", appid); + return 0; +} + +static int get_app_list(const char *mkey, const char *mvalue) +{ + int ret = 0; + pkgmgrinfo_appinfo_metadata_filter_h handle; + ret = pkgmgrinfo_appinfo_metadata_filter_create(&handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_metadata_filter_add(handle, mkey, mvalue); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_metadata_filter_destroy(handle); + return -1; + } + ret = pkgmgrinfo_appinfo_metadata_filter_foreach(handle, app_list_cb, NULL); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_metadata_filter_destroy(handle); + return -1; + } + pkgmgrinfo_appinfo_metadata_filter_destroy(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_metadata_filter_add(pkgmgrinfo_appinfo_metadata_filter_h handle, + const char *key, const char *value); + +/** + * @fn int pkgmgrinfo_appinfo_metadata_filter_foreach(pkgmgrinfo_appinfo_metadata_filter_h handle, pkgmgrinfo_app_list_cb app_cb, void *user_data) + * @brief This API executes the filter query. The query will search the entire application metadata information collected from + * the manifest file of all the installed packages. For each application returned by the query, the callback will be called. If callback returns + * negative value, no more callbacks will be called and API will return. + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the application metadata info filter handle. + * @param[in] app_cb function pointer to callback + * @param[in] user_data pointer to user data + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_appinfo_metadata_filter_create() + * @post pkgmgrinfo_appinfo_metadata_filter_destroy() + * @code +int app_list_cb(pkgmgrinfo_appinfo_h handle, void *user_data) +{ + char *appid = NULL; + pkgmgrinfo_appinfo_get_appid(handle, &appid); + printf("appid : %s\n", appid); + return 0; +} + +static int get_app_list(const char *mkey, const char *mvalue) +{ + int ret = 0; + pkgmgrinfo_appinfo_metadata_filter_h handle; + ret = pkgmgrinfo_appinfo_metadata_filter_create(&handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_appinfo_metadata_filter_add(handle, mkey, mvalue); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_metadata_filter_destroy(handle); + return -1; + } + ret = pkgmgrinfo_appinfo_metadata_filter_foreach(handle, app_list_cb, NULL); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_metadata_filter_destroy(handle); + return -1; + } + pkgmgrinfo_appinfo_metadata_filter_destroy(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_appinfo_metadata_filter_foreach(pkgmgrinfo_appinfo_metadata_filter_h handle, + pkgmgrinfo_app_list_cb app_cb, void *user_data); + +/** + * @fn int pkgmgrinfo_pkginfo_create_certinfo(pkgmgrinfo_certinfo_h *handle) + * @brief This API creates the package cert information handle to get data from db. + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[out] handle pointer to the package cert handle. + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre None + * @post pkgmgrinfo_pkginfo_destroy_certinfo() + * @see pkgmgrinfo_pkginfo_get_cert_value() + * @see pkgmgrinfo_pkginfo_load_certinfo() + * @code +static int get_cert_info(const char *pkgid) +{ + int ret = 0; + pkgmgrinfo_certinfo_h handle; + char *auth_cert = NULL; + ret = pkgmgrinfo_pkginfo_create_certinfo(&handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_load_certinfo(pkgid, handle); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_certinfo(handle); + return -1; + } + ret = pkgmgrinfo_pkginfo_get_cert_value(handle, PMINFO_AUTHOR_ROOT_CERT, &auth_cert); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_certinfo(handle); + return -1; + } + printf("Author root certificate: %s\n", auth_root); + pkgmgrinfo_pkginfo_destroy_certinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_create_certinfo(pkgmgrinfo_certinfo_h *handle); + +/** + * @fn int pkgmgrinfo_pkginfo_load_certinfo(const char *pkgid, pkgmgrinfo_certinfo_h handle) + * @brief This API loads the package cert information handle with data from db. + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] pkgid pointer to the package ID. + * @param[in] handle pointer to the package cert handle. + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_create_certinfo() + * @post pkgmgrinfo_pkginfo_destroy_certinfo() + * @see pkgmgrinfo_pkginfo_get_cert_value() + * @code +static int get_cert_info(const char *pkgid) +{ + int ret = 0; + pkgmgrinfo_certinfo_h handle; + char *auth_cert = NULL; + ret = pkgmgrinfo_pkginfo_create_certinfo(&handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_load_certinfo(pkgid, handle); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_certinfo(handle); + return -1; + } + ret = pkgmgrinfo_pkginfo_get_cert_value(handle, PMINFO_AUTHOR_ROOT_CERT, &auth_cert); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_certinfo(handle); + return -1; + } + printf("Author root certificate: %s\n", auth_root); + pkgmgrinfo_pkginfo_destroy_certinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_load_certinfo(const char *pkgid, pkgmgrinfo_certinfo_h handle); + +/** + * @fn int pkgmgrinfo_pkginfo_get_cert_value(pkgmgrinfo_certinfo_h handle, pkgmgrinfo_cert_type cert_type, const char **cert_value) + * @brief This API gets the package cert information from the handle + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the package cert handle. + * @param[in] cert_type certificate type + * @param[out] cert_value pointer to hold certificate value + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_create_certinfo() + * @post pkgmgrinfo_pkginfo_destroy_certinfo() + * @see pkgmgrinfo_pkginfo_load_certinfo() + * @code +static int get_cert_info(const char *pkgid) +{ + int ret = 0; + pkgmgrinfo_certinfo_h handle; + char *auth_cert = NULL; + ret = pkgmgrinfo_pkginfo_create_certinfo(&handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_load_certinfo(pkgid, handle); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_certinfo(handle); + return -1; + } + ret = pkgmgrinfo_pkginfo_get_cert_value(handle, PMINFO_AUTHOR_ROOT_CERT, &auth_cert); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_certinfo(handle); + return -1; + } + printf("Author root certificate: %s\n", auth_root); + pkgmgrinfo_pkginfo_destroy_certinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_get_cert_value(pkgmgrinfo_certinfo_h handle, pkgmgrinfo_cert_type cert_type, const char **cert_value); + +/** + * @fn int pkgmgrinfo_pkginfo_destroy_certinfo(pkgmgrinfo_certinfo_h handle) + * @brief This API destroys the package cert information handle freeing up all the resources + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the package cert handle. + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_pkginfo_create_certinfo() + * @post None + * @see pkgmgrinfo_pkginfo_load_certinfo() + * @code +static int get_cert_info(const char *pkgid) +{ + int ret = 0; + pkgmgrinfo_certinfo_h handle; + char *auth_cert = NULL; + ret = pkgmgrinfo_pkginfo_create_certinfo(&handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_pkginfo_load_certinfo(pkgid, handle); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_certinfo(handle); + return -1; + } + ret = pkgmgrinfo_pkginfo_get_cert_value(handle, PMINFO_AUTHOR_ROOT_CERT, &auth_cert); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_pkginfo_destroy_certinfo(handle); + return -1; + } + printf("Author root certificate: %s\n", auth_root); + pkgmgrinfo_pkginfo_destroy_certinfo(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_pkginfo_destroy_certinfo(pkgmgrinfo_certinfo_h handle); + +/** + * @fn int pkgmgrinfo_delete_certinfo(const char *pkgid) + * @brief This API deletes the package cert information from DB + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] pkgid pointer to the package ID. + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre None + * @post None + * @code +static int delete_cert_info(const char *pkgid) +{ + int ret = 0; + ret = pkgmgrinfo_delete_certinfo(pkgid); + if (ret != PMINFO_R_OK) + return -1; + return 0; +} + * @endcode + */ + int pkgmgrinfo_delete_certinfo(const char *pkgid); + + +/** + * @fn int pkgmgrinfo_create_certinfo_set_handle(pkgmgrinfo_instcertinfo_h *handle) + * @brief This API creates the package cert information handle to set data in db. + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[out] handle pointer to the package cert handle. + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre None + * @post pkgmgrinfo_destroy_certinfo_set_handle() + * @see pkgmgrinfo_set_cert_value() + * @see pkgmgrinfo_save_certinfo() + * @code +static int set_cert_in_db(const char *pkgid) +{ + int ret = 0; + pkgmgrinfo_instcertinfo_h handle; + ret = pkgmgrinfo_create_certinfo_set_handle(&handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_set_cert_value(handle, PMINFO_SET_AUTHOR_ROOT_CERT, "author root certificate"); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_destroy_certinfo_set_handle(handle); + return -1; + } + ret = pkgmgrinfo_save_pkgdbinfo(pkgid, handle); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_destroy_certinfo_set_handle(handle); + return -1; + } + pkgmgrinfo_destroy_certinfo_set_handle(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_create_certinfo_set_handle(pkgmgrinfo_instcertinfo_h *handle); + +/** + * @fn int pkgmgrinfo_set_cert_value(pkgmgrinfo_instcertinfo_h handle, pkgmgrinfo_instcert_type cert_type, char *cert_value) + * @brief This API sets the package cert information in the handle. + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the package cert handle. + * @param[in] cert_type certificate type. + * @param[in] cert_value certificate value. + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_create_certinfo_set_handle() + * @post pkgmgrinfo_destroy_certinfo_set_handle() + * @see pkgmgrinfo_save_certinfo() + * @code +static int set_cert_in_db(const char *pkgid) +{ + int ret = 0; + pkgmgrinfo_instcertinfo_h handle; + ret = pkgmgrinfo_create_certinfo_set_handle(&handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_set_cert_value(handle, PMINFO_SET_AUTHOR_ROOT_CERT, "author root certificate"); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_destroy_certinfo_set_handle(handle); + return -1; + } + ret = pkgmgrinfo_save_pkgdbinfo(pkgid, handle); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_destroy_certinfo_set_handle(handle); + return -1; + } + pkgmgrinfo_destroy_certinfo_set_handle(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_set_cert_value(pkgmgrinfo_instcertinfo_h handle, pkgmgrinfo_instcert_type cert_type, char *cert_value); + +/** + * @fn int pkgmgrinfo_save_certinfo(const char *pkgid, pkgmgrinfo_instcertinfo_h handle) + * @brief This API saves the package cert information in the DB. + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] pkgid pointer to the package ID. + * @param[in] handle pointer to the package cert handle. + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_create_certinfo_set_handle() + * @post pkgmgrinfo_destroy_certinfo_set_handle() + * @see pkgmgrinfo_save_certinfo() + * @code +static int set_cert_in_db(const char *pkgid) +{ + int ret = 0; + pkgmgrinfo_instcertinfo_h handle; + ret = pkgmgrinfo_create_certinfo_set_handle(&handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_set_cert_value(handle, PMINFO_SET_AUTHOR_ROOT_CERT, "author root certificate"); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_destroy_certinfo_set_handle(handle); + return -1; + } + ret = pkgmgrinfo_save_pkgdbinfo(pkgid, handle); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_destroy_certinfo_set_handle(handle); + return -1; + } + pkgmgrinfo_destroy_certinfo_set_handle(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_save_certinfo(const char *pkgid, pkgmgrinfo_instcertinfo_h handle); + +/** + * @fn int pkgmgrinfo_destroy_certinfo_set_handle(pkgmgrinfo_instcertinfo_h handle) + * @brief This API destroys the package cert information handle freeing up all the resources. + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] handle pointer to the package cert handle. + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgrinfo_create_certinfo_set_handle() + * @post None + * @see pkgmgrinfo_save_certinfo() + * @code +static int set_cert_in_db(const char *pkgid) +{ + int ret = 0; + pkgmgrinfo_instcertinfo_h handle; + ret = pkgmgrinfo_create_certinfo_set_handle(&handle); + if (ret != PMINFO_R_OK) + return -1; + ret = pkgmgrinfo_set_cert_value(handle, PMINFO_SET_AUTHOR_ROOT_CERT, "author root certificate"); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_destroy_certinfo_set_handle(handle); + return -1; + } + ret = pkgmgrinfo_save_pkgdbinfo(pkgid, handle); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_destroy_certinfo_set_handle(handle); + return -1; + } + pkgmgrinfo_destroy_certinfo_set_handle(handle); + return 0; +} + * @endcode + */ +int pkgmgrinfo_destroy_certinfo_set_handle(pkgmgrinfo_instcertinfo_h handle); + +/** + * @fn int pkgmgrinfo_pkginfo_set_preload(const char *pkgid, int preload) + * @brief This API sets the package 'preload' value in db + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] pkgid pointer to the package ID. + * @param[in] preload package preload value + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + */ +int pkgmgrinfo_pkginfo_set_preload(const char *pkgid, int preload); + +/** + * @fn int pkgmgrinfo_pkginfo_set_installed_storage(const char *pkgid, INSTALL_LOCATION location) + * @brief This API sets the package 'installed_storage' value in db + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] pkgid pointer to the package ID. + * @param[in] location package install location + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + */ +int pkgmgrinfo_pkginfo_set_installed_storage(const char *pkgid, INSTALL_LOCATION location); + +/** + * @pkgmgrinfo client API +**/ + +/** + * @brief listening status type in pkgmgrinfo. + */ +#define PMINFO_CLIENT_STATUS_ALL 0x00 +#define PMINFO_CLIENT_STATUS_INSTALL 0x01 +#define PMINFO_CLIENT_STATUS_UNINSTALL 0x02 +#define PMINFO_CLIENT_STATUS_UPGRADE 0x04 +#define PMINFO_CLIENT_STATUS_MOVE 0x08 +#define PMINFO_CLIENT_STATUS_CLEAR_DATA 0x10 +#define PMINFO_CLIENT_STATUS_INSTALL_PROGRESS 0x20 + +/** + * @brief This APIs provides pkgmgrinfo client listener + */ +pkgmgrinfo_client *pkgmgrinfo_client_new(pkgmgrinfo_client_type ctype); +int pkgmgrinfo_client_set_status_type(pkgmgrinfo_client *pc, int status_type); +int pkgmgrinfo_client_listen_status(pkgmgrinfo_client *pc, pkgmgrinfo_handler event_cb, void *data); +int pkgmgrinfo_client_free(pkgmgrinfo_client *pc); +int pkgmgrinfo_client_request_enable_external_pkg(char *pkgid); + +/** + * @pkgmgrinfo client API end +**/ + + +/** @} */ +#ifdef __cplusplus +} +#endif +#endif /* __PKG_INFO_H__ */ +/** + * @} + * @} + */ + diff --git a/include/pkgmgrinfo_basic.h b/include/pkgmgrinfo_basic.h new file mode 100644 index 0000000..1a6cee9 --- /dev/null +++ b/include/pkgmgrinfo_basic.h @@ -0,0 +1,504 @@ +/* + * pkgmgrinfo-basic + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#ifndef __PKGMGRINFO_BASIC_H__ +#define __PKGMGRINFO_BASIC_H__ + +#define DEFAULT_LOCALE "No Locale" +#define PKG_STRING_LEN_MAX 1024 +#define PKGMGR_PARSER_EMPTY_STR "" + +typedef struct metadata_x { + const char *key; + const char *value; + struct metadata_x *prev; + struct metadata_x *next; +} metadata_x; + +typedef struct privilege_x { + const char *text; + struct privilege_x *prev; + struct privilege_x *next; +} privilege_x; + +typedef struct privileges_x { + struct privilege_x *privilege; + struct privileges_x *prev; + struct privileges_x *next; +} privileges_x; + +typedef struct permission_x { + const char *type; + const char *value; + struct permission_x *prev; + struct permission_x *next; +} permission_x; + +typedef struct icon_x { + const char *name; + const char *text; + const char *lang; + const char *section; + const char *size; + const char *resolution; + struct icon_x *prev; + struct icon_x *next; +} icon_x; + +typedef struct image_x { + const char *name; + const char *text; + const char *lang; + const char *section; + struct image_x *prev; + struct image_x *next; +} image_x; + +typedef struct allowed_x { + const char *name; + const char *text; + struct allowed_x *prev; + struct allowed_x *next; +} allowed_x; + +typedef struct request_x { + const char *text; + struct request_x *prev; + struct request_x *next; +} request_x; + +typedef struct define_x { + const char *path; + struct allowed_x *allowed; + struct request_x *request; + struct define_x *prev; + struct define_x *next; +} define_x; + +typedef struct datashare_x { + struct define_x *define; + struct request_x *request; + struct datashare_x *prev; + struct datashare_x *next; +} datashare_x; + +typedef struct description_x { + const char *name; + const char *text; + const char *lang; + struct description_x *prev; + struct description_x *next; +} description_x; + +typedef struct registry_x { + const char *name; + const char *text; + struct registry_x *prev; + struct registry_x *next; +} registry_x; + +typedef struct database_x { + const char *name; + const char *text; + struct database_x *prev; + struct database_x *next; +} database_x; + +typedef struct layout_x { + const char *name; + const char *text; + struct layout_x *prev; + struct layout_x *next; +} layout_x; + +typedef struct label_x { + const char *name; + const char *text; + const char *lang; + struct label_x *prev; + struct label_x *next; +} label_x; + +typedef struct author_x { + const char *email; + const char *href; + const char *text; + const char *lang; + struct author_x *prev; + struct author_x *next; +} author_x; + +typedef struct license_x { + const char *text; + const char *lang; + struct license_x *prev; + struct license_x *next; +} license_x; + +typedef struct operation_x { + const char *name; + const char *text; + struct operation_x *prev; + struct operation_x *next; +} operation_x; + +typedef struct uri_x { + const char *name; + const char *text; + struct uri_x *prev; + struct uri_x *next; +} uri_x; + +typedef struct mime_x { + const char *name; + const char *text; + struct mime_x *prev; + struct mime_x *next; +} mime_x; + +typedef struct subapp_x { + const char *name; + const char *text; + struct subapp_x *prev; + struct subapp_x *next; +} subapp_x; + +typedef struct condition_x { + const char *name; + const char *text; + struct condition_x *prev; + struct condition_x *next; +} condition_x; + +typedef struct notification_x { + const char *name; + const char *text; + struct notification_x *prev; + struct notification_x *next; +} notification_x; + +typedef struct appsvc_x { + const char *text; + struct operation_x *operation; + struct uri_x *uri; + struct mime_x *mime; + struct subapp_x *subapp; + struct appsvc_x *prev; + struct appsvc_x *next; +} appsvc_x; + +typedef struct category_x{ + const char *name; + struct category_x *prev; + struct category_x *next; +} category_x; + +typedef struct launchconditions_x { + const char *text; + struct condition_x *condition; + struct launchconditions_x *prev; + struct launchconditions_x *next; +} launchconditions_x; + +typedef struct compatibility_x { + const char *name; + const char *text; + struct compatibility_x *prev; + struct compatibility_x *next; +}compatibility_x; + +typedef struct deviceprofile_x { + const char *name; + const char *text; + struct deviceprofile_x *prev; + struct deviceprofile_x *next; +}deviceprofile_x; + +typedef struct resolution_x { + const char *mimetype; + const char *urischeme; + struct resolution_x *prev; + struct resolution_x *next; +} resolution_x; + +typedef struct capability_x { + const char *operationid; + const char *access; + struct resolution_x *resolution; + struct capability_x *prev; + struct capability_x *next; +} capability_x; + +typedef struct datacontrol_x { + const char *providerid; + const char *access; + const char *type; + struct datacontrol_x *prev; + struct datacontrol_x *next; +} datacontrol_x; + +typedef struct uiapplication_x { + const char *appid; + const char *exec; + const char *ambient_support; + const char *nodisplay; + const char *multiple; + const char *taskmanage; + const char *enabled; + const char *type; + const char *categories; + const char *extraid; + const char *hwacceleration; + const char *screenreader; + const char *mainapp; + const char *package; + const char *recentimage; + const char *launchcondition; + const char *indicatordisplay; + const char *portraitimg; + const char *landscapeimg; + const char *effectimage_type; + const char *guestmode_visibility; + const char *app_component; + const char *permission_type; + const char *component_type; + const char *preload; + const char *submode; + const char *submode_mainid; + const char *installed_storage; + const char *process_pool; + const char *autorestart; + const char *onboot; + const char *multi_instance; + const char *multi_instance_mainid; + const char *multi_window; + const char *support_disable; + const char *ui_gadget; + const char *removable; + const char *support_mode; + const char *support_feature; + const char *satui_label; + const char *package_type; + const char *package_system; + const char *package_installed_time; + struct label_x *label; + struct icon_x *icon; + struct image_x *image; + struct appsvc_x *appsvc; + struct category_x *category; + struct metadata_x *metadata; + struct permission_x *permission; + struct launchconditions_x *launchconditions; + struct notification_x *notification; + struct datashare_x *datashare; + struct datacontrol_x *datacontrol; + struct uiapplication_x *prev; + struct uiapplication_x *next; +} uiapplication_x; + +typedef struct serviceapplication_x { + const char *appid; + const char *exec; + const char *onboot; + const char *autorestart; + const char *enabled; + const char *type; + const char *package; + const char *permission_type; + struct label_x *label; + struct icon_x *icon; + struct appsvc_x *appsvc; + struct category_x *category; + struct metadata_x *metadata; + struct permission_x *permission; + struct datacontrol_x *datacontrol; + struct launchconditions_x *launchconditions; + struct notification_x *notification; + struct datashare_x *datashare; + struct serviceapplication_x *prev; + struct serviceapplication_x *next; +} serviceapplication_x; + +typedef struct daemon_x { + const char *name; + const char *text; + struct daemon_x *prev; + struct daemon_x *next; +} daemon_x; + +typedef struct theme_x { + const char *name; + const char *text; + struct theme_x *prev; + struct theme_x *next; +} theme_x; + +typedef struct font_x { + const char *name; + const char *text; + struct font_x *prev; + struct font_x *next; +} font_x; + +typedef struct ime_x { + const char *name; + const char *text; + struct ime_x *prev; + struct ime_x *next; +} ime_x; + +typedef struct manifest_x { + const char *package; /**< package name*/ + const char *version; /**< package version*/ + const char *installlocation; /**< package install location*/ + const char *ns; /**prev = (list); \ + if (list) (node)->next = (list)->next; \ + else (node)->next = NULL; \ + if (list) (list)->next = (node); \ + (list) = (node); \ + } while (0); + + /** + * @brief Convinience Macro to add one node to another node + */ +#define NODEADD(node1, node2) \ + do { \ + (node2)->prev = (node1); \ + (node2)->next = (node1)->next; \ + if ((node1)->next) (node1)->next->prev = (node2); \ + (node1)->next = (node2); \ + } while (0); + + /** + * @brief Convinience Macro to concatenate two lists + */ +#define LISTCAT(list, first, last) \ + if ((first) && (last)) { \ + (first)->prev = (list); \ + (list) = (last); \ + } + + /** + * @brief Convinience Macro to delete node from list + */ +#define LISTDEL(list, node) \ + do { \ + if ((node)->prev) (node)->prev->next = (node)->next; \ + if ((node)->next) (node)->next->prev = (node)->prev; \ + if (!((node)->prev) && !((node)->next)) (list) = NULL; \ + } while (0); + + /** + * @brief Convinience Macro to get list head + */ +#define LISTHEAD(list, node) \ + for ((node) = (list); (node)->prev; (node) = (node)->prev) + +#define SAFE_LISTHEAD(list, node) do { \ + if (list) { \ + for ((node) = (list); (node)->prev; (node) = (node)->prev); \ + list = node; \ + } \ +} while (0) + + /** + * @brief Convinience Macro to get list tail + */ +#define LISTTAIL(list, node) \ + for ((node) = (list); (node)->next; (node) = (node)->next) + +#define FREE_AND_STRDUP(from, to) do { \ + if (to) free((void *)to); \ + if (from) to = strdup(from); \ + } while (0) + + /** + * @brief Convinience Macro to free pointer + */ +#define FREE_AND_NULL(ptr) do { \ + if (ptr) { \ + free((void *)ptr); \ + ptr = NULL; \ + } \ + } while (0) + +void _pkgmgrinfo_basic_free_manifest_x(manifest_x *mfx); + +char* pkgmgrinfo_basic_generate_hash_for_file(const char* file); + +#endif /* __PKGMGRINFO_BASIC_H__ */ diff --git a/include/pkgmgrinfo_debug.h b/include/pkgmgrinfo_debug.h new file mode 100644 index 0000000..45f088a --- /dev/null +++ b/include/pkgmgrinfo_debug.h @@ -0,0 +1,117 @@ +/* + * pkgmgr-info-debug + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: junsuk. oh + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __PKGMGR_INFO_DEBUG_H__ +#define __PKGMGR_INFO_DEBUG_H__ + +#include + +#define _LOGE(fmt, arg...) LOGE(fmt, ##arg) +#define _LOGD(fmt, arg...) LOGD(fmt, ##arg) +#define _LOGS(fmt, arg...) SECURE_LOGD(fmt, ##arg) + +#define PKGMGR_INFO_ENABLE_DLOG + +#ifdef PKGMGR_INFO_ENABLE_DLOG +#define PKGMGR_INFO_DEBUG(fmt, ...)\ + do\ + {\ + LOGD(fmt, ##__VA_ARGS__);\ + } while (0) + +#define PKGMGR_INFO_DEBUG_ERR(fmt, ...)\ + do\ + {\ + LOGE(fmt, ##__VA_ARGS__);\ + }while (0) + +#define PKGMGR_INFO_BEGIN() \ + do\ + {\ + LOGD("BEGIN >>>>");\ + } while( 0 ) + +#define PKGMGR_INFO_END() \ + do\ + {\ + LOGD("END <<<<");\ + } \ + while( 0 ) + +#else +#define PKGMGR_INFO_DEBUG(fmt, ...) \ + do\ + {\ + printf("\n [%s: %s(): %d] " fmt"\n", rindex(__FILE__, '/')+1, __FUNCTION__, __LINE__, ##__VA_ARGS__);\ + } while (0) + +#define PKGMGR_INFO_BEGIN() \ + do\ + {\ + printf("\n [%s: %d] : BEGIN >>>> %s() \n", rindex(__FILE__, '/')+1, __LINE__ , __FUNCTION__);\ + } while( 0 ) + +#define PKGMGR_INFO_END() \ + do\ + {\ + printf("\n [%s: %d]: END <<<< %s()\n", rindex(__FILE__, '/')+1, __LINE__ , __FUNCTION__); \ + } \ + while( 0 ) +#endif + + +#define ret_if(expr) do { \ + if (expr) { \ + PKGMGR_INFO_DEBUG_ERR("(%s) ", #expr); \ + return; \ + } \ +} while (0) + +#define retm_if(expr, fmt, arg...) do { \ + if (expr) { \ + PKGMGR_INFO_DEBUG_ERR("(%s) "fmt, #expr, ##arg); \ + return; \ + } \ + } while (0) + +#define retv_if(expr, val) do { \ + if (expr) { \ + PKGMGR_INFO_DEBUG_ERR("(%s) ", #expr); \ + return (val); \ + } \ + } while (0) + +#define retvm_if(expr, val, fmt, arg...) do { \ + if (expr) { \ + PKGMGR_INFO_DEBUG_ERR("(%s) "fmt, #expr, ##arg); \ + return (val); \ + } \ +} while (0) + +#define tryvm_if(expr, val, fmt, arg...) do { \ + if (expr) { \ + PKGMGR_INFO_DEBUG_ERR("(%s) "fmt, #expr, ##arg); \ + val; \ + goto catch; \ + } \ +} while (0) + +#endif /* __PKGMGR_INFO_DEBUG_H__ */ diff --git a/include/pkgmgrinfo_feature.h b/include/pkgmgrinfo_feature.h new file mode 100755 index 0000000..72661d0 --- /dev/null +++ b/include/pkgmgrinfo_feature.h @@ -0,0 +1,39 @@ +/* + * pkgmgrinfo_feature + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __PKGMGRINFO_FEATURE_H__ +#define __PKGMGRINFO_FEATURE_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +int pkgmgrinfo_appinfo_get_disabled_list(pkgmgrinfo_pkginfo_h handle, pkgmgrinfo_app_component component, + pkgmgrinfo_app_list_cb app_func, void *user_data); +int pkgmgrinfo_appinfo_get_disabled_appinfo(const char *appid, pkgmgrinfo_appinfo_h *handle); +int pkgmgrinfo_pkginfo_get_disabled_list(pkgmgrinfo_pkg_list_cb pkg_list_cb, void *user_data); +int pkgmgrinfo_pkginfo_get_disabled_pkginfo(const char *pkgid, pkgmgrinfo_pkginfo_h *handle); + +#ifdef __cplusplus +} +#endif +#endif /* __PKGPMGRINFO_FEATURE_H__ */ diff --git a/include/pkgmgrinfo_private.h b/include/pkgmgrinfo_private.h new file mode 100644 index 0000000..b515a92 --- /dev/null +++ b/include/pkgmgrinfo_private.h @@ -0,0 +1,216 @@ +/* + * pkgmgr-info + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#ifndef __PKGMGRINFO_PRIVATE_H__ +#define __PKGMGRINFO_PRIVATE_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "pkgmgrinfo_basic.h" +#include "pkgmgrinfo_debug.h" +#include "pkgmgr-info.h" + +#ifndef DEPRECATED +#define DEPRECATED __attribute__ ((__deprecated__)) +#endif + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#define MMC_PATH "/opt/storage/sdcard" +#define PKG_SD_PATH MMC_PATH"/app2sd/" + +#define PKG_RW_PATH "/opt/usr/apps/" +#define PKG_RO_PATH "/usr/apps/" +#define BLOCK_SIZE 4096 /*in bytes*/ + +#define PKG_TYPE_STRING_LEN_MAX 128 +#define PKG_VERSION_STRING_LEN_MAX 128 +#define PKG_VALUE_STRING_LEN_MAX 512 +#define PKG_LOCALE_STRING_LEN_MAX 8 + +#define MAX_QUERY_LEN 4096 +#define MAX_CERT_TYPE 9 + +#define MANIFEST_DB "/opt/dbspace/.pkgmgr_parser.db" +#define CERT_DB "/opt/dbspace/.pkgmgr_cert.db" +#define DATACONTROL_DB "/opt/usr/dbspace/.app-package.db" + +/*String properties for filtering based on package info*/ +typedef enum _pkgmgrinfo_pkginfo_filter_prop_str { + E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_STR = 101, + E_PMINFO_PKGINFO_PROP_PACKAGE_ID = E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_STR, + E_PMINFO_PKGINFO_PROP_PACKAGE_TYPE, + E_PMINFO_PKGINFO_PROP_PACKAGE_VERSION, + E_PMINFO_PKGINFO_PROP_PACKAGE_INSTALL_LOCATION, + E_PMINFO_PKGINFO_PROP_PACKAGE_INSTALLED_STORAGE, + E_PMINFO_PKGINFO_PROP_PACKAGE_AUTHOR_NAME, + E_PMINFO_PKGINFO_PROP_PACKAGE_AUTHOR_EMAIL, + E_PMINFO_PKGINFO_PROP_PACKAGE_AUTHOR_HREF, + E_PMINFO_PKGINFO_PROP_PACKAGE_STORECLIENT_ID, + E_PMINFO_PKGINFO_PROP_PACKAGE_MAX_STR = E_PMINFO_PKGINFO_PROP_PACKAGE_STORECLIENT_ID +} pkgmgrinfo_pkginfo_filter_prop_str; + +/*Boolean properties for filtering based on package info*/ +typedef enum _pkgmgrinfo_pkginfo_filter_prop_bool { + E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_BOOL = 201, + E_PMINFO_PKGINFO_PROP_PACKAGE_REMOVABLE = E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_BOOL, + E_PMINFO_PKGINFO_PROP_PACKAGE_PRELOAD, + E_PMINFO_PKGINFO_PROP_PACKAGE_READONLY, + E_PMINFO_PKGINFO_PROP_PACKAGE_UPDATE, + E_PMINFO_PKGINFO_PROP_PACKAGE_APPSETTING, + E_PMINFO_PKGINFO_PROP_PACKAGE_NODISPLAY_SETTING, + E_PMINFO_PKGINFO_PROP_PACKAGE_SUPPORT_DISABLE, + E_PMINFO_PKGINFO_PROP_PACKAGE_DISABLE, + E_PMINFO_PKGINFO_PROP_PACKAGE_USE_RESET, + E_PMINFO_PKGINFO_PROP_PACKAGE_MAX_BOOL = E_PMINFO_PKGINFO_PROP_PACKAGE_USE_RESET +} pkgmgrinfo_pkginfo_filter_prop_bool; + +/*Integer properties for filtering based on package info*/ +typedef enum _pkgmgrinfo_pkginfo_filter_prop_int { + E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_INT = 301, + E_PMINFO_PKGINFO_PROP_PACKAGE_SIZE = E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_INT, + E_PMINFO_PKGINFO_PROP_PACKAGE_SUPPORT_MODE, + E_PMINFO_PKGINFO_PROP_PACKAGE_MAX_INT = E_PMINFO_PKGINFO_PROP_PACKAGE_SUPPORT_MODE +} pkgmgrinfo_pkginfo_filter_prop_int; + +/*String properties for filtering based on app info*/ +typedef enum _pkgmgrinfo_appinfo_filter_prop_str { + E_PMINFO_APPINFO_PROP_APP_MIN_STR = 401, + E_PMINFO_APPINFO_PROP_APP_ID = E_PMINFO_APPINFO_PROP_APP_MIN_STR, + E_PMINFO_APPINFO_PROP_APP_COMPONENT, + E_PMINFO_APPINFO_PROP_APP_COMPONENT_TYPE, + E_PMINFO_APPINFO_PROP_APP_EXEC, + E_PMINFO_APPINFO_PROP_APP_AMBIENT_SUPPORT, + E_PMINFO_APPINFO_PROP_APP_ICON, + E_PMINFO_APPINFO_PROP_APP_TYPE, + E_PMINFO_APPINFO_PROP_APP_OPERATION, + E_PMINFO_APPINFO_PROP_APP_URI, + E_PMINFO_APPINFO_PROP_APP_MIME, + E_PMINFO_APPINFO_PROP_APP_HWACCELERATION, + E_PMINFO_APPINFO_PROP_APP_CATEGORY, + E_PMINFO_APPINFO_PROP_APP_SCREENREADER, + E_PMINFO_APPINFO_PROP_APP_MAX_STR = E_PMINFO_APPINFO_PROP_APP_CATEGORY +} pkgmgrinfo_appinfo_filter_prop_str; + +/*Boolean properties for filtering based on app info*/ +typedef enum _pkgmgrinfo_appinfo_filter_prop_bool { + E_PMINFO_APPINFO_PROP_APP_MIN_BOOL = 501, + E_PMINFO_APPINFO_PROP_APP_NODISPLAY = E_PMINFO_APPINFO_PROP_APP_MIN_BOOL, + E_PMINFO_APPINFO_PROP_APP_MULTIPLE, + E_PMINFO_APPINFO_PROP_APP_ONBOOT, + E_PMINFO_APPINFO_PROP_APP_AUTORESTART, + E_PMINFO_APPINFO_PROP_APP_TASKMANAGE, + E_PMINFO_APPINFO_PROP_APP_LAUNCHCONDITION, + E_PMINFO_APPINFO_PROP_APP_SUPPORT_DISABLE, + E_PMINFO_APPINFO_PROP_APP_DISABLE, + E_PMINFO_APPINFO_PROP_APP_REMOVABLE, + E_PMINFO_APPINFO_PROP_APP_MAX_BOOL = E_PMINFO_APPINFO_PROP_APP_REMOVABLE +} pkgmgrinfo_appinfo_filter_prop_bool; + +/*Integer properties for filtering based on app info*/ +typedef enum _pkgmgrinfo_appinfo_filter_prop_int { + /*Currently No Fields*/ + E_PMINFO_APPINFO_PROP_APP_MIN_INT = 601, + E_PMINFO_APPINFO_PROP_APP_SUPPORT_MODE = E_PMINFO_APPINFO_PROP_APP_MIN_INT, + E_PMINFO_APPINFO_PROP_APP_MAX_INT = E_PMINFO_APPINFO_PROP_APP_SUPPORT_MODE +} pkgmgrinfo_appinfo_filter_prop_int; + +/*Integer properties for filtering based on app info*/ +typedef enum _pkgmgrinfo_pkginfo_filter_prop_range { + /*Currently No Fields*/ + E_PMINFO_PKGINFO_PROP_RANGE_MIN_INT = 701, + E_PMINFO_PKGINFO_PROP_RANGE_BASIC, + E_PMINFO_PKGINFO_PROP_RANGE_MAX_INT = E_PMINFO_PKGINFO_PROP_RANGE_BASIC +} pkgmgrinfo_pkginfo_filter_prop_range; + +typedef struct _pkgmgr_pkginfo_x { + manifest_x *manifest_info; + char *locale; + + struct _pkgmgr_pkginfo_x *prev; + struct _pkgmgr_pkginfo_x *next; +} pkgmgr_pkginfo_x; + +typedef struct _pkgmgr_appinfo_x { + char *locale; + union { + uiapplication_x *uiapp_info; + serviceapplication_x *svcapp_info; + }; +} pkgmgr_appinfo_x; + +/*For filter APIs*/ +typedef struct _pkgmgrinfo_filter_x { + GSList *list; +} pkgmgrinfo_filter_x; + +typedef struct _pkgmgrinfo_node_x { + int prop; + char *key; + char *value; +} pkgmgrinfo_node_x; + +typedef int (*sqlite_query_callback)(void *data, int ncols, char **coltxt, char **colname); + +int __exec_db_query(sqlite3 *db, char *query, sqlite_query_callback callback, void *data); +char* __convert_system_locale_to_manifest_locale(); +gint __compare_func(gconstpointer data1, gconstpointer data2); +void __get_filter_condition(gpointer data, char **condition); + +void __cleanup_pkginfo(pkgmgr_pkginfo_x *data); +void __cleanup_appinfo(pkgmgr_appinfo_x *data); +void __cleanup_list_pkginfo(pkgmgr_pkginfo_x *list_pkginfo, pkgmgr_pkginfo_x *node); + +int __pkginfo_check_installed_storage(pkgmgr_pkginfo_x *pkginfo); +int __appinfo_check_installed_storage(pkgmgr_appinfo_x *appinfo); + +int _pkgmgrinfo_validate_cb(void *data, int ncols, char **coltxt, char **colname); + +int __pkginfo_cb(void *data, int ncols, char **coltxt, char **colname); +int __appinfo_cb(void *data, int ncols, char **coltxt, char **colname); +int __uiapp_list_cb(void *data, int ncols, char **coltxt, char **colname); +char* __get_app_locale_by_fallback(sqlite3 *db, const char *appid); + +pkgmgrinfo_pkginfo_filter_prop_str _pminfo_pkginfo_convert_to_prop_str(const char *property); +pkgmgrinfo_pkginfo_filter_prop_int _pminfo_pkginfo_convert_to_prop_int(const char *property); +pkgmgrinfo_pkginfo_filter_prop_bool _pminfo_pkginfo_convert_to_prop_bool(const char *property); + +pkgmgrinfo_appinfo_filter_prop_str _pminfo_appinfo_convert_to_prop_str(const char *property); +pkgmgrinfo_appinfo_filter_prop_int _pminfo_appinfo_convert_to_prop_int(const char *property); +pkgmgrinfo_appinfo_filter_prop_bool _pminfo_appinfo_convert_to_prop_bool(const char *property); +pkgmgrinfo_pkginfo_filter_prop_range _pminfo_pkginfo_convert_to_prop_range(const char *property); + +#endif /* __PKGMGRINFO_PRIVATE_H__ */ diff --git a/include/pkgmgrinfo_type.h b/include/pkgmgrinfo_type.h new file mode 100755 index 0000000..dcdf011 --- /dev/null +++ b/include/pkgmgrinfo_type.h @@ -0,0 +1,305 @@ +/* + * pkgmgrinfo_type + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __PKGMGRINFO_TYPE_H__ +#define __PKGMGRINFO_TYPE_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief A handle to insert certificate information + */ +typedef void* pkgmgrinfo_instcertinfo_h; + +/** + * @brief A handle to get package information + */ +typedef void* pkgmgrinfo_pkginfo_h; + +/** + * @brief A handle to get application information + */ +typedef void* pkgmgrinfo_appinfo_h; + +/** + * @brief A handle to get certificate information + */ +typedef void* pkgmgrinfo_certinfo_h; + +/** + * @brief A handle to insert package information + */ +typedef void* pkgmgrinfo_pkgdbinfo_h; + +/** + * @brief A handle to filter package information + */ +typedef void* pkgmgrinfo_pkginfo_filter_h; + +/** + * @brief A handle to filter application information + */ +typedef void* pkgmgrinfo_appinfo_filter_h; + +/** + * @brief A handle to filter application metadata information + */ +typedef void* pkgmgrinfo_appinfo_metadata_filter_h; + +/** + * @brief A handle to get appcontrol information + */ +typedef void* pkgmgrinfo_appcontrol_h; + +typedef void pkgmgrinfo_client; + +/** + * @brief Certificate Types to be used for setting information + */ +typedef enum { + PMINFO_SET_AUTHOR_ROOT_CERT = 0, /**< Author Root Certificate*/ + PMINFO_SET_AUTHOR_INTERMEDIATE_CERT = 1, /**< Author Intermediate Certificate*/ + PMINFO_SET_AUTHOR_SIGNER_CERT = 2, /**< Author Signer Certificate*/ + PMINFO_SET_DISTRIBUTOR_ROOT_CERT = 3, /**< Distributor Root Certificate*/ + PMINFO_SET_DISTRIBUTOR_INTERMEDIATE_CERT = 4, /**< Distributor Intermediate Certificate*/ + PMINFO_SET_DISTRIBUTOR_SIGNER_CERT = 5, /**< Distributor Signer Certificate*/ + PMINFO_SET_DISTRIBUTOR2_ROOT_CERT = 6, /**< End Entity Root Certificate*/ + PMINFO_SET_DISTRIBUTOR2_INTERMEDIATE_CERT = 7, /**< End Entity Intermediate Certificate*/ + PMINFO_SET_DISTRIBUTOR2_SIGNER_CERT = 8, /**< End Entity Signer Certificate*/ +}pkgmgrinfo_instcert_type; + +typedef enum { + PMINFO_CERT_COMPARE_MATCH, + PMINFO_CERT_COMPARE_MISMATCH, + PMINFO_CERT_COMPARE_LHS_NO_CERT, + PMINFO_CERT_COMPARE_RHS_NO_CERT, + PMINFO_CERT_COMPARE_BOTH_NO_CERT, + PMINFO_CERT_COMPARE_ERROR, +} pkgmgrinfo_cert_compare_result_type_e; + +/** + * @brief API return values + */ +enum { + PMINFO_R_EINVAL = -2, /**< Invalid argument */ + PMINFO_R_ERROR = -1, /**< General error */ + PMINFO_R_OK = 0 /**< General success */ +}; + +typedef enum { + PMINFO_HWACCELERATION_OFF = 0, /**< Don't use hardware acceleration*/ + PMINFO_HWACCELERATION_ON = 1, /**< Use hardware acceleration*/ + PMINFO_HWACCELERATION_DEFAULT = 2 /**< Follow system setting for hardware acceleration */ +}pkgmgrinfo_app_hwacceleration; + +typedef enum { + PMINFO_SCREENREADER_OFF = 0, /**< Don't use screen reader*/ + PMINFO_SCREENREADER_ON = 1, /**< Use screen reader*/ + PMINFO_SCREENREADER_USE_SYSTEM_SETTING = 2 /**< Follow system setting for screen reader */ +}pkgmgrinfo_app_screenreader; + +typedef enum { + PMINFO_RECENTIMAGE_USE_ICON = 0, /** + +cmake_minimum_required(VERSION 2.6) +#set(CMAKE_SKIP_BUILD_RPATH true) +set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true) + + +### Versioning +if(DEFINED ${VERSION}) + message("VERSION: ${VERSION}") +else() + message("VERSION is not defined. set it as 0.1.0") + set(VERSION 0.1.0) +endif() +if(DEFINED ${VERSION_MAJOR}) + message("VERSION_MAJOR: ${VERSION_MAJOR}") +else() + message( "VERSION_MAJOR is not defined. set it as 0") + set(VERSION_MAJOR 0) +endif() +message(STATUS "version/major : ${VERSION} / ${VERSION_MAJOR}") + +### Get required CFLAGS, LDFLAGS from pkg-config + +include(FindPkgConfig) +pkg_check_modules(parser_pkgs REQUIRED dlog libxml-2.0 glib-2.0 sqlite3 db-util vconf journal) + +foreach(flag ${parser_pkgs_CFLAGS}) + set(parser_pkgs_CFLAGS_str "${parser_pkgs_CFLAGS_str} ${flag}") +endforeach() + +## Additional flag +SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fvisibility=hidden") +SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -g -Wall") +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") + +### Set current binary dir to be included (for generated *.h files) +include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) + +### Build modules + +## pkgmgr_parser object (by sewook.park) +# This library is for installer backend +add_library(pkgmgr_parser SHARED pkgmgr_parser.c pkgmgr_parser_feature.c pkgmgr_parser_db.c pkgmgr_parser_db_util.c pkgmgr_parser_plugin.c) + +set_target_properties(pkgmgr_parser PROPERTIES SOVERSION ${VERSION_MAJOR}) +set_target_properties(pkgmgr_parser PROPERTIES VERSION ${VERSION}) +set_target_properties(pkgmgr_parser PROPERTIES COMPILE_FLAGS "${parser_pkgs_CFLAGS_str}") +target_link_libraries(pkgmgr_parser ${parser_pkgs_LDFLAGS}) + +### Create pc file +configure_file(pkgmgr-parser.pc.in ${CMAKE_CURRENT_BINARY_DIR}/pkgmgr-parser.pc @ONLY) +configure_file(manifest.xsd.in manifest.xsd @ONLY) +configure_file(xml.xsd.in xml.xsd @ONLY) +configure_file(pkgmgr_parser_plugin_list.txt.in pkgmgr_parser_plugin_list.txt @ONLY) + +## Install +INSTALL(TARGETS + pkgmgr_parser + DESTINATION ${LIB_INSTALL_DIR} + COMPONENT RuntimeLibraries) +INSTALL(FILES + pkgmgr_parser.h + DESTINATION include/pkgmgr) +INSTALL(FILES + pkgmgr_parser_db.h + DESTINATION include/pkgmgr) +INSTALL(FILES + pkgmgr_parser_feature.h + DESTINATION include/pkgmgr) + +INSTALL(FILES + ${CMAKE_CURRENT_BINARY_DIR}/pkgmgr-parser.pc + DESTINATION ${LIB_INSTALL_DIR}/pkgconfig) + +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/manifest.xsd DESTINATION ${PREFIX}/etc/package-manager/preload/) +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/xml.xsd DESTINATION ${PREFIX}/etc/package-manager/preload/) +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/pkgmgr_parser_plugin_list.txt DESTINATION ${PREFIX}/etc/package-manager/parserlib/) + diff --git a/parser/build.sh b/parser/build.sh new file mode 100755 index 0000000..8cb600c --- /dev/null +++ b/parser/build.sh @@ -0,0 +1,30 @@ + +#export CFLAGS="" +#export LDFLAGS="" + +cd `dirname $0` + +PREFIX=/usr + +rm -rf cmake_tmp +mkdir -p cmake_tmp +cd cmake_tmp + +CFLAGS="${CFLAGS}" LDFLAGS="${LDFLAGS}" cmake .. -DCMAKE_INSTALL_PREFIX=${PREFIX} && +make && + +# test +{ + export LD_LIBRARY_PATH=`pwd` + cd test +# ./test_comm_client & +# ./test_comm_status_broadcast_server +# ./test_comm_socket && + ./test_pkgmgr_installer +} +if [ "$?" == "0" ]; then + echo "Test done." +else + echo "Test failed!" +fi + diff --git a/parser/manifest.xsd.in b/parser/manifest.xsd.in new file mode 100755 index 0000000..fd79c76 --- /dev/null +++ b/parser/manifest.xsd.in @@ -0,0 +1,315 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/parser/pkgmgr-parser.pc.in b/parser/pkgmgr-parser.pc.in new file mode 100755 index 0000000..547a51a --- /dev/null +++ b/parser/pkgmgr-parser.pc.in @@ -0,0 +1,16 @@ +# +# Copyright (c) 2008 ~ 2010 Samsung Electronics Co., Ltd. +# All rights reserved. +# + +prefix=@PREFIX@ +exec_prefix=@EXEC_PREFIX@ +libdir=@LIB_INSTALL_DIR@ +includedir=@INCLUDEDIR@ + +Name: package manager parser library +Description: SLP package manager's installer lib for each backends +Version: @VERSION@ +Requires: libxml-2.0 +Libs: -L${libdir} -lpkgmgr_parser +Cflags: -I${includedir}/pkgmgr diff --git a/parser/pkgmgr_parser.c b/parser/pkgmgr_parser.c new file mode 100755 index 0000000..eead603 --- /dev/null +++ b/parser/pkgmgr_parser.c @@ -0,0 +1,2497 @@ +/* + * pkgmgr-info + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "pkgmgr_parser.h" +#include "pkgmgr_parser_internal.h" +#include "pkgmgr_parser_db.h" +#include "pkgmgr_parser_db_util.h" +#include "pkgmgr_parser_plugin.h" + +#include "pkgmgrinfo_debug.h" + +#ifdef LOG_TAG +#undef LOG_TAG +#endif +#define LOG_TAG "PKGMGR_PARSER" + +#define WATCH_CLOCK_CATEGORY "http://tizen.org/category/wearable_clock" +#define MANIFEST_RW_DIRECTORY "/opt/share/packages" +#define MANIFEST_RO_DIRECTORY "/usr/share/packages" +#define ASCII(s) (const char *)s +#define XMLCHAR(s) (const xmlChar *)s + +const char *package; + +static int __ps_process_label(xmlTextReaderPtr reader, label_x *label); +static int __ps_process_privilege(xmlTextReaderPtr reader, privilege_x *privilege); +static int __ps_process_privileges(xmlTextReaderPtr reader, privileges_x *privileges); +static int __ps_process_deviceprofile(xmlTextReaderPtr reader, deviceprofile_x *deviceprofile); +static int __ps_process_allowed(xmlTextReaderPtr reader, allowed_x *allowed); +static int __ps_process_operation(xmlTextReaderPtr reader, operation_x *operation); +static int __ps_process_uri(xmlTextReaderPtr reader, uri_x *uri); +static int __ps_process_mime(xmlTextReaderPtr reader, mime_x *mime); +static int __ps_process_subapp(xmlTextReaderPtr reader, subapp_x *subapp); +static int __ps_process_condition(xmlTextReaderPtr reader, condition_x *condition); +static int __ps_process_notification(xmlTextReaderPtr reader, notification_x *notifiation); +static int __ps_process_category(xmlTextReaderPtr reader, category_x *category); +static int __ps_process_metadata(xmlTextReaderPtr reader, metadata_x *metadata); +static int __ps_process_permission(xmlTextReaderPtr reader, permission_x *permission); +static int __ps_process_compatibility(xmlTextReaderPtr reader, compatibility_x *compatibility); +static int __ps_process_resolution(xmlTextReaderPtr reader, resolution_x *resolution); +static int __ps_process_request(xmlTextReaderPtr reader, request_x *request); +static int __ps_process_define(xmlTextReaderPtr reader, define_x *define); +static int __ps_process_appsvc(xmlTextReaderPtr reader, appsvc_x *appsvc); +static int __ps_process_launchconditions(xmlTextReaderPtr reader, launchconditions_x *launchconditions); +static int __ps_process_datashare(xmlTextReaderPtr reader, datashare_x *datashare); +static int __ps_process_icon(xmlTextReaderPtr reader, icon_x *icon); +static int __ps_process_author(xmlTextReaderPtr reader, author_x *author); +static int __ps_process_description(xmlTextReaderPtr reader, description_x *description); +static int __ps_process_capability(xmlTextReaderPtr reader, capability_x *capability); +static int __ps_process_license(xmlTextReaderPtr reader, license_x *license); +static int __ps_process_datacontrol(xmlTextReaderPtr reader, datacontrol_x *datacontrol); +static int __ps_process_uiapplication(xmlTextReaderPtr reader, uiapplication_x *uiapplication); +static int __ps_process_font(xmlTextReaderPtr reader, font_x *font); +static int __ps_process_theme(xmlTextReaderPtr reader, theme_x *theme); +static int __ps_process_daemon(xmlTextReaderPtr reader, daemon_x *daemon); +static int __ps_process_ime(xmlTextReaderPtr reader, ime_x *ime); +static char *__pkgid_to_manifest(const char *pkgid); +static int __next_child_element(xmlTextReaderPtr reader, int depth); +static int __start_process(xmlTextReaderPtr reader, manifest_x * mfx); +static int __process_manifest(xmlTextReaderPtr reader, manifest_x * mfx); + + + +static void __save_xml_attribute(xmlTextReaderPtr reader, char *attribute, const char **xml_attribute, char *default_value) +{ + xmlChar *attrib_val = xmlTextReaderGetAttribute(reader, XMLCHAR(attribute)); + if (attrib_val) { + *xml_attribute = ASCII(attrib_val); + } else { + if (default_value != NULL) { + *xml_attribute = strdup(default_value); + } + } +} + +static void __save_xml_lang(xmlTextReaderPtr reader, const char **xml_attribute) +{ + const xmlChar *attrib_val = xmlTextReaderConstXmlLang(reader); + if (attrib_val != NULL) { + *xml_attribute = strdup(ASCII(attrib_val)); + } else { + *xml_attribute = strdup(DEFAULT_LOCALE); + } +} + +static void __save_xml_value(xmlTextReaderPtr reader, const char **xml_attribute) +{ + xmlTextReaderRead(reader); + xmlChar *attrib_val = xmlTextReaderValue(reader); + + if (attrib_val) { + *xml_attribute = ASCII(attrib_val); + } +} + +static void __save_xml_supportmode(xmlTextReaderPtr reader, manifest_x * mfx) +{ + xmlChar *attrib_val = xmlTextReaderGetAttribute(reader, XMLCHAR("support-mode")); + if (attrib_val) { + int temp_mode = 0; + char buffer[10] = {'\0'}; + + if (strstr(ASCII(attrib_val), "ultra-power-saving")) { + temp_mode |= PMINFO_SUPPORT_MODE_ULTRA_POWER_SAVING; // PMINFO_MODE_PROP_ULTRA_POWER_SAVING 0x00000001 + } + if (strstr(ASCII(attrib_val), "cool-down")) { + temp_mode |= PMINFO_SUPPORT_MODE_COOL_DOWN; // PMINFO_MODE_PROP_COOL_DOWN 0x00000002 + } + if (strstr(ASCII(attrib_val), "screen-reader")) { + temp_mode |= PMINFO_SUPPORT_MODE_SCREEN_READER; // PMINFO_MODE_PROP_SCREEN_READER 0x00000004 + } + sprintf(buffer, "%d", temp_mode); + mfx->support_mode = strdup(buffer); + xmlFree(attrib_val); + } else { + mfx->support_mode = strdup("0"); + } +} + +static void __save_xml_supportfeature(const char *metadata_key, uiapplication_x *uiapplication) +{ + if (metadata_key) { + int temp_mode = 0; + char buffer[PKG_STRING_LEN_MAX] = {'\0'}; + + if (uiapplication->support_feature) { + temp_mode = atoi(uiapplication->support_feature); + FREE_AND_NULL(uiapplication->support_feature); + } + + if (strcmp(metadata_key, "http://developer.samsung.com/tizen/metadata/multiwindow") == 0) { + temp_mode |= PMINFO_SUPPORT_FEATURE_MULTI_WINDOW; + } else if (strcmp(metadata_key, "http://developer.samsung.com/tizen/metadata/oomtermination") == 0) { + temp_mode |= PMINFO_SUPPORT_FEATURE_OOM_TERMINATION; + } else if (strcmp(metadata_key, "http://developer.samsung.com/tizen/metadata/largememory") == 0) { + temp_mode |= PMINFO_SUPPORT_FEATURE_LARGE_MEMORY; + } + + sprintf(buffer, "%d", temp_mode); + uiapplication->support_feature = strdup(buffer); + } else { + uiapplication->support_feature = strdup("0"); + } +} + +static void __save_xml_installedtime(manifest_x * mfx) +{ + char buf[PKG_STRING_LEN_MAX] = {'\0'}; + char *val = NULL; + time_t current_time; + time(¤t_time); + snprintf(buf, PKG_STRING_LEN_MAX - 1, "%d", (int)current_time); + val = strndup(buf, PKG_STRING_LEN_MAX - 1); + mfx->installed_time = val; +} + +static void __save_xml_defaultvalue(manifest_x * mfx) +{ + mfx->preload = strdup("False"); + mfx->removable = strdup("True"); + mfx->readonly = strdup("False"); + mfx->update = strdup("False"); + mfx->system = strdup("False"); + mfx->installed_storage= strdup("installed_internal"); + package = mfx->package; +} + +static char *__pkgid_to_manifest(const char *pkgid) +{ + char *manifest; + int size; + + if (pkgid == NULL) { + _LOGE("pkgid is NULL"); + return NULL; + } + + size = strlen(MANIFEST_RW_DIRECTORY) + strlen(pkgid) + 10; + manifest = malloc(size); + if (manifest == NULL) { + _LOGE("No memory"); + return NULL; + } + memset(manifest, '\0', size); + snprintf(manifest, size, MANIFEST_RW_DIRECTORY "/%s.xml", pkgid); + + if (access(manifest, F_OK)) { + snprintf(manifest, size, MANIFEST_RO_DIRECTORY "/%s.xml", pkgid); + } + + return manifest; +} + +static int __next_child_element(xmlTextReaderPtr reader, int depth) +{ + int ret = xmlTextReaderRead(reader); + int cur = xmlTextReaderDepth(reader); + while (ret == 1) { + + switch (xmlTextReaderNodeType(reader)) { + case XML_READER_TYPE_ELEMENT: + if (cur == depth + 1) + return 1; + break; + case XML_READER_TYPE_TEXT: + /*text is handled by each function separately*/ + if (cur == depth + 1) + return 0; + break; + case XML_READER_TYPE_END_ELEMENT: + if (cur == depth) + return 0; + break; + default: + if (cur <= depth) + return 0; + break; + } + ret = xmlTextReaderRead(reader); + cur = xmlTextReaderDepth(reader); + } + return ret; +} + +static int __check_action_fota(char *const tagv[]) +{ + int i = 0; + char delims[] = "="; + char *ret_result = NULL; + char *tag = NULL; + int ret = PM_PARSER_R_ERROR; + + if (tagv == NULL) + return ret; + + for (tag = strdup(tagv[0]); tag != NULL; ) { + ret_result = strtok(tag, delims); + + /*check tag : fota is true */ + if (ret_result && strcmp(ret_result, "fota") == 0) { + ret_result = strtok(NULL, delims); + if (strcmp(ret_result, "true") == 0) { + ret = PM_PARSER_R_OK; + } + } else + _LOGD("tag process [%s]is not defined\n", ret_result); + + FREE_AND_NULL(tag); + + /*check next value*/ + if (tagv[++i] != NULL) + tag = strdup(tagv[i]); + else { + _LOGD("tag process success...%d\n" , ret); + return ret; + } + } + + return ret; +} + +static int __ps_process_allowed(xmlTextReaderPtr reader, allowed_x *allowed) +{ + __save_xml_value(reader, &allowed->text); + return 0; +} + +static int __ps_process_operation(xmlTextReaderPtr reader, operation_x *operation) +{ + __save_xml_attribute(reader, "name", &operation->name, NULL); +/* Text does not exist. Only attribute exists + xmlTextReaderRead(reader); + if (xmlTextReaderValue(reader)) + operation->text = ASCII(xmlTextReaderValue(reader)); +*/ + return 0; +} + +static int __ps_process_uri(xmlTextReaderPtr reader, uri_x *uri) +{ + __save_xml_attribute(reader, "name", &uri->name, NULL); +/* Text does not exist. Only attribute exists + xmlTextReaderRead(reader); + if (xmlTextReaderValue(reader)) + uri->text = ASCII(xmlTextReaderValue(reader)); +*/ + return 0; +} + +static int __ps_process_mime(xmlTextReaderPtr reader, mime_x *mime) +{ + __save_xml_attribute(reader, "name", &mime->name, NULL); +/* Text does not exist. Only attribute exists + xmlTextReaderRead(reader); + if (xmlTextReaderValue(reader)) + mime->text = ASCII(xmlTextReaderValue(reader)); +*/ + return 0; +} + +static int __ps_process_subapp(xmlTextReaderPtr reader, subapp_x *subapp) +{ + __save_xml_attribute(reader, "name", &subapp->name, NULL); +/* Text does not exist. Only attribute exists + xmlTextReaderRead(reader); + if (xmlTextReaderValue(reader)) + mime->text = ASCII(xmlTextReaderValue(reader)); +*/ + return 0; +} + +static int __ps_process_condition(xmlTextReaderPtr reader, condition_x *condition) +{ + __save_xml_attribute(reader, "name", &condition->name, NULL); + __save_xml_value(reader, &condition->text); + return 0; +} + +static int __ps_process_notification(xmlTextReaderPtr reader, notification_x *notification) +{ + __save_xml_attribute(reader, "name", ¬ification->name, NULL); + __save_xml_value(reader, ¬ification->text); + return 0; +} + +static int __ps_process_category(xmlTextReaderPtr reader, category_x *category) +{ + __save_xml_attribute(reader, "name", &category->name, NULL); + return 0; +} + +static int __ps_process_privilege(xmlTextReaderPtr reader, privilege_x *privilege) +{ + __save_xml_value(reader, &privilege->text); + return 0; +} + +static int __ps_process_metadata(xmlTextReaderPtr reader, metadata_x *metadata) +{ + __save_xml_attribute(reader, "key", &metadata->key, NULL); + __save_xml_attribute(reader, "value", &metadata->value, NULL); + return 0; +} + +static int __ps_process_permission(xmlTextReaderPtr reader, permission_x *permission) +{ + __save_xml_attribute(reader, "type", &permission->type, NULL); + __save_xml_value(reader, &permission->value); + + return 0; +} + +static int __ps_process_compatibility(xmlTextReaderPtr reader, compatibility_x *compatibility) +{ + __save_xml_attribute(reader, "name", &compatibility->name, NULL); + __save_xml_value(reader, &compatibility->text); + + return 0; +} + +static int __ps_process_resolution(xmlTextReaderPtr reader, resolution_x *resolution) +{ + __save_xml_attribute(reader, "mime-type", &resolution->mimetype, NULL); + __save_xml_attribute(reader, "uri-scheme", &resolution->urischeme, NULL); + return 0; +} + +static int __ps_process_request(xmlTextReaderPtr reader, request_x *request) +{ + __save_xml_value(reader, &request->text); + + return 0; +} + +static int __ps_process_define(xmlTextReaderPtr reader, define_x *define) +{ + const xmlChar *node; + int ret = -1; + int depth = -1; + allowed_x *tmp1 = NULL; + request_x *tmp2 = NULL; + + __save_xml_attribute(reader, "path", &define->path, NULL); + + depth = xmlTextReaderDepth(reader); + while ((ret = __next_child_element(reader, depth))) { + node = xmlTextReaderConstName(reader); + if (!node) { + _LOGD("xmlTextReaderConstName value is NULL\n"); + return -1; + } + + if (!strcmp(ASCII(node), "allowed")) { + allowed_x *allowed= malloc(sizeof(allowed_x)); + if (allowed == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(allowed, '\0', sizeof(allowed_x)); + LISTADD(define->allowed, allowed); + ret = __ps_process_allowed(reader, allowed); + } else if (!strcmp(ASCII(node), "request")) { + request_x *request = malloc(sizeof(request_x)); + if (request == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(request, '\0', sizeof(request_x)); + LISTADD(define->request, request); + ret = __ps_process_request(reader, request); + } else + return -1; + if (ret < 0) { + _LOGD("Processing define failed\n"); + return ret; + } + } + + SAFE_LISTHEAD(define->allowed, tmp1); + SAFE_LISTHEAD(define->request, tmp2); + + return ret; +} + +static int __ps_process_appsvc(xmlTextReaderPtr reader, appsvc_x *appsvc) +{ + const xmlChar *node; + int ret = -1; + int depth = -1; + operation_x *tmp1 = NULL; + uri_x *tmp2 = NULL; + mime_x *tmp3 = NULL; + subapp_x *tmp4 = NULL; + + depth = xmlTextReaderDepth(reader); + while ((ret = __next_child_element(reader, depth))) { + node = xmlTextReaderConstName(reader); + if (!node) { + _LOGD("xmlTextReaderConstName value is NULL\n"); + return -1; + } + + if (!strcmp(ASCII(node), "operation")) { + operation_x *operation = malloc(sizeof(operation_x)); + if (operation == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(operation, '\0', sizeof(operation_x)); + LISTADD(appsvc->operation, operation); + ret = __ps_process_operation(reader, operation); + _LOGD("operation processing\n"); + } else if (!strcmp(ASCII(node), "uri")) { + uri_x *uri= malloc(sizeof(uri_x)); + if (uri == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(uri, '\0', sizeof(uri_x)); + LISTADD(appsvc->uri, uri); + ret = __ps_process_uri(reader, uri); + _LOGD("uri processing\n"); + } else if (!strcmp(ASCII(node), "mime")) { + mime_x *mime = malloc(sizeof(mime_x)); + if (mime == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(mime, '\0', sizeof(mime_x)); + LISTADD(appsvc->mime, mime); + ret = __ps_process_mime(reader, mime); + _LOGD("mime processing\n"); + } else if (!strcmp(ASCII(node), "subapp")) { + subapp_x *subapp = malloc(sizeof(subapp_x)); + if (subapp == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(subapp, '\0', sizeof(subapp_x)); + LISTADD(appsvc->subapp, subapp); + ret = __ps_process_subapp(reader, subapp); + _LOGD("subapp processing\n"); + } else + return -1; + if (ret < 0) { + _LOGD("Processing appsvc failed\n"); + return ret; + } + } + + SAFE_LISTHEAD(appsvc->operation, tmp1); + SAFE_LISTHEAD(appsvc->uri, tmp2); + SAFE_LISTHEAD(appsvc->mime, tmp3); + SAFE_LISTHEAD(appsvc->subapp, tmp4); + + __save_xml_value(reader, &appsvc->text); + + return ret; +} + + +static int __ps_process_privileges(xmlTextReaderPtr reader, privileges_x *privileges) +{ + const xmlChar *node; + int ret = -1; + int depth = -1; + privilege_x *tmp1 = NULL; + + depth = xmlTextReaderDepth(reader); + while ((ret = __next_child_element(reader, depth))) { + node = xmlTextReaderConstName(reader); + if (!node) { + _LOGD("xmlTextReaderConstName value is NULL\n"); + return -1; + } + + if (strcmp(ASCII(node), "privilege") == 0) { + privilege_x *privilege = malloc(sizeof(privilege_x)); + if (privilege == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(privilege, '\0', sizeof(privilege_x)); + LISTADD(privileges->privilege, privilege); + ret = __ps_process_privilege(reader, privilege); + } else + return -1; + if (ret < 0) { + _LOGD("Processing privileges failed\n"); + return ret; + } + } + SAFE_LISTHEAD(privileges->privilege, tmp1); + return ret; +} + +static int __ps_process_launchconditions(xmlTextReaderPtr reader, launchconditions_x *launchconditions) +{ + const xmlChar *node; + int ret = -1; + int depth = -1; + condition_x *tmp1 = NULL; + + depth = xmlTextReaderDepth(reader); + while ((ret = __next_child_element(reader, depth))) { + node = xmlTextReaderConstName(reader); + if (!node) { + _LOGD("xmlTextReaderConstName value is NULL\n"); + return -1; + } + + if (strcmp(ASCII(node), "condition") == 0) { + condition_x *condition = malloc(sizeof(condition_x)); + if (condition == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(condition, '\0', sizeof(condition_x)); + LISTADD(launchconditions->condition, condition); + ret = __ps_process_condition(reader, condition); + } else + return -1; + if (ret < 0) { + _LOGD("Processing launchconditions failed\n"); + return ret; + } + } + + SAFE_LISTHEAD(launchconditions->condition, tmp1); + + __save_xml_value(reader, &launchconditions->text); + + return ret; +} + +static int __ps_process_datashare(xmlTextReaderPtr reader, datashare_x *datashare) +{ + const xmlChar *node; + int ret = -1; + int depth = -1; + define_x *tmp1 = NULL; + request_x *tmp2 = NULL; + depth = xmlTextReaderDepth(reader); + while ((ret = __next_child_element(reader, depth))) { + node = xmlTextReaderConstName(reader); + if (!node) { + _LOGD("xmlTextReaderConstName value is NULL\n"); + return -1; + } + + if (!strcmp(ASCII(node), "define")) { + define_x *define= malloc(sizeof(define_x)); + if (define == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(define, '\0', sizeof(define_x)); + LISTADD(datashare->define, define); + ret = __ps_process_define(reader, define); + } else if (!strcmp(ASCII(node), "request")) { + request_x *request= malloc(sizeof(request_x)); + if (request == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(request, '\0', sizeof(request_x)); + LISTADD(datashare->request, request); + ret = __ps_process_request(reader, request); + } else + return -1; + if (ret < 0) { + _LOGD("Processing data-share failed\n"); + return ret; + } + } + + SAFE_LISTHEAD(datashare->define, tmp1); + SAFE_LISTHEAD(datashare->request, tmp2); + + return ret; +} + +static char* +__get_icon_with_path(const char* icon) +{ + if (!icon) + return NULL; + + if (index(icon, '/') == NULL) { + char* theme = NULL; + char* icon_with_path = NULL; + int len; + + if (!package) + return NULL; + + theme = strdup("default"); + if(theme == NULL){ + _LOGE("@malloc failed!!!"); + return NULL; + } + + len = (0x01 << 7) + strlen(icon) + strlen(package) + strlen(theme); + icon_with_path = malloc(len); + if(icon_with_path == NULL) { + _LOGD("(icon_with_path == NULL) return\n"); + FREE_AND_NULL(theme); + return NULL; + } + + memset(icon_with_path, 0, len); + snprintf(icon_with_path, len, "/opt/usr/apps/%s/shared/res/icons/default/small/%s", package, icon); + do { + if (access(icon_with_path, R_OK) == 0) break; + snprintf(icon_with_path, len, "/opt/share/icons/%s/small/%s", theme, icon); + if (access(icon_with_path, R_OK) == 0) break; + snprintf(icon_with_path, len, "/usr/share/icons/%s/small/%s", theme, icon); + if (access(icon_with_path, R_OK) == 0) break; + snprintf(icon_with_path, len,"/opt/share/icons/default/small/%s", icon); + if (access(icon_with_path, R_OK) == 0) break; + snprintf(icon_with_path, len, "/usr/share/icons/default/small/%s", icon); + if (access(icon_with_path, R_OK) == 0) break; + + /* icon path is going to be moved intto the app directory */ + snprintf(icon_with_path, len, "/usr/apps/%s/shared/res/icons/default/small/%s", package, icon); + if (access(icon_with_path, R_OK) == 0) break; + snprintf(icon_with_path, len, "/opt/apps/%s/res/icons/%s/small/%s", package, theme, icon); + if (access(icon_with_path, R_OK) == 0) break; + snprintf(icon_with_path, len, "/usr/apps/%s/res/icons/%s/small/%s", package, theme, icon); + if (access(icon_with_path, R_OK) == 0) break; + snprintf(icon_with_path, len, "/opt/apps/%s/res/icons/default/small/%s", package, icon); + if (access(icon_with_path, R_OK) == 0) break; + snprintf(icon_with_path, len, "/usr/apps/%s/res/icons/default/small/%s", package, icon); + if (access(icon_with_path, R_OK) == 0) break; + snprintf(icon_with_path, len, "/usr/ug/res/images/%s/%s", package, icon); + if (access(icon_with_path, R_OK) == 0) break; + } while (0); + + FREE_AND_NULL(theme); + + /* If icon is not exist, return NULL */ + if (access(icon_with_path, R_OK) != 0) { + _LOGE("Icon is not exist"); + FREE_AND_NULL(icon_with_path); + return NULL; + } else { + _LOGD("Icon path : %s ---> %s", icon, icon_with_path); + return icon_with_path; + } + } else { + char* confirmed_icon = NULL; + + confirmed_icon = strdup(icon); + if (!confirmed_icon) + return NULL; + return confirmed_icon; + } +} + +static void __ps_process_tag(manifest_x * mfx, char *const tagv[]) +{ + int i = 0; + char delims[] = "="; + char *ret_result = NULL; + char *tag = NULL; + + if (tagv == NULL) + return; + + for (tag = strdup(tagv[0]); tag != NULL; ) { + ret_result = strtok(tag, delims); + + /*check tag : preload */ + if (ret_result && strcmp(ret_result, "preload") == 0) { + ret_result = strtok(NULL, delims); + if (strcmp(ret_result, "true") == 0) { + FREE_AND_NULL(mfx->preload); + mfx->preload = strdup("true"); + } else if (strcmp(ret_result, "false") == 0) { + FREE_AND_NULL(mfx->preload); + mfx->preload = strdup("false"); + } + /*check tag : removable*/ + } else if (ret_result && strcmp(ret_result, "removable") == 0) { + ret_result = strtok(NULL, delims); + if (strcmp(ret_result, "true") == 0){ + FREE_AND_NULL(mfx->removable); + mfx->removable = strdup("true"); + } else if (strcmp(ret_result, "false") == 0) { + FREE_AND_NULL(mfx->removable); + mfx->removable = strdup("false"); + } + /*check tag : not matched*/ + } else + _LOGD("tag process [%s]is not defined\n", ret_result); + + free(tag); + + /*check next value*/ + if (tagv[++i] != NULL) + tag = strdup(tagv[i]); + else { + /*update tag : system*/ + if (mfx->preload && (strcmp(mfx->preload,"true")==0) && (strcmp(mfx->removable,"false")==0)){ + FREE_AND_NULL(mfx->system); + mfx->system = strdup("true"); + } + _LOGD("tag process success...\n"); + return; + } + } +} + +static int __ps_process_icon(xmlTextReaderPtr reader, icon_x *icon) +{ + __save_xml_attribute(reader, "name", &icon->name, NULL); + __save_xml_attribute(reader, "section", &icon->section, NULL); + __save_xml_attribute(reader, "size", &icon->size, NULL); + __save_xml_attribute(reader, "resolution", &icon->resolution, NULL); + __save_xml_lang(reader, &icon->lang); + + xmlTextReaderRead(reader); + const char *text = ASCII(xmlTextReaderValue(reader)); + if(text) { + icon->text = (const char *)__get_icon_with_path(text); + FREE_AND_NULL(text); + } + + return 0; +} + +static int __ps_process_image(xmlTextReaderPtr reader, image_x *image) +{ + __save_xml_attribute(reader, "name", &image->name, NULL); + __save_xml_attribute(reader, "section", &image->section, NULL); + __save_xml_lang(reader, &image->lang); + __save_xml_value(reader, &image->text); + + return 0; +} + +static int __ps_process_label(xmlTextReaderPtr reader, label_x *label) +{ + __save_xml_attribute(reader, "name", &label->name, NULL); + __save_xml_lang(reader, &label->lang); + __save_xml_value(reader, &label->text); + +/* _LOGD("lable name %s\n", label->name); + _LOGD("lable lang %s\n", label->lang); + _LOGD("lable text %s\n", label->text); +*/ + return 0; + +} + +static int __ps_process_author(xmlTextReaderPtr reader, author_x *author) +{ + __save_xml_attribute(reader, "email", &author->email, NULL); + __save_xml_attribute(reader, "href", &author->href, NULL); + __save_xml_lang(reader, &author->lang); + __save_xml_value(reader, &author->text); + + return 0; +} + +static int __ps_process_description(xmlTextReaderPtr reader, description_x *description) +{ + __save_xml_lang(reader, &description->lang); + __save_xml_value(reader, &description->text); + + return 0; +} + +static int __ps_process_license(xmlTextReaderPtr reader, license_x *license) +{ + __save_xml_lang(reader, &license->lang); + __save_xml_value(reader, &license->text); + + return 0; +} + +static int __ps_process_capability(xmlTextReaderPtr reader, capability_x *capability) +{ + const xmlChar *node; + int ret = -1; + int depth = -1; + resolution_x *tmp1 = NULL; + + __save_xml_attribute(reader, "operation-id", &capability->operationid, NULL); + + depth = xmlTextReaderDepth(reader); + while ((ret = __next_child_element(reader, depth))) { + node = xmlTextReaderConstName(reader); + if (!node) { + _LOGD("xmlTextReaderConstName value is NULL\n"); + return -1; + } + + if (!strcmp(ASCII(node), "resolution")) { + resolution_x *resolution = malloc(sizeof(resolution_x)); + if (resolution == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(resolution, '\0', sizeof(resolution_x)); + LISTADD(capability->resolution, resolution); + ret = __ps_process_resolution(reader, resolution); + } else + return -1; + if (ret < 0) { + _LOGD("Processing capability failed\n"); + return ret; + } + } + + SAFE_LISTHEAD(capability->resolution, tmp1); + + return ret; +} + +static int __ps_process_datacontrol(xmlTextReaderPtr reader, datacontrol_x *datacontrol) +{ + __save_xml_attribute(reader, "providerid", &datacontrol->providerid, NULL); + __save_xml_attribute(reader, "access", &datacontrol->access, NULL); + __save_xml_attribute(reader, "type", &datacontrol->type, NULL); + + return 0; +} + +static int __ps_process_uiapplication(xmlTextReaderPtr reader, uiapplication_x *uiapplication) +{ + const xmlChar *node; + int ret = -1; + int depth = -1; + label_x *tmp1 = NULL; + icon_x *tmp2 = NULL; + appsvc_x *tmp3 = NULL; + launchconditions_x *tmp4 = NULL; + notification_x *tmp5 = NULL; + datashare_x *tmp6 = NULL; + category_x *tmp7 = NULL; + metadata_x *tmp8 = NULL; + image_x *tmp9 = NULL; + permission_x *tmp10 = NULL; + datacontrol_x *tmp11 = NULL; + + __save_xml_attribute(reader, "appid", &uiapplication->appid, NULL); + retvm_if(uiapplication->appid == NULL, PM_PARSER_R_ERROR, "appid cant be NULL, appid field is mandatory\n"); + __save_xml_attribute(reader, "exec", &uiapplication->exec, NULL); + __save_xml_attribute(reader, "ambient-support", &uiapplication->ambient_support, "false"); + __save_xml_attribute(reader, "nodisplay", &uiapplication->nodisplay, "false"); + __save_xml_attribute(reader, "multiple", &uiapplication->multiple, "false"); + __save_xml_attribute(reader, "type", &uiapplication->type, NULL); + __save_xml_attribute(reader, "categories", &uiapplication->categories, NULL); + __save_xml_attribute(reader, "extraid", &uiapplication->extraid, NULL); + __save_xml_attribute(reader, "taskmanage", &uiapplication->taskmanage, "true"); + __save_xml_attribute(reader, "enabled", &uiapplication->enabled, "true"); + __save_xml_attribute(reader, "hw-acceleration", &uiapplication->hwacceleration, "default"); + __save_xml_attribute(reader, "screen-reader", &uiapplication->screenreader, "use-system-setting"); + __save_xml_attribute(reader, "mainapp", &uiapplication->mainapp, "false"); + __save_xml_attribute(reader, "recentimage", &uiapplication->recentimage, "false"); + __save_xml_attribute(reader, "launchcondition", &uiapplication->launchcondition, "false"); + __save_xml_attribute(reader, "indicatordisplay", &uiapplication->indicatordisplay, "true"); + __save_xml_attribute(reader, "portrait-effectimage", &uiapplication->portraitimg, NULL); + __save_xml_attribute(reader, "landscape-effectimage", &uiapplication->landscapeimg, NULL); + __save_xml_attribute(reader, "effectimage-type", &uiapplication->effectimage_type, "image"); + __save_xml_attribute(reader, "guestmode-visibility", &uiapplication->guestmode_visibility, "true"); + __save_xml_attribute(reader, "permission-type", &uiapplication->permission_type, "normal"); + __save_xml_attribute(reader, "component-type", &uiapplication->component_type, "uiapp"); + /*component_type has "svcapp" or "uiapp", if it is not, parsing manifest is fail*/ + retvm_if(((strcmp(uiapplication->component_type, "svcapp") != 0) && (strcmp(uiapplication->component_type, "uiapp") != 0) && (strcmp(uiapplication->component_type, "widgetapp") != 0)), PM_PARSER_R_ERROR, "invalid component_type[%s]\n", uiapplication->component_type); + __save_xml_attribute(reader, "submode", &uiapplication->submode, "false"); + __save_xml_attribute(reader, "submode-mainid", &uiapplication->submode_mainid, NULL); + __save_xml_attribute(reader, "process-pool", &uiapplication->process_pool, "false"); + __save_xml_attribute(reader, "auto-restart", &uiapplication->autorestart, "false"); + __save_xml_attribute(reader, "on-boot", &uiapplication->onboot, "false"); + __save_xml_attribute(reader, "multi-instance", &uiapplication->multi_instance, "false"); + __save_xml_attribute(reader, "multi-instance-mainid", &uiapplication->multi_instance_mainid, NULL); + __save_xml_attribute(reader, "ui-gadget", &uiapplication->ui_gadget, "false"); + uiapplication->multi_window = strdup("false"); + uiapplication->package= strdup(package); + + /*hw-acceleration values are changed from use-GL/not-use-GL/use-system-setting to on/off/default*/ + if (strcmp(uiapplication->hwacceleration, "use-GL") == 0) { + free(uiapplication->hwacceleration); + uiapplication->hwacceleration = strdup("on"); + } else if (strcmp(uiapplication->hwacceleration, "not-use-GL") == 0) { + free(uiapplication->hwacceleration); + uiapplication->hwacceleration = strdup("off"); + } else if (strcmp(uiapplication->hwacceleration, "use-system-setting") == 0) { + free(uiapplication->hwacceleration); + uiapplication->hwacceleration = strdup("default"); + } + + depth = xmlTextReaderDepth(reader); + while ((ret = __next_child_element(reader, depth))) { + node = xmlTextReaderConstName(reader); + if (!node) { + _LOGD("xmlTextReaderConstName value is NULL\n"); + return -1; + } + if (!strcmp(ASCII(node), "label")) { + label_x *label = malloc(sizeof(label_x)); + if (label == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(label, '\0', sizeof(label_x)); + LISTADD(uiapplication->label, label); + ret = __ps_process_label(reader, label); + } else if (!strcmp(ASCII(node), "icon")) { + icon_x *icon = malloc(sizeof(icon_x)); + if (icon == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(icon, '\0', sizeof(icon_x)); + LISTADD(uiapplication->icon, icon); + ret = __ps_process_icon(reader, icon); + } else if (!strcmp(ASCII(node), "image")) { + image_x *image = malloc(sizeof(image_x)); + if (image == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(image, '\0', sizeof(image_x)); + LISTADD(uiapplication->image, image); + ret = __ps_process_image(reader, image); + } else if (!strcmp(ASCII(node), "category")) { + category_x *category = malloc(sizeof(category_x)); + if (category == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(category, '\0', sizeof(category_x)); + LISTADD(uiapplication->category, category); + ret = __ps_process_category(reader, category); + } else if (!strcmp(ASCII(node), "metadata")) { + metadata_x *metadata = malloc(sizeof(metadata_x)); + if (metadata == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(metadata, '\0', sizeof(metadata_x)); + LISTADD(uiapplication->metadata, metadata); + ret = __ps_process_metadata(reader, metadata); + // multiwindow check + if (strcmp(metadata->key, "http://developer.samsung.com/tizen/metadata/multiwindow") == 0) + FREE_AND_STRDUP("true", uiapplication->multi_window); + + __save_xml_supportfeature(metadata->key, uiapplication); + } else if (!strcmp(ASCII(node), "permission")) { + permission_x *permission = malloc(sizeof(permission_x)); + if (permission == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(permission, '\0', sizeof(permission_x)); + LISTADD(uiapplication->permission, permission); + ret = __ps_process_permission(reader, permission); + } else if (!strcmp(ASCII(node), "application-service")) { + appsvc_x *appsvc = malloc(sizeof(appsvc_x)); + if (appsvc == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(appsvc, '\0', sizeof(appsvc_x)); + LISTADD(uiapplication->appsvc, appsvc); + ret = __ps_process_appsvc(reader, appsvc); + } else if (!strcmp(ASCII(node), "app-control")) { + appsvc_x *appsvc = malloc(sizeof(appsvc_x)); + if (appsvc == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(appsvc, '\0', sizeof(appsvc_x)); + LISTADD(uiapplication->appsvc, appsvc); + ret = __ps_process_appsvc(reader, appsvc); + } else if (!strcmp(ASCII(node), "data-share")) { + datashare_x *datashare = malloc(sizeof(datashare_x)); + if (datashare == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(datashare, '\0', sizeof(datashare_x)); + LISTADD(uiapplication->datashare, datashare); + ret = __ps_process_datashare(reader, datashare); + } else if (!strcmp(ASCII(node), "launch-conditions")) { + launchconditions_x *launchconditions = malloc(sizeof(launchconditions_x)); + if (launchconditions == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(launchconditions, '\0', sizeof(launchconditions_x)); + LISTADD(uiapplication->launchconditions, launchconditions); + ret = __ps_process_launchconditions(reader, launchconditions); + } else if (!strcmp(ASCII(node), "notification")) { + notification_x *notification = malloc(sizeof(notification_x)); + if (notification == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(notification, '\0', sizeof(notification_x)); + LISTADD(uiapplication->notification, notification); + ret = __ps_process_notification(reader, notification); + } else if (!strcmp(ASCII(node), "datacontrol")) { + datacontrol_x *datacontrol = malloc(sizeof(datacontrol_x)); + if (datacontrol == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(datacontrol, '\0', sizeof(datacontrol_x)); + LISTADD(uiapplication->datacontrol, datacontrol); + ret = __ps_process_datacontrol(reader, datacontrol); + } else + return -1; + if (ret < 0) { + _LOGD("Processing uiapplication failed\n"); + return ret; + } + } + + SAFE_LISTHEAD(uiapplication->label, tmp1); + SAFE_LISTHEAD(uiapplication->icon, tmp2); + SAFE_LISTHEAD(uiapplication->appsvc, tmp3); + SAFE_LISTHEAD(uiapplication->launchconditions, tmp4); + SAFE_LISTHEAD(uiapplication->notification, tmp5); + SAFE_LISTHEAD(uiapplication->datashare, tmp6); + SAFE_LISTHEAD(uiapplication->category, tmp7); + SAFE_LISTHEAD(uiapplication->metadata, tmp8); + SAFE_LISTHEAD(uiapplication->image, tmp9); + SAFE_LISTHEAD(uiapplication->permission, tmp10); + SAFE_LISTHEAD(uiapplication->datacontrol, tmp11); + + return ret; +} + +static int __ps_process_deviceprofile(xmlTextReaderPtr reader, deviceprofile_x *deviceprofile) +{ + /*TODO: once policy is set*/ + __save_xml_attribute(reader, "name", &deviceprofile->name, NULL); + return 0; +} + +static int __ps_process_font(xmlTextReaderPtr reader, font_x *font) +{ + /*TODO: once policy is set*/ + return 0; +} + +static int __ps_process_theme(xmlTextReaderPtr reader, theme_x *theme) +{ + /*TODO: once policy is set*/ + return 0; +} + +static int __ps_process_daemon(xmlTextReaderPtr reader, daemon_x *daemon) +{ + /*TODO: once policy is set*/ + return 0; +} + +static int __ps_process_ime(xmlTextReaderPtr reader, ime_x *ime) +{ + /*TODO: once policy is set*/ + return 0; +} + +static int __start_process(xmlTextReaderPtr reader, manifest_x * mfx) +{ + _LOGD("__start_process\n"); + const xmlChar *node; + int ret = -1; + int depth = -1; + label_x *tmp1 = NULL; + author_x *tmp2 = NULL; + description_x *tmp3 = NULL; + license_x *tmp4 = NULL; + uiapplication_x *tmp5 = NULL; + daemon_x *tmp6 = NULL; + theme_x *tmp7 = NULL; + font_x *tmp8 = NULL; + ime_x *tmp9 = NULL; + icon_x *tmp10 = NULL; + compatibility_x *tmp11 = NULL; + deviceprofile_x *tmp12 = NULL; + privileges_x *tmp13 = NULL; + + depth = xmlTextReaderDepth(reader); + while ((ret = __next_child_element(reader, depth))) { + node = xmlTextReaderConstName(reader); + if (!node) { + _LOGD("xmlTextReaderConstName value is NULL\n"); + return -1; + } + + if (!strcmp(ASCII(node), "label")) { + label_x *label = malloc(sizeof(label_x)); + if (label == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(label, '\0', sizeof(label_x)); + LISTADD(mfx->label, label); + ret = __ps_process_label(reader, label); + } else if (!strcmp(ASCII(node), "author")) { + author_x *author = malloc(sizeof(author_x)); + if (author == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(author, '\0', sizeof(author_x)); + LISTADD(mfx->author, author); + ret = __ps_process_author(reader, author); + } else if (!strcmp(ASCII(node), "description")) { + description_x *description = malloc(sizeof(description_x)); + if (description == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(description, '\0', sizeof(description_x)); + LISTADD(mfx->description, description); + ret = __ps_process_description(reader, description); + } else if (!strcmp(ASCII(node), "license")) { + license_x *license = malloc(sizeof(license_x)); + if (license == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(license, '\0', sizeof(license_x)); + LISTADD(mfx->license, license); + ret = __ps_process_license(reader, license); + } else if (!strcmp(ASCII(node), "privileges")) { + privileges_x *privileges = malloc(sizeof(privileges_x)); + if (privileges == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(privileges, '\0', sizeof(privileges_x)); + LISTADD(mfx->privileges, privileges); + ret = __ps_process_privileges(reader, privileges); + } else if (!strcmp(ASCII(node), "ui-application")) { + uiapplication_x *uiapplication = malloc(sizeof(uiapplication_x)); + if (uiapplication == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(uiapplication, '\0', sizeof(uiapplication_x)); + LISTADD(mfx->uiapplication, uiapplication); + ret = __ps_process_uiapplication(reader, uiapplication); + } else if (!strcmp(ASCII(node), "service-application")) { + uiapplication_x *uiapplication = malloc(sizeof(uiapplication_x)); + if (uiapplication == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(uiapplication, '\0', sizeof(uiapplication_x)); + LISTADD(mfx->uiapplication, uiapplication); + ret = __ps_process_uiapplication(reader, uiapplication); + FREE_AND_STRDUP("svcapp", uiapplication->component_type); + } else if (!strcmp(ASCII(node), "watch-application")) { + category_x *tmp_category; + int watch_category_set = 0; + + uiapplication_x *uiapplication = malloc(sizeof(uiapplication_x)); + if (uiapplication == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(uiapplication, '\0', sizeof(uiapplication_x)); + LISTADD(mfx->uiapplication, uiapplication); + ret = __ps_process_uiapplication(reader, uiapplication); + FREE_AND_STRDUP("watchapp", uiapplication->component_type); + FREE_AND_STRDUP("true", uiapplication->nodisplay); + FREE_AND_STRDUP("false", uiapplication->taskmanage); + if (uiapplication->type == NULL) + FREE_AND_STRDUP("capp", uiapplication->type); + + for (tmp_category = uiapplication->category; + tmp_category != NULL; + tmp_category = tmp_category->next) + { + if (strcmp(tmp_category->name, + WATCH_CLOCK_CATEGORY) == 0) { + watch_category_set = 1; + break; + } + } + + if (watch_category_set == 0) { + category_x *category = malloc(sizeof(category_x)); + if (category == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(category, '\0', sizeof(category_x)); + LISTADD(uiapplication->category, category); + category->name = strdup(WATCH_CLOCK_CATEGORY); + } + + SAFE_LISTHEAD(uiapplication->category, tmp_category); + } else if (!strcmp(ASCII(node), "daemon")) { + daemon_x *daemon = malloc(sizeof(daemon_x)); + if (daemon == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(daemon, '\0', sizeof(daemon_x)); + LISTADD(mfx->daemon, daemon); + ret = __ps_process_daemon(reader, daemon); + } else if (!strcmp(ASCII(node), "theme")) { + theme_x *theme = malloc(sizeof(theme_x)); + if (theme == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(theme, '\0', sizeof(theme_x)); + LISTADD(mfx->theme, theme); + ret = __ps_process_theme(reader, theme); + } else if (!strcmp(ASCII(node), "font")) { + font_x *font = malloc(sizeof(font_x)); + if (font == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(font, '\0', sizeof(font_x)); + LISTADD(mfx->font, font); + ret = __ps_process_font(reader, font); + } else if (!strcmp(ASCII(node), "ime")) { + ime_x *ime = malloc(sizeof(ime_x)); + if (ime == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(ime, '\0', sizeof(ime_x)); + LISTADD(mfx->ime, ime); + ret = __ps_process_ime(reader, ime); + } else if (!strcmp(ASCII(node), "icon")) { + icon_x *icon = malloc(sizeof(icon_x)); + if (icon == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(icon, '\0', sizeof(icon_x)); + LISTADD(mfx->icon, icon); + ret = __ps_process_icon(reader, icon); + } else if (!strcmp(ASCII(node), "profile")) { + deviceprofile_x *deviceprofile = malloc(sizeof(deviceprofile_x)); + if (deviceprofile == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(deviceprofile, '\0', sizeof(deviceprofile_x)); + LISTADD(mfx->deviceprofile, deviceprofile); + ret = __ps_process_deviceprofile(reader, deviceprofile); + } else if (!strcmp(ASCII(node), "compatibility")) { + compatibility_x *compatibility = malloc(sizeof(compatibility_x)); + if (compatibility == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(compatibility, '\0', sizeof(compatibility_x)); + LISTADD(mfx->compatibility, compatibility); + ret = __ps_process_compatibility(reader, compatibility); + } else if (!strcmp(ASCII(node), "shortcut-list")) { + continue; + } else if (!strcmp(ASCII(node), "livebox")) { /**< @todo will be deprecated soon */ + continue; + } else if (!strcmp(ASCII(node), "widget")) { + continue; + } else if (!strcmp(ASCII(node), "account")) { + continue; + } else if (!strcmp(ASCII(node), "notifications")) { + continue; + } else if (!strcmp(ASCII(node), "ime")) { + continue; + } else + return -1; + + if (ret < 0) { + _LOGD("Processing manifest failed\n"); + return ret; + } + } + + SAFE_LISTHEAD(mfx->label, tmp1); + SAFE_LISTHEAD(mfx->author, tmp2); + SAFE_LISTHEAD(mfx->description, tmp3); + SAFE_LISTHEAD(mfx->license, tmp4); + SAFE_LISTHEAD(mfx->uiapplication, tmp5); + SAFE_LISTHEAD(mfx->daemon, tmp6); + SAFE_LISTHEAD(mfx->theme, tmp7); + SAFE_LISTHEAD(mfx->font, tmp8); + SAFE_LISTHEAD(mfx->ime, tmp9); + SAFE_LISTHEAD(mfx->icon, tmp10); + SAFE_LISTHEAD(mfx->compatibility, tmp11); + SAFE_LISTHEAD(mfx->deviceprofile, tmp12); + SAFE_LISTHEAD(mfx->privileges, tmp13); + + return ret; +} + +static int __process_manifest(xmlTextReaderPtr reader, manifest_x * mfx) +{ + const xmlChar *node; + int ret = -1; + + if ((ret = __next_child_element(reader, -1))) { + node = xmlTextReaderConstName(reader); + retvm_if(!node, PM_PARSER_R_ERROR, "xmlTextReaderConstName value is NULL\n"); + + if (!strcmp(ASCII(node), "manifest")) { + __save_xml_attribute(reader, "xmlns", &mfx->ns, NULL); + __save_xml_attribute(reader, "package", &mfx->package, NULL); + retvm_if(mfx->package == NULL, PM_PARSER_R_ERROR, "package cant be NULL, package field is mandatory\n"); + __save_xml_attribute(reader, "version", &mfx->version, NULL); + __save_xml_attribute(reader, "size", &mfx->package_size, NULL); + __save_xml_attribute(reader, "install-location", &mfx->installlocation, "internal-only"); + __save_xml_attribute(reader, "type", &mfx->type, NULL); + __save_xml_attribute(reader, "root_path", &mfx->root_path, NULL); + __save_xml_attribute(reader, "csc_path", &mfx->csc_path, NULL); + __save_xml_attribute(reader, "appsetting", &mfx->appsetting, "false"); + __save_xml_attribute(reader, "storeclient-id", &mfx->storeclient_id, NULL); + __save_xml_attribute(reader, "nodisplay-setting", &mfx->nodisplay_setting, "false"); + __save_xml_attribute(reader, "url", &mfx->package_url, NULL); + __save_xml_attribute(reader, "support-disable", &mfx->support_disable, "false"); + __save_xml_attribute(reader, "mother-package", &mfx->mother_package, "false"); + + /* need to check */ + if (xmlTextReaderGetAttribute(reader, XMLCHAR("support-reset"))) { + mfx->support_reset = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("support-reset"))); + mfx->use_reset = strdup("false"); + } else { + mfx->use_reset = strdup("true"); + } + + __save_xml_supportmode(reader, mfx); + __save_xml_installedtime(mfx); + __save_xml_defaultvalue(mfx); + + ret = __start_process(reader, mfx); + } else { + _LOGD("No Manifest element found\n"); + return -1; + } + } + return ret; +} + + +static char* __convert_to_system_locale(const char *mlocale) +{ + if (mlocale == NULL) + return NULL; + char *locale = NULL; + locale = (char *)calloc(1, 6); + if (!locale) { + _LOGE("Malloc Failed\n"); + return NULL; + } + + strncpy(locale, mlocale, 2); + strncat(locale, "_", 1); + locale[3] = toupper(mlocale[3]); + locale[4] = toupper(mlocale[4]); + return locale; +} + +static int __ail_change_info(int op, const char *appid) +{ + void *lib_handle = NULL; + int (*ail_desktop_operation) (const char *); + char *aop = NULL; + int ret = 0; + + if ((lib_handle = dlopen(LIBAIL_PATH, RTLD_LAZY)) == NULL) { + _LOGE("dlopen is failed LIBAIL_PATH[%s]\n", LIBAIL_PATH); + goto END; + } + + + switch (op) { + case 0: + aop = "ail_desktop_add"; + break; + case 1: + aop = "ail_desktop_update"; + break; + case 2: + aop = "ail_desktop_remove"; + break; + case 3: + aop = "ail_desktop_clean"; + break; + case 4: + aop = "ail_desktop_fota"; + break; + default: + goto END; + break; + } + + if ((ail_desktop_operation = + dlsym(lib_handle, aop)) == NULL || dlerror() != NULL) { + _LOGE("can not find symbol \n"); + goto END; + } + + ret = ail_desktop_operation(appid); + +END: + if (lib_handle) + dlclose(lib_handle); + + return ret; +} + + +/* desktop shoud be generated automatically based on manifest */ +/* Currently removable, taskmanage, etc fields are not considerd. it will be decided soon.*/ +static int __ps_make_nativeapp_desktop(manifest_x * mfx, const char *manifest, ACTION_TYPE action) +{ + FILE* file = NULL; + int fd = 0; + char filepath[PKG_STRING_LEN_MAX] = ""; + char *buf = NULL; + char *buftemp = NULL; + char *locale = NULL; + + buf = (char *)calloc(1, BUFMAX); + if (!buf) { + _LOGE("Malloc Failed\n"); + return -1; + } + + buftemp = (char *)calloc(1, BUFMAX); + if (!buftemp) { + _LOGE("Malloc Failed\n"); + FREE_AND_NULL(buf); + return -1; + } + + if (action == ACTION_UPGRADE) + __ail_change_info(AIL_CLEAN, mfx->package); + + for(; mfx->uiapplication; mfx->uiapplication=mfx->uiapplication->next) { + + if (manifest != NULL) { + /* skip making a deskfile and update ail, if preload app is updated */ + if(strstr(manifest, MANIFEST_RO_PREFIX)) { + __ail_change_info(AIL_INSTALL, mfx->uiapplication->appid); + _LOGE("preload app is update : skip and update ail : %s", manifest); + continue; + } + } + + if(mfx->readonly && !strcasecmp(mfx->readonly, "True")) + snprintf(filepath, sizeof(filepath),"%s%s.desktop", DESKTOP_RO_PATH, mfx->uiapplication->appid); + else + snprintf(filepath, sizeof(filepath),"%s%s.desktop", DESKTOP_RW_PATH, mfx->uiapplication->appid); + + /* skip if desktop exists + if (access(filepath, R_OK) == 0) + continue; + */ + + file = fopen(filepath, "w"); + if(file == NULL) + { + _LOGS("Can't open %s", filepath); + FREE_AND_NULL(buf); + FREE_AND_NULL(buftemp); + return -1; + } + + snprintf(buf, BUFMAX, "[Desktop Entry]\n"); + fwrite(buf, 1, strlen(buf), file); + + for( ; mfx->uiapplication->label ; mfx->uiapplication->label = mfx->uiapplication->label->next) { + if(!strcmp(mfx->uiapplication->label->lang, DEFAULT_LOCALE)) { + snprintf(buf, BUFMAX, "Name=%s\n", mfx->uiapplication->label->text); + } else { + locale = __convert_to_system_locale(mfx->uiapplication->label->lang); + snprintf(buf, BUFMAX, "Name[%s]=%s\n", locale, + mfx->uiapplication->label->text); + FREE_AND_NULL(locale); + } + fwrite(buf, 1, strlen(buf), file); + } + + if(mfx->uiapplication->label && mfx->uiapplication->label->text) { + snprintf(buf, BUFMAX, "Name=%s\n", mfx->uiapplication->label->text); + fwrite(buf, 1, strlen(buf), file); + } +/* + else if(mfx->label && mfx->label->text) { + snprintf(buf, BUFMAX, "Name=%s\n", mfx->label->text); + fwrite(buf, 1, strlen(buf), file); + } else { + snprintf(buf, BUFMAX, "Name=%s\n", mfx->package); + fwrite(buf, 1, strlen(buf), file); + } +*/ + + + snprintf(buf, BUFMAX, "Type=Application\n"); + fwrite(buf, 1, strlen(buf), file); + + if(mfx->uiapplication->exec) { + snprintf(buf, BUFMAX, "Exec=%s\n", mfx->uiapplication->exec); + fwrite(buf, 1, strlen(buf), file); + } + + if(mfx->uiapplication->icon && mfx->uiapplication->icon->text) { + snprintf(buf, BUFMAX, "Icon=%s\n", mfx->uiapplication->icon->text); + fwrite(buf, 1, strlen(buf), file); + } else if(mfx->icon && mfx->icon->text) { + snprintf(buf, BUFMAX, "Icon=%s\n", mfx->icon->text); + fwrite(buf, 1, strlen(buf), file); + } + + // MIME types + if(mfx->uiapplication && mfx->uiapplication->appsvc) { + appsvc_x *asvc = mfx->uiapplication->appsvc; + mime_x *mi = NULL; + const char *mime = NULL; + const char *mime_delim = "; "; + int mime_count = 0; + + strncpy(buf, "MimeType=", BUFMAX-1); + while (asvc) { + mi = asvc->mime; + while (mi) { + mime_count++; + mime = mi->name; + _LOGD("MIME type: %s\n", mime); + strncat(buf, mime, BUFMAX-strlen(buf)-1); + if(mi->next) { + strncat(buf, mime_delim, BUFMAX-strlen(buf)-1); + } + + mi = mi->next; + mime = NULL; + } + asvc = asvc->next; + } + _LOGD("MIME types: buf[%s]\n", buf); + _LOGD("MIME count: %d\n", mime_count); + if(mime_count) + fwrite(buf, 1, strlen(buf), file); + } + + if(mfx->version) { + snprintf(buf, BUFMAX, "Version=%s\n", mfx->version); + fwrite(buf, 1, strlen(buf), file); + } + + if(mfx->uiapplication->nodisplay) { + snprintf(buf, BUFMAX, "NoDisplay=%s\n", mfx->uiapplication->nodisplay); + fwrite(buf, 1, strlen(buf), file); + } + + if(mfx->uiapplication->categories) { + snprintf(buf, BUFMAX, "Categories=%s\n", mfx->uiapplication->categories); + fwrite(buf, 1, strlen(buf), file); + } + + if(mfx->uiapplication->taskmanage && !strcasecmp(mfx->uiapplication->taskmanage, "False")) { + snprintf(buf, BUFMAX, "X-TIZEN-TaskManage=False\n"); + fwrite(buf, 1, strlen(buf), file); + } + + if(mfx->uiapplication->enabled && !strcasecmp(mfx->uiapplication->enabled, "False")) { + snprintf(buf, BUFMAX, "X-TIZEN-Enabled=False\n"); + fwrite(buf, 1, strlen(buf), file); + } + + if(mfx->uiapplication->hwacceleration) { + snprintf(buf, BUFMAX, "Hw-Acceleration=%s\n", mfx->uiapplication->hwacceleration); + fwrite(buf, 1, strlen(buf), file); + } + + if(mfx->uiapplication->multiple && !strcasecmp(mfx->uiapplication->multiple, "True")) { + snprintf(buf, BUFMAX, "X-TIZEN-Multiple=True\n"); + fwrite(buf, 1, strlen(buf), file); + } + + if(mfx->uiapplication->extraid) { + snprintf(buf, BUFMAX, "X-TIZEN-PackageID=%s\n", mfx->uiapplication->extraid); + fwrite(buf, 1, strlen(buf), file); + } + + if(mfx->removable && !strcasecmp(mfx->removable, "False")) { + snprintf(buf, BUFMAX, "X-TIZEN-Removable=False\n"); + fwrite(buf, 1, strlen(buf), file); + } + + if(mfx->type) { + snprintf(buf, BUFMAX, "X-TIZEN-PackageType=%s\n", mfx->type); + fwrite(buf, 1, strlen(buf), file); + } + + if(mfx->uiapplication->submode && !strcasecmp(mfx->uiapplication->submode, "True")) { + snprintf(buf, BUFMAX, "X-TIZEN-Submode=%s\n", mfx->uiapplication->submode); + fwrite(buf, 1, strlen(buf), file); + snprintf(buf, BUFMAX, "X-TIZEN-SubmodeMainid=%s\n", mfx->uiapplication->submode_mainid); + fwrite(buf, 1, strlen(buf), file); + } + + snprintf(buf, BUFMAX, "X-TIZEN-PkgID=%s\n", mfx->package); + fwrite(buf, 1, strlen(buf), file); + + + snprintf(buf, BUFMAX, "X-TIZEN-InstalledStorage=%s\n", mfx->installed_storage); + fwrite(buf, 1, strlen(buf), file); + +// snprintf(buf, BUFMAX, "X-TIZEN-PackageType=rpm\n"); +// fwrite(buf, 1, strlen(buf), file); + + + if(mfx->uiapplication->appsvc) { + snprintf(buf, BUFMAX, "X-TIZEN-Svc="); + _LOGD("buf[%s]\n", buf); + + + uiapplication_x *up = mfx->uiapplication; + appsvc_x *asvc = NULL; + operation_x *op = NULL; + mime_x *mi = NULL; + uri_x *ui = NULL; + subapp_x *sub = NULL; + const char *operation = NULL; + const char *mime = NULL; + const char *uri = NULL; + const char *subapp = NULL; + int i = 0; + + + asvc = up->appsvc; + while(asvc != NULL) { + op = asvc->operation; + while(op != NULL) { + if (op) + operation = op->name; + mi = asvc->mime; + + do + { + if (mi) + mime = mi->name; + sub = asvc->subapp; + do + { + if (sub) + subapp = sub->name; + ui = asvc->uri; + do + { + if (ui) + uri = ui->name; + + if(i++ > 0) { + strncpy(buftemp, buf, BUFMAX); + snprintf(buf, BUFMAX, "%s;", buftemp); + } + + + strncpy(buftemp, buf, BUFMAX); + snprintf(buf, BUFMAX, "%s%s|%s|%s|%s", buftemp, operation?operation:"NULL", uri?uri:"NULL", mime?mime:"NULL", subapp?subapp:"NULL"); + _LOGD("buf[%s]\n", buf); + + if (ui) + ui = ui->next; + uri = NULL; + } while(ui != NULL); + if (sub) + sub = sub->next; + subapp = NULL; + }while(sub != NULL); + if (mi) + mi = mi->next; + mime = NULL; + }while(mi != NULL); + if (op) + op = op->next; + operation = NULL; + } + asvc = asvc->next; + } + + + fwrite(buf, 1, strlen(buf), file); + +// strncpy(buftemp, buf, BUFMAX); +// snprintf(buf, BUFMAX, "%s\n", buftemp); +// fwrite(buf, 1, strlen(buf), file); + } + + fflush(file); + fd = fileno(file); + fsync(fd); + fclose(file); + if (action == ACTION_FOTA) + __ail_change_info(AIL_FOTA, mfx->uiapplication->appid); + else + __ail_change_info(AIL_INSTALL, mfx->uiapplication->appid); + } + + FREE_AND_NULL(buf); + FREE_AND_NULL(buftemp); + + return 0; +} + +static int __ps_remove_nativeapp_desktop(manifest_x *mfx) +{ + char filepath[PKG_STRING_LEN_MAX] = ""; + int ret = 0; + uiapplication_x *uiapplication = mfx->uiapplication; + + for(; uiapplication; uiapplication=uiapplication->next) { + snprintf(filepath, sizeof(filepath),"%s%s.desktop", DESKTOP_RW_PATH, uiapplication->appid); + + __ail_change_info(AIL_REMOVE, uiapplication->appid); + + ret = remove(filepath); + if (ret <0) + return -1; + } + + return 0; +} + +void __add_preload_info(manifest_x * mfx, const char *manifest) +{ + if(strstr(manifest, MANIFEST_RO_PREFIX)) { + FREE_AND_NULL(mfx->readonly); + mfx->readonly = strdup("True"); + + FREE_AND_NULL(mfx->preload); + mfx->preload = strdup("True"); + + FREE_AND_NULL(mfx->removable); + mfx->removable = strdup("False"); + + FREE_AND_NULL(mfx->system); + mfx->system = strdup("True"); + } +} + +static int __check_preload_updated(manifest_x * mfx, const char *manifest) +{ + char filepath[PKG_STRING_LEN_MAX] = ""; + int ret = 0; + uiapplication_x *uiapplication = mfx->uiapplication; + + if(strstr(manifest, MANIFEST_RO_PREFIX)) { + /* if preload app is updated, then remove previous desktop file on RW*/ + for(; uiapplication; uiapplication=uiapplication->next) { + snprintf(filepath, sizeof(filepath),"%s%s.desktop", DESKTOP_RW_PATH, uiapplication->appid); + ret = remove(filepath); + if (ret <0) + return -1; + } + } else { + /* if downloaded app is updated, then update tag set true*/ + FREE_AND_NULL(mfx->update); + mfx->update = strdup("true"); + } + + return 0; +} + +static int __get_appid_list(const char *pkgid, void *user_data) +{ + int col = 0; + int cols = 0; + int ret = 0; + char *appid = NULL; + + sqlite3_stmt *stmt = NULL; + sqlite3 *pkgmgr_parser_db; + + char *query = sqlite3_mprintf("select app_id from package_app_info where package=%Q", pkgid); + + ret = db_util_open(PKGMGR_PARSER_DB_FILE, &pkgmgr_parser_db, 0); + if (ret != SQLITE_OK) { + _LOGE("open fail\n"); + sqlite3_free(query); + return -1; + } + ret = sqlite3_prepare_v2(pkgmgr_parser_db, query, strlen(query), &stmt, NULL); + if (ret != SQLITE_OK) { + _LOGE("prepare_v2 fail\n"); + sqlite3_close(pkgmgr_parser_db); + sqlite3_free(query); + return -1; + } + + cols = sqlite3_column_count(stmt); + while(1) + { + ret = sqlite3_step(stmt); + if(ret == SQLITE_ROW) { + for(col = 0; col < cols; col++) + { + appid = (char*)sqlite3_column_text(stmt, col); + _LOGS("success find appid[%s]\n", appid); + (*(GList**)user_data) = g_list_append((*(GList**)user_data), g_strdup(appid)); + } + ret = 0; + } else { + break; + } + } + sqlite3_finalize(stmt); + sqlite3_close(pkgmgr_parser_db); + sqlite3_free(query); + return ret; +} + +void __call_uninstall_plugin(const char *pkgid, GList *appid_list) +{ + char *appid = NULL; + GList *tmp_list; + + if (pkgid == NULL) { + _LOGD("pkgid is null\n"); + return; + } + + tmp_list = appid_list; + _pkgmgr_parser_plugin_open_db(); + + _pkgmgr_parser_plugin_uninstall_plugin(PKGMGR_PARSER_PLUGIN_TAG, pkgid, pkgid); + + while (tmp_list) { + appid = (char *)tmp_list->data; + if (appid) { + _pkgmgr_parser_plugin_uninstall_plugin(PKGMGR_PARSER_PLUGIN_METADATA, pkgid, appid); + _pkgmgr_parser_plugin_uninstall_plugin(PKGMGR_PARSER_PLUGIN_CATEGORY, pkgid, appid); + } + tmp_list = g_list_next(tmp_list); + } + + _pkgmgr_parser_plugin_close_db(); +} + +static int __delete_pkgid_info_for_uninstallation(const char *pkgid) +{ + retvm_if(pkgid == NULL, PM_PARSER_R_ERROR, "argument supplied is NULL"); + + int ret = -1; + char *appid = NULL; + GList *appid_list = NULL; + GList *tmp = NULL; + char filepath[PKG_STRING_LEN_MAX] = ""; + + _LOGD("Start uninstall for pkgid : delete pkgid[%s]\n", pkgid); + + /*get appid list*/ + ret = __get_appid_list(pkgid, &appid_list); + retvm_if(ret < 0, PM_PARSER_R_ERROR, "Fail to get app_list"); + + _LOGD("call plugin uninstall\n"); + + /*call plugin uninstall*/ + __call_uninstall_plugin(pkgid, appid_list); + + /* delete pkgmgr db */ + ret = pkgmgr_parser_delete_pkgid_info_from_db(pkgid); + if (ret == -1) + _LOGD("DB pkgid info Delete failed\n"); + else + _LOGD("DB pkgid info Delete Success\n"); + + /* delete desktop file*/ + tmp = appid_list; + while (tmp) { + appid = (char *)tmp->data; + if (appid) { + _LOGD("Delete appid[%s] info from db\n", appid); + + ret = pkgmgr_parser_delete_appid_info_from_db(appid); + if (ret == -1) + _LOGD("DB appid info Delete failed\n"); + else + _LOGD("DB appid info Delete Success\n"); + + ret = __ail_change_info(AIL_REMOVE, appid); + if (ret < 0) + _LOGD("AIL_REMOVE failed\n"); + + snprintf(filepath, sizeof(filepath),"%s%s.desktop", DESKTOP_RW_PATH, appid); + if (access(filepath, R_OK) == 0) { + ret = remove(filepath); + if (ret < 0) + _LOGD("remove failed\n"); + } + g_free(tmp->data); + } + tmp = g_list_next(tmp); + } + + g_list_free(appid_list); + + _LOGD("Finish : uninstall for pkgid\n"); + + return PM_PARSER_R_OK; +} + +static int __pkgmgr_db_check_update_condition(manifest_x *mfx) +{ + int ret = -1; + char *preload = NULL; + char *system = NULL; + char *csc_path = NULL; + char *installed_storage = NULL; + sqlite3_stmt *stmt = NULL; + sqlite3 *pkgmgr_parser_db; + char *query = NULL; + + ret = _pkgmgr_db_open(PKGMGR_PARSER_DB_FILE, &pkgmgr_parser_db); + retvm_if(ret != PM_PARSER_R_OK, PM_PARSER_R_ERROR, "_pkgmgr_db_open failed\n"); + + query = sqlite3_mprintf("select package_preload from package_info where package=%Q", mfx->package); + + ret = _pkgmgr_db_prepare(pkgmgr_parser_db, query, &stmt); + tryvm_if(ret != PM_PARSER_R_OK, ret = PM_PARSER_R_ERROR, "_pkgmgr_db_prepare failed[%s]\n", query); + + ret = _pkgmgr_db_step(stmt); + tryvm_if(ret != PM_PARSER_R_OK, ret = PM_PARSER_R_ERROR, "_pkgmgr_db_step failed\n"); + + ret = _pkgmgr_db_get_str(stmt, 0, &preload); + tryvm_if(ret != PM_PARSER_R_OK, ret = PM_PARSER_R_ERROR, "_pkgmgr_db_get_str failed\n"); + + if (strcasecmp(preload, "true") == 0) { + FREE_AND_NULL(mfx->preload); + mfx->preload = strdup("true"); + } + + _pkgmgr_db_finalize(stmt); + sqlite3_free(query); + + query = sqlite3_mprintf("select package_system from package_info where package=%Q", mfx->package); + + ret = _pkgmgr_db_prepare(pkgmgr_parser_db, query, &stmt); + tryvm_if(ret != PM_PARSER_R_OK, ret = PM_PARSER_R_ERROR, "_pkgmgr_db_prepare failed[%s]\n", query); + + ret = _pkgmgr_db_step(stmt); + tryvm_if(ret != PM_PARSER_R_OK, ret = PM_PARSER_R_ERROR, "_pkgmgr_db_step failed\n"); + + ret = _pkgmgr_db_get_str(stmt, 0, &system); + tryvm_if(ret != PM_PARSER_R_OK, ret = PM_PARSER_R_ERROR, "_pkgmgr_db_get_str failed\n"); + + if (strcasecmp(system, "true") == 0) { + FREE_AND_NULL(mfx->system); + mfx->system = strdup("true"); + } + + _pkgmgr_db_finalize(stmt); + sqlite3_free(query); + + query = sqlite3_mprintf("select csc_path from package_info where package=%Q", mfx->package); + + ret = _pkgmgr_db_prepare(pkgmgr_parser_db, query, &stmt); + tryvm_if(ret != PM_PARSER_R_OK, ret = PM_PARSER_R_ERROR, "_pkgmgr_db_prepare failed[%s]\n", query); + + ret = _pkgmgr_db_step(stmt); + tryvm_if(ret != PM_PARSER_R_OK, ret = PM_PARSER_R_ERROR, "_pkgmgr_db_step failed\n"); + + ret = _pkgmgr_db_get_str(stmt, 0, &csc_path); + tryvm_if(ret != PM_PARSER_R_OK, ret = PM_PARSER_R_ERROR, "_pkgmgr_db_get_str failed\n"); + + if (csc_path != NULL) { + if (mfx->csc_path) + FREE_AND_NULL(mfx->csc_path); + mfx->csc_path = strdup(csc_path); + } + + _pkgmgr_db_finalize(stmt); + sqlite3_free(query); + + query = sqlite3_mprintf("select installed_storage from package_info where package=%Q", mfx->package); + + ret = _pkgmgr_db_prepare(pkgmgr_parser_db, query, &stmt); + tryvm_if(ret != PM_PARSER_R_OK, ret = PM_PARSER_R_ERROR, "_pkgmgr_db_prepare failed[%s]\n", query); + + ret = _pkgmgr_db_step(stmt); + tryvm_if(ret != PM_PARSER_R_OK, ret = PM_PARSER_R_ERROR, "_pkgmgr_db_step failed\n"); + + ret = _pkgmgr_db_get_str(stmt, 0, &installed_storage); + tryvm_if(ret != PM_PARSER_R_OK, ret = PM_PARSER_R_ERROR, "_pkgmgr_db_get_str failed\n"); + + if (strcasecmp(installed_storage, "installed_external") == 0) { + FREE_AND_NULL(mfx->installed_storage); + mfx->installed_storage = strdup("installed_external"); + } + + ret = PM_PARSER_R_OK; + +catch: + + sqlite3_free(query); + _pkgmgr_db_finalize(stmt); + _pkgmgr_db_close(pkgmgr_parser_db); + + return ret; +} + +static int __pkgmgr_db_check_disable_condition(manifest_x *mfx) +{ + int ret = -1; + char *package_disable = NULL; + sqlite3_stmt *stmt = NULL; + sqlite3 *pkgmgr_parser_db; + char *query = NULL; + + ret = _pkgmgr_db_open(PKGMGR_PARSER_DB_FILE, &pkgmgr_parser_db); + retvm_if(ret != PM_PARSER_R_OK, PM_PARSER_R_ERROR, "_pkgmgr_db_open failed\n"); + + query = sqlite3_mprintf("select package_disable from package_info where package=%Q", mfx->package); + + ret = _pkgmgr_db_prepare(pkgmgr_parser_db, query, &stmt); + tryvm_if(ret != PM_PARSER_R_OK, ret = PM_PARSER_R_ERROR, "_pkgmgr_db_prepare failed[%s]\n", query); + + ret = _pkgmgr_db_step(stmt); + tryvm_if(ret != PM_PARSER_R_OK, ret = PM_PARSER_R_ERROR, "_pkgmgr_db_step failed\n"); + + ret = _pkgmgr_db_get_str(stmt, 0, &package_disable); + tryvm_if(ret != PM_PARSER_R_OK, ret = PM_PARSER_R_ERROR, "_pkgmgr_db_get_str failed\n"); + + if (strcasecmp(package_disable, "true") == 0) { + ret = 1; + } else { + ret = -1; + } + +catch: + + sqlite3_free(query); + _pkgmgr_db_finalize(stmt); + _pkgmgr_db_close(pkgmgr_parser_db); + + return ret; +} + +API int pkgmgr_parser_create_desktop_file(manifest_x *mfx) +{ + int ret = 0; + if (mfx == NULL) { + _LOGD("Manifest pointer is NULL\n"); + return -1; + } + ret = __ps_make_nativeapp_desktop(mfx, NULL, ACTION_INSTALL); + if (ret == -1) + _LOGD("Creating desktop file failed\n"); + else + _LOGD("Creating desktop file Success\n"); + return ret; +} + +API void pkgmgr_parser_free_manifest_xml(manifest_x *mfx) +{ + _pkgmgrinfo_basic_free_manifest_x(mfx); +} + +API manifest_x *pkgmgr_parser_process_manifest_xml(const char *manifest) +{ + _LOGD("parsing start\n"); + xmlTextReaderPtr reader; + manifest_x *mfx = NULL; + + reader = xmlReaderForFile(manifest, NULL, 0); + if (reader) { + mfx = malloc(sizeof(manifest_x)); + if (mfx) { + memset(mfx, '\0', sizeof(manifest_x)); + if (__process_manifest(reader, mfx) < 0) { + _LOGD("Parsing Failed\n"); + pkgmgr_parser_free_manifest_xml(mfx); + mfx = NULL; + } else + _LOGD("Parsing Success\n"); + } else { + _LOGD("Memory allocation error\n"); + } + xmlFreeTextReader(reader); + } else { + _LOGD("Unable to create xml reader\n"); + } + return mfx; +} + +/* These APIs are intended to call parser directly */ + +API int pkgmgr_parser_parse_manifest_for_installation(const char *manifest, char *const tagv[]) +{ + retvm_if(manifest == NULL, PM_PARSER_R_ERROR, "argument supplied is NULL"); + _LOGD("parsing manifest for installation: %s\n", manifest); + + manifest_x *mfx = NULL; + int ret = -1; + char *hash = NULL; + + xmlInitParser(); + mfx = pkgmgr_parser_process_manifest_xml(manifest); + retvm_if(mfx == NULL, PM_PARSER_R_ERROR, "argument supplied is NULL"); + + _LOGD("Parsing Finished\n"); + + _LOGD("Generating the hash for manifest"); + hash = pkgmgrinfo_basic_generate_hash_for_file(manifest); + if(hash != NULL){ + mfx->hash = hash; + _LOGD("Hash for [%s] file is [%s]\n",manifest,hash); + } + + __add_preload_info(mfx, manifest); + + _LOGD("Added preload infomation\n"); + + __ps_process_tag(mfx, tagv); + + ret = pkgmgr_parser_insert_manifest_info_in_db(mfx); + if (ret < 0) { + ret = __delete_pkgid_info_for_uninstallation(mfx->package); + ret = pkgmgr_parser_insert_manifest_info_in_db(mfx); + retvm_if(ret == PM_PARSER_R_ERROR, PM_PARSER_R_ERROR, "DB Insert failed"); + } + + _LOGD("DB Insert Success\n"); + + _pkgmgr_parser_plugin_process_plugin(mfx, manifest, ACTION_INSTALL); + + ret = __check_action_fota(tagv); + tryvm_if(ret == PM_PARSER_R_OK, ret = PM_PARSER_R_OK, "fota install called, dont need desktop generation\n"); + + ret = __ps_make_nativeapp_desktop(mfx, NULL, ACTION_INSTALL); + + if (ret == -1) + _LOGD("Creating desktop file failed\n"); + else + _LOGD("Creating desktop file Success\n"); + + +catch: + pkgmgr_parser_free_manifest_xml(mfx); + _LOGD("Free Done\n"); + xmlCleanupParser(); + + return PM_PARSER_R_OK; +} + +API int pkgmgr_parser_parse_manifest_for_upgrade(const char *manifest, char *const tagv[]) +{ + retvm_if(manifest == NULL, PM_PARSER_R_ERROR, "argument supplied is NULL"); + _LOGD("parsing manifest for upgradation: %s\n", manifest); + + manifest_x *mfx = NULL; + int ret = -1; + int package_disabled = 0; + char *hash = NULL; + + xmlInitParser(); + mfx = pkgmgr_parser_process_manifest_xml(manifest); + retvm_if(mfx == NULL, PM_PARSER_R_ERROR, "argument supplied is NULL"); + + _LOGD("Parsing Finished\n"); + + _LOGD("Generating the hash for manifest"); + hash = pkgmgrinfo_basic_generate_hash_for_file(manifest); + if(hash != NULL){ + mfx->hash = hash; + _LOGD("Hash for [%s] file is [%s]\n",manifest,hash); + } + + __add_preload_info(mfx, manifest); + _LOGD("Added preload infomation\n"); + __check_preload_updated(mfx, manifest); + + if (__pkgmgr_db_check_disable_condition(mfx) == 1) { + _LOGD("pkgid[%s] is disabed\n", mfx->package); + package_disabled = 1; + } + + ret = __pkgmgr_db_check_update_condition(mfx); + if (ret < 0) + _LOGD("__pkgmgr_db_check_update_condition failed\n"); + + ret = pkgmgr_parser_update_manifest_info_in_db(mfx); + retvm_if(ret == PM_PARSER_R_ERROR, PM_PARSER_R_ERROR, "DB Insert failed"); + _LOGD("DB Update Success\n"); + + if (package_disabled == 1) { + ret = pkgmgr_parser_disable_pkg(mfx->package, NULL); + tryvm_if(ret != PM_PARSER_R_OK, ret = PM_PARSER_R_ERROR, "disable_pkg failed[%s]\n", mfx->package); + } + + _pkgmgr_parser_plugin_process_plugin(mfx, manifest, ACTION_UPGRADE); + + ret = __check_action_fota(tagv); + tryvm_if(ret == PM_PARSER_R_OK, ret = PM_PARSER_R_OK, "fota install called, dont need desktop generation\n"); + + ret = __ps_make_nativeapp_desktop(mfx, manifest, ACTION_UPGRADE); + if (ret == -1) + _LOGD("Creating desktop file failed\n"); + else + _LOGD("Creating desktop file Success\n"); + +catch: + journal_appcore_app_updated(mfx->package); + + pkgmgr_parser_free_manifest_xml(mfx); + _LOGD("Free Done\n"); + xmlCleanupParser(); + + return PM_PARSER_R_OK; +} + +API int pkgmgr_parser_parse_manifest_for_uninstallation(const char *manifest, char *const tagv[]) +{ + retvm_if(manifest == NULL, PM_PARSER_R_ERROR, "argument supplied is NULL"); + int ret = -1; + manifest_x *mfx = NULL; + + if (!strstr(manifest, ".xml")) { + _LOGD("manifest is pkgid[%s]\n", manifest); + ret = __delete_pkgid_info_for_uninstallation(manifest); + if (ret <0) + _LOGD("__delete_manifest_for_fota failed\n"); + + return PM_PARSER_R_OK; + } + + _LOGD("parsing manifest for uninstallation: %s\n", manifest); + + xmlInitParser(); + mfx = pkgmgr_parser_process_manifest_xml(manifest); + retvm_if(mfx == NULL, PM_PARSER_R_ERROR, "argument supplied is NULL"); + + _LOGD("Parsing Finished\n"); + + __add_preload_info(mfx, manifest); + _LOGD("Added preload infomation\n"); + + _pkgmgr_parser_plugin_process_plugin(mfx, manifest, ACTION_UNINSTALL); + + ret = pkgmgr_parser_delete_manifest_info_from_db(mfx); + if (ret == -1) + _LOGD("DB Delete failed\n"); + else + _LOGD("DB Delete Success\n"); + + ret = __ps_remove_nativeapp_desktop(mfx); + if (ret == -1) + _LOGD("Removing desktop file failed\n"); + else + _LOGD("Removing desktop file Success\n"); + + pkgmgr_parser_free_manifest_xml(mfx); + _LOGD("Free Done\n"); + xmlCleanupParser(); + + return PM_PARSER_R_OK; +} + +API int pkgmgr_parser_parse_manifest_for_preload() +{ + return pkgmgr_parser_update_preload_info_in_db(); +} + +API char *pkgmgr_parser_get_manifest_file(const char *pkgid) +{ + return __pkgid_to_manifest(pkgid); +} + +API int pkgmgr_parser_run_parser_for_installation(xmlDocPtr docPtr, const char *tag, const char *pkgid) +{ + return __ps_run_parser(docPtr, tag, ACTION_INSTALL, pkgid); +} + +API int pkgmgr_parser_run_parser_for_upgrade(xmlDocPtr docPtr, const char *tag, const char *pkgid) +{ + return __ps_run_parser(docPtr, tag, ACTION_UPGRADE, pkgid); +} + +API int pkgmgr_parser_run_parser_for_uninstallation(xmlDocPtr docPtr, const char *tag, const char *pkgid) +{ + return __ps_run_parser(docPtr, tag, ACTION_UNINSTALL, pkgid); +} + +API int pkgmgr_parser_check_manifest_validation(const char *manifest) +{ + if (manifest == NULL) { + _LOGE("manifest file is NULL\n"); + return PM_PARSER_R_EINVAL; + } + int ret = PM_PARSER_R_OK; + xmlSchemaParserCtxtPtr ctx = NULL; + xmlSchemaValidCtxtPtr vctx = NULL; + xmlSchemaPtr xschema = NULL; + ctx = xmlSchemaNewParserCtxt(SCHEMA_FILE); + if (ctx == NULL) { + _LOGE("xmlSchemaNewParserCtxt() Failed\n"); + return PM_PARSER_R_ERROR; + } + xschema = xmlSchemaParse(ctx); + if (xschema == NULL) { + _LOGE("xmlSchemaParse() Failed\n"); + ret = PM_PARSER_R_ERROR; + goto cleanup; + } + vctx = xmlSchemaNewValidCtxt(xschema); + if (vctx == NULL) { + _LOGE("xmlSchemaNewValidCtxt() Failed\n"); + return PM_PARSER_R_ERROR; + } + xmlSchemaSetValidErrors(vctx, (xmlSchemaValidityErrorFunc) fprintf, (xmlSchemaValidityWarningFunc) fprintf, stderr); + ret = xmlSchemaValidateFile(vctx, manifest, 0); + if (ret == -1) { + _LOGE("xmlSchemaValidateFile() failed\n"); + ret = PM_PARSER_R_ERROR; + goto cleanup; + } else if (ret == 0) { + _LOGE("Manifest is Valid\n"); + ret = PM_PARSER_R_OK; + goto cleanup; + } else { + _LOGE("Manifest Validation Failed with error code %d\n", ret); + ret = PM_PARSER_R_ERROR; + goto cleanup; + } + +cleanup: + if(vctx != NULL) + xmlSchemaFreeValidCtxt(vctx); + + if(ctx != NULL) + xmlSchemaFreeParserCtxt(ctx); + + if(xschema != NULL) + xmlSchemaFree(xschema); + + return ret; +} + +API int pkgmgr_parser_enable_pkg(const char *pkgid, char *const tagv[]) +{ + retvm_if(pkgid == NULL, PM_PARSER_R_ERROR, "pkgid is NULL."); + + int ret = -1; + char *manifest = NULL; + manifest_x *mfx = NULL; + + ret = pkgmgr_parser_update_enabled_pkg_info_in_db(pkgid); + if (ret == -1) + _LOGD("pkgmgr_parser_update_enabled_pkg_info_in_db(%s) failed.\n", pkgid); + else + _LOGD("pkgmgr_parser_update_enabled_pkg_info_in_db(%s) succeed.\n", pkgid); + + manifest = __pkgid_to_manifest(pkgid); + retvm_if(manifest == NULL, PM_PARSER_R_ERROR, "manifest of pkgid(%s) is NULL.", pkgid); + + xmlInitParser(); + mfx = pkgmgr_parser_process_manifest_xml(manifest); + tryvm_if(mfx == NULL, ret = PM_PARSER_R_ERROR, "process_manifest_xml(%s) failed\n", pkgid); + + _pkgmgr_parser_plugin_process_plugin(mfx, manifest, ACTION_INSTALL); + + ret = PM_PARSER_R_OK; + +catch: + if (mfx) + pkgmgr_parser_free_manifest_xml(mfx); + + if (manifest) + free(manifest); + + xmlCleanupParser(); + + return ret; +} + +API int pkgmgr_parser_disable_pkg(const char *pkgid, char *const tagv[]) +{ + retvm_if(pkgid == NULL, PM_PARSER_R_ERROR, "pkgid is NULL."); + + int ret = -1; + GList *appid_list = NULL; + + /*get appid list*/ + ret = __get_appid_list(pkgid, &appid_list); + retvm_if(ret < 0, PM_PARSER_R_ERROR, "Fail to get app_list"); + + _LOGD("call plugin uninstall\n"); + + /*call plugin uninstall*/ + __call_uninstall_plugin(pkgid, appid_list); + + ret = pkgmgr_parser_update_disabled_pkg_info_in_db(pkgid); + if (ret == -1) + _LOGD("pkgmgr_parser_update_disabled_pkg_info_in_db(%s) failed.\n", pkgid); + else + _LOGD("pkgmgr_parser_update_disabled_pkg_info_in_db(%s) succeed.\n", pkgid); + + g_list_free(appid_list); + + return PM_PARSER_R_OK; +} + +/* update aliasid entry in package-app-aliasid */ +API int pkgmgr_parser_insert_app_aliasid(void ) +{ + return pkgmgr_parser_insert_app_aliasid_info_in_db(); +} + +API int pkgmgr_parser_update_app_aliasid(void ) +{ + return pkgmgr_parser_update_app_aliasid_info_in_db(); +} + diff --git a/parser/pkgmgr_parser.h b/parser/pkgmgr_parser.h new file mode 100755 index 0000000..e932d7c --- /dev/null +++ b/parser/pkgmgr_parser.h @@ -0,0 +1,577 @@ +/* + * pkgmgr-info + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __PKGMGR_PARSER_H__ +#define __PKGMGR_PARSER_H__ + +/** + * @file pkgmgr_parser.h + * @author Sewook Park + * @author Shobhit Srivastava + * @version 0.1 + * @brief This file declares API of pkgmgr_parser + * @addtogroup APPLICATION_FRAMEWORK + * @{ + * + * @defgroup PackageManagerParser + * @section Header Header file to include: + * @code + * #include + * @endcode + * + * @} + */ + +#include +#include "pkgmgrinfo_basic.h" +#include "pkgmgr_parser_feature.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* defined path and file*/ +#define DESKTOP_RW_PATH "/opt/share/applications/" +#define DESKTOP_RO_PATH "/usr/share/applications/" +#define MANIFEST_RO_PREFIX "/usr/share/packages/" +#define MANIFEST_RW_PREFIX "/opt/share/packages/" + +#define SCHEMA_FILE "/usr/etc/package-manager/preload/manifest.xsd" + +#define BUFMAX 1024*128 + +/* so path */ +#define LIBAPPSVC_PATH "/usr/lib/libappsvc.so.0" +#define LIBAIL_PATH "/usr/lib/libail.so.0" + +/** Integer property for mode*/ +#define PMINFO_SUPPORT_MODE_ULTRA_POWER_SAVING 0x00000001 +#define PMINFO_SUPPORT_MODE_COOL_DOWN 0x00000002 +#define PMINFO_SUPPORT_MODE_SCREEN_READER 0x00000004 + +#define PMINFO_SUPPORT_FEATURE_MULTI_WINDOW 0x00000001 +#define PMINFO_SUPPORT_FEATURE_OOM_TERMINATION 0x00000002 +#define PMINFO_SUPPORT_FEATURE_LARGE_MEMORY 0x00000004 + +/* operation_type */ +typedef enum { + ACTION_INSTALL = 0, + ACTION_UPGRADE, + ACTION_UNINSTALL, + ACTION_FOTA, + ACTION_MAX +} ACTION_TYPE; + +typedef enum { + AIL_INSTALL = 0, + AIL_UPDATE, + AIL_REMOVE, + AIL_CLEAN, + AIL_FOTA, + AIL_MAX +} AIL_TYPE; + +/** + * @brief API return values + */ +enum { + PM_PARSER_R_EINVAL = -2, /**< Invalid argument */ + PM_PARSER_R_ERROR = -1, /**< General error */ + PM_PARSER_R_OK = 0 /**< General success */ +}; + +/** + * @fn char *pkgmgr_parser_get_manifest_file(const char *pkgid) + * @brief This API gets the manifest file of the package. + * + * @par This API is for package-manager installer backends. + * @par Sync (or) Async : Synchronous API + * + * @param[in] pkgid pointer to package ID + * @return manifest file path on success, NULL on failure + * @pre None + * @post Free the manifest file pointer that is returned by API + * @code +static int get_manifest_file(const char *pkgid) +{ + char *manifest = NULL; + manifest = pkgmgr_parser_get_manifest_file(pkgid); + if (manifest == NULL) + return -1; + printf("Manifest File Path is %s\n", manifest); + free(manifest); + return 0; +} + * @endcode + */ +char *pkgmgr_parser_get_manifest_file(const char *pkgid); + +/** + * @fn int pkgmgr_parser_parse_manifest_for_installation(const char *manifest, char *const tagv[]) + * @brief This API parses the manifest file of the package after installation and stores the data in DB. + * + * @par This API is for package-manager installer backends. + * @par Sync (or) Async : Synchronous API + * + * @param[in] manifest pointer to package manifest file + * @param[in] tagv array of xml tags or NULL + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre None + * @post None + * @code +static int parse_manifest_file_for_installation(const char *manifest) +{ + int ret = 0; + ret = pkgmgr_parser_parse_manifest_for_installation(manifest, NULL); + if (ret) + return -1; + return 0; +} + * @endcode + */ +int pkgmgr_parser_parse_manifest_for_installation(const char *manifest, char *const tagv[]); + +/** + * @fn int pkgmgr_parser_parse_manifest_for_upgrade(const char *manifest, char *const tagv[]) + * @brief This API parses the manifest file of the package after upgrade and stores the data in DB. + * + * @par This API is for package-manager installer backends. + * @par Sync (or) Async : Synchronous API + * + * @param[in] manifest pointer to package manifest file + * @param[in] tagv array of xml tags or NULL + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre None + * @post None + * @code +static int parse_manifest_file_for_upgrade(const char *manifest) +{ + int ret = 0; + ret = pkgmgr_parser_parse_manifest_for_upgrade(manifest, NULL); + if (ret) + return -1; + return 0; +} + * @endcode + */ +int pkgmgr_parser_parse_manifest_for_upgrade(const char *manifest, char *const tagv[]); + +/** + * @fn int pkgmgr_parser_parse_manifest_for_uninstallation(const char *manifest, char *const tagv[]) + * @brief This API parses the manifest file of the package after uninstallation and deletes the data from DB. + * + * @par This API is for package-manager installer backends. + * @par Sync (or) Async : Synchronous API + * + * @param[in] manifest pointer to package manifest file + * @param[in] tagv array of xml tags or NULL + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre None + * @post None + * @code +static int parse_manifest_file_for_uninstallation(const char *manifest) +{ + int ret = 0; + ret = pkgmgr_parser_parse_manifest_for_uninstallation(manifest, NULL); + if (ret) + return -1; + return 0; +} + * @endcode + */ +int pkgmgr_parser_parse_manifest_for_uninstallation(const char *manifest, char *const tagv[]); + +/** + * @fn int pkgmgr_parser_parse_manifest_for_preload() + * @brief This API update preload information to DB. + * + * @par This API is for package-manager installer backends. + * @par Sync (or) Async : Synchronous API + * + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre None + * @post None + * @code +static int parser_parse_manifest_for_preload() +{ + int ret = 0; + ret = pkgmgr_parser_parse_manifest_for_preload(); + if (ret) + return -1; + return 0; +} + * @endcode + */ +int pkgmgr_parser_parse_manifest_for_preload(); + +/** + * @fn int pkgmgr_parser_check_manifest_validation(const char *manifest) + * @brief This API validates the manifest file against the manifest schema. + * + * @par This API is for package-manager installer backends. + * @par Sync (or) Async : Synchronous API + * + * @param[in] manifest pointer to package manifest file + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre None + * @post None + * @code +static int validate_manifest_file(const char *manifest) +{ + int ret = 0; + ret = pkgmgr_parser_check_manifest_validation(manifest); + if (ret) + return -1; + return 0; +} + * @endcode + */ +int pkgmgr_parser_check_manifest_validation(const char *manifest); + +/** + * @fn void pkgmgr_parser_free_manifest_xml(manifest_x *mfx) + * @brief This API will free the manifest pointer by recursively freeing all sub elements. + * + * @par This API is for package-manager installer backends. + * @par Sync (or) Async : Synchronous API + * + * @param[in] mfx pointer to parsed manifest data + * @pre pkgmgr_parser_process_manifest_xml() + * @post None + * @code +static int parse_manifest_file(const char *manifest) +{ + manifest_x *mfx = NULL + mfx = pkgmgr_parser_process_manifest_xml(manifest); + if (mfx == NULL) + return -1; + printf("Parsing Manifest Success\n"); + pkgmgr_parser_free_manifest_xml(mfx); + return 0; +} + * @endcode + */ +void pkgmgr_parser_free_manifest_xml(manifest_x *mfx); + +/** + * @fn manifest_x *pkgmgr_parser_process_manifest_xml(const char *manifest) + * @brief This API parses the manifest file and stores all the data in the manifest structure. + * + * @par This API is for package-manager installer backends. + * @par Sync (or) Async : Synchronous API + * + * @param[in] manifest pointer to package manifest file + * @return manifest pointer on success, NULL on failure + * @pre None + * @post pkgmgr_parser_free_manifest_xml() + * @code +static int parse_manifest_file(const char *manifest) +{ + manifest_x *mfx = NULL + mfx = pkgmgr_parser_process_manifest_xml(manifest); + if (mfx == NULL) + return -1; + printf("Parsing Manifest Success\n"); + pkgmgr_parser_free_manifest_xml(mfx); + return 0; +} + * @endcode + */ +manifest_x *pkgmgr_parser_process_manifest_xml(const char *manifest); + +/** + * @fn manifest_x *pkgmgr_parser_get_manifest_info(const char *pkigid) + * @brief This API gets the manifest info from DB and stores all the data in the manifest structure. + * + * @par This API is for package-manager installer backends. + * @par Sync (or) Async : Synchronous API + * + * @param[in] pkgid package id for package + * @return manifest pointer on success, NULL on failure + * @pre None + * @post pkgmgr_parser_free_manifest_xml() + * @code +static int get_manifest_info(const char *pkgid) +{ + manifest_x *mfx = NULL + mfx = pkgmgr_parser_get_manifest_info(pkgid); + if (mfx == NULL) + return -1; + printf("Parsing Manifest Success\n"); + pkgmgr_parser_free_manifest_xml(mfx); + return 0; +} + * @endcode + */ +manifest_x *pkgmgr_parser_get_manifest_info(const char *pkigid); + +/* These APIs are intended to call parser directly */ +typedef int (*ps_iter_fn) (const char *tag, int type, void *userdata); + +int pkgmgr_parser_has_parser(const char *tag, int *type); +int pkgmgr_parser_get_list(ps_iter_fn iter_fn, void *data); + +/** + * @fn int pkgmgr_parser_run_parser_for_installation(xmlDocPtr docPtr, const char *tag, const char *pkgid) + * @brief This API calls the parser directly by supplying the xml docptr. It is used during package installation + * + * @par This API is for package-manager installer backends. + * @par Sync (or) Async : Synchronous API + * + * @param[in] docPtr XML doxument pointer + * @param[in] tag the xml tag corresponding to the parser that will parse the docPtr + * @param[in] pkgid the package id + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre None + * @post None + * @code +static int parse_docptr_for_installation(xmlDocPtr docPtr) +{ + int ret = 0; + ret = pkgmgr_parser_run_parser_for_installation(docPtr, "theme", "org.tizen.test"); + if (ret) + return -1; + return 0; +} + * @endcode + */ +int pkgmgr_parser_run_parser_for_installation(xmlDocPtr docPtr, const char *tag, const char *pkgid); + +/** + * @fn int pkgmgr_parser_run_parser_for_upgrade(xmlDocPtr docPtr, const char *tag, const char *pkgid) + * @brief This API calls the parser directly by supplying the xml docptr. It is used during package upgrade + * + * @par This API is for package-manager installer backends. + * @par Sync (or) Async : Synchronous API + * + * @param[in] docPtr XML doxument pointer + * @param[in] tag the xml tag corresponding to the parser that will parse the docPtr + * @param[in] pkgid the package id + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre None + * @post None + * @code +static int parse_docptr_for_upgrade(xmlDocPtr docPtr) +{ + int ret = 0; + ret = pkgmgr_parser_run_parser_for_upgrade(docPtr, "theme", "org.tizen.test"); + if (ret) + return -1; + return 0; +} + * @endcode + */ +int pkgmgr_parser_run_parser_for_upgrade(xmlDocPtr docPtr, const char *tag, const char *pkgid); + +/** + * @fn int pkgmgr_parser_run_parser_for_uninstallation(xmlDocPtr docPtr, const char *tag, const char *pkgid) + * @brief This API calls the parser directly by supplying the xml docptr. It is used during package uninstallation + * + * @par This API is for package-manager installer backends. + * @par Sync (or) Async : Synchronous API + * + * @param[in] docPtr XML doxument pointer + * @param[in] tag the xml tag corresponding to the parser that will parse the docPtr + * @param[in] pkgid the package id + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre None + * @post None + * @code +static int parse_docptr_for_uninstallation(xmlDocPtr docPtr) +{ + int ret = 0; + ret = pkgmgr_parser_run_parser_for_uninstallation(docPtr, "theme", "org.tizen.test"); + if (ret) + return -1; + return 0; +} + * @endcode + */ +int pkgmgr_parser_run_parser_for_uninstallation(xmlDocPtr docPtr, const char *tag, const char *pkgid); + + + +/** + * @fn int pkgmgr_parser_create_desktop_file(manifest_x *mfx) + * @brief This API generates the application desktop file + * + * @par This API is for package-manager installer backends. + * @par Sync (or) Async : Synchronous API + * + * @param[in] mfx manifest pointer + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre pkgmgr_parser_process_manifest_xml() + * @post pkgmgr_parser_free_manifest_xml() + * @code +static int create_desktop_file(char *manifest) +{ + int ret = 0; + manifest_x *mfx = NULL; + mfx = pkgmgr_parser_process_manifest_xml(manifest); + ret = pkgmgr_parser_create_desktop_file(mfx); + if (ret) + return -1; + pkgmgr_parser_free_manifest_xml(mfx); + return 0; +} + * @endcode + */ +int pkgmgr_parser_create_desktop_file(manifest_x *mfx); + +/** + * @fn int pkgmgr_parser_enable_pkg(const char *pkgid, char *const tagv[]) + * @brief This API updates the data of the enabled package in DB. + * + * @par This API is for package-manager. + * @par Sync (or) Async : Synchronous API + * + * @param[in] pkgid pointer to pkgid + * @param[in] tagv array of xml tags or NULL + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre None + * @post None + * @code +static int parser_disabled_pkg_for_installation(const char *pkgid) +{ + int ret = 0; + ret = pkgmgr_parser_enable_pkg(pkgid, NULL); + if (ret) + return -1; + return 0; +} + * @endcode + */ +int pkgmgr_parser_enable_pkg(const char *pkgid, char *const tagv[]); + +/** + * @fn int pkgmgr_parser_disable_pkg(const char *pkgid, char *const tagv[]) + * @brief This API updates the data of the disabled package in DB. + * + * @par This API is for package-manager. + * @par Sync (or) Async : Synchronous API + * + * @param[in] pkgid pointer to pkgid + * @param[in] tagv array of xml tags or NULL + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @pre None + * @post None + * @code +static int parse_disabled_pkg_file_for_uninstallation(const char *pkgid) +{ + int ret = 0; + ret = pkgmgr_parser_disable_pkg(pkgid, NULL); + if (ret) + return -1; + return 0; +} + * @endcode + */ +int pkgmgr_parser_disable_pkg(const char *pkgid, char *const tagv[]); + +/** + * @fn int pkgmgr_parser_insert_app_aliasid(void) + * @brief This API updates the app aliasid table. + * + * @par This API is for pkg_initdb and pkg_fota. + * @par Sync (or) Async : Synchronous API + * + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_ERROR internal error + * @pre None + * @post None + * @code +static int parse_insert_app_aliasid(void) +{ + int ret = 0; + ret = pkgmgr_parser_insert_app_aliasid(); + if (ret) + return -1; + return 0; +} + * @endcode + */ +int pkgmgr_parser_insert_app_aliasid(void ); + +/** + * @fn int pkgmgr_parser_update_app_aliasid(void) + * @brief This API updates the app aliasid table. + * + * @par This API is for csc. + * @par Sync (or) Async : Synchronous API + * + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_ERROR internal error + * @pre None + * @post None + * @code +static int parse_update_app_aliasid(void) +{ + int ret = 0; + ret = pkgmgr_parser_update_app_aliasid(); + if (ret) + return -1; + return 0; +} + * @endcode + */ +int pkgmgr_parser_update_app_aliasid(void ); + +/** @} */ +#ifdef __cplusplus +} +#endif +#endif /* __PKGMGR_PARSER_H__ */ diff --git a/parser/pkgmgr_parser_db.c b/parser/pkgmgr_parser_db.c new file mode 100755 index 0000000..c24079c --- /dev/null +++ b/parser/pkgmgr_parser_db.c @@ -0,0 +1,2431 @@ +/* + * pkgmgr-info + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "pkgmgr_parser_internal.h" +#include "pkgmgr_parser_db.h" + +#include "pkgmgrinfo_debug.h" +#include "pkgmgrinfo_type.h" + +#ifdef LOG_TAG +#undef LOG_TAG +#endif +#define LOG_TAG "PKGMGR_PARSER" + +#define MAX_QUERY_LEN 4096 +#define MAX_PACKAGE_STR_SIZE 512 +#define MAX_ALIAS_INI_ENTRY (2 * MAX_PACKAGE_STR_SIZE) + 1 +#define USR_APPSVC_ALIAS_INI "/usr/share/appsvc/alias.ini" +#define OPT_APPSVC_ALIAS_INI "/opt/usr/share/appsvc/alias.ini" +#define MANIFEST_DB "/opt/dbspace/.pkgmgr_parser.db" +typedef int (*sqlite_query_callback)(void *data, int ncols, char **coltxt, char **colname); + +sqlite3 *pkgmgr_parser_db; +sqlite3 *pkgmgr_cert_db; + + +#define QUERY_CREATE_TABLE_PACKAGE_INFO "create table if not exists package_info " \ + "(package text primary key not null, " \ + "package_type text DEFAULT 'rpm', " \ + "package_version text, " \ + "install_location text, " \ + "package_size text, " \ + "package_removable text DEFAULT 'true', " \ + "package_preload text DEFAULT 'false', " \ + "package_readonly text DEFAULT 'false', " \ + "package_update text DEFAULT 'false', " \ + "package_appsetting text DEFAULT 'false', " \ + "package_nodisplay text DEFAULT 'false', " \ + "package_system text DEFAULT 'false', " \ + "author_name text, " \ + "author_email text, " \ + "author_href text," \ + "installed_time text," \ + "installed_storage text," \ + "storeclient_id text," \ + "mainapp_id text," \ + "package_url text," \ + "root_path text," \ + "csc_path text," \ + "package_support_disable text DEFAULT 'false', " \ + "package_mother_package text DEFAULT 'false', " \ + "package_disable text DEFAULT 'false', " \ + "package_support_mode text, " \ + "package_hash text, " \ + "package_reserve1 text," \ + "package_reserve2 text," \ + "package_reserve3 text," \ + "package_reserve4 text," \ + "package_reserve5 text)" + +#define QUERY_CREATE_TABLE_PACKAGE_LOCALIZED_INFO "create table if not exists package_localized_info " \ + "(package text not null, " \ + "package_locale text DEFAULT 'No Locale', " \ + "package_label text, " \ + "package_icon text, " \ + "package_description text, " \ + "package_license text, " \ + "package_author, " \ + "PRIMARY KEY(package, package_locale), " \ + "FOREIGN KEY(package) " \ + "REFERENCES package_info(package) " \ + "ON DELETE CASCADE)" + +#define QUERY_CREATE_TABLE_PACKAGE_PRIVILEGE_INFO "create table if not exists package_privilege_info " \ + "(package text not null, " \ + "privilege text not null, " \ + "PRIMARY KEY(package, privilege) " \ + "FOREIGN KEY(package) " \ + "REFERENCES package_info(package) " \ + "ON DELETE CASCADE)" + +#define QUERY_CREATE_TABLE_PACKAGE_APP_INFO "create table if not exists package_app_info " \ + "(app_id text primary key not null, " \ + "app_component text, " \ + "app_exec text, " \ + "app_ambient_support text DEFAULT 'false', " \ + "app_nodisplay text DEFAULT 'false', " \ + "app_type text, " \ + "app_onboot text DEFAULT 'false', " \ + "app_multiple text DEFAULT 'false', " \ + "app_autorestart text DEFAULT 'false', " \ + "app_taskmanage text DEFAULT 'false', " \ + "app_enabled text DEFAULT 'true', " \ + "app_hwacceleration text DEFAULT 'default', " \ + "app_screenreader text DEFAULT 'use-system-setting', " \ + "app_mainapp text, " \ + "app_recentimage text, " \ + "app_launchcondition text, " \ + "app_indicatordisplay text DEFAULT 'true', " \ + "app_portraitimg text, " \ + "app_landscapeimg text, " \ + "app_effectimage_type text, " \ + "app_guestmodevisibility text DEFAULT 'true', " \ + "app_permissiontype text DEFAULT 'normal', " \ + "app_preload text DEFAULT 'false', " \ + "app_submode text DEFAULT 'false', " \ + "app_submode_mainid text, " \ + "app_installed_storage text, " \ + "app_process_pool text DEFAULT 'false', " \ + "app_multi_instance text DEFAULT 'false', " \ + "app_multi_instance_mainid text, " \ + "app_multi_window text DEFAULT 'false', " \ + "app_support_disable text DEFAULT 'false', " \ + "app_disable text DEFAULT 'false', " \ + "app_ui_gadget text DEFAULT 'false', " \ + "app_removable text DEFAULT 'false', " \ + "app_support_mode text, " \ + "app_support_feature text, " \ + "component_type text, " \ + "package text not null, " \ + "app_package_type text DEFAULT 'rpm', " \ + "app_package_system text, " \ + "app_package_installed_time text, " \ + "app_reserve1 text, " \ + "app_reserve2 text, " \ + "app_reserve3 text, " \ + "app_reserve4 text, " \ + "app_reserve5 text, " \ + "FOREIGN KEY(package) " \ + "REFERENCES package_info(package) " \ + "ON DELETE CASCADE)" + +#define QUERY_CREATE_TABLE_PACKAGE_APP_LOCALIZED_INFO "create table if not exists package_app_localized_info " \ + "(app_id text not null, " \ + "app_locale text DEFAULT 'No Locale', " \ + "app_label text, " \ + "app_icon text, " \ + "PRIMARY KEY(app_id,app_locale) " \ + "FOREIGN KEY(app_id) " \ + "REFERENCES package_app_info(app_id) " \ + "ON DELETE CASCADE)" + +#define QUERY_CREATE_TABLE_PACKAGE_APP_ICON_SECTION_INFO "create table if not exists package_app_icon_section_info " \ + "(app_id text not null, " \ + "app_icon text, " \ + "app_icon_section text, " \ + "app_icon_resolution text, " \ + "PRIMARY KEY(app_id,app_icon_section,app_icon_resolution) " \ + "FOREIGN KEY(app_id) " \ + "REFERENCES package_app_info(app_id) " \ + "ON DELETE CASCADE)" + +#define QUERY_CREATE_TABLE_PACKAGE_APP_IMAGE_INFO "create table if not exists package_app_image_info " \ + "(app_id text not null, " \ + "app_locale text DEFAULT 'No Locale', " \ + "app_image_section text, " \ + "app_image text, " \ + "PRIMARY KEY(app_id,app_image_section) " \ + "FOREIGN KEY(app_id) " \ + "REFERENCES package_app_info(app_id) " \ + "ON DELETE CASCADE)" + +#define QUERY_CREATE_TABLE_PACKAGE_APP_APP_CONTROL "create table if not exists package_app_app_control " \ + "(app_id text not null, " \ + "app_control text not null, " \ + "PRIMARY KEY(app_id,app_control) " \ + "FOREIGN KEY(app_id) " \ + "REFERENCES package_app_info(app_id) " \ + "ON DELETE CASCADE)" + +#define QUERY_CREATE_TABLE_PACKAGE_APP_APP_SVC "create table if not exists package_app_app_svc " \ + "(app_id text not null, " \ + "operation text not null, " \ + "uri_scheme text, " \ + "mime_type text, " \ + "subapp_name text, " \ + "PRIMARY KEY(app_id,operation,uri_scheme,mime_type,subapp_name) " \ + "FOREIGN KEY(app_id) " \ + "REFERENCES package_app_info(app_id) " \ + "ON DELETE CASCADE)" + +#define QUERY_CREATE_TABLE_PACKAGE_APP_APP_CATEGORY "create table if not exists package_app_app_category " \ + "(app_id text not null, " \ + "category text not null, " \ + "PRIMARY KEY(app_id,category) " \ + "FOREIGN KEY(app_id) " \ + "REFERENCES package_app_info(app_id) " \ + "ON DELETE CASCADE)" + +#define QUERY_CREATE_TABLE_PACKAGE_APP_APP_METADATA "create table if not exists package_app_app_metadata " \ + "(app_id text not null, " \ + "md_key text not null, " \ + "md_value text not null, " \ + "PRIMARY KEY(app_id, md_key, md_value) " \ + "FOREIGN KEY(app_id) " \ + "REFERENCES package_app_info(app_id) " \ + "ON DELETE CASCADE)" + +#define QUERY_CREATE_TABLE_PACKAGE_APP_APP_PERMISSION "create table if not exists package_app_app_permission " \ + "(app_id text not null, " \ + "pm_type text not null, " \ + "pm_value text not null, " \ + "PRIMARY KEY(app_id, pm_type, pm_value) " \ + "FOREIGN KEY(app_id) " \ + "REFERENCES package_app_info(app_id) " \ + "ON DELETE CASCADE)" + +#define QUERY_CREATE_TABLE_PACKAGE_APP_SHARE_ALLOWED "create table if not exists package_app_share_allowed " \ + "(app_id text not null, " \ + "data_share_path text not null, " \ + "data_share_allowed text not null, " \ + "PRIMARY KEY(app_id,data_share_path,data_share_allowed) " \ + "FOREIGN KEY(app_id) " \ + "REFERENCES package_app_info(app_id) " \ + "ON DELETE CASCADE)" + +#define QUERY_CREATE_TABLE_PACKAGE_APP_SHARE_REQUEST "create table if not exists package_app_share_request " \ + "(app_id text not null, " \ + "data_share_request text not null, " \ + "PRIMARY KEY(app_id,data_share_request) " \ + "FOREIGN KEY(app_id) " \ + "REFERENCES package_app_info(app_id) " \ + "ON DELETE CASCADE)" + +#define QUERY_CREATE_TABLE_PACKAGE_CERT_INDEX_INFO "create table if not exists package_cert_index_info " \ + "(cert_info text not null, " \ + "cert_id integer, " \ + "cert_ref_count integer, " \ + "PRIMARY KEY(cert_id)) " + +#define QUERY_CREATE_TABLE_PACKAGE_CERT_INFO "create table if not exists package_cert_info " \ + "(package text not null, " \ + "author_root_cert integer, " \ + "author_im_cert integer, " \ + "author_signer_cert integer, " \ + "dist_root_cert integer, " \ + "dist_im_cert integer, " \ + "dist_signer_cert integer, " \ + "dist2_root_cert integer, " \ + "dist2_im_cert integer, " \ + "dist2_signer_cert integer, " \ + "PRIMARY KEY(package)) " + +#define QUERY_CREATE_TABLE_PACKAGE_PKG_RESERVE "create table if not exists package_pkg_reserve " \ + "(pkgid text not null, " \ + "reserve1 text, " \ + "reserve2 text, " \ + "reserve3 text, " \ + "reserve4 text, " \ + "reserve5 text, " \ + "PRIMARY KEY(pkgid)) " + +#define QUERY_CREATE_TABLE_PACKAGE_APP_RESERVE "create table if not exists package_app_reserve " \ + "(app_id text not null, " \ + "reserve1 text, " \ + "reserve2 text, " \ + "reserve3 text, " \ + "reserve4 text, " \ + "reserve5 text, " \ + "PRIMARY KEY(app_id)) " + +#define QUERY_CREATE_TABLE_PACKAGE_PLUGIN_INFO "create table if not exists package_plugin_info " \ + "(pkgid text primary key not null, " \ + "enabled_plugin INTEGER DEFAULT 0)" + +#define QUERY_CREATE_TABLE_PACKAGE_APP_DATA_CONTROL "create table if not exists package_app_data_control " \ + "(app_id text not null, " \ + "providerid text not null, " \ + "access text not null, " \ + "type text not null, " \ + "PRIMARY KEY(app_id, providerid, access, type) " \ + "FOREIGN KEY(app_id) " \ + "REFERENCES package_app_info(app_id) " \ + "ON DELETE CASCADE)" + +#define QUERY_CREATE_TABLE_PACKAGE_APP_ALIASID "create table if not exists package_app_aliasid" \ + "(app_id text primary key not null, "\ + "alias_id text not null)" + +static int __insert_uiapplication_info(manifest_x *mfx); +static int __insert_uiapplication_appsvc_info(manifest_x *mfx); +static int __insert_uiapplication_appcategory_info(manifest_x *mfx); +static int __insert_uiapplication_appcontrol_info(manifest_x *mfx); +static int __insert_uiapplication_appmetadata_info(manifest_x *mfx); +static int __insert_uiapplication_share_allowed_info(manifest_x *mfx); +static int __insert_uiapplication_share_request_info(manifest_x *mfx); +static void __insert_uiapplication_locale_info(gpointer data, gpointer userdata); +static int __insert_uiapplication_datacontrol_info(manifest_x *mfx); +static void __insert_pkglocale_info(gpointer data, gpointer userdata); +static int __delete_manifest_info_from_pkgid(const char *pkgid); +static int __delete_manifest_info_from_appid(const char *appid); +static int __insert_manifest_info_in_db(manifest_x *mfx); +static int __delete_manifest_info_from_db(manifest_x *mfx); +static int __delete_appinfo_from_db(char *db_table, const char *appid); +static gint __comparefunc(gconstpointer a, gconstpointer b, gpointer userdata); +static int __pkgmgr_parser_create_db(sqlite3 **db_handle, const char *db_path); + +static void __str_trim(char *input) +{ + char *trim_str = input; + + if (input == NULL) + return; + + while (*input != 0) { + if (!isspace(*input)) { + *trim_str = *input; + trim_str++; + } + input++; + } + + *trim_str = 0; + return; +} + +const char *__get_str(const char *str) +{ + if (str == NULL) + { + return PKGMGR_PARSER_EMPTY_STR; + } + + return str; +} + +static int __pkgmgr_parser_create_db(sqlite3 **db_handle, const char *db_path) +{ + int ret = -1; + sqlite3 *handle; + if (access(db_path, F_OK) == 0) { + ret = + db_util_open(db_path, &handle, + DB_UTIL_REGISTER_HOOK_METHOD); + if (ret != SQLITE_OK) { + _LOGD("connect db [%s] failed!\n", + db_path); + return -1; + } + *db_handle = handle; + return 0; + } + _LOGD("%s DB does not exists. Create one!!\n", db_path); + + ret = + db_util_open(db_path, &handle, + DB_UTIL_REGISTER_HOOK_METHOD); + + if (ret != SQLITE_OK) { + _LOGD("connect db [%s] failed!\n", db_path); + return -1; + } + *db_handle = handle; + return 0; +} + +int __evaluate_query(sqlite3 *db_handle, char *query) +{ + sqlite3_stmt* p_statement; + int result; + result = sqlite3_prepare_v2(db_handle, query, strlen(query), &p_statement, NULL); + if (result != SQLITE_OK) { + _LOGE("Sqlite3 error [%d] : <%s> preparing <%s> querry\n", result, sqlite3_errmsg(db_handle), query); + return -1; + } + + result = sqlite3_step(p_statement); + if (result != SQLITE_DONE) { + _LOGE("Sqlite3 error [%d] : <%s> executing <%s> statement\n", result, sqlite3_errmsg(db_handle), query); + return -1; + } + + result = sqlite3_finalize(p_statement); + if (result != SQLITE_OK) { + _LOGE("Sqlite3 error [%d] : <%s> finalizing <%s> statement\n", result, sqlite3_errmsg(db_handle), query); + return -1; + } + return 0; +} + +int __initialize_db(sqlite3 *db_handle, char *db_query) +{ + return (__evaluate_query(db_handle, db_query)); +} + +int __exec_query(char *query) +{ + return (__evaluate_query(pkgmgr_parser_db, query)); +} + +int __exec_query_no_msg(char *query) +{ + char *error_message = NULL; + if (SQLITE_OK != + sqlite3_exec(pkgmgr_parser_db, query, NULL, NULL, &error_message)) { + sqlite3_free(error_message); + return -1; + } + sqlite3_free(error_message); + return 0; +} + +static int __exec_db_query(sqlite3 *db, char *query, sqlite_query_callback callback, void *data) +{ + char *error_message = NULL; + if (SQLITE_OK != + sqlite3_exec(db, query, callback, data, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + return -1; + } + sqlite3_free(error_message); + return 0; +} + +GList *__create_locale_list(GList *locale, label_x *lbl, license_x *lcn, icon_x *icn, description_x *dcn, author_x *ath) +{ + + while(lbl != NULL) + { + if (lbl->lang) + locale = g_list_insert_sorted_with_data(locale, (gpointer)lbl->lang, __comparefunc, NULL); + lbl = lbl->next; + } + while(lcn != NULL) + { + if (lcn->lang) + locale = g_list_insert_sorted_with_data(locale, (gpointer)lcn->lang, __comparefunc, NULL); + lcn = lcn->next; + } + while(icn != NULL) + { + if (icn->lang) + locale = g_list_insert_sorted_with_data(locale, (gpointer)icn->lang, __comparefunc, NULL); + icn = icn->next; + } + while(dcn != NULL) + { + if (dcn->lang) + locale = g_list_insert_sorted_with_data(locale, (gpointer)dcn->lang, __comparefunc, NULL); + dcn = dcn->next; + } + while(ath != NULL) + { + if (ath->lang) + locale = g_list_insert_sorted_with_data(locale, (gpointer)ath->lang, __comparefunc, NULL); + ath = ath->next; + } + return locale; + +} + +static GList *__create_icon_list(GList *locale, icon_x *icn) +{ + while(icn != NULL) + { + if (icn->section) + locale = g_list_insert_sorted_with_data(locale, (gpointer)icn->section, __comparefunc, NULL); + icn = icn->next; + } + return locale; +} + +static GList *__create_image_list(GList *locale, image_x *image) +{ + while(image != NULL) + { + if (image->section) + locale = g_list_insert_sorted_with_data(locale, (gpointer)image->section, __comparefunc, NULL); + image = image->next; + } + return locale; +} + +void __trimfunc(GList* trim_list) +{ + char *trim_data = NULL; + char *prev = NULL; + + GList *list = NULL; + list = g_list_first(trim_list); + + while (list) { + trim_data = (char *)list->data; + if (trim_data) { + if (prev) { + if (strcmp(trim_data, prev) == 0) { + trim_list = g_list_remove(trim_list, trim_data); + list = g_list_first(trim_list); + prev = NULL; + continue; + } else + prev = trim_data; + } + else + prev = trim_data; + } + list = g_list_next(list); + } +} + +static gint __comparefunc(gconstpointer a, gconstpointer b, gpointer userdata) +{ + if (a == NULL || b == NULL) + return 0; + if (strcmp((char*)a, (char*)b) == 0) + return 0; + if (strcmp((char*)a, (char*)b) < 0) + return -1; + if (strcmp((char*)a, (char*)b) > 0) + return 1; + return 0; +} + +void __extract_data(gpointer data, label_x *lbl, license_x *lcn, icon_x *icn, description_x *dcn, author_x *ath, + char **label, char **license, char **icon, char **description, char **author) +{ + while(lbl != NULL) + { + if (lbl->lang) { + if (strcmp(lbl->lang, (char *)data) == 0) { + *label = (char*)lbl->text; + break; + } + } + lbl = lbl->next; + } + while(lcn != NULL) + { + if (lcn->lang) { + if (strcmp(lcn->lang, (char *)data) == 0) { + *license = (char*)lcn->text; + break; + } + } + lcn = lcn->next; + } + while(icn != NULL) + { + if (icn->section == NULL) { + if (icn->lang) { + if (strcmp(icn->lang, (char *)data) == 0) { + *icon = (char*)icn->text; + break; + } + } + } + icn = icn->next; + } + while(dcn != NULL) + { + if (dcn->lang) { + if (strcmp(dcn->lang, (char *)data) == 0) { + *description = (char*)dcn->text; + break; + } + } + dcn = dcn->next; + } + while(ath != NULL) + { + if (ath->lang) { + if (strcmp(ath->lang, (char *)data) == 0) { + *author = (char*)ath->text; + break; + } + } + ath = ath->next; + } + +} + +static void __extract_icon_data(gpointer data, icon_x *icn, char **icon, char **resolution) +{ + while(icn != NULL) + { + if (icn->section) { + if (strcmp(icn->section, (char *)data) == 0) { + *icon = (char*)icn->text; + *resolution = (char*)icn->resolution; + break; + } + } + icn = icn->next; + } +} + +static void __extract_image_data(gpointer data, image_x*image, char **lang, char **img) +{ + while(image != NULL) + { + if (image->section) { + if (strcmp(image->section, (char *)data) == 0) { + *lang = (char*)image->lang; + *img = (char*)image->text; + break; + } + } + image = image->next; + } +} + +static void __insert_pkglocale_info(gpointer data, gpointer userdata) +{ + int ret = -1; + char *label = NULL; + char *icon = NULL; + char *description = NULL; + char *license = NULL; + char *author = NULL; + char *query = NULL; + + manifest_x *mfx = (manifest_x *)userdata; + label_x *lbl = mfx->label; + license_x *lcn = mfx->license; + icon_x *icn = mfx->icon; + description_x *dcn = mfx->description; + author_x *ath = mfx->author; + + __extract_data(data, lbl, lcn, icn, dcn, ath, &label, &license, &icon, &description, &author); + if (!label && !description && !icon && !license && !author) + return; + + query = sqlite3_mprintf("insert into package_localized_info(package, package_locale, " \ + "package_label, package_icon, package_description, package_license, package_author) values " \ + "(%Q, %Q, %Q, %Q, %Q, %Q, %Q)", + mfx->package, + (char*)data, + __get_str(label), + __get_str(icon), + __get_str(description), + __get_str(license), + __get_str(author)); + + ret = __exec_query(query); + if (ret == -1) + _LOGD("Package Localized Info DB Insert failed\n"); + + sqlite3_free(query); +} + +static int __insert_uiapplication_datacontrol_info(manifest_x *mfx) +{ + uiapplication_x *up = mfx->uiapplication; + datacontrol_x *dc = NULL; + int ret = -1; + char *query = NULL; + + while (up != NULL) + { + dc = up->datacontrol; + while (dc != NULL) { + query = sqlite3_mprintf("insert into package_app_data_control(app_id, providerid, access, type) " \ + "values(%Q, %Q, %Q, %Q)", \ + up->appid, + dc->providerid, + dc->access, + dc->type); + + ret = __exec_query(query); + sqlite3_free(query); + if (ret == -1) { + _LOGD("Package UiApp Data Control DB Insert Failed\n"); + return -1; + } + dc = dc->next; + } + up = up->next; + } + return 0; +} + +static void __insert_uiapplication_locale_info(gpointer data, gpointer userdata) +{ + int ret = -1; + char *label = NULL; + char *icon = NULL; + char *query = NULL; + + uiapplication_x *up = (uiapplication_x*)userdata; + label_x *lbl = up->label; + icon_x *icn = up->icon; + + __extract_data(data, lbl, NULL, icn, NULL, NULL, &label, NULL, &icon, NULL, NULL); + if (!label && !icon) + return; + + query = sqlite3_mprintf("insert into package_app_localized_info(app_id, app_locale, " \ + "app_label, app_icon) values " \ + "(%Q, %Q, %Q, %Q)", up->appid, (char*)data, + __get_str(label), __get_str(icon)); + ret = __exec_query(query); + if (ret == -1) + _LOGD("Package UiApp Localized Info DB Insert failed\n"); + + sqlite3_free(query); + + /*insert ui app locale info to pkg locale to get mainapp data */ + if (strcasecmp(up->mainapp, "true")==0) { + char *update_query = NULL; + update_query = sqlite3_mprintf("insert into package_localized_info(package, package_locale, " \ + "package_label, package_icon, package_description, package_license, package_author) values " \ + "(%Q, %Q, %Q, %Q, %Q, %Q, %Q)", + up->package, + (char*)data, + __get_str(label), + __get_str(icon), + PKGMGR_PARSER_EMPTY_STR, + PKGMGR_PARSER_EMPTY_STR, + PKGMGR_PARSER_EMPTY_STR); + + ret = __exec_query_no_msg(update_query); + sqlite3_free(update_query); + + if (icon != NULL) { + update_query = sqlite3_mprintf("update package_localized_info set package_icon=%Q " \ + "where package=%Q and package_locale=%Q", icon, up->package, (char*)data); + ret = __exec_query_no_msg(update_query); + sqlite3_free(update_query); + } + } +} + +static void __insert_uiapplication_icon_section_info(gpointer data, gpointer userdata) +{ + int ret = -1; + char *icon = NULL; + char *resolution = NULL; + char * query = NULL; + + uiapplication_x *up = (uiapplication_x*)userdata; + icon_x *icn = up->icon; + + __extract_icon_data(data, icn, &icon, &resolution); + if (!icon && !resolution) + return; + + query = sqlite3_mprintf("insert into package_app_icon_section_info(app_id, " \ + "app_icon, app_icon_section, app_icon_resolution) values " \ + "(%Q, %Q, %Q, %Q)", up->appid, + icon, (char*)data, resolution); + + ret = __exec_query(query); + if (ret == -1) + _LOGD("Package UiApp Localized Info DB Insert failed\n"); + + sqlite3_free(query); +} + +static void __insert_uiapplication_image_info(gpointer data, gpointer userdata) +{ + int ret = -1; + char *lang = NULL; + char *img = NULL; + char *query = NULL; + + uiapplication_x *up = (uiapplication_x*)userdata; + image_x *image = up->image; + + __extract_image_data(data, image, &lang, &img); + if (!lang && !img) + return; + + query = sqlite3_mprintf("insert into package_app_image_info(app_id, app_locale, " \ + "app_image_section, app_image) values " \ + "(%Q, %Q, %Q, %Q)", up->appid, lang, (char*)data, img); + + ret = __exec_query(query); + if (ret == -1) + _LOGD("Package UiApp image Info DB Insert failed\n"); + + sqlite3_free(query); +} + +static int __insert_ui_mainapp_info(manifest_x *mfx) +{ + uiapplication_x *up = mfx->uiapplication; + int ret = -1; + char *query = NULL; + while(up != NULL) + { + query = sqlite3_mprintf("update package_app_info set app_mainapp=%Q where app_id=%Q", up->mainapp, up->appid); + + ret = __exec_query(query); + sqlite3_free(query); + if (ret == -1) { + _LOGD("Package UiApp Info DB Insert Failed\n"); + return -1; + } + if (strcasecmp(up->mainapp, "True") == 0) { + FREE_AND_NULL(mfx->mainapp_id); + mfx->mainapp_id = strdup(up->appid); + } + + up = up->next; + } + + if (mfx->mainapp_id == NULL){ + if (mfx->uiapplication && mfx->uiapplication->appid) { + query = sqlite3_mprintf("update package_app_info set app_mainapp='true' where app_id=%Q", mfx->uiapplication->appid); + } else { + _LOGD("Not valid appid\n"); + return -1; + } + + ret = __exec_query(query); + sqlite3_free(query); + if (ret == -1) { + _LOGD("Package UiApp Info DB Insert Failed\n"); + return -1; + } + + FREE_AND_NULL(mfx->uiapplication->mainapp); + mfx->uiapplication->mainapp= strdup("true"); + mfx->mainapp_id = strdup(mfx->uiapplication->appid); + } + + query = sqlite3_mprintf("update package_info set mainapp_id=%Q where package=%Q", mfx->mainapp_id, mfx->package); + ret = __exec_query(query); + sqlite3_free(query); + if (ret == -1) { + _LOGD("Package Info DB update Failed\n"); + return -1; + } + + return 0; +} +/* _PRODUCT_LAUNCHING_ENHANCED_ +* up->indicatordisplay, up->portraitimg, up->landscapeimg, up->guestmode_appstatus +*/ +static int __insert_uiapplication_info(manifest_x *mfx) +{ + uiapplication_x *up = mfx->uiapplication; + int ret = -1; + char *query = NULL; + char *type = NULL; + + if (mfx->type) + type = strdup(mfx->type); + else + type = strdup("rpm"); + + while(up != NULL) + { + query = sqlite3_mprintf("insert into package_app_info(app_id, app_component, app_exec, app_ambient_support, app_nodisplay, app_type, app_onboot, " \ + "app_multiple, app_autorestart, app_taskmanage, app_enabled, app_hwacceleration, app_screenreader, app_mainapp , app_recentimage, " \ + "app_launchcondition, app_indicatordisplay, app_portraitimg, app_landscapeimg, app_effectimage_type, app_guestmodevisibility, app_permissiontype, "\ + "app_preload, app_submode, app_submode_mainid, app_installed_storage, app_process_pool, app_multi_instance, app_multi_instance_mainid, app_multi_window, app_support_disable, "\ + "app_ui_gadget, app_removable, app_support_mode, app_support_feature, component_type, package, "\ + "app_package_type, app_package_system, app_package_installed_time"\ + ") " \ + "values(%Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q)",\ + up->appid, + "uiapp", + up->exec, + up->ambient_support, + up->nodisplay, + up->type, + up->onboot, + up->multiple, + up->autorestart, + up->taskmanage, + up->enabled, + up->hwacceleration, + up->screenreader, + up->mainapp, + __get_str(up->recentimage), + up->launchcondition, + up->indicatordisplay, + __get_str(up->portraitimg), + __get_str(up->landscapeimg), + __get_str(up->effectimage_type), + up->guestmode_visibility, + up->permission_type, + mfx->preload, + up->submode, + __get_str(up->submode_mainid), + mfx->installed_storage, + up->process_pool, + up->multi_instance, + __get_str(up->multi_instance_mainid), + up->multi_window, + mfx->support_disable, + up->ui_gadget, + mfx->removable, + mfx->support_mode, + up->support_feature, + up->component_type, + mfx->package, + type, + mfx->system, + mfx->installed_time + ); + + ret = __exec_query(query); + sqlite3_free(query); + if (ret == -1) { + _LOGD("Package UiApp Info DB Insert Failed\n"); + FREE_AND_NULL(type); + return -1; + } + up = up->next; + } + FREE_AND_NULL(type); + return 0; +} + +static int __insert_uiapplication_appcategory_info(manifest_x *mfx) +{ + uiapplication_x *up = mfx->uiapplication; + category_x *ct = NULL; + int ret = -1; + char *query = NULL; + while(up != NULL) + { + ct = up->category; + while (ct != NULL) + { + query = sqlite3_mprintf("insert into package_app_app_category(app_id, category) " \ + "values(%Q, %Q)",\ + up->appid, ct->name); + ret = __exec_query(query); + sqlite3_free(query); + if (ret == -1) { + _LOGD("Package UiApp Category Info DB Insert Failed\n"); + return -1; + } + ct = ct->next; + } + up = up->next; + } + return 0; +} + +static int __insert_uiapplication_appmetadata_info(manifest_x *mfx) +{ + uiapplication_x *up = mfx->uiapplication; + metadata_x *md = NULL; + int ret = -1; + char *query = NULL; + while(up != NULL) + { + md = up->metadata; + while (md != NULL) + { + if (md->key) { + query = sqlite3_mprintf("insert into package_app_app_metadata(app_id, md_key, md_value) " \ + "values(%Q, %Q, %Q)",\ + up->appid, md->key, __get_str(md->value)); + ret = __exec_query(query); + sqlite3_free(query); + if (ret == -1) { + _LOGD("Package UiApp Metadata Info DB Insert Failed\n"); + return -1; + } + } + md = md->next; + } + up = up->next; + } + return 0; +} + +static int __insert_uiapplication_apppermission_info(manifest_x *mfx) +{ + uiapplication_x *up = mfx->uiapplication; + permission_x *pm = NULL; + int ret = -1; + char *query = NULL; + while(up != NULL) + { + pm = up->permission; + while (pm != NULL) + { + query = sqlite3_mprintf("insert into package_app_app_permission(app_id, pm_type, pm_value) " \ + "values(%Q, %Q, %Q)",\ + up->appid, pm->type, pm->value); + ret = __exec_query(query); + sqlite3_free(query); + if (ret == -1) { + _LOGD("Package UiApp permission Info DB Insert Failed\n"); + return -1; + } + pm = pm->next; + } + up = up->next; + } + return 0; +} + +static int __insert_uiapplication_appcontrol_info(manifest_x *mfx) +{ + int ret = 0; + char *buf = NULL; + char *buftemp = NULL; + char *query = NULL; + uiapplication_x *up = mfx->uiapplication; + + buf = (char *)calloc(1, BUFMAX); + retvm_if(!buf, PMINFO_R_ERROR, "Malloc Failed\n"); + + buftemp = (char *)calloc(1, BUFMAX); + tryvm_if(!buftemp, ret = PMINFO_R_ERROR, "Malloc Failed\n"); + + for(; up; up=up->next) { + if (up->appsvc) { + appsvc_x *asvc = NULL; + operation_x *op = NULL; + mime_x *mi = NULL; + uri_x *ui = NULL; + subapp_x *sub = NULL; + const char *operation = NULL; + const char *mime = NULL; + const char *uri = NULL; + const char *subapp = NULL; + int i = 0; + memset(buf, '\0', BUFMAX); + memset(buftemp, '\0', BUFMAX); + + asvc = up->appsvc; + while(asvc != NULL) { + op = asvc->operation; + while(op != NULL) { + if (op) + operation = op->name; + mi = asvc->mime; + + do + { + if (mi) + mime = mi->name; + sub = asvc->subapp; + do + { + if (sub) + subapp = sub->name; + ui = asvc->uri; + do + { + if (ui) + uri = ui->name; + + if(i++ > 0) { + strncpy(buftemp, buf, BUFMAX); + snprintf(buf, BUFMAX, "%s;", buftemp); + } + + strncpy(buftemp, buf, BUFMAX); + snprintf(buf, BUFMAX, "%s%s|%s|%s|%s", buftemp, operation?operation:"NULL", uri?uri:"NULL", mime?mime:"NULL", subapp?subapp:"NULL"); +// _LOGD("buf[%s]\n", buf); + + if (ui) + ui = ui->next; + uri = NULL; + } while(ui != NULL); + if (sub) + sub = sub->next; + subapp = NULL; + }while(sub != NULL); + if (mi) + mi = mi->next; + mime = NULL; + }while(mi != NULL); + if (op) + op = op->next; + operation = NULL; + } + asvc = asvc->next; + } + + query= sqlite3_mprintf("insert into package_app_app_control(app_id, app_control) values(%Q, %Q)", up->appid, buf); + ret = __exec_query(query); + if (ret < 0) { + _LOGD("Package UiApp app_control DB Insert Failed\n"); + } + sqlite3_free(query); + } + } + +catch: + FREE_AND_NULL(buf); + FREE_AND_NULL(buftemp); + + return 0; +} + +static int __insert_uiapplication_appsvc_info(manifest_x *mfx) +{ + uiapplication_x *up = mfx->uiapplication; + appsvc_x *asvc = NULL; + operation_x *op = NULL; + mime_x *mi = NULL; + uri_x *ui = NULL; + subapp_x *sub = NULL; + int ret = -1; + char *query = NULL; + const char *operation = NULL; + const char *mime = NULL; + const char *uri = NULL; + const char *subapp = NULL; + while(up != NULL) + { + asvc = up->appsvc; + while(asvc != NULL) + { + op = asvc->operation; + while(op != NULL) + { + if (op) + operation = op->name; + mi = asvc->mime; + + do + { + if (mi) + mime = mi->name; + sub = asvc->subapp; + do + { + if (sub) + subapp = sub->name; + ui = asvc->uri; + do + { + if (ui) + uri = ui->name; + query = sqlite3_mprintf("insert into package_app_app_svc(app_id, operation, uri_scheme, mime_type, subapp_name) " \ + "values(%Q, %Q, %Q, %Q, %Q)",\ + up->appid, + operation, + __get_str(uri), + __get_str(mime), + __get_str(subapp)); + + ret = __exec_query(query); + sqlite3_free(query); + if (ret == -1) { + _LOGD("Package UiApp AppSvc DB Insert Failed\n"); + return -1; + } + if (ui) + ui = ui->next; + uri = NULL; + } while(ui != NULL); + if (sub) + sub = sub->next; + subapp = NULL; + }while(sub != NULL); + if (mi) + mi = mi->next; + mime = NULL; + }while(mi != NULL); + if (op) + op = op->next; + operation = NULL; + } + asvc = asvc->next; + } + up = up->next; + } + return 0; +} + +static int __insert_uiapplication_share_request_info(manifest_x *mfx) +{ + uiapplication_x *up = mfx->uiapplication; + datashare_x *ds = NULL; + request_x *rq = NULL; + int ret = -1; + char *query = NULL; + while(up != NULL) + { + ds = up->datashare; + while(ds != NULL) + { + rq = ds->request; + while(rq != NULL) + { + query = sqlite3_mprintf("insert into package_app_share_request(app_id, data_share_request) " \ + "values(%Q, %Q)",\ + up->appid, rq->text); + ret = __exec_query(query); + sqlite3_free(query); + if (ret == -1) { + _LOGD("Package UiApp Share Request DB Insert Failed\n"); + return -1; + } + rq = rq->next; + } + ds = ds->next; + } + up = up->next; + } + return 0; +} + +static int __insert_uiapplication_share_allowed_info(manifest_x *mfx) +{ + uiapplication_x *up = mfx->uiapplication; + datashare_x *ds = NULL; + define_x *df = NULL; + allowed_x *al = NULL; + int ret = -1; + char *query = NULL; + while(up != NULL) + { + ds = up->datashare; + while(ds != NULL) + { + df = ds->define; + while(df != NULL) + { + al = df->allowed; + while(al != NULL) + { + query = sqlite3_mprintf("insert into package_app_share_allowed(app_id, data_share_path, data_share_allowed) " \ + "values(%Q, %Q, %Q)",\ + up->appid, df->path, al->text); + ret = __exec_query(query); + sqlite3_free(query); + if (ret == -1) { + _LOGD("Package UiApp Share Allowed DB Insert Failed\n"); + return -1; + } + al = al->next; + } + df = df->next; + } + ds = ds->next; + } + up = up->next; + } + return 0; +} + +static int __insert_manifest_info_in_db(manifest_x *mfx) +{ + label_x *lbl = mfx->label; + license_x *lcn = mfx->license; + icon_x *icn = mfx->icon; + description_x *dcn = mfx->description; + author_x *ath = mfx->author; + uiapplication_x *up = mfx->uiapplication; + uiapplication_x *up_icn = mfx->uiapplication; + uiapplication_x *up_image = mfx->uiapplication; + privileges_x *pvs = NULL; + privilege_x *pv = NULL; + char *query = NULL; + char root[MAX_QUERY_LEN] = { '\0' }; + int ret = -1; + char *type = NULL; + char *path = NULL; + const char *auth_name = NULL; + const char *auth_email = NULL; + const char *auth_href = NULL; + + GList *pkglocale = NULL; + GList *applocale = NULL; + GList *appicon = NULL; + GList *appimage = NULL; + + if (ath) { + if (ath->text) + auth_name = ath->text; + if (ath->email) + auth_email = ath->email; + if (ath->href) + auth_href = ath->href; + } + + /*Insert in the package_info DB*/ + if (mfx->type) + type = strdup(mfx->type); + else + type = strdup("rpm"); + /*Insert in the package_info DB*/ + if (mfx->root_path) { + path = strdup(mfx->root_path); + } else { + if (type && strcmp(type,"rpm")==0) { + snprintf(root, MAX_QUERY_LEN - 1, "/opt/share/packages/%s.xml", mfx->package); + if (access(root, F_OK) == 0) { + memset(root, '\0', MAX_QUERY_LEN); + snprintf(root, MAX_QUERY_LEN - 1, "/opt/usr/apps/%s", mfx->package); + } else { + memset(root, '\0', MAX_QUERY_LEN); + snprintf(root, MAX_QUERY_LEN - 1, "/usr/apps/%s", mfx->package); + } + } else { + snprintf(root, MAX_QUERY_LEN - 1, "/opt/usr/apps/%s", mfx->package); + } + + path = strdup(root); + } + + query = sqlite3_mprintf("insert into package_info(package, package_type, package_version, install_location, package_size, " \ + "package_removable, package_preload, package_readonly, package_update, package_appsetting, package_nodisplay, package_system," \ + "author_name, author_email, author_href, installed_time, installed_storage, storeclient_id, mainapp_id, package_url, root_path, csc_path, package_support_disable, " \ + "package_mother_package, package_support_mode, package_reserve1, package_reserve2, package_hash) " \ + "values(%Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q)",\ + mfx->package, + type, + mfx->version, + __get_str(mfx->installlocation), + __get_str(mfx->package_size), + mfx->removable, + mfx->preload, + mfx->readonly, + mfx->update, + mfx->appsetting, + mfx->nodisplay_setting, + mfx->system, + __get_str(auth_name), + __get_str(auth_email), + __get_str(auth_href), + mfx->installed_time, + mfx->installed_storage, + __get_str(mfx->storeclient_id), + mfx->mainapp_id, + __get_str(mfx->package_url), + path, + __get_str(mfx->csc_path), + mfx->support_disable, + mfx->mother_package, + mfx->support_mode, + __get_str(mfx->support_reset), + mfx->use_reset, + mfx->hash + ); + + ret = __exec_query(query); + sqlite3_free(query); + if (ret == -1) { + _LOGD("Package Info DB Insert Failed\n"); + FREE_AND_NULL(type); + FREE_AND_NULL(path); + return -1; + } + + FREE_AND_NULL(type); + FREE_AND_NULL(path); + + /*Insert in the package_privilege_info DB*/ + pvs = mfx->privileges; + while (pvs != NULL) { + pv = pvs->privilege; + while (pv != NULL) { + query = sqlite3_mprintf("insert into package_privilege_info(package, privilege) " \ + "values(%Q, %Q)",\ + mfx->package, pv->text); + ret = __exec_query(query); + sqlite3_free(query); + if (ret == -1) { + _LOGD("Package Privilege Info DB Insert Failed\n"); + return -1; + } + pv = pv->next; + } + pvs = pvs->next; + } + + ret = __insert_ui_mainapp_info(mfx); + if (ret == -1) + return -1; + + /*Insert the package locale*/ + pkglocale = __create_locale_list(pkglocale, lbl, lcn, icn, dcn, ath); + /*remove duplicated data in pkglocale*/ + __trimfunc(pkglocale); + + /*Insert the app locale info */ + while(up != NULL) + { + applocale = __create_locale_list(applocale, up->label, NULL, up->icon, NULL, NULL); + up = up->next; + } + /*remove duplicated data in applocale*/ + __trimfunc(applocale); + + /*Insert the app icon info */ + while(up_icn != NULL) + { + appicon = __create_icon_list(appicon, up_icn->icon); + up_icn = up_icn->next; + } + /*remove duplicated data in appicon*/ + __trimfunc(appicon); + + /*Insert the image info */ + while(up_image != NULL) + { + appimage = __create_image_list(appimage, up_image->image); + up_image = up_image->next; + } + /*remove duplicated data in appimage*/ + __trimfunc(appimage); + + /*g_list_foreach(pkglocale, __printfunc, NULL);*/ + /*_LOGD("\n");*/ + /*g_list_foreach(applocale, __printfunc, NULL);*/ + + g_list_foreach(pkglocale, __insert_pkglocale_info, (gpointer)mfx); + + /*native app locale info*/ + up = mfx->uiapplication; + while(up != NULL) + { + g_list_foreach(applocale, __insert_uiapplication_locale_info, (gpointer)up); + up = up->next; + } + + /*app icon locale info*/ + up_icn = mfx->uiapplication; + while(up_icn != NULL) + { + g_list_foreach(appicon, __insert_uiapplication_icon_section_info, (gpointer)up_icn); + up_icn = up_icn->next; + } + + /*app image info*/ + up_image = mfx->uiapplication; + while(up_image != NULL) + { + g_list_foreach(appimage, __insert_uiapplication_image_info, (gpointer)up_image); + up_image = up_image->next; + } + + g_list_free(pkglocale); + pkglocale = NULL; + g_list_free(applocale); + applocale = NULL; + g_list_free(appicon); + appicon = NULL; + g_list_free(appimage); + appimage = NULL; + + + /*Insert in the package_app_info DB*/ + ret = __insert_uiapplication_info(mfx); + if (ret == -1) + return -1; + + /*Insert in the package_app_app_control DB*/ + ret = __insert_uiapplication_appcontrol_info(mfx); + if (ret == -1) + return -1; + + /*Insert in the package_app_app_category DB*/ + ret = __insert_uiapplication_appcategory_info(mfx); + if (ret == -1) + return -1; + + /*Insert in the package_app_app_metadata DB*/ + ret = __insert_uiapplication_appmetadata_info(mfx); + if (ret == -1) + return -1; + + /*Insert in the package_app_app_permission DB*/ + ret = __insert_uiapplication_apppermission_info(mfx); + if (ret == -1) + return -1; + + /*Insert in the package_app_app_svc DB*/ + ret = __insert_uiapplication_appsvc_info(mfx); + if (ret == -1) + return -1; + + /*Insert in the package_app_share_allowed DB*/ + ret = __insert_uiapplication_share_allowed_info(mfx); + if (ret == -1) + return -1; + + /*Insert in the package_app_share_request DB*/ + ret = __insert_uiapplication_share_request_info(mfx); + if (ret == -1) + return -1; + + /*Insert in the package_app_data_control DB*/ + ret = __insert_uiapplication_datacontrol_info(mfx); + if (ret == -1) + return -1; + + return 0; + +} + +static int __update_pkg_info_for_disable(const char *pkgid, bool disable) +{ + char *query = NULL; + int ret = -1; + + /*Update from package info*/ + query = sqlite3_mprintf("update package_info set package_disable=%Q where package=%Q", disable?"true":"false", pkgid); + ret = __exec_query(query); + sqlite3_free(query); + retvm_if(ret < 0, PMINFO_R_ERROR, "__exec_query() failed.\n"); + + /*Update from app info*/ + query = sqlite3_mprintf("update package_app_info set app_disable=%Q where package=%Q", disable?"true":"false", pkgid); + ret = __exec_query(query); + sqlite3_free(query); + retvm_if(ret < 0, PMINFO_R_ERROR, "__exec_query() failed.\n"); + + return PMINFO_R_OK; +} + +static int __delete_appinfo_from_db(char *db_table, const char *appid) +{ + int ret = 0; + char *query = sqlite3_mprintf("delete from %Q where app_id=%Q", db_table, appid); + ret = __exec_query(query); + sqlite3_free(query); + if (ret == -1) { + _LOGD("DB Deletion from table (%s) Failed\n", db_table); + ret = -1; + } + + return ret; +} + +static int __delete_manifest_info_from_db(manifest_x *mfx) +{ + int ret = -1; + uiapplication_x *up = mfx->uiapplication; + + /* Delete package info DB */ + ret = __delete_manifest_info_from_pkgid(mfx->package); + retvm_if(ret < 0, PMINFO_R_ERROR, "Package Info DB Delete Failed\n"); + + while (up != NULL) { + ret = __delete_manifest_info_from_appid(up->appid); + retvm_if(ret < 0, PMINFO_R_ERROR, "App Info DB Delete Failed\n"); + + up = up->next; + } + + return 0; +} + +static int __delete_appsvc_db(const char *appid) +{ + int ret = -1; + void *lib_handle = NULL; + int (*appsvc_operation) (const char *); + + if ((lib_handle = dlopen(LIBAPPSVC_PATH, RTLD_LAZY)) == NULL) { + _LOGE("dlopen is failed LIBAIL_PATH[%s]\n", LIBAPPSVC_PATH); + return ret; + } + if ((appsvc_operation = + dlsym(lib_handle, "appsvc_unset_defapp")) == NULL || dlerror() != NULL) { + _LOGE("can not find symbol \n"); + goto END; + } + + ret = appsvc_operation(appid); + +END: + if (lib_handle) + dlclose(lib_handle); + + return ret; +} + +static int __delete_appsvc_info_from_db(manifest_x *mfx) +{ + int ret = 0; + uiapplication_x *uiapplication = mfx->uiapplication; + + for(; uiapplication; uiapplication=uiapplication->next) { + ret = __delete_appsvc_db(uiapplication->appid); + if (ret <0) + _LOGE("can not remove_appsvc_db\n"); + } + + return ret; +} + +static int __delete_manifest_info_from_pkgid(const char *pkgid) +{ + char *query = NULL; + int ret = -1; + + /*Delete from cert table*/ + ret = pkgmgrinfo_delete_certinfo(pkgid); + retvm_if(ret < 0, PMINFO_R_ERROR, "Cert Info DB Delete Failed\n"); + + /*Delete from Package Info DB*/ + query = sqlite3_mprintf("delete from package_info where package=%Q", pkgid); + ret = __exec_query(query); + tryvm_if(ret < 0, ret = PMINFO_R_ERROR, "Package Info DB Delete Failed\n"); + + /*Delete from Package Localized Info*/ + sqlite3_free(query); + query = sqlite3_mprintf("delete from package_localized_info where package=%Q", pkgid); + ret = __exec_query(query); + tryvm_if(ret < 0, ret = PMINFO_R_ERROR, "Package Localized Info DB Delete Failed\n"); + + /*Delete from Package Privilege Info*/ + sqlite3_free(query); + query = sqlite3_mprintf("delete from package_privilege_info where package=%Q", pkgid); + ret = __exec_query(query); + tryvm_if(ret < 0, ret = PMINFO_R_ERROR, "Package Privilege Info DB Delete Failed\n"); + +catch: + sqlite3_free(query); + return 0; +} + + +static int __delete_manifest_info_from_appid(const char *appid) +{ + int ret = -1; + + ret = __delete_appinfo_from_db("package_app_info", appid); + retvm_if(ret < 0, PMINFO_R_ERROR, "Fail to get handle"); + + ret = __delete_appinfo_from_db("package_app_localized_info", appid); + retvm_if(ret < 0, PMINFO_R_ERROR, "Fail to get handle"); + + ret = __delete_appinfo_from_db("package_app_icon_section_info", appid); + retvm_if(ret < 0, PMINFO_R_ERROR, "Fail to get handle"); + + ret = __delete_appinfo_from_db("package_app_image_info", appid); + retvm_if(ret < 0, PMINFO_R_ERROR, "Fail to get handle"); + + ret = __delete_appinfo_from_db("package_app_app_svc", appid); + retvm_if(ret < 0, PMINFO_R_ERROR, "Fail to get handle"); + + ret = __delete_appinfo_from_db("package_app_app_control", appid); + retvm_if(ret < 0, PMINFO_R_ERROR, "Fail to get handle"); + + ret = __delete_appinfo_from_db("package_app_app_category", appid); + retvm_if(ret < 0, PMINFO_R_ERROR, "Fail to get handle"); + + ret = __delete_appinfo_from_db("package_app_app_metadata", appid); + retvm_if(ret < 0, PMINFO_R_ERROR, "Fail to get handle"); + + ret = __delete_appinfo_from_db("package_app_app_permission", appid); + retvm_if(ret < 0, PMINFO_R_ERROR, "Fail to get handle"); + + ret = __delete_appinfo_from_db("package_app_share_allowed", appid); + retvm_if(ret < 0, PMINFO_R_ERROR, "Fail to get handle"); + + ret = __delete_appinfo_from_db("package_app_share_request", appid); + retvm_if(ret < 0, PMINFO_R_ERROR, "Fail to get handle"); + + ret = __delete_appinfo_from_db("package_app_data_control", appid); + retvm_if(ret < 0, PMINFO_R_ERROR, "Fail to get handle"); + + return 0; +} + + +static int __update_preload_condition_in_db() +{ + int ret = -1; + char *query = NULL; + + query = sqlite3_mprintf("update package_info set package_preload='true'"); + + ret = __exec_query(query); + sqlite3_free(query); + if (ret == -1) + _LOGD("Package preload_condition update failed\n"); + + return ret; +} + +int pkgmgr_parser_initialize_db() +{ + int ret = -1; + /*Manifest DB*/ + ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_INFO); + if (ret == -1) { + _LOGD("package info DB initialization failed\n"); + return ret; + } + ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_LOCALIZED_INFO); + if (ret == -1) { + _LOGD("package localized info DB initialization failed\n"); + return ret; + } + ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_PRIVILEGE_INFO); + if (ret == -1) { + _LOGD("package app app privilege DB initialization failed\n"); + return ret; + } + ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_APP_INFO); + if (ret == -1) { + _LOGD("package app info DB initialization failed\n"); + return ret; + } + ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_APP_LOCALIZED_INFO); + if (ret == -1) { + _LOGD("package app localized info DB initialization failed\n"); + return ret; + } + ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_APP_ICON_SECTION_INFO); + if (ret == -1) { + _LOGD("package app icon localized info DB initialization failed\n"); + return ret; + } + ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_APP_IMAGE_INFO); + if (ret == -1) { + _LOGD("package app image info DB initialization failed\n"); + return ret; + } + ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_APP_APP_CONTROL); + if (ret == -1) { + _LOGD("package app app control DB initialization failed\n"); + return ret; + } + ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_APP_APP_CATEGORY); + if (ret == -1) { + _LOGD("package app app category DB initialization failed\n"); + return ret; + } + ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_APP_APP_METADATA); + if (ret == -1) { + _LOGD("package app app category DB initialization failed\n"); + return ret; + } + ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_APP_APP_PERMISSION); + if (ret == -1) { + _LOGD("package app app permission DB initialization failed\n"); + return ret; + } + ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_APP_APP_SVC); + if (ret == -1) { + _LOGD("package app app svc DB initialization failed\n"); + return ret; + } + ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_APP_SHARE_ALLOWED); + if (ret == -1) { + _LOGD("package app share allowed DB initialization failed\n"); + return ret; + } + ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_APP_SHARE_REQUEST); + if (ret == -1) { + _LOGD("package app share request DB initialization failed\n"); + return ret; + } + ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_APP_DATA_CONTROL); + if (ret == -1) { + _LOGD("package app data control DB initialization failed\n"); + return ret; + } + /*Cert DB*/ + ret = __initialize_db(pkgmgr_cert_db, QUERY_CREATE_TABLE_PACKAGE_CERT_INFO); + if (ret == -1) { + _LOGD("package cert info DB initialization failed\n"); + return ret; + } + ret = __initialize_db(pkgmgr_cert_db, QUERY_CREATE_TABLE_PACKAGE_CERT_INDEX_INFO); + if (ret == -1) { + _LOGD("package cert index info DB initialization failed\n"); + return ret; + } + /*reserve DB*/ + ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_PKG_RESERVE); + if (ret == -1) { + _LOGD("package pkg reserve info DB initialization failed\n"); + return ret; + } + ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_APP_RESERVE); + if (ret == -1) { + _LOGD("package pkg reserve info DB initialization failed\n"); + return ret; + } + + ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_PLUGIN_INFO); + if (ret == -1) { + _LOGD("package pkg reserve info DB initialization failed\n"); + return ret; + } + ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_APP_ALIASID); + if (ret == -1) { + _LOGD("package app aliasId DB initialization failed\n"); + return ret; + } +#ifdef _APPFW_FEATURE_PROFILE_WEARABLE + ret = __init_tables_for_wearable(); + if (ret == -1) { + _LOGD("package pkg reserve info DB initialization failed\n"); + return ret; + } +#endif + + return 0; +} + +int pkgmgr_parser_check_and_create_db() +{ + int ret = -1; + /*Manifest DB*/ + ret = __pkgmgr_parser_create_db(&pkgmgr_parser_db, PKGMGR_PARSER_DB_FILE); + if (ret) { + _LOGD("Manifest DB creation Failed\n"); + return -1; + } + /*Cert DB*/ + ret = __pkgmgr_parser_create_db(&pkgmgr_cert_db, PKGMGR_CERT_DB_FILE); + if (ret) { + _LOGD("Cert DB creation Failed\n"); + return -1; + } + return 0; +} + +void pkgmgr_parser_close_db() +{ + sqlite3_close(pkgmgr_parser_db); + sqlite3_close(pkgmgr_cert_db); +} + +API int pkgmgr_parser_insert_manifest_info_in_db(manifest_x *mfx) +{ + if (mfx == NULL) { + _LOGD("manifest pointer is NULL\n"); + return -1; + } + int ret = 0; + ret = pkgmgr_parser_check_and_create_db(); + if (ret == -1) { + _LOGD("Failed to open DB\n"); + return ret; + } + ret = pkgmgr_parser_initialize_db(); + if (ret == -1) + goto err; + /*Begin transaction*/ + ret = sqlite3_exec(pkgmgr_parser_db, "BEGIN EXCLUSIVE", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + _LOGD("Failed to begin transaction[%d]\n", ret); + ret = -1; + goto err; + } + _LOGD("Transaction Begin\n"); + ret = __insert_manifest_info_in_db(mfx); + if (ret == -1) { + _LOGD("Insert into DB failed. Rollback now\n"); + ret = sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); + if (ret != SQLITE_OK) + _LOGD("ROLLBACK is fail after insert_disabled_pkg_info_in_db\n"); + + ret = -1; + goto err; + } + /*Commit transaction*/ + ret = sqlite3_exec(pkgmgr_parser_db, "COMMIT", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + _LOGD("Failed to commit transaction. Rollback now\n"); + ret = sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); + if (ret != SQLITE_OK) + _LOGE("Failed to commit transaction. Rollback now\n"); + + ret = -1; + goto err; + } + _LOGD("Transaction Commit and End\n"); +err: + pkgmgr_parser_close_db(); + return ret; +} + +API int pkgmgr_parser_update_manifest_info_in_db(manifest_x *mfx) +{ + if (mfx == NULL) { + _LOGD("manifest pointer is NULL\n"); + return -1; + } + int ret = 0; + ret = pkgmgr_parser_check_and_create_db(); + if (ret == -1) { + _LOGD("Failed to open DB\n"); + return ret; + } + ret = pkgmgr_parser_initialize_db(); + if (ret == -1) + goto err; + + /*Begin transaction*/ + ret = sqlite3_exec(pkgmgr_parser_db, "BEGIN EXCLUSIVE", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + _LOGD("Failed to begin transaction\n"); + ret = -1; + goto err; + } + _LOGD("Transaction Begin\n"); + ret = __delete_manifest_info_from_db(mfx); + if (ret == -1) { + _LOGD("Delete from DB failed. Rollback now\n"); + ret = sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); + if (ret != SQLITE_OK) + _LOGD("Failed to commit transaction. Rollback now\n"); + goto err; + } + ret = __insert_manifest_info_in_db(mfx); + if (ret == -1) { + _LOGD("Insert into DB failed. Rollback now\n"); + ret = sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); + if (ret != SQLITE_OK) + _LOGD("Failed to commit transaction. Rollback now\n"); + goto err; + } + + /*Commit transaction*/ + ret = sqlite3_exec(pkgmgr_parser_db, "COMMIT", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + _LOGD("Failed to commit transaction. Rollback now\n"); + ret = sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); + if (ret != SQLITE_OK) + _LOGD("Failed to commit transaction. Rollback now\n"); + + ret = -1; + goto err; + } + _LOGD("Transaction Commit and End\n"); +err: + pkgmgr_parser_close_db(); + return ret; +} + +API int pkgmgr_parser_delete_manifest_info_from_db(manifest_x *mfx) +{ + if (mfx == NULL) { + _LOGD("manifest pointer is NULL\n"); + return -1; + } + int ret = 0; + ret = pkgmgr_parser_check_and_create_db(); + if (ret == -1) { + _LOGD("Failed to open DB\n"); + return ret; + } + /*Begin transaction*/ + ret = sqlite3_exec(pkgmgr_parser_db, "BEGIN EXCLUSIVE", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + _LOGD("Failed to begin transaction\n"); + ret = -1; + goto err; + } + _LOGD("Transaction Begin\n"); + ret = __delete_manifest_info_from_db(mfx); + if (ret == -1) { + _LOGD("Delete from DB failed. Rollback now\n"); + ret = sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); + if (ret != SQLITE_OK) + _LOGE("Failed to commit transaction, Rollback now\n"); + + goto err; + } + /*Commit transaction*/ + ret = sqlite3_exec(pkgmgr_parser_db, "COMMIT", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + _LOGD("Failed to commit transaction, Rollback now\n"); + ret = sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); + if (ret != SQLITE_OK) + _LOGE("Failed to commit transaction, Rollback now\n"); + + ret = -1; + goto err; + } + + ret = __delete_appsvc_info_from_db(mfx); + if (ret == -1) + _LOGD("Removing appsvc_db failed\n"); + else + _LOGD("Removing appsvc_db Success\n"); + + _LOGD("Transaction Commit and End\n"); +err: + pkgmgr_parser_close_db(); + return ret; +} + +API int pkgmgr_parser_update_preload_info_in_db() +{ + int ret = 0; + ret = pkgmgr_parser_check_and_create_db(); + if (ret == -1) { + _LOGD("Failed to open DB\n"); + return ret; + } + /*Begin transaction*/ + ret = sqlite3_exec(pkgmgr_parser_db, "BEGIN EXCLUSIVE", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + _LOGD("Failed to begin transaction\n"); + ret = -1; + goto err; + } + _LOGD("Transaction Begin\n"); + ret = __update_preload_condition_in_db(); + if (ret == -1) { + _LOGD("__update_preload_condition_in_db failed. Rollback now\n"); + ret = sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); + if (ret != SQLITE_OK) + _LOGE("Failed to commit transaction, Rollback now\n"); + + goto err; + } + /*Commit transaction*/ + ret = sqlite3_exec(pkgmgr_parser_db, "COMMIT", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + _LOGD("Failed to commit transaction, Rollback now\n"); + ret = sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); + if (ret != SQLITE_OK) + _LOGE("Failed to commit transaction, Rollback now\n"); + + ret = -1; + goto err; + } + _LOGD("Transaction Commit and End\n"); +err: + pkgmgr_parser_close_db(); + return ret; +} + +API int pkgmgr_parser_delete_pkgid_info_from_db(const char *pkgid) +{ + retvm_if(pkgid == NULL, PMINFO_R_ERROR, "argument supplied is NULL"); + + int ret = 0; + + /*open db*/ + ret = pkgmgr_parser_check_and_create_db(); + retvm_if(ret < 0, PMINFO_R_ERROR, "Failed to open DB\n"); + + /*Begin transaction*/ + ret = sqlite3_exec(pkgmgr_parser_db, "BEGIN EXCLUSIVE", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + _LOGE("Failed to begin transaction\n"); + ret = -1; + goto err; + } + + _LOGD("Start to Delete pkgid[%s] info from db\n", pkgid); + + /*delete pkg info*/ + ret = __delete_manifest_info_from_pkgid(pkgid); + if (ret == -1) { + _LOGD("Delete from DB failed. Rollback now\n"); + ret = sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); + if (ret != SQLITE_OK) + _LOGE("Failed to begin transaction\n"); + goto err; + } + + /*Commit transaction*/ + ret = sqlite3_exec(pkgmgr_parser_db, "COMMIT", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + _LOGD("Failed to commit transaction, Rollback now\n"); + ret = sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); + if (ret != SQLITE_OK) + _LOGE("Failed to commit transaction, Rollback now\n"); + + ret = -1; + goto err; + } + +err: + pkgmgr_parser_close_db(); + return ret; +} + +API int pkgmgr_parser_delete_appid_info_from_db(const char *appid) +{ + retvm_if(appid == NULL, PMINFO_R_ERROR, "argument supplied is NULL"); + + int ret = 0; + + /*open db*/ + ret = pkgmgr_parser_check_and_create_db(); + retvm_if(ret < 0, PMINFO_R_ERROR, "Failed to open DB\n"); + + /*Begin transaction*/ + ret = sqlite3_exec(pkgmgr_parser_db, "BEGIN EXCLUSIVE", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + _LOGE("Failed to begin transaction\n"); + ret = -1; + goto err; + } + + _LOGD("Start to Delete appid[%s] info from db\n", appid); + + /*delete appinfo db*/ + ret = __delete_manifest_info_from_appid(appid); + if (ret < 0) + _LOGE("Fail to delete appid[%s] info from pkgmgr db\n", appid); + + /*delete appsvc db*/ + ret = __delete_appsvc_db(appid); + if (ret < 0) + _LOGE("Fail to delete appid[%s] info from appsvc db\n", appid); + + /*Commit transaction*/ + ret = sqlite3_exec(pkgmgr_parser_db, "COMMIT", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + _LOGD("Failed to commit transaction, Rollback now\n"); + ret = sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); + if (ret != SQLITE_OK) + _LOGE("Failed to commit transaction, Rollback now\n"); + + ret = -1; + goto err; + } + +err: + pkgmgr_parser_close_db(); + return ret; +} + +API int pkgmgr_parser_update_enabled_pkg_info_in_db(const char *pkgid) +{ + retvm_if(pkgid == NULL, PMINFO_R_ERROR, "pkgid is NULL."); + + int ret = 0; + + _LOGD("pkgmgr_parser_update_enabled_pkg_info_in_db(%s)\n", pkgid); + + /*open db*/ + ret = pkgmgr_parser_check_and_create_db(); + retvm_if(ret < 0, PMINFO_R_ERROR, "pkgmgr_parser_check_and_create_db(%s) failed.\n", pkgid); + + /*Begin transaction*/ + ret = sqlite3_exec(pkgmgr_parser_db, "BEGIN EXCLUSIVE", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + _LOGE("sqlite3_exec(BEGIN EXCLUSIVE) failed.\n"); + ret = -1; + goto err; + } + + /*update pkg info*/ + ret = __update_pkg_info_for_disable(pkgid, false); + if (ret == -1) { + _LOGD("__update_pkg_info_for_disable(%s) failed.\n", pkgid); + ret = sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); + if (ret != SQLITE_OK) + _LOGE("sqlite3_exec(ROLLBACK) failed.\n"); + goto err; + } + + /*Commit transaction*/ + ret = sqlite3_exec(pkgmgr_parser_db, "COMMIT", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + _LOGD("sqlite3_exec(COMMIT) failed.\n"); + ret = sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); + if (ret != SQLITE_OK) + _LOGE("sqlite3_exec(ROLLBACK) failed.\n"); + + ret = -1; + goto err; + } + +err: + pkgmgr_parser_close_db(); + return ret; +} + +API int pkgmgr_parser_update_disabled_pkg_info_in_db(const char *pkgid) +{ + retvm_if(pkgid == NULL, PMINFO_R_ERROR, "pkgid is NULL."); + + int ret = 0; + + _LOGD("pkgmgr_parser_update_disabled_pkg_info_in_db(%s)\n", pkgid); + + /*open db*/ + ret = pkgmgr_parser_check_and_create_db(); + retvm_if(ret < 0, PMINFO_R_ERROR, "pkgmgr_parser_check_and_create_db(%s) failed.\n", pkgid); + + /*Begin transaction*/ + ret = sqlite3_exec(pkgmgr_parser_db, "BEGIN EXCLUSIVE", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + _LOGE("sqlite3_exec(BEGIN EXCLUSIVE) failed.\n"); + ret = -1; + goto err; + } + + /*update pkg info*/ + ret = __update_pkg_info_for_disable(pkgid, true); + if (ret == -1) { + _LOGD("__update_pkg_info_for_disable(%s) failed.\n", pkgid); + ret = sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); + if (ret != SQLITE_OK) + _LOGE("sqlite3_exec(ROLLBACK) failed.\n"); + goto err; + } + + /*Commit transaction*/ + ret = sqlite3_exec(pkgmgr_parser_db, "COMMIT", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + _LOGD("sqlite3_exec(COMMIT) failed.\n"); + ret = sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); + if (ret != SQLITE_OK) + _LOGE("sqlite3_exec(ROLLBACK) failed.\n"); + + ret = -1; + goto err; + } + +err: + pkgmgr_parser_close_db(); + return ret; +} + +int pkgmgr_parser_insert_app_aliasid_info_in_db(void) +{ + FILE *ini_file = NULL; + char *match = NULL; + char *tizen_id = NULL; + char *app_id = NULL; + int len = 0; + char buf[ MAX_ALIAS_INI_ENTRY ] = {0}; + int ret = PM_PARSER_R_OK; + sqlite3 *pkgmgr_db = NULL; + char *query = NULL; + + /*Open the alias.ini file*/ + ini_file = fopen(USR_APPSVC_ALIAS_INI,"r"); + if(ini_file){ + /*Open the pkgmgr DB*/ + ret = db_util_open_with_options(MANIFEST_DB, &pkgmgr_db, SQLITE_OPEN_READWRITE, NULL); + if (ret != SQLITE_OK) { + _LOGE("connect db [%s] failed!\n", MANIFEST_DB); + fclose(ini_file); + return PM_PARSER_R_ERROR; + + } + /*Begin Transaction*/ + ret = sqlite3_exec(pkgmgr_db, "BEGIN EXCLUSIVE", NULL, NULL, NULL); + tryvm_if(ret != SQLITE_OK, ret = PM_PARSER_R_ERROR, "Failed to begin transaction"); + + _LOGD("Transaction Begin\n"); + + /*delete all the previous entries from package_app_aliasid tables*/ + query = sqlite3_mprintf("delete from package_app_aliasid"); + ret = __exec_db_query(pkgmgr_db, query, NULL, NULL); + sqlite3_free(query); + tryvm_if(ret != SQLITE_OK,ret = PM_PARSER_R_ERROR,"sqlite exec failed to delete entries from package_app_aliasid!!"); + + while ( fgets ( buf, sizeof(buf), ini_file ) != NULL ) /* read a line */ + { + match = strstr(buf,"="); + if(match == NULL) + continue; + /*format of alias.ini entry is 'tizen_app_id=alias_id'*/ + /*get the tizen appid id*/ + len = strlen(buf)-strlen(match); + tizen_id = malloc(len + 1); + tryvm_if(tizen_id == NULL, ret = PM_PARSER_R_ERROR,"Malloc failed!!"); + memset(tizen_id,'\0',len +1); + strncpy(tizen_id,buf,len); + tizen_id[len]='\0'; + __str_trim(tizen_id); + + /*get the corresponding alias id*/ + len = strlen(match)-1; + app_id = malloc(len + 1); + tryvm_if(app_id == NULL, ret = PM_PARSER_R_ERROR,"Malloc failed!!"); + memset(app_id,'\0',len + 1); + strncpy(app_id, match + 1, len); + app_id[len]='\0'; + __str_trim(app_id); + + /* Insert the data into DB*/ + query = sqlite3_mprintf("insert into package_app_aliasid(app_id, alias_id) values(%Q ,%Q)",tizen_id,app_id); + ret = __exec_db_query(pkgmgr_db, query, NULL, NULL); + sqlite3_free(query); + tryvm_if(ret != SQLITE_OK,ret = PM_PARSER_R_ERROR, "sqlite exec failed to insert entries into package_app_aliasid table!!"); + + FREE_AND_NULL(tizen_id); + FREE_AND_NULL(app_id); + memset(buf,'\0',MAX_ALIAS_INI_ENTRY); + } + + /*Commit transaction*/ + ret = sqlite3_exec(pkgmgr_db, "COMMIT", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + _LOGE("Failed to commit transaction, Rollback now\n"); + ret = sqlite3_exec(pkgmgr_db, "ROLLBACK", NULL, NULL, NULL); + if (ret != SQLITE_OK) + _LOGE("Failed to Rollback\n"); + + ret = PM_PARSER_R_ERROR; + goto catch; + } + _LOGE("Transaction Commit and End\n"); + ret = PM_PARSER_R_OK; + }else{ + perror(USR_APPSVC_ALIAS_INI); + ret = -1; + } + +catch: + if(ini_file) + fclose ( ini_file); + + FREE_AND_NULL(tizen_id); + FREE_AND_NULL(app_id); + sqlite3_close(pkgmgr_db); + return ret; + + +} + +int pkgmgr_parser_update_app_aliasid_info_in_db(void) +{ + FILE *ini_file = NULL; + char *match = NULL; + char *tizen_id = NULL; + char *app_id = NULL; + int len = 0; + char buf[ MAX_ALIAS_INI_ENTRY ] = {0}; + int ret = PM_PARSER_R_OK; + sqlite3 *pkgmgr_db = NULL; + char *query = NULL; + + /*Open the alias.ini file*/ + ini_file = fopen(OPT_APPSVC_ALIAS_INI,"r"); + if(ini_file){ + /*Open the pkgmgr DB*/ + ret = db_util_open_with_options(MANIFEST_DB, &pkgmgr_db, SQLITE_OPEN_READWRITE, NULL); + if (ret != SQLITE_OK) { + _LOGE("connect db [%s] failed!\n", MANIFEST_DB); + fclose(ini_file); + return PM_PARSER_R_ERROR; + + } + /*Begin Transaction*/ + ret = sqlite3_exec(pkgmgr_db, "BEGIN EXCLUSIVE", NULL, NULL, NULL); + tryvm_if(ret != SQLITE_OK, ret = PM_PARSER_R_ERROR, "Failed to begin transaction"); + + _LOGD("Transaction Begin\n"); + + while ( fgets ( buf, sizeof(buf), ini_file ) != NULL ) /* read a line */ + { + match = strstr(buf,"="); + if(match == NULL) + continue; + /*format of alias.ini entry is 'tizen_app_id=alias_id'*/ + /*get the tizen appid id*/ + len = strlen(buf)-strlen(match); + tizen_id = malloc(len + 1); + tryvm_if(tizen_id == NULL, ret = PM_PARSER_R_ERROR,"Malloc failed!!"); + memset(tizen_id,'\0',len +1); + strncpy(tizen_id,buf,len); + tizen_id[len]='\0'; + __str_trim(tizen_id); + + /*get the corresponding alias id*/ + len = strlen(match)-1; + app_id = malloc(len + 1); + tryvm_if(app_id == NULL, ret = PM_PARSER_R_ERROR,"Malloc failed!!"); + memset(app_id,'\0',len + 1); + strncpy(app_id, match + 1, len); + app_id[len]='\0'; + __str_trim(app_id); + + /* Insert the data into DB*/ + query = sqlite3_mprintf("insert or replace into package_app_aliasid(app_id, alias_id) values(%Q ,%Q)",tizen_id,app_id); + ret = __exec_db_query(pkgmgr_db, query, NULL, NULL); + sqlite3_free(query); + tryvm_if(ret != SQLITE_OK,ret = PM_PARSER_R_ERROR, "sqlite exec failed to insert entries into package_app_aliasid table!!"); + + FREE_AND_NULL(tizen_id); + FREE_AND_NULL(app_id); + memset(buf,'\0',MAX_ALIAS_INI_ENTRY); + } + + /*Commit transaction*/ + ret = sqlite3_exec(pkgmgr_db, "COMMIT", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + _LOGE("Failed to commit transaction, Rollback now\n"); + ret = sqlite3_exec(pkgmgr_db, "ROLLBACK", NULL, NULL, NULL); + if (ret != SQLITE_OK) + _LOGE("Failed to Rollback\n"); + + ret = PM_PARSER_R_ERROR; + goto catch; + } + _LOGE("Transaction Commit and End\n"); + ret = PM_PARSER_R_OK; + }else{ + perror(OPT_APPSVC_ALIAS_INI); + ret = -1; + } + +catch: + if(ini_file) + fclose ( ini_file); + + FREE_AND_NULL(tizen_id); + FREE_AND_NULL(app_id); + sqlite3_close(pkgmgr_db); + return ret; + + +} + diff --git a/parser/pkgmgr_parser_db.h b/parser/pkgmgr_parser_db.h new file mode 100755 index 0000000..91a8f31 --- /dev/null +++ b/parser/pkgmgr_parser_db.h @@ -0,0 +1,151 @@ +/* + * pkgmgr-info + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +/** + * @file pkgmgr_parser_db.h + * @author Shobhit Srivastava + * @version 0.1 + * @brief This file declares API to store/retrieve manifest data in DB + * + * @addtogroup APPLICATION_FRAMEWORK + * @{ + * + * @defgroup PackageManagerParserDB + * @section Header Header file to include: + * @code + * #include + * @endcode + * + * @} + */ + +#ifndef __PKGMGR_PARSER_DB_H__ +#define __PKGMGR_PARSER_DB_H__ + +#ifdef __cplusplus +extern "C" { +#endif +#include "pkgmgr_parser.h" +#include "pkgmgr_parser_feature.h" + +#define PKGMGR_PARSER_DB_FILE "/opt/dbspace/.pkgmgr_parser.db" +#define PKGMGR_CERT_DB_FILE "/opt/dbspace/.pkgmgr_cert.db" + +/** + * @fn int pkgmgr_parser_insert_manifest_info_in_db(manifest_x *mfx) + * @brief This API inserts the parsed manifest info in db + * + * @par This API is for package-manager installer backends + * @par Sync (or) Async : Synchronous API + * + * @param[in] mfx pointer to manifest info + * @return 0 if success, error code(<0) if fail + * @pre None + * @post None + * @see pkgmgr_parser_update_manifest_info_in_db() + * @see pkgmgr_parser_delete_manifest_info_from_db() + * @code +static int insert_manifest_data(manifest_x *mfx) +{ + int ret = 0; + ret = pkgmgr_parser_insert_manifest_info_in_db(mfx); + if (ret < 0) + return -1; + return 0; +} + * @endcode + */ +int pkgmgr_parser_insert_manifest_info_in_db(manifest_x *mfx); + +/** + * @fn int pkgmgr_parser_update_manifest_info_in_db(manifest_x *mfx) + * @brief This API updates the manifest info in db + * + * @par This API is for package-manager installer backends + * @par Sync (or) Async : Synchronous API + * + * @param[in] mfx pointer to manifest info + * @return 0 if success, error code(<0) if fail + * @pre None + * @post None + * @see pkgmgr_parser_insert_manifest_info_in_db() + * @see pkgmgr_parser_delete_manifest_info_from_db() + * @code +static int update_manifest_data(manifest_x *mfx) +{ + int ret = 0; + ret = pkgmgr_parser_update_manifest_info_in_db(mfx); + if (ret < 0) + return -1; + return 0; +} + * @endcode + */ +int pkgmgr_parser_update_manifest_info_in_db(manifest_x *mfx); + +/** + * @fn int pkgmgr_parser_delete_manifest_info_from_db(manifest_x *mfx) + * @brief This API deletes the parsed manifest info from db + * + * @par This API is for package-manager installer backends + * @par Sync (or) Async : Synchronous API + * + * @param[in] mfx pointer to manifest info + * @return 0 if success, error code(<0) if fail + * @pre None + * @post None + * @see pkgmgr_parser_update_manifest_info_in_db() + * @see pkgmgr_parser_insert_manifest_info_in_db() + * @code +static int delete_manifest_data(manifest_x *mfx) +{ + int ret = 0; + ret = pkgmgr_parser_delete_manifest_info_from_db(mfx); + if (ret < 0) + return -1; + return 0; +} + * @endcode + */ +int pkgmgr_parser_delete_manifest_info_from_db(manifest_x *mfx); + +int pkgmgr_parser_update_preload_info_in_db(); +int pkgmgr_parser_check_and_create_db(); +int pkgmgr_parser_initialize_db(); +int pkgmgr_parser_delete_pkgid_info_from_db(const char *pkgid); +int pkgmgr_parser_delete_appid_info_from_db(const char *appid); + +int pkgmgr_parser_update_enabled_pkg_info_in_db(const char *pkgid); +int pkgmgr_parser_update_disabled_pkg_info_in_db(const char *pkgid); +int pkgmgr_parser_insert_app_aliasid_info_in_db(void); +int pkgmgr_parser_update_app_aliasid_info_in_db(void); + +/** @} */ +#ifdef __cplusplus +} +#endif +#endif /* __PKGMGR_PARSER_DB_H__ */ +/** + * @} + * @} + */ diff --git a/parser/pkgmgr_parser_db_util.c b/parser/pkgmgr_parser_db_util.c new file mode 100644 index 0000000..4f6f26c --- /dev/null +++ b/parser/pkgmgr_parser_db_util.c @@ -0,0 +1,97 @@ +/* + * pkgmgr_parser_db_util + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include "pkgmgr_parser.h" +#include "pkgmgrinfo_debug.h" + +#ifdef LOG_TAG +#undef LOG_TAG +#endif +#define LOG_TAG "PKGMGR_PARSER" + +int _pkgmgr_db_open(const char *dbfile, sqlite3 **database) +{ + int ret = 0; + retvm_if(dbfile == NULL, PM_PARSER_R_ERROR, "dbfile is NULL"); + retvm_if(database == NULL, PM_PARSER_R_ERROR, "database is NULL"); + + ret = db_util_open(dbfile, database, 0); + retvm_if(ret != SQLITE_OK, PM_PARSER_R_ERROR, "db_open fail[ret = %d]\n", ret); + + return 0; +} + +int _pkgmgr_db_prepare(sqlite3 *database, const char *query, sqlite3_stmt **stmt) +{ + int ret = 0; + retvm_if(database == NULL, PM_PARSER_R_ERROR, "database is NULL"); + retvm_if(query == NULL, PM_PARSER_R_ERROR, "query is NULL"); + retvm_if(stmt == NULL, PM_PARSER_R_ERROR, "stmt is NULL"); + + ret = sqlite3_prepare_v2(database, query, strlen(query), stmt, NULL); + retvm_if(ret != SQLITE_OK, PM_PARSER_R_ERROR, "db_prepare fail[ret = %d]\n", ret); + + return 0; +} + +int _pkgmgr_db_step(sqlite3_stmt *stmt) +{ + int ret = 0; + retvm_if(stmt == NULL, PM_PARSER_R_ERROR, "stmt is NULL"); + + ret = sqlite3_step(stmt); + retvm_if(ret != SQLITE_ROW, PM_PARSER_R_ERROR, "db_step fail[ret = %d]\n", ret); + + return 0; +} + +int _pkgmgr_db_get_str(sqlite3_stmt *stmt, int index, char **str) +{ + retvm_if(stmt == NULL, PM_PARSER_R_ERROR, "stmt is NULL"); + retvm_if(str == NULL, PM_PARSER_R_ERROR, "str is NULL"); + + *str = (char *)sqlite3_column_text(stmt, index); + + return 0; +} + +int _pkgmgr_db_finalize(sqlite3_stmt *stmt) +{ + int ret = 0; + retvm_if(stmt == NULL, PM_PARSER_R_ERROR, "stmt is NULL"); + + ret = sqlite3_finalize(stmt); + retvm_if(ret != SQLITE_OK, PM_PARSER_R_ERROR, "db_finalize fail[ret = %d]\n", ret); + + return 0; +} + +int _pkgmgr_db_close(sqlite3 *database) +{ + int ret = 0; + ret = sqlite3_close(database); + retvm_if(ret != SQLITE_OK, PM_PARSER_R_ERROR, "db_close fail[ret = %d]\n", ret); + + return 0; +} + diff --git a/parser/pkgmgr_parser_db_util.h b/parser/pkgmgr_parser_db_util.h new file mode 100644 index 0000000..e64cff3 --- /dev/null +++ b/parser/pkgmgr_parser_db_util.h @@ -0,0 +1,37 @@ +/* + * pkgmgr-info + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + + + + +#ifndef __PKGMGR_PARSER_DB_UTIL_H__ +#define __PKGMGR_PARSER_DB_UTIL_H__ + +int _pkgmgr_db_open(const char *dbfile, sqlite3 **database); +int _pkgmgr_db_prepare(sqlite3 *database, const char *query, sqlite3_stmt **stmt); +int _pkgmgr_db_step(sqlite3_stmt *stmt); +int _pkgmgr_db_get_str(sqlite3_stmt *stmt, int index, char **str); +int _pkgmgr_db_finalize(sqlite3_stmt *stmt); +int _pkgmgr_db_close(sqlite3 *database); + +#endif /* __PKGMGR_PARSER_DB_UTIL_H__ */ diff --git a/parser/pkgmgr_parser_feature.c b/parser/pkgmgr_parser_feature.c new file mode 100755 index 0000000..0968304 --- /dev/null +++ b/parser/pkgmgr_parser_feature.c @@ -0,0 +1,807 @@ +/* + * pkgmgr-info + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "pkgmgr-info.h" +#include "pkgmgr_parser.h" +#include "pkgmgr_parser_internal.h" +#include "pkgmgr_parser_db.h" +#include "pkgmgr_parser_db_util.h" +#include "pkgmgr_parser_plugin.h" + +#include "pkgmgrinfo_debug.h" +#include "pkgmgr_parser_feature.h" + +#ifdef LOG_TAG +#undef LOG_TAG +#endif +#define LOG_TAG "PKGMGR_PARSER" + +#define MAX_QUERY_LEN 4096 + +sqlite3 *pkgmgr_parser_db; +sqlite3 *pkgmgr_cert_db; + +#define QUERY_CREATE_TABLE_DISABLED_PACKAGE_INFO "create table if not exists disabled_package_info " \ + "(package text primary key not null, " \ + "package_type text DEFAULT 'rpm', " \ + "package_version text, " \ + "install_location text, " \ + "package_size text, " \ + "package_removable text DEFAULT 'true', " \ + "package_preload text DEFAULT 'false', " \ + "package_readonly text DEFAULT 'false', " \ + "package_update text DEFAULT 'false', " \ + "package_appsetting text DEFAULT 'false', " \ + "package_nodisplay text DEFAULT 'false', " \ + "package_system text DEFAULT 'false', " \ + "author_name text, " \ + "author_email text, " \ + "author_href text," \ + "installed_time text," \ + "installed_storage text," \ + "storeclient_id text," \ + "mainapp_id text," \ + "package_url text," \ + "root_path text," \ + "csc_path text)" + +#define QUERY_CREATE_TABLE_DISABLED_PACKAGE_APP_INFO "create table if not exists disabled_package_app_info " \ + "(app_id text primary key not null, " \ + "app_component text, " \ + "app_exec text, " \ + "app_nodisplay text DEFAULT 'false', " \ + "app_type text, " \ + "app_onboot text DEFAULT 'false', " \ + "app_multiple text DEFAULT 'false', " \ + "app_autorestart text DEFAULT 'false', " \ + "app_taskmanage text DEFAULT 'false', " \ + "app_enabled text DEFAULT 'true', " \ + "app_hwacceleration text DEFAULT 'use-system-setting', " \ + "app_screenreader text DEFAULT 'use-system-setting', " \ + "app_mainapp text, " \ + "app_recentimage text, " \ + "app_launchcondition text, " \ + "app_indicatordisplay text DEFAULT 'true', " \ + "app_portraitimg text, " \ + "app_landscapeimg text, " \ + "app_guestmodevisibility text DEFAULT 'true', " \ + "app_permissiontype text DEFAULT 'normal', " \ + "app_preload text DEFAULT 'false', " \ + "app_submode text DEFAULT 'false', " \ + "app_submode_mainid text, " \ + "app_installed_storage text, " \ + "component_type text, " \ + "package text not null, " \ + "FOREIGN KEY(package) " \ + "REFERENCES package_info(package) " \ + "ON DELETE CASCADE)" + +#define QUERY_CREATE_TABLE_DISABLED_PACKAGE_LOCALIZED_INFO "create table if not exists disabled_package_localized_info " \ + "(package text not null, " \ + "package_locale text DEFAULT 'No Locale', " \ + "package_label text, " \ + "package_icon text, " \ + "package_description text, " \ + "package_license text, " \ + "package_author, " \ + "PRIMARY KEY(package, package_locale), " \ + "FOREIGN KEY(package) " \ + "REFERENCES package_info(package) " \ + "ON DELETE CASCADE)" + +#define QUERY_CREATE_TABLE_DISABLED_PACKAGE_APP_LOCALIZED_INFO "create table if not exists disabled_package_app_localized_info " \ + "(app_id text not null, " \ + "app_locale text DEFAULT 'No Locale', " \ + "app_label text, " \ + "app_icon text, " \ + "package text not null, " \ + "PRIMARY KEY(app_id,app_locale) " \ + "FOREIGN KEY(app_id) " \ + "REFERENCES package_app_info(app_id) " \ + "ON DELETE CASCADE)" + +#define QUERY_CREATE_TABLE_DISABLED_PACKAGE_APP_APP_CATEGORY "create table if not exists disabled_package_app_app_category " \ + "(app_id text not null, " \ + "category text not null, " \ + "package text not null, " \ + "PRIMARY KEY(app_id,category) " \ + "FOREIGN KEY(app_id) " \ + "REFERENCES package_app_info(app_id) " \ + "ON DELETE CASCADE)" + + +#define QUERY_CREATE_TABLE_DISABLED_PACKAGE_APP_APP_METADATA "create table if not exists disabled_package_app_app_metadata " \ + "(app_id text not null, " \ + "md_key text not null, " \ + "md_value text not null, " \ + "package text not null, " \ + "PRIMARY KEY(app_id, md_key, md_value) " \ + "FOREIGN KEY(app_id) " \ + "REFERENCES package_app_info(app_id) " \ + "ON DELETE CASCADE)" + +int __init_tables_for_wearable(void) +{ + int ret = 0; + + ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_DISABLED_PACKAGE_INFO); + if (ret == -1) { + _LOGD("package pkg reserve info DB initialization failed\n"); + return ret; + } + + ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_DISABLED_PACKAGE_APP_INFO); + if (ret == -1) { + _LOGD("package pkg reserve info DB initialization failed\n"); + return ret; + } + + ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_DISABLED_PACKAGE_LOCALIZED_INFO); + if (ret == -1) { + _LOGD("package pkg reserve info DB initialization failed\n"); + return ret; + } + + ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_DISABLED_PACKAGE_APP_LOCALIZED_INFO); + if (ret == -1) { + _LOGD("package pkg reserve info DB initialization failed\n"); + return ret; + } + + ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_DISABLED_PACKAGE_APP_APP_CATEGORY); + if (ret == -1) { + _LOGD("package pkg reserve info DB initialization failed\n"); + return ret; + } + + ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_DISABLED_PACKAGE_APP_APP_METADATA); + + if (ret == -1) { + _LOGD("package pkg reserve info DB initialization failed\n"); + return ret; + } + + return ret; +} + +static int __insert_disabled_ui_mainapp_info(manifest_x *mfx) +{ + uiapplication_x *up = mfx->uiapplication; + int ret = -1; + char *query = NULL; + while(up != NULL) + { + query = sqlite3_mprintf("update disabled_package_app_info set app_mainapp=%Q where app_id=%Q", up->mainapp, up->appid); + + ret = __exec_query(query); + sqlite3_free(query); + if (ret == -1) { + _LOGD("Package UiApp Info DB Insert Failed\n"); + return -1; + } + if (strcasecmp(up->mainapp, "True") == 0) { + FREE_AND_NULL(mfx->mainapp_id); + mfx->mainapp_id = strdup(up->appid); + } + + up = up->next; + } + + if (mfx->mainapp_id == NULL){ + if (mfx->uiapplication && mfx->uiapplication->appid) { + query = sqlite3_mprintf("update disabled_package_app_info set app_mainapp='true' where app_id=%Q", mfx->uiapplication->appid); + } else { + _LOGD("Not valid appid\n"); + return -1; + } + + ret = __exec_query(query); + sqlite3_free(query); + if (ret == -1) { + _LOGD("Package UiApp Info DB Insert Failed\n"); + return -1; + } + + free((void *)mfx->uiapplication->mainapp); + mfx->uiapplication->mainapp= strdup("true"); + mfx->mainapp_id = strdup(mfx->uiapplication->appid); + } + + query = sqlite3_mprintf("update disabled_package_info set mainapp_id=%Q where package=%Q", mfx->mainapp_id, mfx->package); + ret = __exec_query(query); + sqlite3_free(query); + if (ret == -1) { + _LOGD("Package Info DB update Failed\n"); + return -1; + } + + return 0; +} + +static int __insert_disabled_uiapplication_info(manifest_x *mfx) +{ + uiapplication_x *up = mfx->uiapplication; + int ret = -1; + char *query = NULL; + while(up != NULL) + { + query = sqlite3_mprintf("insert into disabled_package_app_info(app_id, app_component, app_exec, app_ambient_support, app_nodisplay, app_type, app_onboot, " \ + "app_multiple, app_autorestart, app_taskmanage, app_enabled, app_hwacceleration, app_screenreader, app_mainapp , app_recentimage, " \ + "app_launchcondition, app_indicatordisplay, app_portraitimg, app_landscapeimg, app_guestmodevisibility, app_permissiontype, "\ + "app_preload, app_submode, app_submode_mainid, app_installed_storage, component_type, package) " \ + "values(%Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q)",\ + up->appid, + "uiapp", + up->exec, + up->ambient_support, + up->nodisplay, + up->type, + PKGMGR_PARSER_EMPTY_STR, + up->multiple, + PKGMGR_PARSER_EMPTY_STR, + up->taskmanage, + up->enabled, + up->hwacceleration, + up->screenreader, + up->mainapp, + __get_str(up->recentimage), + up->launchcondition, + up->indicatordisplay, + __get_str(up->portraitimg), + __get_str(up->landscapeimg), + up->guestmode_visibility, + up->permission_type, + mfx->preload, + up->submode, + __get_str(up->submode_mainid), + mfx->installed_storage, + up->component_type, + mfx->package); + + ret = __exec_query(query); + sqlite3_free(query); + if (ret == -1) { + _LOGD("Package UiApp Info DB Insert Failed\n"); + return -1; + } + up = up->next; + } + return 0; +} + +static void __insert_disabled_uiapplication_locale_info(gpointer data, gpointer userdata) +{ + int ret = -1; + char *label = NULL; + char *icon = NULL; + char *query = NULL; + + uiapplication_x *up = (uiapplication_x*)userdata; + label_x *lbl = up->label; + icon_x *icn = up->icon; + + __extract_data(data, lbl, NULL, icn, NULL, NULL, &label, NULL, &icon, NULL, NULL); + if (!label && !icon) + return; + query = sqlite3_mprintf("insert into disabled_package_app_localized_info(app_id, app_locale, " \ + "app_label, app_icon, package) values " \ + "(%Q, %Q, %Q, %Q, %Q)", up->appid, (char*)data, + label, icon, up->package); + ret = __exec_query(query); + sqlite3_free(query); + if (ret == -1) + _LOGD("Package UiApp Localized Info DB Insert failed\n"); + + /*insert ui app locale info to pkg locale to get mainapp data */ + if (strcasecmp(up->mainapp, "true")==0) { + char *update_query = NULL; + update_query = sqlite3_mprintf("insert into disabled_package_localized_info(package, package_locale, " \ + "package_label, package_icon, package_description, package_license, package_author) values " \ + "(%Q, %Q, %Q, %Q, %Q, %Q, %Q)", + up->package, + (char*)data, + label, + icon, + PKGMGR_PARSER_EMPTY_STR, + PKGMGR_PARSER_EMPTY_STR, + PKGMGR_PARSER_EMPTY_STR); + + ret = __exec_query_no_msg(update_query); + sqlite3_free(update_query); + + if (icon != NULL) { + update_query = sqlite3_mprintf("update package_localized_info set package_icon=%Q " \ + "where package=%Q and package_locale=%Q", icon, up->package, (char*)data); + ret = __exec_query_no_msg(update_query); + sqlite3_free(update_query); + } + } +} + +static int __insert_disabled_uiapplication_appcategory_info(manifest_x *mfx) +{ + uiapplication_x *up = mfx->uiapplication; + category_x *ct = NULL; + int ret = -1; + char *query = NULL; + while(up != NULL) + { + ct = up->category; + while (ct != NULL) + { + query = sqlite3_mprintf("insert into disabled_package_app_app_category(app_id, category, package) " \ + "values(%Q, %Q, %Q)",\ + up->appid, ct->name, up->package); + ret = __exec_query(query); + sqlite3_free(query); + if (ret == -1) { + _LOGD("Package UiApp Category Info DB Insert Failed\n"); + return -1; + } + ct = ct->next; + } + up = up->next; + } + return 0; +} + +static int __insert_disabled_uiapplication_appmetadata_info(manifest_x *mfx) +{ + uiapplication_x *up = mfx->uiapplication; + metadata_x *md = NULL; + int ret = -1; + char *query = NULL; + while(up != NULL) + { + md = up->metadata; + while (md != NULL) + { + if (md->key) { + query = sqlite3_mprintf("insert into disabled_package_app_app_metadata(app_id, md_key, md_value, package) " \ + "values(%Q, %Q, %Q, %Q)",\ + up->appid, md->key, md->value, up->package); + ret = __exec_query(query); + sqlite3_free(query); + if (ret == -1) { + _LOGD("Package UiApp Metadata Info DB Insert Failed\n"); + return -1; + } + } + md = md->next; + } + up = up->next; + } + return 0; +} + +static void __insert_disabled_pkglocale_info(gpointer data, gpointer userdata) +{ + int ret = -1; + char *label = NULL; + char *icon = NULL; + char *description = NULL; + char *license = NULL; + char *author = NULL; + char *query = NULL; + + manifest_x *mfx = (manifest_x *)userdata; + label_x *lbl = mfx->label; + license_x *lcn = mfx->license; + icon_x *icn = mfx->icon; + description_x *dcn = mfx->description; + author_x *ath = mfx->author; + + __extract_data(data, lbl, lcn, icn, dcn, ath, &label, &license, &icon, &description, &author); + if (!label && !description && !icon && !license && !author) + return; + + query = sqlite3_mprintf("insert into disabled_package_localized_info(package, package_locale, " \ + "package_label, package_icon, package_description, package_license, package_author) values " \ + "(%Q, %Q, %Q, %Q, %Q, %Q, %Q)", + mfx->package, + (char*)data, + label, + icon, + __get_str(description), + __get_str(license), + __get_str(author)); + + ret = __exec_query(query); + sqlite3_free(query); + if (ret == -1) + _LOGD("Package Localized Info DB Insert failed\n"); +} + +static int __insert_disabled_pkg_info_in_db(manifest_x *mfx) +{ + label_x *lbl = mfx->label; + license_x *lcn = mfx->license; + icon_x *icn = mfx->icon; + description_x *dcn = mfx->description; + author_x *ath = mfx->author; + uiapplication_x *up = mfx->uiapplication; + + char *query = NULL; + char root[MAX_QUERY_LEN] = { '\0' }; + int ret = -1; + char *type = NULL; + char *path = NULL; + const char *auth_name = NULL; + const char *auth_email = NULL; + const char *auth_href = NULL; + + GList *pkglocale = NULL; + GList *applocale = NULL; + + if (ath) { + if (ath->text) + auth_name = ath->text; + if (ath->email) + auth_email = ath->email; + if (ath->href) + auth_href = ath->href; + } + + /*Insert in the package_info DB*/ + if (mfx->type) + type = strdup(mfx->type); + else + type = strdup("rpm"); + /*Insert in the package_info DB*/ + if (mfx->root_path) + path = strdup(mfx->root_path); + else{ + if (type && strcmp(type,"rpm")==0) + snprintf(root, MAX_QUERY_LEN - 1, "/usr/apps/%s", mfx->package); + else + snprintf(root, MAX_QUERY_LEN - 1, "/opt/usr/apps/%s", mfx->package); + + path = strdup(root); + } + query = sqlite3_mprintf("insert into disabled_package_info(package, package_type, package_version, install_location, package_size, " \ + "package_removable, package_preload, package_readonly, package_update, package_appsetting, package_nodisplay, package_system," \ + "author_name, author_email, author_href, installed_time, installed_storage, storeclient_id, mainapp_id, package_url, root_path, csc_path) " \ + "values(%Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q)",\ + mfx->package, + type, + mfx->version, + __get_str(mfx->installlocation), + __get_str(mfx->package_size), + mfx->removable, + mfx->preload, + mfx->readonly, + mfx->update, + mfx->appsetting, + mfx->nodisplay_setting, + mfx->system, + __get_str(auth_name), + __get_str(auth_email), + __get_str(auth_href), + mfx->installed_time, + mfx->installed_storage, + __get_str(mfx->storeclient_id), + mfx->mainapp_id, + __get_str(mfx->package_url), + path, + __get_str(mfx->csc_path)); + + ret = __exec_query(query); + sqlite3_free(query); + if (ret == -1) { + _LOGD("Package Info DB Insert Failed\n"); + if (type) { + free(type); + type = NULL; + } + if (path) { + free(path); + path = NULL; + } + return -1; + } + + if (type) { + free(type); + type = NULL; + } + if (path) { + free(path); + path = NULL; + } + + ret = __insert_disabled_ui_mainapp_info(mfx); + if (ret == -1) + return -1; + + /*Insert the package locale*/ + pkglocale = __create_locale_list(pkglocale, lbl, lcn, icn, dcn, ath); + /*remove duplicated data in pkglocale*/ + __trimfunc(pkglocale); + + /*Insert the app locale info */ + while(up != NULL) + { + applocale = __create_locale_list(applocale, up->label, NULL, up->icon, NULL, NULL); + up = up->next; + } + + /*remove duplicated data in applocale*/ + __trimfunc(applocale); + + /*g_list_foreach(pkglocale, __printfunc, NULL);*/ + /*_LOGD("\n");*/ + /*g_list_foreach(applocale, __printfunc, NULL);*/ + + g_list_foreach(pkglocale, __insert_disabled_pkglocale_info, (gpointer)mfx); + + /*native app locale info*/ + up = mfx->uiapplication; + while(up != NULL) + { + g_list_foreach(applocale, __insert_disabled_uiapplication_locale_info, (gpointer)up); + up = up->next; + } + + g_list_free(pkglocale); + pkglocale = NULL; + g_list_free(applocale); + applocale = NULL; + + /*Insert in the package_app_info DB*/ + ret = __insert_disabled_uiapplication_info(mfx); + if (ret == -1) + return -1; + + /*Insert in the package_app_app_category DB*/ + ret = __insert_disabled_uiapplication_appcategory_info(mfx); + if (ret == -1) + return -1; + + /*Insert in the package_app_app_metadata DB*/ + ret = __insert_disabled_uiapplication_appmetadata_info(mfx); + if (ret == -1) + return -1; + + return 0; +} + +static int __delete_disabled_pkg_info_from_pkgid(const char *pkgid) +{ + char *query = NULL; + int ret = -1; + + /*Delete from Package Info DB*/ + query = sqlite3_mprintf("delete from disabled_package_info where package=%Q", pkgid); + ret = __exec_query(query); + tryvm_if(ret < 0, ret = PMINFO_R_ERROR, "Package Info DB Delete Failed\n"); + + /*Delete from Package Localized Info*/ + sqlite3_free(query); + query = sqlite3_mprintf("delete from disabled_package_localized_info where package=%Q", pkgid); + ret = __exec_query(query); + tryvm_if(ret < 0, ret = PMINFO_R_ERROR, "Package Localized Info DB Delete Failed\n"); + + /*Delete from app Info*/ + sqlite3_free(query); + query = sqlite3_mprintf("delete from disabled_package_app_info where package=%Q", pkgid); + ret = __exec_query(query); + tryvm_if(ret < 0, ret = PMINFO_R_ERROR, "app Info DB Delete Failed\n"); + + /*Delete from app Localized Info*/ + sqlite3_free(query); + query = sqlite3_mprintf("delete from disabled_package_app_localized_info where package=%Q", pkgid); + ret = __exec_query(query); + tryvm_if(ret < 0, ret = PMINFO_R_ERROR, "app Localized Info DB Delete Failed\n"); + + /*Delete from app category Info*/ + sqlite3_free(query); + query = sqlite3_mprintf("delete from disabled_package_app_app_category where package=%Q", pkgid); + ret = __exec_query(query); + tryvm_if(ret < 0, ret = PMINFO_R_ERROR, "app category Info DB Delete Failed\n"); + + /*Delete from app metadata Info*/ + sqlite3_free(query); + query = sqlite3_mprintf("delete from disabled_package_app_app_metadata where package=%Q", pkgid); + ret = __exec_query(query); + tryvm_if(ret < 0, ret = PMINFO_R_ERROR, "app metadata Info DB Delete Failed\n"); + +catch: + sqlite3_free(query); + return 0; +} + +API int pkgmgr_parser_insert_disabled_pkg_info_in_db(manifest_x *mfx) +{ + if (mfx == NULL) { + _LOGD("manifest pointer is NULL\n"); + return -1; + } + int ret = 0; + ret = pkgmgr_parser_check_and_create_db(); + if (ret == -1) { + _LOGD("Failed to open DB\n"); + return ret; + } + ret = pkgmgr_parser_initialize_db(); + if (ret == -1) + goto err; + /*Begin transaction*/ + ret = sqlite3_exec(pkgmgr_parser_db, "BEGIN EXCLUSIVE", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + _LOGD("Failed to begin transaction[%d]\n", ret); + ret = -1; + goto err; + } + _LOGD("Transaction Begin\n"); + ret = __insert_disabled_pkg_info_in_db(mfx); + if (ret == -1) { + _LOGE("Insert into DB failed. Rollback now\n"); + ret = sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); + if (ret != SQLITE_OK) + _LOGE("ROLLBACK is fail after insert_disabled_pkg_info_in_db\n"); + + ret = -1; + goto err; + } + /*Commit transaction*/ + ret = sqlite3_exec(pkgmgr_parser_db, "COMMIT", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + _LOGE("Failed to commit transaction. Rollback now\n"); + ret = sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); + if (ret != SQLITE_OK) + _LOGE("Failed to commit transaction. Rollback now\n"); + + ret = -1; + goto err; + } + _LOGD("Transaction Commit and End\n"); +err: + pkgmgr_parser_close_db(); + return ret; +} + +API int pkgmgr_parser_delete_disabled_pkgid_info_from_db(const char *pkgid) +{ + retvm_if(pkgid == NULL, PMINFO_R_ERROR, "argument supplied is NULL"); + + int ret = 0; + + /*open db*/ + ret = pkgmgr_parser_check_and_create_db(); + retvm_if(ret < 0, PMINFO_R_ERROR, "Failed to open DB\n"); + + /*Begin transaction*/ + ret = sqlite3_exec(pkgmgr_parser_db, "BEGIN EXCLUSIVE", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + _LOGE("Failed to begin transaction\n"); + ret = -1; + goto err; + } + + _LOGD("Start to Delete pkgid[%s] info from db\n", pkgid); + + /*delete pkg info*/ + ret = __delete_disabled_pkg_info_from_pkgid(pkgid); + if (ret == -1) { + _LOGD("Delete from DB failed. Rollback now\n"); + ret = sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); + if (ret != SQLITE_OK) + _LOGE("Failed to begin transaction\n"); + goto err; + } + + /*Commit transaction*/ + ret = sqlite3_exec(pkgmgr_parser_db, "COMMIT", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + _LOGD("Failed to commit transaction, Rollback now\n"); + ret = sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); + if (ret != SQLITE_OK) + _LOGE("Failed to commit transaction, Rollback now\n"); + + ret = -1; + goto err; + } + +err: + pkgmgr_parser_close_db(); + return ret; +} + +API int pkgmgr_parser_insert_disabled_pkg(const char *pkgid, char *const tagv[]) +{ + retvm_if(pkgid == NULL, PM_PARSER_R_ERROR, "argument supplied is NULL"); + + char *manifest = NULL; + manifest_x *mfx = NULL; + int ret = -1; + + _LOGD("parsing manifest for installation: %s\n", pkgid); + + manifest = pkgmgr_parser_get_manifest_file(pkgid); + if (manifest == NULL) { + _LOGE("can not get the manifest.xml\n"); + return -1; + } + + xmlInitParser(); + mfx = pkgmgr_parser_process_manifest_xml(manifest); + retvm_if(mfx == NULL, PM_PARSER_R_ERROR, "argument supplied is NULL"); + + _LOGD("Parsing Finished\n"); + + __add_preload_info(mfx, manifest); + + _LOGD("Added preload infomation\n"); + + FREE_AND_NULL(manifest); + + ret = pkgmgr_parser_insert_disabled_pkg_info_in_db(mfx); + retvm_if(ret == PM_PARSER_R_ERROR, PM_PARSER_R_ERROR, "DB Insert failed"); + + _LOGD("DB Insert Success\n"); + + pkgmgr_parser_free_manifest_xml(mfx); + _LOGD("Free Done\n"); + xmlCleanupParser(); + + return PM_PARSER_R_OK; +} + +API int pkgmgr_parser_delete_disabled_pkg(const char *pkgid, char *const tagv[]) +{ + retvm_if(pkgid == NULL, PM_PARSER_R_ERROR, "argument supplied is NULL"); + + int ret = -1; + + _LOGD("Start uninstall for pkgid : delete pkgid[%s]\n", pkgid); + + /* delete pkgmgr db */ + ret = pkgmgr_parser_delete_disabled_pkgid_info_from_db(pkgid); + if (ret == -1) + _LOGD("DB pkgid info Delete failed\n"); + else + _LOGD("DB pkgid info Delete Success\n"); + + _LOGD("Finish : uninstall for pkgid\n"); + + return PM_PARSER_R_OK; +} diff --git a/parser/pkgmgr_parser_feature.h b/parser/pkgmgr_parser_feature.h new file mode 100755 index 0000000..bba6cee --- /dev/null +++ b/parser/pkgmgr_parser_feature.h @@ -0,0 +1,40 @@ +/* + * pkgmgr-info + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#ifndef __PKGMGR_PARSER_FEATURE_H__ +#define __PKGMGR_PARSER_FEATURE_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +int __init_tables_for_wearable(void); +int pkgmgr_parser_insert_disabled_pkg(const char *pkgid, char *const tagv[]); +int pkgmgr_parser_delete_disabled_pkg(const char *pkgid, char *const tagv[]); +int pkgmgr_parser_insert_disabled_pkg_info_in_db(manifest_x *mfx); +int pkgmgr_parser_delete_disabled_pkgid_info_from_db(const char *pkgid); + +#ifdef __cplusplus +} +#endif +#endif /* __PKGPMGR_PARSER_FEATURE_H__ */ diff --git a/parser/pkgmgr_parser_internal.h b/parser/pkgmgr_parser_internal.h new file mode 100755 index 0000000..69d1b9b --- /dev/null +++ b/parser/pkgmgr_parser_internal.h @@ -0,0 +1,48 @@ +/* + * pkgmgr-info + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + + + + +#ifndef __PKGMGR_PARSER_INTERNAL_H__ +#define __PKGMGR_PARSER_INTERNAL_H__ + +#include "pkgmgrinfo_basic.h" + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +void pkgmgr_parser_close_db(); +void __add_preload_info(manifest_x * mfx, const char *manifest); +void __extract_data(gpointer data, label_x *lbl, license_x *lcn, icon_x *icn, description_x *dcn, author_x *ath, + char **label, char **license, char **icon, char **description, char **author); +GList *__create_locale_list(GList *locale, label_x *lbl, license_x *lcn, icon_x *icn, description_x *dcn, author_x *ath); +int __exec_query_no_msg(char *query); +void __trimfunc(GList* trim_list); +const char *__get_str(const char *str); +int __initialize_db(sqlite3 *db_handle, char *db_query); +int __exec_query(char *query); +int __evaluate_query(sqlite3 *db_handle, char *query); + +#endif /* __PKGMGR_PARSER_INTERNAL_H__ */ diff --git a/parser/pkgmgr_parser_plugin.c b/parser/pkgmgr_parser_plugin.c new file mode 100644 index 0000000..475f3ad --- /dev/null +++ b/parser/pkgmgr_parser_plugin.c @@ -0,0 +1,1023 @@ +/* + * pkgmgr-info + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "pkgmgr_parser_plugin.h" +#include "pkgmgr-info.h" +#include "pkgmgrinfo_debug.h" + +#ifdef LOG_TAG +#undef LOG_TAG +#endif +#define LOG_TAG "PKGMGR_PLUGIN" + +#define ASCII(s) (const char *)s +#define XMLCHAR(s) (const xmlChar *)s + +#define PLLUGIN_LIST "/usr/etc/package-manager/parserlib/pkgmgr_parser_plugin_list.txt" + +#define TOKEN_TYPE_STR "type=" +#define TOKEN_NAME_STR "name=" +#define TOKEN_FLAG_STR "flag=" +#define TOKEN_PATH_STR "path=" + +#define SEPERATOR_START '"' +#define SEPERATOR_END '"' + +#define PKG_PARSER_CONF_PATH "/usr/etc/package-manager/parser_path.conf" +#define TAG_PARSER_NAME "parserlib:" + +typedef struct pkgmgr_parser_plugin_info_x { + manifest_x *mfx; + char *pkgid; + char *appid; + char *filename; + char *type; + char *name; + char *path; + char *flag; + void *lib_handle; + ACTION_TYPE action; + int enabled_plugin; +} pkgmgr_parser_plugin_info_x; + +#define E_PKGMGR_PARSER_PLUGIN_MAX 0xFFFFFFFF + +#define QUERY_CREATE_TABLE_PACKAGE_PLUGIN_INFO "create table if not exists package_plugin_info " \ + "(pkgid text primary key not null, " \ + "enabled_plugin INTEGER DEFAULT 0)" + +/*db info*/ +#define PKGMGR_PARSER_DB_FILE "/opt/dbspace/.pkgmgr_parser.db" +sqlite3 *pkgmgr_parser_db; + +typedef struct { + char *key; + char *value; +} __metadata_t; + +typedef struct { + char *name; +} __category_t; + +static void __str_trim(char *input) +{ + char *trim_str = input; + + if (input == NULL) + return; + + while (*input != 0) { + if (!isspace(*input)) { + *trim_str = *input; + trim_str++; + } + input++; + } + + *trim_str = 0; + return; +} + +static char *__get_parser_plugin_path(const char *type, char *plugin_name) +{ + FILE *fp = NULL; + char buffer[1024] = { 0 }; + char temp_path[1024] = { 0 }; + char *path = NULL; + + if (type == NULL) { + _LOGE("invalid argument\n"); + return NULL; + } + + fp = fopen(PKG_PARSER_CONF_PATH, "r"); + if (fp == NULL) { + _LOGE("no matching backendlib\n"); + return NULL; + } + + while (fgets(buffer, sizeof(buffer), fp) != NULL) { + if (buffer[0] == '#') + continue; + + __str_trim(buffer); + + if ((path = strstr(buffer, plugin_name)) != NULL) { + path = path + strlen(plugin_name); + break; + } + + memset(buffer, 0x00, 1024); + } + + if (fp != NULL) + fclose(fp); + + if (path == NULL) { + _LOGE("no matching backendlib\n"); + return NULL; + } + + snprintf(temp_path, sizeof(temp_path) - 1, "%slib%s.so", path, type); + + return strdup(temp_path); +} + +static void __metadata_parser_clear_dir_list(GList* dir_list) +{ + GList *list = NULL; + __metadata_t* detail = NULL; + + if (dir_list) { + list = g_list_first(dir_list); + while (list) { + detail = (__metadata_t *)list->data; + if (detail) { + FREE_AND_NULL(detail->key); + FREE_AND_NULL(detail->value); + FREE_AND_NULL(detail); + } + list = g_list_next(list); + } + g_list_free(dir_list); + } +} + +static void __category_parser_clear_dir_list(GList* dir_list) +{ + GList *list = NULL; + __category_t* detail = NULL; + + if (dir_list) { + list = g_list_first(dir_list); + while (list) { + detail = (__category_t *)list->data; + if (detail) { + FREE_AND_NULL(detail->name); + FREE_AND_NULL(detail); + } + list = g_list_next(list); + } + g_list_free(dir_list); + } +} + +static int __parser_send_tag(void *lib_handle, ACTION_TYPE action, PLUGIN_PROCESS_TYPE process, const char *pkgid) +{ + int ret = -1; + int (*plugin_install) (const char *); + char *ac = NULL; + + if (process == PLUGIN_PRE_PROCESS) { + switch (action) { + case ACTION_INSTALL: + ac = "PKGMGR_PARSER_PLUGIN_PRE_INSTALL"; + break; + case ACTION_UPGRADE: + ac = "PKGMGR_PARSER_PLUGIN_PRE_UPGRADE"; + break; + case ACTION_UNINSTALL: + ac = "PKGMGR_PARSER_PLUGIN_PRE_UNINSTALL"; + break; + default: + _LOGE("PRE_PROCESS : action type error[%d]\n", action); + return -1; + } + } else if (process == PLUGIN_POST_PROCESS) { + switch (action) { + case ACTION_INSTALL: + ac = "PKGMGR_PARSER_PLUGIN_POST_INSTALL"; + break; + case ACTION_UPGRADE: + ac = "PKGMGR_PARSER_PLUGIN_POST_UPGRADE"; + break; + case ACTION_UNINSTALL: + ac = "PKGMGR_PARSER_PLUGIN_POST_UNINSTALL"; + break; + default: + _LOGE("POST_PROCESS : action type error[%d]\n", action); + return -1; + } + } else { + _LOGE("process type error[%d]\n", process); + return -1; + } + + if ((plugin_install = dlsym(lib_handle, ac)) == NULL || dlerror() != NULL) { + return -1; + } + + ret = plugin_install(pkgid); + return ret; +} + +int __ps_run_parser(xmlDocPtr docPtr, const char *tag, + ACTION_TYPE action, const char *pkgid) +{ + char *lib_path = NULL; + void *lib_handle = NULL; + int (*plugin_install) (xmlDocPtr, const char *); + int ret = -1; + char *ac = NULL; + + switch (action) { + case ACTION_INSTALL: + ac = "PKGMGR_PARSER_PLUGIN_INSTALL"; + break; + case ACTION_UPGRADE: + ac = "PKGMGR_PARSER_PLUGIN_UPGRADE"; + break; + case ACTION_UNINSTALL: + ac = "PKGMGR_PARSER_PLUGIN_UNINSTALL"; + break; + default: + goto END; + } + + lib_path = __get_parser_plugin_path(tag, TAG_PARSER_NAME); + + if (!lib_path) { + goto END; + } + + if ((lib_handle = dlopen(lib_path, RTLD_LAZY)) == NULL) { + _LOGE("dlopen is failed lib_path[%s]\n", lib_path); + goto END; + } + if ((plugin_install = + dlsym(lib_handle, ac)) == NULL || dlerror() != NULL) { + _LOGE("can not find symbol[%s] \n", ac); + goto END; + } + + ret = plugin_install(docPtr, pkgid); + if (ret < 0) + _LOGD("[pkgid = %s, libpath = %s plugin fail\n", pkgid, lib_path); + else + _LOGD("[pkgid = %s, libpath = %s plugin success\n", pkgid, lib_path); + +END: + FREE_AND_NULL(lib_path); + if (lib_handle) + dlclose(lib_handle); + return ret; +} + +static int __ps_get_enabled_plugin(const char *pkgid) +{ + char *query = NULL; + sqlite3_stmt *stmt = NULL; + const char *tail = NULL; + int rc = 0; + int enabled_plugin = 0; + + query = sqlite3_mprintf("select * from package_plugin_info where pkgid LIKE %Q", pkgid); + + if (SQLITE_OK != sqlite3_prepare(pkgmgr_parser_db, query, strlen(query), &stmt, &tail)) { + _LOGE("sqlite3_prepare error\n"); + sqlite3_free(query); + return E_PKGMGR_PARSER_PLUGIN_MAX; + } + + rc = sqlite3_step(stmt); + if (rc != SQLITE_ROW || rc == SQLITE_DONE) { + _LOGE("No records found"); + goto FINISH_OFF; + } + + enabled_plugin = (int)sqlite3_column_int(stmt, 1); + +// _LOGD("enabled_plugin ===> %d", enabled_plugin); + + if (SQLITE_OK != sqlite3_finalize(stmt)) { + _LOGE("error : sqlite3_finalize\n"); + goto FINISH_OFF; + } + + sqlite3_free(query); + return enabled_plugin; + +FINISH_OFF: + rc = sqlite3_finalize(stmt); + if (rc != SQLITE_OK) { + _LOGE(" sqlite3_finalize failed - %d", rc); + } + sqlite3_free(query); + return E_PKGMGR_PARSER_PLUGIN_MAX; +} + +static char *__getvalue(const char* pBuf, const char* pKey) +{ + const char* p = NULL; + const char* pStart = NULL; + const char* pEnd = NULL; + + p = strstr(pBuf, pKey); + if (p == NULL) + return NULL; + + pStart = p + strlen(pKey) + 1; + pEnd = strchr(pStart, SEPERATOR_END); + if (pEnd == NULL) + return NULL; + + size_t len = pEnd - pStart; + if (len <= 0) + return NULL; + + char *pRes = (char*)malloc(len + 1); + if(pRes == NULL) + return NULL; + + strncpy(pRes, pStart, len); + pRes[len] = 0; + + return pRes; +} + +static int __get_plugin_info_x(const char*buf, pkgmgr_parser_plugin_info_x *plugin_info) +{ + if (buf[0] == '#') + return -1; + + if (strstr(buf, TOKEN_TYPE_STR) == NULL) + return -1; + + plugin_info->type = __getvalue(buf, TOKEN_TYPE_STR); + if (plugin_info->type == NULL) + return -1; + + plugin_info->name = __getvalue(buf, TOKEN_NAME_STR); + plugin_info->flag = __getvalue(buf, TOKEN_FLAG_STR); + plugin_info->path = __getvalue(buf, TOKEN_PATH_STR); + + return 0; +} + +void __clean_plugin_info(pkgmgr_parser_plugin_info_x *plugin_info) +{ + if(plugin_info == NULL) + return; + + FREE_AND_NULL(plugin_info->filename); + FREE_AND_NULL(plugin_info->pkgid); + FREE_AND_NULL(plugin_info->appid); + FREE_AND_NULL(plugin_info); + return; +} + +static void __check_enabled_plugin(pkgmgr_parser_plugin_info_x *plugin_info) +{ + int enabled_plugin = 0x0000001; + + enabled_plugin = (int)strtol( plugin_info->flag, NULL, 16 ); + + _LOGD( "[%s] flag = 0x%x done[action=%d]!! \n", plugin_info->pkgid, enabled_plugin, plugin_info->action); + + plugin_info->enabled_plugin = plugin_info->enabled_plugin | enabled_plugin; +} + +static void __run_metadata_parser(pkgmgr_parser_plugin_info_x *plugin_info, GList *md_list, const char *appid) +{ + int (*metadata_parser_plugin) (const char *, const char *, GList *); + int ret = -1; + char *ac = NULL; + + switch (plugin_info->action) { + case ACTION_INSTALL: + ac = "PKGMGR_MDPARSER_PLUGIN_INSTALL"; + break; + case ACTION_UPGRADE: + ac = "PKGMGR_MDPARSER_PLUGIN_UPGRADE"; + break; + case ACTION_UNINSTALL: + ac = "PKGMGR_MDPARSER_PLUGIN_UNINSTALL"; + break; + default: + goto END; + } + + if ((metadata_parser_plugin = + dlsym(plugin_info->lib_handle, ac)) == NULL || dlerror() != NULL) { + _LOGE("can not find symbol[%s] \n",ac); + goto END; + } + + ret = metadata_parser_plugin(plugin_info->pkgid, appid, md_list); + _LOGD("Plugin = %s, appid = %s, result=%d\n", plugin_info->name, appid, ret); + + __check_enabled_plugin(plugin_info); + +END: + return; +} + +static void __run_category_parser(pkgmgr_parser_plugin_info_x *plugin_info, GList *category_list, const char *appid) +{ + int (*category_parser_plugin) (const char *, const char *, GList *); + int ret = -1; + char *ac = NULL; + + switch (plugin_info->action) { + case ACTION_INSTALL: + ac = "PKGMGR_CATEGORY_PARSER_PLUGIN_INSTALL"; + break; + case ACTION_UPGRADE: + ac = "PKGMGR_CATEGORY_PARSER_PLUGIN_UPGRADE"; + break; + case ACTION_UNINSTALL: + ac = "PKGMGR_CATEGORY_PARSER_PLUGIN_UNINSTALL"; + break; + default: + goto END; + } + + if ((category_parser_plugin = + dlsym(plugin_info->lib_handle, ac)) == NULL || dlerror() != NULL) { + _LOGE("can not find symbol[%s] \n",ac); + goto END; + } + + ret = category_parser_plugin(plugin_info->pkgid, appid, category_list); + _LOGD("Plugin = %s, appid = %s, result=%d\n", plugin_info->name, appid, ret); + + __check_enabled_plugin(plugin_info); + +END: + return; +} + + +static void __run_tag_parser(pkgmgr_parser_plugin_info_x *plugin_info, xmlDocPtr docPtr) +{ + int (*plugin_install) (xmlDocPtr, const char *); + int ret = -1; + char *ac = NULL; + + switch (plugin_info->action) { + case ACTION_INSTALL: + ac = "PKGMGR_PARSER_PLUGIN_INSTALL"; + break; + case ACTION_UPGRADE: + ac = "PKGMGR_PARSER_PLUGIN_UPGRADE"; + break; + case ACTION_UNINSTALL: + ac = "PKGMGR_PARSER_PLUGIN_UNINSTALL"; + break; + default: + goto END; + } + + if ((plugin_install = + dlsym(plugin_info->lib_handle, ac)) == NULL || dlerror() != NULL) { + _LOGE("can not find symbol[%s] \n", ac); + goto END; + } + + ret = plugin_install(docPtr, plugin_info->pkgid); + _LOGD("Plugin = %s, appid = %s, result=%d\n", plugin_info->name, plugin_info->pkgid, ret); + + __check_enabled_plugin(plugin_info); +END: + return; +} + +static int __run_tag_parser_prestep(pkgmgr_parser_plugin_info_x *plugin_info, xmlTextReaderPtr reader) +{ + const xmlChar *name; + + if (xmlTextReaderDepth(reader) != 1) { + _LOGE("Node depth is not 1"); + goto END; + } + + if (xmlTextReaderNodeType(reader) != 1) { + _LOGE("Node type is not 1"); + goto END; + } + + const xmlChar *value; + name = xmlTextReaderConstName(reader); + if (name == NULL) { + _LOGE("TEST TEST TES\n"); + name = BAD_CAST "--"; + } + + value = xmlTextReaderConstValue(reader); + if (value != NULL) { + if (xmlStrlen(value) > 40) { + _LOGD(" %.40s...", value); + } else { + _LOGD(" %s", value); + } + } + + name = xmlTextReaderConstName(reader); + if (name == NULL) { + _LOGE("TEST TEST TES\n"); + name = BAD_CAST "--"; + } + + xmlDocPtr docPtr = xmlTextReaderCurrentDoc(reader); + xmlDocPtr copyDocPtr = xmlCopyDoc(docPtr, 1); + if (copyDocPtr == NULL) + return -1; + xmlNode *rootElement = xmlDocGetRootElement(copyDocPtr); + if (rootElement == NULL) + return -1; + xmlNode *cur_node = xmlFirstElementChild(rootElement); + if (cur_node == NULL) + return -1; + xmlNode *temp = xmlTextReaderExpand(reader); + if (temp == NULL) + return -1; + xmlNode *next_node = NULL; + while(cur_node != NULL) { + if ( (strcmp(ASCII(temp->name), ASCII(cur_node->name)) == 0) && + (temp->line == cur_node->line) ) { + break; + } + else { + next_node = xmlNextElementSibling(cur_node); + xmlUnlinkNode(cur_node); + xmlFreeNode(cur_node); + cur_node = next_node; + } + } + if (cur_node == NULL) + return -1; + next_node = xmlNextElementSibling(cur_node); + if (next_node) { + cur_node->next = NULL; + next_node->prev = NULL; + xmlFreeNodeList(next_node); + xmlSetTreeDoc(cur_node, copyDocPtr); + } else { + xmlSetTreeDoc(cur_node, copyDocPtr); + } + + __run_tag_parser(plugin_info, copyDocPtr); + END: + + return 0; +} + +static void +__process_tag_xml(pkgmgr_parser_plugin_info_x *plugin_info, xmlTextReaderPtr reader) +{ + switch (xmlTextReaderNodeType(reader)) { + case XML_READER_TYPE_END_ELEMENT: + { + break; + } + case XML_READER_TYPE_ELEMENT: + { + // Elements without closing tag don't receive + const xmlChar *elementName = + xmlTextReaderLocalName(reader); + if (elementName == NULL) { + break; + } + + if (strcmp(plugin_info->name, ASCII(elementName)) == 0) { + __run_tag_parser_prestep(plugin_info, reader); + } + if(elementName != NULL){ + xmlFree((void*)elementName); + elementName = NULL; + } + break; + } + + default: + break; + } +} + +static void __process_tag_parser(pkgmgr_parser_plugin_info_x *plugin_info) +{ + xmlTextReaderPtr reader; + xmlDocPtr docPtr = NULL; + int ret = -1; + + if (access(plugin_info->filename, R_OK) != 0) { + __run_tag_parser(plugin_info, NULL); + } else { + docPtr = xmlReadFile(plugin_info->filename, NULL, 0); + reader = xmlReaderWalker(docPtr); + if (reader != NULL) { + ret = xmlTextReaderRead(reader); + while (ret == 1) { + __process_tag_xml(plugin_info, reader); + ret = xmlTextReaderRead(reader); + } + xmlFreeTextReader(reader); + + if (ret != 0) { + _LOGS("%s : failed to parse", plugin_info->filename); + } + } else { + _LOGS("%s : failed to read", plugin_info->filename); + } + } + + if(docPtr != NULL){ + xmlFreeDoc(docPtr); + docPtr = NULL; + } +} + +static void __process_category_parser(pkgmgr_parser_plugin_info_x *plugin_info) +{ + int tag_exist = 0; + char buffer[1024] = { 0, }; + category_x *category = NULL; + GList *category_list = NULL; + __category_t *category_detail = NULL; + + if (plugin_info->mfx == NULL) { + __run_category_parser(plugin_info, NULL, plugin_info->appid); + return; + } + + uiapplication_x *up = plugin_info->mfx->uiapplication; + while(up != NULL) + { + category = up->category; + while (category != NULL) + { + //get glist of category key and value combination + memset(buffer, 0x00, 1024); + snprintf(buffer, 1024, "%s/", plugin_info->name); + if ((category->name) && (strncmp(category->name, plugin_info->name, strlen(plugin_info->name)) == 0)) { + category_detail = (__category_t*) calloc(1, sizeof(__category_t)); + if (category_detail == NULL) { + _LOGD("Memory allocation failed\n"); + goto END; + } + + category_detail->name = (char*) calloc(1, sizeof(char)*(strlen(category->name)+2)); + if (category_detail->name == NULL) { + _LOGD("Memory allocation failed\n"); + FREE_AND_NULL(category_detail); + goto END; + } + snprintf(category_detail->name, (strlen(category->name)+1), "%s", category->name); + + category_list = g_list_append(category_list, (gpointer)category_detail); + tag_exist = 1; + } + category = category->next; + } + + //send glist to parser when tags for metadata plugin parser exist. + if (tag_exist) { + __run_category_parser(plugin_info, category_list, up->appid); + } + + __category_parser_clear_dir_list(category_list); + category_list = NULL; + tag_exist = 0; + up = up->next; + } +END: + if (category_list) + __category_parser_clear_dir_list(category_list); + + return; +} + +static void __process_metadata_parser(pkgmgr_parser_plugin_info_x *plugin_info) +{ + int tag_exist = 0; + char buffer[1024] = { 0, }; + metadata_x *md = NULL; + GList *md_list = NULL; + __metadata_t *md_detail = NULL; + + if (plugin_info->mfx == NULL) { + __run_metadata_parser(plugin_info, NULL, plugin_info->appid); + return; + } + + uiapplication_x *up = plugin_info->mfx->uiapplication; + while(up != NULL) + { + md = up->metadata; + while (md != NULL) + { + //get glist of metadata key and value combination + memset(buffer, 0x00, 1024); + snprintf(buffer, 1024, "%s/", plugin_info->name); + if ((md->key && md->value) && (strncmp(md->key, plugin_info->name, strlen(plugin_info->name)) == 0)) { + md_detail = (__metadata_t*) calloc(1, sizeof(__metadata_t)); + if (md_detail == NULL) { + _LOGD("Memory allocation failed\n"); + goto END; + } + + md_detail->key = (char*) calloc(1, sizeof(char)*(strlen(md->key)+2)); + if (md_detail->key == NULL) { + _LOGD("Memory allocation failed\n"); + FREE_AND_NULL(md_detail); + goto END; + } + snprintf(md_detail->key, (strlen(md->key)+1), "%s", md->key); + + md_detail->value = (char*) calloc(1, sizeof(char)*(strlen(md->value)+2)); + if (md_detail->value == NULL) { + _LOGD("Memory allocation failed\n"); + FREE_AND_NULL(md_detail->key); + FREE_AND_NULL(md_detail); + goto END; + } + snprintf(md_detail->value, (strlen(md->value)+1), "%s", md->value); + + md_list = g_list_append(md_list, (gpointer)md_detail); + tag_exist = 1; + } + md = md->next; + } + + //send glist to parser when tags for metadata plugin parser exist. + if (tag_exist) { + __run_metadata_parser(plugin_info, md_list, up->appid); + } + + __metadata_parser_clear_dir_list(md_list); + md_list = NULL; + tag_exist = 0; + up = up->next; + } + +END: + if(md_list) + __metadata_parser_clear_dir_list(md_list); + return; +} + +void __process_plugin_db(pkgmgr_parser_plugin_info_x *plugin_info) +{ + char *query = NULL; + char *error_message = NULL; + + query = sqlite3_mprintf("delete from package_plugin_info where pkgid LIKE %Q", plugin_info->pkgid); + if (SQLITE_OK == sqlite3_exec(pkgmgr_parser_db, query, NULL, NULL, &error_message)) { + _LOGS("pkgid [%s] plugin[0x%x] deleted", plugin_info->pkgid, plugin_info->enabled_plugin); + } + + sqlite3_free(query); + + if (plugin_info->action == ACTION_UNINSTALL) + return; + + query = sqlite3_mprintf("insert into package_plugin_info(pkgid,enabled_plugin) values (%Q,'%d')", plugin_info->pkgid, plugin_info->enabled_plugin); + if (SQLITE_OK != sqlite3_exec(pkgmgr_parser_db, query, NULL, NULL, &error_message)) { + _LOGE("Don't execute query = %s, error message = %s\n", query, error_message); + sqlite3_free(query); + return; + } + + sqlite3_free(query); + _LOGS("pkgid [%s] plugin[0x%x] inserted", plugin_info->pkgid, plugin_info->enabled_plugin); + + return; +} + +static void __process_each_plugin(pkgmgr_parser_plugin_info_x *plugin_info) +{ + int ret = 0; + + plugin_info->lib_handle = dlopen(plugin_info->path, RTLD_LAZY); + retm_if(plugin_info->lib_handle == NULL, "dlopen is failed lib_path"); + + ret = __parser_send_tag(plugin_info->lib_handle, plugin_info->action, PLUGIN_PRE_PROCESS, plugin_info->pkgid); + _LOGS("PLUGIN_PRE_PROCESS : [%s] result=[%d]\n", plugin_info->name, ret); + + if (strcmp(plugin_info->type,PKGMGR_PARSER_PLUGIN_TAG) == 0) { + __process_tag_parser(plugin_info); + } else if (strcmp(plugin_info->type,PKGMGR_PARSER_PLUGIN_METADATA) == 0) { + __process_metadata_parser(plugin_info); + } else if (strcmp(plugin_info->type,PKGMGR_PARSER_PLUGIN_CATEGORY) == 0) { + __process_category_parser(plugin_info); + } + + ret =__parser_send_tag(plugin_info->lib_handle, plugin_info->action, PLUGIN_POST_PROCESS, plugin_info->pkgid); + _LOGS("PLUGIN_POST_PROCESS : [%s] result=[%d]\n", plugin_info->name, ret); + + dlclose(plugin_info->lib_handle); +} + +void __process_all_plugins(pkgmgr_parser_plugin_info_x *plugin_info) +{ + int ret = 0; + FILE *fp = NULL; + char buf[PKG_STRING_LEN_MAX] = {0}; + + fp = fopen(PLLUGIN_LIST, "r"); + retm_if(fp == NULL, "Fail get : %s", PLLUGIN_LIST); + + while (fgets(buf, PKG_STRING_LEN_MAX, fp) != NULL) { + __str_trim(buf); + + ret = __get_plugin_info_x(buf, plugin_info); + if (ret < 0) + continue; + + __process_each_plugin(plugin_info); + + memset(buf, 0x00, PKG_STRING_LEN_MAX); + FREE_AND_NULL(plugin_info->type); + FREE_AND_NULL(plugin_info->name); + FREE_AND_NULL(plugin_info->flag); + FREE_AND_NULL(plugin_info->path); + } + + if (fp != NULL) + fclose(fp); + + return; +} + + +int _pkgmgr_parser_plugin_open_db() +{ + char *error_message = NULL; + int ret; + FILE * fp = NULL; + + fp = fopen(PKGMGR_PARSER_DB_FILE, "r"); + if (fp != NULL) { + fclose(fp); + ret = db_util_open(PKGMGR_PARSER_DB_FILE, &pkgmgr_parser_db, DB_UTIL_REGISTER_HOOK_METHOD); + if (ret != SQLITE_OK) { + _LOGE("package info DB initialization failed\n"); + return -1; + } + return 0; + } + + ret = db_util_open(PKGMGR_PARSER_DB_FILE, &pkgmgr_parser_db, DB_UTIL_REGISTER_HOOK_METHOD); + if (ret != SQLITE_OK) { + _LOGE("package info DB initialization failed\n"); + return -1; + } + + if (SQLITE_OK != sqlite3_exec(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_PLUGIN_INFO, NULL, NULL, &error_message)) { + _LOGE("Don't execute query = %s, error message = %s\n", QUERY_CREATE_TABLE_PACKAGE_PLUGIN_INFO, error_message); + return -1; + } + + _LOGE("db_initialize_done\n"); + return 0; +} + + +void _pkgmgr_parser_plugin_close_db() +{ + sqlite3_close(pkgmgr_parser_db); +} + +void _pkgmgr_parser_plugin_process_plugin(manifest_x *mfx, const char *filename, ACTION_TYPE action) +{ + int ret = 0; + + pkgmgr_parser_plugin_info_x *plugin_info = NULL; + + retm_if(mfx == NULL, "manifest pointer is NULL\n"); + retm_if(filename == NULL, "filename pointer is NULL\n"); + + /*initialize plugin_info_x*/ + plugin_info = malloc(sizeof(pkgmgr_parser_plugin_info_x)); + retm_if(plugin_info == NULL, "malloc fail"); + + memset(plugin_info, '\0', sizeof(pkgmgr_parser_plugin_info_x)); + + /*initialize pkgmgr_paser db*/ + ret = _pkgmgr_parser_plugin_open_db(); + if (ret < 0) + _LOGE("_pkgmgr_parser_plugin_open_db failed\n"); + + /*save plugin_info_x*/ + plugin_info->mfx = mfx; + plugin_info->pkgid = strdup(mfx->package); + plugin_info->filename = strdup(filename); + plugin_info->action = action; + + /*get plugin list from list-file, and process each plugin*/ + __process_all_plugins(plugin_info); + + /*update finished info to pkgmgr_parser db*/ + __process_plugin_db(plugin_info); + + /*close pkgmgr_paser db*/ + _pkgmgr_parser_plugin_close_db(); + + /*clean plugin_info_x*/ + __clean_plugin_info(plugin_info); +} + +void _pkgmgr_parser_plugin_uninstall_plugin(const char *plugin_type, const char *pkgid, const char *appid) +{ + int ret = 0; + FILE *fp = NULL; + char buf[PKG_STRING_LEN_MAX] = {0}; + + int plugin_flag = 0; + int enabled_plugin = 0; + pkgmgr_parser_plugin_info_x *plugin_info = NULL; + + retm_if(plugin_type == NULL, "plugin_type is null"); + retm_if(pkgid == NULL, "pkgid is null"); + retm_if(appid == NULL, "appid is null"); + + /*initialize plugin_info_x*/ + plugin_info = malloc(sizeof(pkgmgr_parser_plugin_info_x)); + retm_if(plugin_info == NULL, "malloc fail"); + + memset(plugin_info, '\0', sizeof(pkgmgr_parser_plugin_info_x)); + + /*save plugin_info_x*/ + enabled_plugin = __ps_get_enabled_plugin(pkgid); + plugin_info->pkgid = strdup(pkgid); + plugin_info->appid = strdup(appid); + plugin_info->action = ACTION_UNINSTALL; + + /*get plugin list from list-file*/ + fp = fopen(PLLUGIN_LIST, "r"); + + if (fp == NULL) { + _LOGE("Fail get : %s", PLLUGIN_LIST); + __clean_plugin_info(plugin_info); + return; + } + + while (fgets(buf, PKG_STRING_LEN_MAX, fp) != NULL) { + __str_trim(buf); + + ret = __get_plugin_info_x(buf, plugin_info); + if (ret < 0) + continue; + + /*process uninstallation for given plugin type*/ + if (strcmp(plugin_info->type, plugin_type) == 0) { + + plugin_flag = (int)strtol(plugin_info->flag, NULL, 16); + + /*if there is a plugin that is saved in db, it need to uninstall*/ + if (enabled_plugin & plugin_flag) { + __process_each_plugin(plugin_info); + } + } + + memset(buf, 0x00, PKG_STRING_LEN_MAX); + FREE_AND_NULL(plugin_info->type); + FREE_AND_NULL(plugin_info->name); + FREE_AND_NULL(plugin_info->flag); + FREE_AND_NULL(plugin_info->path); + } + + if (fp != NULL) + fclose(fp); + + /*clean plugin_info_x*/ + __clean_plugin_info(plugin_info); + + return; +} + diff --git a/parser/pkgmgr_parser_plugin.h b/parser/pkgmgr_parser_plugin.h new file mode 100644 index 0000000..360b7a2 --- /dev/null +++ b/parser/pkgmgr_parser_plugin.h @@ -0,0 +1,53 @@ +/* + * pkgmgr-info + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#ifndef __PKGMGR_PARSER_PLUGIN_H_ +#define __PKGMGR_PARSER_PLUGIN_H_ + +#include "pkgmgr_parser.h" + +#ifdef __cplusplus + extern "C" { +#endif /* __cplusplus */ + +typedef void* pkgmgr_parser_plugin_h; + +/* plugin process_type */ +typedef enum { + PLUGIN_PRE_PROCESS = 0, + PLUGIN_POST_PROCESS +} PLUGIN_PROCESS_TYPE; + +#define PKGMGR_PARSER_PLUGIN_TAG "tag" +#define PKGMGR_PARSER_PLUGIN_METADATA "metadata" +#define PKGMGR_PARSER_PLUGIN_CATEGORY "category" + +int __ps_run_parser(xmlDocPtr docPtr, const char *tag, ACTION_TYPE action, const char *pkgid); + +int _pkgmgr_parser_plugin_open_db(); +void _pkgmgr_parser_plugin_close_db(); +void _pkgmgr_parser_plugin_process_plugin(manifest_x *mfx, const char *filename, ACTION_TYPE action); +void _pkgmgr_parser_plugin_uninstall_plugin(const char *plugin_type, const char *pkgid, const char *appid); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif /* __PKGMGR_PARSER_PLUGIN_H_ */ diff --git a/parser/pkgmgr_parser_plugin_list.txt.in b/parser/pkgmgr_parser_plugin_list.txt.in new file mode 100644 index 0000000..fc7bdba --- /dev/null +++ b/parser/pkgmgr_parser_plugin_list.txt.in @@ -0,0 +1,22 @@ +# usage +# flag : bit flag value for index, flag overlapping is forbidden +# type : type of plugin parser, three types of plugin are supported "tag, metadata, category" +# name : name of attribute on xml, +# path : directory path for plugin library + +flag="0x00000001":type="tag":name="shortcut-list":path="/usr/etc/package-manager/parserlib/libshortcut-list.so" +flag="0x00000002":type="tag":name="widget":path="/usr/etc/package-manager/parserlib/libwidget.so" +flag="0x00000004":type="tag":name="account":path="/usr/etc/package-manager/parserlib/libaccount.so" +flag="0x00000008":type="tag":name="notifications":path="/usr/etc/package-manager/parserlib/libnotifications.so" +flag="0x00000010":type="tag":name="privileges":path="/usr/etc/package-manager/parserlib/libprivileges.so" +flag="0x00000020":type="tag":name="ime":path="/usr/etc/package-manager/parserlib/libime.so" +flag="0x00000040":type="category":name="http://tizen.org/category/downloadable_font":path="/usr/etc/package-manager/parserlib/category/libdownloadable_font.so" +flag="0x00000080":type="metadata":name="http://developer.samsung.com/tizen/metadata/sticker":path="/usr/etc/package-manager/parserlib/metadata/libsticker.so" +flag="0x00000100":type="metadata":name="http://developer.samsung.com/tizen/metadata/ttsengine":path="/usr/etc/package-manager/parserlib/metadata/libttsengine.so" +flag="0x00000200":type="metadata":name="http://developer.samsung.com/tizen/metadata/downloadable_filters":path="/usr/etc/package-manager/parserlib/metadata/libdownloadable_filters.so" +flag="0x00000400":type="metadata":name="http://developer.samsung.com/tizen/metadata/dictionary":path="/usr/etc/package-manager/parserlib/metadata/libdictionary.so" +flag="0x00000800":type="category":name="http://tizen.org/category/antivirus":path="/usr/etc/package-manager/parserlib/category/libantivirus.so" +flag="0x00001000":type="metadata":name="http://developer.samsung.com/tizen/metadata/profile":path="/usr/etc/package-manager/parserlib/metadata/libtheme.so" +flag="0x00002000":type="category":name="http://tizen.org/category/tts":path="/usr/etc/package-manager/parserlib/category/libsamsung_tts.so" +flag="0x00004000":type="tag":name="livebox":path="/usr/etc/package-manager/parserlib/liblivebox.so" +flag="0x00010000":type="tag":name="watch-application":path="/usr/etc/package-manager/parserlib/libwatch-application.so" diff --git a/parser/xml.xsd.in b/parser/xml.xsd.in new file mode 100755 index 0000000..855c21c --- /dev/null +++ b/parser/xml.xsd.in @@ -0,0 +1,5 @@ + + + + + diff --git a/parser_path.conf.in b/parser_path.conf.in new file mode 100755 index 0000000..0b946ca --- /dev/null +++ b/parser_path.conf.in @@ -0,0 +1,6 @@ +# usage +# parserlib:directory_path + +parserlib:/usr/etc/package-manager/parserlib/ +metadataparser:/usr/etc/package-manager/parserlib/metadata/ +categoryparser:/usr/etc/package-manager/parserlib/category/ diff --git a/pkgmgr-info.manifest.in b/pkgmgr-info.manifest.in new file mode 100644 index 0000000..5d27c3c --- /dev/null +++ b/pkgmgr-info.manifest.in @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/pkgmgr-info.pc.in b/pkgmgr-info.pc.in new file mode 100755 index 0000000..6a40cfd --- /dev/null +++ b/pkgmgr-info.pc.in @@ -0,0 +1,12 @@ +# Package Information for pkg-config + +prefix=/usr +exec_prefix=${prefix} +libdir=@LIB_INSTALL_DIR@ +includedir=${prefix}/include + +Name: pkgmgr-info +Description: Simple string key/val dictionary library +Version: @VERSION@ +Libs: -L${libdir} -lpkgmgr-info +Cflags: -I${includedir} diff --git a/pkgmgr-parser.manifest.in b/pkgmgr-parser.manifest.in new file mode 100755 index 0000000..dcf391c --- /dev/null +++ b/pkgmgr-parser.manifest.in @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/pkgmgrinfo_appinfo.c b/src/pkgmgrinfo_appinfo.c new file mode 100755 index 0000000..38078d2 --- /dev/null +++ b/src/pkgmgrinfo_appinfo.c @@ -0,0 +1,3452 @@ +/* + * pkgmgrinfo-appinfo + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Junsuk Oh , + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "pkgmgrinfo_private.h" +#include "pkgmgr_parser.h" + +#ifdef LOG_TAG +#undef LOG_TAG +#endif +#define LOG_TAG "PKGMGR_INFO" + +#define LANGUAGE_LENGTH 2 +#define MAX_PACKAGE_STR_SIZE 512 + +#define SAT_UI_APPID_1 "org.tizen.sat-ui" +#define SAT_UI_APPID_2 "org.tizen.sat-ui-2" +#define PKG_DATA_PATH "/opt/usr/data/pkgmgr" + + +#define FILTER_QUERY_COUNT_APP "select DISTINCT package_app_info.app_id, package_app_info.app_component, package_app_info.app_installed_storage " \ + "from package_app_info LEFT OUTER JOIN package_app_localized_info " \ + "ON package_app_info.app_id=package_app_localized_info.app_id " \ + "and package_app_localized_info.app_locale='%s' " \ + "LEFT OUTER JOIN package_app_app_svc " \ + "ON package_app_info.app_id=package_app_app_svc.app_id " \ + "LEFT OUTER JOIN package_app_app_category " \ + "ON package_app_info.app_id=package_app_app_category.app_id where " + +#define FILTER_QUERY_LIST_APP "select DISTINCT package_app_info.*, package_app_localized_info.app_locale, package_app_localized_info.app_label, package_app_localized_info.app_icon " \ + "from package_app_info LEFT OUTER JOIN package_app_localized_info " \ + "ON package_app_info.app_id=package_app_localized_info.app_id " \ + "and package_app_localized_info.app_locale IN ('%s', '%s') " \ + "LEFT OUTER JOIN package_app_app_svc " \ + "ON package_app_info.app_id=package_app_app_svc.app_id " \ + "LEFT OUTER JOIN package_app_app_category " \ + "ON package_app_info.app_id=package_app_app_category.app_id where " + +#define METADATA_FILTER_QUERY_SELECT_CLAUSE "select DISTINCT package_app_info.* " \ + "from package_app_info LEFT OUTER JOIN package_app_app_metadata " \ + "ON package_app_info.app_id=package_app_app_metadata.app_id where " + +#define METADATA_FILTER_QUERY_UNION_CLAUSE " UNION "METADATA_FILTER_QUERY_SELECT_CLAUSE + +typedef struct _pkgmgr_locale_x { + char *locale; +} pkgmgr_locale_x; + +typedef struct _pkgmgrinfo_appcontrol_x { + int operation_count; + int uri_count; + int mime_count; + int subapp_count; + char **operation; + char **uri; + char **mime; + char **subapp; +} pkgmgrinfo_appcontrol_x; + +static char* __get_aliasid_from_db(sqlite3 *appinfo_db, const char *appid) +{ + int ret = PMINFO_R_OK; + char *alias_id = NULL; + char *query = NULL; + sqlite3_stmt *stmt = NULL; + + query = sqlite3_mprintf("select alias_id from package_app_aliasid where app_id=%Q", appid); + tryvm_if(query == NULL, ret = PMINFO_R_ERROR,"Malloc failed!!"); + + /*Prepare query*/ + ret = sqlite3_prepare_v2(appinfo_db, query, strlen(query), &stmt, NULL); + tryvm_if(ret != PMINFO_R_OK, ret = PMINFO_R_ERROR, "sqlite3_prepare_v2 failed[%s]\n", query); + + alias_id = (char*)malloc(MAX_PACKAGE_STR_SIZE); + tryvm_if(alias_id == NULL, ret = PMINFO_R_ERROR,"Malloc failed!!"); + memset(alias_id,'\0',MAX_PACKAGE_STR_SIZE); + + /*Step query*/ + ret = sqlite3_step(stmt); + if(ret == SQLITE_ROW){ + /*Get the alias id*/ + snprintf(alias_id, MAX_PACKAGE_STR_SIZE, "%s", (const char *)sqlite3_column_text(stmt, 0)); + _LOGD("alias id [%s] id found for [%s] in DB",alias_id,appid); + } + +catch: + if (query) + sqlite3_free(query); + if (stmt) + sqlite3_finalize(stmt); + + /*If alias id is not found then set the appid as alias id*/ + if ( alias_id == NULL || strlen(alias_id) == 0 ) { + FREE_AND_NULL(alias_id); + alias_id = strdup(appid); + } + + return alias_id; + +} + +static void __get_appinfo_from_db(char *colname, char *coltxt, uiapplication_x *uiapp) +{ + if (colname == NULL || uiapp == NULL) + return; + + if (strcmp(colname, "app_id") == 0) { + if (uiapp->appid) + return; + + if (coltxt) + uiapp->appid = strdup(coltxt); + + } else if (strcmp(colname, "app_component") == 0) { + if (coltxt) + uiapp->app_component = strdup(coltxt); + else + uiapp->app_component = NULL; + } else if (strcmp(colname, "app_exec") == 0) { + if (coltxt) + uiapp->exec = strdup(coltxt); + else + uiapp->exec = NULL; + } else if (strcmp(colname, "app_ambient_support") == 0) { + if (coltxt) + uiapp->ambient_support = strdup(coltxt); + else + uiapp->ambient_support = NULL; + } else if (strcmp(colname, "app_nodisplay") == 0) { + if (coltxt) + uiapp->nodisplay = strdup(coltxt); + else + uiapp->nodisplay = NULL; + } else if (strcmp(colname, "app_type") == 0 ) { + if (coltxt) + uiapp->type = strdup(coltxt); + else + uiapp->type = NULL; + } else if (strcmp(colname, "app_onboot") == 0 ) { + if (coltxt) + uiapp->onboot= strdup(coltxt); + else + uiapp->onboot = NULL; + } else if (strcmp(colname, "app_multiple") == 0 ) { + if (coltxt) + uiapp->multiple = strdup(coltxt); + else + uiapp->multiple = NULL; + } else if (strcmp(colname, "app_autorestart") == 0 ) { + if (coltxt) + uiapp->autorestart= strdup(coltxt); + else + uiapp->autorestart = NULL; + } else if (strcmp(colname, "app_taskmanage") == 0 ) { + if (coltxt) + uiapp->taskmanage = strdup(coltxt); + else + uiapp->taskmanage = NULL; + } else if (strcmp(colname, "app_enabled") == 0 ) { + if (coltxt) + uiapp->enabled= strdup(coltxt); + else + uiapp->enabled = NULL; + } else if (strcmp(colname, "app_hwacceleration") == 0 ) { + if (coltxt) + uiapp->hwacceleration = strdup(coltxt); + else + uiapp->hwacceleration = NULL; + } else if (strcmp(colname, "app_screenreader") == 0 ) { + if (coltxt) + uiapp->screenreader = strdup(coltxt); + else + uiapp->screenreader = NULL; + } else if (strcmp(colname, "app_mainapp") == 0 ) { + if (coltxt) + uiapp->mainapp = strdup(coltxt); + else + uiapp->mainapp = NULL; + } else if (strcmp(colname, "app_recentimage") == 0 ) { + if (coltxt) + uiapp->recentimage = strdup(coltxt); + else + uiapp->recentimage = NULL; + } else if (strcmp(colname, "app_launchcondition") == 0 ) { + if (coltxt) + uiapp->launchcondition = strdup(coltxt); + else + uiapp->launchcondition = NULL; + } else if (strcmp(colname, "app_indicatordisplay") == 0){ + if (coltxt) + uiapp->indicatordisplay = strdup(coltxt); + else + uiapp->indicatordisplay = NULL; + } else if (strcmp(colname, "app_portraitimg") == 0){ + if (coltxt) + uiapp->portraitimg = strdup(coltxt); + else + uiapp->portraitimg = NULL; + } else if (strcmp(colname, "app_landscapeimg") == 0){ + if (coltxt) + uiapp->landscapeimg = strdup(coltxt); + else + uiapp->landscapeimg = NULL; + } else if (strcmp(colname, "app_effectimage_type") == 0){ + if (coltxt) + uiapp->effectimage_type = strdup(coltxt); + else + uiapp->effectimage_type = NULL; + } else if (strcmp(colname, "app_guestmodevisibility") == 0){ + if (coltxt) + uiapp->guestmode_visibility = strdup(coltxt); + else + uiapp->guestmode_visibility = NULL; + } else if (strcmp(colname, "app_permissiontype") == 0 ) { + if (coltxt) + uiapp->permission_type = strdup(coltxt); + else + uiapp->permission_type = NULL; + } else if (strcmp(colname, "app_preload") == 0 ) { + if (coltxt) + uiapp->preload = strdup(coltxt); + else + uiapp->preload = NULL; + } else if (strcmp(colname, "app_submode") == 0 ) { + if (coltxt) + uiapp->submode = strdup(coltxt); + else + uiapp->submode = NULL; + } else if (strcmp(colname, "app_submode_mainid") == 0 ) { + if (coltxt) + uiapp->submode_mainid = strdup(coltxt); + else + uiapp->submode_mainid = NULL; + } else if (strcmp(colname, "app_installed_storage") == 0 ) { + if (coltxt) + uiapp->installed_storage = strdup(coltxt); + else + uiapp->installed_storage = NULL; + } else if (strcmp(colname, "app_process_pool") == 0 ) { + if (coltxt) + uiapp->process_pool = strdup(coltxt); + else + uiapp->process_pool = NULL; + } else if (strcmp(colname, "app_multi_instance") == 0 ) { + if (coltxt) + uiapp->multi_instance = strdup(coltxt); + else + uiapp->multi_instance = NULL; + } else if (strcmp(colname, "app_multi_instance_mainid") == 0 ) { + if (coltxt) + uiapp->multi_instance_mainid = strdup(coltxt); + else + uiapp->multi_instance_mainid = NULL; + } else if (strcmp(colname, "app_multi_window") == 0 ) { + if (coltxt) + uiapp->multi_window = strdup(coltxt); + else + uiapp->multi_window = NULL; + } else if (strcmp(colname, "app_support_disable") == 0 ) { + if (coltxt) + uiapp->support_disable= strdup(coltxt); + else + uiapp->support_disable = NULL; + } else if (strcmp(colname, "app_ui_gadget") == 0 ) { + if (coltxt) + uiapp->ui_gadget = strdup(coltxt); + else + uiapp->ui_gadget = NULL; + } else if (strcmp(colname, "app_removable") == 0 ) { + if (coltxt) + uiapp->removable = strdup(coltxt); + else + uiapp->removable = NULL; + } else if (strcmp(colname, "app_support_mode") == 0 ) { + if (coltxt) + uiapp->support_mode = strdup(coltxt); + else + uiapp->support_mode = NULL; + } else if (strcmp(colname, "app_support_feature") == 0 ) { + if (coltxt) + uiapp->support_feature = strdup(coltxt); + else + uiapp->support_feature = NULL; + } else if (strcmp(colname, "component_type") == 0 ) { + if (coltxt) + uiapp->component_type = strdup(coltxt); + else + uiapp->component_type = NULL; + } else if (strcmp(colname, "package") == 0 ) { + if (coltxt) + uiapp->package = strdup(coltxt); + else + uiapp->package = NULL; + } else if (strcmp(colname, "app_package_type") == 0 ) { + if (coltxt) + uiapp->package_type = strdup(coltxt); + else + uiapp->package_type = NULL; + } else if (strcmp(colname, "app_package_system") == 0 ) { + if (coltxt) + uiapp->package_system = strdup(coltxt); + else + uiapp->package_system = NULL; + } else if (strcmp(colname, "app_package_installed_time") == 0 ) { + if (coltxt) + uiapp->package_installed_time = strdup(coltxt); + else + uiapp->package_installed_time = NULL; + + /*end of package_app_info table*/ + + } else if (strcmp(colname, "app_locale") == 0 ) { + if (coltxt) { + uiapp->icon->lang = strdup(coltxt); + uiapp->label->lang = strdup(coltxt); + } + else { + uiapp->icon->lang = NULL; + uiapp->label->lang = NULL; + } + } else if (strcmp(colname, "app_label") == 0 ) { + if (coltxt) + uiapp->label->text = strdup(coltxt); + else + uiapp->label->text = NULL; + } else if (strcmp(colname, "app_icon") == 0) { + if (coltxt) + uiapp->icon->text = strdup(coltxt); + else + uiapp->icon->text = NULL; + /*end of package_app_localized_info table*/ + + } else if (strcmp(colname, "category") == 0 ) { + if (coltxt) + uiapp->category->name = strdup(coltxt); + else + uiapp->category->name = NULL; + /*end of package_app_category_info table*/ + + } else if (strcmp(colname, "md_key") == 0 ) { + if (coltxt) + uiapp->metadata->key = strdup(coltxt); + else + uiapp->metadata->key = NULL; + } else if (strcmp(colname, "md_value") == 0 ) { + if (coltxt) + uiapp->metadata->value = strdup(coltxt); + else + uiapp->metadata->value = NULL; + /*end of package_app_metadata_info table*/ + + } else if (strcmp(colname, "pm_type") == 0 ) { + if (coltxt) + uiapp->permission->type= strdup(coltxt); + else + uiapp->permission->type = NULL; + } else if (strcmp(colname, "pm_value") == 0 ) { + if (coltxt) + uiapp->permission->value = strdup(coltxt); + else + uiapp->permission->value = NULL; + /*end of package_app_permission_info table*/ + + } else if (strcmp(colname, "app_image") == 0) { + if (coltxt) + uiapp->image->text= strdup(coltxt); + else + uiapp->image->text = NULL; + } else if (strcmp(colname, "app_image_section") == 0) { + if (coltxt) + uiapp->image->section= strdup(coltxt); + else + uiapp->image->section = NULL; + /*end of package_app_image_info table*/ + } +} + +static void __update_localed_label_for_list(sqlite3_stmt *stmt, pkgmgr_pkginfo_x *info) +{ + int i = 0; + int ncols = 0; + char *colname = NULL; + char *coltxt = NULL; + +// uiapplication_x *ptr1 = NULL; + +// LISTHEAD(info->manifest_info->uiapplication, ptr1); + + ncols = sqlite3_column_count(stmt); + + for(i = 0; i < ncols; i++) + { + colname = (char *)sqlite3_column_name(stmt, i); + if (colname && strcmp(colname, "app_label") == 0 ){ + coltxt = (char *)sqlite3_column_text(stmt, i); + FREE_AND_STRDUP(coltxt, info->manifest_info->uiapplication->label->text); + } + } +} + +/* get the first locale value*/ +static int __fallback_locale_cb(void *data, int ncols, char **coltxt, char **colname) +{ + pkgmgr_locale_x *info = (pkgmgr_locale_x *)data; + + if (ncols >= 1) + info->locale = strdup(coltxt[0]); + else + info->locale = NULL; + + return 0; +} + +int __appinfo_cb(void *data, int ncols, char **coltxt, char **colname) +{ + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)data; + int i = 0; + icon_x *icon = NULL; + label_x *label = NULL; + category_x *category = NULL; + metadata_x *metadata = NULL; + permission_x *permission = NULL; + image_x *image = NULL; + + icon = calloc(1, sizeof(icon_x)); + retvm_if(icon == NULL, PMINFO_R_ERROR, "out of memory"); + LISTADD(info->uiapp_info->icon, icon); + label = calloc(1, sizeof(label_x)); + retvm_if(label == NULL, PMINFO_R_ERROR, "out of memory"); + LISTADD(info->uiapp_info->label, label); + category = calloc(1, sizeof(category_x)); + retvm_if(category == NULL, PMINFO_R_ERROR, "out of memory"); + LISTADD(info->uiapp_info->category, category); + metadata = calloc(1, sizeof(metadata_x)); + retvm_if(metadata == NULL, PMINFO_R_ERROR, "out of memory"); + LISTADD(info->uiapp_info->metadata, metadata); + permission = calloc(1, sizeof(permission_x)); + retvm_if(permission == NULL, PMINFO_R_ERROR, "out of memory"); + LISTADD(info->uiapp_info->permission, permission); + image = calloc(1, sizeof(image_x)); + retvm_if(image == NULL, PMINFO_R_ERROR, "out of memory"); + LISTADD(info->uiapp_info->image, image); + + for(i = 0; i < ncols; i++) + { + __get_appinfo_from_db(colname[i], coltxt[i], info->uiapp_info); + } + return 0; +} + +int __uiapp_list_cb(void *data, int ncols, char **coltxt, char **colname) +{ + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)data; + int i = 0; + uiapplication_x *uiapp = NULL; + icon_x *icon = NULL; + label_x *label = NULL; + + uiapp = calloc(1, sizeof(uiapplication_x)); + retvm_if(uiapp == NULL, PMINFO_R_ERROR, "out of memory"); + LISTADD(info->manifest_info->uiapplication, uiapp); + icon = calloc(1, sizeof(icon_x)); + retvm_if(icon == NULL, PMINFO_R_ERROR, "out of memory"); + LISTADD(info->manifest_info->uiapplication->icon, icon); + label = calloc(1, sizeof(label_x)); + retvm_if(label == NULL, PMINFO_R_ERROR, "out of memory"); + LISTADD(info->manifest_info->uiapplication->label, label); + + for(i = 0; i < ncols; i++) + { + __get_appinfo_from_db(colname[i], coltxt[i], info->manifest_info->uiapplication); + } + return 0; +} + +static void __get_appinfo_for_list(sqlite3_stmt *stmt, pkgmgr_pkginfo_x *udata) +{ + int i = 0; + int ncols = 0; + char *colname = NULL; + char *coltxt = NULL; + + uiapplication_x *uiapp = NULL; + + uiapp = calloc(1, sizeof(uiapplication_x)); + retvm_if(uiapp == NULL, PMINFO_R_ERROR, "out of memory"); + uiapp->icon= calloc(1, sizeof(icon_x)); + uiapp->label= calloc(1, sizeof(label_x)); + + LISTADD(udata->manifest_info->uiapplication, uiapp); + + ncols = sqlite3_column_count(stmt); + + for(i = 0; i < ncols; i++) + { + colname = (char *)sqlite3_column_name(stmt, i); + coltxt = (char *)sqlite3_column_text(stmt, i); + +// _LOGE("field value :: %s = %s \n", colname, coltxt); + __get_appinfo_from_db(colname, coltxt, udata->manifest_info->uiapplication); + } +} + +static int __check_app_locale_from_app_localized_info_by_exact(sqlite3 *db, const char *appid, const char *locale) +{ + int result_query = -1; + int ret = 0; + + char *query = sqlite3_mprintf("select exists(select app_locale from package_app_localized_info where app_id=%Q and app_locale=%Q)", appid, locale); + ret = __exec_db_query(db, query, _pkgmgrinfo_validate_cb, (void *)&result_query); + sqlite3_free(query); + retvm_if(ret == -1, PMINFO_R_ERROR, "Exec DB query failed"); + return result_query; +} + +static int __check_app_locale_from_app_localized_info_by_fallback(sqlite3 *db, const char *appid, const char *locale) +{ + int result_query = -1; + int ret = 0; + char wildcard[2] = {'%','\0'}; + char lang[3] = {'\0'}; + strncpy(lang, locale, LANGUAGE_LENGTH); + + char *query = sqlite3_mprintf("select exists(select app_locale from package_app_localized_info where app_id=%Q and app_locale like %Q%Q)", appid, lang, wildcard); + ret = __exec_db_query(db, query, _pkgmgrinfo_validate_cb, (void *)&result_query); + sqlite3_free(query); + retvm_if(ret == -1, PMINFO_R_ERROR, "Exec DB query failed"); + return result_query; +} + +static char* __get_app_locale_from_app_localized_info_by_fallback(sqlite3 *db, const char *appid, const char *locale) +{ + int ret = 0; + char wildcard[2] = {'%','\0'}; + char lang[3] = {'\0'}; + char *locale_new = NULL; + pkgmgr_locale_x *info = NULL; + + info = (pkgmgr_locale_x *)malloc(sizeof(pkgmgr_locale_x)); + if (info == NULL) { + _LOGE("Out of Memory!!!\n"); + return NULL; + } + memset(info, '\0', sizeof(*info)); + + strncpy(lang, locale, LANGUAGE_LENGTH); + char *query = sqlite3_mprintf("select app_locale from package_app_localized_info where app_id=%Q and app_locale like %Q%Q", appid, lang, wildcard); + + ret = __exec_db_query(db, query, __fallback_locale_cb, (void *)info); + sqlite3_free(query); + if (ret < 0) + goto catch; + + locale_new = info->locale; + FREE_AND_NULL(info); + return locale_new; +catch: + FREE_AND_NULL(info); + return NULL; +} + +char* __get_app_locale_by_fallback(sqlite3 *db, const char *appid) +{ + assert(appid); + + char *locale = NULL; + char *locale_new = NULL; + int check_result = 0; + + locale = __convert_system_locale_to_manifest_locale(); + + /*check exact matching */ + check_result = __check_app_locale_from_app_localized_info_by_exact(db, appid, locale); + + /* Exact found */ + if (check_result == 1) { +// _LOGD("%s find exact locale(%s)\n", appid, locale); + return locale; + } + + /* fallback matching */ + check_result = __check_app_locale_from_app_localized_info_by_fallback(db, appid, locale); + if(check_result == 1) { + locale_new = __get_app_locale_from_app_localized_info_by_fallback(db, appid, locale); + FREE_AND_NULL(locale); + if (locale_new == NULL) + locale_new = strdup(DEFAULT_LOCALE); + return locale_new; + } + + /* default locale */ + FREE_AND_NULL(locale); + return strdup(DEFAULT_LOCALE); +} + +static void __get_metadata_filter_condition(gpointer data, char **condition) +{ + pkgmgrinfo_node_x *node = (pkgmgrinfo_node_x*)data; + char key[MAX_QUERY_LEN] = {'\0'}; + char value[MAX_QUERY_LEN] = {'\0'}; + if (node->key) { + snprintf(key, MAX_QUERY_LEN, "(package_app_app_metadata.md_key='%s'", node->key); + } + if (node->value) { + snprintf(value, MAX_QUERY_LEN, " AND package_app_app_metadata.md_value='%s')", node->value); + strcat(key, value); + } else { + strcat(key, ")"); + } + *condition = strdup(key); + return; +} + +static int __sat_ui_is_enabled(const char *appid, bool *enabled) +{ + retvm_if(appid == NULL, PMINFO_R_EINVAL, "appid is NULL"); + retvm_if(enabled == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + + if ((strncmp(appid, SAT_UI_APPID_1, strlen(SAT_UI_APPID_1)) == 0) || (strncmp(appid, SAT_UI_APPID_2, strlen(SAT_UI_APPID_2)) == 0)) { + char info_file[MAX_PACKAGE_STR_SIZE] = {'\0', }; + + snprintf(info_file, MAX_PACKAGE_STR_SIZE, "%s/%s", PKG_DATA_PATH, appid); + if (access(info_file, F_OK)==0) { + *enabled = 1; + } else { + *enabled = 0; + } + return PMINFO_R_OK; + } + return PMINFO_R_EINVAL; +} + +static int __sat_ui_get_label(pkgmgrinfo_appinfo_h handle, char **label) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(label == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + retvm_if(info->uiapp_info->appid == NULL, PMINFO_R_EINVAL, "appid is NULL"); + + if ((strncmp((char *)info->uiapp_info->appid, SAT_UI_APPID_1, strlen(SAT_UI_APPID_1)) == 0) || (strncmp((char *)info->uiapp_info->appid, SAT_UI_APPID_2, strlen(SAT_UI_APPID_2)) == 0)) { + char info_file[MAX_PACKAGE_STR_SIZE] = {'\0', }; + + snprintf(info_file, MAX_PACKAGE_STR_SIZE, "%s/%s", PKG_DATA_PATH, (char *)info->uiapp_info->appid); + if (access(info_file, F_OK)==0) { + FILE *fp; + char buf[MAX_PACKAGE_STR_SIZE] = {0}; + + fp = fopen(info_file, "r"); + if (fp == NULL){ + _LOGE("fopen[%s] fail\n", info_file); + return PMINFO_R_ERROR; + } + + fgets(buf, MAX_PACKAGE_STR_SIZE, fp); + if (buf[0] == '\0') { + _LOGE("[%s] use db info\n", (char *)info->uiapp_info->appid); + fclose(fp); + return PMINFO_R_ERROR; + } + + FREE_AND_STRDUP(buf, info->uiapp_info->satui_label); + *label = info->uiapp_info->satui_label; + + fclose(fp); + return PMINFO_R_OK; + } + } + return PMINFO_R_ERROR; +} + +API int pkgmgrinfo_appinfo_get_list(pkgmgrinfo_pkginfo_h handle, pkgmgrinfo_app_component component, + pkgmgrinfo_app_list_cb app_func, void *user_data) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL"); + retvm_if(app_func == NULL, PMINFO_R_EINVAL, "callback pointer is NULL"); + retvm_if((component != PMINFO_UI_APP) && (component != PMINFO_SVC_APP) && (component != PMINFO_ALL_APP), PMINFO_R_EINVAL, "Invalid App Component Type"); + retvm_if(component == PMINFO_SVC_APP, PMINFO_R_OK, "PMINFO_SVC_APP is done" ); + + char *locale = NULL; + int ret = -1; + char query[MAX_QUERY_LEN] = {'\0'}; + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + pkgmgr_pkginfo_x *allinfo = NULL; + pkgmgr_appinfo_x *appinfo = NULL; + icon_x *ptr1 = NULL; + label_x *ptr2 = NULL; + category_x *ptr3 = NULL; + metadata_x *ptr4 = NULL; + permission_x *ptr5 = NULL; + image_x *ptr6 = NULL; + sqlite3 *appinfo_db = NULL; + + /*check installed storage*/ + ret = __pkginfo_check_installed_storage(info); + retvm_if(ret < 0, PMINFO_R_EINVAL, "[%s] is installed external, but is not in mmc", info->manifest_info->package); + + /*get system locale*/ + locale = __convert_system_locale_to_manifest_locale(); + tryvm_if(locale == NULL, ret = PMINFO_R_EINVAL, "manifest locale is NULL"); + + /*calloc allinfo*/ + allinfo = (pkgmgr_pkginfo_x *)calloc(1, sizeof(pkgmgr_pkginfo_x)); + tryvm_if(allinfo == NULL, ret = PMINFO_R_ERROR, "Failed to allocate memory for appinfo"); + + /*calloc manifest_info*/ + allinfo->manifest_info = (manifest_x *)calloc(1, sizeof(manifest_x)); + tryvm_if(allinfo->manifest_info == NULL, ret = PMINFO_R_ERROR, "Out of Memory!!!"); + + /*calloc appinfo*/ + appinfo = (pkgmgr_appinfo_x *)calloc(1, sizeof(pkgmgr_appinfo_x)); + tryvm_if(appinfo == NULL, ret = PMINFO_R_ERROR, "Failed to allocate memory for appinfo"); + + /*open db */ + ret = db_util_open(MANIFEST_DB, &appinfo_db, 0); + tryvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB); + + snprintf(query, MAX_QUERY_LEN, "select DISTINCT * " \ + "from package_app_info where " \ + "package='%s' and app_component='%s' and app_disable='false'", + info->manifest_info->package,"uiapp"); + + /*Populate ui app info */ + ret = __exec_db_query(appinfo_db, query, __uiapp_list_cb, (void *)info); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "App Info list retrieval failed"); + + uiapplication_x *tmp = NULL; + SAFE_LISTHEAD(info->manifest_info->uiapplication, tmp); + + /*Populate localized info for default locales and call callback*/ + /*If the callback func return < 0 we break and no more call back is called*/ + while(tmp != NULL) + { + if (locale) + appinfo->locale = strdup(locale); + appinfo->uiapp_info = tmp; + if (strcmp(appinfo->uiapp_info->type,"c++app") == 0){ + FREE_AND_NULL(locale); + locale = __get_app_locale_by_fallback(appinfo_db, appinfo->uiapp_info->appid); + } + + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select * from package_app_localized_info where app_id='%s' and app_locale='%s'", appinfo->uiapp_info->appid, locale); + ret = __exec_db_query(appinfo_db, query, __appinfo_cb, (void *)appinfo); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "App Localized Info DB Information retrieval failed"); + + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select * from package_app_localized_info where app_id='%s' and app_locale='%s'", appinfo->uiapp_info->appid, DEFAULT_LOCALE); + ret = __exec_db_query(appinfo_db, query, __appinfo_cb, (void *)appinfo); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "App Localized Info DB Information retrieval failed"); + + /*store setting notification icon section*/ + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select * from package_app_icon_section_info where app_id='%s'", appinfo->uiapp_info->appid); + ret = __exec_db_query(appinfo_db, query, __appinfo_cb, (void *)appinfo); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "App icon section Info DB Information retrieval failed"); + + /*store app preview image info*/ + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select app_image_section, app_image from package_app_image_info where app_id='%s'", appinfo->uiapp_info->appid); + ret = __exec_db_query(appinfo_db, query, __appinfo_cb, (void *)appinfo); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "App image Info DB Information retrieval failed"); + + /*Populate app category*/ + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select * from package_app_app_category where app_id='%s'", appinfo->uiapp_info->appid); + ret = __exec_db_query(appinfo_db, query, __appinfo_cb, (void *)appinfo); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "App Category Info DB Information retrieval failed"); + + /*Populate app metadata*/ + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select * from package_app_app_metadata where app_id='%s'", appinfo->uiapp_info->appid); + ret = __exec_db_query(appinfo_db, query, __appinfo_cb, (void *)appinfo); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "App Metadata Info DB Information retrieval failed"); + + SAFE_LISTHEAD(appinfo->uiapp_info->icon, ptr1); + SAFE_LISTHEAD(appinfo->uiapp_info->label, ptr2); + SAFE_LISTHEAD(appinfo->uiapp_info->category, ptr3); + SAFE_LISTHEAD(appinfo->uiapp_info->metadata, ptr4); + SAFE_LISTHEAD(appinfo->uiapp_info->permission, ptr5); + SAFE_LISTHEAD(appinfo->uiapp_info->image, ptr6); + + ret = app_func((void *)appinfo, user_data); + if (ret < 0){ + FREE_AND_NULL(appinfo->locale); + break; + } + + FREE_AND_NULL(appinfo->locale); + tmp = tmp->next; + } + + ret = PMINFO_R_OK; + +catch: + FREE_AND_NULL(locale); + FREE_AND_NULL(appinfo); + __cleanup_pkginfo(allinfo); + sqlite3_close(appinfo_db); + return ret; +} + +API int pkgmgrinfo_appinfo_get_install_list(pkgmgrinfo_app_list_cb app_func, void *user_data) +{ + retvm_if(app_func == NULL, PMINFO_R_EINVAL, "callback function is NULL"); + + int ret = PMINFO_R_OK; + char *query = NULL; + pkgmgr_pkginfo_x *info = NULL; + pkgmgr_appinfo_x *appinfo = NULL; + uiapplication_x *ptr1 = NULL; + sqlite3 *appinfo_db = NULL; + sqlite3_stmt *stmt = NULL; + + /*open db*/ + ret = db_util_open(MANIFEST_DB, &appinfo_db, 0); + retvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB); + + /*calloc pkginfo*/ + info = (pkgmgr_pkginfo_x *)calloc(1, sizeof(pkgmgr_pkginfo_x)); + tryvm_if(info == NULL, ret = PMINFO_R_ERROR, "Out of Memory!!!"); + + /*calloc manifest_info*/ + info->manifest_info = (manifest_x *)calloc(1, sizeof(manifest_x)); + tryvm_if(info->manifest_info == NULL, ret = PMINFO_R_ERROR, "Out of Memory!!!"); + + /*calloc appinfo*/ + appinfo = (pkgmgr_appinfo_x *)calloc(1, sizeof(pkgmgr_appinfo_x)); + tryvm_if(appinfo == NULL, ret = PMINFO_R_ERROR, "Out of Memory!!!"); + + /*Start constructing query*/ + query = sqlite3_mprintf("select * from package_app_info where app_disable='false'"); + + /*prepare query*/ + ret = sqlite3_prepare_v2(appinfo_db, query, strlen(query), &stmt, NULL); + tryvm_if(ret != PMINFO_R_OK, ret = PMINFO_R_ERROR, "sqlite3_prepare_v2 failed[%s]\n", query); + + /*step query*/ + while(1) { + ret = sqlite3_step(stmt); + if(ret == SQLITE_ROW) { + __get_appinfo_for_list(stmt, info); + } else { + break; + } + } + + /*head up*/ + SAFE_LISTHEAD(info->manifest_info->uiapplication, ptr1); + + /*UI Apps*/ + for(ptr1 = info->manifest_info->uiapplication; ptr1; ptr1 = ptr1->next) + { + appinfo->uiapp_info = ptr1; + + ret = app_func((void *)appinfo, user_data); + if (ret < 0) { + break; + } + } + ret = PMINFO_R_OK; + +catch: + sqlite3_free(query); + sqlite3_finalize(stmt); + sqlite3_close(appinfo_db); + FREE_AND_NULL(appinfo); + __cleanup_pkginfo(info); + return ret; +} + + +API int pkgmgrinfo_appinfo_get_installed_list(pkgmgrinfo_app_list_cb app_func, void *user_data) +{ + retvm_if(app_func == NULL, PMINFO_R_EINVAL, "callback function is NULL"); + + int ret = PMINFO_R_OK; + char *query = NULL; + char *locale = NULL; + char appid[MAX_QUERY_LEN] = {0,}; + char pre_appid[MAX_QUERY_LEN] = {0,}; + + pkgmgr_pkginfo_x *info = NULL; + pkgmgr_appinfo_x *appinfo = NULL; + uiapplication_x *ptr1 = NULL; + + sqlite3 *appinfo_db = NULL; + sqlite3_stmt *stmt = NULL; + + + /*calloc manifest_info*/ + info = (pkgmgr_pkginfo_x *)calloc(1, sizeof(pkgmgr_pkginfo_x)); + retvm_if(info == NULL, PMINFO_R_ERROR, "Out of Memory!!!"); + + info->manifest_info = (manifest_x *)calloc(1, sizeof(manifest_x)); + tryvm_if(info->manifest_info == NULL, ret = PMINFO_R_ERROR, "Out of Memory!!!"); + + appinfo = (pkgmgr_appinfo_x *)calloc(1, sizeof(pkgmgr_appinfo_x)); + tryvm_if(appinfo == NULL, ret = PMINFO_R_ERROR, "Out of Memory!!!"); + + /*open db*/ + ret = db_util_open(MANIFEST_DB, &appinfo_db, 0); + tryvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "db_util_open[%s] failed!", MANIFEST_DB); + + /*Start constructing query*/ + locale = __convert_system_locale_to_manifest_locale(); + query = sqlite3_mprintf("select * from package_app_info LEFT OUTER JOIN package_app_localized_info "\ + "ON package_app_info.app_id=package_app_localized_info.app_id "\ + "where package_app_info.app_disable='false' and package_app_localized_info.app_locale IN (%Q, %Q)", DEFAULT_LOCALE, locale); + + /*prepare query*/ + ret = sqlite3_prepare_v2(appinfo_db, query, strlen(query), &stmt, NULL); + tryvm_if(ret != PMINFO_R_OK, ret = PMINFO_R_ERROR, "sqlite3_prepare_v2 failed[%s]\n", query); + + /*step query*/ + while(1) { + ret = sqlite3_step(stmt); + if(ret == SQLITE_ROW) { + + memset(appid, 0, MAX_QUERY_LEN); + strncpy(appid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + + if (strlen(pre_appid) != 0) { + if (strcmp(pre_appid, appid) == 0) { + /*if same appid is found, then it is about exact matched locale*/ + __update_localed_label_for_list(stmt, info); + + memset(pre_appid, 0, MAX_QUERY_LEN); + strncpy(pre_appid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + + continue; + } else { + memset(pre_appid, 0, MAX_QUERY_LEN); + strncpy(pre_appid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + } + } else { + strncpy(pre_appid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + } + + __get_appinfo_for_list(stmt, info); + } else { + break; + } + } + + /*head up*/ + SAFE_LISTHEAD(info->manifest_info->uiapplication, ptr1); + + /*UI Apps*/ + for(ptr1 = info->manifest_info->uiapplication; ptr1; ptr1 = ptr1->next) + { + if (locale && appinfo->locale == NULL) + appinfo->locale = strdup(locale); + appinfo->uiapp_info = ptr1; + + ret = __appinfo_check_installed_storage(appinfo); + if(ret < 0) + continue; + + ret = app_func((void *)appinfo, user_data); + if (ret < 0) + break; + FREE_AND_NULL(appinfo->locale); + } + ret = PMINFO_R_OK; + +catch: + FREE_AND_NULL(locale); + sqlite3_free(query); + sqlite3_finalize(stmt); + sqlite3_close(appinfo_db); + FREE_AND_NULL(appinfo); + __cleanup_pkginfo(info); + return ret; +} + +API int pkgmgrinfo_appinfo_get_mounted_list(pkgmgrinfo_app_list_cb app_func, void *user_data) +{ + retvm_if(app_func == NULL, PMINFO_R_EINVAL, "callback function is NULL"); + + int ret = PMINFO_R_OK; + char *query = NULL; + char appid[MAX_QUERY_LEN] = {0,}; + char pre_appid[MAX_QUERY_LEN] = {0,}; + char *locale = NULL; + pkgmgr_pkginfo_x *info = NULL; + pkgmgr_appinfo_x *appinfo = NULL; + uiapplication_x *ptr1 = NULL; + sqlite3 *appinfo_db = NULL; + sqlite3_stmt *stmt = NULL; + + /*get system locale*/ + locale = __convert_system_locale_to_manifest_locale(); + tryvm_if(locale == NULL, ret = PMINFO_R_ERROR, "manifest locale is NULL"); + + /*open db*/ + ret = db_util_open(MANIFEST_DB, &appinfo_db, 0); + tryvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB); + + /*calloc pkginfo*/ + info = (pkgmgr_pkginfo_x *)calloc(1, sizeof(pkgmgr_pkginfo_x)); + tryvm_if(info == NULL, ret = PMINFO_R_ERROR, "Out of Memory!!!"); + + /*calloc manifest_info*/ + info->manifest_info = (manifest_x *)calloc(1, sizeof(manifest_x)); + tryvm_if(info->manifest_info == NULL, ret = PMINFO_R_ERROR, "Out of Memory!!!"); + + /*calloc appinfo*/ + appinfo = (pkgmgr_appinfo_x *)calloc(1, sizeof(pkgmgr_appinfo_x)); + tryvm_if(appinfo == NULL, ret = PMINFO_R_ERROR, "Out of Memory!!!"); + + /*Start constructing query*/ + query = sqlite3_mprintf("select * from package_app_info LEFT OUTER JOIN package_app_localized_info " \ + "ON package_app_info.app_id=package_app_localized_info.app_id " \ + "where app_installed_storage='installed_external' and package_app_info.app_disable='false' and package_app_localized_info.app_locale IN (%Q, %Q)", DEFAULT_LOCALE, locale); + + /*prepare query*/ + ret = sqlite3_prepare_v2(appinfo_db, query, strlen(query), &stmt, NULL); + tryvm_if(ret != PMINFO_R_OK, ret = PMINFO_R_ERROR, "sqlite3_prepare_v2 failed[%s]\n", query); + + /*step query*/ + while(1) { + ret = sqlite3_step(stmt); + if(ret == SQLITE_ROW) { + + memset(appid, 0, MAX_QUERY_LEN); + strncpy(appid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + + if (strlen(pre_appid) != 0) { + if (strcmp(pre_appid, appid) == 0) { + /*if same appid is found, then it is about exact matched locale*/ + __update_localed_label_for_list(stmt, info); + + memset(pre_appid, 0, MAX_QUERY_LEN); + strncpy(pre_appid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + + continue; + } else { + memset(pre_appid, 0, MAX_QUERY_LEN); + strncpy(pre_appid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + } + } else { + strncpy(pre_appid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + } + + __get_appinfo_for_list(stmt, info); + } else { + break; + } + } + + /*head up*/ + SAFE_LISTHEAD(info->manifest_info->uiapplication, ptr1); + + /*UI Apps*/ + for(ptr1 = info->manifest_info->uiapplication; ptr1; ptr1 = ptr1->next) + { + appinfo->locale = strdup(locale); + appinfo->uiapp_info = ptr1; + + ret = __appinfo_check_installed_storage(appinfo); + if(ret < 0) { + FREE_AND_NULL(appinfo->locale); + continue; + } + + ret = app_func((void *)appinfo, user_data); + if(ret < 0) { + FREE_AND_NULL(appinfo->locale); + break; + } + + FREE_AND_NULL(appinfo->locale); + } + ret = PMINFO_R_OK; + +catch: + FREE_AND_NULL(locale); + sqlite3_free(query); + sqlite3_finalize(stmt); + sqlite3_close(appinfo_db); + FREE_AND_NULL(appinfo); + __cleanup_pkginfo(info); + return ret; +} + +API int pkgmgrinfo_appinfo_get_unmounted_list(pkgmgrinfo_app_list_cb app_func, void *user_data) +{ + retvm_if(app_func == NULL, PMINFO_R_EINVAL, "callback function is NULL"); + + int ret = PMINFO_R_OK; + char *query = NULL; + char appid[MAX_QUERY_LEN] = {0,}; + char pre_appid[MAX_QUERY_LEN] = {0,}; + char *locale = NULL; + pkgmgr_pkginfo_x *info = NULL; + pkgmgr_appinfo_x *appinfo = NULL; + uiapplication_x *ptr1 = NULL; + sqlite3 *appinfo_db = NULL; + sqlite3_stmt *stmt = NULL; + + /*get system locale*/ + locale = __convert_system_locale_to_manifest_locale(); + tryvm_if(locale == NULL, ret = PMINFO_R_ERROR, "manifest locale is NULL"); + + /*open db*/ + ret = db_util_open(MANIFEST_DB, &appinfo_db, 0); + tryvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB); + + /*calloc pkginfo*/ + info = (pkgmgr_pkginfo_x *)calloc(1, sizeof(pkgmgr_pkginfo_x)); + tryvm_if(info == NULL, ret = PMINFO_R_ERROR, "Out of Memory!!!"); + + /*calloc manifest_info*/ + info->manifest_info = (manifest_x *)calloc(1, sizeof(manifest_x)); + tryvm_if(info->manifest_info == NULL, ret = PMINFO_R_ERROR, "Out of Memory!!!"); + + /*calloc appinfo*/ + appinfo = (pkgmgr_appinfo_x *)calloc(1, sizeof(pkgmgr_appinfo_x)); + tryvm_if(appinfo == NULL, ret = PMINFO_R_ERROR, "Out of Memory!!!"); + + /*Start constructing query*/ + query = sqlite3_mprintf("select * from package_app_info LEFT OUTER JOIN package_app_localized_info " \ + "ON package_app_info.app_id=package_app_localized_info.app_id " \ + "where app_installed_storage='installed_external' and package_app_info.app_disable='false' and package_app_localized_info.app_locale IN (%Q, %Q)", DEFAULT_LOCALE, locale); + + /*prepare query*/ + ret = sqlite3_prepare_v2(appinfo_db, query, strlen(query), &stmt, NULL); + tryvm_if(ret != PMINFO_R_OK, ret = PMINFO_R_ERROR, "sqlite3_prepare_v2 failed[%s]\n", query); + + /*step query*/ + while(1) { + ret = sqlite3_step(stmt); + if(ret == SQLITE_ROW) { + + memset(appid, 0, MAX_QUERY_LEN); + strncpy(appid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + + if (strlen(pre_appid) != 0) { + if (strcmp(pre_appid, appid) == 0) { + /*if same appid is found, then it is about exact matched locale*/ + __update_localed_label_for_list(stmt, info); + + memset(pre_appid, 0, MAX_QUERY_LEN); + strncpy(pre_appid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + + continue; + } else { + memset(pre_appid, 0, MAX_QUERY_LEN); + strncpy(pre_appid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + } + } else { + strncpy(pre_appid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + } + + __get_appinfo_for_list(stmt, info); + } else { + break; + } + } + + /*head up*/ + SAFE_LISTHEAD(info->manifest_info->uiapplication, ptr1); + + /*UI Apps*/ + for(ptr1 = info->manifest_info->uiapplication; ptr1; ptr1 = ptr1->next) + { + appinfo->locale = strdup(locale); + appinfo->uiapp_info = ptr1; + + ret = app_func((void *)appinfo, user_data); + if(ret < 0) { + FREE_AND_NULL(appinfo->locale); + break; + } + + FREE_AND_NULL(appinfo->locale); + } + ret = PMINFO_R_OK; + +catch: + FREE_AND_NULL(locale); + sqlite3_free(query); + sqlite3_finalize(stmt); + sqlite3_close(appinfo_db); + FREE_AND_NULL(appinfo); + __cleanup_pkginfo(info); + return ret; +} + +API int pkgmgrinfo_appinfo_get_unmounted_appinfo(const char *appid, pkgmgrinfo_appinfo_h *handle) +{ + retvm_if(appid == NULL, PMINFO_R_EINVAL, "appid is NULL"); + retvm_if(handle == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + + pkgmgr_appinfo_x *appinfo = NULL; + char *locale = NULL; + int ret = -1; + int exist = 0; + label_x *tmp1 = NULL; + icon_x *tmp2 = NULL; + category_x *tmp3 = NULL; + metadata_x *tmp4 = NULL; + permission_x *tmp5 = NULL; + image_x *tmp6 = NULL; + char *query = NULL; + sqlite3 *appinfo_db = NULL; + char *alias_id = NULL; + + /*open db*/ + ret = db_util_open(MANIFEST_DB, &appinfo_db, 0); + retvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB); + + /*Get the alias id*/ + alias_id = __get_aliasid_from_db(appinfo_db,appid); + + /*check alias_id exist on db*/ + query = sqlite3_mprintf("select exists(select * from package_app_info where app_id=%Q and app_disable='false')", alias_id); + ret = __exec_db_query(appinfo_db, query, _pkgmgrinfo_validate_cb, (void *)&exist); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "sqlite3_exec fail"); + tryvm_if(exist == 0, ret = PMINFO_R_ERROR, "Appid[%s] not found in DB", alias_id); + + /*get system locale*/ + locale = __convert_system_locale_to_manifest_locale(); + tryvm_if(locale == NULL, ret = PMINFO_R_ERROR, "manifest locale is NULL"); + + /*calloc appinfo*/ + appinfo = (pkgmgr_appinfo_x *)calloc(1, sizeof(pkgmgr_appinfo_x)); + tryvm_if(appinfo == NULL, ret = PMINFO_R_ERROR, "Failed to allocate memory for appinfo"); + + /*calloc app_component*/ + appinfo->uiapp_info = (uiapplication_x *)calloc(1, sizeof(uiapplication_x)); + tryvm_if(appinfo->uiapp_info == NULL, ret = PMINFO_R_ERROR, "Failed to allocate memory for uiapp info"); + + appinfo->locale = strdup(locale); + + /*populate app_info from DB*/ + query = sqlite3_mprintf("select * from package_app_info where app_id=%Q and app_disable='false' ", alias_id); + ret = __exec_db_query(appinfo_db, query, __appinfo_cb, (void *)appinfo); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "App Info DB Information retrieval failed"); + + query = sqlite3_mprintf("select * from package_app_localized_info where app_id=%Q and app_locale=%Q", alias_id, locale); + ret = __exec_db_query(appinfo_db, query, __appinfo_cb, (void *)appinfo); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "App Info DB Information retrieval failed"); + + /*Also store the values corresponding to default locales*/ + query = sqlite3_mprintf("select * from package_app_localized_info where app_id=%Q and app_locale=%Q", alias_id, DEFAULT_LOCALE); + ret = __exec_db_query(appinfo_db, query, __appinfo_cb, (void *)appinfo); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "App Localized Info DB Information retrieval failed"); + + /*Populate app category*/ + query = sqlite3_mprintf("select * from package_app_app_category where app_id=%Q", alias_id); + ret = __exec_db_query(appinfo_db, query, __appinfo_cb, (void *)appinfo); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "App Category Info DB Information retrieval failed"); + + /*Populate app metadata*/ + query = sqlite3_mprintf("select * from package_app_app_metadata where app_id=%Q", alias_id); + ret = __exec_db_query(appinfo_db, query, __appinfo_cb, (void *)appinfo); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "App Metadata Info DB Information retrieval failed"); + + /*Populate app permission*/ + query = sqlite3_mprintf("select * from package_app_app_permission where app_id=%Q", alias_id); + ret = __exec_db_query(appinfo_db, query, __appinfo_cb, (void *)appinfo); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "App permission Info DB Information retrieval failed"); + + /*store setting notification icon section*/ + query = sqlite3_mprintf("select * from package_app_icon_section_info where app_id=%Q", alias_id); + ret = __exec_db_query(appinfo_db, query, __appinfo_cb, (void *)appinfo); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "App icon section Info DB Information retrieval failed"); + + /*store app preview image info*/ + query = sqlite3_mprintf("select app_image_section, app_image from package_app_image_info where app_id=%Q", alias_id); + ret = __exec_db_query(appinfo_db, query, __appinfo_cb, (void *)appinfo); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "App image Info DB Information retrieval failed"); + + SAFE_LISTHEAD(appinfo->uiapp_info->label, tmp1); + SAFE_LISTHEAD(appinfo->uiapp_info->icon, tmp2); + SAFE_LISTHEAD(appinfo->uiapp_info->category, tmp3); + SAFE_LISTHEAD(appinfo->uiapp_info->metadata, tmp4); + SAFE_LISTHEAD(appinfo->uiapp_info->permission, tmp5); + SAFE_LISTHEAD(appinfo->uiapp_info->image, tmp6); + + ret = PMINFO_R_OK; + +catch: + if (ret == PMINFO_R_OK) + *handle = (void*)appinfo; + else { + *handle = NULL; + __cleanup_appinfo(appinfo); + } + + sqlite3_close(appinfo_db); + FREE_AND_NULL(locale); + FREE_AND_NULL(alias_id); + return ret; +} + +API int pkgmgrinfo_appinfo_get_appinfo(const char *appid, pkgmgrinfo_appinfo_h *handle) +{ + retvm_if(appid == NULL, PMINFO_R_EINVAL, "appid is NULL"); + retvm_if(handle == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + + pkgmgr_appinfo_x *appinfo = NULL; + char *locale = NULL; + int ret = -1; + int exist = 0; + label_x *tmp1 = NULL; + icon_x *tmp2 = NULL; + category_x *tmp3 = NULL; + metadata_x *tmp4 = NULL; + permission_x *tmp5 = NULL; + image_x *tmp6 = NULL; + char *query = NULL; + sqlite3 *appinfo_db = NULL; + char *alias_id = NULL; + + /*open db*/ + ret = db_util_open(MANIFEST_DB, &appinfo_db, 0); + retvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB); + + /*Get the alias id*/ + alias_id = __get_aliasid_from_db(appinfo_db,appid); + + /*check alias_id exist on db*/ + query = sqlite3_mprintf("select exists(select * from package_app_info where app_id=%Q and app_disable='false')", alias_id); + ret = __exec_db_query(appinfo_db, query, _pkgmgrinfo_validate_cb, (void *)&exist); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "sqlite3_exec fail"); + if (exist == 0) { + _LOGS("Appid[%s] not found in DB", alias_id); + ret = PMINFO_R_ERROR; + goto catch; + } + + /*get system locale*/ + locale = __convert_system_locale_to_manifest_locale(); + tryvm_if(locale == NULL, ret = PMINFO_R_ERROR, "manifest locale is NULL"); + + /*calloc appinfo*/ + appinfo = (pkgmgr_appinfo_x *)calloc(1, sizeof(pkgmgr_appinfo_x)); + tryvm_if(appinfo == NULL, ret = PMINFO_R_ERROR, "Failed to allocate memory for appinfo"); + + /*calloc app_component*/ + appinfo->uiapp_info = (uiapplication_x *)calloc(1, sizeof(uiapplication_x)); + tryvm_if(appinfo->uiapp_info == NULL, ret = PMINFO_R_ERROR, "Failed to allocate memory for uiapp info"); + + appinfo->locale = strdup(locale); + + /*populate app_info from DB*/ + query = sqlite3_mprintf("select * from package_app_info where app_id=%Q and app_disable='false' ", alias_id); + ret = __exec_db_query(appinfo_db, query, __appinfo_cb, (void *)appinfo); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "App Info DB Information retrieval failed"); + + query = sqlite3_mprintf("select * from package_app_localized_info where app_id=%Q and app_locale=%Q", alias_id, locale); + ret = __exec_db_query(appinfo_db, query, __appinfo_cb, (void *)appinfo); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "App Info DB Information retrieval failed"); + + /*Also store the values corresponding to default locales*/ + query = sqlite3_mprintf("select * from package_app_localized_info where app_id=%Q and app_locale=%Q", alias_id, DEFAULT_LOCALE); + ret = __exec_db_query(appinfo_db, query, __appinfo_cb, (void *)appinfo); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "App Localized Info DB Information retrieval failed"); + + /*Populate app category*/ + query = sqlite3_mprintf("select * from package_app_app_category where app_id=%Q", alias_id); + ret = __exec_db_query(appinfo_db, query, __appinfo_cb, (void *)appinfo); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "App Category Info DB Information retrieval failed"); + + /*Populate app metadata*/ + query = sqlite3_mprintf("select * from package_app_app_metadata where app_id=%Q", alias_id); + ret = __exec_db_query(appinfo_db, query, __appinfo_cb, (void *)appinfo); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "App Metadata Info DB Information retrieval failed"); + + /*Populate app permission*/ + query = sqlite3_mprintf("select * from package_app_app_permission where app_id=%Q", alias_id); + ret = __exec_db_query(appinfo_db, query, __appinfo_cb, (void *)appinfo); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "App permission Info DB Information retrieval failed"); + + /*store setting notification icon section*/ + query = sqlite3_mprintf("select * from package_app_icon_section_info where app_id=%Q", alias_id); + ret = __exec_db_query(appinfo_db, query, __appinfo_cb, (void *)appinfo); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "App icon section Info DB Information retrieval failed"); + + /*store app preview image info*/ + query = sqlite3_mprintf("select app_image_section, app_image from package_app_image_info where app_id=%Q", alias_id); + ret = __exec_db_query(appinfo_db, query, __appinfo_cb, (void *)appinfo); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "App image Info DB Information retrieval failed"); + + ret = __appinfo_check_installed_storage(appinfo); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "[%s] is installed external, but is not in mmc", appinfo->uiapp_info->package); + + SAFE_LISTHEAD(appinfo->uiapp_info->label, tmp1); + SAFE_LISTHEAD(appinfo->uiapp_info->icon, tmp2); + SAFE_LISTHEAD(appinfo->uiapp_info->category, tmp3); + SAFE_LISTHEAD(appinfo->uiapp_info->metadata, tmp4); + SAFE_LISTHEAD(appinfo->uiapp_info->permission, tmp5); + SAFE_LISTHEAD(appinfo->uiapp_info->image, tmp6); + + ret = PMINFO_R_OK; + +catch: + if (ret == PMINFO_R_OK) + *handle = (void*)appinfo; + else { + *handle = NULL; + __cleanup_appinfo(appinfo); + } + + sqlite3_close(appinfo_db); + FREE_AND_NULL(locale); + FREE_AND_NULL(alias_id); + return ret; +} + + +API int pkgmgrinfo_appinfo_get_appid(pkgmgrinfo_appinfo_h handle, char **appid) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(appid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + + *appid = (char *)info->uiapp_info->appid; + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo_h handle, char **pkg_name) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(pkg_name == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + + *pkg_name = (char *)info->uiapp_info->package; + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_get_pkgid(pkgmgrinfo_appinfo_h handle, char **pkgid) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(pkgid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + + *pkgid = (char *)info->uiapp_info->package; + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_get_pkgtype(pkgmgrinfo_appinfo_h handle, char **pkgtype) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(pkgtype == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + + *pkgtype = (char *)info->uiapp_info->package_type; + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_get_exec(pkgmgrinfo_appinfo_h handle, char **exec) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(exec == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + + *exec = (char *)info->uiapp_info->exec; + + return PMINFO_R_OK; +} + + +API int pkgmgrinfo_appinfo_get_ambient_support(pkgmgrinfo_appinfo_h handle, bool *ambient_support) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(ambient_support == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + char *val = NULL; + bool is_support = false; + + val = (char *)info->uiapp_info->ambient_support; + if (val) { + if (strcasecmp(val, "true") == 0) + is_support = true; + } + + *ambient_support = is_support; + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_get_icon(pkgmgrinfo_appinfo_h handle, char **icon) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(icon == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + + char *locale = NULL; + icon_x *ptr = NULL; + icon_x *start = NULL; + *icon = NULL; + + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + locale = info->locale; + retvm_if(locale == NULL, PMINFO_R_ERROR, "manifest locale is NULL"); + + start = info->uiapp_info->icon; + + for(ptr = start; ptr != NULL; ptr = ptr->next) + { + if (ptr->lang) { + if (strcmp(ptr->lang, locale) == 0) { + if (ptr->text) { + *icon = (char *)ptr->text; + if (strcasecmp(*icon, PKGMGR_PARSER_EMPTY_STR) == 0) { + locale = DEFAULT_LOCALE; + continue; + } else + break; + } else { + locale = DEFAULT_LOCALE; + continue; + } + } else if (strcmp(ptr->lang, DEFAULT_LOCALE) == 0) { + *icon = (char *)ptr->text; + break; + } + } + } + return PMINFO_R_OK; +} + + +API int pkgmgrinfo_appinfo_get_label(pkgmgrinfo_appinfo_h handle, char **label) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(label == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + int ret = 0; + char *locale = NULL; + label_x *ptr = NULL; + label_x *start = NULL; + *label = NULL; + + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + locale = info->locale; + retvm_if(locale == NULL, PMINFO_R_ERROR, "manifest locale is NULL"); + + ret = __sat_ui_get_label(handle, label); + retvm_if(ret == PMINFO_R_OK, PMINFO_R_OK, "sat ui(%s) is enabled", (char *)info->uiapp_info->appid); + + start = info->uiapp_info->label; + + for(ptr = start; ptr != NULL; ptr = ptr->next) + { + if (ptr->lang) { + if (strcmp(ptr->lang, locale) == 0) { + if (ptr->text) { + *label = (char *)ptr->text; + if (strcasecmp(*label, PKGMGR_PARSER_EMPTY_STR) == 0) { + locale = DEFAULT_LOCALE; + continue; + } else + break; + } else { + locale = DEFAULT_LOCALE; + continue; + } + } else if (strncasecmp(ptr->lang, locale, 2) == 0) { + *label = (char *)ptr->text; + if (ptr->text) { + if (strcasecmp(*label, PKGMGR_PARSER_EMPTY_STR) == 0) { + locale = DEFAULT_LOCALE; + continue; + } else + break; + } else { + locale = DEFAULT_LOCALE; + continue; + } + } else if (strcmp(ptr->lang, DEFAULT_LOCALE) == 0) { + *label = (char *)ptr->text; + break; + } + } + } + return PMINFO_R_OK; +} + + +API int pkgmgrinfo_appinfo_get_component(pkgmgrinfo_appinfo_h handle, pkgmgrinfo_app_component *component) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(component == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + + *component = PMINFO_UI_APP; + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_get_apptype(pkgmgrinfo_appinfo_h handle, char **app_type) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(app_type == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + + *app_type = (char *)info->uiapp_info->type; + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_get_operation(pkgmgrinfo_appcontrol_h handle, + int *operation_count, char ***operation) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(operation == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + retvm_if(operation_count == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + pkgmgrinfo_appcontrol_x *data = (pkgmgrinfo_appcontrol_x *)handle; + *operation_count = data->operation_count; + *operation = data->operation; + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_get_uri(pkgmgrinfo_appcontrol_h handle, + int *uri_count, char ***uri) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(uri == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + retvm_if(uri_count == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + pkgmgrinfo_appcontrol_x *data = (pkgmgrinfo_appcontrol_x *)handle; + *uri_count = data->uri_count; + *uri = data->uri; + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_get_mime(pkgmgrinfo_appcontrol_h handle, + int *mime_count, char ***mime) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(mime == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + retvm_if(mime_count == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + pkgmgrinfo_appcontrol_x *data = (pkgmgrinfo_appcontrol_x *)handle; + *mime_count = data->mime_count; + *mime = data->mime; + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_get_subapp(pkgmgrinfo_appcontrol_h handle, + int *subapp_count, char ***subapp) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(subapp == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + retvm_if(subapp_count == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + pkgmgrinfo_appcontrol_x *data = (pkgmgrinfo_appcontrol_x *)handle; + *subapp_count = data->subapp_count; + *subapp = data->subapp; + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_get_setting_icon(pkgmgrinfo_appinfo_h handle, char **icon) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL\n"); + retvm_if(icon == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + + char *val = NULL; + icon_x *ptr = NULL; + icon_x *start = NULL; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + + start = info->uiapp_info->icon; + + for(ptr = start; ptr != NULL; ptr = ptr->next) + { + if (ptr->section) { + val = (char *)ptr->section; + if (strcmp(val, "setting") == 0){ + *icon = (char *)ptr->text; + break; + } + } + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_get_small_icon(pkgmgrinfo_appinfo_h handle, char **icon) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL\n"); + retvm_if(icon == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + + char *val = NULL; + icon_x *ptr = NULL; + icon_x *start = NULL; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + + start = info->uiapp_info->icon; + + for(ptr = start; ptr != NULL; ptr = ptr->next) + { + if (ptr->section) { + val = (char *)ptr->section; + if (strcmp(val, "small") == 0){ + *icon = (char *)ptr->text; + break; + } + } + } + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_get_notification_icon(pkgmgrinfo_appinfo_h handle, char **icon) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL\n"); + retvm_if(icon == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + + char *val = NULL; + icon_x *ptr = NULL; + icon_x *start = NULL; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + + start = info->uiapp_info->icon; + + for(ptr = start; ptr != NULL; ptr = ptr->next) + { + if (ptr->section) { + val = (char *)ptr->section; + + if (strcmp(val, "notification") == 0){ + *icon = (char *)ptr->text; + break; + } + } + } + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_get_recent_image_type(pkgmgrinfo_appinfo_h handle, pkgmgrinfo_app_recentimage *type) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(type == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + char *val = NULL; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + val = (char *)info->uiapp_info->recentimage; + if (val) { + if (strcasecmp(val, "capture") == 0) + *type = PMINFO_RECENTIMAGE_USE_CAPTURE; + else if (strcasecmp(val, "icon") == 0) + *type = PMINFO_RECENTIMAGE_USE_ICON; + else + *type = PMINFO_RECENTIMAGE_USE_NOTHING; + } + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_get_preview_image(pkgmgrinfo_appinfo_h handle, char **preview_img) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL\n"); + retvm_if(preview_img == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + + char *val = NULL; + image_x *ptr = NULL; + image_x *start = NULL; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + + start = info->uiapp_info->image; + + for(ptr = start; ptr != NULL; ptr = ptr->next) + { + if (ptr->section) { + val = (char *)ptr->section; + + if (strcmp(val, "preview") == 0) + *preview_img = (char *)ptr->text; + + break; + } + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_get_permission_type(pkgmgrinfo_appinfo_h handle, pkgmgrinfo_permission_type *permission) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL\n"); + retvm_if(permission == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + + char *val = NULL; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + + val = (char*)info->uiapp_info->permission_type; + + if (strcmp(val, "signature") == 0) + *permission = PMINFO_PERMISSION_SIGNATURE; + else if (strcmp(val, "privilege") == 0) + *permission = PMINFO_PERMISSION_PRIVILEGE; + else + *permission = PMINFO_PERMISSION_NORMAL; + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_get_component_type(pkgmgrinfo_appinfo_h handle, char **component_type) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(component_type == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + + *component_type = (char *)info->uiapp_info->component_type; + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_get_hwacceleration(pkgmgrinfo_appinfo_h handle, pkgmgrinfo_app_hwacceleration *hwacceleration) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(hwacceleration == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + char *val = NULL; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + val = (char *)info->uiapp_info->hwacceleration; + if (val) { + if (strcasecmp(val, "off") == 0) + *hwacceleration = PMINFO_HWACCELERATION_OFF; + else if (strcasecmp(val, "on") == 0) + *hwacceleration = PMINFO_HWACCELERATION_ON; + else + *hwacceleration = PMINFO_HWACCELERATION_DEFAULT; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_get_screenreader(pkgmgrinfo_appinfo_h handle, pkgmgrinfo_app_screenreader *screenreader) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(screenreader == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + char *val = NULL; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + val = (char *)info->uiapp_info->screenreader; + if (val) { + if (strcasecmp(val, "screenreader-off") == 0) + *screenreader = PMINFO_SCREENREADER_OFF; + else if (strcasecmp(val, "screenreader-on") == 0) + *screenreader = PMINFO_SCREENREADER_ON; + else + *screenreader = PMINFO_SCREENREADER_USE_SYSTEM_SETTING; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_get_effectimage(pkgmgrinfo_appinfo_h handle, char **portrait_img, char **landscape_img) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(portrait_img == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + retvm_if(landscape_img == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + + *portrait_img = (char *)info->uiapp_info->portraitimg; + *landscape_img = (char *)info->uiapp_info->landscapeimg; + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_get_effectimage_type(pkgmgrinfo_appinfo_h handle, char **effectimg_type) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(effectimg_type == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + + *effectimg_type = (char *)info->uiapp_info->effectimage_type; + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_get_submode_mainid(pkgmgrinfo_appinfo_h handle, char **submode_mainid) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(submode_mainid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + + *submode_mainid = (char *)info->uiapp_info->submode_mainid; + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_get_localed_label(const char *appid, const char *locale, char **label) +{ + int col = 0; + int cols = 0; + int ret = -1; + char *val = NULL; + char *localed_label = NULL; + char *query = NULL; + + retvm_if(appid == NULL || locale == NULL || label == NULL, PMINFO_R_EINVAL, "Argument is NULL"); + + sqlite3_stmt *stmt = NULL; + sqlite3 *pkgmgr_parser_db = NULL; + char *alias_id = NULL; + + ret = db_util_open(MANIFEST_DB, &pkgmgr_parser_db, 0); + if (ret != SQLITE_OK) { + _LOGE("DB open fail\n"); + return -1; + } + + /*Get the alias id*/ + alias_id = __get_aliasid_from_db(pkgmgr_parser_db,appid); + + query = sqlite3_mprintf("select app_label from package_app_localized_info where app_id=%Q and app_locale=%Q", alias_id, locale); + + + ret = sqlite3_prepare_v2(pkgmgr_parser_db, query, strlen(query), &stmt, NULL); + if (ret != SQLITE_OK) { + _LOGE("prepare_v2 fail\n"); + sqlite3_close(pkgmgr_parser_db); + sqlite3_free(query); + FREE_AND_NULL(alias_id); + return -1; + } + + cols = sqlite3_column_count(stmt); + while(1) + { + ret = sqlite3_step(stmt); + if(ret == SQLITE_ROW) { + for(col = 0; col < cols; col++) + { + val = (char*)sqlite3_column_text(stmt, col); + if (val == NULL) + break; + + _LOGE("success find localed_label[%s]\n", val); + FREE_AND_NULL(localed_label); + localed_label = strdup(val); + if (localed_label == NULL) + break; + + *label = localed_label; + + + } + ret = 0; + } else { + break; + } + } + + /*find default label when exact matching failed*/ + if (localed_label == NULL) { + sqlite3_free(query); + query = sqlite3_mprintf("select app_label from package_app_localized_info where app_id=%Q and app_locale=%Q", alias_id, DEFAULT_LOCALE); + ret = sqlite3_prepare_v2(pkgmgr_parser_db, query, strlen(query), &stmt, NULL); + if (ret != SQLITE_OK) { + _LOGE("prepare_v2 fail\n"); + sqlite3_close(pkgmgr_parser_db); + sqlite3_free(query); + FREE_AND_NULL(alias_id); + return -1; + } + + cols = sqlite3_column_count(stmt); + while(1) + { + ret = sqlite3_step(stmt); + if(ret == SQLITE_ROW) { + for(col = 0; col < cols; col++) + { + val = (char*)sqlite3_column_text(stmt, col); + if (val == NULL) + break; + _LOGE("success find default localed_label[%s]\n", val); + FREE_AND_NULL(localed_label); + localed_label = strdup(val); + if (localed_label == NULL) + break; + *label = localed_label; + } + ret = 0; + } else { + break; + } + } + + } + + FREE_AND_NULL(alias_id); + sqlite3_finalize(stmt); + sqlite3_close(pkgmgr_parser_db); + sqlite3_free(query); + + if (localed_label == NULL) { + return PMINFO_R_ERROR; + } else { + return PMINFO_R_OK; + } +} + +API int pkgmgrinfo_appinfo_get_metadata_value(pkgmgrinfo_appinfo_h handle, const char *metadata_key, char **metadata_value) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(metadata_key == NULL, PMINFO_R_EINVAL, "metadata_key is NULL"); + retvm_if(metadata_value == NULL, PMINFO_R_EINVAL, "metadata_value is NULL"); + + metadata_x *ptr = NULL; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + + ptr = info->uiapp_info->metadata; + + for (; ptr; ptr = ptr->next) { + if (ptr->key) { + if (strcasecmp(ptr->key, metadata_key) == 0) + { + *metadata_value = (char*)ptr->value; + return PMINFO_R_OK; + } + } + } + + return PMINFO_R_EINVAL; +} + +API int pkgmgrinfo_appinfo_get_multi_instance_mainid(pkgmgrinfo_appinfo_h handle, char **multi_instance_mainid) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(multi_instance_mainid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + + *multi_instance_mainid = (char *)info->uiapp_info->multi_instance_mainid; + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_get_datacontrol_info(const char *providerid, const char *type, char **appid, char **access) +{ + retvm_if(providerid == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL\n"); + retvm_if(type == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL\n"); + retvm_if(appid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + retvm_if(access == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + + int ret = PMINFO_R_OK; + char *query = NULL; + sqlite3 *appinfo_db = NULL; + sqlite3_stmt *stmt = NULL; + + /*open db*/ + ret = db_util_open(MANIFEST_DB, &appinfo_db, 0); + retvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB); + + /*Start constructing query*/ + query = sqlite3_mprintf("select * from package_app_data_control where providerid=%Q and type=%Q", providerid, type); + + /*prepare query*/ + ret = sqlite3_prepare_v2(appinfo_db, query, strlen(query), &stmt, NULL); + tryvm_if(ret != PMINFO_R_OK, ret = PMINFO_R_ERROR, "sqlite3_prepare_v2 failed[%s]\n", query); + + /*step query*/ + ret = sqlite3_step(stmt); + tryvm_if((ret != SQLITE_ROW) || (ret == SQLITE_DONE), ret = PMINFO_R_ERROR, "No records found"); + + *appid = strdup((char *)sqlite3_column_text(stmt, 0)); + *access = strdup((char *)sqlite3_column_text(stmt, 2)); + + ret = PMINFO_R_OK; + +catch: + sqlite3_free(query); + sqlite3_finalize(stmt); + sqlite3_close(appinfo_db); + return ret; +} + +API int pkgmgrinfo_appinfo_get_datacontrol_appid(const char *providerid, char **appid) +{ + retvm_if(providerid == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL\n"); + retvm_if(appid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + + int ret = PMINFO_R_OK; + char *query = NULL; + sqlite3 *appinfo_db = NULL; + sqlite3_stmt *stmt = NULL; + + /*open db*/ + ret = db_util_open(MANIFEST_DB, &appinfo_db, 0); + retvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB); + + /*Start constructing query*/ + query = sqlite3_mprintf("select * from package_app_data_control where providerid=%Q", providerid); + + /*prepare query*/ + ret = sqlite3_prepare_v2(appinfo_db, query, strlen(query), &stmt, NULL); + tryvm_if(ret != PMINFO_R_OK, ret = PMINFO_R_ERROR, "sqlite3_prepare_v2 failed[%s]\n", query); + + /*step query*/ + ret = sqlite3_step(stmt); + tryvm_if((ret != SQLITE_ROW) || (ret == SQLITE_DONE), ret = PMINFO_R_ERROR, "No records found"); + + *appid = strdup((char *)sqlite3_column_text(stmt, 0)); + + ret = PMINFO_R_OK; + +catch: + sqlite3_free(query); + sqlite3_finalize(stmt); + sqlite3_close(appinfo_db); + return ret; +} + +API int pkgmgrinfo_appinfo_get_support_mode(pkgmgrinfo_appinfo_h handle, int *support_mode) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(support_mode == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + if (info->uiapp_info->support_mode) + *support_mode = atoi(info->uiapp_info->support_mode); + else + *support_mode = 0; + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_get_support_feature(pkgmgrinfo_appinfo_h handle, int *support_feature) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(support_feature == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + if (info->uiapp_info->support_feature) + *support_feature = atoi(info->uiapp_info->support_feature); + else + *support_feature = 0; + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_get_uginfo(const char *ug_name, pkgmgrinfo_appinfo_h *handle) +{ + retvm_if(ug_name == NULL, PMINFO_R_EINVAL, "ug_name is NULL"); + retvm_if(handle == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + + pkgmgr_appinfo_x *appinfo = NULL; + int ret = -1; + char *query = NULL; + sqlite3 *appinfo_db = NULL; + + /*open db*/ + ret = db_util_open(MANIFEST_DB, &appinfo_db, 0); + retvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB); + + /*calloc appinfo*/ + appinfo = (pkgmgr_appinfo_x *)calloc(1, sizeof(pkgmgr_appinfo_x)); + tryvm_if(appinfo == NULL, ret = PMINFO_R_ERROR, "Failed to allocate memory for appinfo"); + + /*calloc app_component*/ + appinfo->uiapp_info = (uiapplication_x *)calloc(1, sizeof(uiapplication_x)); + tryvm_if(appinfo->uiapp_info == NULL, ret = PMINFO_R_ERROR, "Failed to allocate memory for uiapp info"); + + /*populate app_info from DB*/ + query = sqlite3_mprintf("select * from package_app_info where app_ui_gadget='true' and app_exec like '%%%s'", ug_name); + ret = __exec_db_query(appinfo_db, query, __appinfo_cb, (void *)appinfo); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "App Info DB Information retrieval failed"); + + ret = __appinfo_check_installed_storage(appinfo); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "[%s] is installed external, but is not in mmc", appinfo->uiapp_info->package); + + ret = PMINFO_R_OK; + +catch: + if (ret == PMINFO_R_OK) + *handle = (void*)appinfo; + else { + *handle = NULL; + __cleanup_appinfo(appinfo); + } + + sqlite3_close(appinfo_db); + + return ret; +} + +/*Get the alias id for an appid from pkgmgr DB*/ +API int pkgmgrinfo_appinfo_get_aliasid(const char *appid, char **alias_id) +{ + + sqlite3 *appinfo_db = NULL; + int ret = PMINFO_R_OK; + + retvm_if(appid == NULL, PMINFO_R_EINVAL, "appid is NULL"); + retvm_if(alias_id == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + + /*open db */ + ret = db_util_open(MANIFEST_DB, &appinfo_db, 0); + tryvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB); + + *alias_id = __get_aliasid_from_db(appinfo_db,appid); +catch: + + sqlite3_close(appinfo_db); + return ret; +} + +API int pkgmgrinfo_appinfo_get_installed_time(pkgmgrinfo_appinfo_h handle, int *installed_time) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL\n"); + retvm_if(installed_time == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + if (info->uiapp_info->package_installed_time) + *installed_time = atoi(info->uiapp_info->package_installed_time); + else + return PMINFO_R_ERROR; + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_foreach_permission(pkgmgrinfo_appinfo_h handle, + pkgmgrinfo_app_permission_list_cb permission_func, void *user_data) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(permission_func == NULL, PMINFO_R_EINVAL, "Callback function is NULL"); + int ret = -1; + permission_x *ptr = NULL; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + + ptr = info->uiapp_info->permission; + + for (; ptr; ptr = ptr->next) { + if (ptr->value) { + ret = permission_func(ptr->value, user_data); + if (ret < 0) + break; + } + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_foreach_category(pkgmgrinfo_appinfo_h handle, + pkgmgrinfo_app_category_list_cb category_func, void *user_data) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(category_func == NULL, PMINFO_R_EINVAL, "Callback function is NULL"); + int ret = -1; + category_x *ptr = NULL; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + + ptr = info->uiapp_info->category; + + for (; ptr; ptr = ptr->next) { + if (ptr->name) { + ret = category_func(ptr->name, user_data); + if (ret < 0) + break; + } + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_foreach_metadata(pkgmgrinfo_appinfo_h handle, + pkgmgrinfo_app_metadata_list_cb metadata_func, void *user_data) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(metadata_func == NULL, PMINFO_R_EINVAL, "Callback function is NULL"); + int ret = -1; + metadata_x *ptr = NULL; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + + ptr = info->uiapp_info->metadata; + + for (; ptr; ptr = ptr->next) { + if (ptr->key) { + ret = metadata_func(ptr->key, ptr->value, user_data); + if (ret < 0) + break; + } + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_foreach_appcontrol(pkgmgrinfo_appinfo_h handle, + pkgmgrinfo_app_control_list_cb appcontrol_func, void *user_data) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(appcontrol_func == NULL, PMINFO_R_EINVAL, "Callback function is NULL"); + int i = 0; + int ret = -1; + int oc = 0; + int mc = 0; + int uc = 0; + int sc = 0; + char *pkgid = NULL; + char *manifest = NULL; + char **operation = NULL; + char **uri = NULL; + char **mime = NULL; + char **subapp = NULL; + appsvc_x *appsvc = NULL; + manifest_x *mfx = NULL; + operation_x *op = NULL; + uri_x *ui = NULL; + mime_x *mi = NULL; + subapp_x *sa = NULL; + pkgmgrinfo_app_component component; + pkgmgrinfo_appcontrol_x *ptr = NULL; + ret = pkgmgrinfo_appinfo_get_pkgid(handle, &pkgid); + if (ret < 0) { + _LOGE("Failed to get package name\n"); + return PMINFO_R_ERROR; + } + ret = pkgmgrinfo_appinfo_get_component(handle, &component); + if (ret < 0) { + _LOGE("Failed to get app component name\n"); + return PMINFO_R_ERROR; + } + manifest = pkgmgr_parser_get_manifest_file(pkgid); + if (manifest == NULL) { + _LOGE("Failed to fetch package manifest file\n"); + return PMINFO_R_ERROR; + } + mfx = pkgmgr_parser_process_manifest_xml(manifest); + if (mfx == NULL) { + _LOGE("Failed to parse package manifest file\n"); + FREE_AND_NULL(manifest); + return PMINFO_R_ERROR; + } + FREE_AND_NULL(manifest); + ptr = calloc(1, sizeof(pkgmgrinfo_appcontrol_x)); + if (ptr == NULL) { + _LOGE("Out of Memory!!!\n"); + pkgmgr_parser_free_manifest_xml(mfx); + return PMINFO_R_ERROR; + } + /*Get Operation, Uri, Mime*/ + if (mfx->uiapplication) { + if (mfx->uiapplication->appsvc) { + appsvc = mfx->uiapplication->appsvc; + } + } + + for (; appsvc; appsvc = appsvc->next) { + op = appsvc->operation; + for (; op; op = op->next) + oc = oc + 1; + op = appsvc->operation; + + ui = appsvc->uri; + for (; ui; ui = ui->next) + uc = uc + 1; + ui = appsvc->uri; + + mi = appsvc->mime; + for (; mi; mi = mi->next) + mc = mc + 1; + mi = appsvc->mime; + + sa = appsvc->subapp; + for (; sa; sa = sa->next) + sc = sc + 1; + sa = appsvc->subapp; + + operation = (char **)calloc(oc, sizeof(char *)); + if (operation == NULL) { + _LOGE("out of memory"); + break; + } + + for (i = 0; i < oc; i++) { + operation[i] = strndup(op->name, PKG_STRING_LEN_MAX - 1); + op = op->next; + } + + uri = (char **)calloc(uc, sizeof(char *)); + if (uri == NULL) { + _LOGE("out of memory"); + for (i = 0; i < oc; i++) { + FREE_AND_NULL(operation[i]); + } + FREE_AND_NULL(operation); + break; + } + + for (i = 0; i < uc; i++) { + uri[i] = strndup(ui->name, PKG_STRING_LEN_MAX - 1); + ui = ui->next; + } + + mime = (char **)calloc(mc, sizeof(char *)); + if (mime == NULL) { + _LOGE("out of memory"); + for (i = 0; i < uc; i++) { + FREE_AND_NULL(uri[i]); + } + FREE_AND_NULL(uri); + for (i = 0; i < oc; i++) { + FREE_AND_NULL(operation[i]); + } + FREE_AND_NULL(operation); + break; + } + + for (i = 0; i < mc; i++) { + mime[i] = strndup(mi->name, PKG_STRING_LEN_MAX - 1); + mi = mi->next; + } + + subapp = (char **)calloc(sc, sizeof(char *)); + if (subapp == NULL) { + _LOGE("out of memory"); + for (i = 0; i < mc; i++) { + FREE_AND_NULL(mime[i]); + } + FREE_AND_NULL(mime); + for (i = 0; i < uc; i++) { + FREE_AND_NULL(uri[i]); + } + FREE_AND_NULL(uri); + for (i = 0; i < oc; i++) { + FREE_AND_NULL(operation[i]); + } + FREE_AND_NULL(operation); + break; + } + + for (i = 0; i < sc; i++) { + subapp[i] = strndup(sa->name, PKG_STRING_LEN_MAX - 1); + sa = sa->next; + } + + /*populate appcontrol handle*/ + ptr->operation_count = oc; + ptr->uri_count = uc; + ptr->mime_count = mc; + ptr->subapp_count = sc; + ptr->operation = operation; + ptr->uri = uri; + ptr->mime = mime; + ptr->subapp = subapp; + + ret = appcontrol_func((void *)ptr, user_data); + for (i = 0; i < oc; i++) { + FREE_AND_NULL(operation[i]); + } + FREE_AND_NULL(operation); + for (i = 0; i < uc; i++) { + FREE_AND_NULL(uri[i]); + } + FREE_AND_NULL(uri); + for (i = 0; i < mc; i++) { + FREE_AND_NULL(mime[i]); + } + FREE_AND_NULL(mime); + for (i = 0; i < sc; i++) { + FREE_AND_NULL(subapp[i]); + } + FREE_AND_NULL(subapp); + if (ret < 0) + break; + uc = 0; + mc = 0; + oc = 0; + sc = 0; + } + pkgmgr_parser_free_manifest_xml(mfx); + FREE_AND_NULL(ptr); + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_is_nodisplay(pkgmgrinfo_appinfo_h handle, bool *nodisplay) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(nodisplay == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + char *val = NULL; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + val = (char *)info->uiapp_info->nodisplay; + if (val) { + if (strcasecmp(val, "true") == 0) + *nodisplay = 1; + else if (strcasecmp(val, "false") == 0) + *nodisplay = 0; + else + *nodisplay = 0; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_is_multiple(pkgmgrinfo_appinfo_h handle, bool *multiple) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(multiple == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + char *val = NULL; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + val = (char *)info->uiapp_info->multiple; + if (val) { + if (strcasecmp(val, "true") == 0) + *multiple = 1; + else if (strcasecmp(val, "false") == 0) + *multiple = 0; + else + *multiple = 0; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_is_indicator_display_allowed(pkgmgrinfo_appinfo_h handle, bool *indicator_disp) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(indicator_disp == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + char *val = NULL; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + val = (char *)info->uiapp_info->indicatordisplay; + if (val) { + if (strcasecmp(val, "true") == 0){ + *indicator_disp = 1; + }else if (strcasecmp(val, "false") == 0){ + *indicator_disp = 0; + }else{ + *indicator_disp = 0; + } + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_is_taskmanage(pkgmgrinfo_appinfo_h handle, bool *taskmanage) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(taskmanage == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + char *val = NULL; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + val = (char *)info->uiapp_info->taskmanage; + if (val) { + if (strcasecmp(val, "true") == 0) + *taskmanage = 1; + else if (strcasecmp(val, "false") == 0) + *taskmanage = 0; + else + *taskmanage = 0; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_is_enabled(pkgmgrinfo_appinfo_h handle, bool *enabled) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(enabled == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + int ret = 0; + char *val = NULL; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + + ret = __sat_ui_is_enabled((char *)info->uiapp_info->appid, enabled); + retvm_if(ret == PMINFO_R_OK, PMINFO_R_OK, "sat ui(%s) is enabled", (char *)info->uiapp_info->appid); + + val = (char *)info->uiapp_info->enabled; + + if (val) { + if (strcasecmp(val, "true") == 0) + *enabled = 1; + else if (strcasecmp(val, "false") == 0) + *enabled = 0; + else + *enabled = 1; + } + return PMINFO_R_OK; + +} + +API int pkgmgrinfo_appinfo_is_onboot(pkgmgrinfo_appinfo_h handle, bool *onboot) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(onboot == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + char *val = NULL; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + + val = (char *)info->uiapp_info->onboot; + + if (val) { + if (strcasecmp(val, "true") == 0) + *onboot = 1; + else if (strcasecmp(val, "false") == 0) + *onboot = 0; + else + *onboot = 0; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_is_autorestart(pkgmgrinfo_appinfo_h handle, bool *autorestart) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(autorestart == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + char *val = NULL; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + + val = (char *)info->uiapp_info->autorestart; + + if (val) { + if (strcasecmp(val, "true") == 0) + *autorestart = 1; + else if (strcasecmp(val, "false") == 0) + *autorestart = 0; + else + *autorestart = 0; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_is_mainapp(pkgmgrinfo_appinfo_h handle, bool *mainapp) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(mainapp == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + char *val = NULL; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + val = (char *)info->uiapp_info->mainapp; + if (val) { + if (strcasecmp(val, "true") == 0) + *mainapp = 1; + else if (strcasecmp(val, "false") == 0) + *mainapp = 0; + else + *mainapp = 0; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_is_preload(pkgmgrinfo_appinfo_h handle, bool *preload) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL\n"); + retvm_if(preload == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + char *val = NULL; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + val = (char *)info->uiapp_info->preload; + if (val) { + if (strcasecmp(val, "true") == 0) + *preload = 1; + else if (strcasecmp(val, "false") == 0) + *preload = 0; + else + *preload = 0; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_is_submode(pkgmgrinfo_appinfo_h handle, bool *submode) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL\n"); + retvm_if(submode == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + char *val = NULL; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + val = (char *)info->uiapp_info->submode; + if (val) { + if (strcasecmp(val, "true") == 0) + *submode = 1; + else if (strcasecmp(val, "false") == 0) + *submode = 0; + else + *submode = 0; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_is_process_pool(pkgmgrinfo_appinfo_h handle, bool *process_pool) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL\n"); + retvm_if(process_pool == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + char *val = NULL; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + val = (char *)info->uiapp_info->process_pool; + if (val) { + if (strcasecmp(val, "true") == 0) + *process_pool = 1; + else if (strcasecmp(val, "false") == 0) + *process_pool = 0; + else + *process_pool = 0; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_is_category_exist(pkgmgrinfo_appinfo_h handle, const char *category, bool *exist) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + retvm_if(category == NULL, PMINFO_R_EINVAL, "category is NULL"); + retvm_if(exist == NULL, PMINFO_R_EINVAL, "exist is NULL"); + + category_x *ptr = NULL; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + + *exist = 0; + + ptr = info->uiapp_info->category; + + for (; ptr; ptr = ptr->next) { + if (ptr->name) { + if (strcasecmp(ptr->name, category) == 0) + { + *exist = 1; + break; + } + } + } + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_is_multi_instance(pkgmgrinfo_appinfo_h handle, bool *multi_instance) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL\n"); + retvm_if(multi_instance == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + char *val = NULL; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + val = (char *)info->uiapp_info->multi_instance; + if (val) { + if (strcasecmp(val, "true") == 0) + *multi_instance = 1; + else if (strcasecmp(val, "false") == 0) + *multi_instance = 0; + else + *multi_instance = 0; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_is_multi_window(pkgmgrinfo_appinfo_h handle, bool *multi_window) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL\n"); + retvm_if(multi_window == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + char *val = NULL; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + val = (char *)info->uiapp_info->multi_window; + if (val) { + if (strcasecmp(val, "true") == 0) + *multi_window = 1; + else if (strcasecmp(val, "false") == 0) + *multi_window = 0; + else + *multi_window = 0; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_is_support_disable(pkgmgrinfo_appinfo_h handle, bool *support_disable) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL\n"); + retvm_if(support_disable == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + char *val = NULL; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + val = (char *)info->uiapp_info->support_disable; + if (val) { + if (strcasecmp(val, "true") == 0) + *support_disable = 1; + else if (strcasecmp(val, "false") == 0) + *support_disable = 0; + else + *support_disable = 0; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_is_ui_gadget(pkgmgrinfo_appinfo_h handle, bool *ui_gadget) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL\n"); + retvm_if(ui_gadget == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + char *val = NULL; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + val = (char *)info->uiapp_info->ui_gadget; + if (val) { + if (strcasecmp(val, "true") == 0) + *ui_gadget = 1; + else if (strcasecmp(val, "false") == 0) + *ui_gadget = 0; + else + *ui_gadget = 0; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_is_removable(pkgmgrinfo_appinfo_h handle, bool *removable) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL\n"); + retvm_if(removable == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + char *val = NULL; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + val = (char *)info->uiapp_info->removable; + if (val) { + if (strcasecmp(val, "true") == 0) + *removable = 1; + else if (strcasecmp(val, "false") == 0) + *removable = 0; + else + *removable = 0; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_is_system(pkgmgrinfo_appinfo_h handle, bool *system) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL\n"); + retvm_if(system == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + char *val = NULL; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + val = (char *)info->uiapp_info->package_system; + if (val) { + if (strcasecmp(val, "true") == 0) + *system = 1; + else if (strcasecmp(val, "false") == 0) + *system = 0; + else + *system = 0; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo_h handle) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL"); + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + __cleanup_appinfo(info); + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_filter_create(pkgmgrinfo_appinfo_filter_h *handle) +{ + return (pkgmgrinfo_pkginfo_filter_create(handle)); +} + +API int pkgmgrinfo_appinfo_filter_destroy(pkgmgrinfo_appinfo_filter_h handle) +{ + return (pkgmgrinfo_pkginfo_filter_destroy(handle)); +} + +API int pkgmgrinfo_appinfo_filter_add_int(pkgmgrinfo_appinfo_filter_h handle, + const char *property, const int value) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n"); + retvm_if(property == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n"); + char buf[PKG_VALUE_STRING_LEN_MAX] = {'\0'}; + char *val = NULL; + GSList *link = NULL; + int prop = -1; + prop = _pminfo_appinfo_convert_to_prop_int(property); + if (prop < E_PMINFO_APPINFO_PROP_APP_MIN_INT || + prop > E_PMINFO_APPINFO_PROP_APP_MAX_INT) { + _LOGE("Invalid Integer Property\n"); + return PMINFO_R_EINVAL; + } + pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x*)handle; + pkgmgrinfo_node_x *node = (pkgmgrinfo_node_x*)calloc(1, sizeof(pkgmgrinfo_node_x)); + if (node == NULL) { + _LOGE("Out of Memory!!!\n"); + return PMINFO_R_ERROR; + } + snprintf(buf, PKG_VALUE_STRING_LEN_MAX - 1, "%d", value); + val = strndup(buf, PKG_VALUE_STRING_LEN_MAX - 1); + if (val == NULL) { + _LOGE("Out of Memory\n"); + FREE_AND_NULL(node); + return PMINFO_R_ERROR; + } + node->prop = prop; + node->value = val; + /*If API is called multiple times for same property, we should override the previous values. + Last value set will be used for filtering.*/ + link = g_slist_find_custom(filter->list, (gconstpointer)node, __compare_func); + if (link) + filter->list = g_slist_delete_link(filter->list, link); + filter->list = g_slist_append(filter->list, (gpointer)node); + return PMINFO_R_OK; + +} + +API int pkgmgrinfo_appinfo_filter_add_bool(pkgmgrinfo_appinfo_filter_h handle, + const char *property, const bool value) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n"); + retvm_if(property == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n"); + char *val = NULL; + GSList *link = NULL; + int prop = -1; + prop = _pminfo_appinfo_convert_to_prop_bool(property); + if (prop < E_PMINFO_APPINFO_PROP_APP_MIN_BOOL || + prop > E_PMINFO_APPINFO_PROP_APP_MAX_BOOL) { + _LOGE("Invalid Boolean Property\n"); + return PMINFO_R_EINVAL; + } + pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x*)handle; + pkgmgrinfo_node_x *node = (pkgmgrinfo_node_x*)calloc(1, sizeof(pkgmgrinfo_node_x)); + if (node == NULL) { + _LOGE("Out of Memory!!!\n"); + return PMINFO_R_ERROR; + } + if (value) + val = strndup("('true','True')", 15); + else + val = strndup("('false','False')", 17); + if (val == NULL) { + _LOGE("Out of Memory\n"); + FREE_AND_NULL(node); + return PMINFO_R_ERROR; + } + node->prop = prop; + node->value = val; + /*If API is called multiple times for same property, we should override the previous values. + Last value set will be used for filtering.*/ + link = g_slist_find_custom(filter->list, (gconstpointer)node, __compare_func); + if (link) + filter->list = g_slist_delete_link(filter->list, link); + filter->list = g_slist_append(filter->list, (gpointer)node); + return PMINFO_R_OK; + +} + +API int pkgmgrinfo_appinfo_filter_add_string(pkgmgrinfo_appinfo_filter_h handle, + const char *property, const char *value) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n"); + retvm_if(property == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n"); + retvm_if(value == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n"); + char *val = NULL; + pkgmgrinfo_node_x *ptr = NULL; + char prev[PKG_STRING_LEN_MAX] = {'\0'}; + char temp[PKG_STRING_LEN_MAX] = {'\0'}; + GSList *link = NULL; + int prop = -1; + prop = _pminfo_appinfo_convert_to_prop_str(property); + if (prop < E_PMINFO_APPINFO_PROP_APP_MIN_STR || + prop > E_PMINFO_APPINFO_PROP_APP_MAX_STR) { + _LOGE("Invalid String Property\n"); + return PMINFO_R_EINVAL; + } + pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x*)handle; + pkgmgrinfo_node_x *node = (pkgmgrinfo_node_x*)calloc(1, sizeof(pkgmgrinfo_node_x)); + if (node == NULL) { + _LOGE("Out of Memory!!!\n"); + return PMINFO_R_ERROR; + } + node->prop = prop; + switch (prop) { + case E_PMINFO_APPINFO_PROP_APP_COMPONENT: + val = strndup("uiapp", PKG_STRING_LEN_MAX - 1); + node->value = val; + link = g_slist_find_custom(filter->list, (gconstpointer)node, __compare_func); + if (link) + filter->list = g_slist_delete_link(filter->list, link); + filter->list = g_slist_append(filter->list, (gpointer)node); + break; + case E_PMINFO_APPINFO_PROP_APP_CATEGORY: + case E_PMINFO_APPINFO_PROP_APP_OPERATION: + case E_PMINFO_APPINFO_PROP_APP_URI: + case E_PMINFO_APPINFO_PROP_APP_MIME: + val = (char *)calloc(1, PKG_STRING_LEN_MAX); + if (val == NULL) { + _LOGE("Out of Memory\n"); + FREE_AND_NULL(node); + return PMINFO_R_ERROR; + } + link = g_slist_find_custom(filter->list, (gconstpointer)node, __compare_func); + if (link) { + ptr = (pkgmgrinfo_node_x *)link->data; + strncpy(prev, ptr->value, PKG_STRING_LEN_MAX - 1); + _LOGS("Previous value is %s\n", prev); + filter->list = g_slist_delete_link(filter->list, link); + snprintf(temp, PKG_STRING_LEN_MAX - 1, "%s , '%s'", prev, value); + strncpy(val, temp, PKG_STRING_LEN_MAX - 1); + _LOGS("New value is %s\n", val); + node->value = val; + filter->list = g_slist_append(filter->list, (gpointer)node); + memset(temp, '\0', PKG_STRING_LEN_MAX); + } else { + snprintf(temp, PKG_STRING_LEN_MAX - 1, "'%s'", value); + strncpy(val, temp, PKG_STRING_LEN_MAX - 1); + _LOGS("First value is %s\n", val); + node->value = val; + filter->list = g_slist_append(filter->list, (gpointer)node); + memset(temp, '\0', PKG_STRING_LEN_MAX); + } + break; + default: + node->value = strndup(value, PKG_STRING_LEN_MAX - 1); + link = g_slist_find_custom(filter->list, (gconstpointer)node, __compare_func); + if (link) + filter->list = g_slist_delete_link(filter->list, link); + filter->list = g_slist_append(filter->list, (gpointer)node); + break; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_filter_count(pkgmgrinfo_appinfo_filter_h handle, int *count) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n"); + retvm_if(count == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n"); + + int ret = 0; + int filter_count = 0; + + char *locale = NULL; + char *condition = NULL; + char query[MAX_QUERY_LEN] = {'\0'}; + char where[MAX_QUERY_LEN] = {'\0'}; + + uiapplication_x *ptr1 = NULL; + pkgmgr_pkginfo_x *info = NULL; + pkgmgr_appinfo_x *appinfo = NULL; + pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x*)handle; + + sqlite3 *pkginfo_db = NULL; + sqlite3_stmt *stmt = NULL; + GSList *list; + + + /*open db*/ + ret = db_util_open(MANIFEST_DB, &pkginfo_db, 0); + retvm_if(ret != SQLITE_OK, PMINFO_R_ERROR, "db_util_open[%s] failed!", MANIFEST_DB); + + /*calloc*/ + info = (pkgmgr_pkginfo_x *)calloc(1, sizeof(pkgmgr_pkginfo_x)); + tryvm_if(info == NULL, ret = PMINFO_R_ERROR, "Out of Memory!!!\n"); + + info->manifest_info = (manifest_x *)calloc(1, sizeof(manifest_x)); + tryvm_if(info->manifest_info == NULL, ret = PMINFO_R_ERROR, "Out of Memory!!!\n"); + + appinfo = (pkgmgr_appinfo_x *)calloc(1, sizeof(pkgmgr_appinfo_x)); + tryvm_if(appinfo == NULL, ret = PMINFO_R_ERROR, "Out of Memory!!!\n"); + + /*Start constructing query*/ + locale = __convert_system_locale_to_manifest_locale(); + snprintf(query, MAX_QUERY_LEN - 1, FILTER_QUERY_COUNT_APP, locale); + + /*Get where clause*/ + for (list = filter->list; list; list = g_slist_next(list)) { + __get_filter_condition(list->data, &condition); + if (condition) { + strncat(where, condition, sizeof(where) - strlen(where) -1); + where[sizeof(where) - 1] = '\0'; + FREE_AND_NULL(condition); + } + if (g_slist_next(list)) { + strncat(where, " and ", sizeof(where) - strlen(where) - 1); + where[sizeof(where) - 1] = '\0'; + } + } + + if (strstr(where, "package_app_info.app_disable") == NULL) { + if (strlen(where) > 0) { + strncat(where, " and package_app_info.app_disable IN ('false','False')", sizeof(where) - strlen(where) - 1); + where[sizeof(where) - 1] = '\0'; + } + } + _LOGS("where = %s\n", where); + + if (strlen(where) > 0) { + strncat(query, where, sizeof(query) - strlen(query) - 1); + query[sizeof(query) - 1] = '\0'; + } + _LOGS("query = %s\n", query); + + /*prepare query*/ + ret = sqlite3_prepare_v2(pkginfo_db, query, strlen(query), &stmt, NULL); + tryvm_if(ret != PMINFO_R_OK, ret = PMINFO_R_ERROR, "sqlite3_prepare_v2 failed[%s]\n", query); + + /*step query*/ + while(1) { + ret = sqlite3_step(stmt); + if(ret == SQLITE_ROW) { + __get_appinfo_for_list(stmt, info); + } else { + break; + } + } + + /*head up*/ + SAFE_LISTHEAD(info->manifest_info->uiapplication, ptr1); + + /*If the callback func return < 0 we break and no more call back is called*/ + while(ptr1 != NULL) + { + appinfo->uiapp_info = ptr1; + ret = __appinfo_check_installed_storage(appinfo); + if(ret < 0) { + ptr1 = ptr1->next; + continue; + } + ptr1 = ptr1->next; + filter_count++; + } + + *count = filter_count; + + ret = PMINFO_R_OK; +catch: + FREE_AND_NULL(locale); + sqlite3_finalize(stmt); + sqlite3_close(pkginfo_db); + FREE_AND_NULL(appinfo); + __cleanup_pkginfo(info); + return ret; +} + +API int pkgmgrinfo_appinfo_filter_foreach_appinfo(pkgmgrinfo_appinfo_filter_h handle, + pkgmgrinfo_app_list_cb app_cb, void * user_data) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n"); + retvm_if(app_cb == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n"); + + int ret = 0; + + char *locale = NULL; + char *condition = NULL; + char query[MAX_QUERY_LEN] = {'\0'}; + char where[MAX_QUERY_LEN] = {'\0'}; + + char appid[MAX_QUERY_LEN] = {0,}; + char pre_appid[MAX_QUERY_LEN] = {0,}; + + pkgmgr_pkginfo_x *info = NULL; + pkgmgr_appinfo_x *appinfo = NULL; + pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x*)handle; + uiapplication_x *ptr1 = NULL; + + sqlite3 *pkginfo_db = NULL; + sqlite3_stmt *stmt = NULL; + GSList *list; + + /*open db*/ + ret = db_util_open(MANIFEST_DB, &pkginfo_db, 0); + retvm_if(ret != SQLITE_OK, PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB); + + /*calloc*/ + info = (pkgmgr_pkginfo_x *)calloc(1, sizeof(pkgmgr_pkginfo_x)); + tryvm_if(info == NULL, ret = PMINFO_R_ERROR, "Out of Memory!!!\n"); + + info->manifest_info = (manifest_x *)calloc(1, sizeof(manifest_x)); + tryvm_if(info->manifest_info == NULL, ret = PMINFO_R_ERROR, "Out of Memory!!!\n"); + + appinfo = (pkgmgr_appinfo_x *)calloc(1, sizeof(pkgmgr_appinfo_x)); + tryvm_if(appinfo == NULL, ret = PMINFO_R_ERROR, "Out of Memory!!!\n"); + + /*Start constructing query*/ + locale = __convert_system_locale_to_manifest_locale(); + tryvm_if(locale == NULL, ret = PMINFO_R_ERROR, "locale is NULL\n"); + snprintf(query, MAX_QUERY_LEN - 1, FILTER_QUERY_LIST_APP, DEFAULT_LOCALE, locale); + + /*Get where clause*/ + for (list = filter->list; list; list = g_slist_next(list)) { + __get_filter_condition(list->data, &condition); + if (condition) { + strncat(where, condition, sizeof(where) - strlen(where) -1); + where[sizeof(where) - 1] = '\0'; + FREE_AND_NULL(condition); + } + if (g_slist_next(list)) { + strncat(where, " and ", sizeof(where) - strlen(where) - 1); + where[sizeof(where) - 1] = '\0'; + } + } + + if (strstr(where, "package_app_info.app_disable") == NULL) { + if (strlen(where) > 0) { + strncat(where, " and package_app_info.app_disable IN ('false','False')", sizeof(where) - strlen(where) - 1); + where[sizeof(where) - 1] = '\0'; + } + } + + _LOGS("where = %s\n", where); + + if (strlen(where) > 0) { + strncat(query, where, sizeof(query) - strlen(query) - 1); + query[sizeof(query) - 1] = '\0'; + } + _LOGS("query = %s\n", query); + + /*prepare query*/ + ret = sqlite3_prepare_v2(pkginfo_db, query, strlen(query), &stmt, NULL); + tryvm_if(ret != PMINFO_R_OK, ret = PMINFO_R_ERROR, "sqlite3_prepare_v2 failed[%s]\n", query); + + /*step query*/ + while(1) { + ret = sqlite3_step(stmt); + if(ret == SQLITE_ROW) { + + memset(appid, 0, MAX_QUERY_LEN); + strncpy(appid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + + if (strlen(pre_appid) != 0) { + if (strcmp(pre_appid, appid) == 0) { + /*if same appid is found, then it is about exact matched locale*/ + __update_localed_label_for_list(stmt, info); + + memset(pre_appid, 0, MAX_QUERY_LEN); + strncpy(pre_appid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + + continue; + } else { + memset(pre_appid, 0, MAX_QUERY_LEN); + strncpy(pre_appid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + } + } else { + strncpy(pre_appid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + } + + __get_appinfo_for_list(stmt, info); + } else { + break; + } + } + + /*head up*/ + SAFE_LISTHEAD(info->manifest_info->uiapplication, ptr1); + + /*If the callback func return < 0 we break and no more call back is called*/ + while(ptr1 != NULL) + { + appinfo->locale = strdup(locale); + appinfo->uiapp_info = ptr1; + + ret = __appinfo_check_installed_storage(appinfo); + if(ret < 0) { + FREE_AND_NULL(appinfo->locale); + ptr1 = ptr1->next; + continue; + } + + ret = app_cb((void *)appinfo, user_data); + if (ret < 0){ + FREE_AND_NULL(appinfo->locale); + break; + } + + FREE_AND_NULL(appinfo->locale); + ptr1 = ptr1->next; + } + ret = PMINFO_R_OK; + +catch: + FREE_AND_NULL(locale); + sqlite3_finalize(stmt); + sqlite3_close(pkginfo_db); + FREE_AND_NULL(appinfo); + __cleanup_pkginfo(info); + return ret; +} + +API int pkgmgrinfo_appinfo_metadata_filter_create(pkgmgrinfo_appinfo_metadata_filter_h *handle) +{ + return (pkgmgrinfo_pkginfo_filter_create(handle)); +} + +API int pkgmgrinfo_appinfo_metadata_filter_destroy(pkgmgrinfo_appinfo_metadata_filter_h handle) +{ + return (pkgmgrinfo_pkginfo_filter_destroy(handle)); +} + +API int pkgmgrinfo_appinfo_metadata_filter_add(pkgmgrinfo_appinfo_metadata_filter_h handle, + const char *key, const char *value) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "filter handle is NULL\n"); + retvm_if(key == NULL, PMINFO_R_EINVAL, "metadata key supplied is NULL\n"); + /*value can be NULL. In that case all apps with specified key should be displayed*/ + int ret = 0; + char *k = NULL; + char *v = NULL; + pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x*)handle; + pkgmgrinfo_node_x *node = (pkgmgrinfo_node_x*)calloc(1, sizeof(pkgmgrinfo_node_x)); + retvm_if(node == NULL, PMINFO_R_ERROR, "Out of Memory!!!\n"); + k = strdup(key); + tryvm_if(k == NULL, ret = PMINFO_R_ERROR, "Out of Memory!!!\n"); + node->key = k; + if (value) { + v = strdup(value); + tryvm_if(v == NULL, ret = PMINFO_R_ERROR, "Out of Memory!!!\n"); + } + node->value = v; + /*If API is called multiple times, we should OR all conditions.*/ + filter->list = g_slist_append(filter->list, (gpointer)node); + /*All memory will be freed in destroy API*/ + return PMINFO_R_OK; +catch: + if (node) { + FREE_AND_NULL(node->key); + FREE_AND_NULL(node->value); + FREE_AND_NULL(node); + } + return ret; +} + +API int pkgmgrinfo_appinfo_metadata_filter_foreach(pkgmgrinfo_appinfo_metadata_filter_h handle, + pkgmgrinfo_app_list_cb app_cb, void *user_data) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "filter handle is NULL\n"); + retvm_if(app_cb == NULL, PMINFO_R_EINVAL, "Callback function supplied is NULL\n"); + char *locale = NULL; + char *condition = NULL; + char query[MAX_QUERY_LEN] = {'\0'}; + char where[MAX_QUERY_LEN] = {'\0'}; + char appid[MAX_QUERY_LEN] = {0,}; + char pre_appid[MAX_QUERY_LEN] = {0,}; + GSList *list; + int ret = 0; + pkgmgr_pkginfo_x *info = NULL; + pkgmgr_appinfo_x *appinfo = NULL; + uiapplication_x *ptr1 = NULL; + pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x*)handle; + sqlite3 *pkginfo_db = NULL; + sqlite3_stmt *stmt = NULL; + + /*open db*/ + ret = db_util_open(MANIFEST_DB, &pkginfo_db, 0); + retvm_if(ret != SQLITE_OK, PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB); + + /*calloc*/ + info = (pkgmgr_pkginfo_x *)calloc(1, sizeof(pkgmgr_pkginfo_x)); + tryvm_if(info == NULL, ret = PMINFO_R_ERROR, "Out of Memory!!!\n"); + + info->manifest_info = (manifest_x *)calloc(1, sizeof(manifest_x)); + tryvm_if(info->manifest_info == NULL, ret = PMINFO_R_ERROR, "Out of Memory!!!\n"); + + appinfo = (pkgmgr_appinfo_x *)calloc(1, sizeof(pkgmgr_appinfo_x)); + tryvm_if(appinfo == NULL, ret = PMINFO_R_ERROR, "Out of Memory!!!\n"); + + /*Get current locale*/ + locale = __convert_system_locale_to_manifest_locale(); + tryvm_if(locale == NULL, ret = PMINFO_R_ERROR, "manifest locale is NULL\n"); + + /*Start constructing query*/ + memset(where, '\0', MAX_QUERY_LEN); + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN - 1, METADATA_FILTER_QUERY_SELECT_CLAUSE); + + /*Get where clause*/ + for (list = filter->list; list; list = g_slist_next(list)) { + __get_metadata_filter_condition(list->data, &condition); + if (condition) { + strncat(where, condition, sizeof(where) - strlen(where) -1); + FREE_AND_NULL(condition); + } + if (g_slist_next(list)) { + strncat(where, METADATA_FILTER_QUERY_UNION_CLAUSE, sizeof(where) - strlen(where) - 1); + } + } + + if (strstr(where, "package_app_info.app_disable") == NULL) { + if (strlen(where) > 0) { + strncat(where, " and package_app_info.app_disable IN ('false','False')", sizeof(where) - strlen(where) - 1); + where[sizeof(where) - 1] = '\0'; + } + } + + _LOGE("where = %s (%d)\n", where, strlen(where)); + + if (strlen(where) > 0) { + strncat(query, where, sizeof(query) - strlen(query) - 1); + } + _LOGE("query = %s (%d)\n", query, strlen(query)); + + /*prepare query*/ + ret = sqlite3_prepare_v2(pkginfo_db, query, strlen(query), &stmt, NULL); + tryvm_if(ret != PMINFO_R_OK, ret = PMINFO_R_ERROR, "sqlite3_prepare_v2 failed[%s]\n", query); + + /*step query*/ + while(1) { + ret = sqlite3_step(stmt); + if(ret == SQLITE_ROW) { + + memset(appid, 0, MAX_QUERY_LEN); + strncpy(appid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + + if (strlen(pre_appid) != 0) { + if (strcmp(pre_appid, appid) == 0) { + /*if same appid is found, then it is about exact matched locale*/ + __update_localed_label_for_list(stmt, info); + + memset(pre_appid, 0, MAX_QUERY_LEN); + strncpy(pre_appid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + + continue; + } else { + memset(pre_appid, 0, MAX_QUERY_LEN); + strncpy(pre_appid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + } + } else { + strncpy(pre_appid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + } + + __get_appinfo_for_list(stmt, info); + } else { + break; + } + } + + /*head up*/ + SAFE_LISTHEAD(info->manifest_info->uiapplication, ptr1); + + /*UI Apps*/ + while (ptr1 != NULL) { + appinfo->locale = strdup(locale); + appinfo->uiapp_info = ptr1; + + ret = __appinfo_check_installed_storage(appinfo); + if(ret < 0) { + FREE_AND_NULL(appinfo->locale); + ptr1 = ptr1->next; + continue; + } + + ret = app_cb((void *)appinfo, user_data); + if (ret < 0) { + FREE_AND_NULL(appinfo->locale); + break; + } + + FREE_AND_NULL(appinfo->locale); + ptr1 = ptr1->next; + } + + ret = PMINFO_R_OK; +catch: + FREE_AND_NULL(locale); + sqlite3_finalize(stmt); + sqlite3_close(pkginfo_db); + FREE_AND_NULL(appinfo); + __cleanup_pkginfo(info); + return ret; +} diff --git a/src/pkgmgrinfo_basic.c b/src/pkgmgrinfo_basic.c new file mode 100644 index 0000000..5d1c796 --- /dev/null +++ b/src/pkgmgrinfo_basic.c @@ -0,0 +1,772 @@ +/* + * pkgmgrinfo-basic + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Junsuk Oh , + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include + +#include "pkgmgrinfo_basic.h" +#include "pkgmgrinfo_private.h" +#include + +#define HASH_LEN MD5_DIGEST_LENGTH * 2 + + +static void __ps_free_category(category_x *category) +{ + if (category == NULL) + return; + FREE_AND_NULL(category->name); + FREE_AND_NULL(category); +} + +static void __ps_free_privilege(privilege_x *privilege) +{ + if (privilege == NULL) + return; + FREE_AND_NULL(privilege->text); + FREE_AND_NULL(privilege); +} + +static void __ps_free_privileges(privileges_x *privileges) +{ + if (privileges == NULL) + return; + /*Free Privilege*/ + if (privileges->privilege) { + privilege_x *privilege = privileges->privilege; + privilege_x *tmp = NULL; + while(privilege != NULL) { + tmp = privilege->next; + __ps_free_privilege(privilege); + privilege = tmp; + } + } + FREE_AND_NULL(privileges); +} + +static void __ps_free_metadata(metadata_x *metadata) +{ + if (metadata == NULL) + return; + FREE_AND_NULL(metadata->key); + FREE_AND_NULL(metadata->value); + FREE_AND_NULL(metadata); +} + +static void __ps_free_permission(permission_x *permission) +{ + if (permission == NULL) + return; + FREE_AND_NULL(permission->type); + FREE_AND_NULL(permission->value); + FREE_AND_NULL(permission); +} + +static void __ps_free_icon(icon_x *icon) +{ + if (icon == NULL) + return; + FREE_AND_NULL(icon->text); + FREE_AND_NULL(icon->lang); + FREE_AND_NULL(icon->name); + FREE_AND_NULL(icon->section); + FREE_AND_NULL(icon->size); + FREE_AND_NULL(icon->resolution); + FREE_AND_NULL(icon); +} + +static void __ps_free_image(image_x *image) +{ + if (image == NULL) + return; + FREE_AND_NULL(image->text); + FREE_AND_NULL(image->lang); + FREE_AND_NULL(image->name); + FREE_AND_NULL(image->section); + FREE_AND_NULL(image); +} + +static void __ps_free_operation(operation_x *operation) +{ + if (operation == NULL) + return; + FREE_AND_NULL(operation->text); + FREE_AND_NULL(operation); +} + +static void __ps_free_uri(uri_x *uri) +{ + if (uri == NULL) + return; + FREE_AND_NULL(uri->text); + FREE_AND_NULL(uri); +} + +static void __ps_free_mime(mime_x *mime) +{ + if (mime == NULL) + return; + FREE_AND_NULL(mime->text); + FREE_AND_NULL(mime); +} + +static void __ps_free_subapp(subapp_x *subapp) +{ + if (subapp == NULL) + return; + FREE_AND_NULL(subapp->text); + FREE_AND_NULL(subapp); +} + +static void __ps_free_condition(condition_x *condition) +{ + if (condition == NULL) + return; + FREE_AND_NULL(condition->text); + FREE_AND_NULL(condition->name); + FREE_AND_NULL(condition); +} + +static void __ps_free_notification(notification_x *notification) +{ + if (notification == NULL) + return; + FREE_AND_NULL(notification->text); + FREE_AND_NULL(notification->name); + FREE_AND_NULL(notification); +} + +static void __ps_free_compatibility(compatibility_x *compatibility) +{ + if (compatibility == NULL) + return; + FREE_AND_NULL(compatibility->text); + FREE_AND_NULL(compatibility->name); + FREE_AND_NULL(compatibility); +} + +static void __ps_free_allowed(allowed_x *allowed) +{ + if (allowed == NULL) + return; + FREE_AND_NULL(allowed->name); + FREE_AND_NULL(allowed->text); + FREE_AND_NULL(allowed); +} + +static void __ps_free_request(request_x *request) +{ + if (request == NULL) + return; + FREE_AND_NULL(request->text); + FREE_AND_NULL(request); +} + +static void __ps_free_datacontrol(datacontrol_x *datacontrol) +{ + if (datacontrol == NULL) + return; + FREE_AND_NULL(datacontrol->providerid); + FREE_AND_NULL(datacontrol->access); + FREE_AND_NULL(datacontrol->type); + FREE_AND_NULL(datacontrol); +} + +static void __ps_free_launchconditions(launchconditions_x *launchconditions) +{ + if (launchconditions == NULL) + return; + FREE_AND_NULL(launchconditions->text); + /*Free Condition*/ + if (launchconditions->condition) { + condition_x *condition = launchconditions->condition; + condition_x *tmp = NULL; + while(condition != NULL) { + tmp = condition->next; + __ps_free_condition(condition); + condition = tmp; + } + } + FREE_AND_NULL(launchconditions); +} + +static void __ps_free_appsvc(appsvc_x *appsvc) +{ + if (appsvc == NULL) + return; + FREE_AND_NULL(appsvc->text); + /*Free Operation*/ + if (appsvc->operation) { + operation_x *operation = appsvc->operation; + operation_x *tmp = NULL; + while(operation != NULL) { + tmp = operation->next; + __ps_free_operation(operation); + operation = tmp; + } + } + /*Free Uri*/ + if (appsvc->uri) { + uri_x *uri = appsvc->uri; + uri_x *tmp = NULL; + while(uri != NULL) { + tmp = uri->next; + __ps_free_uri(uri); + uri = tmp; + } + } + /*Free Mime*/ + if (appsvc->mime) { + mime_x *mime = appsvc->mime; + mime_x *tmp = NULL; + while(mime != NULL) { + tmp = mime->next; + __ps_free_mime(mime); + mime = tmp; + } + } + /*Free subapp*/ + if (appsvc->subapp) { + subapp_x *subapp = appsvc->subapp; + subapp_x *tmp = NULL; + while(subapp != NULL) { + tmp = subapp->next; + __ps_free_subapp(subapp); + subapp = tmp; + } + } + FREE_AND_NULL(appsvc); +} + +static void __ps_free_deviceprofile(deviceprofile_x *deviceprofile) +{ + return; +} + +static void __ps_free_define(define_x *define) +{ + if (define == NULL) + return; + FREE_AND_NULL(define->path); + /*Free Request*/ + if (define->request) { + request_x *request = define->request; + request_x *tmp = NULL; + while(request != NULL) { + tmp = request->next; + __ps_free_request(request); + request = tmp; + } + } + /*Free Allowed*/ + if (define->allowed) { + allowed_x *allowed = define->allowed; + allowed_x *tmp = NULL; + while(allowed != NULL) { + tmp = allowed->next; + __ps_free_allowed(allowed); + allowed = tmp; + } + } + FREE_AND_NULL(define); +} + +static void __ps_free_datashare(datashare_x *datashare) +{ + if (datashare == NULL) + return; + /*Free Define*/ + if (datashare->define) { + define_x *define = datashare->define; + define_x *tmp = NULL; + while(define != NULL) { + tmp = define->next; + __ps_free_define(define); + define = tmp; + } + } + /*Free Request*/ + if (datashare->request) { + request_x *request = datashare->request; + request_x *tmp = NULL; + while(request != NULL) { + tmp = request->next; + __ps_free_request(request); + request = tmp; + } + } + FREE_AND_NULL(datashare); +} + +static void __ps_free_label(label_x *label) +{ + if (label == NULL) + return; + FREE_AND_NULL(label->name); + FREE_AND_NULL(label->text); + FREE_AND_NULL(label->lang); + FREE_AND_NULL(label); +} + +static void __ps_free_author(author_x *author) +{ + if (author == NULL) + return; + FREE_AND_NULL(author->email); + FREE_AND_NULL(author->text); + FREE_AND_NULL(author->href); + FREE_AND_NULL(author->lang); + FREE_AND_NULL(author); +} + +static void __ps_free_description(description_x *description) +{ + if (description == NULL) + return; + FREE_AND_NULL(description->name); + FREE_AND_NULL(description->text); + FREE_AND_NULL(description->lang); + FREE_AND_NULL(description); +} + +static void __ps_free_license(license_x *license) +{ + if (license == NULL) + return; + FREE_AND_NULL(license->text); + FREE_AND_NULL(license->lang); + FREE_AND_NULL(license); +} + +static void __ps_free_uiapplication(uiapplication_x *uiapplication) +{ + if (uiapplication == NULL) + return; + FREE_AND_NULL(uiapplication->exec); + FREE_AND_NULL(uiapplication->ambient_support); + FREE_AND_NULL(uiapplication->appid); + FREE_AND_NULL(uiapplication->nodisplay); + FREE_AND_NULL(uiapplication->multiple); + FREE_AND_NULL(uiapplication->type); + FREE_AND_NULL(uiapplication->categories); + FREE_AND_NULL(uiapplication->extraid); + FREE_AND_NULL(uiapplication->taskmanage); + FREE_AND_NULL(uiapplication->enabled); + FREE_AND_NULL(uiapplication->hwacceleration); + FREE_AND_NULL(uiapplication->screenreader); + FREE_AND_NULL(uiapplication->mainapp); + FREE_AND_NULL(uiapplication->recentimage); + FREE_AND_NULL(uiapplication->package); + FREE_AND_NULL(uiapplication->launchcondition); + FREE_AND_NULL(uiapplication->multi_instance); + FREE_AND_NULL(uiapplication->multi_instance_mainid); + FREE_AND_NULL(uiapplication->multi_window); + FREE_AND_NULL(uiapplication->support_disable); + FREE_AND_NULL(uiapplication->ui_gadget); + FREE_AND_NULL(uiapplication->removable); + FREE_AND_NULL(uiapplication->support_mode); + FREE_AND_NULL(uiapplication->support_feature); + FREE_AND_NULL(uiapplication->satui_label); + FREE_AND_NULL(uiapplication->package_type); + FREE_AND_NULL(uiapplication->package_system); + FREE_AND_NULL(uiapplication->package_installed_time); + + /*Free Label*/ + if (uiapplication->label) { + label_x *label = uiapplication->label; + label_x *tmp = NULL; + while(label != NULL) { + tmp = label->next; + __ps_free_label(label); + label = tmp; + } + } + /*Free Icon*/ + if (uiapplication->icon) { + icon_x *icon = uiapplication->icon; + icon_x *tmp = NULL; + while(icon != NULL) { + tmp = icon->next; + __ps_free_icon(icon); + icon = tmp; + } + } + /*Free image*/ + if (uiapplication->image) { + image_x *image = uiapplication->image; + image_x *tmp = NULL; + while(image != NULL) { + tmp = image->next; + __ps_free_image(image); + image = tmp; + } + } + /*Free LaunchConditions*/ + if (uiapplication->launchconditions) { + launchconditions_x *launchconditions = uiapplication->launchconditions; + launchconditions_x *tmp = NULL; + while(launchconditions != NULL) { + tmp = launchconditions->next; + __ps_free_launchconditions(launchconditions); + launchconditions = tmp; + } + } + /*Free Notification*/ + if (uiapplication->notification) { + notification_x *notification = uiapplication->notification; + notification_x *tmp = NULL; + while(notification != NULL) { + tmp = notification->next; + __ps_free_notification(notification); + notification = tmp; + } + } + /*Free DataShare*/ + if (uiapplication->datashare) { + datashare_x *datashare = uiapplication->datashare; + datashare_x *tmp = NULL; + while(datashare != NULL) { + tmp = datashare->next; + __ps_free_datashare(datashare); + datashare = tmp; + } + } + /*Free AppSvc*/ + if (uiapplication->appsvc) { + appsvc_x *appsvc = uiapplication->appsvc; + appsvc_x *tmp = NULL; + while(appsvc != NULL) { + tmp = appsvc->next; + __ps_free_appsvc(appsvc); + appsvc = tmp; + } + } + /*Free Category*/ + if (uiapplication->category) { + category_x *category = uiapplication->category; + category_x *tmp = NULL; + while(category != NULL) { + tmp = category->next; + __ps_free_category(category); + category = tmp; + } + } + /*Free Metadata*/ + if (uiapplication->metadata) { + metadata_x *metadata = uiapplication->metadata; + metadata_x *tmp = NULL; + while(metadata != NULL) { + tmp = metadata->next; + __ps_free_metadata(metadata); + metadata = tmp; + } + } + /*Free permission*/ + if (uiapplication->permission) { + permission_x *permission = uiapplication->permission; + permission_x *tmp = NULL; + while(permission != NULL) { + tmp = permission->next; + __ps_free_permission(permission); + permission = tmp; + } + } + + /*Free datacontrol*/ + if (uiapplication->datacontrol) { + datacontrol_x *datacontrol = uiapplication->datacontrol; + datacontrol_x *tmp = NULL; + while(datacontrol != NULL) { + tmp = datacontrol->next; + __ps_free_datacontrol(datacontrol); + datacontrol = tmp; + } + } + + /* _PRODUCT_LAUNCHING_ENHANCED_ START */ + FREE_AND_NULL(uiapplication->indicatordisplay); + FREE_AND_NULL(uiapplication->portraitimg); + FREE_AND_NULL(uiapplication->landscapeimg); + FREE_AND_NULL(uiapplication->effectimage_type); + /* _PRODUCT_LAUNCHING_ENHANCED_ END */ + FREE_AND_NULL(uiapplication->guestmode_visibility); + FREE_AND_NULL(uiapplication->app_component); + FREE_AND_NULL(uiapplication->permission_type); + FREE_AND_NULL(uiapplication->component_type); + FREE_AND_NULL(uiapplication->preload); + FREE_AND_NULL(uiapplication->submode); + FREE_AND_NULL(uiapplication->submode_mainid); + FREE_AND_NULL(uiapplication->installed_storage); + FREE_AND_NULL(uiapplication->process_pool); + FREE_AND_NULL(uiapplication->autorestart); + FREE_AND_NULL(uiapplication->onboot); + + FREE_AND_NULL(uiapplication); +} + +static void __ps_free_font(font_x *font) +{ + if (font == NULL) + return; + FREE_AND_NULL(font->name); + FREE_AND_NULL(font->text); + FREE_AND_NULL(font); +} + +static void __ps_free_theme(theme_x *theme) +{ + if (theme == NULL) + return; + FREE_AND_NULL(theme->name); + FREE_AND_NULL(theme->text); + FREE_AND_NULL(theme); +} + +static void __ps_free_daemon(daemon_x *daemon) +{ + if (daemon == NULL) + return; + FREE_AND_NULL(daemon->name); + FREE_AND_NULL(daemon->text); + FREE_AND_NULL(daemon); +} + +static void __ps_free_ime(ime_x *ime) +{ + if (ime == NULL) + return; + FREE_AND_NULL(ime->name); + FREE_AND_NULL(ime->text); + FREE_AND_NULL(ime); +} + +API void _pkgmgrinfo_basic_free_manifest_x(manifest_x *mfx) +{ + if (mfx == NULL) + return; + FREE_AND_NULL(mfx->ns); + FREE_AND_NULL(mfx->package); + FREE_AND_NULL(mfx->version); + FREE_AND_NULL(mfx->installlocation); + FREE_AND_NULL(mfx->preload); + FREE_AND_NULL(mfx->readonly); + FREE_AND_NULL(mfx->removable); + FREE_AND_NULL(mfx->update); + FREE_AND_NULL(mfx->system); + FREE_AND_NULL(mfx->hash); + FREE_AND_NULL(mfx->type); + FREE_AND_NULL(mfx->package_size); + FREE_AND_NULL(mfx->package_total_size); + FREE_AND_NULL(mfx->package_data_size); + FREE_AND_NULL(mfx->installed_time); + FREE_AND_NULL(mfx->installed_storage); + FREE_AND_NULL(mfx->storeclient_id); + FREE_AND_NULL(mfx->mainapp_id); + FREE_AND_NULL(mfx->package_url); + FREE_AND_NULL(mfx->root_path); + FREE_AND_NULL(mfx->csc_path); + FREE_AND_NULL(mfx->appsetting); + FREE_AND_NULL(mfx->nodisplay_setting); + FREE_AND_NULL(mfx->support_disable); + FREE_AND_NULL(mfx->mother_package); + FREE_AND_NULL(mfx->support_mode); + FREE_AND_NULL(mfx->groupid); + FREE_AND_NULL(mfx->support_reset); + FREE_AND_NULL(mfx->use_reset); + + /*Free Icon*/ + if (mfx->icon) { + icon_x *icon = mfx->icon; + icon_x *tmp = NULL; + while(icon != NULL) { + tmp = icon->next; + __ps_free_icon(icon); + icon = tmp; + } + } + /*Free Label*/ + if (mfx->label) { + label_x *label = mfx->label; + label_x *tmp = NULL; + while(label != NULL) { + tmp = label->next; + __ps_free_label(label); + label = tmp; + } + } + /*Free Author*/ + if (mfx->author) { + author_x *author = mfx->author; + author_x *tmp = NULL; + while(author != NULL) { + tmp = author->next; + __ps_free_author(author); + author = tmp; + } + } + /*Free Description*/ + if (mfx->description) { + description_x *description = mfx->description; + description_x *tmp = NULL; + while(description != NULL) { + tmp = description->next; + __ps_free_description(description); + description = tmp; + } + } + /*Free License*/ + if (mfx->license) { + license_x *license = mfx->license; + license_x *tmp = NULL; + while(license != NULL) { + tmp = license->next; + __ps_free_license(license); + license = tmp; + } + } + /*Free Privileges*/ + if (mfx->privileges) { + privileges_x *privileges = mfx->privileges; + privileges_x *tmp = NULL; + while(privileges != NULL) { + tmp = privileges->next; + __ps_free_privileges(privileges); + privileges = tmp; + } + } + /*Free UiApplication*/ + if (mfx->uiapplication) { + uiapplication_x *uiapplication = mfx->uiapplication; + uiapplication_x *tmp = NULL; + while(uiapplication != NULL) { + tmp = uiapplication->next; + __ps_free_uiapplication(uiapplication); + uiapplication = tmp; + } + } + /*Free Daemon*/ + if (mfx->daemon) { + daemon_x *daemon = mfx->daemon; + daemon_x *tmp = NULL; + while(daemon != NULL) { + tmp = daemon->next; + __ps_free_daemon(daemon); + daemon = tmp; + } + } + /*Free Theme*/ + if (mfx->theme) { + theme_x *theme = mfx->theme; + theme_x *tmp = NULL; + while(theme != NULL) { + tmp = theme->next; + __ps_free_theme(theme); + theme = tmp; + } + } + /*Free Font*/ + if (mfx->font) { + font_x *font = mfx->font; + font_x *tmp = NULL; + while(font != NULL) { + tmp = font->next; + __ps_free_font(font); + font = tmp; + } + } + /*Free Ime*/ + if (mfx->ime) { + ime_x *ime = mfx->ime; + ime_x *tmp = NULL; + while(ime != NULL) { + tmp = ime->next; + __ps_free_ime(ime); + ime = tmp; + } + } + /*Free Compatibility*/ + if (mfx->compatibility) { + compatibility_x *compatibility = mfx->compatibility; + compatibility_x *tmp = NULL; + while(compatibility != NULL) { + tmp = compatibility->next; + __ps_free_compatibility(compatibility); + compatibility = tmp; + } + } + /*Free DeviceProfile*/ + if (mfx->deviceprofile) { + deviceprofile_x *deviceprofile = mfx->deviceprofile; + deviceprofile_x *tmp = NULL; + while(deviceprofile != NULL) { + tmp = deviceprofile->next; + __ps_free_deviceprofile(deviceprofile); + deviceprofile = tmp; + } + } + FREE_AND_NULL(mfx); + return; +} + +API char* pkgmgrinfo_basic_generate_hash_for_file( const char *file) +{ + + unsigned char c[MD5_DIGEST_LENGTH] = {0}; + char *hash = NULL; + char temp[3]={0}; + int index = 0; + MD5_CTX mdContext; + int bytes; + unsigned char data[1024]; + + FILE *inFile = fopen (file, "rb"); + + if (inFile == NULL) { + _LOGD("@Error while opening the file: %s",strerror(errno)); + return NULL; + } + + MD5_Init (&mdContext); + + while ((bytes = fread (data, 1, 1024, inFile)) != 0) + MD5_Update (&mdContext, data, bytes); + + MD5_Final (c,&mdContext); + + hash = (char*)malloc(HASH_LEN + 1); + if(hash == NULL){ + _LOGE("Malloc failed!!"); + goto catch; + } + memset(hash,'\0',HASH_LEN + 1); + + for(index = 0; index < MD5_DIGEST_LENGTH; index++) { + sprintf(temp,"%02x",c[index]); + strncat(hash,temp,strlen(temp)); + + } + +catch: + if(inFile) + fclose (inFile); + + return hash; +} diff --git a/src/pkgmgrinfo_certinfo.c b/src/pkgmgrinfo_certinfo.c new file mode 100644 index 0000000..2a438be --- /dev/null +++ b/src/pkgmgrinfo_certinfo.c @@ -0,0 +1,652 @@ +/* + * pkgmgrinfo-certinfo + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Junsuk Oh , + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include +#include + +#include "pkgmgrinfo_private.h" +#include "pkgmgrinfo_debug.h" +#include "pkgmgr-info.h" +#include "pkgmgrinfo_basic.h" + +#ifdef LOG_TAG +#undef LOG_TAG +#endif +#define LOG_TAG "PKGMGR_CERT" + + +typedef struct _pkgmgr_instcertinfo_x { + char *pkgid; + char *cert_info[MAX_CERT_TYPE]; /*certificate data*/ + int is_new[MAX_CERT_TYPE]; /*whether already exist in table or not*/ + int ref_count[MAX_CERT_TYPE]; /*reference count of certificate data*/ + int cert_id[MAX_CERT_TYPE]; /*certificate ID in index table*/ +} pkgmgr_instcertinfo_x; + +typedef struct _pkgmgr_certindexinfo_x { + int cert_id; + int cert_ref_count; +} pkgmgr_certindexinfo_x; + +typedef struct _pkgmgr_certinfo_x { + char *pkgid; + char *cert_value; + char *cert_info[MAX_CERT_TYPE]; /*certificate info*/ + int cert_id[MAX_CERT_TYPE]; /*certificate ID in index table*/ +} pkgmgr_certinfo_x; + +__thread sqlite3 *cert_db = NULL; + +static int __maxid_cb(void *data, int ncols, char **coltxt, char **colname) +{ + int *p = (int*)data; + if (coltxt[0]) + *p = atoi(coltxt[0]); + return 0; +} + +static int __certinfo_cb(void *data, int ncols, char **coltxt, char **colname) +{ + pkgmgr_certinfo_x *info = (pkgmgr_certinfo_x *)data; + int i = 0; + for(i = 0; i < ncols; i++) + { + if (colname[i] == NULL) + continue; + + if (strcmp(colname[i], "package") == 0) { + if (coltxt[i] && info->pkgid == NULL) { + info->pkgid = strdup(coltxt[i]); + } else { + if (info->pkgid) + free(info->pkgid); + + info->pkgid = NULL; + } + } else if (strcmp(colname[i], "author_signer_cert") == 0) { + if (coltxt[i]) + (info->cert_id)[PMINFO_AUTHOR_SIGNER_CERT] = atoi(coltxt[i]); + else + (info->cert_id)[PMINFO_AUTHOR_SIGNER_CERT] = 0; + } else if (strcmp(colname[i], "author_im_cert") == 0) { + if (coltxt[i]) + (info->cert_id)[PMINFO_AUTHOR_INTERMEDIATE_CERT] = atoi(coltxt[i]); + else + (info->cert_id)[PMINFO_AUTHOR_INTERMEDIATE_CERT] = 0; + } else if (strcmp(colname[i], "author_root_cert") == 0) { + if (coltxt[i]) + (info->cert_id)[PMINFO_AUTHOR_ROOT_CERT] = atoi(coltxt[i]); + else + (info->cert_id)[PMINFO_AUTHOR_ROOT_CERT] = 0; + } else if (strcmp(colname[i], "dist_signer_cert") == 0 ){ + if (coltxt[i]) + (info->cert_id)[PMINFO_DISTRIBUTOR_SIGNER_CERT] = atoi(coltxt[i]); + else + (info->cert_id)[PMINFO_DISTRIBUTOR_SIGNER_CERT] = 0; + } else if (strcmp(colname[i], "dist_im_cert") == 0 ){ + if (coltxt[i]) + (info->cert_id)[PMINFO_DISTRIBUTOR_INTERMEDIATE_CERT] = atoi(coltxt[i]); + else + (info->cert_id)[PMINFO_DISTRIBUTOR_INTERMEDIATE_CERT] = 0; + } else if (strcmp(colname[i], "dist_root_cert") == 0 ){ + if (coltxt[i]) + (info->cert_id)[PMINFO_DISTRIBUTOR_ROOT_CERT] = atoi(coltxt[i]); + else + (info->cert_id)[PMINFO_DISTRIBUTOR_ROOT_CERT] = 0; + } else if (strcmp(colname[i], "dist2_signer_cert") == 0 ){ + if (coltxt[i]) + (info->cert_id)[PMINFO_DISTRIBUTOR2_SIGNER_CERT] = atoi(coltxt[i]); + else + (info->cert_id)[PMINFO_DISTRIBUTOR2_SIGNER_CERT] = 0; + } else if (strcmp(colname[i], "dist2_im_cert") == 0 ){ + if (coltxt[i]) + (info->cert_id)[PMINFO_DISTRIBUTOR2_INTERMEDIATE_CERT] = atoi(coltxt[i]); + else + (info->cert_id)[PMINFO_DISTRIBUTOR2_INTERMEDIATE_CERT] = 0; + } else if (strcmp(colname[i], "dist2_root_cert") == 0 ){ + if (coltxt[i]) + (info->cert_id)[PMINFO_DISTRIBUTOR2_ROOT_CERT] = atoi(coltxt[i]); + else + (info->cert_id)[PMINFO_DISTRIBUTOR2_ROOT_CERT] = 0; + } else if (strcmp(colname[i], "cert_info") == 0 ){ + if (coltxt[i] && info->cert_value == NULL) { + info->cert_value = strdup(coltxt[i]); + } else { + if (info->cert_value) + free(info->cert_value); + + info->cert_value = NULL; + } + } else + continue; + } + return 0; +} + +static int __certindexinfo_cb(void *data, int ncols, char **coltxt, char **colname) +{ + pkgmgr_certindexinfo_x *info = (pkgmgr_certindexinfo_x *)data; + int i = 0; + for(i = 0; i < ncols; i++) { + if (strcmp(colname[i], "cert_id") == 0) { + if (coltxt[i]) + info->cert_id = atoi(coltxt[i]); + else + info->cert_id = 0; + } else if (strcmp(colname[i], "cert_ref_count") == 0) { + if (coltxt[i]) + info->cert_ref_count = atoi(coltxt[i]); + else + info->cert_ref_count = 0; + } else + continue; + } + return 0; +} + +static int __exec_certinfo_query(char *query, void *data) +{ + char *error_message = NULL; + if (SQLITE_OK != + sqlite3_exec(cert_db, query, __certinfo_cb, data, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + return -1; + } + sqlite3_free(error_message); + return 0; +} + +static int __exec_certindexinfo_query(char *query, void *data) +{ + char *error_message = NULL; + if (SQLITE_OK != + sqlite3_exec(cert_db, query, __certindexinfo_cb, data, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + return -1; + } + sqlite3_free(error_message); + return 0; +} + +static int __delete_certinfo(const char *pkgid) +{ + int ret = -1; + int i = 0; + int j = 0; + int c = 0; + int unique_id[MAX_CERT_TYPE] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; + char *error_message = NULL; + char query[MAX_QUERY_LEN] = {'\0'}; + pkgmgr_certinfo_x *certinfo = NULL; + pkgmgr_certindexinfo_x *indexinfo = NULL; + certinfo = calloc(1, sizeof(pkgmgr_certinfo_x)); + retvm_if(certinfo == NULL, PMINFO_R_ERROR, "Malloc Failed\n"); + indexinfo = calloc(1, sizeof(pkgmgr_certindexinfo_x)); + if (indexinfo == NULL) { + _LOGE("Out of Memory!!!"); + ret = PMINFO_R_ERROR; + goto err; + } + /*populate certinfo from DB*/ + char *sel_query = sqlite3_mprintf("select * from package_cert_info where package=%Q ", pkgid); + ret = __exec_certinfo_query(sel_query, (void *)certinfo); + sqlite3_free(sel_query); + if (ret == -1) { + _LOGE("Package Cert Info DB Information retrieval failed\n"); + ret = PMINFO_R_ERROR; + goto err; + } + /*Update cert index table*/ + for (i = 0; i < MAX_CERT_TYPE; i++) { + if ((certinfo->cert_id)[i]) { + for (j = 0; j < MAX_CERT_TYPE; j++) { + if ((certinfo->cert_id)[i] == unique_id[j]) { + /*Ref count has already been updated. Just continue*/ + break; + } + } + if (j == MAX_CERT_TYPE) + unique_id[c++] = (certinfo->cert_id)[i]; + else + continue; + snprintf(query, MAX_QUERY_LEN, "select * from package_cert_index_info where cert_id=%d ", (certinfo->cert_id)[i]); + ret = __exec_certindexinfo_query(query, (void *)indexinfo); + if (ret == -1) { + _LOGE("Cert Info DB Information retrieval failed\n"); + ret = PMINFO_R_ERROR; + goto err; + } + memset(query, '\0', MAX_QUERY_LEN); + if (indexinfo->cert_ref_count > 1) { + /*decrease ref count*/ + snprintf(query, MAX_QUERY_LEN, "update package_cert_index_info set cert_ref_count=%d where cert_id=%d ", + indexinfo->cert_ref_count - 1, (certinfo->cert_id)[i]); + } else { + /*delete this certificate as ref count is 1 and it will become 0*/ + snprintf(query, MAX_QUERY_LEN, "delete from package_cert_index_info where cert_id=%d ", (certinfo->cert_id)[i]); + } + if (SQLITE_OK != + sqlite3_exec(cert_db, query, NULL, NULL, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + ret = PMINFO_R_ERROR; + goto err; + } + } + } + /*Now delete the entry from db*/ + char *del_query = sqlite3_mprintf("delete from package_cert_info where package=%Q", pkgid); + if (SQLITE_OK != + sqlite3_exec(cert_db, del_query, NULL, NULL, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", del_query, + error_message); + sqlite3_free(error_message); + sqlite3_free(del_query); + ret = PMINFO_R_ERROR; + goto err; + } + sqlite3_free(del_query); + ret = PMINFO_R_OK; +err: + FREE_AND_NULL(indexinfo); + FREE_AND_NULL(certinfo->pkgid); + for (i = 0; i < MAX_CERT_TYPE; i++) { + FREE_AND_NULL((certinfo->cert_info)[i]); + } + FREE_AND_NULL(certinfo); + return ret; +} + +API int pkgmgrinfo_pkginfo_create_certinfo(pkgmgrinfo_certinfo_h *handle) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + pkgmgr_certinfo_x *certinfo = NULL; + certinfo = calloc(1, sizeof(pkgmgr_certinfo_x)); + retvm_if(certinfo == NULL, PMINFO_R_ERROR, "Malloc Failed\n"); + *handle = (void *)certinfo; + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_load_certinfo(const char *pkgid, pkgmgrinfo_certinfo_h handle) +{ + retvm_if(pkgid == NULL, PMINFO_R_EINVAL, "package ID is NULL\n"); + retvm_if(handle == NULL, PMINFO_R_EINVAL, "Certinfo handle is NULL\n"); + pkgmgr_certinfo_x *certinfo = NULL; + int ret = PMINFO_R_OK; + char query[MAX_QUERY_LEN] = {'\0'}; + int i = 0; + + /*Open db.*/ + ret = db_util_open_with_options(CERT_DB, &cert_db, SQLITE_OPEN_READONLY, NULL); + if (ret != SQLITE_OK) { + _LOGE("connect db [%s] failed!\n", CERT_DB); + return PMINFO_R_ERROR; + } + + certinfo = (pkgmgr_certinfo_x *)handle; + /*populate certinfo from DB*/ + snprintf(query, MAX_QUERY_LEN, "select * from package_cert_info where package='%s' ", pkgid); + ret = __exec_certinfo_query(query, (void *)certinfo); + if (ret == -1) { + _LOGE("Package Cert Info DB Information retrieval failed\n"); + ret = PMINFO_R_ERROR; + goto err; + } + + if (certinfo->pkgid == NULL) { + _LOGE("Package not found in DB\n"); + ret = PMINFO_R_ERROR; + goto err; + } + + for (i = 0; i < MAX_CERT_TYPE; i++) { + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select cert_info from package_cert_index_info where cert_id=%d ", (certinfo->cert_id)[i]); + ret = __exec_certinfo_query(query, (void *)certinfo); + if (ret == -1) { + _LOGE("Cert Info DB Information retrieval failed\n"); + ret = PMINFO_R_ERROR; + goto err; + } + if (certinfo->cert_value) { + (certinfo->cert_info)[i] = strdup(certinfo->cert_value); + FREE_AND_NULL(certinfo->cert_value); + } + } +err: + sqlite3_close(cert_db); + return ret; +} + +API int pkgmgrinfo_pkginfo_get_cert_value(pkgmgrinfo_certinfo_h handle, pkgmgrinfo_cert_type cert_type, const char **cert_value) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL\n"); + retvm_if(cert_value == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL\n"); + retvm_if(cert_type < PMINFO_AUTHOR_ROOT_CERT, PMINFO_R_EINVAL, "Invalid certificate type\n"); + retvm_if(cert_type > PMINFO_DISTRIBUTOR2_SIGNER_CERT, PMINFO_R_EINVAL, "Invalid certificate type\n"); + pkgmgr_certinfo_x *certinfo = NULL; + certinfo = (pkgmgr_certinfo_x *)handle; + if ((certinfo->cert_info)[cert_type]) + *cert_value = (certinfo->cert_info)[cert_type]; + else + *cert_value = NULL; + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_destroy_certinfo(pkgmgrinfo_certinfo_h handle) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL\n"); + int i = 0; + pkgmgr_certinfo_x *certinfo = NULL; + certinfo = (pkgmgr_certinfo_x *)handle; + FREE_AND_NULL(certinfo->pkgid); + for (i = 0; i < MAX_CERT_TYPE; i++) { + FREE_AND_NULL((certinfo->cert_info)[i]); + } + FREE_AND_NULL(certinfo); + return PMINFO_R_OK; +} + +API int pkgmgrinfo_create_certinfo_set_handle(pkgmgrinfo_instcertinfo_h *handle) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + pkgmgr_instcertinfo_x *certinfo = NULL; + certinfo = calloc(1, sizeof(pkgmgr_instcertinfo_x)); + retvm_if(certinfo == NULL, PMINFO_R_ERROR, "Malloc Failed\n"); + *handle = (void *)certinfo; + return PMINFO_R_OK; +} + +API int pkgmgrinfo_set_cert_value(pkgmgrinfo_instcertinfo_h handle, pkgmgrinfo_instcert_type cert_type, char *cert_value) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL\n"); + retvm_if(cert_value == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL\n"); + retvm_if(cert_type < PMINFO_SET_AUTHOR_ROOT_CERT, PMINFO_R_EINVAL, "Invalid certificate type\n"); + retvm_if(cert_type > PMINFO_SET_DISTRIBUTOR2_SIGNER_CERT, PMINFO_R_EINVAL, "Invalid certificate type\n"); + pkgmgr_instcertinfo_x *certinfo = NULL; + certinfo = (pkgmgr_instcertinfo_x *)handle; + (certinfo->cert_info)[cert_type] = strdup(cert_value); + return PMINFO_R_OK; +} + +API int pkgmgrinfo_save_certinfo(const char *pkgid, pkgmgrinfo_instcertinfo_h handle) +{ + retvm_if(pkgid == NULL, PMINFO_R_EINVAL, "package ID is NULL\n"); + retvm_if(handle == NULL, PMINFO_R_EINVAL, "Certinfo handle is NULL\n"); + char *error_message = NULL; + char query[MAX_QUERY_LEN] = {'\0'}; + char *vquery = NULL; + int len = 0; + int i = 0; + int j = 0; + int c = 0; + int unique_id[MAX_CERT_TYPE] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; + int newid = 0; + int is_new = 0; + int exist = -1; + int ret = -1; + int maxid = 0; + int flag = 0; + pkgmgr_instcertinfo_x *info = (pkgmgr_instcertinfo_x *)handle; + pkgmgr_certindexinfo_x *indexinfo = NULL; + indexinfo = calloc(1, sizeof(pkgmgr_certindexinfo_x)); + if (indexinfo == NULL) { + _LOGE("Out of Memory!!!"); + return PMINFO_R_ERROR; + } + info->pkgid = strdup(pkgid); + + /*Open db.*/ + ret = db_util_open_with_options(CERT_DB, &cert_db, SQLITE_OPEN_READWRITE, NULL); + if (ret != SQLITE_OK) { + _LOGE("connect db [%s] failed!\n", CERT_DB); + ret = PMINFO_R_ERROR; + goto err; + } + /*Begin Transaction*/ + ret = sqlite3_exec(cert_db, "BEGIN EXCLUSIVE", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + _LOGE("Failed to begin transaction\n"); + ret = PMINFO_R_ERROR; + goto err; + } + _LOGE("Transaction Begin\n"); + /*Check if request is to insert/update*/ + char *cert_query = sqlite3_mprintf("select exists(select * from package_cert_info where package=%Q)", pkgid); + if (SQLITE_OK != + sqlite3_exec(cert_db, cert_query, _pkgmgrinfo_validate_cb, (void *)&exist, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", cert_query, + error_message); + sqlite3_free(cert_query); + sqlite3_free(error_message); + ret = PMINFO_R_ERROR; + goto err; + } + sqlite3_free(cert_query); + + if (exist) { + /*Update request. + We cant just issue update query directly. We need to manage index table also. + Hence it is better to delete and insert again in case of update*/ + ret = __delete_certinfo(pkgid); + if (ret < 0) + _LOGE("Certificate Deletion Failed\n"); + } + for (i = 0; i < MAX_CERT_TYPE; i++) { + if ((info->cert_info)[i]) { + for (j = 0; j < i; j++) { + if ( (info->cert_info)[j]) { + if (strcmp((info->cert_info)[i], (info->cert_info)[j]) == 0) { + (info->cert_id)[i] = (info->cert_id)[j]; + (info->is_new)[i] = 0; + (info->ref_count)[i] = (info->ref_count)[j]; + break; + } + } + } + if (j < i) + continue; + snprintf(query, MAX_QUERY_LEN, "select * from package_cert_index_info " \ + "where cert_info='%s'",(info->cert_info)[i]); + ret = __exec_certindexinfo_query(query, (void *)indexinfo); + if (ret == -1) { + _LOGE("Cert Info DB Information retrieval failed\n"); + ret = PMINFO_R_ERROR; + goto err; + } + if (indexinfo->cert_id == 0) { + /*New certificate. Get newid*/ + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select MAX(cert_id) from package_cert_index_info "); + if (SQLITE_OK != + sqlite3_exec(cert_db, query, __maxid_cb, (void *)&newid, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + ret = PMINFO_R_ERROR; + goto err; + } + newid = newid + 1; + if (flag == 0) { + maxid = newid; + flag = 1; + } + indexinfo->cert_id = maxid; + indexinfo->cert_ref_count = 1; + is_new = 1; + maxid = maxid + 1; + } + (info->cert_id)[i] = indexinfo->cert_id; + (info->is_new)[i] = is_new; + (info->ref_count)[i] = indexinfo->cert_ref_count; + _LOGE("Id:Count = %d %d\n", indexinfo->cert_id, indexinfo->cert_ref_count); + indexinfo->cert_id = 0; + indexinfo->cert_ref_count = 0; + is_new = 0; + } + } + len = MAX_QUERY_LEN; + for (i = 0; i < MAX_CERT_TYPE; i++) { + if ((info->cert_info)[i]) + len+= strlen((info->cert_info)[i]); + } + vquery = (char *)calloc(1, len); + if (vquery == NULL) { + _LOGE("out of memory"); + ret = PMINFO_R_ERROR; + goto err; + } + /*insert*/ + snprintf(vquery, len, + "insert into package_cert_info(package, author_root_cert, author_im_cert, author_signer_cert, dist_root_cert, " \ + "dist_im_cert, dist_signer_cert, dist2_root_cert, dist2_im_cert, dist2_signer_cert) " \ + "values('%s', %d, %d, %d, %d, %d, %d, %d, %d, %d)",\ + info->pkgid,(info->cert_id)[PMINFO_SET_AUTHOR_ROOT_CERT],(info->cert_id)[PMINFO_SET_AUTHOR_INTERMEDIATE_CERT], + (info->cert_id)[PMINFO_SET_AUTHOR_SIGNER_CERT], (info->cert_id)[PMINFO_SET_DISTRIBUTOR_ROOT_CERT], + (info->cert_id)[PMINFO_SET_DISTRIBUTOR_INTERMEDIATE_CERT], (info->cert_id)[PMINFO_SET_DISTRIBUTOR_SIGNER_CERT], + (info->cert_id)[PMINFO_SET_DISTRIBUTOR2_ROOT_CERT],(info->cert_id)[PMINFO_SET_DISTRIBUTOR2_INTERMEDIATE_CERT], + (info->cert_id)[PMINFO_SET_DISTRIBUTOR2_SIGNER_CERT]); + if (SQLITE_OK != + sqlite3_exec(cert_db, vquery, NULL, NULL, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", vquery, + error_message); + sqlite3_free(error_message); + ret = PMINFO_R_ERROR; + goto err; + } + /*Update index table info*/ + /*If cert_id exists and is repeated for current package, ref count should only be increased once*/ + for (i = 0; i < MAX_CERT_TYPE; i++) { + if ((info->cert_info)[i]) { + memset(vquery, '\0', len); + if ((info->is_new)[i]) { + snprintf(vquery, len, "insert into package_cert_index_info(cert_info, cert_id, cert_ref_count) " \ + "values('%s', '%d', '%d') ", (info->cert_info)[i], (info->cert_id)[i], 1); + unique_id[c++] = (info->cert_id)[i]; + } else { + /*Update*/ + for (j = 0; j < MAX_CERT_TYPE; j++) { + if ((info->cert_id)[i] == unique_id[j]) { + /*Ref count has already been increased. Just continue*/ + break; + } + } + if (j == MAX_CERT_TYPE) + unique_id[c++] = (info->cert_id)[i]; + else + continue; + snprintf(vquery, len, "update package_cert_index_info set cert_ref_count=%d " \ + "where cert_id=%d", (info->ref_count)[i] + 1, (info->cert_id)[i]); + } + if (SQLITE_OK != + sqlite3_exec(cert_db, vquery, NULL, NULL, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", vquery, + error_message); + sqlite3_free(error_message); + ret = PMINFO_R_ERROR; + goto err; + } + } + } + /*Commit transaction*/ + ret = sqlite3_exec(cert_db, "COMMIT", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + _LOGE("Failed to commit transaction, Rollback now\n"); + ret = sqlite3_exec(cert_db, "ROLLBACK", NULL, NULL, NULL); + if (ret != SQLITE_OK) + _LOGE("Failed to commit transaction, Rollback now\n"); + + ret = PMINFO_R_ERROR; + goto err; + } + _LOGE("Transaction Commit and End\n"); + ret = PMINFO_R_OK; +err: + sqlite3_close(cert_db); + FREE_AND_NULL(vquery); + FREE_AND_NULL(indexinfo); + return ret; +} + +API int pkgmgrinfo_destroy_certinfo_set_handle(pkgmgrinfo_instcertinfo_h handle) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL\n"); + int i = 0; + pkgmgr_instcertinfo_x *certinfo = NULL; + certinfo = (pkgmgr_instcertinfo_x *)handle; + FREE_AND_NULL(certinfo->pkgid); + for (i = 0; i < MAX_CERT_TYPE; i++) { + FREE_AND_NULL((certinfo->cert_info)[i]); + } + FREE_AND_NULL(certinfo); + return PMINFO_R_OK; +} + +API int pkgmgrinfo_delete_certinfo(const char *pkgid) +{ + retvm_if(pkgid == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL\n"); + int ret = -1; + /*Open db.*/ + ret = db_util_open_with_options(CERT_DB, &cert_db, SQLITE_OPEN_READWRITE, NULL); + if (ret != SQLITE_OK) { + _LOGE("connect db [%s] failed!\n", CERT_DB); + ret = PMINFO_R_ERROR; + goto err; + } + /*Begin Transaction*/ + ret = sqlite3_exec(cert_db, "BEGIN EXCLUSIVE", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + _LOGE("Failed to begin transaction\n"); + ret = PMINFO_R_ERROR; + goto err; + } + _LOGE("Transaction Begin\n"); + ret = __delete_certinfo(pkgid); + if (ret < 0) { + _LOGE("Certificate Deletion Failed\n"); + } else { + _LOGE("Certificate Deletion Success\n"); + } + /*Commit transaction*/ + ret = sqlite3_exec(cert_db, "COMMIT", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + _LOGE("Failed to commit transaction, Rollback now\n"); + ret = sqlite3_exec(cert_db, "ROLLBACK", NULL, NULL, NULL); + if (ret != SQLITE_OK) + _LOGE("Failed to commit transaction, Rollback now\n"); + + ret = PMINFO_R_ERROR; + goto err; + } + _LOGE("Transaction Commit and End\n"); + ret = PMINFO_R_OK; +err: + sqlite3_close(cert_db); + return ret; +} + diff --git a/src/pkgmgrinfo_client.c b/src/pkgmgrinfo_client.c new file mode 100644 index 0000000..000f3d1 --- /dev/null +++ b/src/pkgmgrinfo_client.c @@ -0,0 +1,183 @@ +/* + * pkgmgrinfo-client + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Junsuk Oh , + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include +#include +#include +#include + +#include "pkgmgrinfo_private.h" +#include "pkgmgrinfo_debug.h" +#include "pkgmgr-info.h" + +#ifdef LOG_TAG +#undef LOG_TAG +#endif +#define LOG_TAG "PKGMGR_CLIENT" + +#define SERVICE_NAME "org.tizen.system.deviced" +#define PATH_NAME "/Org/Tizen/System/DeviceD/Mmc" +#define INTERFACE_NAME "org.tizen.system.deviced.Mmc" +#define METHOD_NAME "RequestMountApp2ext" + +static int __get_pkg_location(const char *pkgid) +{ + retvm_if(pkgid == NULL, PMINFO_R_OK, "pkginfo handle is NULL"); + + FILE *fp = NULL; + char pkg_mmc_path[FILENAME_MAX] = { 0, }; + snprintf(pkg_mmc_path, FILENAME_MAX, "%s%s", PKG_SD_PATH, pkgid); + + /*check whether application is in external memory or not */ + fp = fopen(pkg_mmc_path, "r"); + if (fp != NULL) { + fclose(fp); + fp = NULL; + return PMINFO_EXTERNAL_STORAGE; + } + + return PMINFO_INTERNAL_STORAGE; +} + +/* pkgmgrinfo client start*/ +API pkgmgrinfo_client *pkgmgrinfo_client_new(pkgmgrinfo_client_type ctype) +{ + char *errmsg = NULL; + void *pc = NULL; + void *handle = NULL; + pkgmgrinfo_client *(*__pkgmgr_client_new)(pkgmgrinfo_client_type ctype) = NULL; + + handle = dlopen("libpkgmgr-client.so.0", RTLD_LAZY | RTLD_GLOBAL); + retvm_if(!handle, NULL, "dlopen() failed. [%s]", dlerror()); + + __pkgmgr_client_new = dlsym(handle, "pkgmgr_client_new"); + retvm_if(__pkgmgr_client_new == NULL, NULL, "__pkgmgr_client_new() failed"); + + errmsg = dlerror(); + retvm_if(errmsg != NULL, NULL, "dlsym() failed. [%s]", errmsg); + + pc = __pkgmgr_client_new(ctype); + +//catch: +// dlclose(handle); + return (pkgmgrinfo_client *) pc; +} + +API int pkgmgrinfo_client_set_status_type(pkgmgrinfo_client *pc, int status_type) +{ + int ret = 0; + char *errmsg = NULL; + void *handle = NULL; + int (*__pkgmgr_client_set_status_type)(pkgmgrinfo_client *pc, int status_type) = NULL; + + handle = dlopen("libpkgmgr-client.so.0", RTLD_LAZY | RTLD_GLOBAL); + retvm_if(!handle, PMINFO_R_ERROR, "dlopen() failed. [%s]", dlerror()); + + __pkgmgr_client_set_status_type = dlsym(handle, "pkgmgr_client_set_status_type"); + errmsg = dlerror(); + tryvm_if((errmsg != NULL) || (__pkgmgr_client_set_status_type == NULL), ret = PMINFO_R_ERROR, "dlsym() failed. [%s]", errmsg); + + ret = __pkgmgr_client_set_status_type(pc, status_type); + tryvm_if(ret < 0, ret = PMINFO_R_ERROR, "pkgmgr_client_new failed."); + +catch: +// dlclose(handle); + return ret; +} + +API int pkgmgrinfo_client_listen_status(pkgmgrinfo_client *pc, pkgmgrinfo_handler event_cb, void *data) +{ + int ret = 0; + char *errmsg = NULL; + void *handle = NULL; + int (*__pkgmgr_client_listen_status)(pkgmgrinfo_client *pc, pkgmgrinfo_handler event_cb, void *data) = NULL; + + handle = dlopen("libpkgmgr-client.so.0", RTLD_LAZY | RTLD_GLOBAL); + retvm_if(!handle, PMINFO_R_ERROR, "dlopen() failed. [%s]", dlerror()); + + __pkgmgr_client_listen_status = dlsym(handle, "pkgmgr_client_listen_status"); + errmsg = dlerror(); + tryvm_if((errmsg != NULL) || (__pkgmgr_client_listen_status == NULL), ret = PMINFO_R_ERROR, "dlsym() failed. [%s]", errmsg); + + ret = __pkgmgr_client_listen_status(pc, event_cb, data); + tryvm_if(ret < 0, ret = PMINFO_R_ERROR, "pkgmgr_client_new failed."); + +catch: +// dlclose(handle); + return ret; +} + +API int pkgmgrinfo_client_free(pkgmgrinfo_client *pc) +{ + int ret = 0; + char *errmsg = NULL; + void *handle = NULL; + int (*__pkgmgr_client_free)(pkgmgrinfo_client *pc) = NULL; + + handle = dlopen("libpkgmgr-client.so.0", RTLD_LAZY | RTLD_GLOBAL); + retvm_if(!handle, PMINFO_R_ERROR, "dlopen() failed. [%s]", dlerror()); + + __pkgmgr_client_free = dlsym(handle, "pkgmgr_client_free"); + errmsg = dlerror(); + tryvm_if((errmsg != NULL) || (__pkgmgr_client_free == NULL), ret = PMINFO_R_ERROR, "dlsym() failed. [%s]", errmsg); + + ret = __pkgmgr_client_free(pc); + tryvm_if(ret < 0, ret = PMINFO_R_ERROR, "pkgmgr_client_new failed."); + +catch: +// dlclose(handle); + return ret; +} + +API int pkgmgrinfo_client_request_enable_external_pkg(char *pkgid) +{ + int ret = 0; + DBusConnection *bus; + DBusMessage *message; + DBusMessage *reply; + + retvm_if(pkgid == NULL, PMINFO_R_EINVAL, "pkgid is NULL\n"); + + if(__get_pkg_location(pkgid) != PMINFO_EXTERNAL_STORAGE) + return PMINFO_R_OK; + + bus = dbus_bus_get(DBUS_BUS_SYSTEM, NULL); + retvm_if(bus == NULL, PMINFO_R_EINVAL, "dbus_bus_get() failed."); + + message = dbus_message_new_method_call (SERVICE_NAME, PATH_NAME, INTERFACE_NAME, METHOD_NAME); + retvm_if(message == NULL, PMINFO_R_EINVAL, "dbus_message_new_method_call() failed."); + + dbus_message_append_args(message, DBUS_TYPE_STRING, &pkgid, DBUS_TYPE_INVALID); + + reply = dbus_connection_send_with_reply_and_block(bus, message, -1, NULL); + retvm_if(!reply, ret = PMINFO_R_EINVAL, "connection_send dbus fail"); + + dbus_connection_flush(bus); + dbus_message_unref(message); + dbus_message_unref(reply); + + return PMINFO_R_OK; +} + +/* pkgmgrinfo client end*/ + diff --git a/src/pkgmgrinfo_db.c b/src/pkgmgrinfo_db.c new file mode 100644 index 0000000..ba07c31 --- /dev/null +++ b/src/pkgmgrinfo_db.c @@ -0,0 +1,312 @@ +/* + * pkgmgrinfo-db + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Junsuk Oh , + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include +#include +#include +#include + +#include "pkgmgrinfo_private.h" +#include "pkgmgrinfo_debug.h" +#include "pkgmgr-info.h" + +#include "pkgmgr_parser.h" +#include "pkgmgr_parser_db.h" + +#ifdef LOG_TAG +#undef LOG_TAG +#endif +#define LOG_TAG "PKGMGR_DB" + +static int __ail_set_installed_storage(const char *pkgid, INSTALL_LOCATION location) +{ + retvm_if(pkgid == NULL, PMINFO_R_EINVAL, "pkgid is NULL\n"); + int ret = -1; + int exist = 0; + sqlite3 *ail_db = NULL; + char *AIL_DB_PATH = "/opt/dbspace/.app_info.db"; + char *query = NULL; + + ret = db_util_open(AIL_DB_PATH, &ail_db, 0); + retvm_if(ret != SQLITE_OK, PMINFO_R_ERROR, "connect db [%s] failed!", AIL_DB_PATH); + + /*Begin transaction*/ + ret = sqlite3_exec(ail_db, "BEGIN EXCLUSIVE", NULL, NULL, NULL); + tryvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "Failed to begin transaction\n"); + _LOGD("Transaction Begin\n"); + + /*validate pkgid*/ + query = sqlite3_mprintf("select exists(select * from app_info where x_slp_pkgid=%Q)", pkgid); + ret = __exec_db_query(ail_db, query, _pkgmgrinfo_validate_cb, (void *)&exist); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "sqlite3_exec[%s] fail", pkgid); + if (exist == 0) { + _LOGS("pkgid[%s] not found in DB", pkgid); + ret = PMINFO_R_ERROR; + goto catch; + } + sqlite3_free(query); + + query = sqlite3_mprintf("update app_info set x_slp_installedstorage=%Q where x_slp_pkgid=%Q", location?"installed_external":"installed_internal", pkgid); + + ret = sqlite3_exec(ail_db, query, NULL, NULL, NULL); + tryvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "Don't execute query = %s\n", query); + + /*Commit transaction*/ + ret = sqlite3_exec(ail_db, "COMMIT", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + _LOGE("Failed to commit transaction. Rollback now\n"); + ret = sqlite3_exec(ail_db, "ROLLBACK", NULL, NULL, NULL); + tryvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "Don't execute query = %s\n", query); + } + _LOGD("Transaction Commit and End\n"); + + ret = PMINFO_R_OK; +catch: + sqlite3_close(ail_db); + sqlite3_free(query); + return ret; +} + +API int pkgmgrinfo_pkginfo_set_state_enabled(const char *pkgid, bool enabled) +{ + /* Should be implemented later */ + return 0; +} + +API int pkgmgrinfo_pkginfo_set_preload(const char *pkgid, int preload) +{ + retvm_if(pkgid == NULL, PMINFO_R_EINVAL, "pkgid is NULL\n"); + int ret = -1; + int exist = 0; + sqlite3 *pkginfo_db = NULL; + char *query = NULL; + + ret = db_util_open(MANIFEST_DB, &pkginfo_db, 0); + retvm_if(ret != SQLITE_OK, PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB); + + /*Begin transaction*/ + ret = sqlite3_exec(pkginfo_db, "BEGIN EXCLUSIVE", NULL, NULL, NULL); + tryvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "Failed to begin transaction\n"); + _LOGD("Transaction Begin\n"); + + /*validate pkgid*/ + query = sqlite3_mprintf("select exists(select * from package_info where package=%Q)", pkgid); + ret = __exec_db_query(pkginfo_db, query, _pkgmgrinfo_validate_cb, (void *)&exist); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "sqlite3_exec[%s] fail", pkgid); + if (exist == 0) { + _LOGS("pkgid[%s] not found in DB", pkgid); + ret = PMINFO_R_ERROR; + goto catch; + } + sqlite3_free(query); + + query = sqlite3_mprintf("update package_info set package_preload=%Q where package=%Q", preload?"true":"false", pkgid); + + ret = sqlite3_exec(pkginfo_db, query, NULL, NULL, NULL); + tryvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "Don't execute query = %s\n", query); + + /*Commit transaction*/ + ret = sqlite3_exec(pkginfo_db, "COMMIT", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + _LOGE("Failed to commit transaction. Rollback now\n"); + ret = sqlite3_exec(pkginfo_db, "ROLLBACK", NULL, NULL, NULL); + tryvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "Don't execute query = %s\n", query); + } + _LOGD("Transaction Commit and End\n"); + + ret = PMINFO_R_OK; +catch: + sqlite3_close(pkginfo_db); + sqlite3_free(query); + return ret; +} + + +API int pkgmgrinfo_pkginfo_set_installed_storage(const char *pkgid, INSTALL_LOCATION location) +{ + retvm_if(pkgid == NULL, PMINFO_R_EINVAL, "pkgid is NULL\n"); + int ret = -1; + int exist = 0; + sqlite3 *pkginfo_db = NULL; + char *query = NULL; + + ret = db_util_open(MANIFEST_DB, &pkginfo_db, 0); + retvm_if(ret != SQLITE_OK, PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB); + + /*Begin transaction*/ + // Setting Manifest DB + ret = sqlite3_exec(pkginfo_db, "BEGIN EXCLUSIVE", NULL, NULL, NULL); + tryvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "Failed to begin transaction\n"); + _LOGD("Transaction Begin\n"); + + /*validate pkgid*/ + query = sqlite3_mprintf("select exists(select * from package_info where package=%Q)", pkgid); + ret = __exec_db_query(pkginfo_db, query, _pkgmgrinfo_validate_cb, (void *)&exist); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "sqlite3_exec[%s] fail", pkgid); + if (exist == 0) { + _LOGS("pkgid[%s] not found in DB", pkgid); + ret = PMINFO_R_ERROR; + goto catch; + } + sqlite3_free(query); + + query = sqlite3_mprintf("select exists(select * from package_app_info where package=%Q)", pkgid); + ret = __exec_db_query(pkginfo_db, query, _pkgmgrinfo_validate_cb, (void *)&exist); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "sqlite3_exec[%s] fail", pkgid); + if (exist == 0) { + _LOGS("pkgid[%s] not found in DB", pkgid); + ret = PMINFO_R_ERROR; + goto catch; + } + sqlite3_free(query); + + // pkgcakge_info table + query = sqlite3_mprintf("update package_info set installed_storage=%Q where package=%Q", location?"installed_external":"installed_internal", pkgid); + + ret = sqlite3_exec(pkginfo_db, query, NULL, NULL, NULL); + tryvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "Don't execute query = %s\n", query); + sqlite3_free(query); + + // package_app_info table + query = sqlite3_mprintf("update package_app_info set app_installed_storage=%Q where package=%Q", location?"installed_external":"installed_internal", pkgid); + + ret = sqlite3_exec(pkginfo_db, query, NULL, NULL, NULL); + tryvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "Don't execute query = %s\n", query); + + // Setting AIL DB + ret = __ail_set_installed_storage(pkgid, location); + tryvm_if(ret != PMINFO_R_OK, ret = PMINFO_R_ERROR, "Setting AIL DB failed."); + + /*Commit transaction*/ + ret = sqlite3_exec(pkginfo_db, "COMMIT", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + _LOGE("Failed to commit transaction. Rollback now\n"); + ret = sqlite3_exec(pkginfo_db, "ROLLBACK", NULL, NULL, NULL); + tryvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "Don't execute query = %s\n", query); + } + _LOGD("Transaction Commit and End\n"); + + ret = PMINFO_R_OK; +catch: + sqlite3_close(pkginfo_db); + sqlite3_free(query); + return ret; +} + +API int pkgmgrinfo_appinfo_set_state_enabled(const char *appid, bool enabled) +{ + retvm_if(appid == NULL, PMINFO_R_EINVAL, "appid is NULL\n"); + int ret = -1; + int exist = 0; + sqlite3 *pkginfo_db = NULL; + char *query = NULL; + + ret = db_util_open(MANIFEST_DB, &pkginfo_db, 0); + retvm_if(ret != SQLITE_OK, PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB); + + /*Begin transaction*/ + ret = sqlite3_exec(pkginfo_db, "BEGIN EXCLUSIVE", NULL, NULL, NULL); + tryvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "Failed to begin transaction\n"); + _LOGD("Transaction Begin\n"); + + /*validate appid*/ + query = sqlite3_mprintf("select exists(select * from package_app_info where app_id=%Q)", appid); + ret = __exec_db_query(pkginfo_db, query, _pkgmgrinfo_validate_cb, (void *)&exist); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "sqlite3_exec[%s] fail", appid); + if (exist == 0) { + _LOGS("appid[%s] not found in DB", appid); + ret = PMINFO_R_ERROR; + goto catch; + } + sqlite3_free(query); + + query = sqlite3_mprintf("update package_app_info set app_enabled=%Q where app_id=%Q", enabled?"true":"false", appid); + + ret = sqlite3_exec(pkginfo_db, query, NULL, NULL, NULL); + tryvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "Don't execute query = %s\n", query); + + /*Commit transaction*/ + ret = sqlite3_exec(pkginfo_db, "COMMIT", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + _LOGE("Failed to commit transaction. Rollback now\n"); + ret = sqlite3_exec(pkginfo_db, "ROLLBACK", NULL, NULL, NULL); + tryvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "Don't execute query = %s\n", query); + } + _LOGD("Transaction Commit and End\n"); + + ret = PMINFO_R_OK; +catch: + sqlite3_close(pkginfo_db); + sqlite3_free(query); + return ret; +} + +API int pkgmgrinfo_appinfo_set_default_label(const char *appid, const char *label) +{ + retvm_if(appid == NULL, PMINFO_R_EINVAL, "appid is NULL\n"); + int ret = -1; + int exist = 0; + sqlite3 *pkginfo_db = NULL; + char *query = NULL; + + /*open db*/ + ret = db_util_open(MANIFEST_DB, &pkginfo_db, 0); + retvm_if(ret != SQLITE_OK, PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB); + + /*Begin transaction*/ + ret = sqlite3_exec(pkginfo_db, "BEGIN EXCLUSIVE", NULL, NULL, NULL); + tryvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "Failed to begin transaction\n"); + _LOGD("Transaction Begin\n"); + + /*validate appid*/ + query = sqlite3_mprintf("select exists(select * from package_app_localized_info where app_id=%Q)", appid); + ret = __exec_db_query(pkginfo_db, query, _pkgmgrinfo_validate_cb, (void *)&exist); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "sqlite3_exec[%s] fail", appid); + if (exist == 0) { + _LOGS("appid[%s] not found in DB", appid); + ret = PMINFO_R_ERROR; + goto catch; + } + sqlite3_free(query); + + query = sqlite3_mprintf("update package_app_localized_info set app_label=%Q where app_id=%Q", label, appid); + + ret = sqlite3_exec(pkginfo_db, query, NULL, NULL, NULL); + tryvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "Don't execute query = %s\n", query); + + /*Commit transaction*/ + ret = sqlite3_exec(pkginfo_db, "COMMIT", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + _LOGE("Failed to commit transaction. Rollback now\n"); + ret = sqlite3_exec(pkginfo_db, "ROLLBACK", NULL, NULL, NULL); + tryvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "Don't execute query = %s\n", query); + } + _LOGD("Transaction Commit and End\n"); + + ret = PMINFO_R_OK; +catch: + sqlite3_free(query); + sqlite3_close(pkginfo_db); + return ret; +} + diff --git a/src/pkgmgrinfo_feature.c b/src/pkgmgrinfo_feature.c new file mode 100644 index 0000000..0cad351 --- /dev/null +++ b/src/pkgmgrinfo_feature.c @@ -0,0 +1,474 @@ +/* + * pkgmgrinfo-feature + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Junsuk Oh , + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "pkgmgrinfo_private.h" + +#ifdef LOG_TAG +#undef LOG_TAG +#endif +#define LOG_TAG "PKGMGR_INFO" + +typedef int (*pkgmgr_handler)(int req_id, const char *pkg_type, + const char *pkgid, const char *key, + const char *val, const void *pmsg, void *data); + +typedef void pkgmgr_client; +typedef void pkgmgr_info; + +typedef enum { + PM_REQUEST_CSC = 0, + PM_REQUEST_MOVE = 1, + PM_REQUEST_GET_SIZE = 2, + PM_REQUEST_KILL_APP = 3, + PM_REQUEST_CHECK_APP = 4, + PM_REQUEST_MAX +}pkgmgr_request_service_type; + +typedef enum { + PM_GET_TOTAL_SIZE= 0, + PM_GET_DATA_SIZE = 1, + PM_GET_ALL_PKGS = 2, + PM_GET_SIZE_INFO = 3, + PM_GET_TOTAL_AND_DATA = 4, + PM_GET_SIZE_FILE = 5, + PM_GET_MAX +}pkgmgr_getsize_type; + +typedef enum { + PC_REQUEST = 0, + PC_LISTENING, + PC_BROADCAST, +}client_type; + +static int __pkg_list_cb(void *data, int ncols, char **coltxt, char **colname) +{ + pkgmgr_pkginfo_x *udata = (pkgmgr_pkginfo_x *)data; + int i = 0; + pkgmgr_pkginfo_x *info = NULL; + info = calloc(1, sizeof(pkgmgr_pkginfo_x)); + retvm_if(info == NULL, PMINFO_R_ERROR, "our of memory"); + info->manifest_info = (manifest_x *)calloc(1, sizeof(manifest_x)); + if (info->manifest_info == NULL) { + _LOGE("out of memory"); + free(info); + return PMINFO_R_ERROR; + } + + LISTADD(udata, info); + for(i = 0; i < ncols; i++) + { + if (strcmp(colname[i], "package") == 0) { + if (coltxt[i]) + info->manifest_info->package = strdup(coltxt[i]); + else + info->manifest_info->package = NULL; + } else + continue; + } + + return 0; +} + +API int pkgmgrinfo_pkginfo_get_disabled_pkginfo(const char *pkgid, pkgmgrinfo_pkginfo_h *handle) +{ + retvm_if(pkgid == NULL, PMINFO_R_EINVAL, "pkgid is NULL\n"); + retvm_if(handle == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + pkgmgr_pkginfo_x *pkginfo = NULL; + int ret = PMINFO_R_OK; + char *query = NULL; + char *locale = NULL; + label_x *tmp1 = NULL; + icon_x *tmp2 = NULL; + description_x *tmp3 = NULL; + author_x *tmp4 = NULL; + privilege_x *tmp5 = NULL; + sqlite3 *pkginfo_db = NULL; + + /*validate pkgid*/ + ret = db_util_open(MANIFEST_DB, &pkginfo_db, 0); + retvm_if(ret != SQLITE_OK, PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB); + + /*get system locale*/ + locale = __convert_system_locale_to_manifest_locale(); + tryvm_if(locale == NULL, ret = PMINFO_R_ERROR, "manifest locale is NULL"); + + pkginfo = (pkgmgr_pkginfo_x *)calloc(1, sizeof(pkgmgr_pkginfo_x)); + tryvm_if(pkginfo == NULL, ret = PMINFO_R_ERROR, "Failed to allocate memory for pkginfo"); + + pkginfo->locale = strdup(locale); + + pkginfo->manifest_info = (manifest_x *)calloc(1, sizeof(manifest_x)); + tryvm_if(pkginfo->manifest_info == NULL, ret = PMINFO_R_ERROR, "Failed to allocate memory for manifest info"); + + pkginfo->manifest_info->package = strdup(pkgid); + pkginfo->manifest_info->privileges = (privileges_x *)calloc(1, sizeof(privileges_x)); + tryvm_if(pkginfo->manifest_info->privileges == NULL, ret = PMINFO_R_ERROR, "Failed to allocate memory for privileges info"); + + /*populate manifest_info from DB*/ + query= sqlite3_mprintf("select * from disabled_package_info where package=%Q", pkgid); + ret = __exec_db_query(pkginfo_db, query, __pkginfo_cb, (void *)pkginfo); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "Package Info DB Information retrieval failed"); + + query= sqlite3_mprintf("select * from disabled_package_localized_info where package=%Q and package_locale=%Q", pkgid, locale); + ret = __exec_db_query(pkginfo_db, query, __pkginfo_cb, (void *)pkginfo); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "Package Info DB Information retrieval failed"); + + /*Also store the values corresponding to default locales*/ + query= sqlite3_mprintf("select * from disabled_package_localized_info where package=%Q and package_locale=%Q", pkgid, DEFAULT_LOCALE); + ret = __exec_db_query(pkginfo_db, query, __pkginfo_cb, (void *)pkginfo); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "Package Info DB Information retrieval failed"); + + SAFE_LISTHEAD(pkginfo->manifest_info->label, tmp1); + SAFE_LISTHEAD(pkginfo->manifest_info->icon, tmp2); + SAFE_LISTHEAD(pkginfo->manifest_info->description, tmp3); + SAFE_LISTHEAD(pkginfo->manifest_info->author, tmp4); + SAFE_LISTHEAD(pkginfo->manifest_info->privileges->privilege, tmp5); + +catch: + if (ret == PMINFO_R_OK) + *handle = (void*)pkginfo; + else { + *handle = NULL; + __cleanup_pkginfo(pkginfo); + } + sqlite3_close(pkginfo_db); + + if (locale) { + free(locale); + locale = NULL; + } + return ret; +} + +API int pkgmgrinfo_pkginfo_get_disabled_list(pkgmgrinfo_pkg_list_cb pkg_list_cb, void *user_data) +{ + retvm_if(pkg_list_cb == NULL, PMINFO_R_EINVAL, "callback function is NULL\n"); + int ret = PMINFO_R_OK; + char query[MAX_QUERY_LEN] = {'\0'}; + char *locale = NULL; + pkgmgr_pkginfo_x *pkginfo = NULL; + label_x *tmp1 = NULL; + icon_x *tmp2 = NULL; + description_x *tmp3 = NULL; + author_x *tmp4 = NULL; + sqlite3 *pkginfo_db = NULL; + pkgmgr_pkginfo_x *tmphead = NULL; + pkgmgr_pkginfo_x *node = NULL; + pkgmgr_pkginfo_x *temp_node = NULL; + + /*open db*/ + ret = db_util_open(MANIFEST_DB, &pkginfo_db, 0); + retvm_if(ret != SQLITE_OK, PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB); + + /*get system locale*/ + locale = __convert_system_locale_to_manifest_locale(); + tryvm_if(locale == NULL, ret = PMINFO_R_ERROR, "manifest locale is NULL"); + + tmphead = (pkgmgr_pkginfo_x *)calloc(1, sizeof(pkgmgr_pkginfo_x)); + if(tmphead == NULL){ + _LOGE("@calloc failed!!"); + FREE_AND_NULL(locale); + return PMINFO_R_ERROR; + } + + snprintf(query, MAX_QUERY_LEN, "select * from disabled_package_info"); + ret = __exec_db_query(pkginfo_db, query, __pkg_list_cb, (void *)tmphead); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "Package Info DB Information retrieval failed"); + + LISTHEAD(tmphead, node); + + for(node = node->next; node ; node = node->next) { + pkginfo = node; + pkginfo->locale = strdup(locale); + pkginfo->manifest_info->privileges = (privileges_x *)calloc(1, sizeof(privileges_x)); + tryvm_if(pkginfo->manifest_info->privileges == NULL, ret = PMINFO_R_ERROR, "Failed to allocate memory for privileges info\n"); + + /*populate manifest_info from DB*/ + snprintf(query, MAX_QUERY_LEN, "select * from disabled_package_info where package='%s' ", pkginfo->manifest_info->package); + ret = __exec_db_query(pkginfo_db, query, __pkginfo_cb, (void *)pkginfo); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "Package Info DB Information retrieval failed"); + + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select * from disabled_package_localized_info where" \ + " package='%s' and package_locale='%s'", pkginfo->manifest_info->package, locale); + ret = __exec_db_query(pkginfo_db, query, __pkginfo_cb, (void *)pkginfo); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "Package Info DB Information retrieval failed"); + + /*Also store the values corresponding to default locales*/ + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select * from disabled_package_localized_info where" \ + " package='%s' and package_locale='%s'", pkginfo->manifest_info->package, DEFAULT_LOCALE); + ret = __exec_db_query(pkginfo_db, query, __pkginfo_cb, (void *)pkginfo); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "Package Info DB Information retrieval failed"); + + SAFE_LISTHEAD(pkginfo->manifest_info->label, tmp1); + SAFE_LISTHEAD(pkginfo->manifest_info->icon, tmp2); + SAFE_LISTHEAD(pkginfo->manifest_info->description, tmp3); + SAFE_LISTHEAD(pkginfo->manifest_info->author, tmp4); + } + + LISTHEAD(tmphead, node); + + for(node = node->next; node ; node = node->next) { + pkginfo = node; + + ret = pkg_list_cb( (void *)pkginfo, user_data); + if(ret < 0) + break; + } + + ret = PMINFO_R_OK; + +catch: + sqlite3_close(pkginfo_db); + if (locale) { + free(locale); + locale = NULL; + } + if (tmphead) { + LISTHEAD(tmphead, node); + temp_node = node->next; + node = temp_node; + while (node) { + temp_node = node->next; + __cleanup_pkginfo(node); + node = temp_node; + } + __cleanup_pkginfo(tmphead); + } + return ret; +} + +API int pkgmgrinfo_appinfo_get_disabled_appinfo(const char *appid, pkgmgrinfo_appinfo_h *handle) +{ + retvm_if(appid == NULL, PMINFO_R_EINVAL, "appid is NULL"); + retvm_if(handle == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + + pkgmgr_appinfo_x *appinfo = NULL; + char *locale = NULL; + int ret = -1; + int exist = 0; + label_x *tmp1 = NULL; + icon_x *tmp2 = NULL; + category_x *tmp3 = NULL; + metadata_x *tmp4 = NULL; + + char *query = NULL; + sqlite3 *appinfo_db = NULL; + + /*open db*/ + ret = db_util_open(MANIFEST_DB, &appinfo_db, 0); + retvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB); + + /*check appid exist on db*/ + query = sqlite3_mprintf("select exists(select * from disabled_package_app_info where app_id=%Q)", appid); + ret = __exec_db_query(appinfo_db, query, _pkgmgrinfo_validate_cb, (void *)&exist); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "sqlite3_exec fail"); + tryvm_if(exist == 0, ret = PMINFO_R_ERROR, "Appid[%s] not found in DB", appid); + + /*get system locale*/ + locale = __convert_system_locale_to_manifest_locale(); + tryvm_if(locale == NULL, ret = PMINFO_R_ERROR, "manifest locale is NULL"); + + /*calloc appinfo*/ + appinfo = (pkgmgr_appinfo_x *)calloc(1, sizeof(pkgmgr_appinfo_x)); + tryvm_if(appinfo == NULL, ret = PMINFO_R_ERROR, "Failed to allocate memory for appinfo"); + + /*calloc app_component*/ + appinfo->uiapp_info = (uiapplication_x *)calloc(1, sizeof(uiapplication_x)); + tryvm_if(appinfo->uiapp_info == NULL, ret = PMINFO_R_ERROR, "Failed to allocate memory for uiapp info"); + + appinfo->locale = strdup(locale); + + /*populate app_info from DB*/ + query = sqlite3_mprintf("select * from disabled_package_app_info where app_id=%Q ", appid); + ret = __exec_db_query(appinfo_db, query, __appinfo_cb, (void *)appinfo); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "App Info DB Information retrieval failed"); + + query = sqlite3_mprintf("select * from disabled_package_app_localized_info where app_id=%Q and app_locale=%Q", appid, locale); + ret = __exec_db_query(appinfo_db, query, __appinfo_cb, (void *)appinfo); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "App Info DB Information retrieval failed"); + + /*Also store the values corresponding to default locales*/ + query = sqlite3_mprintf("select * from disabled_package_app_localized_info where app_id=%Q and app_locale=%Q", appid, DEFAULT_LOCALE); + ret = __exec_db_query(appinfo_db, query, __appinfo_cb, (void *)appinfo); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "App Localized Info DB Information retrieval failed"); + + /*Populate app category*/ + query = sqlite3_mprintf("select * from disabled_package_app_app_category where app_id=%Q", appid); + ret = __exec_db_query(appinfo_db, query, __appinfo_cb, (void *)appinfo); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "App Category Info DB Information retrieval failed"); + + /*Populate app metadata*/ + query = sqlite3_mprintf("select * from disabled_package_app_app_metadata where app_id=%Q", appid); + ret = __exec_db_query(appinfo_db, query, __appinfo_cb, (void *)appinfo); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "App Metadata Info DB Information retrieval failed"); + + SAFE_LISTHEAD(appinfo->uiapp_info->label, tmp1); + SAFE_LISTHEAD(appinfo->uiapp_info->icon, tmp2); + SAFE_LISTHEAD(appinfo->uiapp_info->category, tmp3); + SAFE_LISTHEAD(appinfo->uiapp_info->metadata, tmp4); + + ret = PMINFO_R_OK; + +catch: + if (ret == PMINFO_R_OK) + *handle = (void*)appinfo; + else { + *handle = NULL; + __cleanup_appinfo(appinfo); + } + + sqlite3_close(appinfo_db); + if (locale) { + free(locale); + locale = NULL; + } + return ret; +} + +API int pkgmgrinfo_appinfo_get_disabled_list(pkgmgrinfo_pkginfo_h handle, pkgmgrinfo_app_component component, + pkgmgrinfo_app_list_cb app_func, void *user_data) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL"); + retvm_if(app_func == NULL, PMINFO_R_EINVAL, "callback pointer is NULL"); + retvm_if((component != PMINFO_UI_APP) && (component != PMINFO_SVC_APP) && (component != PMINFO_ALL_APP), PMINFO_R_EINVAL, "Invalid App Component Type"); + + char *locale = NULL; + int ret = -1; + char query[MAX_QUERY_LEN] = {'\0'}; + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + pkgmgr_pkginfo_x *allinfo = NULL; + pkgmgr_appinfo_x *appinfo = NULL; + icon_x *ptr1 = NULL; + label_x *ptr2 = NULL; + category_x *ptr3 = NULL; + metadata_x *ptr4 = NULL; + permission_x *ptr5 = NULL; + image_x *ptr6 = NULL; + sqlite3 *appinfo_db = NULL; + + /*check installed storage*/ + ret = __pkginfo_check_installed_storage(info); + retvm_if(ret < 0, PMINFO_R_EINVAL, "[%s] is installed external, but is not in mmc", info->manifest_info->package); + + /*get system locale*/ + locale = __convert_system_locale_to_manifest_locale(); + tryvm_if(locale == NULL, ret = PMINFO_R_EINVAL, "manifest locale is NULL"); + + /*calloc allinfo*/ + allinfo = (pkgmgr_pkginfo_x *)calloc(1, sizeof(pkgmgr_pkginfo_x)); + tryvm_if(allinfo == NULL, ret = PMINFO_R_ERROR, "Failed to allocate memory for appinfo"); + + /*calloc manifest_info*/ + allinfo->manifest_info = (manifest_x *)calloc(1, sizeof(manifest_x)); + tryvm_if(allinfo->manifest_info == NULL, ret = PMINFO_R_ERROR, "Out of Memory!!!"); + + /*calloc appinfo*/ + appinfo = (pkgmgr_appinfo_x *)calloc(1, sizeof(pkgmgr_appinfo_x)); + tryvm_if(appinfo == NULL, ret = PMINFO_R_ERROR, "Failed to allocate memory for appinfo"); + + /*open db */ + ret = db_util_open(MANIFEST_DB, &appinfo_db, 0); + tryvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB); + + snprintf(query, MAX_QUERY_LEN, "select DISTINCT * from disabled_package_app_info where package='%s'", info->manifest_info->package); + + /*Populate ui app info */ + ret = __exec_db_query(appinfo_db, query, __uiapp_list_cb, (void *)info); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "App Info list retrieval failed"); + + uiapplication_x *tmp = NULL; + SAFE_LISTHEAD(info->manifest_info->uiapplication, tmp); + + /*Populate localized info for default locales and call callback*/ + /*If the callback func return < 0 we break and no more call back is called*/ + while(tmp != NULL) + { + if (locale) + appinfo->locale = strdup(locale); + appinfo->uiapp_info = tmp; + if (strcmp(appinfo->uiapp_info->type,"c++app") == 0){ + if (locale) { + free(locale); + } + locale = __get_app_locale_by_fallback(appinfo_db, appinfo->uiapp_info->appid); + } + + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select * from disabled_package_app_localized_info where app_id='%s' and app_locale='%s'", appinfo->uiapp_info->appid, locale); + ret = __exec_db_query(appinfo_db, query, __appinfo_cb, (void *)appinfo); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "App Localized Info DB Information retrieval failed"); + + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select * from disabled_package_app_localized_info where app_id='%s' and app_locale='%s'", appinfo->uiapp_info->appid, DEFAULT_LOCALE); + ret = __exec_db_query(appinfo_db, query, __appinfo_cb, (void *)appinfo); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "App Localized Info DB Information retrieval failed"); + + /*Populate app category*/ + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select * from disabled_package_app_app_category where app_id=='%s'", appinfo->uiapp_info->appid); + ret = __exec_db_query(appinfo_db, query, __appinfo_cb, (void *)appinfo); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "App Category Info DB Information retrieval failed"); + + /*Populate app metadata*/ + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select * from disabled_package_app_app_metadata where app_id='%s'", appinfo->uiapp_info->appid); + ret = __exec_db_query(appinfo_db, query, __appinfo_cb, (void *)appinfo); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "App Metadata Info DB Information retrieval failed"); + + SAFE_LISTHEAD(appinfo->uiapp_info->icon, ptr1); + SAFE_LISTHEAD(appinfo->uiapp_info->label, ptr2); + SAFE_LISTHEAD(appinfo->uiapp_info->category, ptr3); + SAFE_LISTHEAD(appinfo->uiapp_info->metadata, ptr4); + SAFE_LISTHEAD(appinfo->uiapp_info->permission, ptr5); + SAFE_LISTHEAD(appinfo->uiapp_info->image, ptr6); + + ret = app_func((void *)appinfo, user_data); + if (ret < 0) + break; + tmp = tmp->next; + } + + ret = PMINFO_R_OK; +catch: + if (locale) { + free(locale); + locale = NULL; + } + if (appinfo) { + free(appinfo); + appinfo = NULL; + } + __cleanup_pkginfo(allinfo); + + sqlite3_close(appinfo_db); + return ret; +} diff --git a/src/pkgmgrinfo_pkginfo.c b/src/pkgmgrinfo_pkginfo.c new file mode 100644 index 0000000..ba1a2e8 --- /dev/null +++ b/src/pkgmgrinfo_pkginfo.c @@ -0,0 +1,2074 @@ +/* + * pkgmgr-info + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "pkgmgrinfo_private.h" + +#ifdef LOG_TAG +#undef LOG_TAG +#endif +#define LOG_TAG "PKGMGR_INFO" + +#define FILTER_QUERY_LIST_PACKAGE "select * from package_info LEFT OUTER JOIN package_localized_info " \ + "ON package_info.package=package_localized_info.package " \ + "and package_localized_info.package_locale IN ('%s', '%s') where " + + +typedef struct _pkgmgr_cert_x { + char *pkgid; + int cert_id; +} pkgmgr_cert_x; + +static void __destroy_each_node(gpointer data, gpointer user_data) +{ + ret_if(data == NULL); + pkgmgrinfo_node_x *node = (pkgmgrinfo_node_x*)data; + FREE_AND_NULL(node->value); + FREE_AND_NULL(node->key); + FREE_AND_NULL(node); +} + +static void __get_pkginfo_from_db(char *colname, char *coltxt, manifest_x *manifest_info) +{ + if (colname == NULL || manifest_info == NULL) + return; + + if (strcmp(colname, "package") == 0) { + if (manifest_info->package) + return; + + if (coltxt) + manifest_info->package = strdup(coltxt); + } else if (strcmp(colname, "package_type") == 0) { + if (coltxt) + manifest_info->type = strdup(coltxt); + else + manifest_info->type = NULL; + } else if (strcmp(colname, "package_version") == 0) { + if (coltxt) + manifest_info->version = strdup(coltxt); + else + manifest_info->version = NULL; + } else if (strcmp(colname, "install_location") == 0) { + if (coltxt) + manifest_info->installlocation = strdup(coltxt); + else + manifest_info->installlocation = NULL; + } else if (strcmp(colname, "package_size") == 0) { + if (coltxt) + manifest_info->package_size = strdup(coltxt); + else + manifest_info->package_size = NULL; + } else if (strcmp(colname, "package_removable") == 0 ){ + if (coltxt) + manifest_info->removable = strdup(coltxt); + else + manifest_info->removable = NULL; + } else if (strcmp(colname, "package_preload") == 0 ){ + if (coltxt) + manifest_info->preload = strdup(coltxt); + else + manifest_info->preload = NULL; + } else if (strcmp(colname, "package_readonly") == 0 ){ + if (coltxt) + manifest_info->readonly = strdup(coltxt); + else + manifest_info->readonly = NULL; + } else if (strcmp(colname, "package_update") == 0 ){ + if (coltxt) + manifest_info->update= strdup(coltxt); + else + manifest_info->update = NULL; + } else if (strcmp(colname, "package_system") == 0 ){ + if (coltxt) + manifest_info->system= strdup(coltxt); + else + manifest_info->system = NULL; + } else if (strcmp(colname, "package_appsetting") == 0 ){ + if (coltxt) + manifest_info->appsetting = strdup(coltxt); + else + manifest_info->appsetting = NULL; + } else if (strcmp(colname, "installed_time") == 0 ){ + if (coltxt) + manifest_info->installed_time = strdup(coltxt); + else + manifest_info->installed_time = NULL; + } else if (strcmp(colname, "installed_storage") == 0 ){ + if (coltxt) + manifest_info->installed_storage = strdup(coltxt); + else + manifest_info->installed_storage = NULL; + } else if (strcmp(colname, "mainapp_id") == 0 ){ + if (coltxt) + manifest_info->mainapp_id = strdup(coltxt); + else + manifest_info->mainapp_id = NULL; + } else if (strcmp(colname, "storeclient_id") == 0 ){ + if (coltxt) + manifest_info->storeclient_id = strdup(coltxt); + else + manifest_info->storeclient_id = NULL; + } else if (strcmp(colname, "package_url") == 0 ){ + if (coltxt) + manifest_info->package_url = strdup(coltxt); + else + manifest_info->package_url = NULL; + } else if (strcmp(colname, "root_path") == 0 ){ + if (coltxt) + manifest_info->root_path = strdup(coltxt); + else + manifest_info->root_path = NULL; + } else if (strcmp(colname, "csc_path") == 0 ){ + if (coltxt) + manifest_info->csc_path = strdup(coltxt); + else + manifest_info->csc_path = NULL; + } else if (strcmp(colname, "package_support_disable") == 0 ){ + if (coltxt) + manifest_info->support_disable = strdup(coltxt); + else + manifest_info->support_disable = NULL; + } else if (strcmp(colname, "package_mother_package") == 0 ){ + if (coltxt) + manifest_info->mother_package = strdup(coltxt); + else + manifest_info->mother_package = NULL; + } else if (strcmp(colname, "package_support_mode") == 0 ){ + if (coltxt) + manifest_info->support_mode = strdup(coltxt); + else + manifest_info->support_mode = NULL; + } else if (strcmp(colname, "package_reserve1") == 0 ){ + if (coltxt) + manifest_info->support_reset = strdup(coltxt); + else + manifest_info->support_reset = NULL; + } else if (strcmp(colname, "package_reserve2") == 0 ){ + if (coltxt) + manifest_info->use_reset = strdup(coltxt); + else + manifest_info->use_reset = NULL; + } else if (strcmp(colname, "package_hash") == 0 ){ + if (coltxt) + manifest_info->hash = strdup(coltxt); + else + manifest_info->hash = NULL; + } else if (strcmp(colname, "package_reserve3") == 0 ){ + if (coltxt) + manifest_info->groupid = strdup(coltxt); + else + manifest_info->groupid = NULL; + + /*end package_info table*/ + + } else if (strcmp(colname, "author_email") == 0 ){ + if (coltxt) + manifest_info->author->email = strdup(coltxt); + else + manifest_info->author->email = NULL; + } else if (strcmp(colname, "author_href") == 0 ){ + if (coltxt) + manifest_info->author->href = strdup(coltxt); + else + manifest_info->author->href = NULL; + } else if (strcmp(colname, "package_label") == 0 ){ + if (coltxt) + manifest_info->label->text = strdup(coltxt); + else + manifest_info->label->text = NULL; + } else if (strcmp(colname, "package_icon") == 0 ){ + if (coltxt) + manifest_info->icon->text = strdup(coltxt); + else + manifest_info->icon->text = NULL; + } else if (strcmp(colname, "package_description") == 0 ){ + if (coltxt) + manifest_info->description->text = strdup(coltxt); + else + manifest_info->description->text = NULL; + } else if (strcmp(colname, "package_author") == 0 ){ + if (coltxt) + manifest_info->author->text = strdup(coltxt); + else + manifest_info->author->text = NULL; + } else if (strcmp(colname, "package_locale") == 0 ){ + if (coltxt) { + manifest_info->author->lang = strdup(coltxt); + manifest_info->icon->lang = strdup(coltxt); + manifest_info->label->lang = strdup(coltxt); + manifest_info->description->lang = strdup(coltxt); + } + else { + manifest_info->author->lang = NULL; + manifest_info->icon->lang = NULL; + manifest_info->label->lang = NULL; + manifest_info->description->lang = NULL; + } + /*end package_localized_info table*/ + + } else if (strcmp(colname, "privilege") == 0 ){ + if (coltxt) + manifest_info->privileges->privilege->text = strdup(coltxt); + else + manifest_info->privileges->privilege->text = NULL; + + } + /*end package_privilege_info table*/ + +} + +static void __get_pkginfo_for_list(sqlite3_stmt *stmt, pkgmgr_pkginfo_x *udata) +{ + int i = 0; + int ncols = 0; + char *colname = NULL; + char *coltxt = NULL; + pkgmgr_pkginfo_x *info = NULL; + + info = calloc(1, sizeof(pkgmgr_pkginfo_x)); + if (info == NULL) { + _LOGE("out of memory"); + return; + } + + info->manifest_info = (manifest_x *)calloc(1, sizeof(manifest_x)); + if (info->manifest_info == NULL) { + _LOGE("out of memory"); + free(info); + return; + } + + info->manifest_info->icon= (icon_x *)calloc(1, sizeof(icon_x)); + if (info->manifest_info->icon == NULL) { + _LOGE("out of memory"); + free(info->manifest_info); + free(info); + return; + } + + info->manifest_info->label= (label_x *)calloc(1, sizeof(label_x)); + if (info->manifest_info->label == NULL) { + _LOGE("out of memory"); + free(info->manifest_info->icon); + free(info->manifest_info); + free(info); + return; + } + + info->manifest_info->author= (author_x *)calloc(1, sizeof(author_x)); + if (info->manifest_info->author == NULL) { + _LOGE("out of memory"); + free(info->manifest_info->label); + free(info->manifest_info->icon); + free(info->manifest_info); + free(info); + return; + } + + info->manifest_info->description= (description_x *)calloc(1, sizeof(description_x)); + if (info->manifest_info->description == NULL) { + _LOGE("out of memory"); + free(info->manifest_info->author); + free(info->manifest_info->label); + free(info->manifest_info->icon); + free(info->manifest_info); + free(info); + return; + } + + ncols = sqlite3_column_count(stmt); + + LISTADD(udata, info); + + for(i = 0; i < ncols; i++) + { + colname = (char *)sqlite3_column_name(stmt, i); + coltxt = (char *)sqlite3_column_text(stmt, i); + +// _LOGE("field value :: %s = %s \n", colname, coltxt); + __get_pkginfo_from_db(colname, coltxt, info->manifest_info); + } +} + +static void __update_localed_label_for_list(sqlite3_stmt *stmt, pkgmgr_pkginfo_x *list_pkginfo) +{ + int i = 0; + int ncols = 0; + char *colname = NULL; + char *coltxt = NULL; + + pkgmgr_pkginfo_x *node = NULL; + pkgmgr_pkginfo_x *pkginfo = NULL; + + LISTHEAD(list_pkginfo, node); + pkginfo = node->next; + + ncols = sqlite3_column_count(stmt); + + for(i = 0; i < ncols; i++) + { + colname = (char *)sqlite3_column_name(stmt, i); + if (colname && strcmp(colname, "package_label") == 0 ){ + coltxt = (char *)sqlite3_column_text(stmt, i); + FREE_AND_STRDUP(coltxt, pkginfo->manifest_info->label->text); + } + } +} + +int __pkginfo_cb(void *data, int ncols, char **coltxt, char **colname) +{ + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)data; + int i = 0; + author_x *author = NULL; + icon_x *icon = NULL; + label_x *label = NULL; + description_x *description = NULL; + privilege_x *privilege = NULL; + + author = calloc(1, sizeof(author_x)); + retvm_if(author == NULL, PMINFO_R_ERROR, "out of memory"); + LISTADD(info->manifest_info->author, author); + icon = calloc(1, sizeof(icon_x)); + retvm_if(icon == NULL, PMINFO_R_ERROR, "out of memory"); + LISTADD(info->manifest_info->icon, icon); + label = calloc(1, sizeof(label_x)); + retvm_if(label == NULL, PMINFO_R_ERROR, "out of memory"); + LISTADD(info->manifest_info->label, label); + description = calloc(1, sizeof(description_x)); + retvm_if(description == NULL, PMINFO_R_ERROR, "out of memory"); + LISTADD(info->manifest_info->description, description); + privilege = calloc(1, sizeof(privilege_x)); + retvm_if(privilege == NULL, PMINFO_R_ERROR, "out of memory"); + LISTADD(info->manifest_info->privileges->privilege, privilege); + + for(i = 0; i < ncols; i++) + { + __get_pkginfo_from_db(colname[i], coltxt[i], info->manifest_info); + } + return 0; +} + +static int __cert_cb(void *data, int ncols, char **coltxt, char **colname) +{ + pkgmgr_cert_x *info = (pkgmgr_cert_x *)data; + int i = 0; + + for(i = 0; i < ncols; i++) + { + if (strcmp(colname[i], "author_signer_cert") == 0) { + if (coltxt[i]) + info->cert_id = atoi(coltxt[i]); + else + info->cert_id = 0; + } else if (strcmp(colname[i], "package") == 0) { + if (coltxt[i] && info->pkgid == NULL) { + info->pkgid= strdup(coltxt[i]); + } else { + if (info->pkgid) + free(info->pkgid); + + info->pkgid = NULL; + } + } else + continue; + } + return 0; +} + +API int pkgmgrinfo_pkginfo_get_list(pkgmgrinfo_pkg_list_cb pkg_list_cb, void *user_data) +{ + retvm_if(pkg_list_cb == NULL, PMINFO_R_EINVAL, "callback function is NULL\n"); + + int ret = PMINFO_R_OK; + char *locale = NULL; + char *query = NULL; + + char pkgid[MAX_QUERY_LEN] = {0,}; + char pre_pkgid[MAX_QUERY_LEN] = {0,}; + + sqlite3 *pkginfo_db = NULL; + sqlite3_stmt *stmt = NULL; + + pkgmgr_pkginfo_x *node = NULL; + pkgmgr_pkginfo_x *pkginfo = NULL; + pkgmgr_pkginfo_x *list_pkginfo = NULL; + + /*open db*/ + ret = db_util_open(MANIFEST_DB, &pkginfo_db, 0); + retvm_if(ret != SQLITE_OK, PMINFO_R_ERROR, "db_util_open[%s] failed!", MANIFEST_DB); + + /*Start constructing query*/ + locale = __convert_system_locale_to_manifest_locale(); + retvm_if(locale == NULL, PMINFO_R_ERROR, "locale is NULL"); + query = sqlite3_mprintf("select * from package_info LEFT OUTER JOIN package_localized_info " \ + "ON package_info.package=package_localized_info.package "\ + "where package_info.package_disable='false' and package_localized_info.package_locale IN (%Q, %Q)", DEFAULT_LOCALE, locale); + + /*prepare query*/ + ret = sqlite3_prepare_v2(pkginfo_db, query, strlen(query), &stmt, NULL); + tryvm_if(ret != PMINFO_R_OK, ret = PMINFO_R_ERROR, "sqlite3_prepare_v2 failed[%s]\n", query); + + /*calloc pkginfo_x*/ + list_pkginfo = (pkgmgr_pkginfo_x *)calloc(1, sizeof(pkgmgr_pkginfo_x)); + tryvm_if(list_pkginfo == NULL, ret = PMINFO_R_ERROR, "Out of Memory!!!\n"); + + /*step query*/ + while(1) { + ret = sqlite3_step(stmt); + if(ret == SQLITE_ROW) { + + memset(pkgid, 0, MAX_QUERY_LEN); + strncpy(pkgid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + + if (strlen(pre_pkgid) != 0) { + if (strcmp(pre_pkgid, pkgid) == 0) { + __update_localed_label_for_list(stmt, list_pkginfo); + + memset(pre_pkgid, 0, MAX_QUERY_LEN); + strncpy(pre_pkgid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + + continue; + } else { + memset(pre_pkgid, 0, MAX_QUERY_LEN); + strncpy(pre_pkgid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + } + } else { + strncpy(pre_pkgid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + } + + __get_pkginfo_for_list(stmt, list_pkginfo); + + } else { + break; + } + } + + LISTHEAD(list_pkginfo, node); + + for(node = node->next; node ; node = node->next) { + pkginfo = node; + pkginfo->locale = strdup(locale); + + ret = __pkginfo_check_installed_storage(pkginfo); + if(ret < 0) + continue; + + ret = pkg_list_cb( (void *)pkginfo, user_data); + if(ret < 0) + break; + } + +catch: + sqlite3_free(query); + sqlite3_finalize(stmt); + sqlite3_close(pkginfo_db); + FREE_AND_NULL(locale); + + __cleanup_list_pkginfo(list_pkginfo, node); + + return ret; +} + +API int pkgmgrinfo_pkginfo_get_mounted_list(pkgmgrinfo_pkg_list_cb pkg_list_cb, void *user_data) +{ + retvm_if(pkg_list_cb == NULL, PMINFO_R_EINVAL, "callback function is NULL\n"); + + int ret = PMINFO_R_OK; + char *locale = NULL; + char *query = NULL; + + char pkgid[MAX_QUERY_LEN] = {0,}; + char pre_pkgid[MAX_QUERY_LEN] = {0,}; + + sqlite3 *pkginfo_db = NULL; + sqlite3_stmt *stmt = NULL; + + pkgmgr_pkginfo_x *node = NULL; + pkgmgr_pkginfo_x *pkginfo = NULL; + pkgmgr_pkginfo_x *list_pkginfo = NULL; + + /*open db*/ + ret = db_util_open(MANIFEST_DB, &pkginfo_db, 0); + retvm_if(ret != SQLITE_OK, PMINFO_R_ERROR, "db_util_open[%s] failed!", MANIFEST_DB); + + /*Start constructing query*/ + locale = __convert_system_locale_to_manifest_locale(); + retvm_if(locale == NULL, PMINFO_R_ERROR, "locale is NULL"); + query = sqlite3_mprintf("select * from package_info LEFT OUTER JOIN package_localized_info " \ + "ON package_info.package=package_localized_info.package "\ + "where installed_storage='installed_external' and package_info.package_disable='false' and package_localized_info.package_locale IN (%Q, %Q)", DEFAULT_LOCALE, locale); + + /*prepare query*/ + ret = sqlite3_prepare_v2(pkginfo_db, query, strlen(query), &stmt, NULL); + tryvm_if(ret != PMINFO_R_OK, ret = PMINFO_R_ERROR, "sqlite3_prepare_v2 failed[%s]\n", query); + + /*calloc pkginfo_x*/ + list_pkginfo = (pkgmgr_pkginfo_x *)calloc(1, sizeof(pkgmgr_pkginfo_x)); + tryvm_if(list_pkginfo == NULL, ret = PMINFO_R_ERROR, "Out of Memory!!!\n"); + + /*step query*/ + while(1) { + ret = sqlite3_step(stmt); + if(ret == SQLITE_ROW) { + + memset(pkgid, 0, MAX_QUERY_LEN); + strncpy(pkgid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + + if (strlen(pre_pkgid) != 0) { + if (strcmp(pre_pkgid, pkgid) == 0) { + __update_localed_label_for_list(stmt, list_pkginfo); + + memset(pre_pkgid, 0, MAX_QUERY_LEN); + strncpy(pre_pkgid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + continue; + } else { + memset(pre_pkgid, 0, MAX_QUERY_LEN); + strncpy(pre_pkgid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + } + } else { + strncpy(pre_pkgid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + } + + __get_pkginfo_for_list(stmt, list_pkginfo); + + } else { + break; + } + } + + LISTHEAD(list_pkginfo, node); + + for(node = node->next; node ; node = node->next) { + pkginfo = node; + pkginfo->locale = strdup(locale); + + ret = __pkginfo_check_installed_storage(pkginfo); + if(ret < 0) + continue; + + ret = pkg_list_cb( (void *)pkginfo, user_data); + if(ret < 0) + break; + } + +catch: + sqlite3_free(query); + sqlite3_finalize(stmt); + sqlite3_close(pkginfo_db); + FREE_AND_NULL(locale); + + __cleanup_list_pkginfo(list_pkginfo, node); + + return ret; +} + + +API int pkgmgrinfo_pkginfo_get_unmounted_list(pkgmgrinfo_pkg_list_cb pkg_list_cb, void *user_data) +{ + retvm_if(pkg_list_cb == NULL, PMINFO_R_EINVAL, "callback function is NULL\n"); + + int ret = PMINFO_R_OK; + char *locale = NULL; + char *query = NULL; + + char pkgid[MAX_QUERY_LEN] = {0,}; + char pre_pkgid[MAX_QUERY_LEN] = {0,}; + + sqlite3 *pkginfo_db = NULL; + sqlite3_stmt *stmt = NULL; + + pkgmgr_pkginfo_x *node = NULL; + pkgmgr_pkginfo_x *pkginfo = NULL; + pkgmgr_pkginfo_x *list_pkginfo = NULL; + + /*open db*/ + ret = db_util_open(MANIFEST_DB, &pkginfo_db, 0); + retvm_if(ret != SQLITE_OK, PMINFO_R_ERROR, "db_util_open[%s] failed!", MANIFEST_DB); + + /*Start constructing query*/ + locale = __convert_system_locale_to_manifest_locale(); + retvm_if(locale == NULL, PMINFO_R_ERROR, "locale is NULL"); + query = sqlite3_mprintf("select * from package_info LEFT OUTER JOIN package_localized_info " \ + "ON package_info.package=package_localized_info.package "\ + "where installed_storage='installed_external' and package_info.package_disable='false' and package_localized_info.package_locale IN (%Q, %Q)", DEFAULT_LOCALE, locale); + + /*prepare query*/ + ret = sqlite3_prepare_v2(pkginfo_db, query, strlen(query), &stmt, NULL); + tryvm_if(ret != PMINFO_R_OK, ret = PMINFO_R_ERROR, "sqlite3_prepare_v2 failed[%s]\n", query); + + /*calloc pkginfo_x*/ + list_pkginfo = (pkgmgr_pkginfo_x *)calloc(1, sizeof(pkgmgr_pkginfo_x)); + tryvm_if(list_pkginfo == NULL, ret = PMINFO_R_ERROR, "Out of Memory!!!\n"); + + /*step query*/ + while(1) { + ret = sqlite3_step(stmt); + if(ret == SQLITE_ROW) { + + memset(pkgid, 0, MAX_QUERY_LEN); + strncpy(pkgid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + + if (strlen(pre_pkgid) != 0) { + if (strcmp(pre_pkgid, pkgid) == 0) { + __update_localed_label_for_list(stmt, list_pkginfo); + + memset(pre_pkgid, 0, MAX_QUERY_LEN); + strncpy(pre_pkgid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + + continue; + } else { + memset(pre_pkgid, 0, MAX_QUERY_LEN); + strncpy(pre_pkgid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + } + } else { + strncpy(pre_pkgid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + } + + __get_pkginfo_for_list(stmt, list_pkginfo); + + } else { + break; + } + } + + LISTHEAD(list_pkginfo, node); + + for(node = node->next; node ; node = node->next) { + pkginfo = node; + pkginfo->locale = strdup(locale); + + ret = pkg_list_cb( (void *)pkginfo, user_data); + if(ret < 0) + break; + } + +catch: + sqlite3_free(query); + sqlite3_finalize(stmt); + sqlite3_close(pkginfo_db); + FREE_AND_NULL(locale); + + __cleanup_list_pkginfo(list_pkginfo, node); + + return ret; +} + +API int pkgmgrinfo_pkginfo_get_unmounted_pkginfo(const char *pkgid, pkgmgrinfo_pkginfo_h *handle) +{ + retvm_if(pkgid == NULL, PMINFO_R_EINVAL, "pkgid is NULL\n"); + retvm_if(handle == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + pkgmgr_pkginfo_x *pkginfo = NULL; + int ret = PMINFO_R_OK; + char *query = NULL; + char *locale = NULL; + int exist = 0; + label_x *tmp1 = NULL; + icon_x *tmp2 = NULL; + description_x *tmp3 = NULL; + author_x *tmp4 = NULL; + privilege_x *tmp5 = NULL; + sqlite3 *pkginfo_db = NULL; + + /*validate pkgid*/ + ret = db_util_open(MANIFEST_DB, &pkginfo_db, 0); + retvm_if(ret != SQLITE_OK, PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB); + + /*check pkgid exist on db*/ + query= sqlite3_mprintf("select exists(select * from package_info where package=%Q and package_disable='false')", pkgid); + ret = __exec_db_query(pkginfo_db, query, _pkgmgrinfo_validate_cb, (void *)&exist); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "sqlite3_exec[%s] fail", pkgid); + tryvm_if(exist == 0, ret = PMINFO_R_ERROR, "pkgid[%s] not found in DB", pkgid); + + /*get system locale*/ + locale = __convert_system_locale_to_manifest_locale(); + tryvm_if(locale == NULL, ret = PMINFO_R_ERROR, "manifest locale is NULL"); + + pkginfo = (pkgmgr_pkginfo_x *)calloc(1, sizeof(pkgmgr_pkginfo_x)); + tryvm_if(pkginfo == NULL, ret = PMINFO_R_ERROR, "Failed to allocate memory for pkginfo"); + + pkginfo->locale = strdup(locale); + + pkginfo->manifest_info = (manifest_x *)calloc(1, sizeof(manifest_x)); + tryvm_if(pkginfo->manifest_info == NULL, ret = PMINFO_R_ERROR, "Failed to allocate memory for manifest info"); + + pkginfo->manifest_info->package = strdup(pkgid); + pkginfo->manifest_info->privileges = (privileges_x *)calloc(1, sizeof(privileges_x)); + tryvm_if(pkginfo->manifest_info->privileges == NULL, ret = PMINFO_R_ERROR, "Failed to allocate memory for privileges info"); + + /*populate manifest_info from DB*/ + query= sqlite3_mprintf("select * from package_info where package=%Q and package_disable='false'", pkgid); + ret = __exec_db_query(pkginfo_db, query, __pkginfo_cb, (void *)pkginfo); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "Package Info DB Information retrieval failed"); + + /*populate privilege_info from DB*/ + query= sqlite3_mprintf("select * from package_privilege_info where package=%Q ", pkgid); + ret = __exec_db_query(pkginfo_db, query, __pkginfo_cb, (void *)pkginfo); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "Package Privilege Info DB Information retrieval failed"); + + query= sqlite3_mprintf("select * from package_localized_info where package=%Q and package_locale=%Q", pkgid, locale); + ret = __exec_db_query(pkginfo_db, query, __pkginfo_cb, (void *)pkginfo); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "Package Info DB Information retrieval failed"); + + /*Also store the values corresponding to default locales*/ + query= sqlite3_mprintf("select * from package_localized_info where package=%Q and package_locale=%Q", pkgid, DEFAULT_LOCALE); + ret = __exec_db_query(pkginfo_db, query, __pkginfo_cb, (void *)pkginfo); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "Package Info DB Information retrieval failed"); + + SAFE_LISTHEAD(pkginfo->manifest_info->label, tmp1); + SAFE_LISTHEAD(pkginfo->manifest_info->icon, tmp2); + SAFE_LISTHEAD(pkginfo->manifest_info->description, tmp3); + SAFE_LISTHEAD(pkginfo->manifest_info->author, tmp4); + SAFE_LISTHEAD(pkginfo->manifest_info->privileges->privilege, tmp5); + +catch: + if (ret == PMINFO_R_OK) + *handle = (void*)pkginfo; + else { + *handle = NULL; + __cleanup_pkginfo(pkginfo); + } + sqlite3_close(pkginfo_db); + + FREE_AND_NULL(locale); + return ret; +} + +API int pkgmgrinfo_pkginfo_get_pkginfo(const char *pkgid, pkgmgrinfo_pkginfo_h *handle) +{ + retvm_if(pkgid == NULL, PMINFO_R_EINVAL, "pkgid is NULL\n"); + retvm_if(handle == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + pkgmgr_pkginfo_x *pkginfo = NULL; + int ret = PMINFO_R_OK; + char *query = NULL; + char *locale = NULL; + int exist = 0; + label_x *tmp1 = NULL; + icon_x *tmp2 = NULL; + description_x *tmp3 = NULL; + author_x *tmp4 = NULL; + privilege_x *tmp5 = NULL; + sqlite3 *pkginfo_db = NULL; + + /*validate pkgid*/ + ret = db_util_open(MANIFEST_DB, &pkginfo_db, 0); + retvm_if(ret != SQLITE_OK, PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB); + + /*check pkgid exist on db*/ + query= sqlite3_mprintf("select exists(select * from package_info where package=%Q and package_disable='false')", pkgid); + ret = __exec_db_query(pkginfo_db, query, _pkgmgrinfo_validate_cb, (void *)&exist); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "sqlite3_exec[%s] fail", pkgid); + if (exist == 0) { + _LOGS("pkgid[%s] not found in DB", pkgid); + ret = PMINFO_R_ERROR; + goto catch; + } + + /*get system locale*/ + locale = __convert_system_locale_to_manifest_locale(); + tryvm_if(locale == NULL, ret = PMINFO_R_ERROR, "manifest locale is NULL"); + + pkginfo = (pkgmgr_pkginfo_x *)calloc(1, sizeof(pkgmgr_pkginfo_x)); + tryvm_if(pkginfo == NULL, ret = PMINFO_R_ERROR, "Failed to allocate memory for pkginfo"); + + pkginfo->locale = strdup(locale); + + pkginfo->manifest_info = (manifest_x *)calloc(1, sizeof(manifest_x)); + tryvm_if(pkginfo->manifest_info == NULL, ret = PMINFO_R_ERROR, "Failed to allocate memory for manifest info"); + + pkginfo->manifest_info->package = strdup(pkgid); + pkginfo->manifest_info->privileges = (privileges_x *)calloc(1, sizeof(privileges_x)); + tryvm_if(pkginfo->manifest_info->privileges == NULL, ret = PMINFO_R_ERROR, "Failed to allocate memory for privileges info"); + + /*populate manifest_info from DB*/ + query= sqlite3_mprintf("select * from package_info where package=%Q and package_disable='false'", pkgid); + ret = __exec_db_query(pkginfo_db, query, __pkginfo_cb, (void *)pkginfo); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "Package Info DB Information retrieval failed"); + + /*populate privilege_info from DB*/ + query= sqlite3_mprintf("select * from package_privilege_info where package=%Q ", pkgid); + ret = __exec_db_query(pkginfo_db, query, __pkginfo_cb, (void *)pkginfo); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "Package Privilege Info DB Information retrieval failed"); + + query= sqlite3_mprintf("select * from package_localized_info where package=%Q and package_locale=%Q", pkgid, locale); + ret = __exec_db_query(pkginfo_db, query, __pkginfo_cb, (void *)pkginfo); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "Package Info DB Information retrieval failed"); + + /*Also store the values corresponding to default locales*/ + query= sqlite3_mprintf("select * from package_localized_info where package=%Q and package_locale=%Q", pkgid, DEFAULT_LOCALE); + ret = __exec_db_query(pkginfo_db, query, __pkginfo_cb, (void *)pkginfo); + sqlite3_free(query); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "Package Info DB Information retrieval failed"); + + SAFE_LISTHEAD(pkginfo->manifest_info->label, tmp1); + SAFE_LISTHEAD(pkginfo->manifest_info->icon, tmp2); + SAFE_LISTHEAD(pkginfo->manifest_info->description, tmp3); + SAFE_LISTHEAD(pkginfo->manifest_info->author, tmp4); + SAFE_LISTHEAD(pkginfo->manifest_info->privileges->privilege, tmp5); + + ret = __pkginfo_check_installed_storage(pkginfo); + tryvm_if(ret == -1, ret = PMINFO_R_ERROR, "[%s] is installed external, but is not in mmc", pkgid); + +catch: + if (ret == PMINFO_R_OK) + *handle = (void*)pkginfo; + else { + *handle = NULL; + __cleanup_pkginfo(pkginfo); + } + sqlite3_close(pkginfo_db); + + FREE_AND_NULL(locale); + return ret; +} + + +API int pkgmgrinfo_pkginfo_get_pkgname(pkgmgrinfo_pkginfo_h handle, char **pkg_name) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n"); + retvm_if(pkg_name == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + if (info->manifest_info->package) + *pkg_name = (char *)info->manifest_info->package; + else + return PMINFO_R_ERROR; + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_get_pkgid(pkgmgrinfo_pkginfo_h handle, char **pkgid) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n"); + retvm_if(pkgid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + if (info->manifest_info->package) + *pkgid = (char *)info->manifest_info->package; + else + return PMINFO_R_ERROR; + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_get_type(pkgmgrinfo_pkginfo_h handle, char **type) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n"); + retvm_if(type == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + if (info->manifest_info->type) + *type = (char *)info->manifest_info->type; + else + *type = "rpm"; + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_get_version(pkgmgrinfo_pkginfo_h handle, char **version) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n"); + retvm_if(version == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + *version = (char *)info->manifest_info->version; + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_get_install_location(pkgmgrinfo_pkginfo_h handle, pkgmgrinfo_install_location *location) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n"); + retvm_if(location == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + char *val = NULL; + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + val = (char *)info->manifest_info->installlocation; + if (val) { + if (strcmp(val, "internal-only") == 0) + *location = PMINFO_INSTALL_LOCATION_INTERNAL_ONLY; + else if (strcmp(val, "prefer-external") == 0) + *location = PMINFO_INSTALL_LOCATION_PREFER_EXTERNAL; + else + *location = PMINFO_INSTALL_LOCATION_AUTO; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_get_icon(pkgmgrinfo_pkginfo_h handle, char **icon) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL"); + retvm_if(icon == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + int ret = PMINFO_R_OK; + char *locale = NULL; + icon_x *ptr = NULL; + *icon = NULL; + + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + + locale = info->locale; + retvm_if(locale == NULL, PMINFO_R_ERROR, "manifest locale is NULL"); + + for(ptr = info->manifest_info->icon; ptr != NULL; ptr = ptr->next) + { + if (ptr->lang) { + if (strcmp(ptr->lang, locale) == 0) { + if (ptr->text) { + *icon = (char *)ptr->text; + if (strcasecmp(*icon, PKGMGR_PARSER_EMPTY_STR) == 0) { + locale = DEFAULT_LOCALE; + continue; + } else + break; + } else { + locale = DEFAULT_LOCALE; + continue; + } + } else if (strcmp(ptr->lang, DEFAULT_LOCALE) == 0) { + *icon = (char *)ptr->text; + break; + } + } + } + + return ret; +} + +API int pkgmgrinfo_pkginfo_get_label(pkgmgrinfo_pkginfo_h handle, char **label) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL"); + retvm_if(label == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + int ret = PMINFO_R_OK; + char *locale = NULL; + label_x *ptr = NULL; + *label = NULL; + + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + locale = info->locale; + retvm_if(locale == NULL, PMINFO_R_ERROR, "manifest locale is NULL"); + + for(ptr = info->manifest_info->label; ptr != NULL; ptr = ptr->next) + { + if (ptr->lang) { + if (strcmp(ptr->lang, locale) == 0) { + if (ptr->text) { + *label = (char *)ptr->text; + if (strcasecmp(*label, PKGMGR_PARSER_EMPTY_STR) == 0) { + locale = DEFAULT_LOCALE; + continue; + } else + break; + } else { + locale = DEFAULT_LOCALE; + continue; + } + } else if (strcmp(ptr->lang, DEFAULT_LOCALE) == 0) { + *label = (char *)ptr->text; + break; + } + } + } + + return ret; +} + +API int pkgmgrinfo_pkginfo_get_description(pkgmgrinfo_pkginfo_h handle, char **description) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n"); + retvm_if(description == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + char *locale = NULL; + description_x *ptr = NULL; + *description = NULL; + + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + locale = info->locale; + retvm_if(locale == NULL, PMINFO_R_ERROR, "manifest locale is NULL"); + + for(ptr = info->manifest_info->description; ptr != NULL; ptr = ptr->next) + { + if (ptr->lang) { + if (strcmp(ptr->lang, locale) == 0) { + *description = (char *)ptr->text; + if (strcasecmp(*description, PKGMGR_PARSER_EMPTY_STR) == 0) { + locale = DEFAULT_LOCALE; + continue; + } else + break; + } else if (strcmp(ptr->lang, DEFAULT_LOCALE) == 0) { + *description = (char *)ptr->text; + break; + } + } + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_get_author_name(pkgmgrinfo_pkginfo_h handle, char **author_name) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n"); + retvm_if(author_name == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + char *locale = NULL; + author_x *ptr = NULL; + *author_name = NULL; + + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + locale = info->locale; + retvm_if(locale == NULL, PMINFO_R_ERROR, "manifest locale is NULL"); + + for(ptr = info->manifest_info->author; ptr != NULL; ptr = ptr->next) + { + if (ptr->lang) { + if (strcmp(ptr->lang, locale) == 0) { + *author_name = (char *)ptr->text; + if (strcasecmp(*author_name, PKGMGR_PARSER_EMPTY_STR) == 0) { + locale = DEFAULT_LOCALE; + continue; + } else + break; + } else if (strcmp(ptr->lang, DEFAULT_LOCALE) == 0) { + *author_name = (char *)ptr->text; + break; + } + } + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_get_author_email(pkgmgrinfo_pkginfo_h handle, char **author_email) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n"); + retvm_if(author_email == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + *author_email = (char *)info->manifest_info->author->email; + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_get_author_href(pkgmgrinfo_pkginfo_h handle, char **author_href) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n"); + retvm_if(author_href == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + *author_href = (char *)info->manifest_info->author->href; + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_get_installed_storage(pkgmgrinfo_pkginfo_h handle, pkgmgrinfo_installed_storage *storage) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n"); + retvm_if(storage == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + + if (strcmp(info->manifest_info->installed_storage,"installed_internal") == 0) + *storage = PMINFO_INTERNAL_STORAGE; + else if (strcmp(info->manifest_info->installed_storage,"installed_external") == 0) + *storage = PMINFO_EXTERNAL_STORAGE; + else + return PMINFO_R_ERROR; + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_get_installed_time(pkgmgrinfo_pkginfo_h handle, int *installed_time) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n"); + retvm_if(installed_time == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + if (info->manifest_info->installed_time) + *installed_time = atoi(info->manifest_info->installed_time); + else + return PMINFO_R_ERROR; + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_get_storeclientid(pkgmgrinfo_pkginfo_h handle, char **storeclientid) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n"); + retvm_if(storeclientid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + *storeclientid = (char *)info->manifest_info->storeclient_id; + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_get_mainappid(pkgmgrinfo_pkginfo_h handle, char **mainappid) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n"); + retvm_if(mainappid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + *mainappid = (char *)info->manifest_info->mainapp_id; + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_get_url(pkgmgrinfo_pkginfo_h handle, char **url) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n"); + retvm_if(url == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + *url = (char *)info->manifest_info->package_url; + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_get_root_path(pkgmgrinfo_pkginfo_h handle, char **path) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n"); + retvm_if(path == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + if (info->manifest_info->root_path) + *path = (char *)info->manifest_info->root_path; + else + return PMINFO_R_ERROR; + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_get_csc_path(pkgmgrinfo_pkginfo_h handle, char **path) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n"); + retvm_if(path == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + if (info->manifest_info->csc_path) + *path = (char *)info->manifest_info->csc_path; + else + return PMINFO_R_ERROR; + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_get_support_mode(pkgmgrinfo_pkginfo_h handle, int *support_mode) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n"); + retvm_if(support_mode == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + if (info->manifest_info->support_mode) + *support_mode = atoi(info->manifest_info->support_mode); + else + *support_mode = 0; + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_get_hash(pkgmgrinfo_pkginfo_h handle, char **hash) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n"); + retvm_if(hash == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + if (info->manifest_info->hash) + *hash = (char *)info->manifest_info->hash; + else + *hash = NULL; + + return PMINFO_R_OK; + +} + +API int pkgmgrinfo_pkginfo_get_groupid(pkgmgrinfo_pkginfo_h handle, char **groupid) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n"); + retvm_if(groupid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + if (info->manifest_info->groupid) + *groupid = (char *)info->manifest_info->groupid; + else + return PMINFO_R_ERROR; + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_get_support_reset(pkgmgrinfo_pkginfo_h handle, char **support_reset) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n"); + retvm_if(support_reset == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + if (info->manifest_info->support_reset) + *support_reset = (char *)info->manifest_info->support_reset; + else + return PMINFO_R_ERROR; + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_foreach_privilege(pkgmgrinfo_pkginfo_h handle, + pkgmgrinfo_pkg_privilege_list_cb privilege_func, void *user_data) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL"); + retvm_if(privilege_func == NULL, PMINFO_R_EINVAL, "Callback function is NULL"); + int ret = -1; + privilege_x *ptr = NULL; + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + ptr = info->manifest_info->privileges->privilege; + for (; ptr; ptr = ptr->next) { + if (ptr->text){ + ret = privilege_func(ptr->text, user_data); + if (ret < 0) + break; + } + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_compare_pkg_cert_info(const char *lhs_package_id, const char *rhs_package_id, pkgmgrinfo_cert_compare_result_type_e *compare_result) +{ + retvm_if(lhs_package_id == NULL, PMINFO_R_EINVAL, "lhs package ID is NULL"); + retvm_if(rhs_package_id == NULL, PMINFO_R_EINVAL, "rhs package ID is NULL"); + retvm_if(compare_result == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + + int ret = PMINFO_R_OK; + char *query = NULL; + char *error_message = NULL; + pkgmgr_cert_x *info= NULL; + int lcert = 0; + int rcert = 0; + int exist = -1; + sqlite3 *pkgmgr_cert_db = NULL; + + *compare_result = PMINFO_CERT_COMPARE_ERROR; + info = (pkgmgr_cert_x *)calloc(1, sizeof(pkgmgr_cert_x)); + retvm_if(info == NULL, PMINFO_R_ERROR, "Out of Memory!!!"); + + ret = db_util_open_with_options(CERT_DB, &pkgmgr_cert_db, SQLITE_OPEN_READONLY, NULL); + if (ret != SQLITE_OK) { + _LOGE("connect db [%s] failed!\n", CERT_DB); + ret = PMINFO_R_ERROR; + goto err; + } + + query = sqlite3_mprintf("select exists(select * from package_cert_info where package=%Q)", lhs_package_id); + if (SQLITE_OK != + sqlite3_exec(pkgmgr_cert_db, query, _pkgmgrinfo_validate_cb, (void *)&exist, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + ret = PMINFO_R_ERROR; + sqlite3_free(query); + goto err; + } + + if (exist == 0) { + lcert = 0; + } else { + sqlite3_free(query); + query = sqlite3_mprintf("select author_signer_cert from package_cert_info where package=%Q", lhs_package_id); + if (SQLITE_OK != + sqlite3_exec(pkgmgr_cert_db, query, __cert_cb, (void *)info, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + ret = PMINFO_R_ERROR; + sqlite3_free(query); + goto err; + } + lcert = info->cert_id; + } + + sqlite3_free(query); + query = sqlite3_mprintf("select exists(select * from package_cert_info where package=%Q)", rhs_package_id); + if (SQLITE_OK != + sqlite3_exec(pkgmgr_cert_db, query, _pkgmgrinfo_validate_cb, (void *)&exist, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + ret = PMINFO_R_ERROR; + sqlite3_free(query); + goto err; + } + + if (exist == 0) { + rcert = 0; + } else { + sqlite3_free(query); + query = sqlite3_mprintf("select author_signer_cert from package_cert_info where package=%Q", rhs_package_id); + if (SQLITE_OK != + sqlite3_exec(pkgmgr_cert_db, query, __cert_cb, (void *)info, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + ret = PMINFO_R_ERROR; + sqlite3_free(query); + goto err; + } + rcert = info->cert_id; + sqlite3_free(query); + } + + if ((lcert == 0) || (rcert == 0)) + { + if ((lcert == 0) && (rcert == 0)) + *compare_result = PMINFO_CERT_COMPARE_BOTH_NO_CERT; + else if (lcert == 0) + *compare_result = PMINFO_CERT_COMPARE_LHS_NO_CERT; + else if (rcert == 0) + *compare_result = PMINFO_CERT_COMPARE_RHS_NO_CERT; + } else { + if (lcert == rcert) + *compare_result = PMINFO_CERT_COMPARE_MATCH; + else + *compare_result = PMINFO_CERT_COMPARE_MISMATCH; + } + +err: + sqlite3_free(error_message); + sqlite3_close(pkgmgr_cert_db); + if (info) { + FREE_AND_NULL(info->pkgid); + FREE_AND_NULL(info); + } + return ret; +} + + +API int pkgmgrinfo_pkginfo_compare_app_cert_info(const char *lhs_app_id, const char *rhs_app_id, pkgmgrinfo_cert_compare_result_type_e *compare_result) +{ + retvm_if(lhs_app_id == NULL, PMINFO_R_EINVAL, "lhs app ID is NULL"); + retvm_if(rhs_app_id == NULL, PMINFO_R_EINVAL, "rhs app ID is NULL"); + retvm_if(compare_result == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL"); + + int ret = PMINFO_R_OK; + char *query = NULL; + char *error_message = NULL; + pkgmgr_cert_x *info= NULL; + int exist = -1; + char *lpkgid = NULL; + char *rpkgid = NULL; + sqlite3 *pkginfo_db = NULL; + + info = (pkgmgr_cert_x *)calloc(1, sizeof(pkgmgr_cert_x)); + retvm_if(info == NULL, PMINFO_R_ERROR, "Out of Memory!!!"); + + ret = db_util_open(MANIFEST_DB, &pkginfo_db, 0); + tryvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB); + + query = sqlite3_mprintf("select exists(select * from package_app_info where app_id=%Q and app_disable='false')", lhs_app_id); + if (SQLITE_OK != + sqlite3_exec(pkginfo_db, query, _pkgmgrinfo_validate_cb, (void *)&exist, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + ret = PMINFO_R_ERROR; + sqlite3_free(query); + goto catch; + } + + if (exist == 0) { + lpkgid = NULL; + } else { + sqlite3_free(query); + query = sqlite3_mprintf("select package from package_app_info where app_id=%Q and app_disable='false'", lhs_app_id); + if (SQLITE_OK != + sqlite3_exec(pkginfo_db, query, __cert_cb, (void *)info, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + ret = PMINFO_R_ERROR; + sqlite3_free(query); + goto catch; + } + lpkgid = strdup(info->pkgid); + if (lpkgid == NULL) { + _LOGE("Out of Memory\n"); + ret = PMINFO_R_ERROR; + sqlite3_free(query); + goto catch; + } + free(info->pkgid); + info->pkgid = NULL; + } + + sqlite3_free(query); + query = sqlite3_mprintf("select exists(select * from package_app_info where app_id=%Q and app_disable='false')", rhs_app_id); + if (SQLITE_OK != + sqlite3_exec(pkginfo_db, query, _pkgmgrinfo_validate_cb, (void *)&exist, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + ret = PMINFO_R_ERROR; + sqlite3_free(query); + goto catch; + } + + if (exist == 0) { + rpkgid = NULL; + } else { + sqlite3_free(query); + query = sqlite3_mprintf("select package from package_app_info where app_id=%Q and app_disable='false'", rhs_app_id); + if (SQLITE_OK != + sqlite3_exec(pkginfo_db, query, __cert_cb, (void *)info, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + ret = PMINFO_R_ERROR; + sqlite3_free(query); + goto catch; + } + rpkgid = strdup(info->pkgid); + if (rpkgid == NULL) { + _LOGE("Out of Memory\n"); + ret = PMINFO_R_ERROR; + sqlite3_free(query); + goto catch; + } + sqlite3_free(query); + FREE_AND_NULL(info->pkgid); + } + ret = pkgmgrinfo_pkginfo_compare_pkg_cert_info(lpkgid, rpkgid, compare_result); + + catch: + sqlite3_free(error_message); + sqlite3_close(pkginfo_db); + if (info) { + FREE_AND_NULL(info->pkgid); + FREE_AND_NULL(info); + } + FREE_AND_NULL(lpkgid); + FREE_AND_NULL(rpkgid); + return ret; +} + +API int pkgmgrinfo_pkginfo_is_accessible(pkgmgrinfo_pkginfo_h handle, bool *accessible) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n"); + retvm_if(accessible == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + + *accessible = 1; + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_is_removable(pkgmgrinfo_pkginfo_h handle, bool *removable) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n"); + retvm_if(removable == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + char *val = NULL; + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + val = (char *)info->manifest_info->removable; + if (val) { + if (strcasecmp(val, "true") == 0) + *removable = 1; + else if (strcasecmp(val, "false") == 0) + *removable = 0; + else + *removable = 1; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_is_movable(pkgmgrinfo_pkginfo_h handle, bool *movable) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n"); + retvm_if(movable == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + + char *val = NULL; + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + + val = (char *)info->manifest_info->installlocation; + if (val) { + if (strcmp(val, "internal-only") == 0) + *movable = 0; + else if (strcmp(val, "prefer-external") == 0) + *movable = 1; + else + *movable = 1; + } + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_is_preload(pkgmgrinfo_pkginfo_h handle, bool *preload) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n"); + retvm_if(preload == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + char *val = NULL; + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + val = (char *)info->manifest_info->preload; + if (val) { + if (strcasecmp(val, "true") == 0) + *preload = 1; + else if (strcasecmp(val, "false") == 0) + *preload = 0; + else + *preload = 0; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_is_system(pkgmgrinfo_pkginfo_h handle, bool *system) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n"); + retvm_if(system == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + + char *val = NULL; + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + val = (char *)info->manifest_info->system; + if (val) { + if (strcasecmp(val, "true") == 0) + *system = 1; + else if (strcasecmp(val, "false") == 0) + *system = 0; + else + *system = 0; + } + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_is_readonly(pkgmgrinfo_pkginfo_h handle, bool *readonly) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n"); + retvm_if(readonly == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + char *val = NULL; + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + val = (char *)info->manifest_info->readonly; + if (val) { + if (strcasecmp(val, "true") == 0) + *readonly = 1; + else if (strcasecmp(val, "false") == 0) + *readonly = 0; + else + *readonly = 0; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_is_update(pkgmgrinfo_pkginfo_h handle, bool *update) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n"); + retvm_if(update == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + + char *val = NULL; + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + val = (char *)info->manifest_info->update; + if (val) { + if (strcasecmp(val, "true") == 0) + *update = 1; + else if (strcasecmp(val, "false") == 0) + *update = 0; + else + *update = 1; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_is_support_disable(pkgmgrinfo_pkginfo_h handle, bool *support_disable) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n"); + retvm_if(support_disable == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + + char *val = NULL; + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + val = (char *)info->manifest_info->support_disable; + if (val) { + if (strcasecmp(val, "true") == 0) + *support_disable = 1; + else if (strcasecmp(val, "false") == 0) + *support_disable = 0; + else + *support_disable = 1; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_is_mother_package(pkgmgrinfo_pkginfo_h handle, bool *mother_package) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n"); + retvm_if(mother_package == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + + char *val = NULL; + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + val = (char *)info->manifest_info->mother_package; + if (val) { + if (strcasecmp(val, "true") == 0) + *mother_package = 1; + else if (strcasecmp(val, "false") == 0) + *mother_package = 0; + else + *mother_package = 1; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo_h handle) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n"); + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + __cleanup_pkginfo(info); + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_filter_create(pkgmgrinfo_pkginfo_filter_h *handle) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle output parameter is NULL\n"); + *handle = NULL; + pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x*)calloc(1, sizeof(pkgmgrinfo_filter_x)); + if (filter == NULL) { + _LOGE("Out of Memory!!!"); + return PMINFO_R_ERROR; + } + *handle = filter; + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_filter_destroy(pkgmgrinfo_pkginfo_filter_h handle) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n"); + pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x*)handle; + if (filter->list){ + g_slist_foreach(filter->list, __destroy_each_node, NULL); + g_slist_free(filter->list); + } + FREE_AND_NULL(filter); + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_filter_add_int(pkgmgrinfo_pkginfo_filter_h handle, + const char *property, const int value) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n"); + retvm_if(property == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n"); + char buf[PKG_VALUE_STRING_LEN_MAX] = {'\0'}; + char *val = NULL; + GSList *link = NULL; + int prop = -1; + prop = _pminfo_pkginfo_convert_to_prop_int(property); + if (prop < E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_INT || + prop > E_PMINFO_PKGINFO_PROP_PACKAGE_MAX_INT) { + _LOGE("Invalid Integer Property\n"); + return PMINFO_R_EINVAL; + } + pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x*)handle; + pkgmgrinfo_node_x *node = (pkgmgrinfo_node_x*)calloc(1, sizeof(pkgmgrinfo_node_x)); + if (node == NULL) { + _LOGE("Out of Memory!!!\n"); + return PMINFO_R_ERROR; + } + snprintf(buf, PKG_VALUE_STRING_LEN_MAX - 1, "%d", value); + val = strndup(buf, PKG_VALUE_STRING_LEN_MAX - 1); + if (val == NULL) { + _LOGE("Out of Memory\n"); + FREE_AND_NULL(node); + return PMINFO_R_ERROR; + } + node->prop = prop; + node->value = val; + /*If API is called multiple times for same property, we should override the previous values. + Last value set will be used for filtering.*/ + link = g_slist_find_custom(filter->list, (gconstpointer)node, __compare_func); + if (link) + filter->list = g_slist_delete_link(filter->list, link); + filter->list = g_slist_append(filter->list, (gpointer)node); + return PMINFO_R_OK; + +} + +API int pkgmgrinfo_pkginfo_filter_add_bool(pkgmgrinfo_pkginfo_filter_h handle, + const char *property, const bool value) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n"); + retvm_if(property == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n"); + char *val = NULL; + GSList *link = NULL; + int prop = -1; + prop = _pminfo_pkginfo_convert_to_prop_bool(property); + if (prop < E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_BOOL || + prop > E_PMINFO_PKGINFO_PROP_PACKAGE_MAX_BOOL) { + _LOGE("Invalid Boolean Property\n"); + return PMINFO_R_EINVAL; + } + pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x*)handle; + pkgmgrinfo_node_x *node = (pkgmgrinfo_node_x*)calloc(1, sizeof(pkgmgrinfo_node_x)); + if (node == NULL) { + _LOGE("Out of Memory!!!\n"); + return PMINFO_R_ERROR; + } + if (value) + val = strndup("('true','True')", 15); + else + val = strndup("('false','False')", 17); + if (val == NULL) { + _LOGE("Out of Memory\n"); + FREE_AND_NULL(node); + return PMINFO_R_ERROR; + } + node->prop = prop; + node->value = val; + /*If API is called multiple times for same property, we should override the previous values. + Last value set will be used for filtering.*/ + link = g_slist_find_custom(filter->list, (gconstpointer)node, __compare_func); + if (link) + filter->list = g_slist_delete_link(filter->list, link); + filter->list = g_slist_append(filter->list, (gpointer)node); + return PMINFO_R_OK; + +} + +API int pkgmgrinfo_pkginfo_filter_add_string(pkgmgrinfo_pkginfo_filter_h handle, + const char *property, const char *value) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n"); + retvm_if(property == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n"); + retvm_if(value == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n"); + char *val = NULL; + GSList *link = NULL; + int prop = -1; + prop = _pminfo_pkginfo_convert_to_prop_str(property); + if (prop < E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_STR || + prop > E_PMINFO_PKGINFO_PROP_PACKAGE_MAX_STR) { + _LOGE("Invalid String Property\n"); + return PMINFO_R_EINVAL; + } + pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x*)handle; + pkgmgrinfo_node_x *node = (pkgmgrinfo_node_x*)calloc(1, sizeof(pkgmgrinfo_node_x)); + if (node == NULL) { + _LOGE("Out of Memory!!!\n"); + return PMINFO_R_ERROR; + } + if (strcmp(value, PMINFO_PKGINFO_INSTALL_LOCATION_AUTO) == 0) + val = strndup("auto", PKG_STRING_LEN_MAX - 1); + else if (strcmp(value, PMINFO_PKGINFO_INSTALL_LOCATION_INTERNAL) == 0) + val = strndup("internal-only", PKG_STRING_LEN_MAX - 1); + else if (strcmp(value, PMINFO_PKGINFO_INSTALL_LOCATION_EXTERNAL) == 0) + val = strndup("prefer-external", PKG_STRING_LEN_MAX - 1); + else if (strcmp(value, "installed_internal") == 0) + val = strndup("installed_internal", PKG_STRING_LEN_MAX - 1); + else if (strcmp(value, "installed_external") == 0) + val = strndup("installed_external", PKG_STRING_LEN_MAX - 1); + else + val = strndup(value, PKG_STRING_LEN_MAX - 1); + if (val == NULL) { + _LOGE("Out of Memory\n"); + FREE_AND_NULL(node); + return PMINFO_R_ERROR; + } + node->prop = prop; + node->value = val; + /*If API is called multiple times for same property, we should override the previous values. + Last value set will be used for filtering.*/ + link = g_slist_find_custom(filter->list, (gconstpointer)node, __compare_func); + if (link) + filter->list = g_slist_delete_link(filter->list, link); + filter->list = g_slist_append(filter->list, (gpointer)node); + return PMINFO_R_OK; + +} + +API int pkgmgrinfo_pkginfo_filter_count(pkgmgrinfo_pkginfo_filter_h handle, int *count) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n"); + retvm_if(count == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n"); + + int ret = 0; + int filter_count = 0; + + char pkgid[MAX_QUERY_LEN] = {0,}; + char pre_pkgid[MAX_QUERY_LEN] = {0,}; + + char *locale = NULL; + char *condition = NULL; + char query[MAX_QUERY_LEN] = {'\0'}; + char where[MAX_QUERY_LEN] = {'\0'}; + GSList *list; + + pkgmgr_pkginfo_x *node = NULL; + pkgmgr_pkginfo_x *pkginfo = NULL; + pkgmgr_pkginfo_x *list_pkginfo = NULL; + pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x*)handle; + + sqlite3 *pkginfo_db = NULL; + sqlite3_stmt *stmt = NULL; + + + /*open db*/ + ret = db_util_open(MANIFEST_DB, &pkginfo_db, 0); + retvm_if(ret != SQLITE_OK, PMINFO_R_ERROR, "db_util_open[%s] failed!", MANIFEST_DB); + + /*Start constructing query*/ + locale = __convert_system_locale_to_manifest_locale(); + snprintf(query, MAX_QUERY_LEN - 1, FILTER_QUERY_LIST_PACKAGE, DEFAULT_LOCALE, locale); + + /*Get where clause*/ + for (list = filter->list; list; list = g_slist_next(list)) { + __get_filter_condition(list->data, &condition); + if (condition) { + strncat(where, condition, sizeof(where) - strlen(where) -1); + where[sizeof(where) - 1] = '\0'; + FREE_AND_NULL(condition); + } + if (g_slist_next(list)) { + strncat(where, " and ", sizeof(where) - strlen(where) - 1); + where[sizeof(where) - 1] = '\0'; + } + } + + if (strstr(where, "package_info.package_disable") == NULL) { + if (strlen(where) > 0) { + strncat(where, " and package_info.package_disable IN ('false','False')", sizeof(where) - strlen(where) - 1); + where[sizeof(where) - 1] = '\0'; + } + } + + _LOGE("where = %s\n", where); + if (strlen(where) > 0) { + strncat(query, where, sizeof(query) - strlen(query) - 1); + query[sizeof(query) - 1] = '\0'; + } + _LOGE("query = %s\n", query); + + list_pkginfo = calloc(1, sizeof(pkgmgr_pkginfo_x)); + tryvm_if(list_pkginfo == NULL, ret = PMINFO_R_ERROR, "Out of Memory!!!\n"); + + ret = sqlite3_prepare_v2(pkginfo_db, query, strlen(query), &stmt, NULL); + tryvm_if(ret != PMINFO_R_OK, ret = PMINFO_R_ERROR, "sqlite3_prepare_v2 failed[%s]\n", query); + + while(1) { + ret = sqlite3_step(stmt); + if(ret == SQLITE_ROW) { + + memset(pkgid, 0, MAX_QUERY_LEN); + strncpy(pkgid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + + if (strlen(pre_pkgid) != 0) { + if (strcmp(pre_pkgid, pkgid) == 0) { + __update_localed_label_for_list(stmt, list_pkginfo); + + memset(pre_pkgid, 0, MAX_QUERY_LEN); + strncpy(pre_pkgid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + + continue; + } else { + memset(pre_pkgid, 0, MAX_QUERY_LEN); + strncpy(pre_pkgid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + } + } else { + strncpy(pre_pkgid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + } + + __get_pkginfo_for_list(stmt, list_pkginfo); + } else { + break; + } + } + + LISTHEAD(list_pkginfo, node); + + for(node = node->next ; node ; node = node->next) { + pkginfo = node; + ret = __pkginfo_check_installed_storage(pkginfo); + if(ret < 0) + continue; + filter_count++; + } + + *count = filter_count; + ret = PMINFO_R_OK; + +catch: + FREE_AND_NULL(locale); + sqlite3_finalize(stmt); + sqlite3_close(pkginfo_db); + + __cleanup_list_pkginfo(list_pkginfo, node); + + return ret; +} + +API int pkgmgrinfo_pkginfo_filter_foreach_pkginfo(pkgmgrinfo_pkginfo_filter_h handle, + pkgmgrinfo_pkg_list_cb pkg_cb, void *user_data) +{ + retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n"); + retvm_if(pkg_cb == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n"); + char *locale = NULL; + char *condition = NULL; + char query[MAX_QUERY_LEN] = {'\0'}; + char where[MAX_QUERY_LEN] = {'\0'}; + GSList *list; + int ret = 0; + + char pkgid[MAX_QUERY_LEN] = {0,}; + char pre_pkgid[MAX_QUERY_LEN] = {0,}; + + pkgmgr_pkginfo_x *node = NULL; + pkgmgr_pkginfo_x *pkginfo = NULL; + pkgmgr_pkginfo_x *list_pkginfo = NULL; + pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x*)handle; + + sqlite3 *pkginfo_db = NULL; + sqlite3_stmt *stmt = NULL; + + /*open db*/ + ret = db_util_open(MANIFEST_DB, &pkginfo_db, 0); + retvm_if(ret != SQLITE_OK, PMINFO_R_ERROR, "db_util_open[%s] failed!", MANIFEST_DB); + + /*Start constructing query*/ + locale = __convert_system_locale_to_manifest_locale(); + retvm_if(locale == NULL, PMINFO_R_ERROR, "locale is NULL"); + snprintf(query, MAX_QUERY_LEN - 1, FILTER_QUERY_LIST_PACKAGE, DEFAULT_LOCALE, locale); + + /*Get where clause*/ + for (list = filter->list; list; list = g_slist_next(list)) { + __get_filter_condition(list->data, &condition); + if (condition) { + strncat(where, condition, sizeof(where) - strlen(where) -1); + where[sizeof(where) - 1] = '\0'; + + FREE_AND_NULL(condition); + } + if (g_slist_next(list)) { + strncat(where, " and ", sizeof(where) - strlen(where) - 1); + where[sizeof(where) - 1] = '\0'; + } + } + + if (strstr(where, "package_info.package_disable") == NULL) { + if (strlen(where) > 0) { + strncat(where, " and package_info.package_disable IN ('false','False')", sizeof(where) - strlen(where) - 1); + where[sizeof(where) - 1] = '\0'; + } + } + + _LOGE("where = %s\n", where); + + if (strlen(where) > 0) { + strncat(query, where, sizeof(query) - strlen(query) - 1); + query[sizeof(query) - 1] = '\0'; + } + _LOGE("query = %s\n", query); + + list_pkginfo = calloc(1, sizeof(pkgmgr_pkginfo_x)); + tryvm_if(list_pkginfo == NULL, ret = PMINFO_R_ERROR, "Out of Memory!!!\n"); + + ret = sqlite3_prepare_v2(pkginfo_db, query, strlen(query), &stmt, NULL); + tryvm_if(ret != PMINFO_R_OK, ret = PMINFO_R_ERROR, "sqlite3_prepare_v2 failed[%s]\n", query); + + while(1) { + ret = sqlite3_step(stmt); + if(ret == SQLITE_ROW) { + + memset(pkgid, 0, MAX_QUERY_LEN); + strncpy(pkgid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + + if (strlen(pre_pkgid) != 0) { + if (strcmp(pre_pkgid, pkgid) == 0) { + __update_localed_label_for_list(stmt, list_pkginfo); + + memset(pre_pkgid, 0, MAX_QUERY_LEN); + strncpy(pre_pkgid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + + continue; + } else { + memset(pre_pkgid, 0, MAX_QUERY_LEN); + strncpy(pre_pkgid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + } + } else { + strncpy(pre_pkgid, (const char *)sqlite3_column_text(stmt, 0), MAX_QUERY_LEN - 1); + } + + __get_pkginfo_for_list(stmt, list_pkginfo); + } else { + break; + } + } + + LISTHEAD(list_pkginfo, node); + + for(node = node->next ; node ; node = node->next) { + pkginfo = node; + pkginfo->locale = strdup(locale); + + ret = __pkginfo_check_installed_storage(pkginfo); + if(ret < 0) + continue; + + ret = pkg_cb( (void *)pkginfo, user_data); + if(ret < 0) + break; + } + ret = PMINFO_R_OK; + +catch: + FREE_AND_NULL(locale); + sqlite3_finalize(stmt); + sqlite3_close(pkginfo_db); + __cleanup_list_pkginfo(list_pkginfo, node); + + return ret; +} + +API int pkgmgrinfo_pkginfo_privilege_filter_foreach(const char *privilege, + pkgmgrinfo_pkg_list_cb pkg_list_cb, void *user_data) +{ + retvm_if(privilege == NULL, PMINFO_R_EINVAL, "privilege is NULL\n"); + retvm_if(pkg_list_cb == NULL, PMINFO_R_EINVAL, "callback function is NULL\n"); + + int ret = PMINFO_R_OK; + char *query = NULL; + + sqlite3 *pkginfo_db = NULL; + sqlite3_stmt *stmt = NULL; + + pkgmgr_pkginfo_x *node = NULL; + pkgmgr_pkginfo_x *pkginfo = NULL; + pkgmgr_pkginfo_x *list_pkginfo = NULL; + + /*open db*/ + ret = db_util_open(MANIFEST_DB, &pkginfo_db, 0); + retvm_if(ret != SQLITE_OK, PMINFO_R_ERROR, "db_util_open[%s] failed!", MANIFEST_DB); + + /*Start constructing query*/ + query = sqlite3_mprintf("select package_info.* from package_info LEFT OUTER JOIN package_privilege_info " \ + "ON package_privilege_info.package=package_info.package " \ + "where package_privilege_info.privilege=%Q and package_info.package_disable='false'", privilege); + + /*prepare query*/ + ret = sqlite3_prepare_v2(pkginfo_db, query, strlen(query), &stmt, NULL); + tryvm_if(ret != PMINFO_R_OK, ret = PMINFO_R_ERROR, "sqlite3_prepare_v2 failed[%s]\n", query); + + /*calloc pkginfo_x*/ + list_pkginfo = (pkgmgr_pkginfo_x *)calloc(1, sizeof(pkgmgr_pkginfo_x)); + tryvm_if(list_pkginfo == NULL, ret = PMINFO_R_ERROR, "Out of Memory!!!\n"); + + /*step query*/ + while(1) { + ret = sqlite3_step(stmt); + if(ret == SQLITE_ROW) { + __get_pkginfo_for_list(stmt, list_pkginfo); + } else { + break; + } + } + + LISTHEAD(list_pkginfo, node); + + for(node = node->next; node ; node = node->next) { + pkginfo = node; + ret = pkg_list_cb( (void *)pkginfo, user_data); + if(ret < 0) + break; + } + ret = PMINFO_R_OK; + +catch: + sqlite3_free(query); + sqlite3_finalize(stmt); + sqlite3_close(pkginfo_db); + + __cleanup_list_pkginfo(list_pkginfo, node); + + return ret; +} diff --git a/src/pkgmgrinfo_private.c b/src/pkgmgrinfo_private.c new file mode 100755 index 0000000..f0a2100 --- /dev/null +++ b/src/pkgmgrinfo_private.c @@ -0,0 +1,516 @@ +/* + * pkgmgrinfo-appinfo + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Junsuk Oh , + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include + +#include "pkgmgrinfo_private.h" + +struct _pkginfo_str_map_t { + pkgmgrinfo_pkginfo_filter_prop_str prop; + const char *property; +}; + +static struct _pkginfo_str_map_t pkginfo_str_prop_map[] = { + {E_PMINFO_PKGINFO_PROP_PACKAGE_ID, PMINFO_PKGINFO_PROP_PACKAGE_ID}, + {E_PMINFO_PKGINFO_PROP_PACKAGE_TYPE, PMINFO_PKGINFO_PROP_PACKAGE_TYPE}, + {E_PMINFO_PKGINFO_PROP_PACKAGE_VERSION, PMINFO_PKGINFO_PROP_PACKAGE_VERSION}, + {E_PMINFO_PKGINFO_PROP_PACKAGE_INSTALL_LOCATION,PMINFO_PKGINFO_PROP_PACKAGE_INSTALL_LOCATION}, + {E_PMINFO_PKGINFO_PROP_PACKAGE_INSTALLED_STORAGE,PMINFO_PKGINFO_PROP_PACKAGE_INSTALLED_STORAGE}, + {E_PMINFO_PKGINFO_PROP_PACKAGE_AUTHOR_NAME, PMINFO_PKGINFO_PROP_PACKAGE_AUTHOR_NAME}, + {E_PMINFO_PKGINFO_PROP_PACKAGE_AUTHOR_EMAIL, PMINFO_PKGINFO_PROP_PACKAGE_AUTHOR_EMAIL}, + {E_PMINFO_PKGINFO_PROP_PACKAGE_AUTHOR_HREF, PMINFO_PKGINFO_PROP_PACKAGE_AUTHOR_HREF}, + {E_PMINFO_PKGINFO_PROP_PACKAGE_STORECLIENT_ID, PMINFO_PKGINFO_PROP_PACKAGE_STORECLIENT_ID} +}; + +struct _pkginfo_int_map_t { + pkgmgrinfo_pkginfo_filter_prop_int prop; + const char *property; +}; + +static struct _pkginfo_int_map_t pkginfo_int_prop_map[] = { + {E_PMINFO_PKGINFO_PROP_PACKAGE_SIZE, PMINFO_PKGINFO_PROP_PACKAGE_SIZE}, + {E_PMINFO_PKGINFO_PROP_PACKAGE_SUPPORT_MODE, PMINFO_PKGINFO_PROP_PACKAGE_SUPPORT_MODE} +}; + +struct _pkginfo_bool_map_t { + pkgmgrinfo_pkginfo_filter_prop_bool prop; + const char *property; +}; + +static struct _pkginfo_bool_map_t pkginfo_bool_prop_map[] = { + {E_PMINFO_PKGINFO_PROP_PACKAGE_REMOVABLE, PMINFO_PKGINFO_PROP_PACKAGE_REMOVABLE}, + {E_PMINFO_PKGINFO_PROP_PACKAGE_PRELOAD, PMINFO_PKGINFO_PROP_PACKAGE_PRELOAD}, + {E_PMINFO_PKGINFO_PROP_PACKAGE_READONLY, PMINFO_PKGINFO_PROP_PACKAGE_READONLY}, + {E_PMINFO_PKGINFO_PROP_PACKAGE_UPDATE, PMINFO_PKGINFO_PROP_PACKAGE_UPDATE}, + {E_PMINFO_PKGINFO_PROP_PACKAGE_APPSETTING, PMINFO_PKGINFO_PROP_PACKAGE_APPSETTING}, + {E_PMINFO_PKGINFO_PROP_PACKAGE_NODISPLAY_SETTING, PMINFO_PKGINFO_PROP_PACKAGE_NODISPLAY_SETTING}, + {E_PMINFO_PKGINFO_PROP_PACKAGE_SUPPORT_DISABLE, PMINFO_PKGINFO_PROP_PACKAGE_SUPPORT_DISABLE}, + {E_PMINFO_PKGINFO_PROP_PACKAGE_DISABLE, PMINFO_PKGINFO_PROP_PACKAGE_DISABLE}, + {E_PMINFO_PKGINFO_PROP_PACKAGE_USE_RESET, PMINFO_PKGINFO_PROP_PACKAGE_USE_RESET} +}; + +struct _appinfo_str_map_t { + pkgmgrinfo_appinfo_filter_prop_str prop; + const char *property; +}; + +static struct _appinfo_str_map_t appinfo_str_prop_map[] = { + {E_PMINFO_APPINFO_PROP_APP_ID, PMINFO_APPINFO_PROP_APP_ID}, + {E_PMINFO_APPINFO_PROP_APP_COMPONENT, PMINFO_APPINFO_PROP_APP_COMPONENT}, + {E_PMINFO_APPINFO_PROP_APP_COMPONENT_TYPE, PMINFO_APPINFO_PROP_APP_COMPONENT_TYPE}, + {E_PMINFO_APPINFO_PROP_APP_EXEC, PMINFO_APPINFO_PROP_APP_EXEC}, + {E_PMINFO_APPINFO_PROP_APP_AMBIENT_SUPPORT, PMINFO_APPINFO_PROP_APP_AMBIENT_SUPPORT}, + {E_PMINFO_APPINFO_PROP_APP_ICON, PMINFO_APPINFO_PROP_APP_ICON}, + {E_PMINFO_APPINFO_PROP_APP_TYPE, PMINFO_APPINFO_PROP_APP_TYPE}, + {E_PMINFO_APPINFO_PROP_APP_OPERATION, PMINFO_APPINFO_PROP_APP_OPERATION}, + {E_PMINFO_APPINFO_PROP_APP_URI, PMINFO_APPINFO_PROP_APP_URI}, + {E_PMINFO_APPINFO_PROP_APP_MIME, PMINFO_APPINFO_PROP_APP_MIME}, + {E_PMINFO_APPINFO_PROP_APP_CATEGORY, PMINFO_APPINFO_PROP_APP_CATEGORY}, + {E_PMINFO_APPINFO_PROP_APP_HWACCELERATION, PMINFO_APPINFO_PROP_APP_HWACCELERATION}, + {E_PMINFO_APPINFO_PROP_APP_SCREENREADER, PMINFO_APPINFO_PROP_APP_SCREENREADER} +}; + +struct _appinfo_int_map_t { + pkgmgrinfo_appinfo_filter_prop_int prop; + const char *property; +}; + +static struct _appinfo_int_map_t appinfo_int_prop_map[] = { + {E_PMINFO_APPINFO_PROP_APP_SUPPORT_MODE, PMINFO_APPINFO_PROP_APP_SUPPORT_MODE} +}; + +struct _appinfo_bool_map_t { + pkgmgrinfo_appinfo_filter_prop_bool prop; + const char *property; +}; + +static struct _appinfo_bool_map_t appinfo_bool_prop_map[] = { + {E_PMINFO_APPINFO_PROP_APP_NODISPLAY, PMINFO_APPINFO_PROP_APP_NODISPLAY}, + {E_PMINFO_APPINFO_PROP_APP_MULTIPLE, PMINFO_APPINFO_PROP_APP_MULTIPLE}, + {E_PMINFO_APPINFO_PROP_APP_ONBOOT, PMINFO_APPINFO_PROP_APP_ONBOOT}, + {E_PMINFO_APPINFO_PROP_APP_AUTORESTART, PMINFO_APPINFO_PROP_APP_AUTORESTART}, + {E_PMINFO_APPINFO_PROP_APP_TASKMANAGE, PMINFO_APPINFO_PROP_APP_TASKMANAGE}, + {E_PMINFO_APPINFO_PROP_APP_LAUNCHCONDITION, PMINFO_APPINFO_PROP_APP_LAUNCHCONDITION}, + {E_PMINFO_APPINFO_PROP_APP_SUPPORT_DISABLE, PMINFO_APPINFO_PROP_APP_SUPPORT_DISABLE}, + {E_PMINFO_APPINFO_PROP_APP_DISABLE, PMINFO_APPINFO_PROP_APP_DISABLE}, + {E_PMINFO_APPINFO_PROP_APP_REMOVABLE, PMINFO_APPINFO_PROP_APP_REMOVABLE} +}; + +inline int _pkgmgrinfo_validate_cb(void *data, int ncols, char **coltxt, char **colname) +{ + int *p = (int*)data; + *p = atoi(coltxt[0]); + return 0; +} + +inline pkgmgrinfo_pkginfo_filter_prop_str _pminfo_pkginfo_convert_to_prop_str(const char *property) +{ + int i = 0; + int max = 0; + pkgmgrinfo_pkginfo_filter_prop_str prop = -1; + + if (property == NULL) + return -1; + max = E_PMINFO_PKGINFO_PROP_PACKAGE_MAX_STR - E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_STR + 1; + for (i = 0 ; i < max; i++) { + if (strcmp(property, pkginfo_str_prop_map[i].property) == 0) { + prop = pkginfo_str_prop_map[i].prop; + break; + } + } + return prop; +} + +inline pkgmgrinfo_pkginfo_filter_prop_int _pminfo_pkginfo_convert_to_prop_int(const char *property) +{ + int i = 0; + int max = 0; + pkgmgrinfo_pkginfo_filter_prop_int prop = -1; + + if (property == NULL) + return -1; + max = E_PMINFO_PKGINFO_PROP_PACKAGE_MAX_INT - E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_INT + 1; + for (i = 0 ; i < max; i++) { + if (strcmp(property, pkginfo_int_prop_map[i].property) == 0) { + prop = pkginfo_int_prop_map[i].prop; + break; + } + } + return prop; +} + +inline pkgmgrinfo_pkginfo_filter_prop_bool _pminfo_pkginfo_convert_to_prop_bool(const char *property) +{ + int i = 0; + int max = 0; + pkgmgrinfo_pkginfo_filter_prop_bool prop = -1; + + if (property == NULL) + return -1; + max = E_PMINFO_PKGINFO_PROP_PACKAGE_MAX_BOOL - E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_BOOL + 1; + for (i = 0 ; i < max; i++) { + if (strcmp(property, pkginfo_bool_prop_map[i].property) == 0) { + prop = pkginfo_bool_prop_map[i].prop; + break; + } + } + return prop; +} + +inline pkgmgrinfo_appinfo_filter_prop_str _pminfo_appinfo_convert_to_prop_str(const char *property) +{ + int i = 0; + int max = 0; + pkgmgrinfo_appinfo_filter_prop_str prop = -1; + + if (property == NULL) + return -1; + max = E_PMINFO_APPINFO_PROP_APP_MAX_STR - E_PMINFO_APPINFO_PROP_APP_MIN_STR + 1; + for (i = 0 ; i < max; i++) { + if (strcmp(property, appinfo_str_prop_map[i].property) == 0) { + prop = appinfo_str_prop_map[i].prop; + break; + } + } + return prop; +} + +inline pkgmgrinfo_appinfo_filter_prop_int _pminfo_appinfo_convert_to_prop_int(const char *property) +{ + int i = 0; + int max = 0; + pkgmgrinfo_appinfo_filter_prop_int prop = -1; + + if (property == NULL) + return -1; + max = E_PMINFO_APPINFO_PROP_APP_MAX_INT - E_PMINFO_APPINFO_PROP_APP_MIN_INT + 1; + for (i = 0 ; i < max; i++) { + if (strcmp(property, appinfo_int_prop_map[i].property) == 0) { + prop = appinfo_int_prop_map[i].prop; + break; + } + } + return prop; +} + +inline pkgmgrinfo_appinfo_filter_prop_bool _pminfo_appinfo_convert_to_prop_bool(const char *property) +{ + int i = 0; + int max = 0; + pkgmgrinfo_appinfo_filter_prop_bool prop = -1; + + if (property == NULL) + return -1; + max = E_PMINFO_APPINFO_PROP_APP_MAX_BOOL - E_PMINFO_APPINFO_PROP_APP_MIN_BOOL + 1; + for (i = 0 ; i < max; i++) { + if (strcmp(property, appinfo_bool_prop_map[i].property) == 0) { + prop = appinfo_bool_prop_map[i].prop; + break; + } + } + return prop; +} + +int __exec_db_query(sqlite3 *db, char *query, sqlite_query_callback callback, void *data) +{ + char *error_message = NULL; + if (SQLITE_OK != + sqlite3_exec(db, query, callback, data, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + return -1; + } + sqlite3_free(error_message); + return 0; +} + +void __cleanup_list_pkginfo(pkgmgr_pkginfo_x *list_pkginfo, pkgmgr_pkginfo_x *node) +{ + pkgmgr_pkginfo_x *temp_node = NULL; + + if (list_pkginfo != NULL) { + LISTHEAD(list_pkginfo, node); + temp_node = node->next; + node = temp_node; + while (node) { + temp_node = node->next; + __cleanup_pkginfo(node); + node = temp_node; + } + __cleanup_pkginfo(list_pkginfo); + } +} + +void __cleanup_pkginfo(pkgmgr_pkginfo_x *data) +{ + if(data == NULL) + return; + + FREE_AND_NULL(data->locale); + + _pkgmgrinfo_basic_free_manifest_x(data->manifest_info); + FREE_AND_NULL(data); + return; +} + +void __cleanup_appinfo(pkgmgr_appinfo_x *data) +{ + if(data == NULL) + return; + + FREE_AND_NULL(data->locale); + + manifest_x *mfx = calloc(1, sizeof(manifest_x)); + if (mfx == NULL) { + _LOGE("out of memory"); + return; + } + + mfx->uiapplication = data->uiapp_info; + _pkgmgrinfo_basic_free_manifest_x(mfx); + FREE_AND_NULL(data); + return; +} + +char* __convert_system_locale_to_manifest_locale() +{ + char *syslocale = NULL; + + syslocale = vconf_get_str(VCONFKEY_LANGSET); + + if (syslocale == NULL) { + _LOGE("syslocale is null\n"); + return strdup(DEFAULT_LOCALE); + } + + char *locale = malloc(6); + if (!locale) { + _LOGE("Malloc Failed\n"); + FREE_AND_NULL(syslocale); + return strdup(DEFAULT_LOCALE); + } + + sprintf(locale, "%c%c-%c%c", syslocale[0], syslocale[1], tolower(syslocale[3]), tolower(syslocale[4])); + + FREE_AND_NULL(syslocale); + return locale; +} + +gint __compare_func(gconstpointer data1, gconstpointer data2) +{ + pkgmgrinfo_node_x *node1 = (pkgmgrinfo_node_x*)data1; + pkgmgrinfo_node_x *node2 = (pkgmgrinfo_node_x*)data2; + if (node1->prop == node2->prop) + return 0; + else if (node1->prop > node2->prop) + return 1; + else + return -1; +} + + +void __get_filter_condition(gpointer data, char **condition) +{ + pkgmgrinfo_node_x *node = (pkgmgrinfo_node_x*)data; + char buf[MAX_QUERY_LEN + 1] = {'\0'}; + char temp[PKG_STRING_LEN_MAX] = {'\0'}; + switch (node->prop) { + case E_PMINFO_PKGINFO_PROP_PACKAGE_ID: + snprintf(buf, MAX_QUERY_LEN, "package_info.package='%s'", node->value); + break; + case E_PMINFO_PKGINFO_PROP_PACKAGE_TYPE: + snprintf(buf, MAX_QUERY_LEN, "package_info.package_type='%s'", node->value); + break; + case E_PMINFO_PKGINFO_PROP_PACKAGE_VERSION: + snprintf(buf, MAX_QUERY_LEN, "package_info.package_version='%s'", node->value); + break; + case E_PMINFO_PKGINFO_PROP_PACKAGE_INSTALL_LOCATION: + snprintf(buf, MAX_QUERY_LEN, "package_info.install_location='%s'", node->value); + break; + case E_PMINFO_PKGINFO_PROP_PACKAGE_INSTALLED_STORAGE: + snprintf(buf, MAX_QUERY_LEN, "package_info.installed_storage='%s'", node->value); + break; + case E_PMINFO_PKGINFO_PROP_PACKAGE_AUTHOR_NAME: + snprintf(buf, MAX_QUERY_LEN, "package_info.author_name='%s'", node->value); + break; + case E_PMINFO_PKGINFO_PROP_PACKAGE_AUTHOR_HREF: + snprintf(buf, MAX_QUERY_LEN, "package_info.author_href='%s'", node->value); + break; + case E_PMINFO_PKGINFO_PROP_PACKAGE_STORECLIENT_ID: + snprintf(buf, MAX_QUERY_LEN, "package_info.storeclient_id='%s'", node->value); + break; + case E_PMINFO_PKGINFO_PROP_PACKAGE_AUTHOR_EMAIL: + snprintf(buf, MAX_QUERY_LEN, "package_info.author_email='%s'", node->value); + break; + case E_PMINFO_PKGINFO_PROP_PACKAGE_SIZE: + snprintf(buf, MAX_QUERY_LEN, "package_info.package_size='%s'", node->value); + break; + case E_PMINFO_PKGINFO_PROP_PACKAGE_REMOVABLE: + snprintf(buf, MAX_QUERY_LEN, "package_info.package_removable IN %s", node->value); + break; + case E_PMINFO_PKGINFO_PROP_PACKAGE_PRELOAD: + snprintf(buf, MAX_QUERY_LEN, "package_info.package_preload IN %s", node->value); + break; + case E_PMINFO_PKGINFO_PROP_PACKAGE_READONLY: + snprintf(buf, MAX_QUERY_LEN, "package_info.package_readonly IN %s", node->value); + break; + case E_PMINFO_PKGINFO_PROP_PACKAGE_UPDATE: + snprintf(buf, MAX_QUERY_LEN, "package_info.package_update IN %s", node->value); + break; + case E_PMINFO_PKGINFO_PROP_PACKAGE_APPSETTING: + snprintf(buf, MAX_QUERY_LEN, "package_info.package_appsetting IN %s", node->value); + break; + case E_PMINFO_PKGINFO_PROP_PACKAGE_NODISPLAY_SETTING: + snprintf(buf, MAX_QUERY_LEN, "package_info.package_nodisplay IN %s", node->value); + break; + case E_PMINFO_PKGINFO_PROP_PACKAGE_SUPPORT_DISABLE: + snprintf(buf, MAX_QUERY_LEN, "package_info.package_support_disable IN %s", node->value); + break; + case E_PMINFO_PKGINFO_PROP_PACKAGE_DISABLE: + snprintf(buf, MAX_QUERY_LEN, "package_info.package_disable IN %s", node->value); + break; + case E_PMINFO_PKGINFO_PROP_PACKAGE_SUPPORT_MODE: + snprintf(buf, MAX_QUERY_LEN, "package_info.package_support_mode & %s", node->value); + break; + case E_PMINFO_PKGINFO_PROP_PACKAGE_USE_RESET: + snprintf(buf, MAX_QUERY_LEN, "package_info.package_reserve2 IN %s", node->value); + break; + + case E_PMINFO_APPINFO_PROP_APP_ID: + snprintf(buf, MAX_QUERY_LEN, "package_app_info.app_id='%s'", node->value); + break; + case E_PMINFO_APPINFO_PROP_APP_COMPONENT: + snprintf(buf, MAX_QUERY_LEN, "package_app_info.app_component='%s'", node->value); + break; + case E_PMINFO_APPINFO_PROP_APP_COMPONENT_TYPE: + sqlite3_snprintf(MAX_QUERY_LEN, buf, "package_app_info.component_type=%Q", node->value); + break; + case E_PMINFO_APPINFO_PROP_APP_EXEC: + snprintf(buf, MAX_QUERY_LEN, "package_app_info.app_exec='%s'", node->value); + break; + case E_PMINFO_APPINFO_PROP_APP_AMBIENT_SUPPORT: + snprintf(buf, MAX_QUERY_LEN, "package_app_info.app_ambient_support='%s'", node->value); + break; + case E_PMINFO_APPINFO_PROP_APP_ICON: + snprintf(buf, MAX_QUERY_LEN, "package_app_localized_info.app_icon='%s'", node->value); + break; + case E_PMINFO_APPINFO_PROP_APP_TYPE: + snprintf(buf, MAX_QUERY_LEN, "package_app_info.app_type='%s'", node->value); + break; + case E_PMINFO_APPINFO_PROP_APP_OPERATION: + snprintf(temp, PKG_STRING_LEN_MAX, "(%s)", node->value); + snprintf(buf, MAX_QUERY_LEN, "package_app_app_svc.operation IN %s", temp); + break; + case E_PMINFO_APPINFO_PROP_APP_URI: + snprintf(temp, PKG_STRING_LEN_MAX, "(%s)", node->value); + snprintf(buf, MAX_QUERY_LEN, "package_app_app_svc.uri_scheme IN %s", temp); + break; + case E_PMINFO_APPINFO_PROP_APP_MIME: + snprintf(temp, PKG_STRING_LEN_MAX, "(%s)", node->value); + snprintf(buf, MAX_QUERY_LEN, "package_app_app_svc.mime_type IN %s", temp); + break; + case E_PMINFO_APPINFO_PROP_APP_CATEGORY: + snprintf(temp, PKG_STRING_LEN_MAX, "(%s)", node->value); + snprintf(buf, MAX_QUERY_LEN, "package_app_app_category.category IN %s", temp); + break; + case E_PMINFO_APPINFO_PROP_APP_NODISPLAY: + snprintf(buf, MAX_QUERY_LEN, "package_app_info.app_nodisplay IN %s", node->value); + break; + case E_PMINFO_APPINFO_PROP_APP_MULTIPLE: + snprintf(buf, MAX_QUERY_LEN, "package_app_info.app_multiple IN %s", node->value); + break; + case E_PMINFO_APPINFO_PROP_APP_ONBOOT: + snprintf(buf, MAX_QUERY_LEN, "package_app_info.app_onboot IN %s", node->value); + break; + case E_PMINFO_APPINFO_PROP_APP_AUTORESTART: + snprintf(buf, MAX_QUERY_LEN, "package_app_info.app_autorestart IN %s", node->value); + break; + case E_PMINFO_APPINFO_PROP_APP_TASKMANAGE: + snprintf(buf, MAX_QUERY_LEN, "package_app_info.app_taskmanage IN %s", node->value); + break; + case E_PMINFO_APPINFO_PROP_APP_HWACCELERATION: + snprintf(buf, MAX_QUERY_LEN, "package_app_info.app_hwacceleration='%s'", node->value); + break; + case E_PMINFO_APPINFO_PROP_APP_SCREENREADER: + snprintf(buf, MAX_QUERY_LEN, "package_app_info.app_screenreader='%s'", node->value); + break; + case E_PMINFO_APPINFO_PROP_APP_LAUNCHCONDITION: + snprintf(buf, MAX_QUERY_LEN, "package_app_info.app_launchcondition IN %s", node->value); + break; + case E_PMINFO_APPINFO_PROP_APP_SUPPORT_DISABLE: + snprintf(buf, MAX_QUERY_LEN, "package_app_info.app_support_disable IN %s", node->value); + break; + case E_PMINFO_APPINFO_PROP_APP_DISABLE: + snprintf(buf, MAX_QUERY_LEN, "package_app_info.app_disable IN %s", node->value); + break; + case E_PMINFO_APPINFO_PROP_APP_REMOVABLE: + snprintf(buf, MAX_QUERY_LEN, "package_app_info.app_removable IN %s", node->value); + break; + case E_PMINFO_APPINFO_PROP_APP_SUPPORT_MODE: + snprintf(buf, MAX_QUERY_LEN, "package_app_info.app_support_mode & %s", node->value); + break; + default: + _LOGE("Invalid Property Type\n"); + *condition = NULL; + return; + } + *condition = strdup(buf); + return; +} + +int __pkginfo_check_installed_storage(pkgmgr_pkginfo_x *pkginfo) +{ + char buf[MAX_QUERY_LEN] = {'\0'}; + retvm_if(pkginfo->manifest_info->package == NULL, PMINFO_R_OK, "pkgid is NULL\n"); + retvm_if(pkginfo->manifest_info->installed_storage == NULL, PMINFO_R_ERROR, "installed_storage is NULL\n"); + + if (strcmp(pkginfo->manifest_info->installed_storage,"installed_external") == 0) { + snprintf(buf, MAX_QUERY_LEN - 1, "%s%s", PKG_SD_PATH, pkginfo->manifest_info->package); + if (access(buf, R_OK) != 0) { + _LOGE("can not access [%s]", buf); + return PMINFO_R_ERROR; + } + } + + return PMINFO_R_OK; +} + +int __appinfo_check_installed_storage(pkgmgr_appinfo_x *appinfo) +{ + char buf[MAX_QUERY_LEN] = {'\0'}; + char pkgid[MAX_QUERY_LEN] = {'\0'}; + + snprintf(pkgid, MAX_QUERY_LEN - 1, "%s", appinfo->uiapp_info->package); + + retvm_if(appinfo->uiapp_info->installed_storage == NULL, PMINFO_R_ERROR, "installed_storage is NULL\n"); + + if (strcmp(appinfo->uiapp_info->installed_storage,"installed_external") == 0) { + snprintf(buf, MAX_QUERY_LEN - 1, "%s%s", PKG_SD_PATH, pkgid); + if (access(buf, R_OK) != 0) { + _LOGE("can not access [%s]", buf); + return PMINFO_R_ERROR; + } + } + + return PMINFO_R_OK; +} +