From 6a0425ebebc805bea067f2ef52bc6540879ad08e Mon Sep 17 00:00:00 2001 From: HyungKyu Song Date: Fri, 15 Feb 2013 15:08:56 +0900 Subject: [PATCH] Tizen 2.0 Release --- CMakeLists.txt | 62 + debian/changelog | 8 + debian/compat | 1 + debian/control | 27 + debian/copyright | 16 + debian/dirs | 2 + debian/pkgmgr-info-dev.install.in | 2 + debian/pkgmgr-info.install.in | 1 + debian/rules | 126 + images/SLP_pkgmgr_info.png | Bin 0 -> 35822 bytes images/SLP_pkgmgr_parser.png | Bin 0 -> 32840 bytes include/SLP_pkgmgr_info_PG.h | 301 ++ include/pkgmgr-info-internal.h | 113 + include/pkgmgr-info.h | 4139 ++++++++++++++++++++++ packaging/pkgmgr-info.spec | 104 + parser/CMakeLists.txt | 74 + parser/build.sh | 30 + parser/manifest.xsd.in | 241 ++ parser/pkgmgr-parser.pc.in | 16 + parser/pkgmgr_parser.c | 3787 ++++++++++++++++++++ parser/pkgmgr_parser.h | 708 ++++ parser/pkgmgr_parser_db.c | 1980 +++++++++++ parser/pkgmgr_parser_db.h | 138 + parser/pkgmgr_parser_internal.h | 59 + parser/preload_list.txt.in | 88 + parser/xml.xsd.in | 5 + parser_path.conf.in | 4 + pkgmgr-info.manifest | 12 + pkgmgr-info.pc.in | 12 + pkgmgr-parser.manifest | 13 + src/pkgmgr-info-internal.c | 210 ++ src/pkgmgr-info.c | 6939 +++++++++++++++++++++++++++++++++++++ 32 files changed, 19218 insertions(+) create mode 100755 CMakeLists.txt create mode 100755 debian/changelog create mode 100755 debian/compat create mode 100755 debian/control create mode 100755 debian/copyright create mode 100755 debian/dirs create mode 100755 debian/pkgmgr-info-dev.install.in create mode 100755 debian/pkgmgr-info.install.in create mode 100755 debian/rules create mode 100755 images/SLP_pkgmgr_info.png create mode 100755 images/SLP_pkgmgr_parser.png create mode 100755 include/SLP_pkgmgr_info_PG.h create mode 100755 include/pkgmgr-info-internal.h create mode 100755 include/pkgmgr-info.h create mode 100755 packaging/pkgmgr-info.spec create mode 100755 parser/CMakeLists.txt create mode 100755 parser/build.sh create mode 100755 parser/manifest.xsd.in create mode 100755 parser/pkgmgr-parser.pc.in create mode 100755 parser/pkgmgr_parser.c create mode 100755 parser/pkgmgr_parser.h create mode 100755 parser/pkgmgr_parser_db.c create mode 100755 parser/pkgmgr_parser_db.h create mode 100755 parser/pkgmgr_parser_internal.h create mode 100755 parser/preload_list.txt.in create mode 100755 parser/xml.xsd.in create mode 100755 parser_path.conf.in create mode 100644 pkgmgr-info.manifest create mode 100755 pkgmgr-info.pc.in create mode 100755 pkgmgr-parser.manifest create mode 100755 src/pkgmgr-info-internal.c create mode 100755 src/pkgmgr-info.c diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100755 index 0000000..7e604a4 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,62 @@ +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(LIBDIR "\${prefix}/lib") +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 glib-2.0 dlog vconf sqlite3 db-util libxml-2.0) + +FOREACH(flag ${pkgs_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + + +pkg_check_modules(libpkgs REQUIRED glib-2.0 dlog vconf sqlite3 db-util libxml-2.0) + +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/pkgmgr-info.c src/pkgmgr-info-internal.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) + +INSTALL(TARGETS pkgmgr-info DESTINATION lib COMPONENT RuntimeLibraries) +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/pkgmgr-info.pc DESTINATION lib/pkgconfig) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/pkgmgr-info.h DESTINATION include) +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/parser_path.conf DESTINATION ${PREFIX}/etc/package-manager/) diff --git a/debian/changelog b/debian/changelog new file mode 100755 index 0000000..ef8ebf6 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,8 @@ +pkgmgr-info (0.2.1) unstable; urgency=low + + * Initial release + * Git: slp/pkgs/a/pkgmgr-info + * Tag: pkgmgr-info_0.2.1 + + -- Jaeho Lee Thu, 24 May 2012 12:04:51 +0530 + diff --git a/debian/compat b/debian/compat new file mode 100755 index 0000000..7ed6ff8 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +5 diff --git a/debian/control b/debian/control new file mode 100755 index 0000000..60bd677 --- /dev/null +++ b/debian/control @@ -0,0 +1,27 @@ +Source: pkgmgr-info +Section: devel +Priority: extra +Maintainer: Garima Shrivastava , Jaeho Lee +Build-Depends: debhelper (>= 5),libssl-dev, libslp-setting-dev, libslp-db-util-dev +Standards-Version: 3.7.2 + +Package: pkgmgr-info +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: + +Package: pkgmgr-info-dev +Architecture: any +Depends: app2sd (= ${Source-Version}) +Description: App2sd dev package + +Package: pkgmgr-info-doc +Architecture: all +Description: + +Package: pkgmgr-info-dbg +Section: debug +Architecture: any +Depends: pkgmgr-info (= ${Source-Version}) +Description: pkgmgr-info dbg package + diff --git a/debian/copyright b/debian/copyright new file mode 100755 index 0000000..37b94ac --- /dev/null +++ b/debian/copyright @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2012 - 2013 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ diff --git a/debian/dirs b/debian/dirs new file mode 100755 index 0000000..ca882bb --- /dev/null +++ b/debian/dirs @@ -0,0 +1,2 @@ +usr/bin +usr/sbin diff --git a/debian/pkgmgr-info-dev.install.in b/debian/pkgmgr-info-dev.install.in new file mode 100755 index 0000000..7920b49 --- /dev/null +++ b/debian/pkgmgr-info-dev.install.in @@ -0,0 +1,2 @@ +@PREFIX@/include/pkgmgr-info.h +@PREFIX@/lib/pkgconfig/*.pc diff --git a/debian/pkgmgr-info.install.in b/debian/pkgmgr-info.install.in new file mode 100755 index 0000000..bf766f0 --- /dev/null +++ b/debian/pkgmgr-info.install.in @@ -0,0 +1 @@ +@PREFIX@/lib/*.so* diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..f902937 --- /dev/null +++ b/debian/rules @@ -0,0 +1,126 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# Sample debian/rules that uses debhelper. +# This file was originally written by Joey Hess and Craig Small. +# As a special exception, when this file is copied by dh-make into a +# dh-make output file, you may use that output file without restriction. +# This special exception was added by Craig Small in version 0.37 of dh-make. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + + +# These are used for cross-compiling and for saving the configure script +# from having to guess our platform (since we know it already) +DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) +DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) +DEB_HOST_ARCH ?= $(shell dpkg-architecture -qDEB_HOST_ARCH) +DEB_HOST_ARCH_OS ?= $(shell dpkg-architecture -qDEB_HOST_GNU_OS) + +CFLAGS ?= -Wall -g +LDFLAGS ?= +PREFIX ?= /usr +DATADIR ?= /opt + +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 +else + CFLAGS += -O2 +endif + +# architecture is not arm +ifneq (, $(findstring arm, $(DEB_HOST_ARCH))) + # do something here +else + # do something here for arm +endif + +CFLAGS += -fvisibility=hidden -fPIC +LDFLAGS += -Wl,--rpath=$(PREFIX)/lib -Wl,--as-needed + +CMAKE_TMP_DIR = $(CURDIR)/cmake_tmp + +config.status: + +configure: configure-stamp + +configure-stamp: + dh_testdir + mkdir -p $(CMAKE_TMP_DIR); + export LD_LIBRARY_PATH=$(LD_LIBRARY_PATH):$(CMAKE_TMP_DIR) && cd $(CMAKE_TMP_DIR); CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" LDFLAGS="$(LDFLAGS)" cmake .. -DCMAKE_INSTALL_PREFIX=$(PREFIX) + touch configure-stamp + +build: build-stamp + +build-stamp: configure-stamp + dh_testdir + # Add here commands to compile the package. + cd $(CMAKE_TMP_DIR) && $(MAKE) all + + for f in `find $(CURDIR)/debian/ -name "*.in"`; do \ + cat $$f > $${f%.in}; \ + sed -i -e "s#@PREFIX@#$(PREFIX)#g" $${f%.in}; \ + sed -i -e "s#@DATADIR@#$(DATADIR)#g" $${f%.in}; \ + done + + touch $@ + +clean: + dh_testdir + dh_testroot + rm -f *-stamp + + rm -rf $(CMAKE_TMP_DIR) + + for f in `find $(CURDIR)/debian/ -name "*.in"`; do \ + rm -f $${f%.in}; \ + done + + dh_clean + +install: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + # Add here commands to install the package into debian/ncurses. + cd $(CMAKE_TMP_DIR) && $(MAKE) DESTDIR=$(CURDIR)/debian/tmp install + +# Build architecture-independent files here. +binary-indep: build install +# We have nothing to do by default. + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir + dh_testroot + dh_installchangelogs +# dh_installdocs + dh_installexamples + dh_install --list-missing --sourcedir=debian/tmp +# dh_installmenu +# dh_installdebconf +# dh_installlogrotate +# dh_installemacsen +# dh_installpam +# dh_installmime +# dh_python +# dh_installinit +# dh_installcron +# dh_installinfo + dh_installman + dh_link + dh_strip --dbg-package=app2sd-dbg + dh_compress + dh_fixperms +# dh_perl + dh_makeshlibs + dh_installdeb + dh_shlibdeps + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install diff --git a/images/SLP_pkgmgr_info.png b/images/SLP_pkgmgr_info.png new file mode 100755 index 0000000000000000000000000000000000000000..604c6e3f459098b6c0224cb6cd624df26741db06 GIT binary patch literal 35822 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 literal 0 HcmV?d00001 diff --git a/images/SLP_pkgmgr_parser.png b/images/SLP_pkgmgr_parser.png new file mode 100755 index 0000000000000000000000000000000000000000..91ae136917c5d0cef8ba9b54a2e7711213541fa2 GIT binary patch literal 32840 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 literal 0 HcmV?d00001 diff --git a/include/SLP_pkgmgr_info_PG.h b/include/SLP_pkgmgr_info_PG.h new file mode 100755 index 0000000..92ff532 --- /dev/null +++ b/include/SLP_pkgmgr_info_PG.h @@ -0,0 +1,301 @@ +/* + * pkgmgr-info + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +/** + + * + * @ingroup SLP_PG + * @defgroup PackageManagerInfoGuide + + +@par Package Manager Information Library Programming Guide + +

Introduction

+

Purpose of this document

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

Scope

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

Architecture

+

Architecture overview

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

Features

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

Package Manager API descriptions

+ SEE API manual + +

Package Manager Features with sample code

+

Get /Set Package Information in DB

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

Filter Package/Application Information

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

Manifest Parser

+ +- Parse the package manifest file and insert the parsed data in manifest DB. + +@code +#include + +static int parse_manifest_file_for_installation(const char *manifest) +{ + int ret = 0; + ret = pkgmgr_parser_parse_manifest_for_installation(manifest, NULL); + if (ret) + return -1; + return 0; +} +@endcode + + +- Parse the package manifest file and update the manifest DB with the parsed data. + +@code +#include + +static int parse_manifest_file_for_upgrade(const char *manifest) +{ + int ret = 0; + ret = pkgmgr_parser_parse_manifest_for_upgrade(manifest, NULL); + if (ret) + return -1; + return 0; +} +@endcode + +- Parse the package manifest file and delete the parsed data from manifest DB. + +@code +#include + +static int parse_manifest_file_for_uninstallation(const char *manifest) +{ + int ret = 0; + ret = pkgmgr_parser_parse_manifest_for_uninstallation(manifest, NULL); + if (ret) + return -1; + return 0; +} +@endcode + + +*/ + +/** +@} +*/ + + diff --git a/include/pkgmgr-info-internal.h b/include/pkgmgr-info-internal.h new file mode 100755 index 0000000..0a18b82 --- /dev/null +++ b/include/pkgmgr-info-internal.h @@ -0,0 +1,113 @@ +/* + * pkgmgr-info + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#ifndef __PKGMGR_INFO_INTERNAL_H__ +#define __PKGMGR_INFO_INTERNAL_H__ + +#include + +#ifndef DEPRECATED +#define DEPRECATED __attribute__ ((__deprecated__)) +#endif + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#define LOG_TAG "PKGMGR_INFO" +#define _LOGE(fmt, arg...) LOGE(fmt, ##arg) +#define _LOGD(fmt, arg...) LOGD(fmt, ##arg) + + +/*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_AUTHOR_NAME, + E_PMINFO_PKGINFO_PROP_PACKAGE_AUTHOR_EMAIL, + E_PMINFO_PKGINFO_PROP_PACKAGE_AUTHOR_HREF, + E_PMINFO_PKGINFO_PROP_PACKAGE_MAX_STR = E_PMINFO_PKGINFO_PROP_PACKAGE_AUTHOR_HREF +} 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_MAX_BOOL = E_PMINFO_PKGINFO_PROP_PACKAGE_READONLY +} 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_MAX_INT = E_PMINFO_PKGINFO_PROP_PACKAGE_SIZE +} 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_EXEC, + 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_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_MAX_BOOL = E_PMINFO_APPINFO_PROP_APP_TASKMANAGE +} 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_MAX_INT = E_PMINFO_APPINFO_PROP_APP_MIN_INT +} pkgmgrinfo_appinfo_filter_prop_int; + +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); + +#endif /* __PKGMGR_INFO_INTERNAL_H__ */ diff --git a/include/pkgmgr-info.h b/include/pkgmgr-info.h new file mode 100755 index 0000000..32c9d7f --- /dev/null +++ b/include/pkgmgr-info.h @@ -0,0 +1,4139 @@ +/* + * pkgmgr-info + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + + + + +/** + * @file pkgmgr-info.h + * @author Sewook Park + * @author Shobhit Srivastava + * @version 0.1 + * @brief This file declares API of pkgmgr-info library + * + * @addtogroup APPLICATION_FRAMEWORK + * @{ + * + * @defgroup PackageManagerInfo + * @section Header Header file to include: + * @code + * #include + * @endcode + * + * @} + */ + +#ifndef __PKG_INFO_H__ +#define __PKG_INFO_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +/** + * @mainpage + * + * This is package information library + * + * Package Information Library is used to get package related information.\n + * It uses the package manifest information database to get any package related information\n + * It also provides API to set information in the package info database\n + * + */ + +/** + * @file pkgmgr-info.h + * @brief Package Information Library Header File + * + * Generated by Sewook Park + */ + + +/** + * @brief A handle to insert certificate information + */ +typedef void* pkgmgrinfo_instcertinfo_h; + +/** + * @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, +} 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 */ +}; + +/** + * @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" + +/** + * @brief Value to be used when filtering based on app-component + */ +#define PMINFO_APPINFO_UI_APP "UI_APP" + +/** + * @brief Value to be used when filtering based on app-component + */ +#define PMINFO_APPINFO_SVC_APP "SVC_APP" + +typedef enum { + PMINFO_HWACCELERATION_NOT_USE_GL = 0, /**< Don't use hardware acceleration*/ + PMINFO_HWACCELERATION_USE_GL = 1, /**< Use hardware acceleration*/ + PMINFO_HWACCELERATION_USE_SYSTEM_SETTING = 2 /**< Follow system setting for hardware acceleration */ +}pkgmgrinfo_app_hwacceleration; + +typedef enum { + PMINFO_RECENTIMAGE_USE_ICON = 0, /** + +cmake_minimum_required(VERSION 2.6) +#set(CMAKE_SKIP_BUILD_RPATH true) +set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true) + + +### Versioning +if(DEFINED ${VERSION}) + message("VERSION: ${VERSION}") +else() + message("VERSION is not defined. set it as 0.1.0") + set(VERSION 0.1.0) +endif() +if(DEFINED ${VERSION_MAJOR}) + message("VERSION_MAJOR: ${VERSION_MAJOR}") +else() + message( "VERSION_MAJOR is not defined. set it as 0") + set(VERSION_MAJOR 0) +endif() +message(STATUS "version/major : ${VERSION} / ${VERSION_MAJOR}") + +### Get required CFLAGS, LDFLAGS from pkg-config + +include(FindPkgConfig) +pkg_check_modules(parser_pkgs REQUIRED dlog libxml-2.0 glib-2.0 sqlite3 db-util vconf) + +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_db.c) +#add_library(pkgmgr_parser SHARED pkgmgr_parser.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(preload_list.txt.in preload_list.txt @ONLY) +configure_file(manifest.xsd.in manifest.xsd @ONLY) +configure_file(xml.xsd.in xml.xsd @ONLY) + +## Install +INSTALL(TARGETS + pkgmgr_parser + DESTINATION lib + COMPONENT RuntimeLibraries) +INSTALL(FILES + pkgmgr_parser.h + DESTINATION include/pkgmgr) + +INSTALL(FILES + ${CMAKE_CURRENT_BINARY_DIR}/pkgmgr-parser.pc + DESTINATION lib/pkgconfig) + +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/preload_list.txt DESTINATION ${PREFIX}/etc/package-manager/preload/) +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/) diff --git a/parser/build.sh b/parser/build.sh new file mode 100755 index 0000000..8cb600c --- /dev/null +++ b/parser/build.sh @@ -0,0 +1,30 @@ + +#export CFLAGS="" +#export LDFLAGS="" + +cd `dirname $0` + +PREFIX=/usr + +rm -rf cmake_tmp +mkdir -p cmake_tmp +cd cmake_tmp + +CFLAGS="${CFLAGS}" LDFLAGS="${LDFLAGS}" cmake .. -DCMAKE_INSTALL_PREFIX=${PREFIX} && +make && + +# test +{ + export LD_LIBRARY_PATH=`pwd` + cd test +# ./test_comm_client & +# ./test_comm_status_broadcast_server +# ./test_comm_socket && + ./test_pkgmgr_installer +} +if [ "$?" == "0" ]; then + echo "Test done." +else + echo "Test failed!" +fi + diff --git a/parser/manifest.xsd.in b/parser/manifest.xsd.in new file mode 100755 index 0000000..10867d5 --- /dev/null +++ b/parser/manifest.xsd.in @@ -0,0 +1,241 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/parser/pkgmgr-parser.pc.in b/parser/pkgmgr-parser.pc.in new file mode 100755 index 0000000..71947db --- /dev/null +++ b/parser/pkgmgr-parser.pc.in @@ -0,0 +1,16 @@ +# +# Copyright (c) 2008 ~ 2010 Samsung Electronics Co., Ltd. +# All rights reserved. +# + +prefix=@PREFIX@ +exec_prefix=@EXEC_PREFIX@ +libdir=@LIBDIR@ +includedir=@INCLUDEDIR@ + +Name: package manager parser library +Description: SLP package manager's installer lib for each backends +Version: @VERSION@ +Requires: libxml-2.0 +Libs: -L${libdir} -lpkgmgr_parser +Cflags: -I${includedir}/pkgmgr diff --git a/parser/pkgmgr_parser.c b/parser/pkgmgr_parser.c new file mode 100755 index 0000000..fe24731 --- /dev/null +++ b/parser/pkgmgr_parser.c @@ -0,0 +1,3787 @@ +/* + * pkgmgr-info + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include + + +#include "pkgmgr_parser.h" +#include "pkgmgr_parser_internal.h" +#include "pkgmgr_parser_db.h" +#include "pkgmgr-info.h" + +#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 + +/* operation_type */ +typedef enum { + ACTION_INSTALL = 0, + ACTION_UPGRADE, + ACTION_UNINSTALL, + ACTION_MAX +} ACTION_TYPE; + +char *package; + +static int __ps_process_label(xmlTextReaderPtr reader, label_x *label); +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_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_registry(xmlTextReaderPtr reader, registry_x *registry); +static int __ps_process_database(xmlTextReaderPtr reader, database_x *database); +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_layout(xmlTextReaderPtr reader, layout_x *layout); +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_appcontrol(xmlTextReaderPtr reader, appcontrol_x *appcontrol); +static int __ps_process_datacontrol(xmlTextReaderPtr reader, datacontrol_x *datacontrol); +static int __ps_process_uiapplication(xmlTextReaderPtr reader, uiapplication_x *uiapplication); +static int __ps_process_serviceapplication(xmlTextReaderPtr reader, serviceapplication_x *serviceapplication); +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 void __ps_free_label(label_x *label); +static void __ps_free_deviceprofile(deviceprofile_x * deviceprofile); +static void __ps_free_allowed(allowed_x *allowed); +static void __ps_free_operation(operation_x *operation); +static void __ps_free_uri(uri_x *uri); +static void __ps_free_mime(mime_x *mime); +static void __ps_free_subapp(subapp_x *subapp); +static void __ps_free_condition(condition_x *condition); +static void __ps_free_notification(notification_x *notifiation); +static void __ps_free_category(category_x *category); +static void __ps_free_compatibility(compatibility_x *compatibility); +static void __ps_free_resolution(resolution_x *resolution); +static void __ps_free_request(request_x *request); +static void __ps_free_define(define_x *define); +static void __ps_free_registry(registry_x *registry); +static void __ps_free_database(database_x *database); +static void __ps_free_appsvc(appsvc_x *appsvc); +static void __ps_free_launchconditions(launchconditions_x *launchconditions); +static void __ps_free_datashare(datashare_x *datashare); +static void __ps_free_layout(layout_x *layout); +static void __ps_free_icon(icon_x *icon); +static void __ps_free_author(author_x *author); +static void __ps_free_description(description_x *description); +static void __ps_free_capability(capability_x *capability); +static void __ps_free_license(license_x *license); +static void __ps_free_appcontrol(appcontrol_x *appcontrol); +static void __ps_free_datacontrol(datacontrol_x *datacontrol); +static void __ps_free_uiapplication(uiapplication_x *uiapplication); +static void __ps_free_serviceapplication(serviceapplication_x *serviceapplication); +static void __ps_free_font(font_x *font); +static void __ps_free_theme(theme_x *theme); +static void __ps_free_daemon(daemon_x *daemon); +static void __ps_free_ime(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 __str_trim(char *input); +static char *__get_parser_plugin(const char *type); +static int __ps_run_parser(xmlDocPtr docPtr, const char *tag, ACTION_TYPE action, const char *pkgid); +static int __run_parser_prestep(xmlTextReaderPtr reader, ACTION_TYPE action, const char *pkgid); +static void __processNode(xmlTextReaderPtr reader, ACTION_TYPE action, char *const tagv[], const char *pkgid); +static void __streamFile(const char *filename, ACTION_TYPE action, char *const tagv[], const char *pkgid); +static int __validate_appid(const char *pkgid, const char *appid, char **newappid); + +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 int __validate_appid(const char *pkgid, const char *appid, char **newappid) +{ + if (!pkgid || !appid || !newappid) { + DBG("Arg supplied is NULL\n"); + return -1; + } + int pkglen = strlen(pkgid); + int applen = strlen(appid); + char *ptr = NULL; + char *newapp = NULL; + int len = 0; + if (strncmp(appid, ".", 1) == 0) { + len = pkglen + applen + 1; + newapp = calloc(1,len); + if (newapp == NULL) { + DBG("Malloc failed\n"); + return -1; + } + strncpy(newapp, pkgid, pkglen); + strncat(newapp, appid, applen); + DBG("new appid is %s\n", newapp); + *newappid = newapp; + return 0; + } + if (applen < pkglen) { + DBG("app id is not proper\n"); + *newappid = NULL; +#ifdef _VALIDATE_APPID_ + return -1; +#else + return 0; +#endif + } + if (!strcmp(appid, pkgid)) { + DBG("appid is proper\n"); + *newappid = NULL; + return 0; + } + else if (strncmp(appid, pkgid, pkglen) == 0) { + ptr = strstr(appid, pkgid); + ptr = ptr + pkglen; + if (strncmp(ptr, ".", 1) == 0) { + DBG("appid is proper\n"); + *newappid = NULL; + return 0; + } + else { + DBG("appid is not proper\n"); + *newappid = NULL; +#ifdef _VALIDATE_APPID_ + return -1; +#else + return 0; +#endif + } + } else { + DBG("appid is not proper\n"); + *newappid = NULL; +#ifdef _VALIDATE_APPID_ + return -1; +#else + return 0; +#endif + } + return 0; +} + + +static char *__get_parser_plugin(const char *type) +{ + FILE *fp = NULL; + char buffer[1024] = { 0 }; + char temp_path[1024] = { 0 }; + char *lib_path = NULL; + char *path = NULL; + + if (type == NULL) { + DBGE("invalid argument\n"); + return NULL; + } + + fp = fopen(PKG_PARSER_CONF_PATH, "r"); + if (fp == NULL) { + DBGE("no matching backendlib\n"); + return NULL; + } + + while (fgets(buffer, sizeof(buffer), fp) != NULL) { + if (buffer[0] == '#') + continue; + + __str_trim(buffer); + + if ((path = strstr(buffer, PKG_PARSERLIB)) != NULL) { + DBG("[%s]\n", path); + path = path + strlen(PKG_PARSERLIB); + DBG("[%s]\n", path); + + break; + } + + memset(buffer, 0x00, 1024); + } + + if (fp != NULL) + fclose(fp); + + if (path == NULL) { + DBGE("no matching backendlib\n"); + return NULL; + } + + snprintf(temp_path, sizeof(temp_path) - 1, "%slib%s.so", path, type); + + return strdup(temp_path); +} + +static 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; + + 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(tag); + if (!lib_path) { + goto END; + } + + if ((lib_handle = dlopen(lib_path, RTLD_LAZY)) == NULL) { + DBGE("dlopen is failed lib_path[%s]\n", lib_path); + goto END; + } + + if ((plugin_install = + dlsym(lib_handle, ac)) == NULL || dlerror() != NULL) { + DBGE("can not find symbol \n"); + goto END; + } + + ret = plugin_install(docPtr, pkgid); + + END: + if (lib_path) + free(lib_path); + if (lib_handle) + dlclose(lib_handle); + return ret; +} + +static char *__pkgid_to_manifest(const char *pkgid) +{ + char *manifest; + int size; + + if (pkgid == NULL) { + DBGE("pkgid is NULL"); + return NULL; + } + + size = strlen(MANIFEST_RW_DIRECTORY) + strlen(pkgid) + 10; + manifest = malloc(size); + if (manifest == NULL) { + DBGE("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 __run_parser_prestep(xmlTextReaderPtr reader, ACTION_TYPE action, const char *pkgid) +{ + int nLoop = 0; + int pid = 0; + char *parser_cmd = NULL; + int ret = -1; + const xmlChar *name; + char *lib_path = NULL; + void *lib_handle = NULL; + int (*plugin_install) (xmlDocPtr); + + DBG("__run_parser_prestep"); + + if (xmlTextReaderDepth(reader) != 1) { + DBGE("Node depth is not 1"); + goto END; + } + + if (xmlTextReaderNodeType(reader) != 1) { + DBGE("Node type is not 1"); + goto END; + } + + const xmlChar *value; + name = xmlTextReaderConstName(reader); + if (name == NULL) { + DBGE("TEST TEST TES\n"); + name = BAD_CAST "--"; + } + + value = xmlTextReaderConstValue(reader); + DBG("%d %d %s %d %d", + xmlTextReaderDepth(reader), + xmlTextReaderNodeType(reader), + name, + xmlTextReaderIsEmptyElement(reader), xmlTextReaderHasValue(reader)); + + if (value == NULL) { + DBG("ConstValue NULL"); + } else { + if (xmlStrlen(value) > 40) { + DBG(" %.40s...", value); + } else { + DBG(" %s", value); + } + } + + name = xmlTextReaderConstName(reader); + if (name == NULL) { + DBGE("TEST TEST TES\n"); + name = BAD_CAST "--"; + } + + xmlDocPtr docPtr = xmlTextReaderCurrentDoc(reader); + DBG("docPtr->URL %s\n", (char *)docPtr->URL); + 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(temp->name, 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); + } + +#ifdef __DEBUG__ + +//#else + DBG("node type: %d, name: %s children->name: %s last->name: %s\n" + "parent->name: %s next->name: %s prev->name: %s\n", + cur_node->type, cur_node->name, + cur_node->children ? cur_node->children->name : "NULL", + cur_node->last ? cur_node->last->name : "NULL", + cur_node->parent ? cur_node->parent->name : "NULL", + cur_node->next ? cur_node->next->name : "NULL", + cur_node->prev ? cur_node->prev->name : "NULL"); + + FILE *fp = fopen("/opt/share/test.xml", "a"); + xmlDocDump(fp, copyDocPtr); + fprintf(fp, "\n"); + fclose(fp); +#endif + + ret = __ps_run_parser(copyDocPtr, name, action, pkgid); + END: + + return ret; +} + +static void +__processNode(xmlTextReaderPtr reader, ACTION_TYPE action, char *const tagv[], const char *pkgid) +{ + char *tag = NULL; + int i = 0; + + switch (xmlTextReaderNodeType(reader)) { + case XML_READER_TYPE_END_ELEMENT: + { + // DBG("XML_READER_TYPE_END_ELEMENT"); + break; + } + + case XML_READER_TYPE_ELEMENT: + { + // Elements without closing tag don't receive + // XML_READER_TYPE_END_ELEMENT event. + + const xmlChar *elementName = + xmlTextReaderLocalName(reader); + if (elementName == NULL) { +// DBG("elementName %s\n", (char *)elementName); + break; + } + + const xmlChar *nameSpace = + xmlTextReaderConstNamespaceUri(reader); + if (nameSpace) { +// DBG("nameSpace %s\n", (char *)nameSpace); + } +/* + DBG("XML_READER_TYPE_ELEMENT %s, %s\n", + elementName ? elementName : "NULL", + nameSpace ? nameSpace : "NULL"); +*/ + if (tagv == NULL) { + DBG("__run_parser_prestep pkgid[%s]\n", pkgid); + __run_parser_prestep(reader, action, pkgid); + } + else { + i = 0; + for (tag = tagv[0]; tag; tag = tagv[++i]) + if (strcmp(tag, elementName) == 0) { + DBG("__run_parser_prestep tag[%s] pkgid[%s]\n", tag, pkgid); + __run_parser_prestep(reader, + action, pkgid); + break; + } + } + + break; + } + case XML_READER_TYPE_TEXT: + case XML_READER_TYPE_CDATA: + { + const xmlChar *value = xmlTextReaderConstValue(reader); + if (value) { +// DBG("value %s\n", value); + } + + const xmlChar *lang = xmlTextReaderConstXmlLang(reader); + if (lang) { +// DBG("lang\n", lang); + } + +/* DBG("XML_READER_TYPE_TEXT %s, %s\n", + value ? value : "NULL", lang ? lang : "NULL"); +*/ + break; + } + default: +// DBG("Ignoring Node of Type: %d", xmlTextReaderNodeType(reader)); + break; + } +} + +static void +__streamFile(const char *filename, ACTION_TYPE action, char *const tagv[], const char *pkgid) +{ + xmlTextReaderPtr reader; + xmlDocPtr docPtr; + int ret; + + docPtr = xmlReadFile(filename, NULL, 0); + reader = xmlReaderWalker(docPtr); + if (reader != NULL) { + ret = xmlTextReaderRead(reader); + while (ret == 1) { + __processNode(reader, action, tagv, pkgid); + ret = xmlTextReaderRead(reader); + } + xmlFreeTextReader(reader); + + if (ret != 0) { + DBGE("%s : failed to parse", filename); + } + } else { + DBGE("Unable to open %s", filename); + } +} + +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 void __ps_free_category(category_x *category) +{ + if (category == NULL) + return; + if (category->name) { + free((void *)category->name); + category->name = NULL; + } + free((void*)category); + category = NULL; +} + +static void __ps_free_icon(icon_x *icon) +{ + if (icon == NULL) + return; + if (icon->text) { + free((void *)icon->text); + icon->text = NULL; + } + if (icon->lang) { + free((void *)icon->lang); + icon->lang = NULL; + } + if (icon->name) { + free((void *)icon->name); + icon->name= NULL; + } + if (icon->section) { + free((void *)icon->section); + icon->section = NULL; + } + if (icon->size) { + free((void *)icon->size); + icon->size = NULL; + } + if (icon->resolution) { + free((void *)icon->resolution); + icon->resolution = NULL; + } + free((void*)icon); + icon = NULL; +} + +static void __ps_free_operation(operation_x *operation) +{ + if (operation == NULL) + return; + if (operation->text) { + free((void *)operation->text); + operation->text = NULL; + } + free((void*)operation); + operation = NULL; +} + +static void __ps_free_uri(uri_x *uri) +{ + if (uri == NULL) + return; + if (uri->text) { + free((void *)uri->text); + uri->text = NULL; + } + free((void*)uri); + uri = NULL; +} + +static void __ps_free_mime(mime_x *mime) +{ + if (mime == NULL) + return; + if (mime->text) { + free((void *)mime->text); + mime->text = NULL; + } + free((void*)mime); + mime = NULL; +} + +static void __ps_free_subapp(subapp_x *subapp) +{ + if (subapp == NULL) + return; + if (subapp->text) { + free((void *)subapp->text); + subapp->text = NULL; + } + free((void*)subapp); + subapp = NULL; +} + +static void __ps_free_condition(condition_x *condition) +{ + if (condition == NULL) + return; + if (condition->text) { + free((void *)condition->text); + condition->text = NULL; + } + if (condition->name) { + free((void *)condition->name); + condition->name = NULL; + } + free((void*)condition); + condition = NULL; +} + +static void __ps_free_notification(notification_x *notification) +{ + if (notification == NULL) + return; + if (notification->text) { + free((void *)notification->text); + notification->text = NULL; + } + if (notification->name) { + free((void *)notification->name); + notification->name = NULL; + } + free((void*)notification); + notification = NULL; +} + +static void __ps_free_compatibility(compatibility_x *compatibility) +{ + if (compatibility == NULL) + return; + if (compatibility->text) { + free((void *)compatibility->text); + compatibility->text = NULL; + } + if (compatibility->name) { + free((void *)compatibility->name); + compatibility->name = NULL; + } + free((void*)compatibility); + compatibility = NULL; +} + +static void __ps_free_resolution(resolution_x *resolution) +{ + if (resolution == NULL) + return; + if (resolution->mimetype) { + free((void *)resolution->mimetype); + resolution->mimetype = NULL; + } + if (resolution->urischeme) { + free((void *)resolution->urischeme); + resolution->urischeme = NULL; + } + free((void*)resolution); + resolution = NULL; +} + +static void __ps_free_capability(capability_x *capability) +{ + if (capability == NULL) + return; + if (capability->operationid) { + free((void *)capability->operationid); + capability->operationid = NULL; + } + /*Free Resolution*/ + if (capability->resolution) { + resolution_x *resolution = capability->resolution; + resolution_x *tmp = NULL; + while(resolution != NULL) + { + tmp = resolution->next; + __ps_free_resolution(resolution); + resolution = tmp; + } + } + free((void*)capability); + capability = NULL; +} + +static void __ps_free_allowed(allowed_x *allowed) +{ + if (allowed == NULL) + return; + if (allowed->name) { + free((void *)allowed->name); + allowed->name = NULL; + } + if (allowed->text) { + free((void *)allowed->text); + allowed->text = NULL; + } + free((void*)allowed); + allowed = NULL; +} + +static void __ps_free_request(request_x *request) +{ + if (request == NULL) + return; + if (request->text) { + free((void *)request->text); + request->text = NULL; + } + free((void*)request); + request = NULL; +} + +static void __ps_free_datacontrol(datacontrol_x *datacontrol) +{ + if (datacontrol == NULL) + return; + if (datacontrol->providerid) { + free((void *)datacontrol->providerid); + datacontrol->providerid = NULL; + } + /*Free Capability*/ + if (datacontrol->capability) { + capability_x *capability = datacontrol->capability; + capability_x *tmp = NULL; + while(capability != NULL) + { + tmp = capability->next; + __ps_free_capability(capability); + capability = tmp; + } + } + free((void*)datacontrol); + datacontrol = NULL; +} + +static void __ps_free_launchconditions(launchconditions_x *launchconditions) +{ + if (launchconditions == NULL) + return; + if (launchconditions->text) { + free((void *)launchconditions->text); + launchconditions->text = NULL; + } + /*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((void*)launchconditions); + launchconditions = NULL; +} + +static void __ps_free_appcontrol(appcontrol_x *appcontrol) +{ + if (appcontrol == NULL) + return; + if (appcontrol->text) { + free((void *)appcontrol->text); + appcontrol->text = NULL; + } + /*Free Operation*/ + if (appcontrol->operation) { + operation_x *operation = appcontrol->operation; + operation_x *tmp = NULL; + while(operation != NULL) + { + tmp = operation->next; + __ps_free_operation(operation); + operation = tmp; + } + } + /*Free Uri*/ + if (appcontrol->uri) { + uri_x *uri = appcontrol->uri; + uri_x *tmp = NULL; + while(uri != NULL) + { + tmp = uri->next; + __ps_free_uri(uri); + uri = tmp; + } + } + /*Free Mime*/ + if (appcontrol->mime) { + mime_x *mime = appcontrol->mime; + mime_x *tmp = NULL; + while(mime != NULL) + { + tmp = mime->next; + __ps_free_mime(mime); + mime = tmp; + } + } + /*Free subapp*/ + if (appcontrol->subapp) { + subapp_x *subapp = appcontrol->subapp; + subapp_x *tmp = NULL; + while(subapp != NULL) + { + tmp = subapp->next; + __ps_free_subapp(subapp); + subapp = tmp; + } + } + free((void*)appcontrol); + appcontrol = NULL; +} + +static void __ps_free_appsvc(appsvc_x *appsvc) +{ + if (appsvc == NULL) + return; + if (appsvc->text) { + free((void *)appsvc->text); + appsvc->text = NULL; + } + /*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((void*)appsvc); + appsvc = NULL; +} + +static void __ps_free_deviceprofile(deviceprofile_x *deviceprofile) +{ + return; +} + +static void __ps_free_define(define_x *define) +{ + if (define == NULL) + return; + if (define->path) { + free((void *)define->path); + define->path = NULL; + } + /*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((void*)define); + define = NULL; +} + +static void __ps_free_registry(registry_x *registry) +{ + if (registry == NULL) + return; + if (registry->name) { + free((void *)registry->name); + registry->name = NULL; + } + if (registry->text) { + free((void *)registry->text); + registry->text = NULL; + } + free((void*)registry); + registry = NULL; +} + +static void __ps_free_database(database_x *database) +{ + if (database == NULL) + return; + if (database->name) { + free((void *)database->name); + database->name = NULL; + } + if (database->text) { + free((void *)database->text); + database->text = NULL; + } + free((void*)database); + database = NULL; +} + +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((void*)datashare); + datashare = NULL; +} + +static void __ps_free_layout(layout_x *layout) +{ + if (layout == NULL) + return; + if (layout->name) { + free((void *)layout->name); + layout->name = NULL; + } + if (layout->text) { + free((void *)layout->text); + layout->text = NULL; + } + free((void*)layout); + layout = NULL; +} + +static void __ps_free_label(label_x *label) +{ + if (label == NULL) + return; + if (label->name) { + free((void *)label->name); + label->name = NULL; + } + if (label->text) { + free((void *)label->text); + label->text = NULL; + } + if (label->lang) { + free((void *)label->lang); + label->lang= NULL; + } + free((void*)label); + label = NULL; +} + +static void __ps_free_author(author_x *author) +{ + if (author == NULL) + return; + if (author->email) { + free((void *)author->email); + author->email = NULL; + } + if (author->text) { + free((void *)author->text); + author->text = NULL; + } + if (author->href) { + free((void *)author->href); + author->href = NULL; + } + if (author->lang) { + free((void *)author->lang); + author->lang = NULL; + } + free((void*)author); + author = NULL; +} + +static void __ps_free_description(description_x *description) +{ + if (description == NULL) + return; + if (description->name) { + free((void *)description->name); + description->name = NULL; + } + if (description->text) { + free((void *)description->text); + description->text = NULL; + } + if (description->lang) { + free((void *)description->lang); + description->lang = NULL; + } + free((void*)description); + description = NULL; +} + +static void __ps_free_license(license_x *license) +{ + if (license == NULL) + return; + if (license->text) { + free((void *)license->text); + license->text = NULL; + } + if (license->lang) { + free((void *)license->lang); + license->lang = NULL; + } + free((void*)license); + license = NULL; +} + +static void __ps_free_uiapplication(uiapplication_x *uiapplication) +{ + if (uiapplication == NULL) + return; + if (uiapplication->exec) { + free((void *)uiapplication->exec); + uiapplication->exec = NULL; + } + if (uiapplication->appid) { + free((void *)uiapplication->appid); + uiapplication->appid = NULL; + } + if (uiapplication->nodisplay) { + free((void *)uiapplication->nodisplay); + uiapplication->nodisplay = NULL; + } + if (uiapplication->multiple) { + free((void *)uiapplication->multiple); + uiapplication->multiple = NULL; + } + if (uiapplication->type) { + free((void *)uiapplication->type); + uiapplication->type = NULL; + } + if (uiapplication->categories) { + free((void *)uiapplication->categories); + uiapplication->categories = NULL; + } + if (uiapplication->extraid) { + free((void *)uiapplication->extraid); + uiapplication->extraid = NULL; + } + if (uiapplication->taskmanage) { + free((void *)uiapplication->taskmanage); + uiapplication->taskmanage = NULL; + } + if (uiapplication->hwacceleration) { + free((void *)uiapplication->hwacceleration); + uiapplication->hwacceleration = NULL; + } + if (uiapplication->mainapp) { + free((void *)uiapplication->mainapp); + uiapplication->mainapp = NULL; + } + if (uiapplication->recentimage) { + free((void *)uiapplication->recentimage); + uiapplication->recentimage = NULL; + } + /*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 AppControl*/ + if (uiapplication->appcontrol) { + appcontrol_x *appcontrol = uiapplication->appcontrol; + appcontrol_x *tmp = NULL; + while(appcontrol != NULL) + { + tmp = appcontrol->next; + __ps_free_appcontrol(appcontrol); + appcontrol = 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((void*)uiapplication); + uiapplication = NULL; +} + +static void __ps_free_serviceapplication(serviceapplication_x *serviceapplication) +{ + if (serviceapplication == NULL) + return; + if (serviceapplication->exec) { + free((void *)serviceapplication->exec); + serviceapplication->exec = NULL; + } + if (serviceapplication->appid) { + free((void *)serviceapplication->appid); + serviceapplication->appid = NULL; + } + if (serviceapplication->onboot) { + free((void *)serviceapplication->onboot); + serviceapplication->onboot = NULL; + } + if (serviceapplication->autorestart) { + free((void *)serviceapplication->autorestart); + serviceapplication->autorestart = NULL; + } + if (serviceapplication->type) { + free((void *)serviceapplication->type); + serviceapplication->type = NULL; + } + /*Free Label*/ + if (serviceapplication->label) { + label_x *label = serviceapplication->label; + label_x *tmp = NULL; + while(label != NULL) + { + tmp = label->next; + __ps_free_label(label); + label = tmp; + } + } + /*Free Icon*/ + if (serviceapplication->icon) { + icon_x *icon = serviceapplication->icon; + icon_x *tmp = NULL; + while(icon != NULL) + { + tmp = icon->next; + __ps_free_icon(icon); + icon = tmp; + } + } + /*Free AppControl*/ + if (serviceapplication->appcontrol) { + appcontrol_x *appcontrol = serviceapplication->appcontrol; + appcontrol_x *tmp = NULL; + while(appcontrol != NULL) + { + tmp = appcontrol->next; + __ps_free_appcontrol(appcontrol); + appcontrol = tmp; + } + } + /*Free DataControl*/ + if (serviceapplication->datacontrol) { + datacontrol_x *datacontrol = serviceapplication->datacontrol; + datacontrol_x *tmp = NULL; + while(datacontrol != NULL) + { + tmp = datacontrol->next; + __ps_free_datacontrol(datacontrol); + datacontrol = tmp; + } + } + /*Free LaunchConditions*/ + if (serviceapplication->launchconditions) { + launchconditions_x *launchconditions = serviceapplication->launchconditions; + launchconditions_x *tmp = NULL; + while(launchconditions != NULL) + { + tmp = launchconditions->next; + __ps_free_launchconditions(launchconditions); + launchconditions = tmp; + } + } + /*Free Notification*/ + if (serviceapplication->notification) { + notification_x *notification = serviceapplication->notification; + notification_x *tmp = NULL; + while(notification != NULL) + { + tmp = notification->next; + __ps_free_notification(notification); + notification = tmp; + } + } + /*Free DataShare*/ + if (serviceapplication->datashare) { + datashare_x *datashare = serviceapplication->datashare; + datashare_x *tmp = NULL; + while(datashare != NULL) + { + tmp = datashare->next; + __ps_free_datashare(datashare); + datashare = tmp; + } + } + /*Free AppSvc*/ + if (serviceapplication->appsvc) { + appsvc_x *appsvc = serviceapplication->appsvc; + appsvc_x *tmp = NULL; + while(appsvc != NULL) + { + tmp = appsvc->next; + __ps_free_appsvc(appsvc); + appsvc = tmp; + } + } + /*Free Category*/ + if (serviceapplication->category) { + category_x *category = serviceapplication->category; + category_x *tmp = NULL; + while(category != NULL) + { + tmp = category->next; + __ps_free_category(category); + category = tmp; + } + } + free((void*)serviceapplication); + serviceapplication = NULL; +} + +static void __ps_free_font(font_x *font) +{ + if (font == NULL) + return; + if (font->name) { + free((void *)font->name); + font->name = NULL; + } + if (font->text) { + free((void *)font->text); + font->text = NULL; + } + free((void*)font); + font = NULL; +} + +static void __ps_free_theme(theme_x *theme) +{ + if (theme == NULL) + return; + if (theme->name) { + free((void *)theme->name); + theme->name = NULL; + } + if (theme->text) { + free((void *)theme->text); + theme->text = NULL; + } + free((void*)theme); + theme = NULL; +} + +static void __ps_free_daemon(daemon_x *daemon) +{ + if (daemon == NULL) + return; + if (daemon->name) { + free((void *)daemon->name); + daemon->name = NULL; + } + if (daemon->text) { + free((void *)daemon->text); + daemon->text = NULL; + } + free((void*)daemon); + daemon = NULL; +} + +static void __ps_free_ime(ime_x *ime) +{ + if (ime == NULL) + return; + if (ime->name) { + free((void *)ime->name); + ime->name = NULL; + } + if (ime->text) { + free((void *)ime->text); + ime->text = NULL; + } + free((void*)ime); + ime = NULL; +} + + +static int __ps_process_allowed(xmlTextReaderPtr reader, allowed_x *allowed) +{ + xmlTextReaderRead(reader); + if (xmlTextReaderValue(reader)) + allowed->text = ASCII(xmlTextReaderValue(reader)); + return 0; +} + +static int __ps_process_operation(xmlTextReaderPtr reader, operation_x *operation) +{ + if (xmlTextReaderGetAttribute(reader, XMLCHAR("name"))) + operation->name = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("name"))); +/* 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) +{ + if (xmlTextReaderGetAttribute(reader, XMLCHAR("name"))) + uri->name = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("name"))); +/* 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) +{ + if (xmlTextReaderGetAttribute(reader, XMLCHAR("name"))) + mime->name = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("name"))); +/* 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) +{ + if (xmlTextReaderGetAttribute(reader, XMLCHAR("name"))) + subapp->name = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("name"))); +/* 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) +{ + if (xmlTextReaderGetAttribute(reader, XMLCHAR("name"))) + condition->name = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("name"))); + xmlTextReaderRead(reader); + if (xmlTextReaderValue(reader)) + condition->text = ASCII(xmlTextReaderValue(reader)); + return 0; +} + +static int __ps_process_notification(xmlTextReaderPtr reader, notification_x *notification) +{ + if (xmlTextReaderGetAttribute(reader, XMLCHAR("name"))) + notification->name = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("name"))); + xmlTextReaderRead(reader); + if (xmlTextReaderValue(reader)) + notification->text = ASCII(xmlTextReaderValue(reader)); + return 0; +} + +static int __ps_process_category(xmlTextReaderPtr reader, category_x *category) +{ + if (xmlTextReaderGetAttribute(reader, XMLCHAR("name"))) + category->name = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("name"))); + return 0; +} + +static int __ps_process_compatibility(xmlTextReaderPtr reader, compatibility_x *compatibility) +{ + if (xmlTextReaderGetAttribute(reader, XMLCHAR("name"))) + compatibility->name = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("name"))); + xmlTextReaderRead(reader); + if (xmlTextReaderValue(reader)) + compatibility->text = ASCII(xmlTextReaderValue(reader)); + return 0; +} + +static int __ps_process_resolution(xmlTextReaderPtr reader, resolution_x *resolution) +{ + if (xmlTextReaderGetAttribute(reader, XMLCHAR("mime-type"))) + resolution->mimetype = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("mime-type"))); + if (xmlTextReaderGetAttribute(reader, XMLCHAR("uri-scheme"))) + resolution->urischeme = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("uri-scheme"))); + return 0; +} + +static int __ps_process_request(xmlTextReaderPtr reader, request_x *request) +{ + xmlTextReaderRead(reader); + if (xmlTextReaderValue(reader)) + request->text = ASCII(xmlTextReaderValue(reader)); + 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; + + if (xmlTextReaderGetAttribute(reader, XMLCHAR("path"))) + define->path = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("path"))); + + depth = xmlTextReaderDepth(reader); + while ((ret = __next_child_element(reader, depth))) { + node = xmlTextReaderConstName(reader); + if (!node) { + DBG("xmlTextReaderConstName value is NULL\n"); + return -1; + } + + if (!strcmp(ASCII(node), "allowed")) { + allowed_x *allowed= malloc(sizeof(allowed_x)); + if (allowed == NULL) { + DBG("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) { + DBG("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) { + DBG("Processing define failed\n"); + return ret; + } + } + if (define->allowed) { + LISTHEAD(define->allowed, tmp1); + define->allowed = tmp1; + } + if (define->request) { + LISTHEAD(define->request, tmp2); + define->request = tmp2; + } + return ret; +} + +static int __ps_process_registry(xmlTextReaderPtr reader, registry_x *registry) +{ + /*TODO: once policy is set*/ + return 0; +} + +static int __ps_process_database(xmlTextReaderPtr reader, database_x *database) +{ + /*TODO: once policy is set*/ + return 0; +} + +static int __ps_process_appcontrol(xmlTextReaderPtr reader, appcontrol_x *appcontrol) +{ + 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) { + DBG("xmlTextReaderConstName value is NULL\n"); + return -1; + } + + if (!strcmp(ASCII(node), "operation")) { + operation_x *operation = malloc(sizeof(operation_x)); + if (operation == NULL) { + DBG("Malloc Failed\n"); + return -1; + } + memset(operation, '\0', sizeof(operation_x)); + LISTADD(appcontrol->operation, operation); + ret = __ps_process_operation(reader, operation); + DBG("operation processing\n"); + } else if (!strcmp(ASCII(node), "uri")) { + uri_x *uri= malloc(sizeof(uri_x)); + if (uri == NULL) { + DBG("Malloc Failed\n"); + return -1; + } + memset(uri, '\0', sizeof(uri_x)); + LISTADD(appcontrol->uri, uri); + ret = __ps_process_uri(reader, uri); + DBG("uri processing\n"); + } else if (!strcmp(ASCII(node), "mime")) { + mime_x *mime = malloc(sizeof(mime_x)); + if (mime == NULL) { + DBG("Malloc Failed\n"); + return -1; + } + memset(mime, '\0', sizeof(mime_x)); + LISTADD(appcontrol->mime, mime); + ret = __ps_process_mime(reader, mime); + DBG("mime processing\n"); + } else if (!strcmp(ASCII(node), "subapp")) { + subapp_x *subapp = malloc(sizeof(subapp_x)); + if (subapp == NULL) { + DBG("Malloc Failed\n"); + return -1; + } + memset(subapp, '\0', sizeof(subapp_x)); + LISTADD(appcontrol->subapp, subapp); + ret = __ps_process_subapp(reader, subapp); + DBG("subapp processing\n"); + } else + return -1; + if (ret < 0) { + DBG("Processing appcontrol failed\n"); + return ret; + } + } + if (appcontrol->operation) { + LISTHEAD(appcontrol->operation, tmp1); + appcontrol->operation = tmp1; + } + if (appcontrol->uri) { + LISTHEAD(appcontrol->uri, tmp2); + appcontrol->uri = tmp2; + } + if (appcontrol->mime) { + LISTHEAD(appcontrol->mime, tmp3); + appcontrol->mime = tmp3; + } + if (appcontrol->subapp) { + LISTHEAD(appcontrol->subapp, tmp4); + appcontrol->subapp = tmp4; + } + + xmlTextReaderRead(reader); + if (xmlTextReaderValue(reader)) + appcontrol->text = ASCII(xmlTextReaderValue(reader)); + + 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) { + DBG("xmlTextReaderConstName value is NULL\n"); + return -1; + } + + if (!strcmp(ASCII(node), "operation")) { + operation_x *operation = malloc(sizeof(operation_x)); + if (operation == NULL) { + DBG("Malloc Failed\n"); + return -1; + } + memset(operation, '\0', sizeof(operation_x)); + LISTADD(appsvc->operation, operation); + ret = __ps_process_operation(reader, operation); + DBG("operation processing\n"); + } else if (!strcmp(ASCII(node), "uri")) { + uri_x *uri= malloc(sizeof(uri_x)); + if (uri == NULL) { + DBG("Malloc Failed\n"); + return -1; + } + memset(uri, '\0', sizeof(uri_x)); + LISTADD(appsvc->uri, uri); + ret = __ps_process_uri(reader, uri); + DBG("uri processing\n"); + } else if (!strcmp(ASCII(node), "mime")) { + mime_x *mime = malloc(sizeof(mime_x)); + if (mime == NULL) { + DBG("Malloc Failed\n"); + return -1; + } + memset(mime, '\0', sizeof(mime_x)); + LISTADD(appsvc->mime, mime); + ret = __ps_process_mime(reader, mime); + DBG("mime processing\n"); + } else if (!strcmp(ASCII(node), "subapp")) { + subapp_x *subapp = malloc(sizeof(subapp_x)); + if (subapp == NULL) { + DBG("Malloc Failed\n"); + return -1; + } + memset(subapp, '\0', sizeof(subapp_x)); + LISTADD(appsvc->subapp, subapp); + ret = __ps_process_subapp(reader, subapp); + DBG("subapp processing\n"); + } else + return -1; + if (ret < 0) { + DBG("Processing appsvc failed\n"); + return ret; + } + } + if (appsvc->operation) { + LISTHEAD(appsvc->operation, tmp1); + appsvc->operation = tmp1; + } + if (appsvc->uri) { + LISTHEAD(appsvc->uri, tmp2); + appsvc->uri = tmp2; + } + if (appsvc->mime) { + LISTHEAD(appsvc->mime, tmp3); + appsvc->mime = tmp3; + } + if (appsvc->subapp) { + LISTHEAD(appsvc->subapp, tmp4); + appsvc->subapp = tmp4; + } + + xmlTextReaderRead(reader); + if (xmlTextReaderValue(reader)) + appsvc->text = ASCII(xmlTextReaderValue(reader)); + + 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) { + DBG("xmlTextReaderConstName value is NULL\n"); + return -1; + } + + if (strcmp(ASCII(node), "condition") == 0) { + condition_x *condition = malloc(sizeof(condition_x)); + if (condition == NULL) { + DBG("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) { + DBG("Processing launchconditions failed\n"); + return ret; + } + } + if (launchconditions->condition) { + LISTHEAD(launchconditions->condition, tmp1); + launchconditions->condition = tmp1; + } + + xmlTextReaderRead(reader); + if (xmlTextReaderValue(reader)) + launchconditions->text = ASCII(xmlTextReaderValue(reader)); + + 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) { + DBG("xmlTextReaderConstName value is NULL\n"); + return -1; + } + + if (!strcmp(ASCII(node), "define")) { + define_x *define= malloc(sizeof(define_x)); + if (define == NULL) { + DBG("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) { + DBG("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) { + DBG("Processing data-share failed\n"); + return ret; + } + } + if (datashare->define) { + LISTHEAD(datashare->define, tmp1); + datashare->define = tmp1; + } + if (datashare->request) { + LISTHEAD(datashare->request, tmp2); + datashare->request = tmp2; + } + return ret; +} + +static int __ps_process_layout(xmlTextReaderPtr reader, layout_x *layout) +{ + /*TODO: once policy is set*/ + return 0; +} + +static char* +__get_icon_with_path(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 = vconf_get_str("db/setting/theme"); + if (!theme) { + theme = strdup("default"); + if(!theme) { + return NULL; + } + } + + len = (0x01 << 7) + strlen(icon) + strlen(package) + strlen(theme); + icon_with_path = malloc(len); + if(icon_with_path == NULL) { + DBG("(icon_with_path == NULL) return\n"); + free(theme); + return NULL; + } + + memset(icon_with_path, 0, len); + + snprintf(icon_with_path, len, "/opt/share/icons/%s/small/%s", theme, icon); + do { + 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; + DBG("cannot find icon %s", icon_with_path); + 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 */ + DBGE("icon file must be moved to %s", icon_with_path); + 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; + DBG("cannot find icon %s", icon_with_path); + 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; + } while (0); + + free(theme); + + DBG("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 int __ps_process_icon(xmlTextReaderPtr reader, icon_x *icon) +{ + if (xmlTextReaderGetAttribute(reader, XMLCHAR("name"))) + icon->name = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("name"))); + if (xmlTextReaderConstXmlLang(reader)) { + icon->lang = strdup(ASCII(xmlTextReaderConstXmlLang(reader))); + if (icon->lang == NULL) + icon->lang = strdup(DEFAULT_LOCALE); + } else { + icon->lang = strdup(DEFAULT_LOCALE); + } + if (xmlTextReaderGetAttribute(reader, XMLCHAR("section"))) + icon->section = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("section"))); + if (xmlTextReaderGetAttribute(reader, XMLCHAR("size"))) + icon->size = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("size"))); + if (xmlTextReaderGetAttribute(reader, XMLCHAR("resolution"))) + icon->resolution = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("resolution"))); + xmlTextReaderRead(reader); + if (xmlTextReaderValue(reader)) { + char *text = ASCII(xmlTextReaderValue(reader)); + if(text) { + icon->text = __get_icon_with_path(text); + free(text); + } + } + + return 0; +} + +static int __ps_process_label(xmlTextReaderPtr reader, label_x *label) +{ + if (xmlTextReaderGetAttribute(reader, XMLCHAR("name"))) + label->name = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("name"))); + if (xmlTextReaderConstXmlLang(reader)) { + label->lang = strdup(ASCII(xmlTextReaderConstXmlLang(reader))); + if (label->lang == NULL) + label->lang = strdup(DEFAULT_LOCALE); + } else { + label->lang = strdup(DEFAULT_LOCALE); + } + xmlTextReaderRead(reader); + if (xmlTextReaderValue(reader)) + label->text = ASCII(xmlTextReaderValue(reader)); + +/* DBG("lable name %s\n", label->name); + DBG("lable lang %s\n", label->lang); + DBG("lable text %s\n", label->text); +*/ + return 0; + +} + +static int __ps_process_author(xmlTextReaderPtr reader, author_x *author) +{ + if (xmlTextReaderGetAttribute(reader, XMLCHAR("email"))) + author->email = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("email"))); + if (xmlTextReaderGetAttribute(reader, XMLCHAR("href"))) + author->href = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("href"))); + if (xmlTextReaderConstXmlLang(reader)) { + author->lang = strdup(ASCII(xmlTextReaderConstXmlLang(reader))); + if (author->lang == NULL) + author->lang = strdup(DEFAULT_LOCALE); + } else { + author->lang = strdup(DEFAULT_LOCALE); + } + xmlTextReaderRead(reader); + if (xmlTextReaderValue(reader)) + author->text = ASCII(xmlTextReaderValue(reader)); + return 0; +} + +static int __ps_process_description(xmlTextReaderPtr reader, description_x *description) +{ + if (xmlTextReaderConstXmlLang(reader)) { + description->lang = strdup(ASCII(xmlTextReaderConstXmlLang(reader))); + if (description->lang == NULL) + description->lang = strdup(DEFAULT_LOCALE); + } else { + description->lang = strdup(DEFAULT_LOCALE); + } + xmlTextReaderRead(reader); + if (xmlTextReaderValue(reader)) + description->text = ASCII(xmlTextReaderValue(reader)); + return 0; +} + +static int __ps_process_license(xmlTextReaderPtr reader, license_x *license) +{ + if (xmlTextReaderConstXmlLang(reader)) { + license->lang = strdup(ASCII(xmlTextReaderConstXmlLang(reader))); + if (license->lang == NULL) + license->lang = strdup(DEFAULT_LOCALE); + } else { + license->lang = strdup(DEFAULT_LOCALE); + } + xmlTextReaderRead(reader); + if (xmlTextReaderValue(reader)) + license->text = ASCII(xmlTextReaderValue(reader)); + 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; + + if (xmlTextReaderGetAttribute(reader, XMLCHAR("operation-id"))) + capability->operationid = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("operation-id"))); + + depth = xmlTextReaderDepth(reader); + while ((ret = __next_child_element(reader, depth))) { + node = xmlTextReaderConstName(reader); + if (!node) { + DBG("xmlTextReaderConstName value is NULL\n"); + return -1; + } + + if (!strcmp(ASCII(node), "resolution")) { + resolution_x *resolution = malloc(sizeof(resolution_x)); + if (resolution == NULL) { + DBG("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) { + DBG("Processing capability failed\n"); + return ret; + } + } + + if (capability->resolution) { + LISTHEAD(capability->resolution, tmp1); + capability->resolution = tmp1; + } + + return ret; +} + +static int __ps_process_datacontrol(xmlTextReaderPtr reader, datacontrol_x *datacontrol) +{ + const xmlChar *node; + int ret = -1; + int depth = -1; + capability_x *tmp1 = NULL; + + if (xmlTextReaderGetAttribute(reader, XMLCHAR("provider-id"))) + datacontrol->providerid = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("provider-id"))); + + depth = xmlTextReaderDepth(reader); + while ((ret = __next_child_element(reader, depth))) { + node = xmlTextReaderConstName(reader); + if (!node) { + DBG("xmlTextReaderConstName value is NULL\n"); + return -1; + } + + if (!strcmp(ASCII(node), "capability")) { + capability_x *capability = malloc(sizeof(capability_x)); + if (capability == NULL) { + DBG("Malloc Failed\n"); + return -1; + } + memset(capability, '\0', sizeof(capability_x)); + LISTADD(datacontrol->capability, capability); + ret = __ps_process_capability(reader, capability); + } else + return -1; + if (ret < 0) { + DBG("Processing datacontrol failed\n"); + return ret; + } + } + + if (datacontrol->capability) { + LISTHEAD(datacontrol->capability, tmp1); + datacontrol->capability = tmp1; + } + + return ret; +} + +static int __ps_process_uiapplication(xmlTextReaderPtr reader, uiapplication_x *uiapplication) +{ + const xmlChar *node; + int ret = -1; + int depth = -1; + char *newappid = NULL; + label_x *tmp1 = NULL; + icon_x *tmp2 = NULL; + appsvc_x *tmp3 = NULL; + appcontrol_x *tmp4 = NULL; + launchconditions_x *tmp5 = NULL; + notification_x *tmp6 = NULL; + datashare_x *tmp7 = NULL; + category_x *tmp8 = NULL; + + if (xmlTextReaderGetAttribute(reader, XMLCHAR("appid"))) { + uiapplication->appid = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("appid"))); + if (uiapplication->appid == NULL) { + DBG("appid cant be NULL\n"); + return -1; + } + } else { + DBG("appid is mandatory\n"); + return -1; + } + /*check appid*/ + ret = __validate_appid(package, uiapplication->appid, &newappid); + if (ret == -1) { + DBG("appid is not proper\n"); + return -1; + } else { + if (newappid) { + if (uiapplication->appid) + free((void *)uiapplication->appid); + uiapplication->appid = newappid; + } + } + if (xmlTextReaderGetAttribute(reader, XMLCHAR("exec"))) + uiapplication->exec = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("exec"))); + if (xmlTextReaderGetAttribute(reader, XMLCHAR("nodisplay"))) { + uiapplication->nodisplay = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("nodisplay"))); + if (uiapplication->nodisplay == NULL) + uiapplication->nodisplay = strdup("false"); + } else { + uiapplication->nodisplay = strdup("false"); + } + if (xmlTextReaderGetAttribute(reader, XMLCHAR("multiple"))) { + uiapplication->multiple = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("multiple"))); + if (uiapplication->multiple == NULL) + uiapplication->multiple = strdup("false"); + } else { + uiapplication->multiple = strdup("false"); + } + if (xmlTextReaderGetAttribute(reader, XMLCHAR("type"))) + uiapplication->type = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("type"))); + if (xmlTextReaderGetAttribute(reader, XMLCHAR("categories"))) + uiapplication->categories = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("categories"))); + if (xmlTextReaderGetAttribute(reader, XMLCHAR("extraid"))) + uiapplication->extraid = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("extraid"))); + if (xmlTextReaderGetAttribute(reader, XMLCHAR("taskmanage"))) { + uiapplication->taskmanage = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("taskmanage"))); + if (uiapplication->taskmanage == NULL) + uiapplication->taskmanage = strdup("true"); + } else { + uiapplication->taskmanage = strdup("true"); + } + if (xmlTextReaderGetAttribute(reader, XMLCHAR("hw-acceleration"))) { + uiapplication->hwacceleration = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("hw-acceleration"))); + if (uiapplication->hwacceleration == NULL) + uiapplication->hwacceleration = strdup("use-system-setting"); + } else { + uiapplication->hwacceleration = strdup("use-system-setting"); + } + if (xmlTextReaderGetAttribute(reader, XMLCHAR("recentimage"))) + uiapplication->recentimage = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("recentimage"))); + if (xmlTextReaderGetAttribute(reader, XMLCHAR("mainapp"))) { + uiapplication->mainapp = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("mainapp"))); + if (uiapplication->mainapp == NULL) + uiapplication->mainapp = strdup("false"); + } else { + uiapplication->mainapp = strdup("false"); + } + + depth = xmlTextReaderDepth(reader); + while ((ret = __next_child_element(reader, depth))) { + node = xmlTextReaderConstName(reader); + if (!node) { + DBG("xmlTextReaderConstName value is NULL\n"); + return -1; + } + if (!strcmp(ASCII(node), "label")) { + label_x *label = malloc(sizeof(label_x)); + if (label == NULL) { + DBG("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) { + DBG("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), "category")) { + category_x *category = malloc(sizeof(category_x)); + if (category == NULL) { + DBG("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), "app-control")) { + appcontrol_x *appcontrol = malloc(sizeof(appcontrol_x)); + if (appcontrol == NULL) { + DBG("Malloc Failed\n"); + return -1; + } + memset(appcontrol, '\0', sizeof(appcontrol_x)); + LISTADD(uiapplication->appcontrol, appcontrol); + ret = __ps_process_appcontrol(reader, appcontrol); + } else if (!strcmp(ASCII(node), "application-service")) { + appsvc_x *appsvc = malloc(sizeof(appsvc_x)); + if (appsvc == NULL) { + DBG("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) { + DBG("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) { + DBG("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) { + DBG("Malloc Failed\n"); + return -1; + } + memset(notification, '\0', sizeof(notification_x)); + LISTADD(uiapplication->notification, notification); + ret = __ps_process_notification(reader, notification); + } else + return -1; + if (ret < 0) { + DBG("Processing uiapplication failed\n"); + return ret; + } + } + + if (uiapplication->label) { + LISTHEAD(uiapplication->label, tmp1); + uiapplication->label = tmp1; + } + if (uiapplication->icon) { + LISTHEAD(uiapplication->icon, tmp2); + uiapplication->icon = tmp2; + } + if (uiapplication->appsvc) { + LISTHEAD(uiapplication->appsvc, tmp3); + uiapplication->appsvc = tmp3; + } + if (uiapplication->appcontrol) { + LISTHEAD(uiapplication->appcontrol, tmp4); + uiapplication->appcontrol = tmp4; + } + if (uiapplication->launchconditions) { + LISTHEAD(uiapplication->launchconditions, tmp5); + uiapplication->launchconditions = tmp5; + } + if (uiapplication->notification) { + LISTHEAD(uiapplication->notification, tmp6); + uiapplication->notification = tmp6; + } + if (uiapplication->datashare) { + LISTHEAD(uiapplication->datashare, tmp7); + uiapplication->datashare = tmp7; + } + if (uiapplication->category) { + LISTHEAD(uiapplication->category, tmp8); + uiapplication->category = tmp8; + } + + return ret; +} + +static int __ps_process_serviceapplication(xmlTextReaderPtr reader, serviceapplication_x *serviceapplication) +{ + const xmlChar *node; + int ret = -1; + int depth = -1; + char *newappid = NULL; + label_x *tmp1 = NULL; + icon_x *tmp2 = NULL; + appsvc_x *tmp3 = NULL; + appcontrol_x *tmp4 = NULL; + datacontrol_x *tmp5 = NULL; + launchconditions_x *tmp6 = NULL; + notification_x *tmp7 = NULL; + datashare_x *tmp8 = NULL; + category_x *tmp9 = NULL; + + if (xmlTextReaderGetAttribute(reader, XMLCHAR("appid"))) { + serviceapplication->appid = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("appid"))); + if (serviceapplication->appid == NULL) { + DBG("appid cant be NULL\n"); + return -1; + } + } else { + DBG("appid is mandatory\n"); + return -1; + } + /*check appid*/ + ret = __validate_appid(package, serviceapplication->appid, &newappid); + if (ret == -1) { + DBG("appid is not proper\n"); + return -1; + } else { + if (newappid) { + if (serviceapplication->appid) + free((void *)serviceapplication->appid); + serviceapplication->appid = newappid; + } + } + if (xmlTextReaderGetAttribute(reader, XMLCHAR("exec"))) + serviceapplication->exec = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("exec"))); + if (xmlTextReaderGetAttribute(reader, XMLCHAR("type"))) + serviceapplication->type = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("type"))); + if (xmlTextReaderGetAttribute(reader, XMLCHAR("on-boot"))) { + serviceapplication->onboot = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("on-boot"))); + if (serviceapplication->onboot == NULL) + serviceapplication->onboot = strdup("false"); + } else { + serviceapplication->onboot = strdup("false"); + } + if (xmlTextReaderGetAttribute(reader, XMLCHAR("auto-restart"))) { + serviceapplication->autorestart = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("auto-restart"))); + if (serviceapplication->autorestart == NULL) + serviceapplication->autorestart = strdup("false"); + } else { + serviceapplication->autorestart = strdup("false"); + } + + depth = xmlTextReaderDepth(reader); + while ((ret = __next_child_element(reader, depth))) { + node = xmlTextReaderConstName(reader); + if (!node) { + DBG("xmlTextReaderConstName value is NULL\n"); + return -1; + } + + if (!strcmp(ASCII(node), "label")) { + label_x *label = malloc(sizeof(label_x)); + if (label == NULL) { + DBG("Malloc Failed\n"); + return -1; + } + memset(label, '\0', sizeof(label_x)); + LISTADD(serviceapplication->label, label); + ret = __ps_process_label(reader, label); + } else if (!strcmp(ASCII(node), "icon")) { + icon_x *icon = malloc(sizeof(icon_x)); + if (icon == NULL) { + DBG("Malloc Failed\n"); + return -1; + } + memset(icon, '\0', sizeof(icon_x)); + LISTADD(serviceapplication->icon, icon); + ret = __ps_process_icon(reader, icon); + } else if (!strcmp(ASCII(node), "category")) { + category_x *category = malloc(sizeof(category_x)); + if (category == NULL) { + DBG("Malloc Failed\n"); + return -1; + } + memset(category, '\0', sizeof(category_x)); + LISTADD(serviceapplication->category, category); + ret = __ps_process_category(reader, category); + } else if (!strcmp(ASCII(node), "app-control")) { + appcontrol_x *appcontrol = malloc(sizeof(appcontrol_x)); + if (appcontrol == NULL) { + DBG("Malloc Failed\n"); + return -1; + } + memset(appcontrol, '\0', sizeof(appcontrol_x)); + LISTADD(serviceapplication->appcontrol, appcontrol); + ret = __ps_process_appcontrol(reader, appcontrol); + } else if (!strcmp(ASCII(node), "application-service")) { + appsvc_x *appsvc = malloc(sizeof(appsvc_x)); + if (appsvc == NULL) { + DBG("Malloc Failed\n"); + return -1; + } + memset(appsvc, '\0', sizeof(appsvc_x)); + LISTADD(serviceapplication->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) { + DBG("Malloc Failed\n"); + return -1; + } + memset(datashare, '\0', sizeof(datashare_x)); + LISTADD(serviceapplication->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) { + DBG("Malloc Failed\n"); + return -1; + } + memset(launchconditions, '\0', sizeof(launchconditions_x)); + LISTADD(serviceapplication->launchconditions, launchconditions); + ret = __ps_process_launchconditions(reader, launchconditions); + } else if (!strcmp(ASCII(node), "notification")) { + notification_x *notification = malloc(sizeof(notification_x)); + if (notification == NULL) { + DBG("Malloc Failed\n"); + return -1; + } + memset(notification, '\0', sizeof(notification_x)); + LISTADD(serviceapplication->notification, notification); + ret = __ps_process_notification(reader, notification); + } else if (!strcmp(ASCII(node), "data-control")) { + datacontrol_x *datacontrol = malloc(sizeof(datacontrol_x)); + if (datacontrol == NULL) { + DBG("Malloc Failed\n"); + return -1; + } + memset(datacontrol, '\0', sizeof(datacontrol_x)); + LISTADD(serviceapplication->datacontrol, datacontrol); + ret = __ps_process_datacontrol(reader, datacontrol); + } else + return -1; + if (ret < 0) { + DBG("Processing serviceapplication failed\n"); + return ret; + } + } + + if (serviceapplication->label) { + LISTHEAD(serviceapplication->label, tmp1); + serviceapplication->label = tmp1; + } + if (serviceapplication->icon) { + LISTHEAD(serviceapplication->icon, tmp2); + serviceapplication->icon = tmp2; + } + if (serviceapplication->appsvc) { + LISTHEAD(serviceapplication->appsvc, tmp3); + serviceapplication->appsvc = tmp3; + } + if (serviceapplication->appcontrol) { + LISTHEAD(serviceapplication->appcontrol, tmp4); + serviceapplication->appcontrol = tmp4; + } + if (serviceapplication->datacontrol) { + LISTHEAD(serviceapplication->datacontrol, tmp5); + serviceapplication->datacontrol = tmp5; + } + if (serviceapplication->launchconditions) { + LISTHEAD(serviceapplication->launchconditions, tmp6); + serviceapplication->launchconditions = tmp6; + } + if (serviceapplication->notification) { + LISTHEAD(serviceapplication->notification, tmp7); + serviceapplication->notification = tmp7; + } + if (serviceapplication->datashare) { + LISTHEAD(serviceapplication->datashare, tmp8); + serviceapplication->datashare = tmp8; + } + if (serviceapplication->category) { + LISTHEAD(serviceapplication->category, tmp9); + serviceapplication->category = tmp9; + } + + return ret; +} + +static int __ps_process_deviceprofile(xmlTextReaderPtr reader, deviceprofile_x *deviceprofile) +{ + /*TODO: once policy is set*/ + 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) +{ + DBG("__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; + serviceapplication_x *tmp6 = NULL; + daemon_x *tmp7 = NULL; + theme_x *tmp8 = NULL; + font_x *tmp9 = NULL; + ime_x *tmp10 = NULL; + icon_x *tmp11 = NULL; + compatibility_x *tmp12 = NULL; + deviceprofile_x *tmp13 = NULL; + + depth = xmlTextReaderDepth(reader); + while ((ret = __next_child_element(reader, depth))) { + node = xmlTextReaderConstName(reader); + if (!node) { + DBG("xmlTextReaderConstName value is NULL\n"); + return -1; + } + + if (!strcmp(ASCII(node), "label")) { + label_x *label = malloc(sizeof(label_x)); + if (label == NULL) { + DBG("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) { + DBG("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) { + DBG("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) { + DBG("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), "ui-application")) { + uiapplication_x *uiapplication = malloc(sizeof(uiapplication_x)); + if (uiapplication == NULL) { + DBG("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")) { + serviceapplication_x *serviceapplication = malloc(sizeof(serviceapplication_x)); + if (serviceapplication == NULL) { + DBG("Malloc Failed\n"); + return -1; + } + memset(serviceapplication, '\0', sizeof(serviceapplication_x)); + LISTADD(mfx->serviceapplication, serviceapplication); + ret = __ps_process_serviceapplication(reader, serviceapplication); + } else if (!strcmp(ASCII(node), "daemon")) { + daemon_x *daemon = malloc(sizeof(daemon_x)); + if (daemon == NULL) { + DBG("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) { + DBG("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) { + DBG("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) { + DBG("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) { + DBG("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), "device-profile")) { + deviceprofile_x *deviceprofile = malloc(sizeof(deviceprofile_x)); + if (deviceprofile == NULL) { + DBG("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) { + DBG("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")) { + continue; + } else if (!strcmp(ASCII(node), "Accounts")) { + continue; + } else if (!strcmp(ASCII(node), "account")) { + continue; + } else if (!strcmp(ASCII(node), "notification")) { + continue; + } else + return -1; + + if (ret < 0) { + DBG("Processing manifest failed\n"); + return ret; + } + } + if (mfx->label) { + LISTHEAD(mfx->label, tmp1); + mfx->label = tmp1; + } + if (mfx->author) { + LISTHEAD(mfx->author, tmp2); + mfx->author = tmp2; + } + if (mfx->description) { + LISTHEAD(mfx->description, tmp3); + mfx->description= tmp3; + } + if (mfx->license) { + LISTHEAD(mfx->license, tmp4); + mfx->license= tmp4; + } + if (mfx->uiapplication) { + LISTHEAD(mfx->uiapplication, tmp5); + mfx->uiapplication = tmp5; + } + if (mfx->serviceapplication) { + LISTHEAD(mfx->serviceapplication, tmp6); + mfx->serviceapplication = tmp6; + } + if (mfx->daemon) { + LISTHEAD(mfx->daemon, tmp7); + mfx->daemon= tmp7; + } + if (mfx->theme) { + LISTHEAD(mfx->theme, tmp8); + mfx->theme= tmp8; + } + if (mfx->font) { + LISTHEAD(mfx->font, tmp9); + mfx->font= tmp9; + } + if (mfx->ime) { + LISTHEAD(mfx->ime, tmp10); + mfx->ime= tmp10; + } + if (mfx->icon) { + LISTHEAD(mfx->icon, tmp11); + mfx->icon= tmp11; + } + if (mfx->compatibility) { + LISTHEAD(mfx->compatibility, tmp12); + mfx->compatibility= tmp12; + } + if (mfx->deviceprofile) { + LISTHEAD(mfx->deviceprofile, tmp13); + mfx->deviceprofile= 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); + if (!node) { + DBG("xmlTextReaderConstName value is NULL\n"); + return -1; + } + + if (!strcmp(ASCII(node), "manifest")) { + if (xmlTextReaderGetAttribute(reader, XMLCHAR("xmlns"))) + mfx->ns = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("xmlns"))); + if (xmlTextReaderGetAttribute(reader, XMLCHAR("package"))) { + mfx->package= ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("package"))); + if (mfx->package == NULL) { + DBG("package cant be NULL\n"); + return -1; + } + } else { + DBG("package field is mandatory\n"); + return -1; + } + package = mfx->package; + if (xmlTextReaderGetAttribute(reader, XMLCHAR("version"))) + mfx->version= ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("version"))); + /*app2ext needs package size for external installation*/ + if (xmlTextReaderGetAttribute(reader, XMLCHAR("size"))) + mfx->package_size = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("size"))); + if (xmlTextReaderGetAttribute(reader, XMLCHAR("install-location"))) + mfx->installlocation = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("install-location"))); + if (xmlTextReaderGetAttribute(reader, XMLCHAR("type"))) + mfx->type = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("type"))); + /*Assign default values. If required it will be overwritten in __add_preload_info()*/ + mfx->preload = strdup("False"); + mfx->removable = strdup("True"); + mfx->readonly = strdup("False"); + 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", current_time); + val = strndup(buf, PKG_STRING_LEN_MAX - 1); + mfx->installed_time = val; + + ret = __start_process(reader, mfx); + } else { + DBG("No Manifest element found\n"); + return -1; + } + } + return ret; +} + +#define DESKTOP_RW_PATH "/opt/share/applications/" +#define DESKTOP_RO_PATH "/usr/share/applications/" + +static char* __convert_to_system_locale(const char *mlocale) +{ + if (mlocale == NULL) + return NULL; + char *locale = NULL; + locale = (char *)calloc(1, 6); + if (!locale) { + DBGE("Malloc Failed\n"); + return NULL; + } + + strncpy(locale, mlocale, 2); + strncat(locale, "_", 1); + locale[3] = toupper(mlocale[3]); + locale[4] = toupper(mlocale[4]); + return locale; +} + + +/* desktop shoud be generated automatically based on manifest */ +/* Currently removable, taskmanage, etc fields are not considerd. it will be decided soon.*/ +#define BUFMAX 1024*128 +static int __ps_make_nativeapp_desktop(manifest_x * mfx) +{ + 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) { + DBGE("Malloc Failed\n"); + return -1; + } + + buftemp = (char *)calloc(1, BUFMAX); + if (!buftemp) { + DBGE("Malloc Failed\n"); + free(buf); + return -1; + } + + for(; mfx->uiapplication; mfx->uiapplication=mfx->uiapplication->next) { + + 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) + { + DBGE("Can't open %s", filepath); + free(buf); + free(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(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); + } + + 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->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); + } + + snprintf(buf, BUFMAX, "X-TIZEN-PkgID=%s\n", mfx->package); + 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="); + DBG("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; + int ret = -1; + char query[PKG_STRING_LEN_MAX] = {'\0'}; + char *operation = NULL; + char *mime = NULL; + char *uri = NULL; + 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"); + DBG("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); + } + + if(mfx->uiapplication->appcontrol) { + snprintf(buf, BUFMAX, "X-TIZEN-Svc="); + DBG("buf[%s]\n", buf); + + uiapplication_x *up = mfx->uiapplication; + appcontrol_x *acontrol = NULL; + operation_x *op = NULL; + mime_x *mi = NULL; + uri_x *ui = NULL; + subapp_x *sub = NULL; + int ret = -1; + char query[PKG_STRING_LEN_MAX] = {'\0'}; + char *operation = NULL; + char *mime = NULL; + char *uri = NULL; + char *subapp = NULL; + int i = 0; + + acontrol = up->appcontrol; + while(acontrol != NULL) + { + op = acontrol->operation; + while(op != NULL) + { + if (op) + operation = op->name; + mi = acontrol->mime; + + do + { + if (mi) + mime = mi->name; + sub = acontrol->subapp; + do + { + if (sub) + subapp = sub->name; + ui = acontrol->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"); + DBG("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; + } + acontrol = acontrol->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); + } + + free(buf); + free(buftemp); + + return 0; +} + +static int __ps_remove_nativeapp_desktop(manifest_x *mfx) +{ + char filepath[PKG_STRING_LEN_MAX] = ""; + int ret = 0; + + for(; mfx->uiapplication; mfx->uiapplication=mfx->uiapplication->next) { + snprintf(filepath, sizeof(filepath),"%s%s.desktop", DESKTOP_RW_PATH, mfx->uiapplication->appid); + + ret = remove(filepath); + if (ret <0) + return -1; + } + + return 0; +} + +#define MANIFEST_RO_PREFIX "/usr/share/packages/" +#define PRELOAD_PACKAGE_LIST "/usr/etc/package-manager/preload/preload_list.txt" +static int __add_preload_info(manifest_x * mfx, const char *manifest) +{ + FILE *fp = NULL; + char buffer[1024] = { 0 }; + int state = 0; + + if(strstr(manifest, MANIFEST_RO_PREFIX)) { + free(mfx->readonly); + mfx->readonly = strdup("True"); + + free(mfx->preload); + mfx->preload = strdup("True"); + + free(mfx->removable); + mfx->removable = strdup("False"); + + return 0; + } + + fp = fopen(PRELOAD_PACKAGE_LIST, "r"); + if (fp == NULL) { + DBGE("no preload list\n"); + return -1; + } + + while (fgets(buffer, sizeof(buffer), fp) != NULL) { + if (buffer[0] == '#') { + if(strcasestr(buffer, "RW_NORM")) + state = 2; + else if(strcasestr(buffer, "RW_RM")) + state = 3; + else + continue; + } + + __str_trim(buffer); + + if(!strcmp(mfx->package, buffer)) { + free(mfx->preload); + mfx->preload = strdup("True"); + if(state == 2){ + free(mfx->readonly); + mfx->readonly = strdup("False"); + free(mfx->removable); + mfx->removable = strdup("False"); + } else if(state == 3){ + free(mfx->readonly); + mfx->readonly = strdup("False"); + free(mfx->removable); + mfx->removable = strdup("True"); + } + } + + memset(buffer, 0x00, sizeof(buffer)); + } + + if (fp != NULL) + fclose(fp); + + return 0; +} + + +API void pkgmgr_parser_free_manifest_xml(manifest_x *mfx) +{ + if (mfx == NULL) + return; + if (mfx->ns) { + free((void *)mfx->ns); + mfx->ns = NULL; + } + if (mfx->package) { + free((void *)mfx->package); + mfx->package = NULL; + } + if (mfx->version) { + free((void *)mfx->version); + mfx->version = NULL; + } + if (mfx->installlocation) { + free((void *)mfx->installlocation); + mfx->installlocation = NULL; + } + if (mfx->preload) { + free((void *)mfx->preload); + mfx->preload = NULL; + } + if (mfx->readonly) { + free((void *)mfx->readonly); + mfx->readonly = NULL; + } + if (mfx->removable) { + free((void *)mfx->removable); + mfx->removable = NULL; + } + if (mfx->type) { + free((void *)mfx->type); + mfx->type = NULL; + } + if (mfx->package_size) { + free((void *)mfx->package_size); + mfx->package_size = NULL; + } + if (mfx->installed_time) { + free((void *)mfx->installed_time); + mfx->installed_time = NULL; + } + if (mfx->storeclient_id) { + free((void *)mfx->storeclient_id); + mfx->storeclient_id = NULL; + } + if (mfx->mainapp_id) { + free((void *)mfx->mainapp_id); + mfx->mainapp_id = NULL; + } + if (mfx->package_url) { + free((void *)mfx->package_url); + mfx->package_url = NULL; + } + + /*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 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 ServiceApplication*/ + if (mfx->serviceapplication) { + serviceapplication_x *serviceapplication = mfx->serviceapplication; + serviceapplication_x *tmp = NULL; + while(serviceapplication != NULL) + { + tmp = serviceapplication->next; + __ps_free_serviceapplication(serviceapplication); + serviceapplication = 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((void*)mfx); + mfx = NULL; + return; +} + +API manifest_x *pkgmgr_parser_process_manifest_xml(const char *manifest) +{ + DBG("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) { + DBG("Parsing Failed\n"); + pkgmgr_parser_free_manifest_xml(mfx); + mfx = NULL; + } else + DBG("Parsing Success\n"); + } else { + DBG("Memory allocation error\n"); + } + xmlFreeTextReader(reader); + } else { + DBG("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[]) +{ + char *temp[] = {"shortcut-list", "livebox", "Accounts", "account", "notification", NULL}; + if (manifest == NULL) { + DBG("argument supplied is NULL\n"); + return PMINFO_R_EINVAL; + } + DBG("parsing manifest for installation: %s\n", manifest); + manifest_x *mfx = NULL; + int ret = -1; + xmlInitParser(); + mfx = pkgmgr_parser_process_manifest_xml(manifest); + DBG("Parsing Finished\n"); + if (mfx == NULL) + return PMINFO_R_ERROR; + + __streamFile(manifest, ACTION_INSTALL, temp, mfx->package); + __add_preload_info(mfx, manifest); + DBG("Added preload infomation\n"); + ret = pkgmgr_parser_insert_manifest_info_in_db(mfx); + if (ret == -1) + DBG("DB Insert failed\n"); + else + DBG("DB Insert Success\n"); + + ret = __ps_make_nativeapp_desktop(mfx); + if (ret == -1) + DBG("Creating desktop file failed\n"); + else + DBG("Creating desktop file Success\n"); + + pkgmgr_parser_free_manifest_xml(mfx); + DBG("Free Done\n"); + xmlCleanupParser(); + + return PMINFO_R_OK; +} + +API int pkgmgr_parser_parse_manifest_for_upgrade(const char *manifest, char *const tagv[]) +{ + char *temp[] = {"shortcut-list", "livebox", "Accounts", "account", "notification", NULL}; + if (manifest == NULL) { + DBG("argument supplied is NULL\n"); + return PMINFO_R_EINVAL; + } + DBG("parsing manifest for upgradation: %s\n", manifest); + manifest_x *mfx = NULL; + int ret = -1; + xmlInitParser(); + mfx = pkgmgr_parser_process_manifest_xml(manifest); + DBG("Parsing Finished\n"); + if (mfx == NULL) + return PMINFO_R_ERROR; + + __streamFile(manifest, ACTION_UPGRADE, temp, mfx->package); + __add_preload_info(mfx, manifest); + DBG("Added preload infomation\n"); + ret = pkgmgr_parser_update_manifest_info_in_db(mfx); + if (ret == -1) + DBG("DB Update failed\n"); + else + DBG("DB Update Success\n"); + + ret = __ps_make_nativeapp_desktop(mfx); + if (ret == -1) + DBG("Creating desktop file failed\n"); + else + DBG("Creating desktop file Success\n"); + + pkgmgr_parser_free_manifest_xml(mfx); + DBG("Free Done\n"); + xmlCleanupParser(); + + return PMINFO_R_OK; +} + +API int pkgmgr_parser_parse_manifest_for_uninstallation(const char *manifest, char *const tagv[]) +{ + char *temp[] = {"shortcut-list", "livebox", "Accounts", "account", "notification", NULL}; + if (manifest == NULL) { + DBG("argument supplied is NULL\n"); + return PMINFO_R_EINVAL; + } + DBG("parsing manifest for uninstallation: %s\n", manifest); + manifest_x *mfx = NULL; + int ret = -1; + xmlInitParser(); + mfx = pkgmgr_parser_process_manifest_xml(manifest); + DBG("Parsing Finished\n"); + if (mfx == NULL) + return PMINFO_R_ERROR; + + __streamFile(manifest, ACTION_UNINSTALL, temp, mfx->package); + __add_preload_info(mfx, manifest); + DBG("Added preload infomation\n"); + + ret = pkgmgr_parser_delete_manifest_info_from_db(mfx); + if (ret == -1) + DBG("DB Delete failed\n"); + else + DBG("DB Delete Success\n"); + + ret = __ps_remove_nativeapp_desktop(mfx); + if (ret == -1) + DBG("Removing desktop file failed\n"); + else + DBG("Removing desktop file Success\n"); + + pkgmgr_parser_free_manifest_xml(mfx); + DBG("Free Done\n"); + xmlCleanupParser(); + + return PMINFO_R_OK; +} + +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); +} + +#define SCHEMA_FILE "/usr/etc/package-manager/preload/manifest.xsd" +#if 1 +API int pkgmgr_parser_check_manifest_validation(const char *manifest) +{ + if (manifest == NULL) { + DBGE("manifest file is NULL\n"); + return PMINFO_R_EINVAL; + } + int ret = -1; + xmlSchemaParserCtxtPtr ctx; + xmlSchemaValidCtxtPtr vctx; + xmlSchemaPtr xschema; + ctx = xmlSchemaNewParserCtxt(SCHEMA_FILE); + if (ctx == NULL) { + DBGE("xmlSchemaNewParserCtxt() Failed\n"); + return PMINFO_R_ERROR; + } + xschema = xmlSchemaParse(ctx); + if (xschema == NULL) { + DBGE("xmlSchemaParse() Failed\n"); + return PMINFO_R_ERROR; + } + vctx = xmlSchemaNewValidCtxt(xschema); + if (vctx == NULL) { + DBGE("xmlSchemaNewValidCtxt() Failed\n"); + return PMINFO_R_ERROR; + } + xmlSchemaSetValidErrors(vctx, (xmlSchemaValidityErrorFunc) fprintf, (xmlSchemaValidityWarningFunc) fprintf, stderr); + ret = xmlSchemaValidateFile(vctx, manifest, 0); + if (ret == -1) { + DBGE("xmlSchemaValidateFile() failed\n"); + return PMINFO_R_ERROR; + } else if (ret == 0) { + DBGE("Manifest is Valid\n"); + return PMINFO_R_OK; + } else { + DBGE("Manifest Validation Failed with error code %d\n", ret); + return PMINFO_R_ERROR; + } + return PMINFO_R_OK; +} + +#else +API int pkgmgr_parser_check_manifest_validation(const char *manifest) +{ + int err = 0; + int status = 0; + pid_t pid; + + pid = fork(); + + switch (pid) { + case -1: + DBGE("fork failed\n"); + return -1; + case 0: + /* child */ + { + int dev_null_fd = open ("/dev/null", O_RDWR); + if (dev_null_fd >= 0) + { + dup2 (dev_null_fd, 0);/*stdin*/ + dup2 (dev_null_fd, 1);/*stdout*/ + dup2 (dev_null_fd, 2);/*stderr*/ + } + + if (execl("/usr/bin/xmllint", "xmllint", manifest, "--schema", + SCHEMA_FILE, NULL) < 0) { + DBGE("execl error\n"); + } + + _exit(100); + } + default: + /* parent */ + break; + } + + while ((err = waitpid(pid, &status, WNOHANG)) != pid) { + if (err < 0) { + if (errno == EINTR) + continue; + DBGE("waitpid failed\n"); + return -1; + } + } + + + if(WIFEXITED(status) && !WEXITSTATUS(status)) + return 0; + else + return -1; +} +#endif diff --git a/parser/pkgmgr_parser.h b/parser/pkgmgr_parser.h new file mode 100755 index 0000000..39ea33d --- /dev/null +++ b/parser/pkgmgr_parser.h @@ -0,0 +1,708 @@ +/* + * pkgmgr-info + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __PKGMGR_PARSER_H__ +#define __PKGMGR_PARSER_H__ + +/** + * @file pkgmgr_parser.h + * @author Sewook Park + * @author Shobhit Srivastava + * @version 0.1 + * @brief This file declares API of pkgmgr_parser + * @addtogroup APPLICATION_FRAMEWORK + * @{ + * + * @defgroup PackageManagerParser + * @section Header Header file to include: + * @code + * #include + * @endcode + * + * @} + */ + +#include + +#ifdef __cplusplus +extern "C" { +#endif +#define DEFAULT_LOCALE "No Locale" + +#define PKG_PARSERLIB "parserlib:" +#define PKG_PARSER_CONF_PATH "/usr/etc/package-manager/parser_path.conf" + +#define PKG_STRING_LEN_MAX 1024 + +/** + * @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); + + /** + * @brief Convinience Macro to get list tail + */ +#define LISTTAIL(list, node) \ + for ((node) = (list); (node)->next; (node) = (node)->next); + +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 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 appcontrol_x { + const char *text; + struct operation_x *operation; + struct uri_x *uri; + struct mime_x *mime; + struct subapp_x *subapp; + struct appcontrol_x *prev; + struct appcontrol_x *next; +} appcontrol_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; + struct capability_x *capability; + struct datacontrol_x *prev; + struct datacontrol_x *next; +} datacontrol_x; + +typedef struct uiapplication_x { + const char *appid; + const char *exec; + const char *nodisplay; + const char *multiple; + const char *taskmanage; + const char *type; + const char *categories; + const char *extraid; + const char *hwacceleration; + const char *mainapp; + const char *package; + const char *recentimage; + struct label_x *label; + struct icon_x *icon; + struct appsvc_x *appsvc; + struct appcontrol_x *appcontrol; + struct category_x *category; + struct launchconditions_x *launchconditions; + struct notification_x *notification; + struct datashare_x *datashare; + 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 *type; + const char *package; + struct label_x *label; + struct icon_x *icon; + struct appsvc_x *appsvc; + struct appcontrol_x *appcontrol; + struct category_x *category; + 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; /**, Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "pkgmgr_parser_internal.h" +#include "pkgmgr_parser_db.h" + +#define PKGMGR_PARSER_DB_FILE "/opt/dbspace/.pkgmgr_parser.db" +#define PKGMGR_CERT_DB_FILE "/opt/dbspace/.pkgmgr_cert.db" +#define MAX_QUERY_LEN 4096 +sqlite3 *pkgmgr_parser_db; +sqlite3 *pkgmgr_cert_db; +GList *pkglocale = NULL; +GList *applocale = NULL; +GList *appicon = NULL; +char *prev = NULL; + +#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', " \ + "author_name text, " \ + "author_email text, " \ + "author_href text," \ + "installed_time text," \ + "storeclient_id text," \ + "mainapp_id text," \ + "package_url 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_APP_INFO "create table if not exists 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_hwacceleration text DEFAULT 'use-system-setting', " \ + "app_mainapp text, " \ + "app_recentimage text, " \ + "package text not null, " \ + "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_LOCALIZED_INFO "create table if not exists package_app_icon_localized_info " \ + "(app_id text not null, " \ + "app_locale text DEFAULT 'No Locale', " \ + "app_icon text, " \ + "app_icon_section text, " \ + "app_icon_resolution text, " \ + "PRIMARY KEY(app_id,app_locale,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_APP_CONTROL "create table if not exists package_app_app_control " \ + "(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_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_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_INFO "create table if not exists package_cert_info " \ + "(package text not null, " \ + "author_root_cert text, " \ + "author_im_cert text, " \ + "author_signer_cert text, " \ + "dist_root_cert text, " \ + "dist_im_cert text, " \ + "dist_signer_cert text, " \ + "dist2_root_cert text, " \ + "dist2_im_cert text, " \ + "dist2_signer_cert text, " \ + "PRIMARY KEY(package), " \ + "FOREIGN KEY(package) " \ + "REFERENCES package_info(package) " \ + "ON DELETE CASCADE)" + +static int __insert_uiapplication_info(manifest_x *mfx); +static int __insert_serviceapplication_info(manifest_x *mfx); +static int __insert_uiapplication_appsvc_info(manifest_x *mfx); +static int __insert_serviceapplication_appsvc_info(manifest_x *mfx); +static int __insert_uiapplication_appcategory_info(manifest_x *mfx); +static int __insert_serviceapplication_appcategory_info(manifest_x *mfx); +static int __insert_uiapplication_appcontrol_info(manifest_x *mfx); +static int __insert_serviceapplication_appcontrol_info(manifest_x *mfx); +static int __insert_uiapplication_share_allowed_info(manifest_x *mfx); +static int __insert_serviceapplication_share_allowed_info(manifest_x *mfx); +static int __insert_uiapplication_share_request_info(manifest_x *mfx); +static int __insert_serviceapplication_share_request_info(manifest_x *mfx); +static void __insert_serviceapplication_locale_info(gpointer data, gpointer userdata); +static void __insert_uiapplication_locale_info(gpointer data, gpointer userdata); +static void __insert_pkglocale_info(gpointer data, gpointer userdata); +static int __insert_manifest_info_in_db(manifest_x *mfx); +static int __update_manifest_info_in_db(manifest_x *mfx); +static int __delete_cert_info_from_db(manifest_x *mfx); +static int __delete_manifest_info_from_db(manifest_x *mfx); +static int __initialize_package_info_db(); +static int __initialize_package_localized_info_db(); +static int __initialize_package_app_info_db(); +static int __initialize_package_cert_info_db(); +static int __initialize_package_app_localized_info_db(); +static int __initialize_package_app_icon_localized_info_db(); +static int __initialize_package_app_app_svc_db(); +static int __initialize_package_app_app_category_db(); +static int __initialize_package_app_app_control_db(); +static int __initialize_package_app_share_allowed_db(); +static int __initialize_package_app_share_request_db(); +static int __exec_query(char *query); +static 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); + +static gint __comparefunc(gconstpointer a, gconstpointer b, gpointer userdata); +static void __trimfunc1(gpointer data, gpointer userdata); +static void __trimfunc2(gpointer data, gpointer userdata); +static GList *__create_locale_list(GList *locale, label_x *lbl, license_x *lcn, icon_x *icn, description_x *dcn, author_x *ath); + +static int __initialize_package_info_db() +{ + char *error_message = NULL; + if (SQLITE_OK != + sqlite3_exec(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_INFO, + NULL, NULL, &error_message)) { + DBG("Don't execute query = %s error message = %s\n", + QUERY_CREATE_TABLE_PACKAGE_INFO, error_message); + sqlite3_free(error_message); + return -1; + } + sqlite3_free(error_message); + return 0; +} + +static int __pkgmgr_parser_cert_create_db() +{ + int ret = -1; + if (access(PKGMGR_CERT_DB_FILE, F_OK) == 0) { + ret = + db_util_open(PKGMGR_CERT_DB_FILE, &pkgmgr_cert_db, + DB_UTIL_REGISTER_HOOK_METHOD); + if (ret != SQLITE_OK) { + DBG("connect db [%s] failed!\n", + PKGMGR_CERT_DB_FILE); + return -1; + } + return 0; + } + DBG("Pkgmgr DB does not exists. Create one!!\n"); + + ret = + db_util_open(PKGMGR_CERT_DB_FILE, &pkgmgr_cert_db, + DB_UTIL_REGISTER_HOOK_METHOD); + + if (ret != SQLITE_OK) { + DBG("connect db [%s] failed!\n", PKGMGR_CERT_DB_FILE); + return -1; + } + return 0; +} + +static int __initialize_package_cert_info_db() +{ + char *error_message = NULL; + int ret = -1; + ret = __pkgmgr_parser_cert_create_db(); + if (ret == -1) { + DBG("Failed to open DB\n"); + return ret; + } + + if (SQLITE_OK != + sqlite3_exec(pkgmgr_cert_db, QUERY_CREATE_TABLE_PACKAGE_CERT_INFO, + NULL, NULL, &error_message)) { + DBG("Don't execute query = %s error message = %s\n", + QUERY_CREATE_TABLE_PACKAGE_CERT_INFO, error_message); + sqlite3_free(error_message); + sqlite3_close(pkgmgr_cert_db); + return -1; + } + sqlite3_free(error_message); + sqlite3_close(pkgmgr_cert_db); + return 0; +} + +static int __initialize_package_localized_info_db() +{ + char *error_message = NULL; + if (SQLITE_OK != + sqlite3_exec(pkgmgr_parser_db, + QUERY_CREATE_TABLE_PACKAGE_LOCALIZED_INFO, NULL, NULL, + &error_message)) { + DBG("Don't execute query = %s error message = %s\n", + QUERY_CREATE_TABLE_PACKAGE_LOCALIZED_INFO, + error_message); + sqlite3_free(error_message); + return -1; + } + sqlite3_free(error_message); + return 0; +} + +static int __initialize_package_app_info_db() +{ + char *error_message = NULL; + if (SQLITE_OK != + sqlite3_exec(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_APP_INFO, + NULL, NULL, &error_message)) { + DBG("Don't execute query = %s error message = %s\n", + QUERY_CREATE_TABLE_PACKAGE_APP_INFO, error_message); + sqlite3_free(error_message); + return -1; + } + sqlite3_free(error_message); + return 0; +} + +static int __initialize_package_app_localized_info_db() +{ + char *error_message = NULL; + if (SQLITE_OK != + sqlite3_exec(pkgmgr_parser_db, + QUERY_CREATE_TABLE_PACKAGE_APP_LOCALIZED_INFO, NULL, + NULL, &error_message)) { + DBG("Don't execute query = %s error message = %s\n", + QUERY_CREATE_TABLE_PACKAGE_APP_LOCALIZED_INFO, + error_message); + sqlite3_free(error_message); + return -1; + } + sqlite3_free(error_message); + return 0; +} + +static int __initialize_package_app_icon_localized_info_db() +{ + char *error_message = NULL; + if (SQLITE_OK != + sqlite3_exec(pkgmgr_parser_db, + QUERY_CREATE_TABLE_PACKAGE_APP_ICON_LOCALIZED_INFO, NULL, + NULL, &error_message)) { + DBG("Don't execute query = %s error message = %s\n", + QUERY_CREATE_TABLE_PACKAGE_APP_ICON_LOCALIZED_INFO, + error_message); + sqlite3_free(error_message); + return -1; + } + sqlite3_free(error_message); + return 0; +} + +static int __initialize_package_app_app_control_db() +{ + char *error_message = NULL; + if (SQLITE_OK != + sqlite3_exec(pkgmgr_parser_db, + QUERY_CREATE_TABLE_PACKAGE_APP_APP_CONTROL, NULL, NULL, + &error_message)) { + DBG("Don't execute query = %s error message = %s\n", + QUERY_CREATE_TABLE_PACKAGE_APP_APP_CONTROL, error_message); + sqlite3_free(error_message); + return -1; + } + sqlite3_free(error_message); + return 0; +} + +static int __initialize_package_app_app_category_db() +{ + char *error_message = NULL; + if (SQLITE_OK != + sqlite3_exec(pkgmgr_parser_db, + QUERY_CREATE_TABLE_PACKAGE_APP_APP_CATEGORY, NULL, NULL, + &error_message)) { + DBG("Don't execute query = %s error message = %s\n", + QUERY_CREATE_TABLE_PACKAGE_APP_APP_CATEGORY, error_message); + sqlite3_free(error_message); + return -1; + } + sqlite3_free(error_message); + return 0; +} + +static int __initialize_package_app_app_svc_db() +{ + char *error_message = NULL; + if (SQLITE_OK != + sqlite3_exec(pkgmgr_parser_db, + QUERY_CREATE_TABLE_PACKAGE_APP_APP_SVC, NULL, NULL, + &error_message)) { + DBG("Don't execute query = %s error message = %s\n", + QUERY_CREATE_TABLE_PACKAGE_APP_APP_SVC, error_message); + sqlite3_free(error_message); + return -1; + } + sqlite3_free(error_message); + return 0; +} + +static int __initialize_package_app_share_allowed_db() +{ + char *error_message = NULL; + if (SQLITE_OK != + sqlite3_exec(pkgmgr_parser_db, + QUERY_CREATE_TABLE_PACKAGE_APP_SHARE_ALLOWED, NULL, + NULL, &error_message)) { + DBG("Don't execute query = %s error message = %s\n", + QUERY_CREATE_TABLE_PACKAGE_APP_SHARE_ALLOWED, + error_message); + sqlite3_free(error_message); + return -1; + } + sqlite3_free(error_message); + return 0; +} + +static int __initialize_package_app_share_request_db() +{ + char *error_message = NULL; + if (SQLITE_OK != + sqlite3_exec(pkgmgr_parser_db, + QUERY_CREATE_TABLE_PACKAGE_APP_SHARE_REQUEST, NULL, + NULL, &error_message)) { + DBG("Don't execute query = %s error message = %s\n", + QUERY_CREATE_TABLE_PACKAGE_APP_SHARE_REQUEST, + error_message); + sqlite3_free(error_message); + return -1; + } + sqlite3_free(error_message); + return 0; +} + +static int __exec_query(char *query) +{ + char *error_message = NULL; + if (SQLITE_OK != + sqlite3_exec(pkgmgr_parser_db, query, NULL, NULL, &error_message)) { + DBG("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 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 void __printfunc(gpointer data, gpointer userdata) +{ + DBG("%s ", (char*)data); +} + +static void __trimfunc1(gpointer data, gpointer userdata) +{ + if (prev) { + if (strcmp((char *)data, prev) == 0) { + pkglocale = g_list_remove(pkglocale, data); + } else + prev = (char *)data; + } + else + prev = (char *)data; +} + +static void __trimfunc2(gpointer data, gpointer userdata) +{ + if (prev) { + if (strcmp((char *)data, prev) == 0) { + applocale = g_list_remove(applocale, data); + } else + prev = (char *)data; + } + else + prev = (char *)data; +} + +static void __trimfunc3(gpointer data, gpointer userdata) +{ + if (prev) { + if (strcmp((char *)data, prev) == 0) { + appicon = g_list_remove(appicon, data); + } else + prev = (char *)data; + } + else + prev = (char *)data; +} + +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; +} + +static 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->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 **lang, char **icon, char **resolution) +{ + while(icn != NULL) + { + if (icn->section) { + if (strcmp(icn->section, (char *)data) == 0) { + *lang = (char*)icn->lang; + *icon = (char*)icn->text; + *resolution = (char*)icn->resolution; + break; + } + } + icn = icn->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[MAX_QUERY_LEN] = {'\0'}; + + 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; + snprintf(query, MAX_QUERY_LEN, "insert into package_localized_info(package, package_locale, " \ + "package_label, package_icon, package_description, package_license, package_author) values " \ + "('%s', '%s', '%s', '%s', '%s', '%s', '%s')", mfx->package, (char*)data, + label, icon, description, license, author); + ret = __exec_query(query); + if (ret == -1) + DBG("Package Localized Info DB Insert failed\n"); +} + +static void __insert_uiapplication_locale_info(gpointer data, gpointer userdata) +{ + int ret = -1; + char *label = NULL; + char *icon = NULL; + char query[MAX_QUERY_LEN] = {'\0'}; + + 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; + sqlite3_snprintf(MAX_QUERY_LEN, query, "insert into package_app_localized_info(app_id, app_locale, " \ + "app_label, app_icon) values " \ + "('%q', '%q', '%q', '%q')", up->appid, (char*)data, + label, icon); + ret = __exec_query(query); + if (ret == -1) + DBG("Package UiApp Localized Info DB Insert failed\n"); + +} + +static void __insert_uiapplication_icon_locale_info(gpointer data, gpointer userdata) +{ + int ret = -1; + char *lang = NULL; + char *icon = NULL; + char *resolution = NULL; + char query[MAX_QUERY_LEN] = {'\0'}; + + uiapplication_x *up = (uiapplication_x*)userdata; + icon_x *icn = up->icon; + + __extract_icon_data(data, icn, &lang, &icon, &resolution); + if (!lang && !icon && !resolution) + return; + sqlite3_snprintf(MAX_QUERY_LEN, query, "insert into package_app_icon_localized_info(app_id, app_locale, " \ + "app_icon, app_icon_section, app_icon_resolution) values " \ + "('%q', '%q', '%q', '%q', '%q')", up->appid, lang, + icon, (char*)data, resolution); + + ret = __exec_query(query); + if (ret == -1) + DBG("Package UiApp Localized Info DB Insert failed\n"); + +} + +static void __insert_serviceapplication_locale_info(gpointer data, gpointer userdata) +{ + int ret = -1; + char *icon = NULL; + char *label = NULL; + char query[MAX_QUERY_LEN] = {'\0'}; + + serviceapplication_x *sp = (serviceapplication_x*)userdata; + label_x *lbl = sp->label; + icon_x *icn = sp->icon; + + __extract_data(data, lbl, NULL, icn, NULL, NULL, &label, NULL, &icon, NULL, NULL); + if (!icon && !label) + return; + sqlite3_snprintf(MAX_QUERY_LEN, query, "insert into package_app_localized_info(app_id, app_locale, " \ + "app_label, app_icon) values " \ + "('%q', '%q', '%q', '%q')", sp->appid, (char*)data, + label, icon); + ret = __exec_query(query); + if (ret == -1) + DBG("Package ServiceApp Localized Info DB Insert failed\n"); +} + +static int __insert_ui_mainapp_info(manifest_x *mfx) +{ + uiapplication_x *up = mfx->uiapplication; + int ret = -1; + char query[MAX_QUERY_LEN] = {'\0'}; + while(up != NULL) + { + snprintf(query, MAX_QUERY_LEN, + "update package_app_info set app_mainapp='%s' where app_id='%s'", up->mainapp, up->appid); + + ret = __exec_query(query); + if (ret == -1) { + DBG("Package UiApp Info DB Insert Failed\n"); + return -1; + } + if (strcasecmp(up->mainapp, "True")==0) + mfx->mainapp_id = strdup(up->appid); + + up = up->next; + memset(query, '\0', MAX_QUERY_LEN); + } + + if (mfx->mainapp_id == NULL){ + snprintf(query, MAX_QUERY_LEN, + "update package_app_info set app_mainapp='true' where app_id='%s'", mfx->uiapplication->appid); + ret = __exec_query(query); + if (ret == -1) { + DBG("Package UiApp Info DB Insert Failed\n"); + return -1; + } + mfx->mainapp_id = strdup(mfx->uiapplication->appid); + } + + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, + "update package_info set mainapp_id='%s' where package='%s'", mfx->mainapp_id, mfx->package); + ret = __exec_query(query); + if (ret == -1) { + DBG("Package Info DB update Failed\n"); + return -1; + } + + return 0; +} + +static int __insert_uiapplication_info(manifest_x *mfx) +{ + uiapplication_x *up = mfx->uiapplication; + int ret = -1; + char query[MAX_QUERY_LEN] = {'\0'}; + while(up != NULL) + { + snprintf(query, MAX_QUERY_LEN, + "insert into package_app_info(app_id, app_component, app_exec, app_nodisplay, app_type, app_onboot, " \ + "app_multiple, app_autorestart, app_taskmanage, app_hwacceleration, app_mainapp , app_recentimage, package) " \ + "values('%s', '%s', '%s', '%s', '%s', '%s','%s', '%s', '%s', '%s', '%s', '%s', '%s')",\ + up->appid, "uiapp", up->exec, up->nodisplay, up->type, "\0", up->multiple, + "\0", up->taskmanage, up->hwacceleration,up->mainapp, up->recentimage, mfx->package); + ret = __exec_query(query); + if (ret == -1) { + DBG("Package UiApp Info DB Insert Failed\n"); + return -1; + } + up = up->next; + memset(query, '\0', MAX_QUERY_LEN); + } + 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[MAX_QUERY_LEN] = {'\0'}; + while(up != NULL) + { + ct = up->category; + while (ct != NULL) + { + snprintf(query, MAX_QUERY_LEN, + "insert into package_app_app_category(app_id, category) " \ + "values('%s','%s')",\ + up->appid, ct->name); + ret = __exec_query(query); + if (ret == -1) { + DBG("Package UiApp Category Info DB Insert Failed\n"); + return -1; + } + ct = ct->next; + memset(query, '\0', MAX_QUERY_LEN); + } + up = up->next; + } + return 0; +} + +static int __insert_uiapplication_appcontrol_info(manifest_x *mfx) +{ + uiapplication_x *up = mfx->uiapplication; + appcontrol_x *acontrol = NULL; + operation_x *op = NULL; + mime_x *mi = NULL; + uri_x *ui = NULL; + subapp_x *sub = NULL; + int ret = -1; + char query[MAX_QUERY_LEN] = {'\0'}; + char *operation = NULL; + char *mime = NULL; + char *uri = NULL; + char *subapp = NULL; + while(up != NULL) + { + acontrol = up->appcontrol; + while(acontrol != NULL) + { + op = acontrol->operation; + while(op != NULL) + { + if (op) + operation = op->name; + mi = acontrol->mime; + + do + { + if (mi) + mime = mi->name; + sub = acontrol->subapp; + do + { + if (sub) + subapp = sub->name; + ui = acontrol->uri; + do + { + if (ui) + uri = ui->name; + snprintf(query, MAX_QUERY_LEN, + "insert into package_app_app_control(app_id, operation, uri_scheme, mime_type, subapp_name) " \ + "values('%s', '%s', '%s', '%s', '%s')",\ + up->appid, operation, uri, mime, subapp); + + ret = __exec_query(query); + if (ret == -1) { + DBG("Package UiApp AppSvc DB Insert Failed\n"); + return -1; + } + memset(query, '\0', MAX_QUERY_LEN); + 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; + } + acontrol = acontrol->next; + } + up = up->next; + } + 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[MAX_QUERY_LEN] = {'\0'}; + char *operation = NULL; + char *mime = NULL; + char *uri = NULL; + 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; + snprintf(query, MAX_QUERY_LEN, + "insert into package_app_app_svc(app_id, operation, uri_scheme, mime_type, subapp_name) " \ + "values('%s', '%s', '%s', '%s', '%s')",\ + up->appid, operation, uri, mime, subapp); + + ret = __exec_query(query); + if (ret == -1) { + DBG("Package UiApp AppSvc DB Insert Failed\n"); + return -1; + } + memset(query, '\0', MAX_QUERY_LEN); + 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[MAX_QUERY_LEN] = {'\0'}; + while(up != NULL) + { + ds = up->datashare; + while(ds != NULL) + { + rq = ds->request; + while(rq != NULL) + { + snprintf(query, MAX_QUERY_LEN, + "insert into package_app_share_request(app_id, data_share_request) " \ + "values('%s', '%s')",\ + up->appid, rq->text); + ret = __exec_query(query); + if (ret == -1) { + DBG("Package UiApp Share Request DB Insert Failed\n"); + return -1; + } + memset(query, '\0', MAX_QUERY_LEN); + 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[MAX_QUERY_LEN] = {'\0'}; + while(up != NULL) + { + ds = up->datashare; + while(ds != NULL) + { + df = ds->define; + while(df != NULL) + { + al = df->allowed; + while(al != NULL) + { + snprintf(query, MAX_QUERY_LEN, + "insert into package_app_share_allowed(app_id, data_share_path, data_share_allowed) " \ + "values('%s', '%s', '%s')",\ + up->appid, df->path, al->text); + ret = __exec_query(query); + if (ret == -1) { + DBG("Package UiApp Share Allowed DB Insert Failed\n"); + return -1; + } + memset(query, '\0', MAX_QUERY_LEN); + al = al->next; + } + df = df->next; + } + ds = ds->next; + } + up = up->next; + } + return 0; +} + +static int __insert_serviceapplication_info(manifest_x *mfx) +{ + serviceapplication_x *sp = mfx->serviceapplication; + int ret = -1; + char query[MAX_QUERY_LEN] = {'\0'}; + while(sp != NULL) + { + snprintf(query, MAX_QUERY_LEN, + "insert into package_app_info(app_id, app_component, app_exec, app_nodisplay, app_type, app_onboot, " \ + "app_multiple, app_autorestart, package) " \ + "values('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')",\ + sp->appid, "svcapp", sp->exec, "\0", sp->type, sp->onboot, "\0", + sp->autorestart, mfx->package); + ret = __exec_query(query); + if (ret == -1) { + DBG("Package ServiceApp Info DB Insert Failed\n"); + return -1; + } + sp = sp->next; + memset(query, '\0', MAX_QUERY_LEN); + } + return 0; +} + +static int __insert_serviceapplication_appcategory_info(manifest_x *mfx) +{ + serviceapplication_x *sp = mfx->serviceapplication; + category_x *ct = NULL; + int ret = -1; + char query[MAX_QUERY_LEN] = {'\0'}; + while(sp != NULL) + { + ct = sp->category; + while (ct != NULL) + { + snprintf(query, MAX_QUERY_LEN, + "insert into package_app_app_category(app_id, category) " \ + "values('%s','%s')",\ + sp->appid, ct->name); + ret = __exec_query(query); + if (ret == -1) { + DBG("Package ServiceApp Category Info DB Insert Failed\n"); + return -1; + } + ct = ct->next; + memset(query, '\0', MAX_QUERY_LEN); + } + sp = sp->next; + } + return 0; +} + +static int __insert_serviceapplication_appcontrol_info(manifest_x *mfx) +{ + serviceapplication_x *sp = mfx->serviceapplication; + appcontrol_x *acontrol = NULL; + int ret = -1; + char query[MAX_QUERY_LEN] = {'\0'}; + operation_x *op = NULL; + mime_x *mi = NULL; + uri_x *ui = NULL; + subapp_x *sub = NULL; + char *operation = NULL; + char *mime = NULL; + char *uri = NULL; + char *subapp = NULL; + while(sp != NULL) + { + acontrol = sp->appcontrol; + while(acontrol != NULL) + { + op = acontrol->operation; + while(op != NULL) + { + if (op) + operation = op->name; + mi = acontrol->mime; + do + { + if (mi) + mime = mi->name; + sub = acontrol->subapp; + do + { + if (sub) + subapp = sub->name; + ui = acontrol->uri; + do + { + if (ui) + uri = ui->name; + snprintf(query, MAX_QUERY_LEN, + "insert into package_app_app_control(app_id, operation, uri_scheme, mime_type,subapp_name) " \ + "values('%s', '%s', '%s', '%s', '%s')",\ + sp->appid, operation, uri, mime, subapp); + ret = __exec_query(query); + if (ret == -1) { + DBG("Package UiApp AppSvc DB Insert Failed\n"); + return -1; + } + memset(query, '\0', MAX_QUERY_LEN); + 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; + } + acontrol = acontrol->next; + } + sp = sp->next; + } + return 0; +} + +static int __insert_serviceapplication_appsvc_info(manifest_x *mfx) +{ + serviceapplication_x *sp = mfx->serviceapplication; + appsvc_x *asvc = NULL; + int ret = -1; + char query[MAX_QUERY_LEN] = {'\0'}; + operation_x *op = NULL; + mime_x *mi = NULL; + uri_x *ui = NULL; + subapp_x *sub = NULL; + char *operation = NULL; + char *mime = NULL; + char *uri = NULL; + char *subapp = NULL; + while(sp != NULL) + { + asvc = sp->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; + snprintf(query, MAX_QUERY_LEN, + "insert into package_app_app_svc(app_id, operation, uri_scheme, mime_type, subapp_name) " \ + "values('%s', '%s', '%s', '%s', '%s')",\ + sp->appid, operation, uri, mime, subapp); + ret = __exec_query(query); + if (ret == -1) { + DBG("Package UiApp AppSvc DB Insert Failed\n"); + return -1; + } + memset(query, '\0', MAX_QUERY_LEN); + 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; + } + sp = sp->next; + } + return 0; +} + + + +static int __insert_serviceapplication_share_request_info(manifest_x *mfx) +{ + serviceapplication_x *sp = mfx->serviceapplication; + datashare_x *ds = NULL; + request_x *rq = NULL; + int ret = -1; + char query[MAX_QUERY_LEN] = {'\0'}; + while(sp != NULL) + { + ds = sp->datashare; + while(ds != NULL) + { + rq = ds->request; + while(rq != NULL) + { + snprintf(query, MAX_QUERY_LEN, + "insert into package_app_share_request(app_id, data_share_request) " \ + "values('%s', '%s')",\ + sp->appid, rq->text); + ret = __exec_query(query); + if (ret == -1) { + DBG("Package ServiceApp Share Request DB Insert Failed\n"); + return -1; + } + memset(query, '\0', MAX_QUERY_LEN); + rq = rq->next; + } + ds = ds->next; + } + sp = sp->next; + } + return 0; +} + + + +static int __insert_serviceapplication_share_allowed_info(manifest_x *mfx) +{ + serviceapplication_x *sp = mfx->serviceapplication; + datashare_x *ds = NULL; + define_x *df = NULL; + allowed_x *al = NULL; + int ret = -1; + char query[MAX_QUERY_LEN] = {'\0'}; + while(sp != NULL) + { + ds = sp->datashare; + while(ds != NULL) + { + df = ds->define; + while(df != NULL) + { + al = df->allowed; + while(al != NULL) + { + snprintf(query, MAX_QUERY_LEN, + "insert into package_app_share_allowed(app_id, data_share_path, data_share_allowed) " \ + "values('%s', '%s', '%s')",\ + sp->appid, df->path, al->text); + ret = __exec_query(query); + if (ret == -1) { + DBG("Package App Share Allowed DB Insert Failed\n"); + return -1; + } + memset(query, '\0', MAX_QUERY_LEN); + al = al->next; + } + df = df->next; + } + ds = ds->next; + } + sp = sp->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; + serviceapplication_x *sp = mfx->serviceapplication; + char query[MAX_QUERY_LEN] = { '\0' }; + int ret = -1; + char *type = NULL; + char *auth_name = NULL; + char *auth_email = NULL; + char *auth_href = 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"); + snprintf(query, MAX_QUERY_LEN, + "insert into package_info(package, package_type, package_version, install_location, package_size, " \ + "package_removable, package_preload, package_readonly, author_name, author_email, author_href, installed_time, storeclient_id, mainapp_id, package_url) " \ + "values('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')",\ + mfx->package, type, mfx->version, mfx->installlocation, mfx->package_size, mfx->removable, mfx->preload, + mfx->readonly, auth_name, auth_email, auth_href, mfx->installed_time, mfx->storeclient_id, mfx->mainapp_id, mfx->package_url); + ret = __exec_query(query); + if (ret == -1) { + DBG("Package Info DB Insert Failed\n"); + if (type) { + free(type); + type = NULL; + } + return -1; + } + if (type) { + free(type); + type = NULL; + } + /*Insert the package locale and app locale info */ + pkglocale = __create_locale_list(pkglocale, lbl, lcn, icn, dcn, ath); + g_list_foreach(pkglocale, __trimfunc1, NULL); + prev = NULL; + + while(up != NULL) + { + applocale = __create_locale_list(applocale, up->label, NULL, up->icon, NULL, NULL); + up = up->next; + } + while(sp != NULL) + { + applocale = __create_locale_list(applocale, sp->label, NULL, sp->icon, NULL, NULL); + sp = sp->next; + } + g_list_foreach(applocale, __trimfunc2, NULL); + prev = NULL; + + /*Insert the app icon info */ + while(up_icn != NULL) + { + appicon = __create_icon_list(appicon, up_icn->icon); + up_icn = up_icn->next; + } + g_list_foreach(appicon, __trimfunc3, NULL); + prev = NULL; + + /*g_list_foreach(pkglocale, __printfunc, NULL);*/ + /*DBG("\n");*/ + /*g_list_foreach(applocale, __printfunc, NULL);*/ + + /*package locale info*/ + 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; + } + /*agent app locale info*/ + sp = mfx->serviceapplication; + while(sp != NULL) + { + g_list_foreach(applocale, __insert_serviceapplication_locale_info, (gpointer)sp); + sp = sp->next; + } + + /*app icon locale info*/ + up_icn = mfx->uiapplication; + while(up_icn != NULL) + { + g_list_foreach(appicon, __insert_uiapplication_icon_locale_info, (gpointer)up_icn); + up_icn = up_icn->next; + } + + g_list_free(pkglocale); + pkglocale = NULL; + g_list_free(applocale); + applocale = NULL; + g_list_free(appicon); + appicon = NULL; + + + /*Insert in the package_app_info DB*/ + ret = __insert_uiapplication_info(mfx); + if (ret == -1) + return -1; + ret = __insert_ui_mainapp_info(mfx); + if (ret == -1) + return -1; + ret = __insert_serviceapplication_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; + ret = __insert_serviceapplication_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; + ret = __insert_serviceapplication_appcategory_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; + ret = __insert_serviceapplication_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; + ret = __insert_serviceapplication_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; + ret = __insert_serviceapplication_share_request_info(mfx); + if (ret == -1) + return -1; + + return 0; + +} + +static int __delete_cert_info_from_db(manifest_x *mfx) +{ + char query[MAX_QUERY_LEN] = { '\0' }; + int ret = -1; + char *error_message = NULL; + + ret = __pkgmgr_parser_cert_create_db(); + if (ret == -1) { + DBG("Failed to open DB\n"); + return ret; + } + + /*Begin transaction*/ + ret = sqlite3_exec(pkgmgr_cert_db, "BEGIN EXCLUSIVE", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + DBG("Failed to begin transaction\n"); + sqlite3_close(pkgmgr_cert_db); + return -1; + } + DBG("Transaction Begin\n"); + snprintf(query, MAX_QUERY_LEN, + "delete from package_cert_info where package='%s'", mfx->package); + + if (SQLITE_OK != + sqlite3_exec(pkgmgr_cert_db, query, NULL, NULL, &error_message)) { + DBG("Don't execute query = %s error message = %s\n", query, + error_message); + ret = -1; + } + sqlite3_free(error_message); + + if (ret == -1) { + DBG("Delete from DB failed. Rollback now\n"); + sqlite3_exec(pkgmgr_cert_db, "ROLLBACK", NULL, NULL, NULL); + sqlite3_close(pkgmgr_cert_db); + return -1; + } + /*Commit transaction*/ + ret = sqlite3_exec(pkgmgr_cert_db, "COMMIT", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + DBG("Failed to commit transaction, Rollback now\n"); + sqlite3_exec(pkgmgr_cert_db, "ROLLBACK", NULL, NULL, NULL); + sqlite3_close(pkgmgr_cert_db); + return -1; + } + DBG("Transaction Commit and End\n"); + sqlite3_free(error_message); + sqlite3_close(pkgmgr_cert_db); + return 0; + +} + +static int __delete_manifest_info_from_db(manifest_x *mfx) +{ + char query[MAX_QUERY_LEN] = { '\0' }; + int ret = -1; + uiapplication_x *up = mfx->uiapplication; + serviceapplication_x *sp = mfx->serviceapplication; + + ret = __delete_cert_info_from_db(mfx); + if (ret == -1) { + DBG("Package cert DB Delete Failed\n"); + return -1; + } + + /*Delete from Package Info DB*/ + snprintf(query, MAX_QUERY_LEN, + "delete from package_info where package='%s'", mfx->package); + ret = __exec_query(query); + if (ret == -1) { + DBG("Package Info DB Delete Failed\n"); + return -1; + } + memset(query, '\0', MAX_QUERY_LEN); + + /*Delete from Package Localized Info*/ + snprintf(query, MAX_QUERY_LEN, + "delete from package_localized_info where package='%s'", mfx->package); + ret = __exec_query(query); + if (ret == -1) { + DBG("Package Localized Info DB Delete Failed\n"); + return -1; + } + memset(query, '\0', MAX_QUERY_LEN); + + /*Delete from Package App Info*/ + while(up != NULL) + { + snprintf(query, MAX_QUERY_LEN, + "delete from package_app_info where app_id='%s'", up->appid); + ret = __exec_query(query); + if (ret == -1) { + DBG("Package App Info DB Delete Failed\n"); + return -1; + } + memset(query, '\0', MAX_QUERY_LEN); + up = up->next; + } + while(sp != NULL) + { + snprintf(query, MAX_QUERY_LEN, + "delete from package_app_info where app_id='%s'", sp->appid); + ret = __exec_query(query); + if (ret == -1) { + DBG("Package App Info DB Delete Failed\n"); + return -1; + } + memset(query, '\0', MAX_QUERY_LEN); + sp = sp->next; + } + + /*Delete from Package App Localized Info*/ + up = mfx->uiapplication; + sp = mfx->serviceapplication; + while(up != NULL) + { + snprintf(query, MAX_QUERY_LEN, + "delete from package_app_localized_info where app_id='%s'", up->appid); + ret = __exec_query(query); + if (ret == -1) { + DBG("Package App Localized Info DB Delete Failed\n"); + return -1; + } + memset(query, '\0', MAX_QUERY_LEN); + up = up->next; + } + while(sp != NULL) + { + snprintf(query, MAX_QUERY_LEN, + "delete from package_app_localized_info where app_id='%s'", sp->appid); + ret = __exec_query(query); + if (ret == -1) { + DBG("Package App Localized Info DB Delete Failed\n"); + return -1; + } + memset(query, '\0', MAX_QUERY_LEN); + sp = sp->next; + } + + /*Delete from Package App App-Svc*/ + up = mfx->uiapplication; + sp = mfx->serviceapplication; + while(up != NULL) + { + snprintf(query, MAX_QUERY_LEN, + "delete from package_app_app_svc where app_id='%s'", up->appid); + ret = __exec_query(query); + if (ret == -1) { + DBG("Package App App-Svc DB Delete Failed\n"); + return -1; + } + memset(query, '\0', MAX_QUERY_LEN); + up = up->next; + } + while(sp != NULL) + { + snprintf(query, MAX_QUERY_LEN, + "delete from package_app_app_svc where app_id='%s'", sp->appid); + ret = __exec_query(query); + if (ret == -1) { + DBG("Package App App-Svc DB Delete Failed\n"); + return -1; + } + memset(query, '\0', MAX_QUERY_LEN); + sp = sp->next; + } + + /*Delete from Package App App-Control*/ + up = mfx->uiapplication; + sp = mfx->serviceapplication; + while(up != NULL) + { + snprintf(query, MAX_QUERY_LEN, + "delete from package_app_app_control where app_id='%s'", up->appid); + ret = __exec_query(query); + if (ret == -1) { + DBG("Package App App-Control DB Delete Failed\n"); + return -1; + } + memset(query, '\0', MAX_QUERY_LEN); + up = up->next; + } + while(sp != NULL) + { + snprintf(query, MAX_QUERY_LEN, + "delete from package_app_app_control where app_id='%s'", sp->appid); + ret = __exec_query(query); + if (ret == -1) { + DBG("Package App App-Control DB Delete Failed\n"); + return -1; + } + memset(query, '\0', MAX_QUERY_LEN); + sp = sp->next; + } + + /*Delete from Package App App-Category*/ + up = mfx->uiapplication; + sp = mfx->serviceapplication; + while(up != NULL) + { + snprintf(query, MAX_QUERY_LEN, + "delete from package_app_app_category where app_id='%s'", up->appid); + ret = __exec_query(query); + if (ret == -1) { + DBG("Package App App-Category DB Delete Failed\n"); + return -1; + } + memset(query, '\0', MAX_QUERY_LEN); + up = up->next; + } + while(sp != NULL) + { + snprintf(query, MAX_QUERY_LEN, + "delete from package_app_app_category where app_id='%s'", sp->appid); + ret = __exec_query(query); + if (ret == -1) { + DBG("Package App App-Category DB Delete Failed\n"); + return -1; + } + memset(query, '\0', MAX_QUERY_LEN); + sp = sp->next; + } + + /*Delete from Package App Share Allowed*/ + up = mfx->uiapplication; + sp = mfx->serviceapplication; + while(up != NULL) + { + snprintf(query, MAX_QUERY_LEN, + "delete from package_app_share_allowed where app_id='%s'", up->appid); + ret = __exec_query(query); + if (ret == -1) { + DBG("Package App Share Allowed DB Delete Failed\n"); + return -1; + } + memset(query, '\0', MAX_QUERY_LEN); + up = up->next; + } + while(sp != NULL) + { + snprintf(query, MAX_QUERY_LEN, + "delete from package_app_share_allowed where app_id='%s'", sp->appid); + ret = __exec_query(query); + if (ret == -1) { + DBG("Package App Share Allowed DB Delete Failed\n"); + return -1; + } + memset(query, '\0', MAX_QUERY_LEN); + sp = sp->next; + } + + /*Delete from Package App Share Request*/ + up = mfx->uiapplication; + sp = mfx->serviceapplication; + while(up != NULL) + { + snprintf(query, MAX_QUERY_LEN, + "delete from package_app_share_request where app_id='%s'", up->appid); + ret = __exec_query(query); + if (ret == -1) { + DBG("Package App Share Request DB Delete Failed\n"); + return -1; + } + memset(query, '\0', MAX_QUERY_LEN); + up = up->next; + } + while(sp != NULL) + { + snprintf(query, MAX_QUERY_LEN, + "delete from package_app_share_request where app_id='%s'", sp->appid); + ret = __exec_query(query); + if (ret == -1) { + DBG("Package App Share Request DB Delete Failed\n"); + return -1; + } + memset(query, '\0', MAX_QUERY_LEN); + sp = sp->next; + } + return 0; +} + + +int pkgmgr_parser_initialize_db() +{ + int ret = -1; + ret = __initialize_package_info_db(); + if (ret == -1) { + DBG("package info DB initialization failed\n"); + return ret; + } + ret = __initialize_package_localized_info_db(); + if (ret == -1) { + DBG("package localized info DB initialization failed\n"); + return ret; + } + ret = __initialize_package_cert_info_db(); + if (ret == -1) { + DBG("package cert info DB initialization failed\n"); + return ret; + } + ret = __initialize_package_app_info_db(); + if (ret == -1) { + DBG("package app info DB initialization failed\n"); + return ret; + } + ret = __initialize_package_app_localized_info_db(); + if (ret == -1) { + DBG("package app localized info DB initialization failed\n"); + return ret; + } + ret = __initialize_package_app_icon_localized_info_db(); + if (ret == -1) { + DBG("package app icon localized info DB initialization failed\n"); + return ret; + } + ret = __initialize_package_app_app_control_db(); + if (ret == -1) { + DBG("package app app control DB initialization failed\n"); + return ret; + } + ret = __initialize_package_app_app_category_db(); + if (ret == -1) { + DBG("package app app category DB initialization failed\n"); + return ret; + } + ret = __initialize_package_app_app_svc_db(); + if (ret == -1) { + DBG("package app app svc DB initialization failed\n"); + return ret; + } + ret = __initialize_package_app_share_allowed_db(); + if (ret == -1) { + DBG("package app share allowed DB initialization failed\n"); + return ret; + } + ret = __initialize_package_app_share_request_db(); + if (ret == -1) { + DBG("package app share request DB initialization failed\n"); + return ret; + } + return 0; +} + +int pkgmgr_parser_check_and_create_db() +{ + int ret = -1; + if (access(PKGMGR_PARSER_DB_FILE, F_OK) == 0) { + ret = + db_util_open(PKGMGR_PARSER_DB_FILE, &pkgmgr_parser_db, + DB_UTIL_REGISTER_HOOK_METHOD); + if (ret != SQLITE_OK) { + DBG("connect db [%s] failed!\n", + PKGMGR_PARSER_DB_FILE); + return -1; + } + return 0; + } + DBG("Pkgmgr DB does not exists. Create one!!\n"); + + ret = + db_util_open(PKGMGR_PARSER_DB_FILE, &pkgmgr_parser_db, + DB_UTIL_REGISTER_HOOK_METHOD); + + if (ret != SQLITE_OK) { + DBG("connect db [%s] failed!\n", PKGMGR_PARSER_DB_FILE); + return -1; + } + return 0; +} + +API int pkgmgr_parser_insert_manifest_info_in_db(manifest_x *mfx) +{ + if (mfx == NULL) { + DBG("manifest pointer is NULL\n"); + return -1; + } + int ret = -1; + ret = pkgmgr_parser_check_and_create_db(); + if (ret == -1) { + DBG("Failed to open DB\n"); + return ret; + } + ret = pkgmgr_parser_initialize_db(); + if (ret == -1) + return ret; + /*Begin transaction*/ + ret = sqlite3_exec(pkgmgr_parser_db, "BEGIN EXCLUSIVE", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + DBG("Failed to begin transaction\n"); + sqlite3_close(pkgmgr_parser_db); + return -1; + } + DBG("Transaction Begin\n"); + ret = __insert_manifest_info_in_db(mfx); + if (ret == -1) { + DBG("Insert into DB failed. Rollback now\n"); + sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); + sqlite3_close(pkgmgr_parser_db); + return -1; + } + /*Commit transaction*/ + ret = sqlite3_exec(pkgmgr_parser_db, "COMMIT", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + DBG("Failed to commit transaction. Rollback now\n"); + sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); + sqlite3_close(pkgmgr_parser_db); + return -1; + } + DBG("Transaction Commit and End\n"); + sqlite3_close(pkgmgr_parser_db); + return 0; +} + +API int pkgmgr_parser_update_manifest_info_in_db(manifest_x *mfx) +{ + if (mfx == NULL) { + DBG("manifest pointer is NULL\n"); + return -1; + } + int ret = -1; + ret = pkgmgr_parser_check_and_create_db(); + if (ret == -1) { + DBG("Failed to open DB\n"); + return ret; + } + ret = pkgmgr_parser_initialize_db(); + if (ret == -1) + return ret; + + /*Begin transaction*/ + ret = sqlite3_exec(pkgmgr_parser_db, "BEGIN EXCLUSIVE", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + DBG("Failed to begin transaction\n"); + sqlite3_close(pkgmgr_parser_db); + return -1; + } + DBG("Transaction Begin\n"); + ret = __delete_manifest_info_from_db(mfx); + if (ret == -1) { + DBG("Delete from DB failed. Rollback now\n"); + sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); + sqlite3_close(pkgmgr_parser_db); + return -1; + } + ret = __insert_manifest_info_in_db(mfx); + if (ret == -1) { + DBG("Insert into DB failed. Rollback now\n"); + sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); + sqlite3_close(pkgmgr_parser_db); + return -1; + } + + /*Commit transaction*/ + ret = sqlite3_exec(pkgmgr_parser_db, "COMMIT", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + DBG("Failed to commit transaction. Rollback now\n"); + sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); + sqlite3_close(pkgmgr_parser_db); + return -1; + } + DBG("Transaction Commit and End\n"); + sqlite3_close(pkgmgr_parser_db); + return 0; +} + +API int pkgmgr_parser_delete_manifest_info_from_db(manifest_x *mfx) +{ + if (mfx == NULL) { + DBG("manifest pointer is NULL\n"); + return -1; + } + int ret = -1; + ret = pkgmgr_parser_check_and_create_db(); + if (ret == -1) { + DBG("Failed to open DB\n"); + return ret; + } + /*Begin transaction*/ + ret = sqlite3_exec(pkgmgr_parser_db, "BEGIN EXCLUSIVE", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + DBG("Failed to begin transaction\n"); + sqlite3_close(pkgmgr_parser_db); + return -1; + } + DBG("Transaction Begin\n"); + ret = __delete_manifest_info_from_db(mfx); + if (ret == -1) { + DBG("Delete from DB failed. Rollback now\n"); + sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); + sqlite3_close(pkgmgr_parser_db); + return -1; + } + /*Commit transaction*/ + ret = sqlite3_exec(pkgmgr_parser_db, "COMMIT", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + DBG("Failed to commit transaction, Rollback now\n"); + sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); + sqlite3_close(pkgmgr_parser_db); + return -1; + } + DBG("Transaction Commit and End\n"); + sqlite3_close(pkgmgr_parser_db); + return 0; +} diff --git a/parser/pkgmgr_parser_db.h b/parser/pkgmgr_parser_db.h new file mode 100755 index 0000000..6da045a --- /dev/null +++ b/parser/pkgmgr_parser_db.h @@ -0,0 +1,138 @@ +/* + * pkgmgr-info + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +/** + * @file pkgmgr_parser_db.h + * @author Shobhit Srivastava + * @version 0.1 + * @brief This file declares API to store/retrieve manifest data in DB + * + * @addtogroup APPLICATION_FRAMEWORK + * @{ + * + * @defgroup PackageManagerParserDB + * @section Header Header file to include: + * @code + * #include + * @endcode + * + * @} + */ + +#ifndef __PKGMGR_PARSER_DB_H__ +#define __PKGMGR_PARSER_DB_H__ + +#ifdef __cplusplus +extern "C" { +#endif +#include "pkgmgr_parser.h" + +/** + * @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_check_and_create_db(); +int pkgmgr_parser_initialize_db(); +/** @} */ +#ifdef __cplusplus +} +#endif +#endif /* __PKGMGR_PARSER_DB_H__ */ +/** + * @} + * @} + */ diff --git a/parser/pkgmgr_parser_internal.h b/parser/pkgmgr_parser_internal.h new file mode 100755 index 0000000..7d422b3 --- /dev/null +++ b/parser/pkgmgr_parser_internal.h @@ -0,0 +1,59 @@ +/* + * pkgmgr-info + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + + + + +#ifndef __PKGMGR_PARSER_INTERNAL_H__ +#define __PKGMGR_PARSER_INTERNAL_H__ + + +/* debug output */ +#if defined(NDEBUG) +#define DBG(fmt, args...) +#define __SET_DBG_OUTPUT(fp) +#elif defined(PRINT) +#include +FILE *___log = NULL; +#define DBG(fmt, args...) \ + {if (!___log) ___log = stderr; \ + fprintf(___log, "[DBG:PMS]%s:%d:%s(): " fmt "\n",\ + basename(__FILE__), __LINE__, __func__, ##args); fflush(___log); } +#define __SET_DBG_OUTPUT(fp) \ + (___log = fp) +#else +#include +#undef LOG_TAG +#define LOG_TAG "PKGMGR_PARSER" + +#define DBGE(fmt, arg...) LOGE(fmt,##arg) +#define DBG(fmt, arg...) LOGD(fmt,##arg) +#endif + + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + + +#endif /* __PKGMGR_PARSER_INTERNAL_H__ */ diff --git a/parser/preload_list.txt.in b/parser/preload_list.txt.in new file mode 100755 index 0000000..d2e6296 --- /dev/null +++ b/parser/preload_list.txt.in @@ -0,0 +1,88 @@ +#RW_NORM +org.tizen.ag-hello +org.tizen.app-tray +org.tizen.bluetooth-share-ui +org.tizen.bluetooth +org.tizen.browser +org.tizen.bt-appsvc +org.tizen.bt-syspopup +org.tizen.calculator +org.tizen.calendar-viewer +org.tizen.calendar +org.tizen.call-eq-analyzer +org.tizen.call +org.tizen.camera-app +org.tizen.ciss +org.tizen.clock +org.tizen.cluster-home +org.tizen.contacts-viewer +org.tizen.contacts +org.tizen.dailybriefing-accuweather +org.tizen.dailybriefing-agent +org.tizen.dailybriefing-apnews +org.tizen.dailybriefing-ynews +org.tizen.dailybriefing-yfinance +org.tizen.data-provider-slave +org.tizen.download-provider +org.tizen.draglock +org.tizen.eas-appsvc +org.tizen.email +org.tizen.ereader +org.tizen.facebook-service +org.tizen.facebook +org.tizen.fileshare-service +org.tizen.fm-radio +org.tizen.gallery +org.tizen.idle-lock +org.tizen.image-editor +org.tizen.image-viewer +org.tizen.keystrings +org.tizen.kies-via-wifi +org.tizen.livebox-3d-lock +org.tizen.lowbat-syspopup +org.tizen.lowmem-syspopup +org.tizen.mdm-app +org.tizen.mdm-syspopup +org.tizen.memo +org.tizen.menu-screen +org.tizen.message +org.tizen.mobileprint +org.tizen.msg-ui-class0 +org.tizen.music-player +org.tizen.myfile +org.tizen.nfc-app +org.tizen.phone-lock +org.tizen.phone +org.tizen.picasa +org.tizen.poweroff-syspopup +org.tizen.pwlock +org.tizen.ring +org.tizen.setting +org.tizen.smartsearch +org.tizen.sound-player +org.tizen.system-panel +org.tizen.taskmgr +org.tizen.tethering +org.tizen.tickernoti-syspopup +org.tizen.usb-printer-detector +org.tizen.usbotg-syspopup +org.tizen.voicerecorder +org.tizen.volume +org.tizen.vtmain +org.tizen.wifi-direct-popup +org.tizen.wifi-direct-ugapp +org.tizen.youtube +activesync-ui +org.tizen.rcs-im +org.tizen.ims-syspopup +aospd00043 +cp7ipabg4k +57r43275q7 +q7097a278m +800ij447xl +70lsyzhkse +nas9xepmna + +#RW_RM +org.tizen.video-player +org.tizen.spotify diff --git a/parser/xml.xsd.in b/parser/xml.xsd.in new file mode 100755 index 0000000..855c21c --- /dev/null +++ b/parser/xml.xsd.in @@ -0,0 +1,5 @@ + + + + + diff --git a/parser_path.conf.in b/parser_path.conf.in new file mode 100755 index 0000000..f18cb8a --- /dev/null +++ b/parser_path.conf.in @@ -0,0 +1,4 @@ +# usage +# parserlib:directory_path + +parserlib:/usr/etc/package-manager/parserlib/ diff --git a/pkgmgr-info.manifest b/pkgmgr-info.manifest new file mode 100644 index 0000000..24f0a03 --- /dev/null +++ b/pkgmgr-info.manifest @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/pkgmgr-info.pc.in b/pkgmgr-info.pc.in new file mode 100755 index 0000000..86ed8ad --- /dev/null +++ b/pkgmgr-info.pc.in @@ -0,0 +1,12 @@ +# Package Information for pkg-config + +prefix=/usr +exec_prefix=${prefix} +libdir=${prefix}/lib +includedir=${prefix}/include + +Name: pkgmgr-info +Description: Simple string key/val dictionary library +Version: @VERSION@ +Libs: -L${libdir} -lpkgmgr-info +Cflags: -I${includedir} diff --git a/pkgmgr-parser.manifest b/pkgmgr-parser.manifest new file mode 100755 index 0000000..ec7caa6 --- /dev/null +++ b/pkgmgr-parser.manifest @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/pkgmgr-info-internal.c b/src/pkgmgr-info-internal.c new file mode 100755 index 0000000..bc399d3 --- /dev/null +++ b/src/pkgmgr-info-internal.c @@ -0,0 +1,210 @@ +/* + * pkgmgr-info + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include +#include "pkgmgr-info.h" +#include "pkgmgr-info-internal.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_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} +}; + +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} +}; + +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} +}; + +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_EXEC, PMINFO_APPINFO_PROP_APP_EXEC}, + {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} +}; + +struct _appinfo_int_map_t { + pkgmgrinfo_appinfo_filter_prop_int prop; + const char *property; +}; + +static struct _appinfo_int_map_t appinfo_int_prop_map[] = { + /*Currently No Fields*/ +}; + +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} +}; + +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; +} diff --git a/src/pkgmgr-info.c b/src/pkgmgr-info.c new file mode 100755 index 0000000..588ec99 --- /dev/null +++ b/src/pkgmgr-info.c @@ -0,0 +1,6939 @@ +/* + * pkgmgr-info + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "pkgmgr_parser.h" +#include "pkgmgr-info-internal.h" +#include "pkgmgr-info.h" +#include +#include + +#define ASC_CHAR(s) (const char *)s +#define XML_CHAR(s) (const xmlChar *)s + +#define MANIFEST_DB "/opt/dbspace/.pkgmgr_parser.db" +#define MAX_QUERY_LEN 4096 +#define CERT_DB "/opt/dbspace/.pkgmgr_cert.db" +#define DATACONTROL_DB "/opt/usr/dbspace/.app-package.db" +#define PKG_TYPE_STRING_LEN_MAX 128 +#define PKG_VERSION_STRING_LEN_MAX 128 +#define PKG_VALUE_STRING_LEN_MAX 512 +#define PKG_RW_PATH "/opt/usr/apps/" +#define PKG_RO_PATH "/usr/apps/" +#define BLOCK_SIZE 4096 /*in bytes*/ + +#define MMC_PATH "/opt/storage/sdcard" +#define PKG_SD_PATH MMC_PATH"/app2sd/" +#define PKG_INSTALLATION_PATH "/opt/usr/apps/" + +#define FILTER_QUERY_COUNT_PACKAGE "select count(DISTINCT package_info.package) " \ + "from package_info LEFT OUTER JOIN package_localized_info " \ + "ON package_info.package=package_localized_info.package " \ + "and package_localized_info.package_locale='%s' where " + +#define FILTER_QUERY_LIST_PACKAGE "select DISTINCT package_info.package " \ + "from package_info LEFT OUTER JOIN package_localized_info " \ + "ON package_info.package=package_localized_info.package " \ + "and package_localized_info.package_locale='%s' where " + +#define FILTER_QUERY_COUNT_APP "select count(DISTINCT package_app_info.app_id) " \ + "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.app_id, package_app_info.app_component " \ + "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 retv_if(expr, val) do { \ + if(expr) { \ + _LOGE("(%s) -> %s() return\n", #expr, __FUNCTION__); \ + return (val); \ + } \ +} while (0) + +#define LANGUAGE_LENGTH 2 + +typedef struct _pkgmgr_instcertinfo_x { + char *pkgid; + char *auth_signer_cert; + char *auth_im_cert; + char *auth_root_cert; + char *dist_signer_cert; + char *dist_im_cert; + char *dist_root_cert; + char *dist2_signer_cert; + char *dist2_im_cert; + char *dist2_root_cert; +} pkgmgr_instcertinfo_x; + +sqlite3 *cert_db = NULL; + +typedef struct _pkgmgr_pkginfo_x { + manifest_x *manifest_info; + char *tmp; + char *tmp_dup; + + struct _pkgmgr_pkginfo_x *prev; + struct _pkgmgr_pkginfo_x *next; +} pkgmgr_pkginfo_x; + +typedef struct _pkgmgr_cert_x { + const char *pkgid; + const char *certvalue; +} pkgmgr_cert_x; + +typedef struct _pkgmgr_datacontrol_x { + char *appid; + char *access; +} pkgmgr_datacontrol_x; + +typedef struct _pkgmgr_iconpath_x { + char *appid; + char *iconpath; +} pkgmgr_iconpath_x; + +typedef struct _pkgmgr_locale_x { + char *locale; +} pkgmgr_locale_x; + +typedef struct _pkgmgr_appinfo_x { + const char *package; + pkgmgrinfo_app_component app_component; + union { + uiapplication_x *uiapp_info; + serviceapplication_x *svcapp_info; + }; +} pkgmgr_appinfo_x; + +typedef struct _pkgmgr_certinfo_x { + char *pkgid; + char *auth_signer_cert; + char *auth_im_cert; + char *auth_root_cert; + char *dist_signer_cert; + char *dist_im_cert; + char *dist_root_cert; + char *dist2_signer_cert; + char *dist2_im_cert; + char *dist2_root_cert; +} pkgmgr_certinfo_x; + +/*For filter APIs*/ +typedef struct _pkgmgrinfo_filter_x { + GSList *list; +} pkgmgrinfo_filter_x; + +typedef struct _pkgmgrinfo_node_x { + int prop; + char *value; +} pkgmgrinfo_node_x; + +typedef struct _pkgmgrinfo_appcontrol_x { + int operation_count; + int uri_count; + int mime_count; + char **operation; + char **uri; + char **mime; +} pkgmgrinfo_appcontrol_x; + +typedef int (*sqlite_query_callback)(void *data, int ncols, char **coltxt, char **colname); + +char *pkgtype = "rpm"; +sqlite3 *manifest_db = NULL; +sqlite3 *datacontrol_db = NULL; +int gflag[9];/*one for each cert type*/ +char *gpkgcert[9];/*To store pkg cert values*/ + +static int __open_manifest_db(); +static int __exec_pkginfo_query(char *query, void *data); +static int __exec_appinfo_query(char *query, void *data); +static int __exec_certinfo_query(char *query, void *data); +static int __exec_sqlite_query(char *query, sqlite_query_callback callback, void *data); +static int __pkginfo_cb(void *data, int ncols, char **coltxt, char **colname); +static int __appinfo_cb(void *data, int ncols, char **coltxt, char **colname); +static int __certinfo_cb(void *data, int ncols, char **coltxt, char **colname); +static int __validate_cb(void *data, int ncols, char **coltxt, char **colname); +static int __delete_certinfo_cb(void *data, int ncols, char **coltxt, char **colname); +static int __count_cb(void *data, int ncols, char **coltxt, char **colname); +static int __uiapp_list_cb(void *data, int ncols, char **coltxt, char **colname); +static int __svcapp_list_cb(void *data, int ncols, char **coltxt, char **colname); +static int __pkg_list_cb(void *data, int ncols, char **coltxt, char **colname); +static int __app_list_cb(void *data, int ncols, char **coltxt, char **colname); +static int __pkgmgr_appinfo_new_handle_id(); +static int __pkgmgr_pkginfo_new_handle_id(); +static void __cleanup_pkginfo(pkgmgr_pkginfo_x *data); +static void __cleanup_appinfo(pkgmgr_appinfo_x *data); +static char* __convert_system_locale_to_manifest_locale(char *syslocale); +static void __destroy_each_node(gpointer data, gpointer user_data); +static void __get_filter_condition(gpointer data, char **condition); +static gint __compare_func(gconstpointer data1, gconstpointer data2); + +static 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; +} + +static int __count_cb(void *data, int ncols, char **coltxt, char **colname) +{ + int *p = (int*)data; + *p = atoi(coltxt[0]); + _LOGE("count value is %d\n", *p); + return 0; +} + +static void __destroy_each_node(gpointer data, gpointer user_data) +{ + if (data == NULL) + return; + pkgmgrinfo_node_x *node = (pkgmgrinfo_node_x*)data; + if (node->value) { + free(node->value); + node->value = NULL; + } + free(node); + node = NULL; +} + +static 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_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_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_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_EXEC: + snprintf(buf, MAX_QUERY_LEN, "package_app_info.app_exec='%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; + default: + _LOGE("Invalid Property Type\n"); + *condition = NULL; + return; + } + *condition = strdup(buf); + return; +} + +static char* __convert_system_locale_to_manifest_locale(char *syslocale) +{ + if (syslocale == NULL) + return strdup(DEFAULT_LOCALE); + char *locale = NULL; + locale = (char *)calloc(1, 6); + if (!locale) { + _LOGE("Malloc Failed\n"); + return NULL; + } + strncpy(locale, syslocale, 2); + strncat(locale, "-", 1); + locale[3] = syslocale[3] + 32; + locale[4] = syslocale[4] + 32; + return locale; +} + +static void __cleanup_pkginfo(pkgmgr_pkginfo_x *data) +{ + if (data == NULL) + return; + if (data->tmp_dup){ + free((void *)data->tmp_dup); + data->tmp_dup = NULL; + } + + pkgmgr_parser_free_manifest_xml(data->manifest_info); + free((void *)data); + data = NULL; + return; +} + +static void __cleanup_appinfo(pkgmgr_appinfo_x *data) +{ + if (data == NULL) + return; + if (data->package){ + free((void *)data->package); + data->package = NULL; + } + + manifest_x *mfx = calloc(1, sizeof(manifest_x)); + if (data->app_component == PMINFO_UI_APP) + mfx->uiapplication = data->uiapp_info; + else if (data->app_component == PMINFO_SVC_APP) + mfx->serviceapplication = data->svcapp_info; + pkgmgr_parser_free_manifest_xml(mfx); + free((void *)data); + data = NULL; + return; +} + +static int __open_manifest_db() +{ + int ret = -1; + if (access(MANIFEST_DB, F_OK) == 0) { + ret = + db_util_open_with_options(MANIFEST_DB, &manifest_db, + SQLITE_OPEN_READONLY, NULL); + if (ret != SQLITE_OK) { + _LOGE("connect db [%s] failed!\n", MANIFEST_DB); + return -1; + } + return 0; + } + _LOGE("Manifest DB does not exists !!\n"); + return -1; +} + +static int __open_datacontrol_db() +{ + int ret = -1; + if (access(DATACONTROL_DB, F_OK) == 0) { + ret = + db_util_open_with_options(DATACONTROL_DB, &datacontrol_db, + SQLITE_OPEN_READONLY, NULL); + if (ret != SQLITE_OK) { + _LOGE("connect db [%s] failed!\n", DATACONTROL_DB); + return -1; + } + return 0; + } + _LOGE("Datacontrol DB does not exists !!\n"); + return -1; +} + +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)); + info->manifest_info = (manifest_x *)calloc(1, sizeof(manifest_x)); + + 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; +} + +static int __app_list_cb(void *data, int ncols, char **coltxt, char **colname) +{ + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)data; + int i = 0; + int j = 0; + uiapplication_x *uiapp = NULL; + serviceapplication_x *svcapp = NULL; + for(i = 0; i < ncols; i++) + { + if (strcmp(colname[i], "app_component") == 0) { + if (coltxt[i]) { + if (strcmp(coltxt[i], "uiapp") == 0) { + uiapp = calloc(1, sizeof(uiapplication_x)); + if (uiapp == NULL) { + _LOGE("Out of Memory!!!\n"); + return -1; + } + LISTADD(info->manifest_info->uiapplication, uiapp); + for(j = 0; j < ncols; j++) + { + if (strcmp(colname[j], "app_id") == 0) { + if (coltxt[j]) + info->manifest_info->uiapplication->appid = strdup(coltxt[j]); + } else if (strcmp(colname[j], "package") == 0) { + if (coltxt[j]) + info->manifest_info->uiapplication->package = strdup(coltxt[j]); + } else + continue; + } + } else { + svcapp = calloc(1, sizeof(serviceapplication_x)); + if (svcapp == NULL) { + _LOGE("Out of Memory!!!\n"); + return -1; + } + LISTADD(info->manifest_info->serviceapplication, svcapp); + for(j = 0; j < ncols; j++) + { + if (strcmp(colname[j], "app_id") == 0) { + if (coltxt[j]) + info->manifest_info->serviceapplication->appid = strdup(coltxt[j]); + } else if (strcmp(colname[j], "package") == 0) { + if (coltxt[j]) + info->manifest_info->serviceapplication->package = strdup(coltxt[j]); + } else + continue; + } + } + } + } else + continue; + } + + return 0; +} + + +static 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)); + LISTADD(info->manifest_info->uiapplication, uiapp); + icon = calloc(1, sizeof(icon_x)); + LISTADD(info->manifest_info->uiapplication->icon, icon); + label = calloc(1, sizeof(label_x)); + LISTADD(info->manifest_info->uiapplication->label, label); + + for(i = 0; i < ncols; i++) + { + if (strcmp(colname[i], "app_id") == 0) { + if (coltxt[i]) + info->manifest_info->uiapplication->appid = strdup(coltxt[i]); + else + info->manifest_info->uiapplication->appid = NULL; + } else if (strcmp(colname[i], "app_exec") == 0) { + if (coltxt[i]) + info->manifest_info->uiapplication->exec = strdup(coltxt[i]); + else + info->manifest_info->uiapplication->exec = NULL; + } else if (strcmp(colname[i], "app_type") == 0 ){ + if (coltxt[i]) + info->manifest_info->uiapplication->type = strdup(coltxt[i]); + else + info->manifest_info->uiapplication->type = NULL; + } else if (strcmp(colname[i], "app_nodisplay") == 0 ){ + if (coltxt[i]) + info->manifest_info->uiapplication->nodisplay = strdup(coltxt[i]); + else + info->manifest_info->uiapplication->nodisplay = NULL; + } else if (strcmp(colname[i], "app_multiple") == 0 ){ + if (coltxt[i]) + info->manifest_info->uiapplication->multiple = strdup(coltxt[i]); + else + info->manifest_info->uiapplication->multiple = NULL; + } else if (strcmp(colname[i], "app_taskmanage") == 0 ){ + if (coltxt[i]) + info->manifest_info->uiapplication->taskmanage = strdup(coltxt[i]); + else + info->manifest_info->uiapplication->taskmanage = NULL; + } else if (strcmp(colname[i], "app_hwacceleration") == 0 ){ + if (coltxt[i]) + info->manifest_info->uiapplication->hwacceleration = strdup(coltxt[i]); + else + info->manifest_info->uiapplication->hwacceleration = NULL; + } else if (strcmp(colname[i], "package") == 0 ){ + if (coltxt[i]) + info->manifest_info->uiapplication->package = strdup(coltxt[i]); + else + info->manifest_info->uiapplication->package = NULL; + } else if (strcmp(colname[i], "app_icon") == 0) { + if (coltxt[i]) + info->manifest_info->uiapplication->icon->text = strdup(coltxt[i]); + else + info->manifest_info->uiapplication->icon->text = NULL; + } else if (strcmp(colname[i], "app_label") == 0 ) { + if (coltxt[i]) + info->manifest_info->uiapplication->label->text = strdup(coltxt[i]); + else + info->manifest_info->uiapplication->label->text = NULL; + } else if (strcmp(colname[i], "app_locale") == 0 ) { + if (coltxt[i]) { + info->manifest_info->uiapplication->icon->lang = strdup(coltxt[i]); + info->manifest_info->uiapplication->label->lang = strdup(coltxt[i]); + } + else { + info->manifest_info->uiapplication->icon->lang = NULL; + info->manifest_info->uiapplication->label->lang = NULL; + } + } else + continue; + } + return 0; +} + +static int __svcapp_list_cb(void *data, int ncols, char **coltxt, char **colname) +{ + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)data; + int i = 0; + serviceapplication_x *svcapp = NULL; + icon_x *icon = NULL; + label_x *label = NULL; + svcapp = calloc(1, sizeof(serviceapplication_x)); + LISTADD(info->manifest_info->serviceapplication, svcapp); + icon = calloc(1, sizeof(icon_x)); + LISTADD(info->manifest_info->serviceapplication->icon, icon); + label = calloc(1, sizeof(label_x)); + LISTADD(info->manifest_info->serviceapplication->label, label); + for(i = 0; i < ncols; i++) + { + if (strcmp(colname[i], "app_id") == 0) { + if (coltxt[i]) + info->manifest_info->serviceapplication->appid = strdup(coltxt[i]); + else + info->manifest_info->serviceapplication->appid = NULL; + } else if (strcmp(colname[i], "app_exec") == 0) { + if (coltxt[i]) + info->manifest_info->serviceapplication->exec = strdup(coltxt[i]); + else + info->manifest_info->serviceapplication->exec = NULL; + } else if (strcmp(colname[i], "app_type") == 0 ){ + if (coltxt[i]) + info->manifest_info->serviceapplication->type = strdup(coltxt[i]); + else + info->manifest_info->serviceapplication->type = NULL; + } else if (strcmp(colname[i], "app_onboot") == 0 ){ + if (coltxt[i]) + info->manifest_info->serviceapplication->onboot = strdup(coltxt[i]); + else + info->manifest_info->serviceapplication->onboot = NULL; + } else if (strcmp(colname[i], "app_autorestart") == 0 ){ + if (coltxt[i]) + info->manifest_info->serviceapplication->autorestart = strdup(coltxt[i]); + else + info->manifest_info->serviceapplication->autorestart = NULL; + } else if (strcmp(colname[i], "package") == 0 ){ + if (coltxt[i]) + info->manifest_info->serviceapplication->package = strdup(coltxt[i]); + else + info->manifest_info->serviceapplication->package = NULL; + } else if (strcmp(colname[i], "app_icon") == 0) { + if (coltxt[i]) + info->manifest_info->serviceapplication->icon->text = strdup(coltxt[i]); + else + info->manifest_info->serviceapplication->icon->text = NULL; + } else if (strcmp(colname[i], "app_label") == 0 ) { + if (coltxt[i]) + info->manifest_info->serviceapplication->label->text = strdup(coltxt[i]); + else + info->manifest_info->serviceapplication->label->text = NULL; + } else if (strcmp(colname[i], "app_locale") == 0 ) { + if (coltxt[i]) { + info->manifest_info->serviceapplication->icon->lang = strdup(coltxt[i]); + info->manifest_info->serviceapplication->label->lang = strdup(coltxt[i]); + } + else { + info->manifest_info->serviceapplication->icon->lang = NULL; + info->manifest_info->serviceapplication->label->lang = NULL; + } + } else + continue; + } + return 0; +} + +static int __allapp_list_cb(void *data, int ncols, char **coltxt, char **colname) +{ + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)data; + int i = 0; + int j = 0; + uiapplication_x *uiapp = NULL; + serviceapplication_x *svcapp = NULL; + for(j = 0; j < ncols; j++) + { + if (strcmp(colname[j], "app_component") == 0) { + if (coltxt[j]) { + if (strcmp(coltxt[j], "uiapp") == 0) { + uiapp = calloc(1, sizeof(uiapplication_x)); + if (uiapp == NULL) { + _LOGE("Out of Memory!!!\n"); + return -1; + } + LISTADD(info->manifest_info->uiapplication, uiapp); + for(i = 0; i < ncols; i++) + { + if (strcmp(colname[i], "app_id") == 0) { + if (coltxt[i]) + info->manifest_info->uiapplication->appid = strdup(coltxt[i]); + else + info->manifest_info->uiapplication->appid = NULL; + } else if (strcmp(colname[i], "app_exec") == 0) { + if (coltxt[i]) + info->manifest_info->uiapplication->exec = strdup(coltxt[i]); + else + info->manifest_info->uiapplication->exec = NULL; + } else if (strcmp(colname[i], "app_type") == 0 ){ + if (coltxt[i]) + info->manifest_info->uiapplication->type = strdup(coltxt[i]); + else + info->manifest_info->uiapplication->type = NULL; + } else if (strcmp(colname[i], "app_nodisplay") == 0 ){ + if (coltxt[i]) + info->manifest_info->uiapplication->nodisplay = strdup(coltxt[i]); + else + info->manifest_info->uiapplication->nodisplay = NULL; + } else if (strcmp(colname[i], "app_multiple") == 0 ){ + if (coltxt[i]) + info->manifest_info->uiapplication->multiple = strdup(coltxt[i]); + else + info->manifest_info->uiapplication->multiple = NULL; + } else if (strcmp(colname[i], "app_taskmanage") == 0 ){ + if (coltxt[i]) + info->manifest_info->uiapplication->taskmanage = strdup(coltxt[i]); + else + info->manifest_info->uiapplication->taskmanage = NULL; + } else if (strcmp(colname[i], "app_hwacceleration") == 0 ){ + if (coltxt[i]) + info->manifest_info->uiapplication->hwacceleration = strdup(coltxt[i]); + else + info->manifest_info->uiapplication->hwacceleration = NULL; + } else if (strcmp(colname[i], "package") == 0 ){ + if (coltxt[i]) + info->manifest_info->uiapplication->package = strdup(coltxt[i]); + else + info->manifest_info->uiapplication->package = NULL; + } else if (strcmp(colname[i], "app_icon") == 0) { + if (coltxt[i]) + info->manifest_info->uiapplication->icon->text = strdup(coltxt[i]); + else + info->manifest_info->uiapplication->icon->text = NULL; + } else if (strcmp(colname[i], "app_label") == 0 ) { + if (coltxt[i]) + info->manifest_info->uiapplication->label->text = strdup(coltxt[i]); + else + info->manifest_info->uiapplication->label->text = NULL; + } else if (strcmp(colname[i], "app_locale") == 0 ) { + if (coltxt[i]) { + info->manifest_info->uiapplication->icon->lang = strdup(coltxt[i]); + info->manifest_info->uiapplication->label->lang = strdup(coltxt[i]); + } + else { + info->manifest_info->uiapplication->icon->lang = NULL; + info->manifest_info->uiapplication->label->lang = NULL; + } + } else + continue; + } + } else { + svcapp = calloc(1, sizeof(serviceapplication_x)); + if (svcapp == NULL) { + _LOGE("Out of Memory!!!\n"); + return -1; + } + LISTADD(info->manifest_info->serviceapplication, svcapp); + for(i = 0; i < ncols; i++) + { + if (strcmp(colname[i], "app_id") == 0) { + if (coltxt[i]) + info->manifest_info->serviceapplication->appid = strdup(coltxt[i]); + else + info->manifest_info->serviceapplication->appid = NULL; + } else if (strcmp(colname[i], "app_exec") == 0) { + if (coltxt[i]) + info->manifest_info->serviceapplication->exec = strdup(coltxt[i]); + else + info->manifest_info->serviceapplication->exec = NULL; + } else if (strcmp(colname[i], "app_type") == 0 ){ + if (coltxt[i]) + info->manifest_info->serviceapplication->type = strdup(coltxt[i]); + else + info->manifest_info->serviceapplication->type = NULL; + } else if (strcmp(colname[i], "app_onboot") == 0 ){ + if (coltxt[i]) + info->manifest_info->serviceapplication->onboot = strdup(coltxt[i]); + else + info->manifest_info->serviceapplication->onboot = NULL; + } else if (strcmp(colname[i], "app_autorestart") == 0 ){ + if (coltxt[i]) + info->manifest_info->serviceapplication->autorestart = strdup(coltxt[i]); + else + info->manifest_info->serviceapplication->autorestart = NULL; + } else if (strcmp(colname[i], "package") == 0 ){ + if (coltxt[i]) + info->manifest_info->serviceapplication->package = strdup(coltxt[i]); + else + info->manifest_info->serviceapplication->package = NULL; + } else if (strcmp(colname[i], "app_icon") == 0) { + if (coltxt[i]) + info->manifest_info->serviceapplication->icon->text = strdup(coltxt[i]); + else + info->manifest_info->serviceapplication->icon->text = NULL; + } else if (strcmp(colname[i], "app_label") == 0 ) { + if (coltxt[i]) + info->manifest_info->serviceapplication->label->text = strdup(coltxt[i]); + else + info->manifest_info->serviceapplication->label->text = NULL; + } else if (strcmp(colname[i], "app_locale") == 0 ) { + if (coltxt[i]) { + info->manifest_info->serviceapplication->icon->lang = strdup(coltxt[i]); + info->manifest_info->serviceapplication->label->lang = strdup(coltxt[i]); + } + else { + info->manifest_info->serviceapplication->icon->lang = NULL; + info->manifest_info->serviceapplication->label->lang = NULL; + } + } else + continue; + } + } + } + } else + continue; + } + + return 0; +} + + + +static int __validate_cb(void *data, int ncols, char **coltxt, char **colname) +{ + int *p = (int*)data; + *p = atoi(coltxt[0]); + return 0; +} + +static 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; + + author = calloc(1, sizeof(author_x)); + LISTADD(info->manifest_info->author, author); + icon = calloc(1, sizeof(icon_x)); + LISTADD(info->manifest_info->icon, icon); + label = calloc(1, sizeof(label_x)); + LISTADD(info->manifest_info->label, label); + description = calloc(1, sizeof(description_x)); + LISTADD(info->manifest_info->description, description); + for(i = 0; i < ncols; i++) + { + if (strcmp(colname[i], "package_version") == 0) { + if (coltxt[i]) + info->manifest_info->version = strdup(coltxt[i]); + else + info->manifest_info->version = NULL; + } else if (strcmp(colname[i], "package_type") == 0) { + if (coltxt[i]) + info->manifest_info->type = strdup(coltxt[i]); + else + info->manifest_info->type = NULL; + } else if (strcmp(colname[i], "install_location") == 0) { + if (coltxt[i]) + info->manifest_info->installlocation = strdup(coltxt[i]); + else + info->manifest_info->installlocation = NULL; + } else if (strcmp(colname[i], "package_size") == 0) { + if (coltxt[i]) + info->manifest_info->package_size = strdup(coltxt[i]); + else + info->manifest_info->package_size = NULL; + } else if (strcmp(colname[i], "author_email") == 0 ){ + if (coltxt[i]) + info->manifest_info->author->email = strdup(coltxt[i]); + else + info->manifest_info->author->email = NULL; + } else if (strcmp(colname[i], "author_href") == 0 ){ + if (coltxt[i]) + info->manifest_info->author->href = strdup(coltxt[i]); + else + info->manifest_info->author->href = NULL; + } else if (strcmp(colname[i], "package_label") == 0 ){ + if (coltxt[i]) + info->manifest_info->label->text = strdup(coltxt[i]); + else + info->manifest_info->label->text = NULL; + } else if (strcmp(colname[i], "package_icon") == 0 ){ + if (coltxt[i]) + info->manifest_info->icon->text = strdup(coltxt[i]); + else + info->manifest_info->icon->text = NULL; + } else if (strcmp(colname[i], "package_description") == 0 ){ + if (coltxt[i]) + info->manifest_info->description->text = strdup(coltxt[i]); + else + info->manifest_info->description->text = NULL; + } else if (strcmp(colname[i], "package_author") == 0 ){ + if (coltxt[i]) + info->manifest_info->author->text = strdup(coltxt[i]); + else + info->manifest_info->author->text = NULL; + } else if (strcmp(colname[i], "package_removable") == 0 ){ + if (coltxt[i]) + info->manifest_info->removable = strdup(coltxt[i]); + else + info->manifest_info->removable = NULL; + } else if (strcmp(colname[i], "package_preload") == 0 ){ + if (coltxt[i]) + info->manifest_info->preload = strdup(coltxt[i]); + else + info->manifest_info->preload = NULL; + } else if (strcmp(colname[i], "package_readonly") == 0 ){ + if (coltxt[i]) + info->manifest_info->readonly = strdup(coltxt[i]); + else + info->manifest_info->readonly = NULL; + } else if (strcmp(colname[i], "installed_time") == 0 ){ + if (coltxt[i]) + info->manifest_info->installed_time = strdup(coltxt[i]); + else + info->manifest_info->installed_time = NULL; + } else if (strcmp(colname[i], "mainapp_id") == 0 ){ + if (coltxt[i]) + info->manifest_info->mainapp_id = strdup(coltxt[i]); + else + info->manifest_info->mainapp_id = NULL; + + } else if (strcmp(colname[i], "package_locale") == 0 ){ + if (coltxt[i]) { + info->manifest_info->author->lang = strdup(coltxt[i]); + info->manifest_info->icon->lang = strdup(coltxt[i]); + info->manifest_info->label->lang = strdup(coltxt[i]); + info->manifest_info->description->lang = strdup(coltxt[i]); + } + else { + info->manifest_info->author->lang = NULL; + info->manifest_info->icon->lang = NULL; + info->manifest_info->label->lang = NULL; + info->manifest_info->description->lang = NULL; + } + } else + continue; + } + return 0; +} + + +static pkgmgrinfo_app_component __appcomponent_convert(const char *comp) +{ + if ( strcasecmp(comp, "uiapp") == 0) + return PMINFO_UI_APP; + else if ( strcasecmp(comp, "svcapp") == 0) + return PMINFO_SVC_APP; + else + return -1; +} + +static int __delete_certinfo_cb(void *data, int ncols, char **coltxt, char **colname) +{ + const char *pkgid = (const char *)data; + int i = 0; + char *error_message = NULL; + int ret =0; + char query[MAX_QUERY_LEN] = {'\0'}; + pkgmgr_instcertinfo_x *certinfo = NULL; + certinfo = calloc(1, sizeof(pkgmgr_certinfo_x)); + if (certinfo == NULL) { + _LOGE("Out of Memory!!!\n"); + return PMINFO_R_ERROR; + } + for (i = 0; i < ncols; i++) { + if (strcmp(colname[i], "package") == 0) { + if (coltxt[i]) + certinfo->pkgid = coltxt[i]; + } else if (strcmp(colname[i], "author_signer_cert") == 0) { + if (coltxt[i]) { + if (strcmp(coltxt[i], pkgid) == 0) { + if (gflag[PMINFO_AUTHOR_SIGNER_CERT] && gpkgcert[PMINFO_AUTHOR_SIGNER_CERT]) { + certinfo->auth_signer_cert = strdup(gpkgcert[PMINFO_AUTHOR_SIGNER_CERT]); + continue; + } + snprintf(query, MAX_QUERY_LEN, "select author_signer_cert from package_cert_info " \ + "where package='%s'", pkgid); + if (SQLITE_OK != + sqlite3_exec(cert_db, query, __certinfo_cb, (void *)certinfo, &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; + } + gpkgcert[PMINFO_AUTHOR_SIGNER_CERT] = strdup(certinfo->pkgid); + gflag[PMINFO_AUTHOR_SIGNER_CERT] = 1; + } else { + certinfo->auth_signer_cert = strdup(coltxt[i]); + } + } + continue; + } else if (strcmp(colname[i], "author_im_cert") == 0) { + if (coltxt[i]) { + if (strcmp(coltxt[i], pkgid) == 0) { + if (gflag[PMINFO_AUTHOR_INTERMEDIATE_CERT] && gpkgcert[PMINFO_AUTHOR_INTERMEDIATE_CERT]) { + certinfo->auth_im_cert = strdup(gpkgcert[PMINFO_AUTHOR_INTERMEDIATE_CERT]); + continue; + } + snprintf(query, MAX_QUERY_LEN, "select author_im_cert from package_cert_info " \ + "where package='%s'", pkgid); + if (SQLITE_OK != + sqlite3_exec(cert_db, query, __certinfo_cb, (void *)certinfo, &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; + } + gpkgcert[PMINFO_AUTHOR_INTERMEDIATE_CERT] = strdup(certinfo->pkgid); + gflag[PMINFO_AUTHOR_INTERMEDIATE_CERT] = 1; + } else { + certinfo->auth_im_cert = strdup(coltxt[i]); + } + } + continue; + } else if (strcmp(colname[i], "author_root_cert") == 0) { + if (coltxt[i]) { + if (strcmp(coltxt[i], pkgid) == 0) { + if (gflag[PMINFO_AUTHOR_ROOT_CERT] && gpkgcert[PMINFO_AUTHOR_ROOT_CERT]) { + certinfo->auth_root_cert = strdup(gpkgcert[PMINFO_AUTHOR_ROOT_CERT]); + continue; + } + snprintf(query, MAX_QUERY_LEN, "select author_root_cert from package_cert_info " \ + "where package='%s'", pkgid); + if (SQLITE_OK != + sqlite3_exec(cert_db, query, __certinfo_cb, (void *)certinfo, &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; + } + gpkgcert[PMINFO_AUTHOR_ROOT_CERT] = strdup(certinfo->pkgid); + gflag[PMINFO_AUTHOR_ROOT_CERT] = 1; + } else { + certinfo->auth_root_cert = strdup(coltxt[i]); + } + } + continue; + } else if (strcmp(colname[i], "dist_signer_cert") == 0 ) { + if (coltxt[i]) { + if (strcmp(coltxt[i], pkgid) == 0) { + if (gflag[PMINFO_DISTRIBUTOR_SIGNER_CERT] && gpkgcert[PMINFO_DISTRIBUTOR_SIGNER_CERT]) { + certinfo->dist_signer_cert = strdup(gpkgcert[PMINFO_DISTRIBUTOR_SIGNER_CERT]); + continue; + } + snprintf(query, MAX_QUERY_LEN, "select dist_signer_cert from package_cert_info " \ + "where package='%s'", pkgid); + if (SQLITE_OK != + sqlite3_exec(cert_db, query, __certinfo_cb, (void *)certinfo, &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; + } + gpkgcert[PMINFO_DISTRIBUTOR_SIGNER_CERT] = strdup(certinfo->pkgid); + gflag[PMINFO_DISTRIBUTOR_SIGNER_CERT] = 1; + } else { + certinfo->dist_signer_cert = strdup(coltxt[i]); + } + } + continue; + } else if (strcmp(colname[i], "dist_im_cert") == 0 ) { + if (coltxt[i]) { + if (strcmp(coltxt[i], pkgid) == 0) { + if (gflag[PMINFO_DISTRIBUTOR_INTERMEDIATE_CERT] && gpkgcert[PMINFO_DISTRIBUTOR_INTERMEDIATE_CERT]) { + certinfo->dist_im_cert = strdup(gpkgcert[PMINFO_DISTRIBUTOR_INTERMEDIATE_CERT]); + continue; + } + snprintf(query, MAX_QUERY_LEN, "select dist_im_cert from package_cert_info " \ + "where package='%s'", pkgid); + if (SQLITE_OK != + sqlite3_exec(cert_db, query, __certinfo_cb, (void *)certinfo, &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; + } + gpkgcert[PMINFO_DISTRIBUTOR_INTERMEDIATE_CERT] = strdup(certinfo->pkgid); + gflag[PMINFO_DISTRIBUTOR_INTERMEDIATE_CERT] = 1; + } else { + certinfo->dist_im_cert = strdup(coltxt[i]); + } + } + continue; + } else if (strcmp(colname[i], "dist_root_cert") == 0 ) { + if (coltxt[i]) { + if (strcmp(coltxt[i], pkgid) == 0) { + if (gflag[PMINFO_DISTRIBUTOR_ROOT_CERT] && gpkgcert[PMINFO_DISTRIBUTOR_ROOT_CERT]) { + certinfo->dist_root_cert = strdup(gpkgcert[PMINFO_DISTRIBUTOR_ROOT_CERT]); + continue; + } + snprintf(query, MAX_QUERY_LEN, "select dist_root_cert from package_cert_info " \ + "where package='%s'", pkgid); + if (SQLITE_OK != + sqlite3_exec(cert_db, query, __certinfo_cb, (void *)certinfo, &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; + } + gpkgcert[PMINFO_DISTRIBUTOR_ROOT_CERT] = strdup(certinfo->pkgid); + gflag[PMINFO_DISTRIBUTOR_ROOT_CERT] = 1; + } else { + certinfo->dist_root_cert = strdup(coltxt[i]); + } + } + continue; + } else if (strcmp(colname[i], "dist2_signer_cert") == 0 ) { + if (coltxt[i]) { + if (strcmp(coltxt[i], pkgid) == 0) { + if (gflag[PMINFO_DISTRIBUTOR2_SIGNER_CERT] && gpkgcert[PMINFO_DISTRIBUTOR2_SIGNER_CERT]) { + certinfo->dist2_signer_cert = strdup(gpkgcert[PMINFO_DISTRIBUTOR2_SIGNER_CERT]); + continue; + } + snprintf(query, MAX_QUERY_LEN, "select dist2_signer_cert from package_cert_info " \ + "where package='%s'", pkgid); + if (SQLITE_OK != + sqlite3_exec(cert_db, query, __certinfo_cb, (void *)certinfo, &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; + } + gpkgcert[PMINFO_DISTRIBUTOR2_SIGNER_CERT] = strdup(certinfo->pkgid); + gflag[PMINFO_DISTRIBUTOR2_SIGNER_CERT] = 1; + } else { + certinfo->dist2_signer_cert = strdup(coltxt[i]); + } + } + continue; + } else if (strcmp(colname[i], "dist2_im_cert") == 0 ) { + if (coltxt[i]) { + if (strcmp(coltxt[i], pkgid) == 0) { + if (gflag[PMINFO_DISTRIBUTOR2_INTERMEDIATE_CERT] && gpkgcert[PMINFO_DISTRIBUTOR2_INTERMEDIATE_CERT]) { + certinfo->dist2_im_cert = strdup(gpkgcert[PMINFO_DISTRIBUTOR2_INTERMEDIATE_CERT]); + continue; + } + snprintf(query, MAX_QUERY_LEN, "select dist2_im_cert from package_cert_info " \ + "where package='%s'", pkgid); + if (SQLITE_OK != + sqlite3_exec(cert_db, query, __certinfo_cb, (void *)certinfo, &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; + } + gpkgcert[PMINFO_DISTRIBUTOR2_INTERMEDIATE_CERT] = strdup(certinfo->pkgid); + gflag[PMINFO_DISTRIBUTOR2_INTERMEDIATE_CERT] = 1; + } else { + certinfo->dist2_im_cert = strdup(coltxt[i]); + } + } + continue; + } else if (strcmp(colname[i], "dist2_root_cert") == 0 ) { + if (coltxt[i]) { + if (strcmp(coltxt[i], pkgid) == 0) { + if (gflag[PMINFO_DISTRIBUTOR2_ROOT_CERT] && gpkgcert[PMINFO_DISTRIBUTOR2_ROOT_CERT]) { + certinfo->dist2_root_cert = strdup(gpkgcert[PMINFO_DISTRIBUTOR2_ROOT_CERT]); + continue; + } + snprintf(query, MAX_QUERY_LEN, "select dist2_root_cert from package_cert_info " \ + "where package='%s'", pkgid); + if (SQLITE_OK != + sqlite3_exec(cert_db, query, __certinfo_cb, (void *)certinfo, &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; + } + gpkgcert[PMINFO_DISTRIBUTOR2_ROOT_CERT] = strdup(certinfo->pkgid); + gflag[PMINFO_DISTRIBUTOR2_ROOT_CERT] = 1; + } else { + certinfo->dist2_root_cert = strdup(coltxt[i]); + } + } + continue; + } + } + /*Update cert info db*/ + pkgmgrinfo_save_certinfo(certinfo->pkgid, (void *)certinfo); + ret = PMINFO_R_OK; +err: + if (certinfo->auth_signer_cert) { + free(certinfo->auth_signer_cert); + certinfo->auth_signer_cert = NULL; + } + if (certinfo->auth_im_cert) { + free(certinfo->auth_im_cert); + certinfo->auth_im_cert = NULL; + } + if (certinfo->auth_root_cert) { + free(certinfo->auth_root_cert); + certinfo->auth_root_cert = NULL; + } + if (certinfo->dist_signer_cert) { + free(certinfo->dist_signer_cert); + certinfo->dist_signer_cert = NULL; + } + if (certinfo->dist_im_cert) { + free(certinfo->dist_im_cert); + certinfo->dist_im_cert = NULL; + } + if (certinfo->dist_root_cert) { + free(certinfo->dist_root_cert); + certinfo->dist_root_cert = NULL; + } + if (certinfo->dist2_signer_cert) { + free(certinfo->dist2_signer_cert); + certinfo->dist2_signer_cert = NULL; + } + if (certinfo->dist2_im_cert) { + free(certinfo->dist2_im_cert); + certinfo->dist2_im_cert = NULL; + } + if (certinfo->dist2_root_cert) { + free(certinfo->dist2_root_cert); + certinfo->dist2_root_cert = NULL; + } + free(certinfo); + certinfo = NULL; + return ret; +} + +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 (strcmp(colname[i], "package") == 0) { + if (coltxt[i]) + info->pkgid = strdup(coltxt[i]); + else + info->pkgid = NULL; + } else if (strcmp(colname[i], "author_signer_cert") == 0) { + if (coltxt[i]) + info->auth_signer_cert = strdup(coltxt[i]); + else + info->auth_signer_cert = NULL; + } else if (strcmp(colname[i], "author_im_cert") == 0) { + if (coltxt[i]) + info->auth_im_cert = strdup(coltxt[i]); + else + info->auth_im_cert = NULL; + } else if (strcmp(colname[i], "author_root_cert") == 0) { + if (coltxt[i]) + info->auth_root_cert = strdup(coltxt[i]); + else + info->auth_root_cert = NULL; + } else if (strcmp(colname[i], "dist_signer_cert") == 0 ){ + if (coltxt[i]) + info->dist_signer_cert = strdup(coltxt[i]); + else + info->dist_signer_cert = NULL; + } else if (strcmp(colname[i], "dist_im_cert") == 0 ){ + if (coltxt[i]) + info->dist_im_cert = strdup(coltxt[i]); + else + info->dist_im_cert = NULL; + } else if (strcmp(colname[i], "dist_root_cert") == 0 ){ + if (coltxt[i]) + info->dist_root_cert = strdup(coltxt[i]); + else + info->dist_root_cert = NULL; + } else if (strcmp(colname[i], "dist2_signer_cert") == 0 ){ + if (coltxt[i]) + info->dist2_signer_cert = strdup(coltxt[i]); + else + info->dist2_signer_cert = NULL; + } else if (strcmp(colname[i], "dist2_im_cert") == 0 ){ + if (coltxt[i]) + info->dist2_im_cert = strdup(coltxt[i]); + else + info->dist2_im_cert = NULL; + } else if (strcmp(colname[i], "dist2_root_cert") == 0 ){ + if (coltxt[i]) + info->dist2_root_cert = strdup(coltxt[i]); + else + info->dist2_root_cert = NULL; + } else + continue; + } + return 0; +} + +static 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; + + switch (info->app_component) { + case PMINFO_UI_APP: + icon = calloc(1, sizeof(icon_x)); + LISTADD(info->uiapp_info->icon, icon); + label = calloc(1, sizeof(label_x)); + LISTADD(info->uiapp_info->label, label); + category = calloc(1, sizeof(category_x)); + LISTADD(info->uiapp_info->category, category); + for(i = 0; i < ncols; i++) + { + if (strcmp(colname[i], "app_id") == 0) { + if (coltxt[i]) + info->uiapp_info->appid = strdup(coltxt[i]); + else + info->uiapp_info->appid = NULL; + } else if (strcmp(colname[i], "app_exec") == 0) { + if (coltxt[i]) + info->uiapp_info->exec = strdup(coltxt[i]); + else + info->uiapp_info->exec = NULL; + } else if (strcmp(colname[i], "app_nodisplay") == 0) { + if (coltxt[i]) + info->uiapp_info->nodisplay = strdup(coltxt[i]); + else + info->uiapp_info->nodisplay = NULL; + } else if (strcmp(colname[i], "app_type") == 0 ) { + if (coltxt[i]) + info->uiapp_info->type = strdup(coltxt[i]); + else + info->uiapp_info->type = NULL; + } else if (strcmp(colname[i], "app_icon") == 0) { + if (coltxt[i]) + info->uiapp_info->icon->text = strdup(coltxt[i]); + else + info->uiapp_info->icon->text = NULL; + } else if (strcmp(colname[i], "app_label") == 0 ) { + if (coltxt[i]) + info->uiapp_info->label->text = strdup(coltxt[i]); + else + info->uiapp_info->label->text = NULL; + } else if (strcmp(colname[i], "app_multiple") == 0 ) { + if (coltxt[i]) + info->uiapp_info->multiple = strdup(coltxt[i]); + else + info->uiapp_info->multiple = NULL; + } else if (strcmp(colname[i], "app_taskmanage") == 0 ) { + if (coltxt[i]) + info->uiapp_info->taskmanage = strdup(coltxt[i]); + else + info->uiapp_info->taskmanage = NULL; + } else if (strcmp(colname[i], "app_hwacceleration") == 0 ) { + if (coltxt[i]) + info->uiapp_info->hwacceleration = strdup(coltxt[i]); + else + info->uiapp_info->hwacceleration = NULL; + } else if (strcmp(colname[i], "category") == 0 ) { + if (coltxt[i]) + info->uiapp_info->category->name = strdup(coltxt[i]); + else + info->uiapp_info->category->name = NULL; + } else if (strcmp(colname[i], "app_locale") == 0 ) { + if (coltxt[i]) { + info->uiapp_info->icon->lang = strdup(coltxt[i]); + info->uiapp_info->label->lang = strdup(coltxt[i]); + } + else { + info->uiapp_info->icon->lang = NULL; + info->uiapp_info->label->lang = NULL; + } + } else + continue; + } + break; + case PMINFO_SVC_APP: + icon = calloc(1, sizeof(icon_x)); + LISTADD(info->svcapp_info->icon, icon); + label = calloc(1, sizeof(label_x)); + LISTADD(info->svcapp_info->label, label); + category = calloc(1, sizeof(category_x)); + LISTADD(info->svcapp_info->category, category); + for(i = 0; i < ncols; i++) + { + if (strcmp(colname[i], "app_id") == 0) { + if (coltxt[i]) + info->svcapp_info->appid = strdup(coltxt[i]); + else + info->svcapp_info->appid = NULL; + } else if (strcmp(colname[i], "app_exec") == 0) { + if (coltxt[i]) + info->svcapp_info->exec = strdup(coltxt[i]); + else + info->svcapp_info->exec = NULL; + } else if (strcmp(colname[i], "app_icon") == 0) { + if (coltxt[i]) + info->svcapp_info->icon->text = strdup(coltxt[i]); + else + info->svcapp_info->icon->text = NULL; + } else if (strcmp(colname[i], "app_label") == 0 ) { + if (coltxt[i]) + info->svcapp_info->label->text = strdup(coltxt[i]); + else + info->svcapp_info->label->text = NULL; + } else if (strcmp(colname[i], "app_type") == 0 ) { + if (coltxt[i]) + info->svcapp_info->type = strdup(coltxt[i]); + else + info->svcapp_info->type = NULL; + } else if (strcmp(colname[i], "app_onboot") == 0 ) { + if (coltxt[i]) + info->svcapp_info->onboot = strdup(coltxt[i]); + else + info->svcapp_info->onboot = NULL; + } else if (strcmp(colname[i], "app_autorestart") == 0 ) { + if (coltxt[i]) + info->svcapp_info->autorestart = strdup(coltxt[i]); + else + info->svcapp_info->autorestart = NULL; + } else if (strcmp(colname[i], "category") == 0 ) { + if (coltxt[i]) + info->svcapp_info->category->name = strdup(coltxt[i]); + else + info->svcapp_info->category->name = NULL; + } else if (strcmp(colname[i], "app_locale") == 0 ) { + if (coltxt[i]) { + info->svcapp_info->icon->lang = strdup(coltxt[i]); + info->svcapp_info->label->lang = strdup(coltxt[i]); + } + else { + info->svcapp_info->icon->lang = NULL; + info->svcapp_info->label->lang = NULL; + } + } else + continue; + } + break; + default: + break; + } + + return 0; +} + + +static int __appcomponent_cb(void *data, int ncols, char **coltxt, char **colname) +{ + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)data; + int i = 0; + for(i = 0; i < ncols; i++) + { + if (strcmp(colname[i], "app_component") == 0) { + info->app_component = __appcomponent_convert(coltxt[i]); + } else if (strcmp(colname[i], "package") == 0) { + info->package = strdup(coltxt[i]); + } + } + + return 0; +} + +static int __datacontrol_cb(void *data, int ncols, char **coltxt, char **colname) +{ + pkgmgr_datacontrol_x *info = (pkgmgr_datacontrol_x *)data; + int i = 0; + for(i = 0; i < ncols; i++) + { + if (strcmp(colname[i], "PACKAGE_NAME") == 0) { + if (coltxt[i]) + info->appid = strdup(coltxt[i]); + else + info->appid = NULL; + } else if (strcmp(colname[i], "ACCESS") == 0 ){ + if (coltxt[i]) + info->access = strdup(coltxt[i]); + else + info->access = NULL; + } else + continue; + } + return 0; +} + +static int __icon_name_cb(void *data, int ncols, char **coltxt, char **colname) +{ + pkgmgr_iconpath_x *icon_name = (pkgmgr_iconpath_x *)data; + int i = 0; + for(i = 0; i < ncols; i++) + { + if (strcmp(colname[i], "app_icon") == 0) { + if (coltxt[i]) + icon_name->iconpath = strdup(coltxt[i]); + else + icon_name->iconpath = NULL; + } else + continue; + } + 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->certvalue= strdup(coltxt[i]); + else + info->certvalue = NULL; + } else if (strcmp(colname[i], "package") == 0) { + if (coltxt[i]) + info->pkgid= strdup(coltxt[i]); + else + info->pkgid = NULL; + } else + continue; + } + return 0; +} + +/* 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; +} + +static int __exec_pkginfo_query(char *query, void *data) +{ + char *error_message = NULL; + if (SQLITE_OK != + sqlite3_exec(manifest_db, query, __pkginfo_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_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_appcomponent_query(char *query, void *data) +{ + char *error_message = NULL; + if (SQLITE_OK != + sqlite3_exec(manifest_db, query, __appcomponent_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_appinfo_query(char *query, void *data) +{ + char *error_message = NULL; + if (SQLITE_OK != + sqlite3_exec(manifest_db, query, __appinfo_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_sqlite_query(char *query, sqlite_query_callback callback, void *data) +{ + char *error_message = NULL; + if (SQLITE_OK != + sqlite3_exec(manifest_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; +} + + +static int __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 char *__get_package_from_icon(char *icon) +{ + char *package; + char *extension; + + retv_if(!icon, NULL); + + package = strdup(icon); + retv_if(!package, NULL); + extension = rindex(package, '.'); + if (extension) { + *extension = '\0'; + } else { + _LOGE("cannot extract from icon [%s] to package.", icon); + } + + return package; +} + +static char *__get_icon_with_path(char *icon) +{ + retv_if(!icon, NULL); + + if (index(icon, '/') == NULL) { + char *package; + char *theme = NULL; + char *icon_with_path = NULL; + int len; + + package = __get_package_from_icon(icon); + retv_if(!package, NULL); + + theme = vconf_get_str("db/setting/theme"); + if (!theme) { + theme = strdup("default"); + if(!theme) { + free(package); + return NULL; + } + } + + len = (0x01 << 7) + strlen(icon) + strlen(package) + strlen(theme); + icon_with_path = malloc(len); + if(icon_with_path == NULL) { + _LOGE("(icon_with_path == NULL) return\n"); + free(package); + free(theme); + return NULL; + } + + memset(icon_with_path, 0, len); + + sqlite3_snprintf( len, icon_with_path,"/opt/share/icons/%q/small/%q", theme, icon); + do { + if (access(icon_with_path, R_OK) == 0) break; + sqlite3_snprintf( len, icon_with_path,"/usr/share/icons/%q/small/%q", theme, icon); + if (access(icon_with_path, R_OK) == 0) break; + _LOGE("cannot find icon %s", icon_with_path); + sqlite3_snprintf( len, icon_with_path, "/opt/share/icons/default/small/%q", icon); + if (access(icon_with_path, R_OK) == 0) break; + sqlite3_snprintf( len, icon_with_path, "/usr/share/icons/default/small/%q", icon); + if (access(icon_with_path, R_OK) == 0) break; + + #if 1 /* this will be remove when finish the work for moving icon path */ + _LOGE("icon file must be moved to %s", icon_with_path); + sqlite3_snprintf( len, icon_with_path, "/opt/apps/%q/res/icons/%q/small/%q", package, theme, icon); + if (access(icon_with_path, R_OK) == 0) break; + sqlite3_snprintf( len, icon_with_path, "/usr/apps/%q/res/icons/%q/small/%q", package, theme, icon); + if (access(icon_with_path, R_OK) == 0) break; + _LOGE("cannot find icon %s", icon_with_path); + sqlite3_snprintf( len, icon_with_path, "/opt/apps/%q/res/icons/default/small/%q", package, icon); + if (access(icon_with_path, R_OK) == 0) break; + sqlite3_snprintf( len, icon_with_path, "/usr/apps/%q/res/icons/default/small/%q", package, icon); + if (access(icon_with_path, R_OK) == 0) break; + #endif + } while (0); + + free(theme); + free(package); + + _LOGD("Icon path : %s ---> %s", icon, icon_with_path); + + return icon_with_path; + } else { + char* confirmed_icon = NULL; + + confirmed_icon = strdup(icon); + retv_if(!confirmed_icon, NULL); + return confirmed_icon; + } +} + +static int __check_validation_of_qurey_cb(void *data, int ncols, char **coltxt, char **colname) +{ + int *p = (int*)data; + *p = atoi(coltxt[0]); + return 0; +} + +static int __check_app_locale_from_app_localized_info_by_exact(const char *appid, const char *locale) +{ + int result_query = -1; + char query[MAX_QUERY_LEN]; + + snprintf(query, MAX_QUERY_LEN, "select exists(select app_locale from package_app_localized_info where app_id='%s' and app_locale='%s')", appid, locale); + __exec_sqlite_query(query, __check_validation_of_qurey_cb, (void *)&result_query); + + return result_query; +} + +static int __check_app_locale_from_app_localized_info_by_fallback(const char *appid, const char *locale) +{ + int result_query = -1; + char wildcard[2] = {'%','\0'}; + char query[MAX_QUERY_LEN]; + char lang[3] = {'\0'}; + strncpy(lang, locale, LANGUAGE_LENGTH); + + snprintf(query, MAX_QUERY_LEN, "select exists(select app_locale from package_app_localized_info where app_id='%s' and app_locale like '%s%s')", appid, lang, wildcard); + __exec_sqlite_query(query, __check_validation_of_qurey_cb, (void *)&result_query); + + return result_query; +} + +static char* __get_app_locale_from_app_localized_info_by_fallback(const char *appid, const char *locale) +{ + char wildcard[2] = {'%','\0'}; + char lang[3] = {'\0'}; + char query[MAX_QUERY_LEN]; + 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, NULL, sizeof(*info)); + + strncpy(lang, locale, 2); + snprintf(query, MAX_QUERY_LEN, "select app_locale from package_app_localized_info where app_id='%s' and app_locale like '%s%s'", appid, lang, wildcard); + __exec_sqlite_query(query, __fallback_locale_cb, (void *)info); + locale_new = info->locale; + free(info); + + return locale_new; +} + +static char* __convert_syslocale_to_manifest_locale(char *syslocale) +{ + char *locale = malloc(6); + if (!locale) { + _LOGE("Malloc Failed\n"); + return NULL; + } + + sprintf(locale, "%c%c-%c%c", syslocale[0], syslocale[1], tolower(syslocale[3]), tolower(syslocale[4])); + return locale; +} + +static char* __get_app_locale_by_fallback(const char *appid, const char *syslocale) +{ + assert(appid); + assert(syslocale); + + char *locale = NULL; + char *locale_new = NULL; + int check_result = 0; + + locale = __convert_syslocale_to_manifest_locale(syslocale); + + /*check exact matching */ + check_result = __check_app_locale_from_app_localized_info_by_exact(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(appid, locale); + if(check_result == 1) { + locale_new = __get_app_locale_from_app_localized_info_by_fallback(appid, locale); + _LOGD("%s found (%s) language-locale in DB by fallback!\n", appid, locale_new); + free(locale); + if (locale_new == NULL) + locale_new = strdup(DEFAULT_LOCALE); + return locale_new; + } + + /* default locale */ + free(locale); + _LOGD("%s DEFAULT_LOCALE)\n", appid); + return strdup(DEFAULT_LOCALE); +} + +long long _pkgmgr_calculate_dir_size(char *dirname) +{ + long long total = 0; + long long ret = 0; + int q = 0; /*quotient*/ + int r = 0; /*remainder*/ + DIR *dp = NULL; + struct dirent *ep = NULL; + struct stat fileinfo; + char abs_filename[FILENAME_MAX] = { 0, }; + if (dirname == NULL) { + _LOGE("dirname is NULL"); + return PMINFO_R_ERROR; + } + dp = opendir(dirname); + if (dp != NULL) { + while ((ep = readdir(dp)) != NULL) { + if (!strcmp(ep->d_name, ".") || + !strcmp(ep->d_name, "..")) { + continue; + } + snprintf(abs_filename, FILENAME_MAX, "%s/%s", dirname, + ep->d_name); + if (lstat(abs_filename, &fileinfo) < 0) + perror(abs_filename); + else { + if (S_ISDIR(fileinfo.st_mode)) { + total += fileinfo.st_size; + if (strcmp(ep->d_name, ".") + && strcmp(ep->d_name, "..")) { + ret = _pkgmgr_calculate_dir_size + (abs_filename); + total = total + ret; + } + } else if (S_ISLNK(fileinfo.st_mode)) { + continue; + } else { + /*It is a file. Calculate the actual + size occupied (in terms of 4096 blocks)*/ + q = (fileinfo.st_size / BLOCK_SIZE); + r = (fileinfo.st_size % BLOCK_SIZE); + if (r) { + q = q + 1; + } + total += q * BLOCK_SIZE; + } + } + } + (void)closedir(dp); + } else { + _LOGE("Couldn't open the directory\n"); + return -1; + } + return total; + +} + +API int pkgmgrinfo_pkginfo_get_list(pkgmgrinfo_pkg_list_cb pkg_list_cb, void *user_data) +{ + if (pkg_list_cb == NULL) { + _LOGE("callback function is NULL\n"); + return PMINFO_R_EINVAL; + } + char *error_message = NULL; + int ret = PMINFO_R_OK; + char query[MAX_QUERY_LEN] = {'\0'}; + char *syslocale = NULL; + char *locale = NULL; + pkgmgr_pkginfo_x *pkginfo = NULL; + label_x *tmp1 = NULL; + icon_x *tmp2 = NULL; + description_x *tmp3 = NULL; + author_x *tmp4 = NULL; + + syslocale = vconf_get_str(VCONFKEY_LANGSET); + if (syslocale == NULL) { + _LOGE("current locale is NULL\n"); + ret = PMINFO_R_ERROR; + goto err; + } + locale = __convert_system_locale_to_manifest_locale(syslocale); + if (locale == NULL) { + _LOGE("manifest locale is NULL\n"); + ret = PMINFO_R_EINVAL; + goto err; + } + + ret = __open_manifest_db(); + if (ret == -1) { + _LOGE("Fail to open manifest DB\n"); + ret = PMINFO_R_ERROR; + goto err; + } + pkgmgr_pkginfo_x *tmphead = calloc(1, sizeof(pkgmgr_pkginfo_x)); + pkgmgr_pkginfo_x *node = NULL; + pkgmgr_pkginfo_x *temp_node = NULL; + + snprintf(query, MAX_QUERY_LEN, "select * from package_info"); + if (SQLITE_OK != + sqlite3_exec(manifest_db, query, __pkg_list_cb, (void *)tmphead, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + sqlite3_close(manifest_db); + ret = PMINFO_R_ERROR; + goto err; + } + + LISTHEAD(tmphead, node); + + for(node = node->next; node ; node = node->next) { + pkginfo = node; + + /*populate manifest_info from DB*/ + snprintf(query, MAX_QUERY_LEN, "select * from package_info where package='%s' ", pkginfo->manifest_info->package); + ret = __exec_pkginfo_query(query, (void *)pkginfo); + if (ret == -1) { + _LOGE("Package Info DB Information retrieval failed\n"); + ret = PMINFO_R_ERROR; + goto err; + } + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select * from package_localized_info where" \ + " package='%s' and package_locale='%s'", pkginfo->manifest_info->package, locale); + ret = __exec_pkginfo_query(query, (void *)pkginfo); + if (ret == -1) { + _LOGE("Package Info DB Information retrieval failed\n"); + ret = PMINFO_R_ERROR; + goto err; + } + /*Also store the values corresponding to default locales*/ + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select * from package_localized_info where" \ + " package='%s' and package_locale='%s'", pkginfo->manifest_info->package, DEFAULT_LOCALE); + ret = __exec_pkginfo_query(query, (void *)pkginfo); + if (ret == -1) { + _LOGE("Package Info DB Information retrieval failed\n"); + ret = PMINFO_R_ERROR; + goto err; + } + if (pkginfo->manifest_info->label) { + LISTHEAD(pkginfo->manifest_info->label, tmp1); + pkginfo->manifest_info->label = tmp1; + } + if (pkginfo->manifest_info->icon) { + LISTHEAD(pkginfo->manifest_info->icon, tmp2); + pkginfo->manifest_info->icon = tmp2; + } + if (pkginfo->manifest_info->description) { + LISTHEAD(pkginfo->manifest_info->description, tmp3); + pkginfo->manifest_info->description = tmp3; + } + if (pkginfo->manifest_info->author) { + LISTHEAD(pkginfo->manifest_info->author, tmp4); + 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; + +err: + sqlite3_close(manifest_db); + if (syslocale) { + free(syslocale); + syslocale = NULL; + } + if (locale) { + free(locale); + locale = NULL; + } + 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_pkginfo_get_pkginfo(const char *pkgid, pkgmgrinfo_pkginfo_h *handle) +{ + if (pkgid == NULL) { + _LOGE("package name is NULL\n"); + return PMINFO_R_EINVAL; + } + if (handle == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + pkgmgr_pkginfo_x *pkginfo = NULL; + char *error_message = NULL; + int ret = PMINFO_R_OK; + char query[MAX_QUERY_LEN] = {'\0'}; + char *syslocale = NULL; + char *locale = NULL; + int exist = 0; + label_x *tmp1 = NULL; + icon_x *tmp2 = NULL; + description_x *tmp3 = NULL; + author_x *tmp4 = NULL; + + /*validate pkgid*/ + ret = __open_manifest_db(); + if (ret == -1) { + _LOGE("Fail to open manifest DB\n"); + ret = PMINFO_R_ERROR; + goto err; + } + snprintf(query, MAX_QUERY_LEN, "select exists(select * from package_info where package='%s')", pkgid); + if (SQLITE_OK != + sqlite3_exec(manifest_db, query, __validate_cb, (void *)&exist, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + sqlite3_close(manifest_db); + return PMINFO_R_ERROR; + } + if (exist == 0) { + _LOGE("Package not found in DB\n"); + ret = PMINFO_R_ERROR; + goto err; + } + + syslocale = vconf_get_str(VCONFKEY_LANGSET); + if (syslocale == NULL) { + _LOGE("current locale is NULL\n"); + ret = PMINFO_R_ERROR; + goto err; + } + locale = __convert_system_locale_to_manifest_locale(syslocale); + if (locale == NULL) { + _LOGE("manifest locale is NULL\n"); + ret = PMINFO_R_EINVAL; + goto err; + } + pkginfo = (pkgmgr_pkginfo_x *)calloc(1, sizeof(pkgmgr_pkginfo_x)); + if (pkginfo == NULL) { + _LOGE("Failed to allocate memory for pkginfo\n"); + return PMINFO_R_ERROR; + } + + pkginfo->manifest_info = (manifest_x *)calloc(1, sizeof(manifest_x)); + if (pkginfo->manifest_info == NULL) { + _LOGE("Failed to allocate memory for manifest info\n"); + ret = PMINFO_R_ERROR; + goto err; + } + pkginfo->manifest_info->package = strdup(pkgid); + /*populate manifest_info from DB*/ + snprintf(query, MAX_QUERY_LEN, "select * from package_info where package='%s' ", pkgid); + ret = __exec_pkginfo_query(query, (void *)pkginfo); + if (ret == -1) { + _LOGE("Package Info DB Information retrieval failed\n"); + ret = PMINFO_R_ERROR; + goto err; + } + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select * from package_localized_info where" \ + " package='%s' and package_locale='%s'", pkgid, locale); + ret = __exec_pkginfo_query(query, (void *)pkginfo); + if (ret == -1) { + _LOGE("Package Info DB Information retrieval failed\n"); + ret = PMINFO_R_ERROR; + goto err; + } + /*Also store the values corresponding to default locales*/ + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select * from package_localized_info where" \ + " package='%s' and package_locale='%s'", pkgid, DEFAULT_LOCALE); + ret = __exec_pkginfo_query(query, (void *)pkginfo); + if (ret == -1) { + _LOGE("Package Info DB Information retrieval failed\n"); + ret = PMINFO_R_ERROR; + goto err; + } + if (pkginfo->manifest_info->label) { + LISTHEAD(pkginfo->manifest_info->label, tmp1); + pkginfo->manifest_info->label = tmp1; + } + if (pkginfo->manifest_info->icon) { + LISTHEAD(pkginfo->manifest_info->icon, tmp2); + pkginfo->manifest_info->icon = tmp2; + } + if (pkginfo->manifest_info->description) { + LISTHEAD(pkginfo->manifest_info->description, tmp3); + pkginfo->manifest_info->description = tmp3; + } + if (pkginfo->manifest_info->author) { + LISTHEAD(pkginfo->manifest_info->author, tmp4); + pkginfo->manifest_info->author = tmp4; + } + *handle = (void *)pkginfo; + sqlite3_close(manifest_db); + if (syslocale) { + free(syslocale); + syslocale = NULL; + } + if (locale) { + free(locale); + locale = NULL; + } + return PMINFO_R_OK; + +err: + *handle = NULL; + __cleanup_pkginfo(pkginfo); + sqlite3_close(manifest_db); + if (syslocale) { + free(syslocale); + syslocale = NULL; + } + if (locale) { + free(locale); + locale = NULL; + } + return ret; +} + + +API int pkgmgrinfo_pkginfo_get_pkgname(pkgmgrinfo_pkginfo_h handle, char **pkg_name) +{ + if (handle == NULL) { + _LOGE("pkginfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (pkg_name == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + if (info->manifest_info->package) + *pkg_name = 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) +{ + if (handle == NULL) { + _LOGE("pkginfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (pkgid == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + if (info->manifest_info->package) + *pkgid = 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) +{ + if (handle == NULL) { + _LOGE("pkginfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (type == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + if (info->manifest_info->type) + *type = info->manifest_info->type; + else + *type = pkgtype; + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_get_version(pkgmgrinfo_pkginfo_h handle, char **version) +{ + if (handle == NULL) { + _LOGE("pkginfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (version == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + 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) +{ + if (handle == NULL) { + _LOGE("pkginfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (location == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + 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_package_size(pkgmgrinfo_pkginfo_h handle, int *size) +{ + if (handle == NULL) { + _LOGE("pkginfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (size == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + char *val = NULL; + char *location = NULL; + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + location = (char *)info->manifest_info->installlocation; + if (strcmp(location, "prefer-external") == 0) + { + val = (char *)info->manifest_info->package_size; + if (val) { + *size = atoi(val); + } else { + *size = 0; + _LOGE("package size is not specified\n"); + return PMINFO_R_ERROR; + } + } else { + *size = 0; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_get_total_size(pkgmgrinfo_pkginfo_h handle, int *size) +{ + if (handle == NULL) { + _LOGE("pkginfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (size == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + + char *pkgid = NULL; + char device_path[PKG_STRING_LEN_MAX] = { '\0', }; + long long rw_size = 0; + long long ro_size= 0; + long long tmp_size= 0; + long long total_size= 0; + struct stat fileinfo; + int ret = -1; + + ret = pkgmgrinfo_pkginfo_get_pkgid(handle,&pkgid); + if(ret < 0) + return PMINFO_R_ERROR; + + /* RW area */ + snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/bin", PKG_RW_PATH, pkgid); + if (lstat(device_path, &fileinfo) == 0) { + if (!S_ISLNK(fileinfo.st_mode)) { + tmp_size = _pkgmgr_calculate_dir_size(device_path); + if (tmp_size > 0) + rw_size += tmp_size; + } + } + + snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/info", PKG_RW_PATH, pkgid); + if (lstat(device_path, &fileinfo) == 0) { + if (!S_ISLNK(fileinfo.st_mode)) { + tmp_size = _pkgmgr_calculate_dir_size(device_path); + if (tmp_size > 0) + rw_size += tmp_size; + } + } + + snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/res", PKG_RW_PATH, pkgid); + if (lstat(device_path, &fileinfo) == 0) { + if (!S_ISLNK(fileinfo.st_mode)) { + tmp_size = _pkgmgr_calculate_dir_size(device_path); + if (tmp_size > 0) + rw_size += tmp_size; + } + } + + snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/data", PKG_RW_PATH, pkgid); + if (lstat(device_path, &fileinfo) == 0) { + if (!S_ISLNK(fileinfo.st_mode)) { + tmp_size = _pkgmgr_calculate_dir_size(device_path); + if (tmp_size > 0) + rw_size += tmp_size; + } + } + + snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/shared", PKG_RW_PATH, pkgid); + if (lstat(device_path, &fileinfo) == 0) { + if (!S_ISLNK(fileinfo.st_mode)) { + tmp_size = _pkgmgr_calculate_dir_size(device_path); + if (tmp_size > 0) + rw_size += tmp_size; + } + } + + snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/setting", PKG_RW_PATH, pkgid); + if (lstat(device_path, &fileinfo) == 0) { + if (!S_ISLNK(fileinfo.st_mode)) { + tmp_size = _pkgmgr_calculate_dir_size(device_path); + if (tmp_size > 0) + rw_size += tmp_size; + } + } + + /* RO area */ + snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/bin", PKG_RO_PATH, pkgid); + if (lstat(device_path, &fileinfo) == 0) { + if (!S_ISLNK(fileinfo.st_mode)) { + tmp_size = _pkgmgr_calculate_dir_size(device_path); + if (tmp_size > 0) + ro_size += tmp_size; + } + } + + snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/info", PKG_RO_PATH, pkgid); + if (lstat(device_path, &fileinfo) == 0) { + if (!S_ISLNK(fileinfo.st_mode)) { + tmp_size = _pkgmgr_calculate_dir_size(device_path); + if (tmp_size > 0) + ro_size += tmp_size; + } + } + + snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/res", PKG_RO_PATH, pkgid); + if (lstat(device_path, &fileinfo) == 0) { + if (!S_ISLNK(fileinfo.st_mode)) { + tmp_size = _pkgmgr_calculate_dir_size(device_path); + if (tmp_size > 0) + ro_size += tmp_size; + } + } + + snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/data", PKG_RO_PATH, pkgid); + if (lstat(device_path, &fileinfo) == 0) { + if (!S_ISLNK(fileinfo.st_mode)) { + tmp_size = _pkgmgr_calculate_dir_size(device_path); + if (tmp_size > 0) + ro_size += tmp_size; + } + } + + snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/shared", PKG_RO_PATH, pkgid); + if (lstat(device_path, &fileinfo) == 0) { + if (!S_ISLNK(fileinfo.st_mode)) { + tmp_size = _pkgmgr_calculate_dir_size(device_path); + if (tmp_size > 0) + ro_size += tmp_size; + } + } + + snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/setting", PKG_RO_PATH, pkgid); + if (lstat(device_path, &fileinfo) == 0) { + if (!S_ISLNK(fileinfo.st_mode)) { + tmp_size = _pkgmgr_calculate_dir_size(device_path); + if (tmp_size > 0) + ro_size += tmp_size; + } + } + + /* Total size */ + total_size = rw_size + ro_size; + *size = (int)total_size; + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_get_data_size(pkgmgrinfo_pkginfo_h handle, int *size) +{ + if (handle == NULL) { + _LOGE("pkginfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (size == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + + char *pkgid = NULL; + char device_path[PKG_STRING_LEN_MAX] = { '\0', }; + long long total_size= 0; + int ret = -1; + + ret = pkgmgrinfo_pkginfo_get_pkgid(handle,&pkgid); + if(ret < 0) + return PMINFO_R_ERROR; + + snprintf(device_path, PKG_STRING_LEN_MAX, "%s%s/data", PKG_RW_PATH, pkgid); + if (access(device_path, R_OK) == 0) + total_size = _pkgmgr_calculate_dir_size(device_path); + if (total_size < 0) + return PMINFO_R_ERROR; + + *size = (int)total_size; + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_get_icon(pkgmgrinfo_pkginfo_h handle, char **icon) +{ +#if 0 + if (handle == NULL) { + _LOGE("pkginfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (icon == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + char *syslocale = NULL; + char *locale = NULL; + char *save = NULL; + icon_x *ptr = NULL; + syslocale = vconf_get_str(VCONFKEY_LANGSET); + if (syslocale == NULL) { + _LOGE("current locale is NULL\n"); + return PMINFO_R_EINVAL; + } + locale = __convert_system_locale_to_manifest_locale(syslocale); + if (locale == NULL) { + _LOGE("manifest locale is NULL\n"); + return PMINFO_R_EINVAL; + } + save = locale; + *icon = NULL; + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + for(ptr = info->manifest_info->icon; ptr != NULL; ptr = ptr->next) + { + if (ptr->lang) { + if (strcmp(ptr->lang, locale) == 0) { + *icon = (char *)ptr->text; + if (strcasecmp(*icon, "(null)") == 0) { + locale = DEFAULT_LOCALE; + continue; + } else + break; + } else if (strcmp(ptr->lang, DEFAULT_LOCALE) == 0) { + *icon = (char *)ptr->text; + break; + } + } + } + + if (syslocale) { + free(syslocale); + syslocale = NULL; + } + locale = save; + if (locale) { + free(locale); + locale = NULL; + } +#else + pkgmgr_pkginfo_x *info_tmp = (pkgmgr_pkginfo_x *)handle; + pkgmgrinfo_appinfo_h apphandle; + + pkgmgrinfo_appinfo_get_appinfo(info_tmp->manifest_info->mainapp_id, &apphandle); + pkgmgrinfo_appinfo_get_icon(apphandle, &info_tmp->tmp); + if (info_tmp->tmp_dup){ + free((void *)info_tmp->tmp_dup); + info_tmp->tmp_dup = NULL; + } + info_tmp->tmp_dup= strdup(info_tmp->tmp); + *icon = info_tmp->tmp_dup; + pkgmgrinfo_appinfo_destroy_appinfo(apphandle); +#endif + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_get_label(pkgmgrinfo_pkginfo_h handle, char **label) +{ +#if 0 + if (handle == NULL) { + _LOGE("pkginfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (label == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + char *syslocale = NULL; + char *locale = NULL; + char *save = NULL; + label_x *ptr = NULL; + syslocale = vconf_get_str(VCONFKEY_LANGSET); + if (syslocale == NULL) { + _LOGE("current locale is NULL\n"); + return PMINFO_R_EINVAL; + } + locale = __convert_system_locale_to_manifest_locale(syslocale); + if (locale == NULL) { + _LOGE("manifest locale is NULL\n"); + return PMINFO_R_EINVAL; + } + save = locale; + *label = NULL; + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + for(ptr = info->manifest_info->label; ptr != NULL; ptr = ptr->next) + { + if (ptr->lang) { + if (strcmp(ptr->lang, locale) == 0) { + *label = (char *)ptr->text; + if (strcasecmp(*label, "(null)") == 0) { + locale = DEFAULT_LOCALE; + continue; + } else + break; + } else if (strcmp(ptr->lang, DEFAULT_LOCALE) == 0) { + *label = (char *)ptr->text; + break; + } + } + } + + if (syslocale) { + free(syslocale); + syslocale = NULL; + } + locale = save; + if (locale) { + free(locale); + locale = NULL; + } +#else + pkgmgr_pkginfo_x *info_tmp = (pkgmgr_pkginfo_x *)handle; + pkgmgrinfo_appinfo_h apphandle; + + pkgmgrinfo_appinfo_get_appinfo(info_tmp->manifest_info->mainapp_id, &apphandle); + pkgmgrinfo_appinfo_get_label(apphandle, &info_tmp->tmp); + if (info_tmp->tmp_dup){ + free((void *)info_tmp->tmp_dup); + info_tmp->tmp_dup = NULL; + } + info_tmp->tmp_dup = strdup(info_tmp->tmp); + *label = info_tmp->tmp_dup; + pkgmgrinfo_appinfo_destroy_appinfo(apphandle); +#endif + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_get_description(pkgmgrinfo_pkginfo_h handle, char **description) +{ + if (handle == NULL) { + _LOGE("pkginfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (description == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + char *syslocale = NULL; + char *locale = NULL; + char *save = NULL; + description_x *ptr = NULL; + syslocale = vconf_get_str(VCONFKEY_LANGSET); + if (syslocale == NULL) { + _LOGE("current locale is NULL\n"); + return PMINFO_R_EINVAL; + } + locale = __convert_system_locale_to_manifest_locale(syslocale); + if (locale == NULL) { + _LOGE("manifest locale is NULL\n"); + return PMINFO_R_EINVAL; + } + save = locale; + *description = NULL; + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + 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, "(null)") == 0) { + locale = DEFAULT_LOCALE; + continue; + } else + break; + } else if (strcmp(ptr->lang, DEFAULT_LOCALE) == 0) { + *description = (char *)ptr->text; + break; + } + } + } + if (syslocale) { + free(syslocale); + syslocale = NULL; + } + locale = save; + if (locale) { + free(locale); + locale = NULL; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_get_author_name(pkgmgrinfo_pkginfo_h handle, char **author_name) +{ + if (handle == NULL) { + _LOGE("pkginfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (author_name == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + char *syslocale = NULL; + char *locale = NULL; + char *save = NULL; + author_x *ptr = NULL; + syslocale = vconf_get_str(VCONFKEY_LANGSET); + if (syslocale == NULL) { + _LOGE("current locale is NULL\n"); + return PMINFO_R_EINVAL; + } + locale = __convert_system_locale_to_manifest_locale(syslocale); + if (locale == NULL) { + _LOGE("manifest locale is NULL\n"); + return PMINFO_R_EINVAL; + } + save = locale; + *author_name = NULL; + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + 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, "(null)") == 0) { + locale = DEFAULT_LOCALE; + continue; + } else + break; + } else if (strcmp(ptr->lang, DEFAULT_LOCALE) == 0) { + *author_name = (char *)ptr->text; + break; + } + } + } + if (syslocale) { + free(syslocale); + syslocale = NULL; + } + locale = save; + if (locale) { + free(locale); + locale = NULL; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_get_author_email(pkgmgrinfo_pkginfo_h handle, char **author_email) +{ + if (handle == NULL) { + _LOGE("pkginfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (author_email == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + 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) +{ + if (handle == NULL) { + _LOGE("pkginfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (author_href == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + 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) +{ + int ret = -1; + char *pkgid; + + pkgmgrinfo_pkginfo_get_pkgid(handle, &pkgid); + if (pkgid == NULL){ + _LOGE("invalid func parameters\n"); + return PMINFO_R_ERROR; + } + + FILE *fp = NULL; + char app_mmc_path[FILENAME_MAX] = { 0, }; + char app_dir_path[FILENAME_MAX] = { 0, }; + char app_mmc_internal_path[FILENAME_MAX] = { 0, }; + snprintf(app_dir_path, FILENAME_MAX, + "%s%s", PKG_INSTALLATION_PATH, pkgid); + snprintf(app_mmc_path, FILENAME_MAX, + "%s%s", PKG_SD_PATH, pkgid); + snprintf(app_mmc_internal_path, FILENAME_MAX, + "%s%s/.mmc", PKG_INSTALLATION_PATH, pkgid); + + /*check whether application is in external memory or not */ + fp = fopen(app_mmc_path, "r"); + if (fp == NULL) { + _LOGE(" app path in external memory not accesible\n"); + } else { + fclose(fp); + fp = NULL; + *storage = PMINFO_EXTERNAL_STORAGE; + return PMINFO_R_OK; + } + + /*check whether application is in internal or not */ + fp = fopen(app_dir_path, "r"); + if (fp == NULL) { + _LOGE(" app path in internal memory not accesible\n"); + *storage = -1; + return PMINFO_R_ERROR; + } else { + fclose(fp); + /*check whether the application is installed in SD card + but SD card is not present*/ + fp = fopen(app_mmc_internal_path, "r"); + if (fp == NULL) { + *storage = PMINFO_INTERNAL_STORAGE; + return PMINFO_R_OK; + } else { + fclose(fp); + *storage = PMINFO_EXTERNAL_STORAGE; + return PMINFO_R_OK; + } + } +} + +API int pkgmgrinfo_pkginfo_get_installed_time(pkgmgrinfo_pkginfo_h handle, int *installed_time) +{ + if (handle == NULL) { + _LOGE("pkginfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (installed_time == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + 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) +{ + if (handle == NULL) { + _LOGE("pkginfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (storeclientid == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + 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) +{ + if (handle == NULL) { + _LOGE("pkginfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (mainappid == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + 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) +{ + if (handle == NULL) { + _LOGE("pkginfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (url == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle; + *url = (char *)info->manifest_info->package_url; + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_get_size_from_xml(const char *manifest, int *size) +{ + char *val = NULL; + const xmlChar *node; + xmlTextReaderPtr reader; + + if (manifest == NULL) { + _LOGE("input argument is NULL\n"); + return PMINFO_R_ERROR; + } + + if (size == NULL) { + _LOGE("output argument is NULL\n"); + return PMINFO_R_ERROR; + } + + xmlInitParser(); + reader = xmlReaderForFile(manifest, NULL, 0); + + if (reader){ + if (__child_element(reader, -1)) { + node = xmlTextReaderConstName(reader); + if (!node) { + _LOGE("xmlTextReaderConstName value is NULL\n"); + xmlFreeTextReader(reader); + xmlCleanupParser(); + return PMINFO_R_ERROR; + } + + if (!strcmp(ASC_CHAR(node), "manifest")) { + if (xmlTextReaderGetAttribute(reader, XML_CHAR("size"))) + val = ASC_CHAR(xmlTextReaderGetAttribute(reader, XML_CHAR("size"))); + + if (val) { + *size = atoi(val); + } else { + *size = 0; + _LOGE("package size is not specified\n"); + xmlFreeTextReader(reader); + xmlCleanupParser(); + return PMINFO_R_ERROR; + } + } else { + _LOGE("Unable to create xml reader\n"); + xmlFreeTextReader(reader); + xmlCleanupParser(); + return PMINFO_R_ERROR; + } + } + } else { + _LOGE("xmlReaderForFile value is NULL\n"); + xmlCleanupParser(); + return PMINFO_R_ERROR; + } + + xmlFreeTextReader(reader); + xmlCleanupParser(); + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_get_location_from_xml(const char *manifest, pkgmgrinfo_install_location *location) +{ + char *val = NULL; + const xmlChar *node; + xmlTextReaderPtr reader; + + if (manifest == NULL) { + _LOGE("input argument is NULL\n"); + return PMINFO_R_ERROR; + } + + if (location == NULL) { + _LOGE("output argument is NULL\n"); + return PMINFO_R_ERROR; + } + + xmlInitParser(); + reader = xmlReaderForFile(manifest, NULL, 0); + + if (reader){ + if ( __child_element(reader, -1)) { + node = xmlTextReaderConstName(reader); + if (!node) { + _LOGE("xmlTextReaderConstName value is NULL\n"); + xmlFreeTextReader(reader); + xmlCleanupParser(); + return PMINFO_R_ERROR; + } + + if (!strcmp(ASC_CHAR(node), "manifest")) { + if (xmlTextReaderGetAttribute(reader, XML_CHAR("install-location"))) + val = ASC_CHAR(xmlTextReaderGetAttribute(reader, XML_CHAR("install-location"))); + + 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; + } + } else { + _LOGE("Unable to create xml reader\n"); + xmlFreeTextReader(reader); + xmlCleanupParser(); + return PMINFO_R_ERROR; + } + } + } else { + _LOGE("xmlReaderForFile value is NULL\n"); + xmlCleanupParser(); + return PMINFO_R_ERROR; + } + + xmlFreeTextReader(reader); + xmlCleanupParser(); + + 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) +{ + if (lhs_package_id == NULL || rhs_package_id == NULL) + { + _LOGE("pkginfo id is NULL\n"); + return PMINFO_R_EINVAL; + } + if (compare_result == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + + int ret = PMINFO_R_OK; + char query[MAX_QUERY_LEN] = {'\0'}; + char *error_message = NULL; + pkgmgr_cert_x *info= NULL; + char *lcert = NULL; + char *rcert = NULL; + int exist = -1; + + info = (pkgmgr_cert_x *)calloc(1, sizeof(pkgmgr_cert_x)); + if (info == NULL) { + _LOGE("Out of Memory!!!\n"); + return PMINFO_R_ERROR; + } + + 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); + free(info); + info = NULL; + return PMINFO_R_ERROR; + } + + snprintf(query, MAX_QUERY_LEN, "select exists(select * from package_cert_info where package='%s')", lhs_package_id); + if (SQLITE_OK != + sqlite3_exec(cert_db, query, __validate_cb, (void *)&exist, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + ret = PMINFO_R_ERROR; + goto err; + } + + if (exist == 0) { + lcert = NULL; + } else { + snprintf(query, MAX_QUERY_LEN, "select author_signer_cert from package_cert_info where package='%s'", lhs_package_id); + if (SQLITE_OK != + sqlite3_exec(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; + goto err; + } + snprintf(query, MAX_QUERY_LEN, "select exists(select * from package_cert_info where package='%s')", info->certvalue); + if (SQLITE_OK != + sqlite3_exec(cert_db, query, __validate_cb, (void *)&exist, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + return PMINFO_R_ERROR; + } + if (exist == 0) + lcert = info->certvalue; + else { + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select author_signer_cert from package_cert_info where package='%s'", info->certvalue); + free(info->certvalue); + info->certvalue = NULL; + if (SQLITE_OK != + sqlite3_exec(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; + goto err; + } + lcert = info->certvalue; + } + } + + snprintf(query, MAX_QUERY_LEN, "select exists(select * from package_cert_info where package='%s')", rhs_package_id); + if (SQLITE_OK != + sqlite3_exec(cert_db, query, __validate_cb, (void *)&exist, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + ret = PMINFO_R_ERROR; + goto err; + } + + if (exist == 0) { + rcert = NULL; + } else { + snprintf(query, MAX_QUERY_LEN, "select author_signer_cert from package_cert_info where package='%s'", rhs_package_id); + if (SQLITE_OK != + sqlite3_exec(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; + goto err; + } + snprintf(query, MAX_QUERY_LEN, "select exists(select * from package_cert_info where package='%s')", info->certvalue); + if (SQLITE_OK != + sqlite3_exec(cert_db, query, __validate_cb, (void *)&exist, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + return PMINFO_R_ERROR; + } + if (exist == 0) + rcert = info->certvalue; + else { + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select author_signer_cert from package_cert_info where package='%s'", info->certvalue); + free(info->certvalue); + info->certvalue = NULL; + if (SQLITE_OK != + sqlite3_exec(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; + goto err; + } + rcert = info->certvalue; + } + } + + if ((lcert == NULL) || (rcert == NULL)) + { + if ((lcert == NULL) && (rcert == NULL)) + *compare_result = PMINFO_CERT_COMPARE_BOTH_NO_CERT; + else if (lcert == NULL) + *compare_result = PMINFO_CERT_COMPARE_LHS_NO_CERT; + else if (rcert == NULL) + *compare_result = PMINFO_CERT_COMPARE_RHS_NO_CERT; + } else { + if (strcmp(lcert, rcert) == 0) + *compare_result = PMINFO_CERT_COMPARE_MATCH; + else + *compare_result = PMINFO_CERT_COMPARE_MISMATCH; + } + +err: + sqlite3_free(error_message); + sqlite3_close(cert_db); + if (info) { + free(info); + info = NULL; + } + + 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) +{ + if (lhs_app_id == NULL || rhs_app_id == NULL) + { + _LOGE("pkginfo id is NULL\n"); + return PMINFO_R_EINVAL; + } + if (compare_result == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + + int ret = PMINFO_R_OK; + char query[MAX_QUERY_LEN] = {'\0'}; + char *error_message = NULL; + pkgmgr_cert_x *info= NULL; + char *lcert = NULL; + char *rcert = NULL; + char *lhs_package_id = NULL; + char *rhs_package_id = NULL; + int exist = -1; + + info = (pkgmgr_cert_x *)calloc(1, sizeof(pkgmgr_cert_x)); + if (info == NULL) { + _LOGE("Out of Memory!!!\n"); + return PMINFO_R_ERROR; + } + + ret = db_util_open_with_options(MANIFEST_DB, &manifest_db, + SQLITE_OPEN_READONLY, NULL); + if (ret != SQLITE_OK) { + _LOGE("connect db [%s] failed!\n", MANIFEST_DB); + free(info); + info = NULL; + return PMINFO_R_ERROR; + } + 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); + sqlite3_close(manifest_db); + free(info); + info = NULL; + return PMINFO_R_ERROR; + } + + snprintf(query, MAX_QUERY_LEN, "select exists(select * from package_app_info where app_id='%s')", lhs_app_id); + if (SQLITE_OK != + sqlite3_exec(manifest_db, query, __validate_cb, (void *)&exist, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + ret = PMINFO_R_ERROR; + goto err; + } + + if (exist == 0) { + lcert = NULL; + } else { + snprintf(query, MAX_QUERY_LEN, "select package from package_app_info where app_id='%s' ", lhs_app_id); + if (SQLITE_OK != + sqlite3_exec(manifest_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; + goto err; + } + + snprintf(query, MAX_QUERY_LEN, "select author_signer_cert from package_cert_info where package='%s'", info->pkgid); + if (SQLITE_OK != + sqlite3_exec(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; + goto err; + } + snprintf(query, MAX_QUERY_LEN, "select exists(select * from package_cert_info where package='%s')", info->certvalue); + if (SQLITE_OK != + sqlite3_exec(cert_db, query, __validate_cb, (void *)&exist, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + return PMINFO_R_ERROR; + } + if (exist == 0) + lcert = info->certvalue; + else { + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select author_signer_cert from package_cert_info where package='%s'", info->certvalue); + free(info->certvalue); + info->certvalue = NULL; + if (SQLITE_OK != + sqlite3_exec(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; + goto err; + } + lcert = info->certvalue; + } + } + + snprintf(query, MAX_QUERY_LEN, "select exists(select * from package_app_info where app_id='%s')", rhs_app_id); + if (SQLITE_OK != + sqlite3_exec(manifest_db, query, __validate_cb, (void *)&exist, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + ret = PMINFO_R_ERROR; + goto err; + } + + if (exist == 0) { + rcert = NULL; + } else { + snprintf(query, MAX_QUERY_LEN, "select package from package_app_info where app_id='%s' ", rhs_app_id); + if (SQLITE_OK != + sqlite3_exec(manifest_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; + goto err; + } + + snprintf(query, MAX_QUERY_LEN, "select author_signer_cert from package_cert_info where package='%s'", info->pkgid); + if (SQLITE_OK != + sqlite3_exec(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; + goto err; + } + snprintf(query, MAX_QUERY_LEN, "select exists(select * from package_cert_info where package='%s')", info->certvalue); + if (SQLITE_OK != + sqlite3_exec(cert_db, query, __validate_cb, (void *)&exist, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + return PMINFO_R_ERROR; + } + if (exist == 0) + rcert = info->certvalue; + else { + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select author_signer_cert from package_cert_info where package='%s'", info->certvalue); + free(info->certvalue); + info->certvalue = NULL; + if (SQLITE_OK != + sqlite3_exec(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; + goto err; + } + rcert = info->certvalue; + } + } + + if ((lcert == NULL) || (rcert == NULL)) + { + if ((lcert == NULL) && (rcert == NULL)) + *compare_result = PMINFO_CERT_COMPARE_BOTH_NO_CERT; + else if (lcert == NULL) + *compare_result = PMINFO_CERT_COMPARE_LHS_NO_CERT; + else if (rcert == NULL) + *compare_result = PMINFO_CERT_COMPARE_RHS_NO_CERT; + } else { + if (strcmp(lcert, rcert) == 0) + *compare_result = PMINFO_CERT_COMPARE_MATCH; + else + *compare_result = PMINFO_CERT_COMPARE_MISMATCH; + } + +err: + sqlite3_free(error_message); + sqlite3_close(manifest_db); + sqlite3_close(cert_db); + if (info) { + free(info); + info = NULL; + } + + return ret; +} + +API int pkgmgrinfo_pkginfo_is_accessible(pkgmgrinfo_pkginfo_h handle, bool *accessible) +{ + char *pkgid; + + pkgmgrinfo_pkginfo_get_pkgid(handle, &pkgid); + if (pkgid == NULL){ + _LOGD("invalid func parameters\n"); + return PMINFO_R_ERROR; + } + _LOGD("pkgmgr_get_pkg_external_validation() called\n"); + + FILE *fp = NULL; + char app_mmc_path[FILENAME_MAX] = { 0, }; + char app_dir_path[FILENAME_MAX] = { 0, }; + char app_mmc_internal_path[FILENAME_MAX] = { 0, }; + snprintf(app_dir_path, FILENAME_MAX,"%s%s", PKG_INSTALLATION_PATH, pkgid); + snprintf(app_mmc_path, FILENAME_MAX,"%s%s", PKG_SD_PATH, pkgid); + snprintf(app_mmc_internal_path, FILENAME_MAX,"%s%s/.mmc", PKG_INSTALLATION_PATH, pkgid); + + /*check whether application is in external memory or not */ + fp = fopen(app_mmc_path, "r"); + if (fp == NULL){ + _LOGD(" app path in external memory not accesible\n"); + } else { + fclose(fp); + fp = NULL; + *accessible = 1; + _LOGD("pkgmgr_get_pkg_external_validation() : SD_CARD \n"); + return PMINFO_R_OK; + } + + /*check whether application is in internal or not */ + fp = fopen(app_dir_path, "r"); + if (fp == NULL) { + _LOGD(" app path in internal memory not accesible\n"); + *accessible = 0; + return PMINFO_R_ERROR; + } else { + fclose(fp); + /*check whether the application is installed in SD card + but SD card is not present*/ + fp = fopen(app_mmc_internal_path, "r"); + if (fp == NULL){ + *accessible = 1; + _LOGD("pkgmgr_get_pkg_external_validation() : INTERNAL_MEM \n"); + return PMINFO_R_OK; + } + else{ + *accessible = 0; + _LOGD("pkgmgr_get_pkg_external_validation() : ERROR_MMC_STATUS \n"); + } + fclose(fp); + } + + _LOGD("pkgmgr_get_pkg_external_validation() end\n"); + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_is_removable(pkgmgrinfo_pkginfo_h handle, bool *removable) +{ + if (handle == NULL) { + _LOGE("pkginfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (removable == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + 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_preload(pkgmgrinfo_pkginfo_h handle, bool *preload) +{ + if (handle == NULL) { + _LOGE("pkginfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (preload == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + 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_readonly(pkgmgrinfo_pkginfo_h handle, bool *readonly) +{ + if (handle == NULL) { + _LOGE("pkginfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (readonly == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + 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_destroy_pkginfo(pkgmgrinfo_pkginfo_h handle) +{ + if (handle == NULL) { + _LOGE("pkginfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + 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) +{ + if (handle == NULL) { + _LOGE("Filter handle output parameter is NULL\n"); + return PMINFO_R_EINVAL; + } + *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) +{ + if (handle == NULL) { + _LOGE("Filter handle input parameter is NULL\n"); + return PMINFO_R_EINVAL; + } + 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(filter); + filter = NULL; + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_filter_add_int(pkgmgrinfo_pkginfo_filter_h handle, + const char *property, const int value) +{ + if (handle == NULL || property == NULL) { + _LOGE("Filter handle input parameter is NULL\n"); + return PMINFO_R_EINVAL; + } + 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(node); + node = NULL; + 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) +{ + if (handle == NULL || property == NULL) { + _LOGE("Filter handle input parameter is NULL\n"); + return PMINFO_R_EINVAL; + } + 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(node); + node = NULL; + 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) +{ + if (handle == NULL || property == NULL || value == NULL) { + _LOGE("Filter handle input parameter is NULL\n"); + return PMINFO_R_EINVAL; + } + 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 + val = strndup(value, PKG_STRING_LEN_MAX - 1); + if (val == NULL) { + _LOGE("Out of Memory\n"); + free(node); + node = NULL; + 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) +{ + if (handle == NULL || count == NULL) { + _LOGE("Filter handle input parameter is NULL\n"); + return PMINFO_R_EINVAL; + } + char *syslocale = NULL; + char *locale = NULL; + char *condition = NULL; + char *error_message = NULL; + char query[MAX_QUERY_LEN] = {'\0'}; + char where[MAX_QUERY_LEN] = {'\0'}; + GSList *list; + int ret = 0; + + pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x*)handle; + /*Get current locale*/ + syslocale = vconf_get_str(VCONFKEY_LANGSET); + if (syslocale == NULL) { + _LOGE("current locale is NULL\n"); + return PMINFO_R_ERROR; + } + locale = __convert_system_locale_to_manifest_locale(syslocale); + if (locale == NULL) { + _LOGE("manifest locale is NULL\n"); + free(syslocale); + return PMINFO_R_ERROR; + } + ret = __open_manifest_db(); + if (ret == -1) { + _LOGE("Fail to open manifest DB\n"); + ret = PMINFO_R_ERROR; + goto err; + } + + /*Start constructing query*/ + snprintf(query, MAX_QUERY_LEN - 1, FILTER_QUERY_COUNT_PACKAGE, 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(condition); + condition = NULL; + } + if (g_slist_next(list)) { + strncat(where, " and ", 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); + + /*Execute Query*/ + if (SQLITE_OK != + sqlite3_exec(manifest_db, query, __count_cb, (void *)count, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + sqlite3_close(manifest_db); + ret = PMINFO_R_ERROR; + *count = 0; + goto err; + } + ret = PMINFO_R_OK; +err: + if (locale) { + free(locale); + locale = NULL; + } + if (syslocale) { + free(syslocale); + syslocale = NULL; + } + sqlite3_close(manifest_db); + return ret; +} + +API int pkgmgrinfo_pkginfo_filter_foreach_pkginfo(pkgmgrinfo_pkginfo_filter_h handle, + pkgmgrinfo_pkg_list_cb pkg_cb, void *user_data) +{ + if (handle == NULL || pkg_cb == NULL) { + _LOGE("Filter handle input parameter is NULL\n"); + return PMINFO_R_EINVAL; + } + char *syslocale = NULL; + char *locale = NULL; + char *condition = NULL; + char *error_message = NULL; + char query[MAX_QUERY_LEN] = {'\0'}; + char where[MAX_QUERY_LEN] = {'\0'}; + GSList *list; + int ret = 0; + label_x *tmp1 = NULL; + icon_x *tmp2 = NULL; + description_x *tmp3 = NULL; + author_x *tmp4 = NULL; + pkgmgr_pkginfo_x *node = NULL; + pkgmgr_pkginfo_x *tmphead = NULL; + pkgmgr_pkginfo_x *pkginfo = NULL; + + pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x*)handle; + /*Get current locale*/ + syslocale = vconf_get_str(VCONFKEY_LANGSET); + if (syslocale == NULL) { + _LOGE("current locale is NULL\n"); + return PMINFO_R_ERROR; + } + locale = __convert_system_locale_to_manifest_locale(syslocale); + if (locale == NULL) { + _LOGE("manifest locale is NULL\n"); + free(syslocale); + return PMINFO_R_ERROR; + } + ret = __open_manifest_db(); + if (ret == -1) { + _LOGE("Fail to open manifest DB\n"); + ret = PMINFO_R_ERROR; + goto err; + } + /*Start constructing query*/ + snprintf(query, MAX_QUERY_LEN - 1, FILTER_QUERY_LIST_PACKAGE, 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(condition); + condition = NULL; + } + if (g_slist_next(list)) { + strncat(where, " and ", 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); + tmphead = calloc(1, sizeof(pkgmgr_pkginfo_x)); + if (tmphead == NULL) { + _LOGE("Out of Memory!!!\n"); + ret = PMINFO_R_ERROR; + goto err; + } + + if (SQLITE_OK != + sqlite3_exec(manifest_db, query, __pkg_list_cb, (void *)tmphead, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + sqlite3_close(manifest_db); + ret = PMINFO_R_ERROR; + goto err; + } + + LISTHEAD(tmphead, node); + for(node = node->next ; node ; node = node->next) { + pkginfo = node; + + /*populate manifest_info from DB*/ + snprintf(query, MAX_QUERY_LEN, "select * from package_info where package='%s' ", pkginfo->manifest_info->package); + ret = __exec_pkginfo_query(query, (void *)pkginfo); + if (ret == -1) { + _LOGE("Package Info DB Information retrieval failed\n"); + ret = PMINFO_R_ERROR; + goto err; + } + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select * from package_localized_info where" \ + " package='%s' and package_locale='%s'", pkginfo->manifest_info->package, locale); + ret = __exec_pkginfo_query(query, (void *)pkginfo); + if (ret == -1) { + _LOGE("Package Info DB Information retrieval failed\n"); + ret = PMINFO_R_ERROR; + goto err; + } + /*Also store the values corresponding to default locales*/ + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select * from package_localized_info where" \ + " package='%s' and package_locale='%s'", pkginfo->manifest_info->package, DEFAULT_LOCALE); + ret = __exec_pkginfo_query(query, (void *)pkginfo); + if (ret == -1) { + _LOGE("Package Info DB Information retrieval failed\n"); + ret = PMINFO_R_ERROR; + goto err; + } + if (pkginfo->manifest_info->label) { + LISTHEAD(pkginfo->manifest_info->label, tmp1); + pkginfo->manifest_info->label = tmp1; + } + if (pkginfo->manifest_info->icon) { + LISTHEAD(pkginfo->manifest_info->icon, tmp2); + pkginfo->manifest_info->icon = tmp2; + } + if (pkginfo->manifest_info->description) { + LISTHEAD(pkginfo->manifest_info->description, tmp3); + pkginfo->manifest_info->description = tmp3; + } + if (pkginfo->manifest_info->author) { + LISTHEAD(pkginfo->manifest_info->author, tmp4); + pkginfo->manifest_info->author = tmp4; + } + } + + LISTHEAD(tmphead, node); + + for(node = node->next ; node ; node = node->next) { + pkginfo = node; + ret = pkg_cb( (void *)pkginfo, user_data); + if(ret < 0) + break; + } + ret = PMINFO_R_OK; + +err: + if (locale) { + free(locale); + locale = NULL; + } + if (syslocale) { + free(syslocale); + syslocale = NULL; + } + sqlite3_close(manifest_db); + __cleanup_pkginfo(tmphead); + return ret; +} + +API int pkgmgrinfo_appinfo_get_list(pkgmgrinfo_pkginfo_h handle, pkgmgrinfo_app_component component, + pkgmgrinfo_app_list_cb app_func, void *user_data) +{ + if (handle == NULL) { + _LOGE("pkginfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (app_func == NULL) { + _LOGE("callback pointer is NULL\n"); + return PMINFO_R_EINVAL; + } + if (component != PMINFO_UI_APP && component != PMINFO_SVC_APP && component != PMINFO_ALL_APP) { + _LOGE("Invalid App Component Type\n"); + return PMINFO_R_EINVAL; + } + char *error_message = NULL; + char *syslocale = NULL; + 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; + + syslocale = vconf_get_str(VCONFKEY_LANGSET); + if (syslocale == NULL) { + _LOGE("current locale is NULL\n"); + ret = PMINFO_R_ERROR; + goto err; + } + locale = __convert_system_locale_to_manifest_locale(syslocale); + if (locale == NULL) { + _LOGE("manifest locale is NULL\n"); + ret = PMINFO_R_EINVAL; + goto err; + } + + allinfo = (pkgmgr_appinfo_x *)calloc(1, sizeof(pkgmgr_appinfo_x)); + if (allinfo == NULL) { + _LOGE("Failed to allocate memory for appinfo\n"); + ret = PMINFO_R_ERROR; + goto err; + } + allinfo->manifest_info = (manifest_x *)calloc(1, sizeof(manifest_x)); + if (allinfo->manifest_info == NULL) { + _LOGE("Out of Memory!!!\n"); + ret = PMINFO_R_ERROR; + goto err; + } + + appinfo = (pkgmgr_appinfo_x *)calloc(1, sizeof(pkgmgr_appinfo_x)); + if (appinfo == NULL) { + _LOGE("Failed to allocate memory for appinfo\n"); + ret = PMINFO_R_ERROR; + goto err; + } + if (component == PMINFO_UI_APP) + appinfo->app_component = PMINFO_UI_APP; + if (component == PMINFO_SVC_APP) + appinfo->app_component = PMINFO_SVC_APP; + if (component == PMINFO_ALL_APP) + appinfo->app_component = PMINFO_ALL_APP; + ret = __open_manifest_db(); + if (ret == -1) { + _LOGE("Fail to open manifest DB\n"); + ret = PMINFO_R_ERROR; + goto err; + } + + appinfo->package = strdup(info->manifest_info->package); + snprintf(query, MAX_QUERY_LEN, "select DISTINCT * " \ + "from package_app_info where " \ + "package='%s' and app_component='%s'", + info->manifest_info->package, + (appinfo->app_component==PMINFO_UI_APP ? "uiapp" : "svcapp")); + + switch(component) { + case PMINFO_UI_APP: + if (SQLITE_OK != + sqlite3_exec(manifest_db, query, __uiapp_list_cb, (void *)info, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + sqlite3_close(manifest_db); + ret = PMINFO_R_ERROR; + goto err; + } + uiapplication_x *tmp = NULL; + if (info->manifest_info->uiapplication) { + LISTHEAD(info->manifest_info->uiapplication, tmp); + 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) + { + appinfo->uiapp_info = tmp; + + if (strcmp(appinfo->uiapp_info->type,"c++app") == 0){ + if (locale) { + free(locale); + } + locale = __get_app_locale_by_fallback(appinfo->uiapp_info->appid, syslocale); + } + + 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_appinfo_query(query, (void *)appinfo); + if (ret == -1) { + _LOGE("App Localized Info DB Information retrieval failed\n"); + ret = PMINFO_R_ERROR; + goto err; + } + 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_appinfo_query(query, (void *)appinfo); + if (ret == -1) { + _LOGE("App Localized Info DB Information retrieval failed\n"); + ret = PMINFO_R_ERROR; + goto err; + } + if (appinfo->uiapp_info->label) { + LISTHEAD(appinfo->uiapp_info->label, ptr2); + appinfo->uiapp_info->label = ptr2; + } + if (appinfo->uiapp_info->icon) { + LISTHEAD(appinfo->uiapp_info->icon, ptr1); + appinfo->uiapp_info->icon = ptr1; + } + ret = app_func((void *)appinfo, user_data); + if (ret < 0) + break; + tmp = tmp->next; + } + break; + case PMINFO_SVC_APP: + if (SQLITE_OK != + sqlite3_exec(manifest_db, query, __svcapp_list_cb, (void *)info, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + sqlite3_close(manifest_db); + ret = PMINFO_R_ERROR; + goto err; + } + serviceapplication_x *tmp1 = NULL; + if (info->manifest_info->serviceapplication) { + LISTHEAD(info->manifest_info->serviceapplication, tmp1); + info->manifest_info->serviceapplication = tmp1; + } + /*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(tmp1 != NULL) + { + appinfo->svcapp_info = tmp1; + 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->svcapp_info->appid, locale); + ret = __exec_appinfo_query(query, (void *)appinfo); + if (ret == -1) { + _LOGE("App Localized Info DB Information retrieval failed\n"); + ret = PMINFO_R_ERROR; + goto err; + } + 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->svcapp_info->appid, DEFAULT_LOCALE); + ret = __exec_appinfo_query(query, (void *)appinfo); + if (ret == -1) { + _LOGE("App Localized Info DB Information retrieval failed\n"); + ret = PMINFO_R_ERROR; + goto err; + } + if (appinfo->svcapp_info->label) { + LISTHEAD(appinfo->svcapp_info->label, ptr2); + appinfo->svcapp_info->label = ptr2; + } + if (appinfo->svcapp_info->icon) { + LISTHEAD(appinfo->svcapp_info->icon, ptr1); + appinfo->svcapp_info->icon = ptr1; + } + ret = app_func((void *)appinfo, user_data); + if (ret < 0) + break; + tmp1 = tmp1->next; + } + break; + case PMINFO_ALL_APP: + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select * from package_app_info where package='%s'", info->manifest_info->package); + if (SQLITE_OK != + sqlite3_exec(manifest_db, query, __allapp_list_cb, (void *)allinfo, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + sqlite3_close(manifest_db); + ret = PMINFO_R_ERROR; + goto err; + } + + /*UI Apps*/ + appinfo->app_component = PMINFO_UI_APP; + uiapplication_x *tmp2 = NULL; + if (allinfo->manifest_info->uiapplication) { + LISTHEAD(allinfo->manifest_info->uiapplication, tmp2); + allinfo->manifest_info->uiapplication = tmp2; + } + /*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(tmp2 != NULL) + { + appinfo->uiapp_info = tmp2; + 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_appinfo_query(query, (void *)appinfo); + if (ret == -1) { + _LOGE("App Localized Info DB Information retrieval failed\n"); + ret = PMINFO_R_ERROR; + goto err; + } + 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_appinfo_query(query, (void *)appinfo); + if (ret == -1) { + _LOGE("App Localized Info DB Information retrieval failed\n"); + ret = PMINFO_R_ERROR; + goto err; + } + if (appinfo->uiapp_info->label) { + LISTHEAD(appinfo->uiapp_info->label, ptr2); + appinfo->uiapp_info->label = ptr2; + } + if (appinfo->uiapp_info->icon) { + LISTHEAD(appinfo->uiapp_info->icon, ptr1); + appinfo->uiapp_info->icon = ptr1; + } + ret = app_func((void *)appinfo, user_data); + if (ret < 0) + break; + tmp2 = tmp2->next; + } + + /*SVC Apps*/ + appinfo->app_component = PMINFO_SVC_APP; + serviceapplication_x *tmp3 = NULL; + if (allinfo->manifest_info->serviceapplication) { + LISTHEAD(allinfo->manifest_info->serviceapplication, tmp3); + allinfo->manifest_info->serviceapplication = tmp3; + } + /*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(tmp3 != NULL) + { + appinfo->svcapp_info = tmp3; + 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->svcapp_info->appid, locale); + ret = __exec_appinfo_query(query, (void *)appinfo); + if (ret == -1) { + _LOGE("App Localized Info DB Information retrieval failed\n"); + ret = PMINFO_R_ERROR; + goto err; + } + 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->svcapp_info->appid, DEFAULT_LOCALE); + ret = __exec_appinfo_query(query, (void *)appinfo); + if (ret == -1) { + _LOGE("App Localized Info DB Information retrieval failed\n"); + ret = PMINFO_R_ERROR; + goto err; + } + if (appinfo->svcapp_info->label) { + LISTHEAD(appinfo->svcapp_info->label, ptr2); + appinfo->svcapp_info->label = ptr2; + } + if (appinfo->svcapp_info->icon) { + LISTHEAD(appinfo->svcapp_info->icon, ptr1); + appinfo->svcapp_info->icon = ptr1; + } + ret = app_func((void *)appinfo, user_data); + if (ret < 0) + break; + tmp3 = tmp3->next; + } + appinfo->app_component = PMINFO_ALL_APP; + break; + + } + + ret = PMINFO_R_OK; +err: + if (locale) { + free(locale); + locale = NULL; + } + if (syslocale) { + free(syslocale); + syslocale = NULL; + } + if (appinfo) { + if (appinfo->package) { + free(appinfo->package); + appinfo->package = NULL; + } + free(appinfo); + appinfo = NULL; + } + __cleanup_pkginfo(allinfo); + + sqlite3_close(manifest_db); + return ret; +} + +API int pkgmgrinfo_appinfo_get_installed_list(pkgmgrinfo_app_list_cb app_func, void *user_data) +{ + if (app_func == NULL) { + _LOGE("callback function is NULL\n"); + return PMINFO_R_EINVAL; + } + char *error_message = NULL; + int ret = PMINFO_R_OK; + char query[MAX_QUERY_LEN] = {'\0'}; + char *syslocale = NULL; + char *locale = NULL; + pkgmgr_appinfo_x *appinfo = NULL; + uiapplication_x *ptr1 = NULL; + serviceapplication_x *ptr2 = NULL; + label_x *tmp1 = NULL; + icon_x *tmp2 = NULL; + + syslocale = vconf_get_str(VCONFKEY_LANGSET); + if (syslocale == NULL) { + _LOGE("current locale is NULL\n"); + ret = PMINFO_R_ERROR; + goto err; + } + locale = __convert_system_locale_to_manifest_locale(syslocale); + if (locale == NULL) { + _LOGE("manifest locale is NULL\n"); + ret = PMINFO_R_EINVAL; + goto err; + } + + ret = __open_manifest_db(); + if (ret == -1) { + _LOGE("Fail to open manifest DB\n"); + ret = PMINFO_R_ERROR; + goto err; + } + pkgmgr_pkginfo_x *info = NULL; + info = (pkgmgr_pkginfo_x *)calloc(1, sizeof(pkgmgr_pkginfo_x)); + if (info == NULL) { + _LOGE("Out of Memory!!!\n"); + ret = PMINFO_R_ERROR; + goto err; + } + info->manifest_info = (manifest_x *)calloc(1, sizeof(manifest_x)); + if (info->manifest_info == NULL) { + _LOGE("Out of Memory!!!\n"); + ret = PMINFO_R_ERROR; + goto err; + } + appinfo = (pkgmgr_appinfo_x *)calloc(1, sizeof(pkgmgr_appinfo_x)); + if (appinfo == NULL) { + _LOGE("Out of Memory!!!\n"); + ret = PMINFO_R_ERROR; + goto err; + } + + snprintf(query, MAX_QUERY_LEN, "select * from package_app_info"); + if (SQLITE_OK != + sqlite3_exec(manifest_db, query, __app_list_cb, (void *)info, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + sqlite3_close(manifest_db); + ret = PMINFO_R_ERROR; + goto err; + } + memset(query, '\0', MAX_QUERY_LEN); + if (info->manifest_info->uiapplication) { + LISTHEAD(info->manifest_info->uiapplication, ptr1); + info->manifest_info->uiapplication = ptr1; + } + if (info->manifest_info->serviceapplication) { + LISTHEAD(info->manifest_info->serviceapplication, ptr2); + info->manifest_info->serviceapplication = ptr2; + } + + /*UI Apps*/ + for(ptr1 = info->manifest_info->uiapplication; ptr1; ptr1 = ptr1->next) + { + appinfo->app_component = PMINFO_UI_APP; + appinfo->package = strdup(ptr1->package); + appinfo->uiapp_info = ptr1; + snprintf(query, MAX_QUERY_LEN, "select DISTINCT * " \ + "from package_app_info where " \ + "app_id='%s'", ptr1->appid); + ret = __exec_appinfo_query(query, (void *)appinfo); + if (ret == -1) { + _LOGE("App Info DB Information retrieval failed\n"); + ret = PMINFO_R_ERROR; + goto err; + } + + if (strcmp(appinfo->uiapp_info->type,"c++app") == 0){ + if (locale) { + free(locale); + } + locale = __get_app_locale_by_fallback(ptr1->appid, syslocale); + } + + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select DISTINCT * " \ + "from package_app_localized_info where " \ + "app_id='%s' and app_locale='%s'", + ptr1->appid, locale); + ret = __exec_appinfo_query(query, (void *)appinfo); + if (ret == -1) { + _LOGE("App Localized Info DB Information retrieval failed\n"); + ret = PMINFO_R_ERROR; + goto err; + } + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select DISTINCT * " \ + "from package_app_localized_info where " \ + "app_id='%s' and app_locale='%s'", + ptr1->appid, DEFAULT_LOCALE); + ret = __exec_appinfo_query(query, (void *)appinfo); + if (ret == -1) { + _LOGE("App Localized Info DB Information retrieval failed\n"); + ret = PMINFO_R_ERROR; + goto err; + } + if (appinfo->uiapp_info->label) { + LISTHEAD(appinfo->uiapp_info->label, tmp1); + appinfo->uiapp_info->label = tmp1; + } + if (appinfo->uiapp_info->icon) { + LISTHEAD(appinfo->uiapp_info->icon, tmp2); + appinfo->uiapp_info->icon= tmp2; + } + ret = app_func((void *)appinfo, user_data); + if (ret < 0) + break; + free(appinfo->package); + appinfo->package = NULL; + } + /*Service Apps*/ + for(ptr2 = info->manifest_info->serviceapplication; ptr2; ptr2 = ptr2->next) + { + appinfo->app_component = PMINFO_SVC_APP; + appinfo->package = strdup(ptr2->package); + appinfo->svcapp_info = ptr2; + snprintf(query, MAX_QUERY_LEN, "select DISTINCT * " \ + "from package_app_info where " \ + "app_id='%s'", ptr2->appid); + ret = __exec_appinfo_query(query, (void *)appinfo); + if (ret == -1) { + _LOGE("App Info DB Information retrieval failed\n"); + ret = PMINFO_R_ERROR; + goto err; + } + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select DISTINCT * " \ + "from package_app_localized_info where " \ + "app_id='%s' and app_locale='%s'", + ptr2->appid, locale); + ret = __exec_appinfo_query(query, (void *)appinfo); + if (ret == -1) { + _LOGE("App Localized Info DB Information retrieval failed\n"); + ret = PMINFO_R_ERROR; + goto err; + } + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select DISTINCT * " \ + "from package_app_localized_info where " \ + "app_id='%s' and app_locale='%s'", + ptr2->appid, DEFAULT_LOCALE); + ret = __exec_appinfo_query(query, (void *)appinfo); + if (ret == -1) { + _LOGE("App Localized Info DB Information retrieval failed\n"); + ret = PMINFO_R_ERROR; + goto err; + } + if (appinfo->svcapp_info->label) { + LISTHEAD(appinfo->svcapp_info->label, tmp1); + appinfo->svcapp_info->label = tmp1; + } + if (appinfo->svcapp_info->icon) { + LISTHEAD(appinfo->svcapp_info->icon, tmp2); + appinfo->svcapp_info->icon= tmp2; + } + ret = app_func((void *)appinfo, user_data); + if (ret < 0) + break; + free(appinfo->package); + appinfo->package = NULL; + } + ret = PMINFO_R_OK; + +err: + if (locale) { + free(locale); + locale = NULL; + } + if (syslocale) { + free(syslocale); + syslocale = NULL; + } + sqlite3_close(manifest_db); + if (appinfo) { + free(appinfo); + appinfo = NULL; + } + __cleanup_pkginfo(info); + return ret; +} + +API int pkgmgrinfo_appinfo_get_appinfo(const char *appid, pkgmgrinfo_appinfo_h *handle) +{ + if (appid == NULL) { + _LOGE("appid is NULL\n"); + return PMINFO_R_EINVAL; + } + if (handle == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + pkgmgr_appinfo_x *appinfo = NULL; + char *error_message = NULL; + char *syslocale = NULL; + char *locale = NULL; + int ret = -1; + int exist = 0; + label_x *tmp1 = NULL; + icon_x *tmp2 = NULL; + category_x *tmp3 = NULL; + char query[MAX_QUERY_LEN] = {'\0'}; + + /*Validate appid*/ + ret = __open_manifest_db(); + if (ret == -1) { + _LOGE("Fail to open manifest DB\n"); + ret = PMINFO_R_ERROR; + goto err; + } + snprintf(query, MAX_QUERY_LEN, "select exists(select * from package_app_info where app_id='%s')", appid); + if (SQLITE_OK != + sqlite3_exec(manifest_db, query, __validate_cb, (void *)&exist, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + sqlite3_close(manifest_db); + return PMINFO_R_ERROR; + } + if (exist == 0) { + _LOGE("Appid not found in DB\n"); + ret = PMINFO_R_ERROR; + goto err; + } + syslocale = vconf_get_str(VCONFKEY_LANGSET); + if (syslocale == NULL) { + _LOGE("current locale is NULL\n"); + ret = PMINFO_R_ERROR; + goto err; + } + locale = __convert_system_locale_to_manifest_locale(syslocale); + if (locale == NULL) { + _LOGE("manifest locale is NULL\n"); + ret = PMINFO_R_ERROR; + goto err; + } + appinfo = (pkgmgr_appinfo_x *)calloc(1, sizeof(pkgmgr_appinfo_x)); + if (appinfo == NULL) { + _LOGE("Failed to allocate memory for appinfo\n"); + ret = PMINFO_R_ERROR; + goto err; + } + + /*check app_component from DB*/ + snprintf(query, MAX_QUERY_LEN, "select app_component, package from package_app_info where app_id='%s' ", appid); + ret = __exec_appcomponent_query(query, (void *)appinfo); + if (ret == -1) { + _LOGE("App Info DB Information retrieval failed\n"); + ret = PMINFO_R_ERROR; + goto err; + } + + if (appinfo->app_component == PMINFO_UI_APP) { + appinfo->uiapp_info = (uiapplication_x *)calloc(1, sizeof(uiapplication_x)); + if (appinfo->uiapp_info == NULL) { + _LOGE("Failed to allocate memory for uiapp info\n"); + ret = PMINFO_R_ERROR; + goto err; + } + } else { + appinfo->svcapp_info = (serviceapplication_x *)calloc(1, sizeof(serviceapplication_x)); + if (appinfo->svcapp_info == NULL) { + _LOGE("Failed to allocate memory for svcapp info\n"); + ret = PMINFO_R_ERROR; + goto err; + } + } + + /*populate app_info from DB*/ + snprintf(query, MAX_QUERY_LEN, "select * from package_app_info where app_id='%s' ", appid); + ret = __exec_appinfo_query(query, (void *)appinfo); + if (ret == -1) { + _LOGE("App Info DB Information retrieval failed\n"); + ret = PMINFO_R_ERROR; + goto err; + } + + if (strcmp(appinfo->uiapp_info->type,"c++app") == 0){ + if (locale) { + free(locale); + } + locale = __get_app_locale_by_fallback(appid, syslocale); + } + + 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'", appid, locale); + ret = __exec_appinfo_query(query, (void *)appinfo); + if (ret == -1) { + _LOGE("App Localized Info DB Information retrieval failed\n"); + ret = PMINFO_R_ERROR; + goto err; + } + /*Also store the values corresponding to default locales*/ + 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'", appid, DEFAULT_LOCALE); + ret = __exec_appinfo_query(query, (void *)appinfo); + if (ret == -1) { + _LOGE("App Localized Info DB Information retrieval failed\n"); + ret = PMINFO_R_ERROR; + goto err; + } + /*Populate app category*/ + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select * from package_app_app_category where" \ + " app_id='%s'", appid); + ret = __exec_appinfo_query(query, (void *)appinfo); + if (ret == -1) { + _LOGE("App Category Info DB Information retrieval failed\n"); + ret = PMINFO_R_ERROR; + goto err; + } + switch (appinfo->app_component) { + case PMINFO_UI_APP: + if (appinfo->uiapp_info->label) { + LISTHEAD(appinfo->uiapp_info->label, tmp1); + appinfo->uiapp_info->label = tmp1; + } + if (appinfo->uiapp_info->icon) { + LISTHEAD(appinfo->uiapp_info->icon, tmp2); + appinfo->uiapp_info->icon = tmp2; + } + if (appinfo->uiapp_info->category) { + LISTHEAD(appinfo->uiapp_info->category, tmp3); + appinfo->uiapp_info->category = tmp3; + } + break; + case PMINFO_SVC_APP: + if (appinfo->svcapp_info->label) { + LISTHEAD(appinfo->svcapp_info->label, tmp1); + appinfo->svcapp_info->label = tmp1; + } + if (appinfo->svcapp_info->icon) { + LISTHEAD(appinfo->svcapp_info->icon, tmp2); + appinfo->svcapp_info->icon = tmp2; + } + if (appinfo->svcapp_info->category) { + LISTHEAD(appinfo->svcapp_info->category, tmp3); + appinfo->svcapp_info->category = tmp3; + } + break; + default: + break; + } + + *handle = (void*)appinfo; + sqlite3_close(manifest_db); + if (syslocale) { + free(syslocale); + syslocale = NULL; + } + if (locale) { + free(locale); + locale = NULL; + } + return PMINFO_R_OK; +err: + *handle = NULL; + __cleanup_appinfo(appinfo); + sqlite3_close(manifest_db); + if (syslocale) { + free(syslocale); + syslocale = NULL; + } + if (locale) { + free(locale); + locale = NULL; + } + return ret; +} + + +API int pkgmgrinfo_appinfo_get_appid(pkgmgrinfo_appinfo_h handle, char **appid) +{ + if (handle == NULL) { + _LOGE("appinfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (appid == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + + if (info->app_component == PMINFO_UI_APP) + *appid = (char *)info->uiapp_info->appid; + else if (info->app_component == PMINFO_SVC_APP) + *appid = (char *)info->svcapp_info->appid; + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo_h handle, char **pkg_name) +{ + if (handle == NULL) { + _LOGE("appinfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (pkg_name == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + + *pkg_name = (char *)info->package; + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_get_pkgid(pkgmgrinfo_appinfo_h handle, char **pkgid) +{ + if (handle == NULL) { + _LOGE("appinfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (pkgid == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + + *pkgid = (char *)info->package; + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_get_exec(pkgmgrinfo_appinfo_h handle, char **exec) +{ + if (handle == NULL) { + _LOGE("appinfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (exec == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + + if (info->app_component == PMINFO_UI_APP) + *exec = (char *)info->uiapp_info->exec; + if (info->app_component == PMINFO_SVC_APP) + *exec = (char *)info->svcapp_info->exec; + + return PMINFO_R_OK; +} + + +API int pkgmgrinfo_appinfo_get_icon(pkgmgrinfo_appinfo_h handle, char **icon) +{ + if (handle == NULL) { + _LOGE("appinfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (icon == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + char *syslocale = NULL; + char *locale = NULL; + char *save = NULL; + icon_x *ptr = NULL; + icon_x *start = NULL; + syslocale = vconf_get_str(VCONFKEY_LANGSET); + if (syslocale == NULL) { + _LOGE("current locale is NULL\n"); + return PMINFO_R_EINVAL; + } + locale = __convert_system_locale_to_manifest_locale(syslocale); + if (locale == NULL) { + _LOGE("manifest locale is NULL\n"); + return PMINFO_R_EINVAL; + } + save = locale; + *icon = NULL; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + if (info->app_component == PMINFO_UI_APP) + start = info->uiapp_info->icon; + if (info->app_component == PMINFO_SVC_APP) + start = info->svcapp_info->icon; + for(ptr = start; ptr != NULL; ptr = ptr->next) + { + if (ptr->lang) { + if (strcmp(ptr->lang, locale) == 0) { + *icon = (char *)ptr->text; + if (strcasecmp(*icon, "(null)") == 0) { + locale = DEFAULT_LOCALE; + continue; + } else + break; + } else if (strcmp(ptr->lang, DEFAULT_LOCALE) == 0) { + *icon = (char *)ptr->text; + break; + } + } + } + if (syslocale) { + free(syslocale); + syslocale = NULL; + } + locale = save; + if (locale) { + free(locale); + locale = NULL; + } + return PMINFO_R_OK; +} + + +API int pkgmgrinfo_appinfo_get_label(pkgmgrinfo_appinfo_h handle, char **label) +{ + if (handle == NULL) { + _LOGE("appinfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (label == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + char *syslocale = NULL; + char *locale = NULL; + char *save = NULL; + label_x *ptr = NULL; + label_x *start = NULL; + syslocale = vconf_get_str(VCONFKEY_LANGSET); + if (syslocale == NULL) { + _LOGE("current locale is NULL\n"); + return PMINFO_R_EINVAL; + } + locale = __convert_system_locale_to_manifest_locale(syslocale); + if (locale == NULL) { + _LOGE("manifest locale is NULL\n"); + return PMINFO_R_EINVAL; + } + + save = locale; + *label = NULL; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + if (info->app_component == PMINFO_UI_APP) + start = info->uiapp_info->label; + if (info->app_component == PMINFO_SVC_APP) + start = info->svcapp_info->label; + for(ptr = start; ptr != NULL; ptr = ptr->next) + { + if (ptr->lang) { + if (strcmp(ptr->lang, locale) == 0) { + *label = (char *)ptr->text; + if (strcasecmp(*label, "(null)") == 0) { + locale = DEFAULT_LOCALE; + continue; + } else + break; + } else if (strncasecmp(ptr->lang, locale, 2) == 0) { + *label = (char *)ptr->text; + if (strcasecmp(*label, "(null)") == 0) { + locale = DEFAULT_LOCALE; + continue; + } else + break; + } else if (strcmp(ptr->lang, DEFAULT_LOCALE) == 0) { + *label = (char *)ptr->text; + break; + } + } + } + if (syslocale) { + free(syslocale); + syslocale = NULL; + } + locale = save; + if (locale) { + free(locale); + locale = NULL; + } + return PMINFO_R_OK; +} + + +API int pkgmgrinfo_appinfo_get_component(pkgmgrinfo_appinfo_h handle, pkgmgrinfo_app_component *component) +{ + if (handle == NULL) { + _LOGE("appinfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (component == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + + if (info->app_component == PMINFO_UI_APP) + *component = PMINFO_UI_APP; + else if (info->app_component == PMINFO_SVC_APP) + *component = PMINFO_SVC_APP; + else + return PMINFO_R_ERROR; + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_get_apptype(pkgmgrinfo_appinfo_h handle, char **app_type) +{ + if (handle == NULL) { + _LOGE("appinfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (app_type == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + + if (info->app_component == PMINFO_UI_APP) + *app_type = (char *)info->uiapp_info->type; + if (info->app_component == PMINFO_SVC_APP) + *app_type = (char *)info->svcapp_info->type; + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_get_operation(pkgmgrinfo_appcontrol_h handle, + int *operation_count, char ***operation) +{ + if (handle == NULL) { + _LOGE("appcontrol handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (operation_count == NULL || operation == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + 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) +{ + if (handle == NULL) { + _LOGE("appcontrol handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (uri_count == NULL || uri == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + 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) +{ + if (handle == NULL) { + _LOGE("appcontrol handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (mime_count == NULL || mime == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + 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_setting_icon(pkgmgrinfo_appinfo_h handle, char **icon) +{ + if (handle == NULL) { + _LOGE("appinfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (icon == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + int ret = -1; + char *error_message = NULL; + char query[MAX_QUERY_LEN] = {'\0'}; + char path_buf[PKG_STRING_LEN_MAX] = {'\0'}; + pkgmgr_iconpath_x *data = NULL; + char *icon_path; + char *readpath; + char *appid; + + ret = __open_manifest_db(); + if (ret == -1) { + _LOGE("Fail to open manifest DB\n"); + return PMINFO_R_ERROR; + } + + ret = pkgmgrinfo_appinfo_get_appid(handle,&appid); + if(ret < 0 || appid == NULL) + return PMINFO_R_ERROR; + + data = (pkgmgr_iconpath_x *)calloc(1, sizeof(pkgmgr_iconpath_x)); + if (data == NULL) { + _LOGE("Failed to allocate memory for pkgmgr_datacontrol_x\n"); + sqlite3_close(manifest_db); + return PMINFO_R_ERROR; + } + + snprintf(query, MAX_QUERY_LEN, "select app_icon from package_app_icon_localized_info where app_id='%s' and app_icon_section ='setting'", appid); + if (SQLITE_OK != + sqlite3_exec(manifest_db, query, __icon_name_cb, (void *)data, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + free(data); + sqlite3_free(error_message); + sqlite3_close(manifest_db); + return PMINFO_R_ERROR; + } + icon_path = __get_icon_with_path(data->iconpath); + *icon = (char *)icon_path; + + if (data) { + free(data); + data = NULL; + } + sqlite3_close(manifest_db); + return PMINFO_R_OK; +} + + +API int pkgmgrinfo_appinfo_get_notification_icon(pkgmgrinfo_appinfo_h handle, char **icon) +{ + if (handle == NULL) { + _LOGE("appinfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (icon == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + int ret = -1; + char *error_message = NULL; + char query[MAX_QUERY_LEN] = {'\0'}; + char path_buf[PKG_STRING_LEN_MAX] = {'\0'}; + pkgmgr_iconpath_x *data = NULL; + char *icon_path; + char *readpath; + char *appid; + + ret = __open_manifest_db(); + if (ret == -1) { + _LOGE("Fail to open manifest DB\n"); + return PMINFO_R_ERROR; + } + + ret = pkgmgrinfo_appinfo_get_appid(handle,&appid); + if(ret < 0 || appid == NULL) + return PMINFO_R_ERROR; + + data = (pkgmgr_iconpath_x *)calloc(1, sizeof(pkgmgr_iconpath_x)); + if (data == NULL) { + _LOGE("Failed to allocate memory for pkgmgr_datacontrol_x\n"); + sqlite3_close(manifest_db); + return PMINFO_R_ERROR; + } + + snprintf(query, MAX_QUERY_LEN, "select app_icon from package_app_icon_localized_info where app_id='%s' and app_icon_section ='notification'", appid); + if (SQLITE_OK != + sqlite3_exec(manifest_db, query, __icon_name_cb, (void *)data, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + free(data); + sqlite3_free(error_message); + sqlite3_close(manifest_db); + return PMINFO_R_ERROR; + } + icon_path = __get_icon_with_path(data->iconpath); + *icon = (char *)icon_path; + + if (data) { + free(data); + data = NULL; + } + sqlite3_close(manifest_db); + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_get_recent_image_type(pkgmgrinfo_appinfo_h handle, pkgmgrinfo_app_recentimage *type) +{ + if (handle == NULL) { + _LOGE("appinfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (type == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + 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_foreach_category(pkgmgrinfo_appinfo_h handle, + pkgmgrinfo_app_category_list_cb category_func, void *user_data) +{ + if (handle == NULL) { + _LOGE("appinfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (category_func == NULL) { + _LOGE("Callback function is NULL\n"); + return PMINFO_R_EINVAL; + } + int ret = -1; + category_x *ptr = NULL; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + if (info->app_component == PMINFO_UI_APP) + ptr = info->uiapp_info->category; + else if (info->app_component == PMINFO_SVC_APP) + ptr = info->svcapp_info->category; + else + return PMINFO_R_EINVAL; + for (; ptr; ptr = ptr->next) { + ret = category_func(ptr->name, 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) +{ + if (handle == NULL) { + _LOGE("appinfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (appcontrol_func == NULL) { + _LOGE("Callback function is NULL\n"); + return PMINFO_R_EINVAL; + } + int i = 0; + int ret = -1; + int oc = 0; + int mc = 0; + int uc = 0; + char *pkgid = NULL; + char *manifest = NULL; + char **operation = NULL; + char **uri = NULL; + char **mime = NULL; + appcontrol_x *appcontrol = NULL; + manifest_x *mfx = NULL; + operation_x *op = NULL; + uri_x *ui = NULL; + mime_x *mi = 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(manifest); + manifest = NULL; + return PMINFO_R_ERROR; + } + free(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*/ + switch (component) { + case PMINFO_UI_APP: + if (mfx->uiapplication) { + if (mfx->uiapplication->appcontrol) { + appcontrol = mfx->uiapplication->appcontrol; + } + } + break; + case PMINFO_SVC_APP: + if (mfx->serviceapplication) { + if (mfx->serviceapplication->appcontrol) { + appcontrol = mfx->serviceapplication->appcontrol; + } + } + break; + default: + break; + } + for (; appcontrol; appcontrol = appcontrol->next) { + op = appcontrol->operation; + for (; op; op = op->next) + oc = oc + 1; + op = appcontrol->operation; + + ui = appcontrol->uri; + for (; ui; ui = ui->next) + uc = uc + 1; + ui = appcontrol->uri; + + mi = appcontrol->mime; + for (; mi; mi = mi->next) + mc = mc + 1; + mi = appcontrol->mime; + + operation = (char **)calloc(oc, sizeof(char *)); + 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 *)); + 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 *)); + for (i = 0; i < mc; i++) { + mime[i] = strndup(mi->name, PKG_STRING_LEN_MAX - 1); + mi = mi->next; + } + /*populate appcontrol handle*/ + ptr->operation_count = oc; + ptr->uri_count = uc; + ptr->mime_count = mc; + ptr->operation = operation; + ptr->uri = uri; + ptr->mime = mime; + ret = appcontrol_func((void *)ptr, user_data); + for (i = 0; i < oc; i++) { + if (operation[i]) { + free(operation[i]); + operation[i] = NULL; + } + } + if (operation) { + free(operation); + operation = NULL; + } + for (i = 0; i < uc; i++) { + if (uri[i]) { + free(uri[i]); + uri[i] = NULL; + } + } + if (uri) { + free(uri); + uri = NULL; + } + for (i = 0; i < mc; i++) { + if (mime[i]) { + free(mime[i]); + mime[i] = NULL; + } + } + if (mime) { + free(mime); + mime = NULL; + } + if (ret < 0) + break; + uc = 0; + mc = 0; + oc = 0; + } + pkgmgr_parser_free_manifest_xml(mfx); + if (ptr) { + free(ptr); + ptr = NULL; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_is_nodisplay(pkgmgrinfo_appinfo_h handle, bool *nodisplay) +{ + if (handle == NULL) { + _LOGE("appinfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (nodisplay == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + 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) +{ + if (handle == NULL) { + _LOGE("appinfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (multiple == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + 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_taskmanage(pkgmgrinfo_appinfo_h handle, bool *taskmanage) +{ + if (handle == NULL) { + _LOGE("appinfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (taskmanage == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + 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_get_hwacceleration(pkgmgrinfo_appinfo_h handle, pkgmgrinfo_app_hwacceleration *hwacceleration) +{ + if (handle == NULL) { + _LOGE("appinfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (hwacceleration == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + char *val = NULL; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + val = (char *)info->uiapp_info->hwacceleration; + if (val) { + if (strcasecmp(val, "not-use-GL") == 0) + *hwacceleration = PMINFO_HWACCELERATION_NOT_USE_GL; + else if (strcasecmp(val, "use-GL") == 0) + *hwacceleration = PMINFO_HWACCELERATION_USE_GL; + else + *hwacceleration = PMINFO_HWACCELERATION_USE_SYSTEM_SETTING; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_is_onboot(pkgmgrinfo_appinfo_h handle, bool *onboot) +{ + if (handle == NULL) { + _LOGE("appinfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (onboot == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + char *val = NULL; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + val = (char *)info->svcapp_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) +{ + if (handle == NULL) { + _LOGE("appinfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (autorestart == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + char *val = NULL; + pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle; + val = (char *)info->svcapp_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) +{ + if (handle == NULL) { + _LOGE("appinfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + if (mainapp == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + 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_destroy_appinfo(pkgmgrinfo_appinfo_h handle) +{ + if (handle == NULL) { + _LOGE("appinfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + 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) +{ + if (handle == NULL || property == NULL) { + _LOGE("Filter handle input parameter is NULL\n"); + return PMINFO_R_EINVAL; + } + 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(node); + node = NULL; + 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) +{ + if (handle == NULL || property == NULL) { + _LOGE("Filter handle input parameter is NULL\n"); + return PMINFO_R_EINVAL; + } + 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(node); + node = NULL; + 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) +{ + if (handle == NULL || property == NULL || value == NULL) { + _LOGE("Filter handle input parameter is NULL\n"); + return PMINFO_R_EINVAL; + } + 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: + if (strcmp(value, PMINFO_APPINFO_UI_APP) == 0) + val = strndup("uiapp", PKG_STRING_LEN_MAX - 1); + else + val = strndup("svcapp", 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(node); + node = NULL; + 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); + _LOGE("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); + _LOGE("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); + _LOGE("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) +{ + if (handle == NULL || count == NULL) { + _LOGE("Filter handle input parameter is NULL\n"); + return PMINFO_R_EINVAL; + } + char *syslocale = NULL; + char *locale = NULL; + char *condition = NULL; + char *error_message = NULL; + char query[MAX_QUERY_LEN] = {'\0'}; + char where[MAX_QUERY_LEN] = {'\0'}; + GSList *list; + int ret = 0; + + pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x*)handle; + /*Get current locale*/ + syslocale = vconf_get_str(VCONFKEY_LANGSET); + if (syslocale == NULL) { + _LOGE("current locale is NULL\n"); + return PMINFO_R_ERROR; + } + locale = __convert_system_locale_to_manifest_locale(syslocale); + if (locale == NULL) { + _LOGE("manifest locale is NULL\n"); + free(syslocale); + return PMINFO_R_ERROR; + } + ret = __open_manifest_db(); + if (ret == -1) { + _LOGE("Fail to open manifest DB\n"); + ret = PMINFO_R_ERROR; + goto err; + } + + /*Start constructing query*/ + 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(condition); + condition = NULL; + } + if (g_slist_next(list)) { + strncat(where, " and ", 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); + + /*Execute Query*/ + if (SQLITE_OK != + sqlite3_exec(manifest_db, query, __count_cb, (void *)count, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + sqlite3_close(manifest_db); + ret = PMINFO_R_ERROR; + *count = 0; + goto err; + } + ret = PMINFO_R_OK; +err: + if (locale) { + free(locale); + locale = NULL; + } + if (syslocale) { + free(syslocale); + syslocale = NULL; + } + sqlite3_close(manifest_db); + return ret; +} + +API int pkgmgrinfo_appinfo_filter_foreach_appinfo(pkgmgrinfo_appinfo_filter_h handle, + pkgmgrinfo_app_list_cb app_cb, void * user_data) +{ + if (handle == NULL || app_cb == NULL) { + _LOGE("Filter handle input parameter is NULL\n"); + return PMINFO_R_EINVAL; + } + char *syslocale = NULL; + char *locale = NULL; + char *condition = NULL; + char *error_message = NULL; + char query[MAX_QUERY_LEN] = {'\0'}; + char where[MAX_QUERY_LEN] = {'\0'}; + GSList *list; + int ret = 0; + uiapplication_x *ptr1 = NULL; + serviceapplication_x *ptr2 = NULL; + pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x*)handle; + /*Get current locale*/ + syslocale = vconf_get_str(VCONFKEY_LANGSET); + if (syslocale == NULL) { + _LOGE("current locale is NULL\n"); + return PMINFO_R_ERROR; + } + locale = __convert_system_locale_to_manifest_locale(syslocale); + if (locale == NULL) { + _LOGE("manifest locale is NULL\n"); + free(syslocale); + return PMINFO_R_ERROR; + } + ret = __open_manifest_db(); + if (ret == -1) { + _LOGE("Fail to open manifest DB\n"); + ret = PMINFO_R_ERROR; + goto err; + } + /*Start constructing query*/ + snprintf(query, MAX_QUERY_LEN - 1, FILTER_QUERY_LIST_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(condition); + condition = NULL; + } + if (g_slist_next(list)) { + strncat(where, " and ", 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); + /*To get filtered list*/ + pkgmgr_pkginfo_x *info = NULL; + info = (pkgmgr_pkginfo_x *)calloc(1, sizeof(pkgmgr_pkginfo_x)); + if (info == NULL) { + _LOGE("Out of Memory!!!\n"); + ret = PMINFO_R_ERROR; + goto err; + } + info->manifest_info = (manifest_x *)calloc(1, sizeof(manifest_x)); + if (info->manifest_info == NULL) { + _LOGE("Out of Memory!!!\n"); + ret = PMINFO_R_ERROR; + goto err; + } + /*To get detail app info for each member of filtered list*/ + pkgmgr_pkginfo_x *filtinfo = NULL; + filtinfo = (pkgmgr_pkginfo_x *)calloc(1, sizeof(pkgmgr_pkginfo_x)); + if (filtinfo == NULL) { + _LOGE("Out of Memory!!!\n"); + ret = PMINFO_R_ERROR; + goto err; + } + filtinfo->manifest_info = (manifest_x *)calloc(1, sizeof(manifest_x)); + if (filtinfo->manifest_info == NULL) { + _LOGE("Out of Memory!!!\n"); + ret = PMINFO_R_ERROR; + goto err; + } + pkgmgr_appinfo_x *appinfo = (pkgmgr_appinfo_x *)calloc(1, sizeof(pkgmgr_appinfo_x)); + if (appinfo == NULL) { + _LOGE("Out of Memory!!!\n"); + ret = PMINFO_R_ERROR; + goto err; + } + if (SQLITE_OK != + sqlite3_exec(manifest_db, query, __app_list_cb, (void *)info, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + sqlite3_close(manifest_db); + ret = PMINFO_R_ERROR; + goto err; + } + memset(query, '\0', MAX_QUERY_LEN); + if (info->manifest_info->uiapplication) { + LISTHEAD(info->manifest_info->uiapplication, ptr1); + info->manifest_info->uiapplication = ptr1; + } + if (info->manifest_info->serviceapplication) { + LISTHEAD(info->manifest_info->serviceapplication, ptr2); + info->manifest_info->serviceapplication = ptr2; + } + /*Filtered UI Apps*/ + for(ptr1 = info->manifest_info->uiapplication; ptr1; ptr1 = ptr1->next) + { + snprintf(query, MAX_QUERY_LEN, "select * from package_app_info where app_id='%s' and app_component='%s'", + ptr1->appid, "uiapp"); + if (SQLITE_OK != + sqlite3_exec(manifest_db, query, __uiapp_list_cb, (void *)filtinfo, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + sqlite3_close(manifest_db); + ret = PMINFO_R_ERROR; + goto err; + } + } + for(ptr2 = info->manifest_info->serviceapplication; ptr2; ptr2 = ptr2->next) + { + snprintf(query, MAX_QUERY_LEN, "select * from package_app_info where app_id='%s' and app_component='%s'", + ptr2->appid, "svcapp"); + if (SQLITE_OK != + sqlite3_exec(manifest_db, query, __svcapp_list_cb, (void *)filtinfo, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + sqlite3_close(manifest_db); + ret = PMINFO_R_ERROR; + goto err; + } + } + if (filtinfo->manifest_info->uiapplication) { + LISTHEAD(filtinfo->manifest_info->uiapplication, ptr1); + filtinfo->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; + appinfo->app_component = PMINFO_UI_APP; + ret = app_cb((void *)appinfo, user_data); + if (ret < 0) + break; + ptr1 = ptr1->next; + } + /*Filtered Service Apps*/ + if (filtinfo->manifest_info->serviceapplication) { + LISTHEAD(filtinfo->manifest_info->serviceapplication, ptr2); + filtinfo->manifest_info->serviceapplication = ptr2; + } + /*If the callback func return < 0 we break and no more call back is called*/ + while(ptr2 != NULL) + { + appinfo->svcapp_info = ptr2; + appinfo->app_component = PMINFO_SVC_APP; + ret = app_cb((void *)appinfo, user_data); + if (ret < 0) + break; + ptr2 = ptr2->next; + } + ret = PMINFO_R_OK; +err: + if (locale) { + free(locale); + locale = NULL; + } + if (syslocale) { + free(syslocale); + syslocale = NULL; + } + sqlite3_close(manifest_db); + if (appinfo) { + free(appinfo); + appinfo = NULL; + } + __cleanup_pkginfo(info); + __cleanup_pkginfo(filtinfo); + return ret; +} + +API int pkgmgrinfo_pkginfo_create_certinfo(pkgmgrinfo_certinfo_h *handle) +{ + if (!handle) { + _LOGE("Argument supplied is NULL\n"); + return PMINFO_R_EINVAL; + } + int ret = 0; + pkgmgr_certinfo_x *certinfo = NULL; + certinfo = calloc(1, sizeof(pkgmgr_certinfo_x)); + if (!certinfo) { + _LOGE("Malloc Failed\n"); + return PMINFO_R_ERROR; + } + *handle = (void *)certinfo; + /*Open db. It will be closed in destroy handle API*/ + ret = db_util_open_with_options(CERT_DB, &cert_db, + SQLITE_OPEN_READONLY, NULL); + if (ret != SQLITE_OK) { + _LOGE("connect db [%s] failed!\n", MANIFEST_DB); + free(certinfo); + return PMINFO_R_ERROR; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_load_certinfo(const char *pkgid, pkgmgrinfo_certinfo_h handle) +{ + if (pkgid == NULL) { + _LOGE("package ID is NULL\n"); + return PMINFO_R_EINVAL; + } + if (handle == NULL) { + _LOGE("Certinfo handle is NULL\n"); + return PMINFO_R_EINVAL; + } + pkgmgr_certinfo_x *certinfo = NULL; + char *error_message = NULL; + int ret = PMINFO_R_OK; + char query[MAX_QUERY_LEN] = {'\0'}; + int exist = 0; + + /*validate pkgid*/ + snprintf(query, MAX_QUERY_LEN, "select exists(select * from package_cert_info where package='%s')", pkgid); + if (SQLITE_OK != + sqlite3_exec(cert_db, query, __validate_cb, (void *)&exist, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + return PMINFO_R_ERROR; + } + if (exist == 0) { + _LOGE("Package not found in DB\n"); + ret = PMINFO_R_ERROR; + goto err; + } + 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; + } + return PMINFO_R_OK; +err: + return ret; +} + +API int pkgmgrinfo_pkginfo_get_cert_value(pkgmgrinfo_certinfo_h handle, pkgmgrinfo_cert_type cert_type, const char **cert_value) +{ + if (!handle || !cert_value) { + _LOGE("Argument supplied is NULL\n"); + return PMINFO_R_EINVAL; + } + if ((cert_type < PMINFO_AUTHOR_ROOT_CERT) || (cert_type > PMINFO_DISTRIBUTOR2_SIGNER_CERT)) { + _LOGE("Invalid certificate type\n"); + return PMINFO_R_EINVAL; + } + pkgmgr_certinfo_x *certinfo = NULL; + char *error_message = NULL; + int ret = PMINFO_R_OK; + char query[MAX_QUERY_LEN] = {'\0'}; + int exist = 0; + certinfo = (pkgmgr_certinfo_x *)handle; + *cert_value = NULL; + switch(cert_type) { + case PMINFO_AUTHOR_SIGNER_CERT: + snprintf(query, MAX_QUERY_LEN, "select exists(select * from package_cert_info where package='%s')", certinfo->auth_signer_cert); + if (SQLITE_OK != + sqlite3_exec(cert_db, query, __validate_cb, (void *)&exist, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + return PMINFO_R_ERROR; + } + if (exist == 0) + *cert_value = certinfo->auth_signer_cert; + else { + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select author_signer_cert from package_cert_info " \ + "where package='%s'", certinfo->auth_signer_cert); + free(certinfo->auth_signer_cert); + certinfo->auth_signer_cert = NULL; + ret = __exec_certinfo_query(query, (void *)certinfo); + if (ret == -1) { + _LOGE("Cert Info DB Information retrieval failed\n"); + return PMINFO_R_ERROR; + } + *cert_value = certinfo->auth_signer_cert; + } + break; + case PMINFO_AUTHOR_INTERMEDIATE_CERT: + snprintf(query, MAX_QUERY_LEN, "select exists(select * from package_cert_info where package='%s')", certinfo->auth_im_cert); + if (SQLITE_OK != + sqlite3_exec(cert_db, query, __validate_cb, (void *)&exist, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + return PMINFO_R_ERROR; + } + if (exist == 0) + *cert_value = certinfo->auth_im_cert; + else { + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select author_im_cert from package_cert_info " \ + "where package='%s'", certinfo->auth_im_cert); + free(certinfo->auth_im_cert); + certinfo->auth_im_cert = NULL; + ret = __exec_certinfo_query(query, (void *)certinfo); + if (ret == -1) { + _LOGE("Cert Info DB Information retrieval failed\n"); + return PMINFO_R_ERROR; + } + *cert_value = certinfo->auth_im_cert; + } + break; + case PMINFO_AUTHOR_ROOT_CERT: + snprintf(query, MAX_QUERY_LEN, "select exists(select * from package_cert_info where package='%s')", certinfo->auth_root_cert); + if (SQLITE_OK != + sqlite3_exec(cert_db, query, __validate_cb, (void *)&exist, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + return PMINFO_R_ERROR; + } + if (exist == 0) + *cert_value = certinfo->auth_root_cert; + else { + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select author_root_cert from package_cert_info " \ + "where package='%s'", certinfo->auth_root_cert); + free(certinfo->auth_root_cert); + certinfo->auth_root_cert = NULL; + ret = __exec_certinfo_query(query, (void *)certinfo); + if (ret == -1) { + _LOGE("Cert Info DB Information retrieval failed\n"); + return PMINFO_R_ERROR; + } + *cert_value = certinfo->auth_root_cert; + } + break; + case PMINFO_DISTRIBUTOR_SIGNER_CERT: + snprintf(query, MAX_QUERY_LEN, "select exists(select * from package_cert_info where package='%s')", certinfo->dist_signer_cert); + if (SQLITE_OK != + sqlite3_exec(cert_db, query, __validate_cb, (void *)&exist, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + return PMINFO_R_ERROR; + } + if (exist == 0) + *cert_value = certinfo->dist_signer_cert; + else { + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select dist_signer_cert from package_cert_info " \ + "where package='%s'", certinfo->dist_signer_cert); + free(certinfo->dist_signer_cert); + certinfo->dist_signer_cert = NULL; + ret = __exec_certinfo_query(query, (void *)certinfo); + if (ret == -1) { + _LOGE("Cert Info DB Information retrieval failed\n"); + return PMINFO_R_ERROR; + } + *cert_value = certinfo->dist_signer_cert; + } + break; + case PMINFO_DISTRIBUTOR_INTERMEDIATE_CERT: + snprintf(query, MAX_QUERY_LEN, "select exists(select * from package_cert_info where package='%s')", certinfo->dist_im_cert); + if (SQLITE_OK != + sqlite3_exec(cert_db, query, __validate_cb, (void *)&exist, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + return PMINFO_R_ERROR; + } + if (exist == 0) + *cert_value = certinfo->dist_im_cert; + else { + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select dist_im_cert from package_cert_info " \ + "where package='%s'", certinfo->dist_im_cert); + free(certinfo->dist_im_cert); + certinfo->dist_im_cert = NULL; + ret = __exec_certinfo_query(query, (void *)certinfo); + if (ret == -1) { + _LOGE("Cert Info DB Information retrieval failed\n"); + return PMINFO_R_ERROR; + } + *cert_value = certinfo->dist_im_cert; + } + break; + case PMINFO_DISTRIBUTOR_ROOT_CERT: + snprintf(query, MAX_QUERY_LEN, "select exists(select * from package_cert_info where package='%s')", certinfo->dist_root_cert); + if (SQLITE_OK != + sqlite3_exec(cert_db, query, __validate_cb, (void *)&exist, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + return PMINFO_R_ERROR; + } + if (exist == 0) + *cert_value = certinfo->dist_root_cert; + else { + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select dist_root_cert from package_cert_info " \ + "where package='%s'", certinfo->dist_root_cert); + free(certinfo->dist_root_cert); + certinfo->dist_root_cert = NULL; + ret = __exec_certinfo_query(query, (void *)certinfo); + if (ret == -1) { + _LOGE("Cert Info DB Information retrieval failed\n"); + return PMINFO_R_ERROR; + } + *cert_value = certinfo->dist_root_cert; + } + break; + case PMINFO_DISTRIBUTOR2_SIGNER_CERT: + snprintf(query, MAX_QUERY_LEN, "select exists(select * from package_cert_info where package='%s')", certinfo->dist2_signer_cert); + if (SQLITE_OK != + sqlite3_exec(cert_db, query, __validate_cb, (void *)&exist, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + return PMINFO_R_ERROR; + } + if (exist == 0) + *cert_value = certinfo->dist2_signer_cert; + else { + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select dist2_signer_cert from package_cert_info " \ + "where package='%s'", certinfo->dist2_signer_cert); + free(certinfo->dist2_signer_cert); + certinfo->dist2_signer_cert = NULL; + ret = __exec_certinfo_query(query, (void *)certinfo); + if (ret == -1) { + _LOGE("Cert Info DB Information retrieval failed\n"); + return PMINFO_R_ERROR; + } + *cert_value = certinfo->dist2_signer_cert; + } + break; + case PMINFO_DISTRIBUTOR2_INTERMEDIATE_CERT: + snprintf(query, MAX_QUERY_LEN, "select exists(select * from package_cert_info where package='%s')", certinfo->dist2_im_cert); + if (SQLITE_OK != + sqlite3_exec(cert_db, query, __validate_cb, (void *)&exist, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + return PMINFO_R_ERROR; + } + if (exist == 0) + *cert_value = certinfo->dist2_im_cert; + else { + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select dist2_im_cert from package_cert_info " \ + "where package='%s'", certinfo->dist2_im_cert); + free(certinfo->dist2_im_cert); + certinfo->dist2_im_cert = NULL; + ret = __exec_certinfo_query(query, (void *)certinfo); + if (ret == -1) { + _LOGE("Cert Info DB Information retrieval failed\n"); + return PMINFO_R_ERROR; + } + *cert_value = certinfo->dist2_im_cert; + } + break; + case PMINFO_DISTRIBUTOR2_ROOT_CERT: + snprintf(query, MAX_QUERY_LEN, "select exists(select * from package_cert_info where package='%s')", certinfo->dist2_root_cert); + if (SQLITE_OK != + sqlite3_exec(cert_db, query, __validate_cb, (void *)&exist, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + return PMINFO_R_ERROR; + } + if (exist == 0) + *cert_value = certinfo->dist2_root_cert; + else { + memset(query, '\0', MAX_QUERY_LEN); + snprintf(query, MAX_QUERY_LEN, "select dist2_root_cert from package_cert_info " \ + "where package='%s'", certinfo->dist2_root_cert); + free(certinfo->dist2_root_cert); + certinfo->dist2_root_cert = NULL; + ret = __exec_certinfo_query(query, (void *)certinfo); + if (ret == -1) { + _LOGE("Cert Info DB Information retrieval failed\n"); + return PMINFO_R_ERROR; + } + *cert_value = certinfo->dist2_root_cert; + } + break; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_pkginfo_destroy_certinfo(pkgmgrinfo_certinfo_h handle) +{ + if (!handle) { + _LOGE("Argument supplied is NULL\n"); + return PMINFO_R_EINVAL; + } + pkgmgr_certinfo_x *certinfo = NULL; + certinfo = (pkgmgr_certinfo_x *)handle; + if (certinfo->pkgid) { + free(certinfo->pkgid); + certinfo->pkgid = NULL; + } + if (certinfo->auth_signer_cert) { + free(certinfo->auth_signer_cert); + certinfo->auth_signer_cert = NULL; + } + if (certinfo->auth_im_cert) { + free(certinfo->auth_im_cert); + certinfo->auth_im_cert = NULL; + } + if (certinfo->auth_root_cert) { + free(certinfo->auth_root_cert); + certinfo->auth_root_cert = NULL; + } + if (certinfo->dist_signer_cert) { + free(certinfo->dist_signer_cert); + certinfo->dist_signer_cert = NULL; + } + if (certinfo->dist_im_cert) { + free(certinfo->dist_im_cert); + certinfo->dist_im_cert = NULL; + } + if (certinfo->dist_root_cert) { + free(certinfo->dist_root_cert); + certinfo->dist_root_cert = NULL; + } + if (certinfo->dist2_signer_cert) { + free(certinfo->dist2_signer_cert); + certinfo->dist2_signer_cert = NULL; + } + if (certinfo->dist2_im_cert) { + free(certinfo->dist2_im_cert); + certinfo->dist2_im_cert = NULL; + } + if (certinfo->dist2_root_cert) { + free(certinfo->dist2_root_cert); + certinfo->dist2_root_cert = NULL; + } + free(certinfo); + certinfo = NULL; + sqlite3_close(cert_db); + return PMINFO_R_OK; +} + +API int pkgmgrinfo_create_certinfo_set_handle(pkgmgrinfo_instcertinfo_h *handle) +{ + if (!handle) { + _LOGE("Argument supplied is NULL\n"); + return PMINFO_R_EINVAL; + } + pkgmgr_instcertinfo_x *certinfo = NULL; + int ret = 0; + certinfo = calloc(1, sizeof(pkgmgr_instcertinfo_x)); + if (!certinfo) { + _LOGE("Malloc Failed\n"); + return PMINFO_R_ERROR; + } + *handle = (void *)certinfo; + /*Open db. It will be closed in destroy handle API*/ + ret = db_util_open(CERT_DB, &cert_db, + DB_UTIL_REGISTER_HOOK_METHOD); + if (ret != SQLITE_OK) { + _LOGE("connect db [%s] failed!\n", CERT_DB); + free(certinfo); + return PMINFO_R_ERROR; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_set_cert_value(pkgmgrinfo_instcertinfo_h handle, pkgmgrinfo_instcert_type cert_type, char *cert_value) +{ + if (!handle || !cert_value) { + _LOGE("Argument supplied is NULL\n"); + return PMINFO_R_EINVAL; + } + if ((cert_type < PMINFO_SET_AUTHOR_ROOT_CERT) || (cert_type > PMINFO_SET_DISTRIBUTOR2_SIGNER_CERT)) { + _LOGE("Invalid certificate type\n"); + return PMINFO_R_EINVAL; + } + char query[MAX_QUERY_LEN] = {'\0'}; + pkgmgr_instcertinfo_x *certinfo = NULL; + int ret = 0; + certinfo = (pkgmgr_instcertinfo_x *)handle; + switch(cert_type) { + case PMINFO_SET_AUTHOR_SIGNER_CERT: + snprintf(query, MAX_QUERY_LEN, "select package from package_cert_info " \ + "where author_signer_cert='%s'", cert_value); + ret = __exec_certinfo_query(query, (void *)certinfo); + if (ret == -1) { + _LOGE("Cert Info DB Information retrieval failed\n"); + return PMINFO_R_ERROR; + } + if (certinfo->pkgid) + certinfo->auth_signer_cert = strdup(certinfo->pkgid); + else + certinfo->auth_signer_cert = strdup(cert_value); + break; + case PMINFO_SET_AUTHOR_INTERMEDIATE_CERT: + snprintf(query, MAX_QUERY_LEN, "select package from package_cert_info " \ + "where author_im_cert='%s'", cert_value); + ret = __exec_certinfo_query(query, (void *)certinfo); + if (ret == -1) { + _LOGE("Cert Info DB Information retrieval failed\n"); + return PMINFO_R_ERROR; + } + if (certinfo->pkgid) + certinfo->auth_im_cert = strdup(certinfo->pkgid); + else + certinfo->auth_im_cert = strdup(cert_value); + break; + case PMINFO_SET_AUTHOR_ROOT_CERT: + snprintf(query, MAX_QUERY_LEN, "select package from package_cert_info " \ + "where author_root_cert='%s'", cert_value); + ret = __exec_certinfo_query(query, (void *)certinfo); + if (ret == -1) { + _LOGE("Cert Info DB Information retrieval failed\n"); + return PMINFO_R_ERROR; + } + if (certinfo->pkgid) + certinfo->auth_root_cert = strdup(certinfo->pkgid); + else + certinfo->auth_root_cert = strdup(cert_value); + break; + case PMINFO_SET_DISTRIBUTOR_SIGNER_CERT: + snprintf(query, MAX_QUERY_LEN, "select package from package_cert_info " \ + "where dist_signer_cert='%s'", cert_value); + ret = __exec_certinfo_query(query, (void *)certinfo); + if (ret == -1) { + _LOGE("Cert Info DB Information retrieval failed\n"); + return PMINFO_R_ERROR; + } + if (certinfo->pkgid) + certinfo->dist_signer_cert = strdup(certinfo->pkgid); + else + certinfo->dist_signer_cert = strdup(cert_value); + break; + case PMINFO_SET_DISTRIBUTOR_INTERMEDIATE_CERT: + snprintf(query, MAX_QUERY_LEN, "select package from package_cert_info " \ + "where dist_im_cert='%s'", cert_value); + ret = __exec_certinfo_query(query, (void *)certinfo); + if (ret == -1) { + _LOGE("Cert Info DB Information retrieval failed\n"); + return PMINFO_R_ERROR; + } + if (certinfo->pkgid) + certinfo->dist_im_cert = strdup(certinfo->pkgid); + else + certinfo->dist_im_cert = strdup(cert_value); + break; + case PMINFO_SET_DISTRIBUTOR_ROOT_CERT: + snprintf(query, MAX_QUERY_LEN, "select package from package_cert_info " \ + "where dist_root_cert='%s'", cert_value); + ret = __exec_certinfo_query(query, (void *)certinfo); + if (ret == -1) { + _LOGE("Cert Info DB Information retrieval failed\n"); + return PMINFO_R_ERROR; + } + if (certinfo->pkgid) + certinfo->dist_root_cert = strdup(certinfo->pkgid); + else + certinfo->dist_root_cert = strdup(cert_value); + break; + case PMINFO_SET_DISTRIBUTOR2_SIGNER_CERT: + snprintf(query, MAX_QUERY_LEN, "select package from package_cert_info " \ + "where dist2_signer_cert='%s'", cert_value); + ret = __exec_certinfo_query(query, (void *)certinfo); + if (ret == -1) { + _LOGE("Cert Info DB Information retrieval failed\n"); + return PMINFO_R_ERROR; + } + if (certinfo->pkgid) + certinfo->dist2_signer_cert = strdup(certinfo->pkgid); + else + certinfo->dist2_signer_cert = strdup(cert_value); + break; + case PMINFO_SET_DISTRIBUTOR2_INTERMEDIATE_CERT: + snprintf(query, MAX_QUERY_LEN, "select package from package_cert_info " \ + "where dist2_im_cert='%s'", cert_value); + ret = __exec_certinfo_query(query, (void *)certinfo); + if (ret == -1) { + _LOGE("Cert Info DB Information retrieval failed\n"); + return PMINFO_R_ERROR; + } + if (certinfo->pkgid) + certinfo->dist2_im_cert = strdup(certinfo->pkgid); + else + certinfo->dist2_im_cert = strdup(cert_value); + break; + case PMINFO_SET_DISTRIBUTOR2_ROOT_CERT: + snprintf(query, MAX_QUERY_LEN, "select package from package_cert_info " \ + "where dist2_root_cert='%s'", cert_value); + ret = __exec_certinfo_query(query, (void *)certinfo); + if (ret == -1) { + _LOGE("Cert Info DB Information retrieval failed\n"); + return PMINFO_R_ERROR; + } + if (certinfo->pkgid) + certinfo->dist2_root_cert = strdup(certinfo->pkgid); + else + certinfo->dist2_root_cert = strdup(cert_value); + break; + } + if (certinfo->pkgid) { + free(certinfo->pkgid); + certinfo->pkgid = NULL; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_save_certinfo(const char *pkgid, pkgmgrinfo_instcertinfo_h handle) +{ + if (!handle || !pkgid) { + _LOGE("Argument supplied is NULL\n"); + return PMINFO_R_EINVAL; + } + int ret = -1; + char *error_message = NULL; + int exist = -1; + char query[MAX_QUERY_LEN] = {'\0'}; + char *vquery = NULL; + int len = 0; + pkgmgr_instcertinfo_x *info = (pkgmgr_instcertinfo_x *)handle; + info->pkgid = strdup(pkgid); + snprintf(query, MAX_QUERY_LEN, "select exists(select * from package_cert_info where package='%s')", pkgid); + if (SQLITE_OK != + sqlite3_exec(cert_db, query, __validate_cb, (void *)&exist, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + return PMINFO_R_ERROR; + } + + len = 4096; + if (info->auth_root_cert) + len += strlen(info->auth_root_cert); + if (info->auth_im_cert) + len += strlen(info->auth_im_cert); + if (info->auth_signer_cert) + len += strlen(info->auth_signer_cert); + if (info->dist_root_cert) + len += strlen(info->dist_root_cert); + if (info->dist_im_cert) + len += strlen(info->dist_im_cert); + if (info->dist_signer_cert) + len += strlen(info->dist_signer_cert); + if (info->dist2_root_cert) + len += strlen(info->dist2_root_cert); + if (info->dist2_im_cert) + len += strlen(info->dist2_im_cert); + if (info->dist2_signer_cert) + len += strlen(info->dist2_signer_cert); + vquery = (char *)calloc(1, len); + + if (exist == 0) { + _LOGE("pkgid not found in DB\n"); + /*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', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')",\ + info->pkgid, info->auth_root_cert, info->auth_im_cert, info->auth_signer_cert, info->dist_root_cert, info->dist_im_cert, + info->dist_signer_cert, info->dist2_root_cert, info->dist2_im_cert, info->dist2_signer_cert); + } else { + _LOGE("pkgid exists in DB..Update it\n"); + /*Update*/ + snprintf(vquery, len, + "update package_cert_info set author_root_cert='%s', author_im_cert='%s', author_signer_cert='%s', dist_root_cert='%s', " \ + "dist_im_cert='%s', dist_signer_cert='%s', dist2_root_cert='%s', dist2_im_cert='%s', dist2_signer_cert='%s' " \ + "where package='%s'",\ + info->auth_root_cert, info->auth_im_cert, info->auth_signer_cert, info->dist_root_cert, info->dist_im_cert, + info->dist_signer_cert, info->dist2_root_cert, info->dist2_im_cert, info->dist2_signer_cert, info->pkgid); + } + 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); + return PMINFO_R_ERROR; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_destroy_certinfo_set_handle(pkgmgrinfo_instcertinfo_h handle) +{ + if (!handle) { + _LOGE("Argument supplied is NULL\n"); + return PMINFO_R_EINVAL; + } + pkgmgr_instcertinfo_x *certinfo = NULL; + certinfo = (pkgmgr_instcertinfo_x *)handle; + if (certinfo->pkgid) { + free(certinfo->pkgid); + certinfo->pkgid = NULL; + } + if (certinfo->auth_signer_cert) { + free(certinfo->auth_signer_cert); + certinfo->auth_signer_cert = NULL; + } + if (certinfo->auth_im_cert) { + free(certinfo->auth_im_cert); + certinfo->auth_im_cert = NULL; + } + if (certinfo->auth_root_cert) { + free(certinfo->auth_root_cert); + certinfo->auth_root_cert = NULL; + } + if (certinfo->dist_signer_cert) { + free(certinfo->dist_signer_cert); + certinfo->dist_signer_cert = NULL; + } + if (certinfo->dist_im_cert) { + free(certinfo->dist_im_cert); + certinfo->dist_im_cert = NULL; + } + if (certinfo->dist_root_cert) { + free(certinfo->dist_root_cert); + certinfo->dist_root_cert = NULL; + } + if (certinfo->dist2_signer_cert) { + free(certinfo->dist2_signer_cert); + certinfo->dist2_signer_cert = NULL; + } + if (certinfo->dist2_im_cert) { + free(certinfo->dist2_im_cert); + certinfo->dist2_im_cert = NULL; + } + if (certinfo->dist2_root_cert) { + free(certinfo->dist2_root_cert); + certinfo->dist2_root_cert = NULL; + } + free(certinfo); + certinfo = NULL; + sqlite3_close(cert_db); + return PMINFO_R_OK; +} + +API int pkgmgrinfo_delete_certinfo(const char *pkgid) +{ + if (!pkgid) { + _LOGE("Argument supplied is NULL\n"); + return PMINFO_R_EINVAL; + } + int ret = -1; + int i = 0; + char *error_message = NULL; + char query[MAX_QUERY_LEN] = {'\0'}; + ret = db_util_open(CERT_DB, &cert_db, + DB_UTIL_REGISTER_HOOK_METHOD); + if (ret != SQLITE_OK) { + _LOGE("connect db [%s] failed!\n", CERT_DB); + return PMINFO_R_ERROR; + } + /*First make copy of all entries for which other packages have an index here*/ + snprintf(query, MAX_QUERY_LEN, "select * from package_cert_info where package!='%s'", pkgid); + if (SQLITE_OK != + sqlite3_exec(cert_db, query, __delete_certinfo_cb, (void *)pkgid, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + sqlite3_close(cert_db); + ret = PMINFO_R_ERROR; + goto err; + } + /*Now delete the entry from db*/ + snprintf(query, MAX_QUERY_LEN, "delete from package_cert_info where package='%s'", pkgid); + 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); + sqlite3_close(cert_db); + ret = PMINFO_R_ERROR; + goto err; + } + ret = PMINFO_R_OK; +err: + sqlite3_close(cert_db); + for (i = 0; i < 9; i++) { + gflag[i] = 0; + if (gpkgcert[i]) { + free(gpkgcert[i]); + gpkgcert[i] = NULL; + } + } + return ret; +} + +API int pkgmgrinfo_create_pkgdbinfo(const char *pkgid, pkgmgrinfo_pkgdbinfo_h *handle) +{ + if (!pkgid || !handle) { + _LOGE("Argument supplied is NULL\n"); + return PMINFO_R_EINVAL; + } + manifest_x *mfx = NULL; + mfx = calloc(1, sizeof(manifest_x)); + if (!mfx) { + _LOGE("Malloc Failed\n"); + return PMINFO_R_ERROR; + } + mfx->package = strdup(pkgid); + *handle = (void *)mfx; + return PMINFO_R_OK; +} + +API int pkgmgrinfo_set_type_to_pkgdbinfo(pkgmgrinfo_pkgdbinfo_h handle, const char *type) +{ + if (!type || !handle) { + _LOGE("Argument supplied is NULL\n"); + return PMINFO_R_EINVAL; + } + int len = strlen(type); + manifest_x *mfx = (manifest_x *)handle; + if (len > PKG_TYPE_STRING_LEN_MAX) { + _LOGE("pkg type length exceeds the max limit\n"); + return PMINFO_R_EINVAL; + } + if (mfx->type == NULL) + mfx->type = strndup(type, PKG_TYPE_STRING_LEN_MAX); + else + mfx->type = type; + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_set_version_to_pkgdbinfo(pkgmgrinfo_pkgdbinfo_h handle, const char *version) +{ + if (!version || !handle) { + _LOGE("Argument supplied is NULL\n"); + return PMINFO_R_EINVAL; + } + int len = strlen(version); + manifest_x *mfx = (manifest_x *)handle; + if (len > PKG_VERSION_STRING_LEN_MAX) { + _LOGE("pkg version length exceeds the max limit\n"); + return PMINFO_R_EINVAL; + } + if (mfx->version == NULL) + mfx->version = strndup(version, PKG_VERSION_STRING_LEN_MAX); + else + mfx->version = version; + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_set_install_location_to_pkgdbinfo(pkgmgrinfo_pkgdbinfo_h handle, INSTALL_LOCATION location) +{ + if (!handle) { + _LOGE("Argument supplied is NULL\n"); + return PMINFO_R_EINVAL; + } + if (location < 0 || location > 1) { + _LOGE("Argument supplied is invalid\n"); + return PMINFO_R_EINVAL; + } + manifest_x *mfx = (manifest_x *)handle; + if (mfx->installlocation == NULL) { + mfx->installlocation = (char *)calloc(1, strlen("prefer-external")); + if (mfx->installlocation == NULL) { + _LOGE("Malloc Failed\n"); + return PMINFO_R_ERROR; + } + } + if (location == INSTALL_INTERNAL) { + strcpy(mfx->installlocation, "internal-only"); + } else if (location == INSTALL_EXTERNAL) { + strcpy(mfx->installlocation, "prefer-external"); + } else { + _LOGE("Invalid location type\n"); + return PMINFO_R_ERROR; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_set_size_to_pkgdbinfo(pkgmgrinfo_pkgdbinfo_h handle, const char *size) +{ + if (!handle) { + _LOGE("Argument supplied is NULL\n"); + return PMINFO_R_EINVAL; + } + if (size == NULL) { + _LOGE("Argument supplied is NULL\n"); + return PMINFO_R_EINVAL; + } + manifest_x *mfx = (manifest_x *)handle; + if (mfx->installlocation == NULL) { + _LOGE("cant set size without specifying install location\n"); + return PMINFO_R_ERROR; + } + if (strcmp(mfx->installlocation, "prefer-external") == 0) { + if (mfx->package_size == NULL) + mfx->package_size = strdup(size); + else + mfx->package_size = size; + } else { + _LOGE("cant set size for internal location\n"); + return PMINFO_R_ERROR; + } + return PMINFO_R_OK; +} +API int pkgmgrinfo_set_label_to_pkgdbinfo(pkgmgrinfo_pkgdbinfo_h handle, const char *label_txt, const char *locale) +{ + if (!handle || !label_txt) { + _LOGE("Argument supplied is NULL\n"); + return PMINFO_R_EINVAL; + } + int len = strlen(label_txt); + manifest_x *mfx = (manifest_x *)handle; + if (len > PKG_VALUE_STRING_LEN_MAX) { + _LOGE("label length exceeds the max limit\n"); + return PMINFO_R_EINVAL; + } + label_x *label = calloc(1, sizeof(label_x)); + if (label == NULL) { + _LOGE("Malloc Failed\n"); + return PMINFO_R_ERROR; + } + LISTADD(mfx->label, label); + if (locale) + mfx->label->lang = strdup(locale); + else + mfx->label->lang = strdup(DEFAULT_LOCALE); + mfx->label->text = strdup(label_txt); + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_set_icon_to_pkgdbinfo(pkgmgrinfo_pkgdbinfo_h handle, const char *icon_txt, const char *locale) +{ + if (!handle || !icon_txt) { + _LOGE("Argument supplied is NULL\n"); + return PMINFO_R_EINVAL; + } + int len = strlen(icon_txt); + manifest_x *mfx = (manifest_x *)handle; + if (len > PKG_VALUE_STRING_LEN_MAX) { + _LOGE("icon length exceeds the max limit\n"); + return PMINFO_R_EINVAL; + } + icon_x *icon = calloc(1, sizeof(icon_x)); + if (icon == NULL) { + _LOGE("Malloc Failed\n"); + return PMINFO_R_ERROR; + } + LISTADD(mfx->icon, icon); + if (locale) + mfx->icon->lang = strdup(locale); + else + mfx->icon->lang = strdup(DEFAULT_LOCALE); + mfx->icon->text = strdup(icon_txt); + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_set_description_to_pkgdbinfo(pkgmgrinfo_pkgdbinfo_h handle, const char *desc_txt, const char *locale) +{ + if (!handle || !desc_txt) { + _LOGE("Argument supplied is NULL\n"); + return PMINFO_R_EINVAL; + } + int len = strlen(desc_txt); + manifest_x *mfx = (manifest_x *)handle; + if (len > PKG_VALUE_STRING_LEN_MAX) { + _LOGE("description length exceeds the max limit\n"); + return PMINFO_R_EINVAL; + } + description_x *description = calloc(1, sizeof(description_x)); + if (description == NULL) { + _LOGE("Malloc Failed\n"); + return PMINFO_R_ERROR; + } + LISTADD(mfx->description, description); + if (locale) + mfx->description->lang = strdup(locale); + else + mfx->description->lang = strdup(DEFAULT_LOCALE); + mfx->description->text = strdup(desc_txt); + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_set_author_to_pkgdbinfo(pkgmgrinfo_pkgdbinfo_h handle, const char *author_name, + const char *author_email, const char *author_href, const char *locale) +{ + if (!handle) { + _LOGE("Argument supplied is NULL\n"); + return PMINFO_R_EINVAL; + } + manifest_x *mfx = (manifest_x *)handle; + author_x *author = calloc(1, sizeof(author_x)); + if (author == NULL) { + _LOGE("Malloc Failed\n"); + return PMINFO_R_ERROR; + } + LISTADD(mfx->author, author); + if (author_name) + mfx->author->text = strdup(author_name); + if (author_email) + mfx->author->email = strdup(author_email); + if (author_href) + mfx->author->href = strdup(author_href); + if (locale) + mfx->author->lang = strdup(locale); + else + mfx->author->lang = strdup(DEFAULT_LOCALE); + return PMINFO_R_OK; +} + +API int pkgmgrinfo_set_removable_to_pkgdbinfo(pkgmgrinfo_pkgdbinfo_h handle, int removable) +{ + if (!handle) { + _LOGE("Argument supplied is NULL\n"); + return PMINFO_R_EINVAL; + } + if (removable < 0 || removable > 1) { + _LOGE("Argument supplied is invalid\n"); + return PMINFO_R_EINVAL; + } + manifest_x *mfx = (manifest_x *)handle; + if (mfx->removable == NULL) { + mfx->removable = (char *)calloc(1, strlen("false")); + if (mfx->removable == NULL) { + _LOGE("Malloc Failed\n"); + return PMINFO_R_ERROR; + } + } + if (removable == 0) { + strcpy(mfx->removable, "false"); + } else if (removable == 1) { + strcpy(mfx->removable, "true"); + } else { + _LOGE("Invalid removable type\n"); + return PMINFO_R_ERROR; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_set_preload_to_pkgdbinfo(pkgmgrinfo_pkgdbinfo_h handle, int preload) +{ + if (!handle) { + _LOGE("Argument supplied is NULL\n"); + return PMINFO_R_EINVAL; + } + if (preload < 0 || preload > 1) { + _LOGE("Argument supplied is invalid\n"); + return PMINFO_R_EINVAL; + } + manifest_x *mfx = (manifest_x *)handle; + if (mfx->preload == NULL) { + mfx->preload = (char *)calloc(1, strlen("false")); + if (mfx->preload == NULL) { + _LOGE("Malloc Failed\n"); + return PMINFO_R_ERROR; + } + } + if (preload == 0) { + strcpy(mfx->preload, "false"); + } else if (preload == 1) { + strcpy(mfx->preload, "true"); + } else { + _LOGE("Invalid preload type\n"); + return PMINFO_R_ERROR; + } + return PMINFO_R_OK; +} + +API int pkgmgrinfo_save_pkgdbinfo(pkgmgrinfo_pkgdbinfo_h handle) +{ + if (!handle) { + _LOGE("Argument supplied is NULL\n"); + return PMINFO_R_EINVAL; + } + int ret = 0; + manifest_x *mfx = NULL; + label_x *tmp1 = NULL; + icon_x *tmp2 = NULL; + description_x *tmp3 = NULL; + author_x *tmp4 = NULL; + mfx = (manifest_x *)handle; + /*First move to head of all list pointers*/ + if (mfx->label) { + LISTHEAD(mfx->label, tmp1); + mfx->label = tmp1; + } + if (mfx->icon) { + LISTHEAD(mfx->icon, tmp2); + mfx->icon = tmp2; + } + if (mfx->description) { + LISTHEAD(mfx->description, tmp3); + mfx->description= tmp3; + } + if (mfx->author) { + LISTHEAD(mfx->author, tmp4); + mfx->author = tmp4; + } + ret = pkgmgr_parser_insert_manifest_info_in_db(mfx); + if (ret == 0) { + _LOGE("Successfully stored info in DB\n"); + return PMINFO_R_OK; + } else { + _LOGE("Failed to store info in DB\n"); + return PMINFO_R_ERROR; + } +} + +API int pkgmgrinfo_destroy_pkgdbinfo(pkgmgrinfo_pkgdbinfo_h handle) +{ + if (!handle) { + _LOGE("Argument supplied is NULL\n"); + return PMINFO_R_EINVAL; + } + manifest_x *mfx = NULL; + mfx = (manifest_x *)handle; + pkgmgr_parser_free_manifest_xml(mfx); + return PMINFO_R_OK; +} + +API int pkgmgrinfo_datacontrol_get_info(const char *providerid, const char * type, char **appid, char **access) +{ + if (providerid == NULL) { + _LOGE("Argument supplied is NULL\n"); + return PMINFO_R_EINVAL; + } + if (type == NULL) { + _LOGE("Argument supplied is NULL\n"); + return PMINFO_R_EINVAL; + } + if (appid == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + if (access == NULL) { + _LOGE("Argument supplied to hold return value is NULL\n"); + return PMINFO_R_EINVAL; + } + + int ret = PMINFO_R_OK; + char query[MAX_QUERY_LEN] = {'\0'}; + char *error_message = NULL; + pkgmgr_datacontrol_x *data = NULL; + + ret = __open_datacontrol_db(); + if (ret == -1) { + _LOGE("Fail to open datacontrol DB\n"); + return PMINFO_R_ERROR; + } + + data = (pkgmgr_datacontrol_x *)calloc(1, sizeof(pkgmgr_datacontrol_x)); + if (data == NULL) { + _LOGE("Failed to allocate memory for pkgmgr_datacontrol_x\n"); + sqlite3_close(datacontrol_db); + return PMINFO_R_ERROR; + } + + snprintf(query, MAX_QUERY_LEN, + "select appinfo.package_name, datacontrol.access from appinfo, datacontrol where datacontrol.id=appinfo.unique_id and datacontrol.provider_id = '%s' and datacontrol.type='%s' COLLATE NOCASE", + providerid, type); + + if (SQLITE_OK != + sqlite3_exec(datacontrol_db, query, __datacontrol_cb, (void *)data, &error_message)) { + _LOGE("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + sqlite3_close(datacontrol_db); + return PMINFO_R_ERROR; + } + + *appid = (char *)data->appid; + *access = (char *)data->access; + free(data); + sqlite3_close(datacontrol_db); + + return PMINFO_R_OK; +} -- 2.7.4