--- /dev/null
+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/)
+
--- /dev/null
+Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.\r
+\r
+ Apache License\r
+ Version 2.0, January 2004\r
+ http://www.apache.org/licenses/\r
+\r
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\r
+\r
+ 1. Definitions.\r
+\r
+ "License" shall mean the terms and conditions for use, reproduction,\r
+ and distribution as defined by Sections 1 through 9 of this document.\r
+\r
+ "Licensor" shall mean the copyright owner or entity authorized by\r
+ the copyright owner that is granting the License.\r
+\r
+ "Legal Entity" shall mean the union of the acting entity and all\r
+ other entities that control, are controlled by, or are under common\r
+ control with that entity. For the purposes of this definition,\r
+ "control" means (i) the power, direct or indirect, to cause the\r
+ direction or management of such entity, whether by contract or\r
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the\r
+ outstanding shares, or (iii) beneficial ownership of such entity.\r
+\r
+ "You" (or "Your") shall mean an individual or Legal Entity\r
+ exercising permissions granted by this License.\r
+\r
+ "Source" form shall mean the preferred form for making modifications,\r
+ including but not limited to software source code, documentation\r
+ source, and configuration files.\r
+\r
+ "Object" form shall mean any form resulting from mechanical\r
+ transformation or translation of a Source form, including but\r
+ not limited to compiled object code, generated documentation,\r
+ and conversions to other media types.\r
+\r
+ "Work" shall mean the work of authorship, whether in Source or\r
+ Object form, made available under the License, as indicated by a\r
+ copyright notice that is included in or attached to the work\r
+ (an example is provided in the Appendix below).\r
+\r
+ "Derivative Works" shall mean any work, whether in Source or Object\r
+ form, that is based on (or derived from) the Work and for which the\r
+ editorial revisions, annotations, elaborations, or other modifications\r
+ represent, as a whole, an original work of authorship. For the purposes\r
+ of this License, Derivative Works shall not include works that remain\r
+ separable from, or merely link (or bind by name) to the interfaces of,\r
+ the Work and Derivative Works thereof.\r
+\r
+ "Contribution" shall mean any work of authorship, including\r
+ the original version of the Work and any modifications or additions\r
+ to that Work or Derivative Works thereof, that is intentionally\r
+ submitted to Licensor for inclusion in the Work by the copyright owner\r
+ or by an individual or Legal Entity authorized to submit on behalf of\r
+ the copyright owner. For the purposes of this definition, "submitted"\r
+ means any form of electronic, verbal, or written communication sent\r
+ to the Licensor or its representatives, including but not limited to\r
+ communication on electronic mailing lists, source code control systems,\r
+ and issue tracking systems that are managed by, or on behalf of, the\r
+ Licensor for the purpose of discussing and improving the Work, but\r
+ excluding communication that is conspicuously marked or otherwise\r
+ designated in writing by the copyright owner as "Not a Contribution."\r
+\r
+ "Contributor" shall mean Licensor and any individual or Legal Entity\r
+ on behalf of whom a Contribution has been received by Licensor and\r
+ subsequently incorporated within the Work.\r
+\r
+ 2. Grant of Copyright License. Subject to the terms and conditions of\r
+ this License, each Contributor hereby grants to You a perpetual,\r
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable\r
+ copyright license to reproduce, prepare Derivative Works of,\r
+ publicly display, publicly perform, sublicense, and distribute the\r
+ Work and such Derivative Works in Source or Object form.\r
+\r
+ 3. Grant of Patent License. Subject to the terms and conditions of\r
+ this License, each Contributor hereby grants to You a perpetual,\r
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable\r
+ (except as stated in this section) patent license to make, have made,\r
+ use, offer to sell, sell, import, and otherwise transfer the Work,\r
+ where such license applies only to those patent claims licensable\r
+ by such Contributor that are necessarily infringed by their\r
+ Contribution(s) alone or by combination of their Contribution(s)\r
+ with the Work to which such Contribution(s) was submitted. If You\r
+ institute patent litigation against any entity (including a\r
+ cross-claim or counterclaim in a lawsuit) alleging that the Work\r
+ or a Contribution incorporated within the Work constitutes direct\r
+ or contributory patent infringement, then any patent licenses\r
+ granted to You under this License for that Work shall terminate\r
+ as of the date such litigation is filed.\r
+\r
+ 4. Redistribution. You may reproduce and distribute copies of the\r
+ Work or Derivative Works thereof in any medium, with or without\r
+ modifications, and in Source or Object form, provided that You\r
+ meet the following conditions:\r
+\r
+ (a) You must give any other recipients of the Work or\r
+ Derivative Works a copy of this License; and\r
+\r
+ (b) You must cause any modified files to carry prominent notices\r
+ stating that You changed the files; and\r
+\r
+ (c) You must retain, in the Source form of any Derivative Works\r
+ that You distribute, all copyright, patent, trademark, and\r
+ attribution notices from the Source form of the Work,\r
+ excluding those notices that do not pertain to any part of\r
+ the Derivative Works; and\r
+\r
+ (d) If the Work includes a "NOTICE" text file as part of its\r
+ distribution, then any Derivative Works that You distribute must\r
+ include a readable copy of the attribution notices contained\r
+ within such NOTICE file, excluding those notices that do not\r
+ pertain to any part of the Derivative Works, in at least one\r
+ of the following places: within a NOTICE text file distributed\r
+ as part of the Derivative Works; within the Source form or\r
+ documentation, if provided along with the Derivative Works; or,\r
+ within a display generated by the Derivative Works, if and\r
+ wherever such third-party notices normally appear. The contents\r
+ of the NOTICE file are for informational purposes only and\r
+ do not modify the License. You may add Your own attribution\r
+ notices within Derivative Works that You distribute, alongside\r
+ or as an addendum to the NOTICE text from the Work, provided\r
+ that such additional attribution notices cannot be construed\r
+ as modifying the License.\r
+\r
+ You may add Your own copyright statement to Your modifications and\r
+ may provide additional or different license terms and conditions\r
+ for use, reproduction, or distribution of Your modifications, or\r
+ for any such Derivative Works as a whole, provided Your use,\r
+ reproduction, and distribution of the Work otherwise complies with\r
+ the conditions stated in this License.\r
+\r
+ 5. Submission of Contributions. Unless You explicitly state otherwise,\r
+ any Contribution intentionally submitted for inclusion in the Work\r
+ by You to the Licensor shall be under the terms and conditions of\r
+ this License, without any additional terms or conditions.\r
+ Notwithstanding the above, nothing herein shall supersede or modify\r
+ the terms of any separate license agreement you may have executed\r
+ with Licensor regarding such Contributions.\r
+\r
+ 6. Trademarks. This License does not grant permission to use the trade\r
+ names, trademarks, service marks, or product names of the Licensor,\r
+ except as required for reasonable and customary use in describing the\r
+ origin of the Work and reproducing the content of the NOTICE file.\r
+\r
+ 7. Disclaimer of Warranty. Unless required by applicable law or\r
+ agreed to in writing, Licensor provides the Work (and each\r
+ Contributor provides its Contributions) on an "AS IS" BASIS,\r
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\r
+ implied, including, without limitation, any warranties or conditions\r
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\r
+ PARTICULAR PURPOSE. You are solely responsible for determining the\r
+ appropriateness of using or redistributing the Work and assume any\r
+ risks associated with Your exercise of permissions under this License.\r
+\r
+ 8. Limitation of Liability. In no event and under no legal theory,\r
+ whether in tort (including negligence), contract, or otherwise,\r
+ unless required by applicable law (such as deliberate and grossly\r
+ negligent acts) or agreed to in writing, shall any Contributor be\r
+ liable to You for damages, including any direct, indirect, special,\r
+ incidental, or consequential damages of any character arising as a\r
+ result of this License or out of the use or inability to use the\r
+ Work (including but not limited to damages for loss of goodwill,\r
+ work stoppage, computer failure or malfunction, or any and all\r
+ other commercial damages or losses), even if such Contributor\r
+ has been advised of the possibility of such damages.\r
+\r
+ 9. Accepting Warranty or Additional Liability. While redistributing\r
+ the Work or Derivative Works thereof, You may choose to offer,\r
+ and charge a fee for, acceptance of support, warranty, indemnity,\r
+ or other liability obligations and/or rights consistent with this\r
+ License. However, in accepting such obligations, You may act only\r
+ on Your own behalf and on Your sole responsibility, not on behalf\r
+ of any other Contributor, and only if You agree to indemnify,\r
+ defend, and hold each Contributor harmless for any liability\r
+ incurred by, or claims asserted against, such Contributor by reason\r
+ of your accepting any such warranty or additional liability.\r
+\r
+ END OF TERMS AND CONDITIONS\r
+\r
+ APPENDIX: How to apply the Apache License to your work.\r
+\r
+ To apply the Apache License to your work, attach the following\r
+ boilerplate notice, with the fields enclosed by brackets "[]"\r
+ replaced with your own identifying information. (Don't include\r
+ the brackets!) The text should be enclosed in the appropriate\r
+ comment syntax for the file format. We also recommend that a\r
+ file or class name and description of purpose be included on the\r
+ same "printed page" as the copyright notice for easier\r
+ identification within third-party archives.\r
+\r
+ Copyright [yyyy] [name of copyright owner]\r
+\r
+ Licensed under the Apache License, Version 2.0 (the "License");\r
+ you may not use this file except in compliance with the License.\r
+ You may obtain a copy of the License at\r
+\r
+ http://www.apache.org/licenses/LICENSE-2.0\r
+\r
+ Unless required by applicable law or agreed to in writing, software\r
+ distributed under the License is distributed on an "AS IS" BASIS,\r
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ See the License for the specific language governing permissions and\r
+ limitations under the License.\r
+\r
--- /dev/null
+pkgmgr-info (0.2.1) unstable; urgency=low
+
+ * Initial release
+ * Git: slp/pkgs/a/pkgmgr-info
+ * Tag: pkgmgr-info_0.2.1
+
+ -- Jaeho Lee <jaeho81.lee@samsung.com> Thu, 24 May 2012 12:04:51 +0530
+
--- /dev/null
+Source: pkgmgr-info
+Section: devel
+Priority: extra
+Maintainer: Garima Shrivastava <garima.s@samsung.com>, Jaeho Lee <jaeho81.lee@samsung.com>
+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: <App2sd is a utility for enabling installation of applications to sd card and also to move to and from sd card.>
+
+Package: pkgmgr-info-dev
+Architecture: any
+Depends: app2sd (= ${Source-Version})
+Description: App2sd dev package
+
+Package: pkgmgr-info-doc
+Architecture: all
+Description: <App2sd is a utility for enabling installation of applications to sd card and also to move to and from sd card.>
+
+Package: pkgmgr-info-dbg
+Section: debug
+Architecture: any
+Depends: pkgmgr-info (= ${Source-Version})
+Description: pkgmgr-info dbg package
+
--- /dev/null
+/*
+ * 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.
+ *
+ */
--- /dev/null
+usr/bin
+usr/sbin
--- /dev/null
+@PREFIX@/include/pkgmgr-info.h
+@PREFIX@/lib/pkgconfig/*.pc
--- /dev/null
+@PREFIX@/lib/*.so*
--- /dev/null
+#!/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
--- /dev/null
+#!/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}
--- /dev/null
+/*
+ * pkgmgr-info
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>,
+ * Jaeho Lee <jaeho81.lee@samsung.com>, Shobhit Srivastava <shobhit.s@samsung.com>
+ *
+ * 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
+
+<h1 class="pg"> Introduction</h1>
+<h2 class="pg"> Purpose of this document</h2>
+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.
+
+<h2 class="pg"> Scope</h2>
+The scope of this document is limited to Samsung platform Package Manager Info API usage.
+
+<h1 class="pg"> Architecture</h1>
+<h2 class="pg"> Architecture overview</h2>
+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.
+
+
+<h2 class="pg"> Features</h2>
+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"
+
+<h1 class="pg"> Package Manager API descriptions</h1>
+<b> SEE API manual </b>
+
+<h1 class="pg"> Package Manager Features with sample code</h1>
+<h2 class="pg"> Get /Set Package Information in DB</h2>
+
+Client application
+- Get package version from manifest DB
+
+@code
+#include <pkgmgr-info.h>
+
+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 <pkgmgr-info.h>
+
+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
+
+
+<h2 class="pg"> Filter Package/Application Information </h2>
+
+- Filter number of installed rpm packages out of total number of packages installed.
+
+@code
+#include <pkgmgr-info.h>
+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 <pkgmgr-info.h>
+
+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
+
+<h2 class="pg"> Manifest Parser </h2>
+
+- Parse the package manifest file and insert the parsed data in manifest DB.
+
+@code
+#include <pkgmgr-info.h>
+
+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 <pkgmgr-info.h>
+
+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 <pkgmgr-info.h>
+
+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
+
+
+*/
+
+/**
+@}
+*/
+
+
--- /dev/null
+/*
+ * pkgmgr-info
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>,
+ * Jaeho Lee <jaeho81.lee@samsung.com>, Shobhit Srivastava <shobhit.s@samsung.com>
+ *
+ * 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 <sewook7.park@samsung.com>
+ * @author Shobhit Srivastava <shobhit.s@samsung.com>
+ * @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 <pkgmgr-info.h>
+ * @endcode
+ *
+ * @}
+ */
+
+#ifndef __PKG_INFO_H__
+#define __PKG_INFO_H__
+
+#include <errno.h>
+#include <stdbool.h>
+
+#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 <sewook7.park@samsung.com>
+ */
+
+
+/**
+ * @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__ */
+/**
+ * @}
+ * @}
+ */
+
--- /dev/null
+/*
+ * pkgmgrinfo-basic
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>,
+ * Jaeho Lee <jaeho81.lee@samsung.com>, Shobhit Srivastava <shobhit.s@samsung.com>
+ *
+ * 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; /**<name space*/
+ const char *removable; /**< package removable flag*/
+ const char *preload; /**< package preload flag*/
+ const char *readonly; /**< package readonly flag*/
+ const char *update; /**< package update flag*/
+ const char *appsetting; /**< package app setting flag*/
+ const char *system; /**< package system flag*/
+ const char *type; /**< package type*/
+ const char *package_size; /**< package size for external installation*/
+ const char *package_total_size; /**< package size for total*/
+ const char *package_data_size; /**< package size for data*/
+ const char *installed_time; /**< installed time after finishing of installation*/
+ const char *installed_storage; /**< package currently installed storage*/
+ const char *storeclient_id; /**< id of store client for installed package*/
+ const char *mainapp_id; /**< app id of main application*/
+ const char *package_url; /**< app id of main application*/
+ const char *root_path; /**< package root path*/
+ const char *csc_path; /**< package csc path*/
+ const char *nodisplay_setting; /**< package no display setting menu*/
+ const char *support_disable; /**< package support disable flag*/
+ const char *mother_package; /**< package is mother package*/
+ const char *support_mode; /**< package support mode*/
+ const char *support_reset; /**< package support reset*/
+ const char *use_reset; /**< package use reset*/
+ const char *groupid; /**< package groupid*/
+ const char *hash; /**<manifest file's hash */
+ struct icon_x *icon; /**< package icon*/
+ struct label_x *label; /**< package label*/
+ struct author_x *author; /**< package author*/
+ struct description_x *description; /**< package description*/
+ struct license_x *license; /**< package license*/
+ struct privileges_x *privileges; /**< package privileges*/
+ struct uiapplication_x *uiapplication; /**< package's ui application*/
+ struct serviceapplication_x *serviceapplication; /**< package's service application*/
+ struct daemon_x *daemon; /**< package daemon*/
+ struct theme_x *theme; /**< package theme*/
+ struct font_x *font; /**< package font*/
+ struct ime_x *ime; /**< package ime*/
+ struct compatibility_x *compatibility; /**< package compatibility*/
+ struct deviceprofile_x *deviceprofile; /**< package device profile*/
+} manifest_x;
+
+/**
+ * @brief List definitions.
+ * All lists are doubly-linked, the last element is stored to list pointer,
+ * which means that lists must be looped using the prev pointer, or by
+ * calling LISTHEAD first to go to start in order to use the next pointer.
+ */
+
+ /**
+ * @brief Convinience Macro to add node in list
+ */
+
+#define LISTADD(list, node) \
+ do { \
+ (node)->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__ */
--- /dev/null
+/*
+ * pkgmgr-info-debug
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: junsuk. oh <junsuk77.oh@samsung.com>
+ *
+ * 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 <dlog.h>
+
+#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__ */
--- /dev/null
+/*
+ * pkgmgrinfo_feature
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>,
+ * Jaeho Lee <jaeho81.lee@samsung.com>, Shobhit Srivastava <shobhit.s@samsung.com>
+ *
+ * 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__ */
--- /dev/null
+/*
+ * pkgmgr-info
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>,
+ * Jaeho Lee <jaeho81.lee@samsung.com>, Shobhit Srivastava <shobhit.s@samsung.com>
+ *
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <db-util.h>
+#include <sqlite3.h>
+#include <glib.h>
+#include <ctype.h>
+#include <assert.h>
+#include <dlfcn.h>
+#include <dirent.h>
+#include <sys/stat.h>
+
+#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__ */
--- /dev/null
+/*
+ * pkgmgrinfo_type
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>,
+ * Jaeho Lee <jaeho81.lee@samsung.com>, Shobhit Srivastava <shobhit.s@samsung.com>
+ *
+ * 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, /**<Use icon for recent image*/
+ PMINFO_RECENTIMAGE_USE_CAPTURE = 1, /**< Use capture for recent image*/
+ PMINFO_RECENTIMAGE_USE_NOTHING = 2 /**< Don't use recent image */
+}pkgmgrinfo_app_recentimage;
+
+/**
+ * @brief Install Location Types
+ */
+typedef enum {
+ PMINFO_INSTALL_LOCATION_AUTO = 0, /**< Auto*/
+ PMINFO_INSTALL_LOCATION_INTERNAL_ONLY, /**< Internal Installation*/
+ PMINFO_INSTALL_LOCATION_PREFER_EXTERNAL, /**< External Installation*/
+}pkgmgrinfo_install_location;
+
+/**
+ * @brief Application Component Types
+ */
+typedef enum {
+ PMINFO_ALL_APP = 0, /**< All Application*/
+ PMINFO_UI_APP, /**< UI Application*/
+ PMINFO_SVC_APP, /**< Service Application*/
+}pkgmgrinfo_app_component;
+
+/**
+ * @brief Application Storage Types
+ */
+typedef enum {
+ PMINFO_INTERNAL_STORAGE = 0, /**< Internal Storage*/
+ PMINFO_EXTERNAL_STORAGE = 1, /**< External Storage*/
+}pkgmgrinfo_installed_storage;
+
+/**
+ * @brief Certificate Types to be used for getting information
+ */
+typedef enum {
+ PMINFO_AUTHOR_ROOT_CERT = 0, /**< Author Root Certificate*/
+ PMINFO_AUTHOR_INTERMEDIATE_CERT = 1, /**< Author Intermediate Certificate*/
+ PMINFO_AUTHOR_SIGNER_CERT = 2, /**< Author Signer Certificate*/
+ PMINFO_DISTRIBUTOR_ROOT_CERT = 3, /**< Distributor Root Certificate*/
+ PMINFO_DISTRIBUTOR_INTERMEDIATE_CERT = 4, /**< Distributor Intermediate Certificate*/
+ PMINFO_DISTRIBUTOR_SIGNER_CERT = 5, /**< Distributor Signer Certificate*/
+ PMINFO_DISTRIBUTOR2_ROOT_CERT = 6, /**< End Entity Root Certificate*/
+ PMINFO_DISTRIBUTOR2_INTERMEDIATE_CERT = 7, /**< End Entity Intermediate Certificate*/
+ PMINFO_DISTRIBUTOR2_SIGNER_CERT = 8, /**< End Entity Signer Certificate*/
+}pkgmgrinfo_cert_type;
+
+/**
+ * @brief Install Location Types to be used when setting data in DB
+ */
+typedef enum {
+ INSTALL_INTERNAL = 0, /**< Internal Installation*/
+ INSTALL_EXTERNAL, /**< External Installation*/
+} INSTALL_LOCATION;
+
+/**
+ * @brief permission Types
+ */
+typedef enum {
+ PMINFO_PERMISSION_NORMAL = 0, /**< permission normal*/
+ PMINFO_PERMISSION_SIGNATURE, /**< permission type is signature*/
+ PMINFO_PERMISSION_PRIVILEGE, /**< permission type is privilege*/
+}pkgmgrinfo_permission_type;
+
+
+typedef enum {
+ PMINFO_REQUEST = 0,
+ PMINFO_LISTENING,
+ PMINFO_BROADCAST,
+}pkgmgrinfo_client_type;
+
+/**
+ * @fn int (*pkgmgrinfo_pkg_list_cb ) (const pkgmgrinfo_pkginfo_h handle, void *user_data)
+ *
+ * @brief Specifies the type of function passed to pkgmgrinfo_pkginfo_get_list(), pkgmgrinfo_pkginfo_filter_foreach_pkginfo()
+ *
+ * @param[in] handle the pkginfo handle
+ * @param[in] user_data user data passed to pkgmgrinfo_pkginfo_get_list(), pkgmgrinfo_pkginfo_filter_foreach_pkginfo()
+ *
+ * @return 0 if success, negative value(<0) if fail. Callback is not called if return value is negative.\n
+ *
+ * @see pkgmgrinfo_pkginfo_get_list()
+ * @see pkgmgrinfo_pkginfo_filter_foreach_pkginfo()
+ */
+typedef int (*pkgmgrinfo_pkg_list_cb ) (const pkgmgrinfo_pkginfo_h handle, void *user_data);
+
+/**
+ * @fn int (*pkgmgrinfo_app_list_cb ) (const pkgmgrinfo_appinfo_h handle, void *user_data)
+ *
+ * @brief Specifies the type of function passed to pkgmgrinfo_appinfo_get_list(), pkgmgrinfo_appinfo_filter_foreach_appinfo(), pkgmgrinfo_appinfo_metadata_filter_foreach()
+ *
+ * @param[in] handle the appinfo handle
+ * @param[in] user_data user data passed to pkgmgrinfo_appinfo_get_list(), pkgmgrinfo_appinfo_filter_foreach_appinfo(), pkgmgrinfo_appinfo_metadata_filter_foreach()
+ *
+ * @return 0 if success, negative value(<0) if fail. Callback is not called if return value is negative.\n
+ *
+ * @see pkgmgrinfo_appinfo_get_list()
+ * @see pkgmgrinfo_appinfo_filter_foreach_appinfo()
+ * @see pkgmgrinfo_appinfo_metadata_filter_foreach()
+ */
+typedef int (*pkgmgrinfo_app_list_cb ) (const pkgmgrinfo_appinfo_h handle, void *user_data);
+
+/**
+ * @fn int (*pkgmgrinfo_app_category_list_cb ) (const char *category_name, void *user_data)
+ *
+ * @brief Specifies the type of function passed to pkgmgrinfo_appinfo_foreach_category()
+ *
+ * @param[in] category_name the name of the category
+ * @param[in] user_data user data passed to pkgmgrinfo_appinfo_foreach_category()
+ *
+ * @return 0 if success, negative value(<0) if fail. Callback is not called if return value is negative.\n
+ *
+ * @see pkgmgrinfo_appinfo_foreach_category()
+ */
+typedef int (*pkgmgrinfo_app_category_list_cb ) (const char *category_name, void *user_data);
+
+/**
+ * @fn int (*pkgmgrinfo_app_permission_list_cb ) (const char *permission_type, void *user_data)
+ *
+ * @brief Specifies the type of function passed to pkgmgrinfo_appinfo_foreach_category()
+ *
+ * @param[in] permission_name the name of the permission
+ * @param[in] user_data user data passed to pkgmgrinfo_appinfo_foreach_category()
+ *
+ * @return 0 if success, negative value(<0) if fail. Callback is not called if return value is negative.\n
+ *
+ * @see pkgmgrinfo_appinfo_foreach_category()
+ */
+typedef int (*pkgmgrinfo_app_permission_list_cb ) (const char *permission_type, void *user_data);
+
+/**
+ * @fn int (*pkgmgrinfo_pkg_privilege_list_cb ) (const char *privilege_name, void *user_data)
+ *
+ * @brief Specifies the type of function passed to pkgmgrinfo_pkginfo_foreach_privilege()
+ *
+ * @param[in] privilege_name the name of the privilege
+ * @param[in] user_data user data passed to pkgmgrinfo_pkginfo_foreach_privilege()
+ *
+ * @return 0 if success, negative value(<0) if fail. Callback is not called if return value is negative.\n
+ *
+ * @see pkgmgrinfo_pkginfo_foreach_privilege()
+ */
+typedef int (*pkgmgrinfo_pkg_privilege_list_cb ) (const char *privilege_name, void *user_data);
+
+/**
+ * @fn int (*pkgmgrinfo_app_metadata_list_cb ) (const char *metadata_key, const char *metadata_value, void *user_data)
+ *
+ * @brief Specifies the type of function passed to pkgmgrinfo_appinfo_foreach_metadata()
+ *
+ * @param[in] metadata_name the name of the metadata
+ * @param[in] metadata_value the value of the metadata
+ * @param[in] user_data user data passed to pkgmgrinfo_appinfo_foreach_metadata()
+ *
+ * @return 0 if success, negative value(<0) if fail. Callback is not called if return value is negative.\n
+ *
+ * @see pkgmgrinfo_appinfo_foreach_metadata()
+ */
+typedef int (*pkgmgrinfo_app_metadata_list_cb ) (const char *metadata_key, const char *metadata_value, void *user_data);
+
+/**
+ * @fn int (*pkgmgrinfo_app_control_list_cb ) (pkgmgrinfo_appcontrol_h handle, void *user_data)
+ *
+ * @brief Specifies the type of function passed to pkgmgrinfo_appinfo_foreach_appcontrol()
+ *
+ * @param[in] handle the appcontrol handle to be used to get operation, uri and mime info
+ * @param[in] user_data user data passed to pkgmgrinfo_appinfo_foreach_appcontrol()
+ *
+ * @return 0 if success, negative value(<0) if fail. Callback is not called if return value is negative.\n
+ *
+ * @see pkgmgrinfo_appinfo_foreach_appcontrol()
+ */
+typedef int (*pkgmgrinfo_app_control_list_cb ) (pkgmgrinfo_appcontrol_h handle, void *user_data);
+
+/**
+ * @brief type definition.
+ */
+typedef int (*pkgmgrinfo_handler)(int req_id, const char *pkg_type,
+ const char *pkgid, const char *key,
+ const char *val, const void *pmsg, void *data);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* __PKGPMGRINFO_TYPE_H__ */
--- /dev/null
+Name: pkgmgr-info
+Summary: Packager Manager infomation api for package
+Version: 0.0.231
+Release: 1
+Group: Application Framework/Package Management
+License: Apache-2.0
+Source0: %{name}-%{version}.tar.gz
+BuildRequires: cmake
+BuildRequires: pkgconfig(dlog)
+BuildRequires: pkgconfig(vconf)
+BuildRequires: pkgconfig(sqlite3)
+BuildRequires: pkgconfig(db-util)
+BuildRequires: pkgconfig(libxml-2.0)
+BuildRequires: pkgconfig(dbus-1)
+BuildRequires: pkgconfig(dbus-glib-1)
+BuildRequires: pkgconfig(journal)
+BuildRequires: pkgconfig(openssl)
+
+%description
+Packager Manager infomation api for packaging
+
+%package devel
+Summary: Packager Manager infomation api (devel)
+Group: Development/Libraries
+Requires: %{name} = %{version}-%{release}
+%description devel
+Packager Manager infomation api (devel)
+
+%package parser
+Summary: Library for manifest parser
+Group: Application Framework/Package Management
+Requires: %{name} = %{version}-%{release}
+
+%description parser
+Library for manifest parser
+
+%package parser-devel
+Summary: Dev package for libpkgmgr-parser
+Group: Development/Libraries
+Requires: %{name} = %{version}-%{release}
+
+%description parser-devel
+Dev package for libpkgmgr-parser
+
+
+%prep
+%setup -q
+
+%build
+
+%if 0%{?tizen_build_binary_release_type_eng}
+export CFLAGS="$CFLAGS -DTIZEN_ENGINEER_MODE"
+export CXXFLAGS="$CXXFLAGS -DTIZEN_ENGINEER_MODE"
+export FFLAGS="$FFLAGS -DTIZEN_ENGINEER_MODE"
+%endif
+
+%if "%{?tizen_profile_name}" == "wearable"
+export CFLAGS="$CFLAGS -D_APPFW_FEATURE_PROFILE_WEARABLE"
+%endif
+
+%cmake .
+make %{?jobs:-j%jobs}
+
+%install
+%make_install
+
+mkdir -p %{buildroot}/usr/share/license
+cp LICENSE %{buildroot}/usr/share/license/%{name}
+cp LICENSE %{buildroot}/usr/share/license/%{name}-parser
+
+%post
+
+mkdir -p /opt/usr/apps/tmp
+chown 5100:5100 /opt/usr/apps/tmp
+chmod 771 /opt/usr/apps/tmp
+chsmack -a '*' /opt/usr/apps/tmp
+chsmack -t /opt/usr/apps/tmp
+
+touch /opt/usr/apps/tmp/pkgmgr_tmp.txt
+
+chsmack -a 'pkgmgr::db' /opt/usr/apps/tmp/pkgmgr_tmp.txt
+
+mkdir /usr/etc/package-manager
+chsmack -a '_' /usr/etc/package-manager
+
+%postun
+
+
+%files
+%manifest pkgmgr-info.manifest
+%defattr(-,root,root,-)
+%{_libdir}/libpkgmgr-info.so.*
+/usr/share/license/%{name}
+%attr(0755,root,root) /opt/etc/dump.d/module.d/dump_pkgmgr.sh
+
+%files devel
+%defattr(-,root,root,-)
+%{_includedir}/pkgmgr-info.h
+%{_includedir}/pkgmgrinfo_basic.h
+%{_includedir}/pkgmgrinfo_feature.h
+%{_includedir}/pkgmgrinfo_type.h
+%{_libdir}/pkgconfig/pkgmgr-info.pc
+%{_libdir}/libpkgmgr-info.so
+
+%files parser
+%manifest pkgmgr-parser.manifest
+%defattr(-,root,root,-)
+%{_libdir}/libpkgmgr_parser.so.*
+%{_prefix}/etc/package-manager/preload/manifest.xsd
+%{_prefix}/etc/package-manager/preload/xml.xsd
+%{_prefix}/etc/package-manager/parser_path.conf
+%{_prefix}/etc/package-manager/parserlib/pkgmgr_parser_plugin_list.txt
+/usr/share/license/%{name}-parser
+
+%files parser-devel
+%defattr(-,root,root,-)
+%{_includedir}/pkgmgr/pkgmgr_parser.h
+%{_includedir}/pkgmgr/pkgmgr_parser_feature.h
+%{_includedir}/pkgmgr/pkgmgr_parser_db.h
+%{_libdir}/pkgconfig/pkgmgr-parser.pc
+%{_libdir}/libpkgmgr_parser.so
--- /dev/null
+### Description
+# Communication modules for pkg-mgr client lib and server process
+# By Youmin Ha <youmin.ha@samsung.com>
+
+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/)
+
--- /dev/null
+
+#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
+
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://tizen.org/ns/packages" xmlns:packages="http://tizen.org/ns/packages">
+ <xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="xml.xsd"/>
+
+ <xs:element name="manifest">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:choice maxOccurs="unbounded">
+ <xs:element ref="packages:label"/>
+ <xs:element ref="packages:icon"/>
+ <xs:element ref="packages:author"/>
+ <xs:element ref="packages:description"/>
+ <xs:element ref="packages:compatibility"/>
+ <xs:element ref="packages:profile"/>
+ <xs:element ref="packages:watch-application"/>
+ <xs:element ref="packages:service-application"/>
+ <xs:element ref="packages:ui-application"/>
+ <xs:element ref="packages:ime-application"/>
+ <xs:element ref="packages:shortcut-list"/>
+ <xs:element ref="packages:livebox"/>
+ <xs:element ref="packages:widget"/>
+ <xs:element ref="packages:account"/>
+ <xs:element ref="packages:notifications"/>
+ <xs:element ref="packages:privileges"/>
+ <xs:element ref="packages:font"/>
+ <xs:element ref="packages:ime"/>
+ </xs:choice>
+ </xs:sequence>
+ <xs:attribute name="storeclient-id" type="xs:string"/>
+ <xs:attribute name="install-location" type="packages:InstallLocationType"/>
+ <xs:attribute name="package" use="required" type="xs:string"/>
+ <xs:attribute name="type" type="packages:PackageType"/>
+ <xs:attribute name="version" use="required" type="xs:NMTOKEN"/>
+ <xs:attribute name="size" type="xs:NMTOKEN"/>
+ <xs:attribute name="root_path" type="xs:string"/>
+ <xs:attribute name="csc_path" type="xs:string"/>
+ <xs:attribute name="appsetting" type="xs:boolean"/>
+ <xs:attribute name="nodisplay-setting" type="xs:boolean"/>
+ <xs:attribute name="url" type="xs:string"/>
+ <xs:attribute name="support-disable" type="xs:boolean"/>
+ <xs:attribute name="mother-package" type="xs:boolean"/>
+ <xs:attribute name="api-version" type="xs:string"/>
+ <xs:attribute name="support-mode" type="xs:string"/>
+ <xs:attribute name="support-reset" type="xs:string"/>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:simpleType name="InstallLocationType">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="auto"/>
+ <xs:enumeration value="internal-only"/>
+ <xs:enumeration value="prefer-external"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="PackageType">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="rpm"/>
+ <xs:enumeration value="tpk"/>
+ <xs:enumeration value="wgt"/>
+ <xs:enumeration value="apk"/>
+ <xs:enumeration value="coretpk"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="ProfileType">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="mobile"/>
+ <xs:enumeration value="wearable"/>
+ <xs:enumeration value="TV"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="TypeType">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="capp"/>
+ <xs:enumeration value="c++app"/>
+ <xs:enumeration value="webapp"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="HwAccelerationType">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="on"/>
+ <xs:enumeration value="off"/>
+ <xs:enumeration value="default"/>
+ <xs:enumeration value="use-GL"/>
+ <xs:enumeration value="not-use-GL"/>
+ <xs:enumeration value="use-system-setting"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="ScreenReaderType">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="screenreader-off"/>
+ <xs:enumeration value="screenreader-on"/>
+ <xs:enumeration value="use-system-setting"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="RecentImage">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="icon"/>
+ <xs:enumeration value="capture"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:element name="author">
+ <xs:complexType mixed="true">
+ <xs:attribute name="email"/>
+ <xs:attribute name="href"/>
+ <xs:attribute ref="xml:lang"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="description">
+ <xs:complexType mixed="true">
+ <xs:attribute ref="xml:lang"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="compatibility">
+ <xs:complexType/>
+ </xs:element>
+ <xs:element name="profile">
+ <xs:complexType>
+ <xs:attribute name="name" use="required" type="packages:ProfileType"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="watch-application">
+ </xs:element>
+ <xs:element name="service-application">
+ </xs:element>
+ <xs:element name="ui-application">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:choice maxOccurs="unbounded" minOccurs="0">
+ <xs:element ref="packages:label"/>
+ <xs:element ref="packages:icon"/>
+ <xs:element ref="packages:image"/>
+ <xs:element ref="packages:application-service"/>
+ <xs:element ref="packages:app-control"/>
+ <xs:element ref="packages:category"/>
+ <xs:element ref="packages:metadata"/>
+ <xs:element ref="packages:permission"/>
+ <xs:element ref="packages:datacontrol"/>
+ </xs:choice>
+ </xs:sequence>
+ <xs:attribute name="appid" use="required" type="xs:string"/>
+ <xs:attribute name="exec" use="required"/>
+ <xs:attribute name="ambient-support" type="xs:boolean"/>
+ <xs:attribute name="multiple" type="xs:boolean"/>
+ <xs:attribute name="nodisplay" type="xs:boolean"/>
+ <xs:attribute name="taskmanage" type="xs:boolean"/>
+ <xs:attribute name="enabled" type="xs:boolean"/>
+ <xs:attribute name="type" use="required" type="packages:TypeType"/>
+ <xs:attribute name="categories" type="xs:NCName"/>
+ <xs:attribute name="extraid"/>
+ <xs:attribute name="hw-acceleration" type="packages:HwAccelerationType"/>
+ <xs:attribute name="screen-reader" type="packages:ScreenReaderType"/>
+ <xs:attribute name="recentimage" type="packages:RecentImage"/>
+ <xs:attribute name="mainapp" type="xs:boolean"/>
+ <xs:attribute name="indicatordisplay" type="xs:boolean"/>
+ <xs:attribute name="portrait-effectimage" type="xs:string"/>
+ <xs:attribute name="landscape-effectimage" type="xs:string"/>
+ <xs:attribute name="effectimage-type" type="xs:string"/>
+ <xs:attribute name="guestmode-visibility" type="xs:string"/>
+ <xs:attribute name="launchcondition" type="xs:boolean"/>
+ <xs:attribute name="permission-type" type="xs:string"/>
+ <xs:attribute name="component-type" type="xs:string"/>
+ <xs:attribute name="submode" type="xs:boolean"/>
+ <xs:attribute name="submode-mainid" type="xs:string"/>
+ <xs:attribute name="process-pool" type="xs:boolean"/>
+ <xs:attribute name="auto-restart" type="xs:boolean"/>
+ <xs:attribute name="on-boot" type="xs:boolean"/>
+ <xs:attribute name="multi-instance" type="xs:boolean"/>
+ <xs:attribute name="multi-instance-mainid" type="xs:string"/>
+ <xs:attribute name="ui-gadget" type="xs:boolean"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="ime-application">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:choice maxOccurs="unbounded">
+ <xs:element ref="packages:label"/>
+ <xs:element ref="packages:icon"/>
+ </xs:choice>
+ </xs:sequence>
+ <xs:attribute name="appid" use="required" type="xs:string"/>
+ <xs:attribute name="exec" use="required" type="xs:NCName"/>
+ <xs:attribute name="multiple" type="xs:boolean"/>
+ <xs:attribute name="nodisplay" type="xs:boolean"/>
+ <xs:attribute name="type" use="required" type="packages:TypeType"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="shortcut-list">
+ </xs:element>
+ <xs:element name="livebox">
+ </xs:element>
+ <xs:element name="widget">
+ </xs:element>
+ <xs:element name="account">
+ </xs:element>
+ <xs:element name="notifications">
+ </xs:element>
+ <xs:element name="ime">
+ </xs:element>
+ <xs:element name="privileges">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:choice maxOccurs="unbounded" minOccurs="0">
+ <xs:element ref="packages:privilege"/>
+ </xs:choice>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="privilege">
+ </xs:element>
+ <xs:element name="font">
+ </xs:element>
+ <xs:element name="label">
+ <xs:complexType mixed="true">
+ <xs:attribute ref="xml:lang"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="icon">
+ <xs:complexType mixed="true">
+ <xs:attribute ref="xml:lang"/>
+ <xs:attribute name="section" type="xs:string"/>
+ <xs:attribute name="resolution" type="packages:ResolutionType"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="image">
+ <xs:complexType mixed="true">
+ <xs:attribute ref="xml:lang"/>
+ <xs:attribute name="section" type="xs:string"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:simpleType name="SectionType">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="notification"/>
+ <xs:enumeration value="setting"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="ResolutionType">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="xhigh"/>
+ <xs:enumeration value="high"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:element name="application-service">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:choice maxOccurs="unbounded">
+ <xs:element ref="packages:operation"/>
+ <xs:element ref="packages:uri"/>
+ <xs:element ref="packages:mime"/>
+ <xs:element ref="packages:subapp"/>
+ </xs:choice>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="app-control">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:choice maxOccurs="unbounded">
+ <xs:element ref="packages:operation"/>
+ <xs:element ref="packages:uri"/>
+ <xs:element ref="packages:mime"/>
+ <xs:element ref="packages:subapp"/>
+ </xs:choice>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="category">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:choice maxOccurs="unbounded">
+ <xs:any minOccurs="0" processContents="lax"/>
+ </xs:choice>
+ </xs:sequence>
+ <xs:anyAttribute processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="metadata">
+ <xs:complexType>
+ <xs:attribute name="key" use="required" type="xs:string"/>
+ <xs:attribute name="value" type="xs:string"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="permission">
+ <xs:complexType>
+ <xs:attribute name="type" type="xs:string"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="datacontrol">
+ <xs:complexType>
+ <xs:attribute name="providerid" type="xs:string"/>
+ <xs:attribute name="access" type="xs:string"/>
+ <xs:attribute name="type" type="xs:string"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="operation">
+ <xs:complexType>
+ <xs:attribute name="name" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="uri">
+ <xs:complexType>
+ <xs:attribute name="name" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="mime">
+ <xs:complexType>
+ <xs:attribute name="name" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="subapp">
+ <xs:complexType>
+ <xs:attribute name="name" use="required"/>
+ </xs:complexType>
+ </xs:element>
+</xs:schema>
--- /dev/null
+#
+# 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
--- /dev/null
+/*
+ * pkgmgr-info
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>,
+ * Jaeho Lee <jaeho81.lee@samsung.com>, Shobhit Srivastava <shobhit.s@samsung.com>
+ *
+ * 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 <dlfcn.h>
+#include <string.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <time.h>
+#include <string.h>
+#include <libxml/parser.h>
+#include <libxml/xmlreader.h>
+#include <libxml/xmlschemas.h>
+#include <vconf.h>
+#include <glib.h>
+#include <db-util.h>
+#include <journal/appcore.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"
+
+#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();
+}
+
--- /dev/null
+/*
+ * pkgmgr-info
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>,
+ * Jaeho Lee <jaeho81.lee@samsung.com>, Shobhit Srivastava <shobhit.s@samsung.com>
+ *
+ * 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 <sewook7.park@samsung.com>
+ * @author Shobhit Srivastava <shobhit.s@samsung.com>
+ * @version 0.1
+ * @brief This file declares API of pkgmgr_parser
+ * @addtogroup APPLICATION_FRAMEWORK
+ * @{
+ *
+ * @defgroup PackageManagerParser
+ * @section Header Header file to include:
+ * @code
+ * #include <pkgmgr_parser.h>
+ * @endcode
+ *
+ * @}
+ */
+
+#include <libxml/xmlreader.h>
+#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__ */
--- /dev/null
+/*
+ * pkgmgr-info
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>,
+ * Jaeho Lee <jaeho81.lee@samsung.com>, Shobhit Srivastava <shobhit.s@samsung.com>
+ *
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <db-util.h>
+#include <glib.h>
+#include <dlfcn.h>
+
+#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;
+
+
+}
+
--- /dev/null
+/*
+ * pkgmgr-info
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>,
+ * Jaeho Lee <jaeho81.lee@samsung.com>, Shobhit Srivastava <shobhit.s@samsung.com>
+ *
+ * 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 <shobhit.s@samsung.com>
+ * @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 <pkgmgr_parser_db.h>
+ * @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__ */
+/**
+ * @}
+ * @}
+ */
--- /dev/null
+/*
+ * pkgmgr_parser_db_util
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>,
+ * Jaeho Lee <jaeho81.lee@samsung.com>, Shobhit Srivastava <shobhit.s@samsung.com>
+ *
+ * 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 <db-util.h>
+#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;
+}
+
--- /dev/null
+/*
+ * pkgmgr-info
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>,
+ * Jaeho Lee <jaeho81.lee@samsung.com>, Shobhit Srivastava <shobhit.s@samsung.com>
+ *
+ * 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__ */
--- /dev/null
+/*
+ * pkgmgr-info
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>,
+ * Jaeho Lee <jaeho81.lee@samsung.com>, Shobhit Srivastava <shobhit.s@samsung.com>
+ *
+ * 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 <dlfcn.h>
+#include <string.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <time.h>
+#include <libxml/parser.h>
+#include <libxml/xmlreader.h>
+#include <libxml/xmlschemas.h>
+#include <vconf.h>
+#include <glib.h>
+#include <db-util.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <dlfcn.h>
+
+#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;
+}
--- /dev/null
+/*
+ * pkgmgr-info
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>,
+ * Jaeho Lee <jaeho81.lee@samsung.com>, Shobhit Srivastava <shobhit.s@samsung.com>
+ *
+ * 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__ */
--- /dev/null
+/*
+ * pkgmgr-info
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>,
+ * Jaeho Lee <jaeho81.lee@samsung.com>, Shobhit Srivastava <shobhit.s@samsung.com>
+ *
+ * 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__ */
--- /dev/null
+/*
+ * pkgmgr-info
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>,
+ * Jaeho Lee <jaeho81.lee@samsung.com>, Shobhit Srivastava <shobhit.s@samsung.com>
+ *
+ * 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 <dlfcn.h>
+#include <string.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <time.h>
+#include <string.h>
+#include <libxml/parser.h>
+#include <libxml/xmlreader.h>
+#include <libxml/xmlschemas.h>
+#include <glib.h>
+#include <db-util.h>
+
+#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;
+}
+
--- /dev/null
+/*
+ * pkgmgr-info
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>,
+ * Jaeho Lee <jaeho81.lee@samsung.com>, Shobhit Srivastava <shobhit.s@samsung.com>
+ *
+ * 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_ */
--- /dev/null
+# 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"
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://www.w3.org/XML/1998/namespace" xmlns:packages="http://tizen.org/ns/packages">
+ <xs:import namespace="http://tizen.org/ns/packages" schemaLocation="manifest.xsd"/>
+ <xs:attribute name="lang" type="xs:NCName"/>
+</xs:schema>
--- /dev/null
+# usage
+# parserlib:directory_path
+
+parserlib:/usr/etc/package-manager/parserlib/
+metadataparser:/usr/etc/package-manager/parserlib/metadata/
+categoryparser:/usr/etc/package-manager/parserlib/category/
--- /dev/null
+<manifest>
+ <define>
+ <domain name="pkgmgr-info"/>
+ </define>
+ <request>
+ <domain name="pkgmgr-info"/>
+ </request>
+ <assign>
+ <filesystem path="@LIB_INSTALL_DIR@/libpkgmgr-info.*" label="_"/>
+ </assign>
+</manifest>
--- /dev/null
+# 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}
--- /dev/null
+<manifest>
+ <define>
+ <domain name="pkgmgr-parser"/>
+ </define>
+ <request>
+ <domain name="pkgmgr-parser"/>
+ </request>
+ <assign>
+ <filesystem path="@LIB_INSTALL_DIR@/libpkgmgr_parser.so.0" label="_" exec_label="none"/>
+ <filesystem path="@LIB_INSTALL_DIR@/libpkgmgr_parser.so.0.1.0" label="_" exec_label="none"/>
+ <filesystem path="@LIB_INSTALL_DIR@/libpkgmgr_parser_lib_sample.so" label="_" exec_label="none"/>
+ </assign>
+</manifest>
--- /dev/null
+/*
+ * pkgmgrinfo-appinfo
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Junsuk Oh <junsuk77.oh@samsung.com>,
+ *
+ * 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;
+}
--- /dev/null
+/*
+ * pkgmgrinfo-basic
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Junsuk Oh <junsuk77.oh@samsung.com>,
+ *
+ * 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 <stdlib.h>
+#include <string.h>
+
+#include "pkgmgrinfo_basic.h"
+#include "pkgmgrinfo_private.h"
+#include <openssl/md5.h>
+
+#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;
+}
--- /dev/null
+/*
+ * pkgmgrinfo-certinfo
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Junsuk Oh <junsuk77.oh@samsung.com>,
+ *
+ * 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 <stdio.h>
+#include <string.h>
+#include <sqlite3.h>
+#include <db-util.h>
+
+#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;
+}
+
--- /dev/null
+/*
+ * pkgmgrinfo-client
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Junsuk Oh <junsuk77.oh@samsung.com>,
+ *
+ * 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 <stdio.h>
+#include <string.h>
+#include <dlfcn.h>
+#include <dirent.h>
+#include <dbus/dbus.h>
+#include <dbus/dbus-glib-lowlevel.h>
+
+#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*/
+
--- /dev/null
+/*
+ * pkgmgrinfo-db
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Junsuk Oh <junsuk77.oh@samsung.com>,
+ *
+ * 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 <stdio.h>
+#include <string.h>
+#include <sqlite3.h>
+#include <db-util.h>
+#include <dlfcn.h>
+#include <dirent.h>
+
+#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;
+}
+
--- /dev/null
+/*
+ * pkgmgrinfo-feature
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Junsuk Oh <junsuk77.oh@samsung.com>,
+ *
+ * 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;
+}
--- /dev/null
+/*
+ * pkgmgr-info
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>,
+ * Jaeho Lee <jaeho81.lee@samsung.com>, Shobhit Srivastava <shobhit.s@samsung.com>
+ *
+ * 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;
+}
--- /dev/null
+/*
+ * pkgmgrinfo-appinfo
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Junsuk Oh <junsuk77.oh@samsung.com>,
+ *
+ * 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 <vconf.h>
+
+#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;
+}
+