summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHyungKyu Song <hk76.song@samsung.com>2013-02-16 00:11:14 +0900
committerHyungKyu Song <hk76.song@samsung.com>2013-02-16 00:11:14 +0900
commit46da3cabea4f408d960b1bcc283bfd20b7d03896 (patch)
tree1cf638b02927b51c1441eb58cb4598ec473d709d
parentbae212e2876e3075d6234d951b9fdc2b8829d4f5 (diff)
downloadail-tizen_2.0.tar.gz
ail-tizen_2.0.tar.bz2
ail-tizen_2.0.zip
-rw-r--r--AUTHORS2
-rw-r--r--CMakeLists.txt56
-rw-r--r--LICENSE204
-rwxr-xr-xail.manifest11
-rw-r--r--ail.pc.in11
-rw-r--r--debian/changelog473
-rw-r--r--debian/compat1
-rw-r--r--debian/control25
-rw-r--r--debian/docs1
-rw-r--r--debian/jobs0
-rw-r--r--debian/libail-0-dev.install.in3
-rw-r--r--debian/libail-0.install.in3
-rw-r--r--debian/libail-0.postinst32
-rwxr-xr-xdebian/rules119
-rw-r--r--desktop.conf1
-rwxr-xr-xinclude/SLP_AIL_PG.h270
-rwxr-xr-xinclude/ail.h1106
-rwxr-xr-xinitdb/CMakeLists.txt17
-rwxr-xr-xinitdb/src/initdb.c245
-rwxr-xr-xpackaging/ail.spec81
-rwxr-xr-xsrc/ail_convert.c135
-rwxr-xr-xsrc/ail_convert.h32
-rwxr-xr-xsrc/ail_db.c268
-rwxr-xr-xsrc/ail_db.h59
-rwxr-xr-xsrc/ail_desktop.c1382
-rwxr-xr-xsrc/ail_filter.c359
-rwxr-xr-xsrc/ail_package.c495
-rwxr-xr-xsrc/ail_package.h35
-rwxr-xr-xsrc/ail_private.h166
-rwxr-xr-xsrc/ail_sql.c91
-rwxr-xr-xsrc/ail_sql.h69
31 files changed, 5752 insertions, 0 deletions
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..a96dc7d
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,2 @@
+Sunghyuk Lee <sunghyuk.lee@samsung.com>
+Jin Yoon <jinny.yoon@samsung.com>
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..ae99411
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,56 @@
+# AIL build script
+
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+PROJECT(ail C)
+
+SET(LIBNAME "lib${PROJECT_NAME}")
+SET(PREFIX ${CMAKE_INSTALL_PREFIX})
+SET(BINDIR "${PREFIX}/bin")
+SET(LIBDIR "${PREFIX}/lib")
+SET(INCLUDEDIR "${PREFIX}/include")
+SET(VERSION_MAJOR 0)
+SET(VERSION "${VERSION_MAJOR}.1.0")
+
+# Add definitions
+ADD_DEFINITIONS("-DPREFIX=\"${PREFIX}\"")
+ADD_DEFINITIONS("-DPKGTYPE=\"${BUILD_PKGTYPE}\"")
+
+EXECUTE_PROCESS(COMMAND ../build_util/code_gen.sh)
+
+SET(SRCS
+ src/ail_db.c
+ src/ail_filter.c
+ src/ail_sql.c
+ src/ail_package.c
+ src/ail_desktop.c
+ src/ail_convert.c
+)
+
+INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include)
+
+INCLUDE(FindPkgConfig)
+
+pkg_check_modules(LPKGS REQUIRED glib-2.0 sqlite3 dlog db-util xdgmime vconf)
+STRING(REPLACE ";" " " EXTRA_CFLAGS "${LPKGS_CFLAGS}")
+SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fvisibility=hidden")
+
+# Make libraries
+ADD_LIBRARY(${LIBNAME} SHARED ${SRCS})
+TARGET_LINK_LIBRARIES(${LIBNAME} ${LPKGS_LIBRARIES})
+SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES COMPILE_FLAGS "${EXTRA_CFLAGS}")
+SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
+SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${VERSION})
+SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES SOVERSION ${VERSION_MAJOR})
+
+# PC file
+CONFIGURE_FILE(${PROJECT_NAME}.pc.in ${CMAKE_BINARY_DIR}/${PROJECT_NAME}.pc @ONLY)
+
+# Install
+INSTALL(TARGETS ${LIBNAME} DESTINATION lib)
+INSTALL(FILES ${CMAKE_BINARY_DIR}/${PROJECT_NAME}.pc DESTINATION lib/pkgconfig)
+INSTALL(FILES ${CMAKE_SOURCE_DIR}/include/ail.h DESTINATION include)
+INSTALL(FILES ${CMAKE_SOURCE_DIR}/desktop.conf DESTINATION share/install-info)
+
+# AIL init database
+ADD_SUBDIRECTORY(initdb)
+
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..9c13a9b
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,204 @@
+Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
diff --git a/ail.manifest b/ail.manifest
new file mode 100755
index 0000000..1d15cea
--- /dev/null
+++ b/ail.manifest
@@ -0,0 +1,11 @@
+<manifest>
+ <define>
+ <domain name="ail"/>
+ <provide>
+ <label name="ail::db"/>
+ </provide>
+ </define>
+ <request>
+ <domain name="_"/>
+ </request>
+</manifest>
diff --git a/ail.pc.in b/ail.pc.in
new file mode 100644
index 0000000..9588775
--- /dev/null
+++ b/ail.pc.in
@@ -0,0 +1,11 @@
+prefix=@PREFIX@
+exec_prefix=@EXEC_PREFIX@
+libdir=@LIBDIR@
+includedir=@INCLUDEDIR@
+
+Name: ail
+Description: Application Information Library
+Version: @VERSION@
+Requires: sqlite3 vconf dlog db-util
+Libs: -L@LIBDIR@ -lail
+Cflags: -I@INCLUDEDIR@
diff --git a/debian/changelog b/debian/changelog
new file mode 100644
index 0000000..15b134e
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,473 @@
+ail-0 (0.2.41) unstable; urgency=low
+
+ * Git: slp/pkgs/a/ail
+ * Tag: ail-0_0.2.41
+
+ * [Modify] Fixed initdb checking
+
+ -- Sewook Park <sewook7.park@samsung.com> Wed, 13 Jun 2012 13:26:43 +0900
+
+ail-0 (0.2.40) unstable; urgency=low
+
+ * Git: slp/pkgs/a/ail
+ * Tag: ail-0_0.2.40
+
+ * [Modify] Applied installed-time field
+
+ -- Sewook Park <sewook7.park@samsung.com> Tue, 12 Jun 2012 10:28:21 +0900
+
+ail-0 (0.2.39) unstable; urgency=low
+
+ * Git: slp/pkgs/a/ail
+ * Tag: ail-0_0.2.39
+
+ * [Modify] Fixed bug
+
+ -- Jaeho Lee <jaeho81.lee@samsung.com> Tue, 05 Jun 2012 17:07:40 +0900
+
+ail-0 (0.2.38) unstable; urgency=low
+
+ * Git: slp/pkgs/a/ail
+ * Tag: ail-0_0.2.38
+
+ * [Modify] Changed to use applicationID
+
+ -- Jaeho Lee <jaeho81.lee@samsung.com> Tue, 05 Jun 2012 17:07:40 +0900
+
+ail-0 (0.2.37) unstable; urgency=low
+
+ * Git: slp/pkgs/a/ail
+ * Tag: ail-0_0.2.37
+
+ * [Modify] Added path for desktop file
+
+ -- Jaeho Lee <jaeho81.lee@samsung.com> Tue, 05 Jun 2012 17:07:40 +0900
+
+ail-0 (0.2.36) unstable; urgency=low
+
+ * Git: slp/pkgs/a/ail
+ * Tag: ail-0_0.2.36
+
+ * [Modify] Changed API name
+
+ -- Jaeho Lee <jaeho81.lee@samsung.com> Tue, 05 Jun 2012 17:07:40 +0900
+
+ail-0 (0.2.35) unstable; urgency=low
+
+ * Git: slp/pkgs/a/ail
+ * Tag: ail-0_0.2.35
+
+ * [Modify] add a path for desktop file
+
+ -- Jaeho Lee <jaeho81.lee@samsung.com> Fri, 11 May 2012 17:14:40 +0900
+
+ail-0 (0.2.34) unstable; urgency=low
+
+ * Git: slp/pkgs/a/ail
+ * Tag: ail-0_0.2.34
+
+ * [Modify] add a path for desktop icons
+
+ -- Jinwoo Nam <jwoo.nam@samsung.com> Fri, 27 Apr 2012 14:33:31 +0900
+
+ail-0 (0.2.33) unstable; urgency=low
+
+ * Git: slp/pkgs/a/ail
+ * Tag: ail-0_0.2.33
+
+ * [Modify] Added Inactivated field
+
+ -- Sewook Park <sewook7.park@samsung.com> Fri, 06 Apr 2012 14:36:07 +0900
+
+ail-0 (0.2.32) unstable; urgency=low
+
+ * Git: slp/pkgs/a/ail
+ * Tag: ail-0_0.2.32
+
+ * [Modify] Fixed bug
+
+ -- Sewook Park <sewook7.park@samsung.com> Thu, 05 Apr 2012 23:06:49 +0900
+
+ail-0 (0.2.31) unstable; urgency=low
+
+ * Git: slp/pkgs/a/ail
+ * Tag: ail-0_0.2.31
+
+ * [Modify] Fixed AIL db permission, Cleaned up code
+
+ -- Sewook Park <sewook7.park@samsung.com> Mon, 02 Apr 2012 13:35:13 +0900
+
+ail-0 (0.2.30) unstable; urgency=low
+
+ * Git: slp/pkgs/a/ail
+ * Tag: ail-0_0.2.30
+
+ * [Modify] Fixed db open mode according to API
+
+ -- Sewook Park <sewook7.park@samsung.com> Thu, 29 Mar 2012 13:47:48 +0900
+
+ail-0 (0.2.29) unstable; urgency=low
+
+ * Git: slp/pkgs/a/ail
+ * Tag: ail-0_0.2.29
+
+ * [Modify] changed pkgtype according to build system
+
+ -- Sewook Park <sewook7.park@samsung.com> Wed, 28 Mar 2012 16:14:59 +0900
+
+ail-0 (0.2.28) unstable; urgency=low
+
+ * Git: slp/pkgs/a/ail
+ * Tag: ail-0_0.2.28
+
+ * [Modify] Fixed complie warnings
+
+ -- Jaeho Lee <jaeho81.lee@samsung.com> Tue, 20 Mar 2012 13:37:41 +0900
+
+ail-0 (0.2.27) unstable; urgency=low
+
+ * Git: slp/pkgs/a/ail
+ * Tag: ail-0_0.2.27
+
+ * [Modify] Removed unused AIL field
+
+ -- Sewook Park <sewook7.park@samsung.com> Sat, 17 Mar 2012 21:20:35 +0900
+
+ail-0 (0.2.26) unstable; urgency=low
+
+ * Git: slp/pkgs/a/ail
+ * Tag: ail-0_0.2.26
+
+ * [Modify] Changed desktop field prefix
+
+ -- Sewook Park <sewook7.park@samsung.com> Thu, 15 Mar 2012 11:07:16 +0900
+
+ail-0 (0.2.25) unstable; urgency=low
+
+ * Git: slp/pkgs/a/ail
+ * Tag: ail-0_0.2.25
+
+ * [Modify] Fixed bug for X_SLP_TASKMANAGE_BOOL
+
+ -- Sewook Park <sewook7.park@samsung.com> Tue, 06 Mar 2012 10:11:40 +0900
+
+ail-0 (0.2.24) unstable; urgency=low
+
+ * Git: slp/pkgs/a/ail
+ * Tag: ail-0_0.2.24
+
+ * [Modify] Changed API parameter - from enum to string
+
+ -- Sewook Park <sewook7.park@samsung.com> Mon, 27 Feb 2012 10:16:04 +0900
+
+ail-0 (0.2.23) unstable; urgency=low
+
+ * Git: slp/pkgs/a/ail
+ * Tag: ail-0_0.2.23
+
+ * [Modify] Added package id field for widget
+
+ -- Sewook Park <sewook7.park@samsung.com> Mon, 30 Jan 2012 17:41:45 +0900
+
+ail-0 (0.2.22) unstable; urgency=low
+
+ * Git: slp/pkgs/a/ail
+ * Tag: ail-0_0.2.22
+
+ * [Modify] Added TC
+
+ -- Sewook Park <sewook7.park@samsung.com> Mon, 19 Dec 2011 19:06:02 +0900
+
+ail-0 (0.2.21) unstable; urgency=low
+
+ * Git: 165.213.180.234:/slp/pkgs/a/ail
+ * Tag: ail-0_0.2.21
+
+ * [Modify] Added desktop.conf
+
+ -- Sewook Park <sewook7.park@samsung.com> Thu, 08 Dec 2011 14:53:02 +0900
+
+ail-0 (0.2.20) unstable; urgency=low
+
+ * Git: 165.213.180.234:/slp/pkgs/a/ail
+ * Tag: ail-0_0.2.20
+
+ * [Modify] changed boilerplate
+
+ -- Jaeho Lee <jaeho81.lee@samsung.com> Mon, 05 Dec 2011 16:29:21 +0900
+
+ail-0 (0.2.19) unstable; urgency=low
+
+ * Git: 165.213.180.234:/slp/pkgs/a/ail
+ * Tag: ail-0_0.2.19
+
+ * [Modify] Fix code for CQ H0100135781
+
+ -- Sewook Park <sewook7.park@samsung.com> Thu, 01 Dec 2011 19:20:30 +0900
+
+ail-0 (0.2.18) unstable; urgency=low
+
+ * Git: 165.213.180.234:/slp/pkgs/a/ail
+ * Tag: ail-0_0.2.18
+
+ * [Modify] Changed Boilerplate as per the guideline
+
+ -- Jaeho Lee <jaeho81.lee@samsung.com> Mon, 07 Nov 2011 16:19:22 +0900
+
+ail-0 (0.2.17) unstable; urgency=low
+
+ * Git: 165.213.180.234:/slp/pkgs/a/ail
+ * Tag: ail-0_0.2.17
+
+ * [Modify] Fix exec filter bug
+
+ -- Jaeho Lee <jaeho81.lee@samsung.com> Fri, 04 Nov 2011 18:01:06 +0900
+
+ail-0 (0.2.16) unstable; urgency=low
+
+ * Git: 165.213.180.234:/slp/pkgs/a/ail
+ * Tag: ail-0_0.2.16
+
+ * [Modify] Fix memory leak of prevent
+
+ -- Sewook Park <sewook7.park@samsung.com> Wed, 26 Oct 2011 19:50:44 +0900
+
+ail-0 (0.2.15) unstable; urgency=low
+
+ * Git: 165.213.180.234:/slp/pkgs/a/ail
+ * Tag: ail-0_0.2.15
+
+ * [Modify] Fix Exec filter operation to like
+
+ -- Sewook Park <sewook7.park@samsung.com> Mon, 17 Oct 2011 16:42:54 +0900
+
+ail-0 (0.2.14) unstable; urgency=low
+
+ * Git: 165.213.180.234:/slp/pkgs/a/ail
+ * Tag: ail-0_0.2.14
+
+ * [ADD] ail_db_close API
+
+ -- Jaeho Lee <jaeho81.lee@samsung.com> Mon, 26 Sep 2011 19:22:41 +0900
+
+ail-0 (0.2.13) unstable; urgency=low
+
+ * Git: 165.213.180.234:/slp/pkgs/a/ail
+ * Tag: ail-0_0.2.13
+
+ * [Remove] Remove old API
+
+ -- Sewook Park <sewook7.park@samsung.com> Mon, 26 Sep 2011 10:42:18 +0900
+
+ail-0 (0.2.12) unstable; urgency=low
+
+ * Git: 165.213.180.234:/slp/pkgs/a/ail
+ * Tag: ail-0_0.2.12
+
+ * [Modify] Fix name filter bug
+
+ -- Jaeho Lee <jaeho81.lee@samsung.com> Tue, 20 Sep 2011 16:11:34 +0900
+
+ail-0 (0.2.11) unstable; urgency=low
+
+ * Git: 165.213.180.234:/slp/pkgs/a/ail
+ * Tag: ail-0_0.2.11
+
+ * [Modify] Change package uninstall default setting (X-SLP-Removable)
+ * [Modify] Fix ail filtering count bug
+
+ -- Sunghyuk Lee <sunghyuk.lee@samsung.com> Fri, 16 Sep 2011 12:21:01 +0900
+
+ail-0 (0.2.10) unstable; urgency=low
+
+ * Git: 165.213.180.234:/slp/pkgs/a/ail
+ * Tag: ail-0_0.2.10
+
+ * [Modify] Support locale for filter
+ * [Remove] Remove buildutil
+
+ -- Sunghyuk Lee <sunghyuk.lee@samsung.com> Thu, 15 Sep 2011 14:18:55 +0900
+
+ail-0 (0.2.9) unstable; urgency=low
+
+ * Git: 165.213.180.234:/slp/pkgs/a/ail
+ * Tag: ail-0_0.2.9
+
+ * [Add] Create localname table
+
+ -- Sunghyuk Lee <sunghyuk.lee@samsung.com> Mon, 05 Sep 2011 14:31:01 +0900
+
+ail-0 (0.2.8) unstable; urgency=low
+
+ * Git: 165.213.180.234:/slp/pkgs/a/ail
+ * Tag: ail-0_0.2.8
+
+ * [Modify] Add ail_initdb error log to find opendir failure cause
+
+ -- Sunghyuk Lee <sunghyuk.lee@samsung.com> Thu, 25 Aug 2011 16:24:14 +0900
+
+ail-0 (0.2.7) unstable; urgency=low
+
+ * Git: 165.213.180.234:/slp/pkgs/a/ail
+ * Tag: ail-0_0.2.7
+
+ * [Modify] get more detail error messages
+
+ -- Jin Yoon <jinny.yoon@samsung.com> Wed, 24 Aug 2011 09:32:08 +0900
+
+ail-0 (0.2.6) unstable; urgency=low
+
+ * Git: 165.213.180.234:/slp/pkgs/a/ail
+ * Tag: ail-0_0.2.6
+
+ * [Modify] initdb uses fprintf instead of dlog because initdb is executed in the postinst
+
+ -- Jin Yoon <jinny.yoon@samsung.com> Tue, 23 Aug 2011 13:57:37 +0900
+
+ail-0 (0.2.5) unstable; urgency=low
+
+ * Git: 165.213.180.234:/slp/pkgs/a/ail
+ * Tag: ail-0_0.2.5
+
+ * [Fix] Fix a wrong pointer when freeing handle
+
+ -- Sunghyuk Lee <sunghyuk.lee@samsung.com> Thu, 18 Aug 2011 14:41:01 +0900
+
+ail-0 (0.2.4) unstable; urgency=low
+
+ * Git: 165.213.180.234:/slp/pkgs/a/ail
+ * Tag: ail-0_0.2.4
+
+ * [Fix] remove double free.
+
+ -- Jin Yoon <jinny.yoon@samsung.com> Thu, 18 Aug 2011 11:16:52 +0900
+
+ail-0 (0.2.3) unstable; urgency=low
+
+ * Git: 165.213.180.234:/slp/pkgs/a/ail
+ * Tag: ail-0_0.2.3
+
+ * [Add] execute ail_initdb in the postinst.
+ * [Modify] db_finalize free a handle.
+
+ -- Jin Yoon <jinny.yoon@samsung.com> Wed, 17 Aug 2011 16:48:31 +0900
+
+ail-0 (0.2.1) unstable; urgency=low
+
+ * Git: 165.213.180.234:/slp/pkgs/a/ail
+ * Tag: ail-0_0.2.1
+
+ * Add dependancies for dev package
+
+ -- Sunghyuk Lee <sunghyuk.lee@samsung.com> Mon, 08 Aug 2011 22:35:54 +0900
+
+ail-0 (0.2.0) unstable; urgency=low
+
+ * Git: 165.213.180.234:/slp/pkgs/a/ail
+ * Tag: ail-0_0.2.0
+
+ * New AIL release
+ * Recacy APIs are deprecated
+
+ -- Sunghyuk Lee <sunghyuk.lee@samsung.com> Mon, 08 Aug 2011 21:11:18 +0900
+
+ail-0 (0.1.11) unstable; urgency=low
+
+ * Git: 165.213.180.234:/slp/pkgs/a/ail
+ * Tag: ail-0_0.1.11
+
+ * Source code clean up
+
+ -- Jin Yoon <jinny.yoon@samsung.com> Sun, 17 Jul 2011 10:48:28 +0900
+
+ail-0 (0.1.10) unstable; urgency=low
+
+ * Git: 165.213.180.234:/slp/pkgs/a/ail
+ * Tag: ail-0_0.1.10
+
+ * Update changelog
+
+ -- Sunghyuk Lee <sunghyuk.lee@samsung.com> Fri, 10 Jun 2011 19:11:15 +0900
+
+ail-0 (0.1.9) unstable; urgency=low
+
+ * Git: 165.213.180.234:/slp/pkgs/a/ail
+ * Tag: ail-0_0.1.9
+
+ * SVACE Check
+
+ -- Jin Yoon <jinny.yoon@samsung.com> Wed, 08 Jun 2011 11:01:37 +0900
+
+ail-0 (0.1.8) unstable; urgency=low
+
+ * Git: 165.213.180.234:/slp/pkgs/a/ail
+ * Tag: ail-0_0.1.8
+
+ * fix the LIMIT problem.
+
+ -- Jin Yoon <jinny.yoon@samsung.com> Sat, 21 May 2011 09:34:35 +0900
+
+ail-0 (0.1.7) unstable; urgency=low
+
+ * Git: 165.213.180.234:/slp/pkgs/a/ail
+ * Tag: ail-0_0.1.7
+
+ * ail_package_get_icon returns the absolute path.
+ * Bug fix : ail_exec_exist, ail_set_rs_limit
+
+ -- Jin Yoon <jinny.yoon@samsung.com> Wed, 04 May 2011 14:50:50 +0900
+
+ail-0 (0.1.6) unstable; urgency=low
+
+ * Git: 165.213.180.234:/slp/pkgs/a/ail
+ * Tag: ail-0_0.1.6
+
+ * Code Review
+
+ -- Jin Yoon <jinny.yoon@samsung.com> Mon, 25 Apr 2011 15:35:38 +0900
+
+ail-0 (0.1.5) unstable; urgency=low
+
+ * Git: 165.213.180.234:/slp/pkgs/a/ail
+ * Tag: ail-0_0.1.5
+
+ -- Jin Yoon <jinny.yoon@samsung.com> Fri, 15 Apr 2011 22:10:44 +0900
+
+ail-0 (0.1.4) unstable; urgency=low
+
+ * Git: 165.213.180.234:/slp/pkgs/a/ail
+ * Tag: ail-0_0.1.4
+
+ -- Jin Yoon <jinny.yoon@samsung.com> Thu, 14 Apr 2011 19:38:37 +0900
+
+ail-0 (0.1.3) unstable; urgency=low
+
+ * Git: 165.213.180.234:/slp/pkgs/a/ail
+ * Tag: ail-0_0.1.3
+
+ -- Jin Yoon <jinny.yoon@samsung.com> Wed, 06 Apr 2011 16:27:13 +0900
+
+ail-0 (0.1.2) unstable; urgency=low
+
+ * Upload AIL after reviewing with gerrit
+ * Git: 165.213.180.234:/slp/pkgs/a/ail
+ * Tag: ail-0_0.1.2
+
+ -- Jin Yoon <jinny.yoon@samsung.com> Tue, 05 Apr 2011 18:30:32 +0900
+
+ail-0 (0.1.1) unstable; urgency=low
+
+ * Upload AIL Package to the Main Binary
+ * Git: 165.213.180.234:/slp/pkgs/a/ail
+ * Tag: ail_0.1.1
+
+ -- Jin Yoon <jinny.yoon@samsung.com> Mon, 04 Apr 2011 10:59:11 +0900
+
+ail (0.1.0) unstable; urgency=low
+
+ * Git: 165.213.180.234:/slp/pkgs/a/ail
+ * Tag: ail_0.1.0
+
+ * AIL(Application Information Library) added.
+
+ -- Jin Yoon <jinny.yoon@samsung.com> Wed, 15 Dec 2010 18:47:43 +0900
diff --git a/debian/compat b/debian/compat
new file mode 100644
index 0000000..7ed6ff8
--- /dev/null
+++ b/debian/compat
@@ -0,0 +1 @@
+5
diff --git a/debian/control b/debian/control
new file mode 100644
index 0000000..eaa7137
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,25 @@
+Source: ail-0
+Section: devel
+Priority: extra
+Maintainer: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>, Jaeho Lee <jaeho81.lee@samsung.com>, Jin Yoon <jinny.yoon@samsung.com>, Sunghyuk Lee <sunghyuk.lee@samsung.com>, Jinmin Chung <jinmin@samsung.com>
+Uploaders: Jin Yoon <jinny.yoon@samsung.com>
+Build-Depends: debhelper (>= 5), libvconf-dev, libsqlite3-dev, dlog-dev, libslp-db-util-dev, libglib2.0-dev, libxdgmime-dev
+Homepage: N/A
+Standards-Version: 0.1
+
+Package: libail-0
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Description: Application Information Library
+
+Package: libail-0-dev
+Architecture: any
+Depends: libail-0 (= ${Source-Version}), libsqlite3-dev, dlog-dev, libslp-db-util-dev, libvconf-dev
+Description: Application Information Library
+
+Package: libail-0-dbg
+Section: debug
+Architecture: any
+Depends: libail-0 (= ${Source-Version})
+Description: Application Information Library
+
diff --git a/debian/docs b/debian/docs
new file mode 100644
index 0000000..a0f0008
--- /dev/null
+++ b/debian/docs
@@ -0,0 +1 @@
+CMakeLists.txt
diff --git a/debian/jobs b/debian/jobs
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/debian/jobs
diff --git a/debian/libail-0-dev.install.in b/debian/libail-0-dev.install.in
new file mode 100644
index 0000000..f9c8282
--- /dev/null
+++ b/debian/libail-0-dev.install.in
@@ -0,0 +1,3 @@
+@PREFIX@/include/*.h
+@PREFIX@/lib/pkgconfig/*.pc
+@PREFIX@/lib/*.so
diff --git a/debian/libail-0.install.in b/debian/libail-0.install.in
new file mode 100644
index 0000000..ff95355
--- /dev/null
+++ b/debian/libail-0.install.in
@@ -0,0 +1,3 @@
+@PREFIX@/lib/*.so.*
+@PREFIX@/bin/ail_initdb
+@PREFIX@/share/install-info/*
diff --git a/debian/libail-0.postinst b/debian/libail-0.postinst
new file mode 100644
index 0000000..887468d
--- /dev/null
+++ b/debian/libail-0.postinst
@@ -0,0 +1,32 @@
+#!/bin/sh
+CHDBGID="6010"
+
+init_appinfo_db()
+{
+ ail_initdb
+ if [ $? -ne 0 ]; then
+ echo "Failed to initialize app info db"
+ fi
+}
+
+update_DAC_for_db_file()
+{
+ if [ ! -f $@ ]; then
+ touch $@
+ fi
+
+ chown :$CHDBGID $@ 2>/dev/null
+ if [ $? -ne 0 ]; then
+ echo "Failed to change the owner of $@"
+ fi
+ chmod 664 $@ 2>/dev/null
+ if [ $? -ne 0 ]; then
+ echo "Failed to change the perms of $@"
+ fi
+}
+
+init_appinfo_db
+update_DAC_for_db_file /opt/dbspace/.app_info.db
+update_DAC_for_db_file /opt/dbspace/.app_info.db-journal
+
+# End of a file
diff --git a/debian/rules b/debian/rules
new file mode 100755
index 0000000..4a72e07
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,119 @@
+#!/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
+
+CFLAGS += -Wall -g
+LDFLAGS ?=
+PREFIX ?= /usr
+DATADIR ?= /opt
+PKGTYPE ?= deb
+
+ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
+ CFLAGS += -O0
+else
+ CFLAGS += -O2
+endif
+
+ifneq (,$(findstring arm,$(DEB_HOST_ARCH)))
+ export ARCH = arm
+else
+ export ARCH = i686
+endif
+
+CMAKE_BUILD_DIR ?= $(CURDIR)/cmake_build_tmp
+
+LDFLAGS += -Wl,--rpath=$(PREFIX)/lib -Wl,--as-needed
+
+configure: configure-stamp
+configure-stamp:
+ dh_testdir
+ mkdir -p $(CMAKE_BUILD_DIR) && cd $(CMAKE_BUILD_DIR) && \
+ CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" \
+ cmake .. -DCMAKE_INSTALL_PREFIX="$(PREFIX)" -DBUILD_PKGTYPE="$(PKGTYPE)"
+
+ touch configure-stamp
+
+
+build: build-stamp
+
+build-stamp: configure-stamp
+ dh_testdir
+
+ # Add here commands to compile the package.
+ cd $(CMAKE_BUILD_DIR) && $(MAKE)
+
+ 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_BUILD_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/wavplayer.
+ cd $(CMAKE_BUILD_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
+ dh_strip --dbg-package=libail-0-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 configure
diff --git a/desktop.conf b/desktop.conf
new file mode 100644
index 0000000..3be783d
--- /dev/null
+++ b/desktop.conf
@@ -0,0 +1 @@
+/opt/share/applications
diff --git a/include/SLP_AIL_PG.h b/include/SLP_AIL_PG.h
new file mode 100755
index 0000000..6cb6606
--- /dev/null
+++ b/include/SLP_AIL_PG.h
@@ -0,0 +1,270 @@
+/*
+ * ail
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>, Jaeho Lee <jaeho81.lee@samsung.com>
+ *
+ * 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 SLP_PG_APPLICATION INFORMATION LIBRARY AIL
+ @{
+
+<h1 class="pg">Introduction</h1>
+
+<h2 class="pg">Purpose of this document</h2>
+ The purpose of this document is to describe how applications can use Application information library APIs to store/retrive the application's informations. This document gives programming guidelines to the application engineers.
+
+<h2 class="pg">Scope</h2>
+The scope of this document is limited to AIL API usage.
+
+
+<h1 class="pg">Architecture</h1>
+
+<h2 class="pg">Architecture overview</h2>
+Application information library manages the application information such as application name, type, icon path, exe path etc.
+
+@image html SLP_ail_logical_view.png
+
+<h2 class="pg">SLP Features</h2>
+- The Application information library provides installed applications informations.
+- The Application information library exposes the APIs to filter the applcation based on certain fields.
+- The Application information library uses DB to store the informations of the application.
+- The Application information library can process the desktop file to store/retrive the informations.
+
+
+<h1 class="pg">Application information library properties</h1>
+
+<h2 class="pg">AIL Functionality</h2>
+There are three types of API's provided by AIL
+- ail_appinfo_xxx
+ - Get the informations of the given package.
+- ail_filter_xxx
+ - Get the Application informations matched to filter condition.
+- ail_desktop_xxx
+ - add, update or remove package informations in DB.
+
+<h2 class="pg">Software Components</h2>
+- Query Requester
+ - It provides the interface to the DB. It is responsible for forming the query and excute the query in db.
+- Desktop file Reader/parser
+ - It can read the application's desktop file from the file system (/opt/share/application/).
+- Filter
+ - It can filter the query based on the given condition and it returns the filtered output to the application.
+- Get App info
+ - It can get the information of the application using appid.
+
+<h1 class="pg"> Software module Details </h2>
+
+<h2 class="pg"> Query Requester </h2>
+ - Query Requester module is provides the interface to sql DB in AIL.
+ - It is responsible for creating connection to the DB, form the sql query and execute the query in DB.
+ - It uses the libsql API to access the DB. (Eg) db_xx() API.
+
+@code
+
+@brief string type properties
+
+#define AIL_PROP_PACKAGE_STR "AIL_PROP_PACKAGE_STR"
+#define AIL_PROP_EXEC_STR "AIL_PROP_EXEC_STR"
+#define AIL_PROP_NAME_STR "AIL_PROP_NAME_STR"
+#define AIL_PROP_TYPE_STR "AIL_PROP_TYPE_STR"
+#define AIL_PROP_ICON_STR "AIL_PROP_ICON_STR"
+#define AIL_PROP_CATEGORIES_STR "AIL_PROP_CATEGORIES_STR"
+#define AIL_PROP_VERSION_STR "AIL_PROP_VERSION_STR"
+#define AIL_PROP_MIMETYPE_STR "AIL_PROP_MIMETYPE_STR"
+#define AIL_PROP_X_SLP_SERVICE_STR "AIL_PROP_X_SLP_SERVICE_STR"
+#define AIL_PROP_X_SLP_PACKAGETYPE_STR "AIL_PROP_X_SLP_PACKAGETYPE_STR"
+#define AIL_PROP_X_SLP_PACKAGECATEGORIES_STR "AIL_PROP_X_SLP_PACKAGECATEGORIES_STR"
+#define AIL_PROP_X_SLP_PACKAGEID_STR "AIL_PROP_X_SLP_PACKAGEID_STR"
+#define AIL_PROP_X_SLP_SVC_STR "AIL_PROP_X_SLP_SVC_STR"
+#define AIL_PROP_X_SLP_EXE_PATH "AIL_PROP_X_SLP_EXE_PATH"
+#define AIL_PROP_X_SLP_APPID_STR "AIL_PROP_X_SLP_APPID_STR"
+
+
+@brief integer type properties
+
+#define AIL_PROP_X_SLP_TEMP_INT "AIL_PROP_X_SLP_TEMP_INT"
+#define AIL_PROP_X_SLP_INSTALLEDTIME_INT "AIL_PROP_X_SLP_INSTALLEDTIME_INT"
+
+@brief boolean type properties
+
+#define AIL_PROP_NODISPLAY_BOOL "AIL_PROP_NODISPLAY_BOOL"
+#define AIL_PROP_X_SLP_TASKMANAGE_BOOL "AIL_PROP_X_SLP_TASKMANAGE_BOOL"
+#define AIL_PROP_X_SLP_MULTIPLE_BOOL "AIL_PROP_X_SLP_MULTIPLE_BOOL"
+#define AIL_PROP_X_SLP_REMOVABLE_BOOL "AIL_PROP_X_SLP_REMOVABLE_BOOL"
+#define AIL_PROP_X_SLP_INACTIVATED_BOOL "AIL_PROP_X_SLP_INACTIVATED_BOOL"
+
+
+@brief A handle for filters
+
+typedef struct ail_filter *ail_filter_h;
+
+@brief A handle for appinfos
+
+typedef struct ail_appinfo *ail_appinfo_h;
+
+@endcode
+
+
+<h2 class="pg">Desktop file Reader/parser</h2>
+ - This module provides set of APIs to add update delete application's desktop files contents in DB.
+ - It is responsible for validate the desktop file contents are in standard format.
+ - The major functionality of this module is add, update and delete desktop file contents in DB Eg.(ail_desktop_xxx())
+ <h3 class="pg"> Desktop file specification </h3>
+ - http://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#introduction
+ - Desktop entry files should have the .desktop extension
+ - Entries in the file are {key,value} pairs in the format: Key=Value
+ - Standard Keys
+ - Type, Version, Name, NoDisplay, Icon, Hidden, Exec, Path, MimeType, Categories, URL, etc
+ - The Exec key must contain a command line. A command line consists of an executable program optionally followed by one or more arguments.
+ - The executable program can either be specified with its full path or with the name of the executable only.
+ - If no full path is provided the executable is looked up in the $PATH environment variable used by the desktop environment.
+ - The name or path of the executable program may not contain the equal sign ("="). Arguments are separated by a space.
+
+@image html SLP_AIL_desktop.png
+
+<h2 class="pg"> Adding desktop file to DB </h2>
+@image html SLP_AIL_add.png
+<h2 class="pg" > Sample code </h2>
+@code
+static ail_error_e _add_desktop(const char *package)
+{
+ ail_error_e ret;
+
+ if (!package) {
+ return AIL_ERROR_FAIL;
+ }
+
+ ret = ail_desktop_add(package);
+ if (ret != AIL_ERROR_OK) {
+ return AIL_ERROR_FAIL;
+ }
+
+ return AIL_ERROR_OK;
+}
+
+static ail_error_e _remove_desktop(const char *package)
+{
+ ail_error_e ret;
+
+ if (!package) {
+ return AIL_ERROR_FAIL;
+ }
+
+ ret = ail_desktop_remove(package);
+ if (ret != AIL_ERROR_OK) {
+ return AIL_ERROR_FAIL;
+ }
+
+ return AIL_ERROR_OK;
+}
+
+@endcode
+
+<h2 class="pg">Filter</h2>
+This module provides set of APIs to get the information from the DB based on the given matched condtion.
+It is reponsbile for giving the filtered output to the applications. Eg.(ail_filter_xxx()) These following are some of the filtering condition.
+ - Filter integer type only
+ - Filter string type only
+ - Filter bool type only
+
+<h3 class="pg" > Filter sample code </h3>
+@code
+ail_cb_ret_e appinfo_func(const ail_appinfo_h appinfo, void *user_data)
+{
+ int *i = (int *)user_data;
+ char *package;
+
+ ail_appinfo_get_str(appinfo, AIL_PROP_PACKAGE_STR, &package);
+ printf("i=%d %s\n", (*i)++, package);
+
+ if (*i > 30)
+ return AIL_CB_RET_CANCEL;
+
+ return AIL_CB_RET_CONTINUE;
+}
+
+int list_packages()
+{
+ ail_filter_h filter;
+ ail_error_e ret;
+ int i=0;
+
+ ret = ail_filter_new(&filter);
+ if (ret != AIL_ERROR_OK) {
+ return -1;
+ }
+
+ ret = ail_filter_add_bool(filter, AIL_PROP_X_SLP_REMOVABLE_BOOL, true);
+ if (ret != AIL_ERROR_OK) {
+ return -1;
+ }
+
+ ret = ail_filter_add_str(filter, AIL_PROP_TYPE_STR, "Application");
+ if (ret != AIL_ERROR_OK) {
+ return -1;
+ }
+
+ printf("List packages which are removable and 'Application' typed\n");
+ ail_filter_list_appinfo_foreach(filter, appinfo_func, (void *)&i);
+
+ ail_filter_destroy(filter);
+
+ return 0;
+}
+
+@endcode
+
+<h2 class="pg">Get Application info</h2>
+ - This module provides set of APIs to get informations of the installed packages.
+ - This module internally uses the query Requester module to get the information of the requested packages in DB. Eg.(ail_appinfo_xxx())
+@image html SLP_AIL_get.png
+
+@code
+static ail_error_e _get_name(const char *package)
+{
+ ail_appinfo_h handle;
+ ail_error_e ret;
+ char *str;
+
+ ret = ail_package_get_appinfo(package, &handle);
+ if (ret != AIL_ERROR_OK) {
+ return AIL_ERROR_FAIL;
+ }
+
+ ret = ail_appinfo_get_str(handle, AIL_PROP_NAME_STR, &str);
+ if (ret != AIL_ERROR_OK) {
+ return AIL_ERROR_FAIL;
+ }
+ fprintf(stderr, "Package[%s], Property[%s] : %s\n", package, property, str);
+
+ ret = ail_package_destroy_appinfo(handle);
+ if (ret != AIL_ERROR_OK) {
+ return AIL_ERROR_FAIL;
+ }
+
+ return AIL_ERROR_OK;
+}
+
+@endcode
+
+
+ @}
+**/
diff --git a/include/ail.h b/include/ail.h
new file mode 100755
index 0000000..7faaae4
--- /dev/null
+++ b/include/ail.h
@@ -0,0 +1,1106 @@
+/*
+ * ail
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>, Jaeho Lee <jaeho81.lee@samsung.com>
+ *
+ * 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 __AIL_H__
+#define __AIL_H__
+
+#include <stdbool.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+
+/**
+ * @open
+ * @ingroup APPLICATION_FRAMEWORK
+ * @defgroup ail Application Information Library
+ */
+
+/**
+ * @file ail.h
+ * @brief Application Information Library header
+ * @author Sunghyuk Lee (sunghyuk.lee@samsung.com), Jin Yoon (jinny.yoon@samsung.com)
+ * @date 2011-07-30
+ * @version 0.1
+ */
+
+/**
+ * @addtogroup ail
+ * @{
+ */
+
+/**
+ * @brief string type properties
+ */
+#define AIL_PROP_PACKAGE_STR "AIL_PROP_PACKAGE_STR"
+#define AIL_PROP_EXEC_STR "AIL_PROP_EXEC_STR"
+#define AIL_PROP_NAME_STR "AIL_PROP_NAME_STR"
+#define AIL_PROP_TYPE_STR "AIL_PROP_TYPE_STR"
+#define AIL_PROP_ICON_STR "AIL_PROP_ICON_STR"
+#define AIL_PROP_CATEGORIES_STR "AIL_PROP_CATEGORIES_STR"
+#define AIL_PROP_VERSION_STR "AIL_PROP_VERSION_STR"
+#define AIL_PROP_MIMETYPE_STR "AIL_PROP_MIMETYPE_STR"
+#define AIL_PROP_X_SLP_SERVICE_STR "AIL_PROP_X_SLP_SERVICE_STR"
+#define AIL_PROP_X_SLP_PACKAGETYPE_STR "AIL_PROP_X_SLP_PACKAGETYPE_STR"
+#define AIL_PROP_X_SLP_PACKAGECATEGORIES_STR "AIL_PROP_X_SLP_PACKAGECATEGORIES_STR"
+#define AIL_PROP_X_SLP_PACKAGEID_STR "AIL_PROP_X_SLP_PACKAGEID_STR"
+#define AIL_PROP_X_SLP_SVC_STR "AIL_PROP_X_SLP_SVC_STR"
+#define AIL_PROP_X_SLP_EXE_PATH "AIL_PROP_X_SLP_EXE_PATH"
+#define AIL_PROP_X_SLP_APPID_STR "AIL_PROP_X_SLP_APPID_STR"
+#define AIL_PROP_X_SLP_PKGID_STR "AIL_PROP_X_SLP_PKGID_STR"
+#define AIL_PROP_X_SLP_DOMAIN_STR "AIL_PROP_X_SLP_DOMAIN_STR"
+
+
+/**
+ * @brief integer type properties
+ */
+#define AIL_PROP_X_SLP_TEMP_INT "AIL_PROP_X_SLP_TEMP_INT"
+#define AIL_PROP_X_SLP_INSTALLEDTIME_INT "AIL_PROP_X_SLP_INSTALLEDTIME_INT"
+
+/**
+ * @brief boolean type properties
+ */
+#define AIL_PROP_NODISPLAY_BOOL "AIL_PROP_NODISPLAY_BOOL"
+#define AIL_PROP_X_SLP_TASKMANAGE_BOOL "AIL_PROP_X_SLP_TASKMANAGE_BOOL"
+#define AIL_PROP_X_SLP_MULTIPLE_BOOL "AIL_PROP_X_SLP_MULTIPLE_BOOL"
+#define AIL_PROP_X_SLP_REMOVABLE_BOOL "AIL_PROP_X_SLP_REMOVABLE_BOOL"
+#define AIL_PROP_X_SLP_INACTIVATED_BOOL "AIL_PROP_X_SLP_INACTIVATED_BOOL"
+
+
+/**
+ * @brief A handle for filters
+ */
+typedef struct ail_filter *ail_filter_h;
+
+/**
+ * @brief A handle for appinfos
+ */
+typedef struct ail_appinfo *ail_appinfo_h;
+
+/**
+ * @brief return values
+ */
+typedef enum {
+ AIL_ERROR_OK = 0, /**< General success */
+ AIL_ERROR_FAIL = -1, /**< General error */
+ AIL_ERROR_DB_FAILED = -2, /**< Database error */
+ AIL_ERROR_OUT_OF_MEMORY = -3, /**< Out of memory */
+ AIL_ERROR_INVALID_PARAMETER = -4, /**< Invalid parameter */
+ AIL_ERROR_NO_DATA = -5, /**< Success, but no data */
+} ail_error_e;
+
+/**
+ * @fn ail_error_e ail_filter_new(ail_filter_h *filter)
+ *
+ * @brief Create a new filter handle which is used to filter records from Application Information Database. You can add filtering conditions to filter with ail_filter_add_xxx functions. All conditions are ANDed.
+ *
+ * @par Sync (or) Async : Synchronous API.
+ *
+ * @param[out] filter a pointer to a filter which is newly created
+ *
+ * @return 0 if success, negative value(<0) if fail\n
+ * @retval AIL_ERROR_OK success
+ * @retval AIL_ERROR_INVALID_PARAMETER invalid parameter
+ * @retval AIL_ERROR_OUT_OF_MEMORY out of memory
+ *
+ * @pre None
+ * @post If the filter is no longer used, it should be freed with ail_filter_destroy()
+ *
+ * @see ail_filter_destroy()
+ *
+ * @par Prospective Clients:
+ * External Apps.
+ *
+ * @code
+int count_apps()
+{
+ ail_filter_h filter;
+ ail_error_e ret;
+ int n;
+
+ ret = ail_filter_new(&filter);
+ if (ret != AIL_ERROR_OK) {
+ return -1;
+ }
+
+ ret = ail_filter_add_bool(filter, AIL_PROP_NODISPLAY_BOOL, false);
+ if (ret != AIL_ERROR_OK) {
+ return -1;
+ }
+
+ ret = ail_filter_add_str(filter, AIL_PROP_MIMETYPE_STR, "audio/wav");
+ if (ret != AIL_ERROR_OK) {
+ return -1;
+ }
+
+ ret = ail_filter_count_appinfo(filter, &n);
+ if (ret != AIL_ERROR_OK) {
+ return -1;
+ }
+ ret = ail_filter_destroy(filter);
+
+ printf("N of apps not to be displayed and supporting 'audo/wav' mime type = %d\n", n);
+
+ return n;
+}
+ * @endcode
+ */
+ail_error_e ail_filter_new(ail_filter_h *filter);
+
+
+
+/**
+ * @fn ail_error_e ail_error_e ail_filter_add_int(ail_filter_h filter, const char *property, const int value)
+ *
+ * @brief Add integer condition to filter
+ *
+ * @par Sync (or) Async : Synchronous API
+ *
+ * @param[in] filter a filter handle which can be create with ail_filter_new()
+ * @param[in] property a property type of integer
+ * @param[in] value the value to filter by
+ *
+ * @return 0 if success, negative value(<0) if fail\n
+ * @retval AIL_ERROR_OK success
+ * @retval AIL_ERROR_INVALID_PARAMETER invalid parameter
+ * @retval AIL_ERROR_OUT_OF_MEMORY out of memory
+ *
+ * @pre The filter should be valid handle which was created by ail_filter_new()
+ *
+ * @see ail_filter_new()
+ *
+ * @par Prospective Clients:
+ * External Apps.
+ *
+ * @code
+int count_apps()
+{
+ ail_filter_h filter;
+ ail_error_e ret;
+ int n;
+
+ ret = ail_filter_new(&filter);
+ if (ret != AIL_ERROR_OK) {
+ return -1;
+ }
+
+ ret = ail_filter_add_int(filter, AIL_PROP_X_SLP_BASELAYOUTWIDTH_INT, 480);
+ if (ret != AIL_ERROR_OK) {
+ return -1;
+ }
+
+ ret = ail_filter_count_appinfo(filter, &n);
+ if (ret != AIL_ERROR_OK) {
+ return -1;
+ }
+
+ printf("N of apps = %d\n", n);
+
+ return n;
+}
+ * @endcode
+ */
+ail_error_e ail_filter_add_int(ail_filter_h filter, const char *property, const int value);
+
+
+/**
+ * @fn ail_error_e ail_error_e ail_filter_add_bool(ail_filter_h filter, const char *property, const bool value)
+ *
+ * @brief Add boolean condition to filter by. The value can be true/false only
+ *
+ * @par Sync (or) Async : Synchronous API
+ *
+ * @param[in] filter a filter handle which can be create with ail_filter_new()
+ * @param[in] property a property type of boolean
+ * @param[in] value the value to filter by
+ *
+ * @return 0 if success, negative value(<0) if fail\n
+ * @retval AIL_ERROR_OK success
+ * @retval AIL_ERROR_INVALID_PARAMETER invalid parameter
+ * @retval AIL_ERROR_OUT_OF_MEMORY out of memory
+ *
+ * @pre The filter should be valid handle which was created by ail_filter_new()
+ *
+ * @see ail_filter_new()
+ *
+ * @par Prospective Clients:
+ * External Apps.
+ *
+ * @code
+int count_apps()
+{
+ ail_filter_h filter;
+ ail_error_e ret;
+ int n;
+
+ ret = ail_filter_new(&filter);
+ if (ret != AIL_ERROR_OK) {
+ return -1;
+ }
+
+ ret = ail_filter_add_bool(filter, AIL_PROP_X_SLP_REMOVABLE_BOOL, true);
+ if (ret != AIL_ERROR_OK) {
+ return -1;
+ }
+
+ ret = ail_filter_count_appinfo(filter, &n);
+ if (ret != AIL_ERROR_OK) {
+ return -1;
+ }
+
+ fprintf(stderr, "N of apps = %d\n", n);
+
+ return n;
+}
+ * @endcode
+ */
+ail_error_e ail_filter_add_bool(ail_filter_h filter, const char *property, bool value);
+
+
+
+/**
+ * @fn ail_error_e ail_error_e ail_filter_add_str(ail_filter_h filter, const char *property, const char *value)
+ *
+ * @brief Add string condition to filter by. The string is case-sensitive.
+ *
+ * @par Sync (or) Async : Synchronous API
+ *
+ * @param[in] filter a filter handle which can be create with ail_filter_new()
+ * @param[in] property a property type of string
+ * @param[in] value the value to filter by
+ *
+ * @return 0 if success, negative value(<0) if fail\n
+ * @retval AIL_ERROR_OK success
+ * @retval AIL_ERROR_INVALID_PARAMETER invalid parameter
+ * @retval AIL_ERROR_OUT_OF_MEMORY out of memory
+ *
+ * @pre The filter should be valid handle which was created by ail_filter_new()
+ *
+ * @see ail_filter_new()
+ *
+ * @par Prospective Clients:
+ * External Apps.
+ *
+ * @code
+int count_apps()
+{
+ ail_filter_h filter;
+ ail_error_e ret;
+ int n;
+
+ ret = ail_filter_new(&filter);
+ if (ret != AIL_ERROR_OK) {
+ return -1;
+ }
+
+ ret = ail_filter_add_str(filter, AIL_PROP_PACKAGE_STR, "com.samsung.memo");
+ if (ret != AIL_ERROR_OK) {
+ return -1;
+ }
+
+ ret = ail_filter_count_appinfo(filter, &n);
+ if (ret != AIL_ERROR_OK) {
+ return -1;
+ }
+
+ fprintf(stderr, "N of apps = %d\n", n);
+
+ return n;
+}
+ * @endcode
+ */
+ail_error_e ail_filter_add_str(ail_filter_h filter, const char *property, const char *value);
+
+
+
+/**
+ * @fn ail_error_e ail_filter_destroy(ail_filter_h filter)
+ *
+ * @brief Destroy a filter which is not used any longer.
+ *
+ * @par Sync (or) Async : Synchronous API
+ *
+ * @param[in] filter filter handle
+ *
+ * @return 0 if success, negative value(<0) if fail\n
+ * @retval AIL_ERROR_OK success
+ * @retval AIL_ERROR_INVALID_PARAMETER invalid parameter
+ *
+ * @post If the filter is no longer used, it should be freed with ail_filter_destroy()
+ *
+ * @see ail_filter_new()
+ *
+ * @par Prospective Clients:
+ * External Apps.
+ *
+ * @code
+int count_apps()
+{
+ ail_filter_h filter;
+ ail_error_e ret;
+ int n;
+
+ ret = ail_filter_new(&filter);
+ if (ret != AIL_ERROR_OK) {
+ return -1;
+ }
+
+ ret = ail_filter_add_bool(filter, AIL_PROP_X_SLP_REMOVABLE_BOOL, true);
+ if (ret != AIL_ERROR_OK) {
+ return -1;
+ }
+
+ ret = ail_filter_count_appinfo(filter, &n);
+ if (ret != AIL_ERROR_OK) {
+ return -1;
+ }
+
+ printf("N of removable apps = %d\n", n);
+
+ ret = ail_filter_add_str(filter, AIL_PROP_MIMETYPE_STR, "audio/wav");
+ if (ret != AIL_ERROR_OK) {
+ return -1;
+ }
+
+ ret = ail_filter_count_appinfo(filter, &n);
+ if (ret != AIL_ERROR_OK) {
+ return -1;
+ }
+
+ printf("N of apps removable and supporting 'audo/wav' mime type = %d\n", n);
+
+ ret = ail_filter_destroy(filter);
+
+ return n;
+}
+ * @endcode
+ */
+ail_error_e ail_filter_destroy(ail_filter_h filter);
+
+
+
+/**
+ * @brief return value type of ail_list_appinfo_cb
+ */
+typedef enum {
+ AIL_CB_RET_CONTINUE = 1, /**< continue */
+ AIL_CB_RET_CANCEL = 0, /**< cancel */
+} ail_cb_ret_e;
+
+/**
+ * @fn ail_cb_ret_e (*ail_list_appinfo_cb) (const ail_appinfo_h appinfo_h, void *user_data)
+ *
+ * @breif Specifies the type of functions passed to ail_filter_list_appinfo_foreach().
+ *
+ * @param[in] appinfo_h the appinfo's handle
+ * @param[in] user_data user data passed to ail_filtet_list_appinfo_foreach()
+ *
+ * @return 0 if success, negative value(<0) if fail\n
+ * @retval AIL_CB_RET_CONTINUE return if you continue iteration
+ * @retval AIL_CB_RET_CANCEL return if you cancel iteration
+ *
+ * @see ail_filter_list_appinfo_foreach()
+ */
+typedef ail_cb_ret_e (*ail_list_appinfo_cb) (const ail_appinfo_h appinfo_h, void *user_data);
+
+/**
+ * @fn ail_error_e ail_error_e ail_filter_list_appinfo_foreach(ail_filter_h filter, ail_list_appinfo_cb func, void *user_data)
+ *
+ * @brief Calls the callback function for each app filtered by given filter. If the filter is not given (i.e filter handle is NULL), it is invoked for all apps.
+ *
+ * @par Sync (or) Async : Synchronous API
+ *
+ * @param[in] filter a filter handle
+ * @param[in] func the function to call with each app's appinfo
+ * @param[in] user_data user_data to pass to the function
+ *
+ * @return 0 if success, negative value(<0) if fail\n
+ * @retval AIL_ERROR_OK success
+ * @retval AIL_ERROR_DB_FAILED database error
+ * @retval AIL_ERROR_INVALID_PARAMETER invalid parameter
+ *
+ * @see ail_list_appinfo_cb
+ * @see ail_filter_add_bool()
+ * @see ail_filter_add_int()
+ * @see ail_filter_add_str()
+ *
+ * @par Prospective Clients:
+ * External Apps.
+ *
+ * @code
+
+ail_cb_ret_e appinfo_func(const ail_appinfo_h appinfo, void *user_data)
+{
+ int *i = (int *)user_data;
+ char *appid;
+
+ ail_appinfo_get_str(appinfo, AIL_PROP_PACKAGE_STR, &appid);
+ printf("i=%d %s\n", (*i)++, appid);
+
+ if (*i > 30)
+ return AIL_CB_RET_CANCEL;
+
+ return AIL_CB_RET_CONTINUE;
+}
+
+int list_apps()
+{
+ ail_filter_h filter;
+ ail_error_e ret;
+ int i=0;
+
+ ret = ail_filter_new(&filter);
+ if (ret != AIL_ERROR_OK) {
+ return -1;
+ }
+
+ ret = ail_filter_add_bool(filter, AIL_PROP_X_SLP_REMOVABLE_BOOL, true);
+ if (ret != AIL_ERROR_OK) {
+ return -1;
+ }
+
+ ret = ail_filter_add_str(filter, AIL_PROP_TYPE_STR, "Application");
+ if (ret != AIL_ERROR_OK) {
+ return -1;
+ }
+
+ printf("List apps which are removable and 'Application' typed\n");
+ ail_filter_list_appinfo_foreach(filter, appinfo_func, (void *)&i);
+
+ ail_filter_destroy(filter);
+
+ return 0;
+}
+ * @endcode
+ */
+ail_error_e ail_filter_list_appinfo_foreach(ail_filter_h filter,
+ ail_list_appinfo_cb appinfo_func,
+ void *user_data);
+
+
+
+/**
+ * @fn ail_error_e ail_error_e ail_filter_count_appinfo(ail_filter_h filter, int *count)
+ *
+ * @brief Gets the number of app which is filtered by the given filter. If the filter is not given (i.e filter handle is NULL), all app are counted.
+ *
+ * @par Sync (or) Async : Synchronous API
+ *
+ * @param[in] filter a filter handle
+ * @param[in] count the number of appinfo which is filtered
+ *
+ * @return 0 if success, negative value(<0) if fail\n
+ * @retval AIL_ERROR_OK success
+ * @retval AIL_ERROR_INVALID_PARAMETER invalid parameter
+ * @retval AIL_ERROR_OUT_OF_MEMORY out of memory
+ *
+ * @pre None
+ * @post None
+ *
+ * @see ail_filter_new()
+ * @see ail_filter_add_bool()
+ * @see ail_filter_add_int()
+ * @see ail_filter_add_str()
+ *
+ * @par Prospective Clients:
+ * External Apps.
+ *
+ * @code
+int count_apps()
+{
+ ail_filter_h filter;
+ ail_error_e ret;
+ int n;
+
+ ret = ail_filter_new(&filter);
+ if (ret != AIL_ERROR_OK) {
+ return -1;
+ }
+
+ ret = ail_filter_add_bool(filter, AIL_PROP_NODISPLAY_BOOL, true);
+ if (ret != AIL_ERROR_OK) {
+ return -1;
+ }
+
+ ret = ail_filter_count_appinfo(filter, &n);
+ if (ret != AIL_ERROR_OK) {
+ return -1;
+ }
+
+ printf("N of app not to be displayed = %d", n);
+
+ ret = ail_filter_count_appinfo(NULL, &n);
+ if (ret != AIL_ERROR_OK) {
+ return -1;
+ }
+
+ printf("N of all app = %d\n", n);
+
+ return n;
+}
+ * @endcode
+ */
+ail_error_e ail_filter_count_appinfo(ail_filter_h filter, int *count);
+
+
+
+/**
+ * @fn ail_error_e ail_package_get_appinfo(const char *package, ail_appinfo_h *handle)
+ *
+ * @brief get an application information related to a package.
+ This API just retrieves all the information of the package from Application Information Database.
+ All data related to the package are loaded in the memory after calling this function.
+ If you want to read a value from the retrieving data, you have to use the functions of ail_appinfo_get_xxx.
+
+ * @par Sync (or) Async : Synchronous API.
+ *
+ * @param[in] package package name what you want to know about.
+ * @param[out] handle handle will be used with the functions of ail_appinfo_get_xxx. If no data, it will be NULL.
+ *
+ * @return 0 if success, negative value(<0) if fail\n
+ * @retval AIL_ERROR_OK success
+ * @retval AIL_ERROR_FAIL internal error
+ * @retval AIL_ERROR_DB_FAILED database error
+ * @retval AIL_ERROR_INVALID_PARAMETER invalid parameter
+ * @retval AIL_ERROR_NO_DATA no data. cannot find the package.
+ *
+ * @pre declare a handle before calling this function. The handle is used as a second argument of this API.
+ * @post destroy the handle with the function of ail_package_destroy_appinfo after using it all.
+ *
+ * @see ail_package_destroy_appinfo(), ail_appinfo_get_bool(), ail_appinfo_get_int(), ail_appinfo_get_str()
+ *
+ * @par Prospective Clients:
+ * External Apps.
+ *
+ * @code
+static ail_error_e _get_name(const char *package)
+{
+ ail_appinfo_h handle;
+ ail_error_e ret;
+ char *str;
+
+ ret = ail_package_get_appinfo(package, &handle);
+ if (ret != AIL_ERROR_OK) {
+ return AIL_ERROR_FAIL;
+ }
+
+ ret = ail_appinfo_get_str(handle, AIL_PROP_NAME_STR, &str);
+ if (ret != AIL_ERROR_OK) {
+ return AIL_ERROR_FAIL;
+ }
+ fprintf(stderr, "Package[%s], Property[%s] : %s\n", package, property, str);
+
+ ret = ail_package_destroy_appinfo(handle);
+ if (ret != AIL_ERROR_OK) {
+ return AIL_ERROR_FAIL;
+ }
+
+ return AIL_ERROR_OK;
+}
+ * @endcode
+ */
+ail_error_e ail_package_get_appinfo(const char *package, ail_appinfo_h *handle) __attribute__((deprecated));
+
+
+/**
+ * @fn ail_error_e ail_get_appinfo(const char *appid, ail_appinfo_h *handle)
+ *
+ * @brief get an application information related to a appid.
+ This API just retrieves all the information of the application from Application Information Database.
+ All data related to the appid are loaded in the memory after calling this function.
+ If you want to read a value from the retrieving data, you have to use the functions of ail_appinfo_get_xxx.
+
+ * @par Sync (or) Async : Synchronous API.
+ *
+ * @param[in] appid appid what you want to know about.
+ * @param[out] handle handle will be used with the functions of ail_appinfo_get_xxx. If no data, it will be NULL.
+ *
+ * @return 0 if success, negative value(<0) if fail\n
+ * @retval AIL_ERROR_OK success
+ * @retval AIL_ERROR_FAIL internal error
+ * @retval AIL_ERROR_DB_FAILED database error
+ * @retval AIL_ERROR_INVALID_PARAMETER invalid parameter
+ * @retval AIL_ERROR_NO_DATA no data. cannot find the app.
+ *
+ * @pre declare a handle before calling this function. The handle is used as a second argument of this API.
+ * @post destroy the handle with the function of ail_get_appinfo after using it all.
+ *
+ * @see ail_get_appinfo(), ail_appinfo_get_bool(), ail_appinfo_get_int(), ail_appinfo_get_str()
+ *
+ * @par Prospective Clients:
+ * External Apps.
+ *
+ * @code
+static ail_error_e _get_name(const char *appid)
+{
+ ail_appinfo_h handle;
+ ail_error_e ret;
+ char *str;
+
+ ret = ail_get_appinfo(appid, &handle);
+ if (ret != AIL_ERROR_OK) {
+ return AIL_ERROR_FAIL;
+ }
+
+ ret = ail_appinfo_get_str(handle, AIL_PROP_NAME_STR, &str);
+ if (ret != AIL_ERROR_OK) {
+ return AIL_ERROR_FAIL;
+ }
+ fprintf(stderr, "Package[%s], Property[%s] : %s\n", appid, property, str);
+
+ ret = ail_destroy_appinfo(handle);
+ if (ret != AIL_ERROR_OK) {
+ return AIL_ERROR_FAIL;
+ }
+
+ return AIL_ERROR_OK;
+}
+ * @endcode
+ */
+ail_error_e ail_get_appinfo(const char *appid, ail_appinfo_h *handle);
+
+
+/**
+ * @fn ail_error_e ail_appinfo_get_bool(const ail_appinfo_h handle, const char *property, bool *value)
+ *
+ * @brief get a boolean value related to the property.
+ Before using this API, the handle is defined by calling ail_get_appinfo.
+ This function needs a out-parameter for the value.
+ *
+ * @par Sync (or) Async : Synchronous API.
+ *
+ * @param[in] handle the handle is defined by calling ail_get_appinfo.
+ * @param[in] property a property type of boolean
+ * @param[out] value a out-parameter value that is mapped with the property.
+ *
+ * @return 0 if success, negative value(<0) if fail\n
+ * @retval AIL_ERROR_OK success
+ * @retval AIL_ERROR_DB_FAILED database error
+ * @retval AIL_ERROR_INVALID_PARAMETER invalid parameter
+ *
+ * @pre define a handle using ail_get_appinfo. The handle is used as a first argument of this API.
+ * @post destroy the handle with the function of ail_destroy_appinfo after using it all.
+ *
+ * @see ail_get_appinfo(), ail_destroy_appinfo(), ail_appinfo_get_int(), ail_appinfo_get_str()
+ *
+ * @par Prospective Clients:
+ * External Apps.
+ *
+ * @code
+static ail_error_e _get_nodisplay(const char *appid)
+{
+ ail_appinfo_h handle;
+ ail_error_e ret;
+ bool value;
+
+ ret = ail_get_appinfo(appid, &handle);
+ if (ret != AIL_ERROR_OK) {
+ return AIL_ERROR_FAIL;
+ }
+
+ ret = ail_appinfo_get_bool(handle, AIL_PROP_NODISPLAY_BOOL, &value);
+ if (ret != AIL_ERROR_OK) {
+ return AIL_ERROR_FAIL;
+ }
+ fprintf(stderr, "appid[%s] : %d\n", appid, value);
+
+ ret = ail_destroy_appinfo(handle);
+ if (ret != AIL_ERROR_OK) {
+ return AIL_ERROR_FAIL;
+ }
+
+ return AIL_ERROR_OK;
+}
+ * @endcode
+ */
+ail_error_e ail_appinfo_get_bool(const ail_appinfo_h handle, const char *property, bool *value);
+
+
+
+/**
+ * @fn ail_error_e ail_appinfo_get_int(const ail_appinfo_h handle, const char *property, int *value)
+ *
+ * @brief get a integer value related to the property.
+ Before using this API, the handle is defined by calling ail_get_appinfo.
+ This function needs a out-parameter for the value.
+ *
+ * @par Sync (or) Async : Synchronous API.
+ *
+ * @param[in] handle the handle is defined by calling ail_get_appinfo.
+ * @param[in] property a property type of integer.
+ * @param[out] value a out-parameter value that is mapped with the property.
+ *
+ * @return 0 if success, negative value(<0) if fail\n
+ * @retval AIL_ERROR_OK success
+ * @retval AIL_ERROR_DB_FAILED database error
+ * @retval AIL_ERROR_INVALID_PARAMETER invalid parameter
+ *
+ * @pre define a handle using ail_get_appinfo. The handle is used as a first argument of this API.
+ * @post destroy the handle with the function of ail_destroy_appinfo after using it all.
+ *
+ * @see ail_get_appinfo(), ail_destroy_appinfo(), ail_appinfo_get_bool(), ail_appinfo_get_str()
+ *
+ * @par Prospective Clients:
+ * External Apps.
+ *
+ * @code
+static ail_error_e _get_x_slp_baselayoutwidth(const char *appid)
+{
+ ail_appinfo_h handle;
+ ail_error_e ret;
+ int value;
+
+ ret = ail_get_appinfo(appid, &handle);
+ if (ret != AIL_ERROR_OK) {
+ return AIL_ERROR_FAIL;
+ }
+
+ ret = ail_appinfo_get_int(handle, AIL_PROP_X_SLP_BASELAYOUTWIDTH_INT, &value);
+ if (ret != AIL_ERROR_OK) {
+ return AIL_ERROR_FAIL;
+ }
+ fprintf(stderr, "Package[%s] : %d\n", appid, value);
+
+ ret = ail_destroy_appinfo(handle);
+ if (ret != AIL_ERROR_OK) {
+ return AIL_ERROR_FAIL;
+ }
+
+ return AIL_ERROR_OK;
+}
+ * @endcode
+ */
+ail_error_e ail_appinfo_get_int(const ail_appinfo_h handle, const char *property, int *value);
+
+
+
+/**
+ * @fn ail_error_e ail_appinfo_get_str(const ail_appinfo_h handle, const char *property, char **str)
+ *
+ * @brief get a string related to the property.
+ Before using this API, the handle is defined by calling ail_get_appinfo.
+ This function needs a out-parameter for the value.
+ *
+ * @par Sync (or) Async : Synchronous API.
+ *
+ * @param[in] handle the handle is defined by calling ail_get_appinfo.
+ * @param[in] property a property type of string.
+ * @param[out] str a out-parameter string that is mapped with the property. The icon property contains the absolute file path. If there is no data, the value of str is NULL.
+ *
+ * @return 0 if success, negative value(<0) if fail\n
+ * @retval AIL_ERROR_OK success
+ * @retval AIL_ERROR_DB_FAILED database error
+ * @retval AIL_ERROR_INVALID_PARAMETER invalid parameter
+ *
+ * @pre define a handle using ail_get_appinfo. The handle is used as a first argument of this API.
+ * @post str doesn't need to be freed. It will be freed by calling ail_destroy_appinfo.
+ *
+ * @see ail_get_appinfo(), ail_destroy_appinfo(), ail_appinfo_get_bool(), ail_appinfo_get_int()
+ *
+ * @par Prospective Clients:
+ * External Apps.
+ *
+ * @code
+static ail_error_e _get_nodisplay(const char *appid)
+{
+ ail_appinfo_h handle;
+ ail_error_e ret;
+ char* value;
+
+ ret = ail_get_appinfo(appid, &handle);
+ if (ret != AIL_ERROR_OK) {
+ return AIL_ERROR_FAIL;
+ }
+
+ ret = ail_appinfo_get_str(handle, AIL_PROP_NAME_STR, &value);
+ if (ret != AIL_ERROR_OK) {
+ return AIL_ERROR_FAIL;
+ }
+ fprintf(stderr, "Package[%s] : %d\n", appid, value);
+
+ ret = ail_destroy_appinfo(handle);
+ if (ret != AIL_ERROR_OK) {
+ return AIL_ERROR_FAIL;
+ }
+
+ return AIL_ERROR_OK;
+}
+ * @endcode
+ */
+ail_error_e ail_appinfo_get_str(const ail_appinfo_h handle, const char *property, char **str);
+
+
+
+/**
+ * @fn ail_error_e ail_package_destroy_appinfo(const ail_appinfo_h handle)
+ *
+ * @brief destroy a handle what you get with the function of ail_package_get_appinfo.
+ *
+ * @par Sync (or) Async : Synchronous API.
+ *
+ * @param[in] handle destroy all resources related to the handle.
+ *
+ * @return 0 if success, negative value(<0) if fail\n
+ * @retval AIL_ERROR_OK success
+ * @retval AIL_ERROR_DB_FAILED database error
+ * @retval AIL_ERROR_INVALID_PARAMETER invalid parameter
+ *
+ * @pre need a handle that you don't need anymore.
+ * @post cannot use the handle after destroying.
+ *
+ * @see ail_package_get_appinfo(), ail_appinfo_get_bool(), ail_appinfo_get_int(), ail_appinfo_get_str()
+ *
+ * @par Prospective Clients:
+ * External Apps.
+ *
+ * @code
+static ail_error_e _get_name(const char *package)
+{
+ ail_appinfo_h handle;
+ ail_error_e ret;
+ char *str;
+
+ ret = ail_package_get_appinfo(package, &handle);
+ if (ret != AIL_ERROR_OK) {
+ return AIL_ERROR_FAIL;
+ }
+
+ ret = ail_appinfo_get_str(handle, AIL_PROP_NAME_STR, &str);
+ if (ret != AIL_ERROR_OK) {
+ return AIL_ERROR_FAIL;
+ }
+ fprintf(stderr, "Package[%s], Property[%s] : %s\n", package, property, str);
+
+ ret = ail_package_destroy_appinfo(handle);
+ if (ret != AIL_ERROR_OK) {
+ return AIL_ERROR_FAIL;
+ }
+
+ return AIL_ERROR_OK;
+}
+ * @endcode
+ */
+ail_error_e ail_package_destroy_appinfo(const ail_appinfo_h handle) __attribute__((deprecated));
+
+
+/**
+ * @fn ail_error_e ail_destroy_appinfo(const ail_appinfo_h handle)
+ *
+ * @brief destroy a handle what you get with the function of ail_get_appinfo.
+ *
+ * @par Sync (or) Async : Synchronous API.
+ *
+ * @param[in] handle destroy all resources related to the handle.
+ *
+ * @return 0 if success, negative value(<0) if fail\n
+ * @retval AIL_ERROR_OK success
+ * @retval AIL_ERROR_DB_FAILED database error
+ * @retval AIL_ERROR_INVALID_PARAMETER invalid parameter
+ *
+ * @pre need a handle that you don't need anymore.
+ * @post cannot use the handle after destroying.
+ *
+ * @see ail_get_appinfo(), ail_appinfo_get_bool(), ail_appinfo_get_int(), ail_appinfo_get_str()
+ *
+ * @par Prospective Clients:
+ * External Apps.
+ *
+ * @code
+static ail_error_e _get_name(const char *appid)
+{
+ ail_appinfo_h handle;
+ ail_error_e ret;
+ char *str;
+
+ ret = ail_get_appinfo(appid, &handle);
+ if (ret != AIL_ERROR_OK) {
+ return AIL_ERROR_FAIL;
+ }
+
+ ret = ail_appinfo_get_str(handle, AIL_PROP_NAME_STR, &str);
+ if (ret != AIL_ERROR_OK) {
+ return AIL_ERROR_FAIL;
+ }
+ fprintf(stderr, "Package[%s], Property[%s] : %s\n", appid, property, str);
+
+ ret = ail_destroy_appinfo(handle);
+ if (ret != AIL_ERROR_OK) {
+ return AIL_ERROR_FAIL;
+ }
+
+ return AIL_ERROR_OK;
+}
+ * @endcode
+ */
+ail_error_e ail_destroy_appinfo(const ail_appinfo_h handle);
+
+
+/**
+ * @fn ail_error_e ail_desktop_add(const char *appid)
+ *
+ * @brief add a app information into Application Information Database.
+ A desktop file for this app has to be installed in the desktop directory before using this API.
+ If there is no database for Application Information Database, this API will create the DB.
+ If there is a DB, this function adds information for the app into the DB.
+ And a notification is published to the applications who want to know about changing DB.
+ *
+ * @par Sync (or) Async : Synchronous API.
+ *
+ * @param[in] appid
+ *
+ * @return 0 if success, negative value(<0) if fail\n
+ * @retval AIL_ERROR_OK success
+ * @retval AIL_ERROR_FAIL internal error
+ * @retval AIL_ERROR_INVALID_PARAMETER invalid parameter
+ *
+ * @pre a desktop file for the app has to be installed in the desktop directory before using this API.
+ * @post app information is added into the Application Information Database.
+ *
+ * @see ail_desktop_update(), ail_desktop_remove()
+ *
+ * @par Prospective Clients:
+ * External Apps.
+ *
+ * @code
+static ail_error_e _add_desktop(const char *appid)
+{
+ ail_error_e ret;
+
+ if (!appid) {
+ return AIL_ERROR_FAIL;
+ }
+
+ ret = ail_desktop_add(appid);
+ if (ret != AIL_ERROR_OK) {
+ return AIL_ERROR_FAIL;
+ }
+
+ return AIL_ERROR_OK;
+}
+ * @endcode
+ */
+ail_error_e ail_desktop_add(const char *appid);
+
+
+
+/**
+ * @fn ail_error_e ail_desktop_update(const char *appid)
+ *
+ * @brief update a app information in the Application Information Database.
+ A desktop file for this app has to be installed in the desktop directory before using this API.
+ And a notification is published to the applications who want to know about changing DB.
+ *
+ * @par Sync (or) Async : Synchronous API.
+ *
+ * @param[in] appid
+ *
+ * @return 0 if success, negative value(<0) if fail\n
+ * @retval AIL_ERROR_OK success
+ * @retval AIL_ERROR_FAIL internal error
+ * @retval AIL_ERROR_INVALID_PARAMETER invalid parameter
+ *
+ * @pre a desktop file for the app has to be installed in the desktop directory before using this API.
+ * @post update a app information in the Application Information Database.
+ *
+ * @see ail_desktop_add(), ail_desktop_remove()
+ *
+ * @par Prospective Clients:
+ * External Apps.
+ *
+ * @code
+static ail_error_e _update_desktop(const char *appid)
+{
+ ail_error_e ret;
+
+ if (!appid) {
+ return AIL_ERROR_FAIL;
+ }
+
+ ret = ail_desktop_update(appid);
+ if (ret != AIL_ERROR_OK) {
+ return AIL_ERROR_FAIL;
+ }
+
+ return AIL_ERROR_OK;
+}
+ * @endcode
+ */
+ail_error_e ail_desktop_update(const char *appid);
+
+
+
+/**
+ * @fn ail_error_e ail_desktop_remove(const char *appid)
+ *
+ * @brief remove a app information in the Application Information Database.
+ And a notification is published to the applications who want to know about changing DB.
+ *
+ * @par Sync (or) Async : Synchronous API.
+ *
+ * @param[in] appid
+ *
+ * @return 0 if success, negative value(<0) if fail\n
+ * @retval AIL_ERROR_OK success
+ * @retval AIL_ERROR_FAIL internal error
+ * @retval AIL_ERROR_INVALID_PARAMETER invalid parameter
+ *
+ * @pre no pre-condition.
+ * @post app information is removed in the Application Information Database.
+ *
+ * @see ail_desktop_add(), ail_desktop_update()
+ *
+ * @par Prospective Clients:
+ * External Apps.
+ *
+ * @code
+static ail_error_e _remove_desktop(const char *appid)
+{
+ ail_error_e ret;
+
+ if (!appid) {
+ return AIL_ERROR_FAIL;
+ }
+
+ ret = ail_desktop_remove(appid);
+ if (ret != AIL_ERROR_OK) {
+ return AIL_ERROR_FAIL;
+ }
+
+ return AIL_ERROR_OK;
+}
+ * @endcode
+ */
+ail_error_e ail_desktop_remove(const char *appid);
+
+/** @} */
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __AIL_H__ */
+// End of a file
diff --git a/initdb/CMakeLists.txt b/initdb/CMakeLists.txt
new file mode 100755
index 0000000..73474d8
--- /dev/null
+++ b/initdb/CMakeLists.txt
@@ -0,0 +1,17 @@
+#AIL init DB build script
+
+SET(INITDB ail_initdb)
+SET(SRCS src/initdb.c)
+
+pkg_check_modules(INITDB_PKGS REQUIRED vconf dlog db-util sqlite3)
+INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include)
+INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src)
+
+STRING(REPLACE ";" " " EXTRA_CFLAGS "${INITDB_PKGS_CFLAGS}")
+
+ADD_EXECUTABLE(${INITDB} ${SRCS})
+TARGET_LINK_LIBRARIES(${INITDB} ${LIBNAME} ${INITDB_PKGS_LIBRARIES})
+SET_TARGET_PROPERTIES(${INITDB} PROPERTIES COMPILE_FLAGS "${EXTRA_CFLAGS}")
+SET_TARGET_PROPERTIES(${INITDB} PROPERTIES SKIP_BUILD_RPATH true)
+
+INSTALL(TARGETS ${INITDB} DESTINATION ${BINDIR})
diff --git a/initdb/src/initdb.c b/initdb/src/initdb.c
new file mode 100755
index 0000000..160d08b
--- /dev/null
+++ b/initdb/src/initdb.c
@@ -0,0 +1,245 @@
+/*
+ * ail
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>, Jaeho Lee <jaeho81.lee@samsung.com>
+ *
+ * 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 <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <dirent.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <errno.h>
+
+#include "ail.h"
+#include "ail_private.h"
+
+#define OWNER_ROOT 0
+#define GROUP_MENU 6010
+#define BUFSZE 1024
+#define OPT_DESKTOP_DIRECTORY "/opt/share/applications"
+#define USR_DESKTOP_DIRECTORY "/usr/share/applications"
+#define APP_INFO_DB_FILE "/opt/dbspace/.app_info.db"
+
+#ifdef _E
+#undef _E
+#endif
+#define _E(fmt, arg...) fprintf(stderr, "[AIL_INITDB][E][%s,%d] "fmt"\n", __FUNCTION__, __LINE__, ##arg);
+
+#ifdef _D
+#undef _D
+#endif
+#define _D(fmt, arg...) fprintf(stderr, "[AIL_INITDB][D][%s,%d] "fmt"\n", __FUNCTION__, __LINE__, ##arg);
+
+static int initdb_count_app(void)
+{
+ ail_filter_h filter;
+ ail_error_e ret;
+ int total = 0;
+
+ ret = ail_filter_new(&filter);
+ if (ret != AIL_ERROR_OK) {
+ return -1;
+ }
+
+ ret = ail_filter_add_bool(filter, AIL_PROP_NODISPLAY_BOOL, false);
+ if (ret != AIL_ERROR_OK) {
+ ail_filter_destroy(filter);
+ return -1;
+ }
+
+ ret = ail_filter_count_appinfo(filter, &total);
+ if (ret != AIL_ERROR_OK) {
+ ail_filter_destroy(filter);
+ return -1;
+ }
+
+ ail_filter_destroy(filter);
+
+ return total;
+}
+
+
+
+char* _desktop_to_package(const char* desktop)
+{
+ char *package, *tmp;
+
+ retv_if(!desktop, NULL);
+
+ package = strdup(desktop);
+ retv_if(!package, NULL);
+
+ tmp = strrchr(package, '.');
+ if(tmp == NULL) {
+ _E("(tmp == NULL) return\n");
+ free(package);
+ return NULL;
+ }
+
+ if (strcmp(tmp, ".desktop")) {
+ _E("%s is not a desktop file", desktop);
+ free(package);
+ return NULL;
+ }
+
+ *tmp = '\0';
+
+ return package;
+}
+
+
+
+int initdb_load_directory(const char *directory)
+{
+ DIR *dir;
+ struct dirent entry, *result;
+ int len, ret;
+ char buf[BUFSZE];
+
+ // desktop file
+ dir = opendir(directory);
+ if (!dir) {
+ if (strerror_r(errno, buf, sizeof(buf)) == 0)
+ _E("Failed to access the [%s] because %s\n", directory, buf);
+ return AIL_ERROR_FAIL;
+ }
+
+ len = strlen(directory) + 1;
+ _D("Loading desktop files from %s\n", directory);
+
+ for (ret = readdir_r(dir, &entry, &result);
+ ret == 0 && result != NULL;
+ ret = readdir_r(dir, &entry, &result)) {
+ char *package;
+
+ if (entry.d_name[0] == '.') continue;
+
+ package = _desktop_to_package(entry.d_name);
+ if (!package) {
+ _E("Failed to convert file to package[%s]\n", entry.d_name);
+ continue;
+ }
+
+ if (ail_desktop_add(package) != AIL_ERROR_OK) {
+ _E("Failed to add a package[%s]\n", package);
+ }
+
+ free(package);
+ }
+
+ closedir(dir);
+
+ return AIL_ERROR_OK;
+}
+
+
+
+static int initdb_change_perm(const char *db_file)
+{
+ char buf[BUFSZE];
+ char journal_file[BUFSZE];
+ char *files[3];
+ int ret, i;
+
+ files[0] = (char *)db_file;
+ files[1] = journal_file;
+ files[2] = NULL;
+
+ retv_if(!db_file, AIL_ERROR_FAIL);
+
+ snprintf(journal_file, sizeof(journal_file), "%s%s", db_file, "-journal");
+
+ for (i = 0; files[i]; i++) {
+ ret = chown(files[i], OWNER_ROOT, GROUP_MENU);
+ if (ret == -1) {
+ strerror_r(errno, buf, sizeof(buf));
+ _E("FAIL : chown %s %d.%d, because %s", db_file, OWNER_ROOT, GROUP_MENU, buf);
+ return AIL_ERROR_FAIL;
+ }
+
+ ret = chmod(files[i], S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+ if (ret == -1) {
+ strerror_r(errno, buf, sizeof(buf));
+ _E("FAIL : chmod %s 0664, because %s", db_file, buf);
+ return AIL_ERROR_FAIL;
+ }
+ }
+
+ return AIL_ERROR_OK;
+}
+
+
+static int __is_authorized()
+{
+ /* ail_init db should be called by as root privilege. */
+
+ uid_t uid = getuid();
+ if ((uid_t) 0 == uid)
+ return 1;
+ else
+ return 0;
+}
+
+
+int main(int argc, char *argv[])
+{
+ int ret;
+
+ if (!__is_authorized()) {
+ fprintf(stderr, "You are not an authorized user!\n");
+ _D("You are not an authorized user!\n");
+ return AIL_ERROR_FAIL;
+ }
+
+ ret = setenv("AIL_INITDB", "1", 1);
+ _D("AIL_INITDB : %d", ret);
+
+ ret = initdb_count_app();
+ if (ret > 0) {
+ _D("Some Apps in the App Info DB.");
+ return AIL_ERROR_OK;
+ }
+
+ ret = initdb_load_directory(OPT_DESKTOP_DIRECTORY);
+ if (ret == AIL_ERROR_FAIL) {
+ _E("cannot load opt desktop directory.");
+ return AIL_ERROR_FAIL;
+ }
+
+ ret = initdb_load_directory(USR_DESKTOP_DIRECTORY);
+ if (ret == AIL_ERROR_FAIL) {
+ _E("cannot load usr desktop directory.");
+ return AIL_ERROR_FAIL;
+ }
+
+ ret = initdb_change_perm(APP_INFO_DB_FILE);
+ if (ret == AIL_ERROR_FAIL) {
+ _E("cannot chown.");
+ return AIL_ERROR_FAIL;
+ }
+
+ return AIL_ERROR_OK;
+}
+
+
+
+// END
diff --git a/packaging/ail.spec b/packaging/ail.spec
new file mode 100755
index 0000000..7dbf370
--- /dev/null
+++ b/packaging/ail.spec
@@ -0,0 +1,81 @@
+#sbs-git:slp/pkgs/a/ail ail 0.2.22 29ac1f2c98453cad647cca6a92abc7da3dbb047b
+Name: ail
+Summary: Application Information Library
+Version: 0.2.55
+Release: 1
+Group: System/Libraries
+License: Apache License, Version 2.0
+Source0: %{name}-%{version}.tar.gz
+Requires(post): /sbin/ldconfig
+Requires(postun): /sbin/ldconfig
+BuildRequires: cmake
+BuildRequires: vconf-keys-devel
+BuildRequires: pkgconfig(sqlite3)
+BuildRequires: pkgconfig(dlog)
+BuildRequires: pkgconfig(vconf)
+BuildRequires: pkgconfig(db-util)
+BuildRequires: pkgconfig(xdgmime)
+
+
+%description
+Application Information Library
+
+%package devel
+Summary: Application Information Library Development files
+Group: Development/Libraries
+Requires: %{name} = %{version}-%{release}
+
+%description devel
+Application Information Library (devel)
+
+%prep
+%setup -q
+
+%build
+CFLAGS+=" -fpic"
+cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} -DBUILD_PKGTYPE=rpm
+
+make %{?jobs:-j%jobs}
+
+%install
+rm -rf %{buildroot}
+%make_install
+
+%post
+
+CHDBGID="6010"
+
+update_DAC_for_db_file()
+{
+ if [ ! -f $@ ]; then
+ touch $@
+ fi
+
+ chown :$CHDBGID $@ 2>/dev/null
+ if [ $? -ne 0 ]; then
+ echo "Failed to change the owner of $@"
+ fi
+ chmod 664 $@ 2>/dev/null
+ if [ $? -ne 0 ]; then
+ echo "Failed to change the perms of $@"
+ fi
+}
+mkdir -p /opt/dbspace/
+ail_initdb
+update_DAC_for_db_file /opt/dbspace/.app_info.db
+update_DAC_for_db_file /opt/dbspace/.app_info.db-journal
+chsmack -a 'ail::db' /opt/dbspace/.app_info.db*
+
+%postun
+
+%files
+%manifest ail.manifest
+/usr/lib/libail.so.0
+/usr/lib/libail.so.0.1.0
+/usr/bin/ail_initdb
+/usr/share/install-info/*
+
+%files devel
+/usr/include/ail.h
+/usr/lib/libail.so
+/usr/lib/pkgconfig/ail.pc
diff --git a/src/ail_convert.c b/src/ail_convert.c
new file mode 100755
index 0000000..08f63e7
--- /dev/null
+++ b/src/ail_convert.c
@@ -0,0 +1,135 @@
+/*
+ * ail
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>, Jaeho Lee <jaeho81.lee@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include "ail.h"
+#include "ail_private.h"
+#include "ail_convert.h"
+
+
+struct _ail_str_map_t {
+ ail_prop_str_e prop;
+ const char *property;
+};
+
+static struct _ail_str_map_t str_prop_map[] = {
+ {E_AIL_PROP_PACKAGE_STR, AIL_PROP_PACKAGE_STR},
+ {E_AIL_PROP_EXEC_STR, AIL_PROP_EXEC_STR},
+ {E_AIL_PROP_NAME_STR, AIL_PROP_NAME_STR},
+ {E_AIL_PROP_TYPE_STR, AIL_PROP_TYPE_STR},
+ {E_AIL_PROP_ICON_STR, AIL_PROP_ICON_STR},
+ {E_AIL_PROP_CATEGORIES_STR, AIL_PROP_CATEGORIES_STR},
+ {E_AIL_PROP_VERSION_STR, AIL_PROP_VERSION_STR},
+ {E_AIL_PROP_MIMETYPE_STR, AIL_PROP_MIMETYPE_STR},
+ {E_AIL_PROP_X_SLP_SERVICE_STR, AIL_PROP_X_SLP_SERVICE_STR},
+ {E_AIL_PROP_X_SLP_PACKAGETYPE_STR, AIL_PROP_X_SLP_PACKAGETYPE_STR},
+ {E_AIL_PROP_X_SLP_PACKAGECATEGORIES_STR, AIL_PROP_X_SLP_PACKAGECATEGORIES_STR},
+ {E_AIL_PROP_X_SLP_PACKAGEID_STR, AIL_PROP_X_SLP_PACKAGEID_STR},
+/* {E_AIL_PROP_X_SLP_URI_STR, AIL_PROP_X_SLP_URI_STR}, */
+ {E_AIL_PROP_X_SLP_SVC_STR, AIL_PROP_X_SLP_SVC_STR},
+ {E_AIL_PROP_X_SLP_EXE_PATH, AIL_PROP_X_SLP_EXE_PATH},
+ {E_AIL_PROP_X_SLP_APPID_STR, AIL_PROP_X_SLP_APPID_STR},
+ {E_AIL_PROP_X_SLP_PKGID_STR, AIL_PROP_X_SLP_PKGID_STR},
+ {E_AIL_PROP_X_SLP_DOMAIN_STR, AIL_PROP_X_SLP_DOMAIN_STR}
+};
+
+
+struct _ail_int_map_t {
+ ail_prop_int_e prop;
+ const char *property;
+};
+
+static struct _ail_int_map_t int_prop_map[] = {
+ {E_AIL_PROP_X_SLP_TEMP_INT, AIL_PROP_X_SLP_TEMP_INT},
+ {E_AIL_PROP_X_SLP_INSTALLEDTIME_INT, AIL_PROP_X_SLP_INSTALLEDTIME_INT}
+};
+
+
+struct _ail_bool_map_t {
+ ail_prop_bool_e prop;
+ const char *property;
+};
+
+static struct _ail_bool_map_t bool_prop_map[] = {
+ {E_AIL_PROP_NODISPLAY_BOOL, AIL_PROP_NODISPLAY_BOOL},
+ {E_AIL_PROP_X_SLP_TASKMANAGE_BOOL, AIL_PROP_X_SLP_TASKMANAGE_BOOL},
+ {E_AIL_PROP_X_SLP_MULTIPLE_BOOL, AIL_PROP_X_SLP_MULTIPLE_BOOL},
+ {E_AIL_PROP_X_SLP_REMOVABLE_BOOL, AIL_PROP_X_SLP_REMOVABLE_BOOL},
+/* {E_AIL_PROP_X_SLP_ISHORIZONTALSCALE_BOOL, AIL_PROP_X_SLP_ISHORIZONTALSCALE_BOOL}, */
+ {E_AIL_PROP_X_SLP_INACTIVATED_BOOL, AIL_PROP_X_SLP_INACTIVATED_BOOL}
+};
+
+
+inline ail_prop_str_e _ail_convert_to_prop_str(const char *property)
+{
+ int i = 0;
+ ail_prop_str_e prop = -1;
+
+ retv_if(!property, AIL_ERROR_INVALID_PARAMETER);
+
+ for (i=0 ; i<(E_AIL_PROP_STR_MAX - E_AIL_PROP_STR_MIN + 1) ; i++) {
+ if (strcmp(property, str_prop_map[i].property) == 0) {
+ prop = str_prop_map[i].prop;
+ break;
+ }
+ }
+
+ return prop;
+}
+
+inline ail_prop_int_e _ail_convert_to_prop_int(const char *property)
+{
+ int i = 0;
+ ail_prop_int_e prop = -1;
+
+ retv_if(!property, AIL_ERROR_INVALID_PARAMETER);
+
+ for (i=0 ; i<(E_AIL_PROP_INT_MAX - E_AIL_PROP_INT_MIN + 1) ; i++) {
+ if (strcmp(property, int_prop_map[i].property) == 0) {
+ prop = int_prop_map[i].prop;
+ break;
+ }
+ }
+
+ return prop;
+}
+
+inline ail_prop_bool_e _ail_convert_to_prop_bool(const char *property)
+{
+ int i = 0;
+ ail_prop_bool_e prop = -1;
+
+ retv_if(!property, AIL_ERROR_INVALID_PARAMETER);
+
+ for (i=0 ; i<(E_AIL_PROP_BOOL_MAX - E_AIL_PROP_BOOL_MIN + 1) ; i++) {
+ if (strcmp(property, bool_prop_map[i].property) == 0) {
+ prop = bool_prop_map[i].prop;
+ break;
+ }
+ }
+
+ return prop;
+}
+
diff --git a/src/ail_convert.h b/src/ail_convert.h
new file mode 100755
index 0000000..1a8a936
--- /dev/null
+++ b/src/ail_convert.h
@@ -0,0 +1,32 @@
+/*
+ * ail
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>, Jaeho Lee <jaeho81.lee@samsung.com>
+ *
+ * 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 __AIL_CONVERT_H__
+#define __AIL_CONVERT_H__
+
+#include "ail_private.h"
+
+ail_prop_str_e _ail_convert_to_prop_str(const char *property);
+ail_prop_int_e _ail_convert_to_prop_int(const char *property);
+ail_prop_bool_e _ail_convert_to_prop_bool(const char *property);
+
+#endif /* __AIL_CONVERT_H__ */
diff --git a/src/ail_db.c b/src/ail_db.c
new file mode 100755
index 0000000..b8edd15
--- /dev/null
+++ b/src/ail_db.c
@@ -0,0 +1,268 @@
+/*
+ * ail
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>, Jaeho Lee <jaeho81.lee@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+
+#include <stdlib.h>
+#include <string.h>
+#include <db-util.h>
+#include <glib.h>
+#include "ail_private.h"
+#include "ail_db.h"
+
+#define retv_with_dbmsg_if(expr, val) do { \
+ if (expr) { \
+ _E("db_info.dbro: %s", sqlite3_errmsg(db_info.dbro)); \
+ _E("db_info.dbrw: %s", sqlite3_errmsg(db_info.dbrw)); \
+ return (val); \
+ } \
+} while (0)
+
+
+static __thread struct {
+ sqlite3 *dbro;
+ sqlite3 *dbrw;
+} db_info = {
+ .dbro = NULL,
+ .dbrw = NULL
+};
+
+ail_error_e db_open(db_open_mode mode)
+{
+ int ret;
+ int changed = 0;
+
+ if(mode & DB_OPEN_RO) {
+ if (!db_info.dbro) {
+ ret = db_util_open_with_options(APP_INFO_DB, &db_info.dbro, SQLITE_OPEN_READONLY, NULL);
+ _E("db_open_ro ret=%d", ret);
+ retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
+ }
+ }
+
+ if(mode & DB_OPEN_RW) {
+ if (!db_info.dbrw) {
+ ret = db_util_open(APP_INFO_DB, &db_info.dbrw, DB_UTIL_REGISTER_HOOK_METHOD);
+ _E("db_open_rw ret=%d", ret);
+ retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
+ }
+ }
+
+ return AIL_ERROR_OK;
+}
+
+
+
+ail_error_e db_prepare(const char *query, sqlite3_stmt **stmt)
+{
+ int ret;
+
+ retv_if(!query, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!db_info.dbro, AIL_ERROR_DB_FAILED);
+
+ ret = sqlite3_prepare_v2(db_info.dbro, query, strlen(query), stmt, NULL);
+ if (ret != SQLITE_OK) {
+ _E("%s\n", sqlite3_errmsg(db_info.dbro));
+ return AIL_ERROR_DB_FAILED;
+ } else
+ return AIL_ERROR_OK;
+}
+
+
+ail_error_e db_bind_bool(sqlite3_stmt *stmt, int idx, bool value)
+{
+ int ret;
+
+ retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
+
+ ret = sqlite3_bind_int(stmt, idx, (int) value);
+ retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
+
+ return AIL_ERROR_OK;
+}
+
+
+
+ail_error_e db_bind_int(sqlite3_stmt *stmt, int idx, int value)
+{
+ int ret;
+
+ retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
+
+ ret = sqlite3_bind_int(stmt, idx, value);
+ retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
+
+ return AIL_ERROR_OK;
+}
+
+
+
+ail_error_e db_step(sqlite3_stmt *stmt)
+{
+ int ret;
+
+ retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
+
+ ret = sqlite3_step(stmt);
+ switch (ret) {
+ case SQLITE_DONE:
+ return AIL_ERROR_NO_DATA;
+ case SQLITE_ROW:
+ return AIL_ERROR_OK;
+ }
+
+ retv_with_dbmsg_if(1, AIL_ERROR_DB_FAILED);
+}
+
+
+
+ail_error_e db_column_bool(sqlite3_stmt *stmt, int index, bool *value)
+{
+ int out_val;
+
+ retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
+
+ out_val = sqlite3_column_int(stmt, index);
+ *value = (out_val == 1)? true:false;
+
+ return AIL_ERROR_OK;
+}
+
+
+
+ail_error_e db_column_int(sqlite3_stmt *stmt, int index, int *value)
+{
+ retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
+
+ *value = sqlite3_column_int(stmt, index);
+
+ return AIL_ERROR_OK;
+}
+
+
+
+ail_error_e db_column_str(sqlite3_stmt *stmt, int index, char **str)
+{
+ retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!str, AIL_ERROR_INVALID_PARAMETER);
+
+ *str = (char *)sqlite3_column_text(stmt, index);
+
+ return AIL_ERROR_OK;
+}
+
+
+
+ail_error_e db_reset(sqlite3_stmt *stmt)
+{
+ int ret;
+
+ retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
+
+ sqlite3_clear_bindings(stmt);
+
+ ret = sqlite3_reset(stmt);
+ retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
+
+ return AIL_ERROR_OK;
+}
+
+
+
+ail_error_e db_finalize(sqlite3_stmt *stmt)
+{
+ int ret;
+
+ retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
+
+ ret = sqlite3_finalize(stmt);
+ retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
+
+ return AIL_ERROR_OK;
+}
+
+
+
+ail_error_e db_exec(const char *query)
+{
+ int ret;
+ char *errmsg;
+
+ retv_if(!query, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!db_info.dbrw, AIL_ERROR_DB_FAILED);
+
+ ret = sqlite3_exec(db_info.dbrw, query, NULL, NULL, &errmsg);
+ if (ret != SQLITE_OK) {
+ _E("Cannot execute this query - %s. because %s",
+ query, errmsg? errmsg:"uncatched error");
+ sqlite3_free(errmsg);
+ return AIL_ERROR_DB_FAILED;
+ }
+
+ return AIL_ERROR_OK;
+}
+
+
+
+ail_error_e db_close(void)
+{
+ int ret;
+
+ if(db_info.dbro) {
+ ret = sqlite3_close(db_info.dbro);
+ retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
+
+ db_info.dbro = NULL;
+ }
+ if(db_info.dbrw) {
+ ret = sqlite3_close(db_info.dbrw);
+ retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
+
+ db_info.dbrw = NULL;
+ }
+
+ return AIL_ERROR_OK;
+}
+
+EXPORT_API ail_error_e ail_db_close(void)
+{
+ return db_close();
+}
+
+int db_exec_sqlite_query(char *query, sqlite_query_callback callback, void *data)
+{
+ char *error_message = NULL;
+ if (SQLITE_OK !=
+ sqlite3_exec(db_info.dbro, query, callback, data, &error_message)) {
+ _E("Don't execute query = %s error message = %s\n", query,
+ error_message);
+ sqlite3_free(error_message);
+ return -1;
+ }
+ sqlite3_free(error_message);
+ return 0;
+}
+
+// End of file.
diff --git a/src/ail_db.h b/src/ail_db.h
new file mode 100755
index 0000000..56b1b2a
--- /dev/null
+++ b/src/ail_db.h
@@ -0,0 +1,59 @@
+/*
+ * ail
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>, Jaeho Lee <jaeho81.lee@samsung.com>
+ *
+ * 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 __AIL_DB_H__
+#define __AIL_DB_H__
+
+#include <sqlite3.h>
+#include "ail.h"
+
+#define AIL_SQL_QUERY_MAX_LEN 2048
+
+typedef enum {
+ DB_OPEN_RO = 0x0001,
+ DB_OPEN_RW = 0x0002,
+} db_open_mode;
+typedef int (*sqlite_query_callback)(void *data, int ncols, char **coltxt, char **colname);
+
+ail_error_e db_open(db_open_mode mode);
+ail_error_e db_prepare(const char *query, sqlite3_stmt **stmt);
+
+ail_error_e db_bind_bool(sqlite3_stmt *stmt, int idx, bool value);
+ail_error_e db_bind_int(sqlite3_stmt *stmt, int idx, int value);
+
+ail_error_e db_step(sqlite3_stmt *stmt);
+
+ail_error_e db_column_bool(sqlite3_stmt *stmt, int index, bool *value);
+ail_error_e db_column_int(sqlite3_stmt *stmt, int index, int *value);
+ail_error_e db_column_str(sqlite3_stmt *stmt, int index, char **str);
+
+ail_error_e db_reset(sqlite3_stmt *stmt);
+ail_error_e db_finalize(sqlite3_stmt *stmt);
+
+
+ail_error_e db_exec(const char *query);
+ail_error_e db_close(void);
+int db_exec_sqlite_query(char *query, sqlite_query_callback callback, void *data);
+#endif
+// End of file
diff --git a/src/ail_desktop.c b/src/ail_desktop.c
new file mode 100755
index 0000000..ffbbcba
--- /dev/null
+++ b/src/ail_desktop.c
@@ -0,0 +1,1382 @@
+/*
+ * ail
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>, Jaeho Lee <jaeho81.lee@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <time.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <xdgmime.h>
+
+#include <vconf.h>
+#include <glib.h>
+
+#include "ail_private.h"
+#include "ail_db.h"
+#include "ail.h"
+
+#define OPT_DESKTOP_DIRECTORY "/opt/share/applications"
+#define USR_DESKTOP_DIRECTORY "/usr/share/applications"
+#define BUFSZE 4096
+
+#define whitespace(c) (((c) == ' ') || ((c) == '\t'))
+#define argsdelimiter " \t"
+
+typedef enum {
+ NOTI_ADD,
+ NOTI_UPDATE,
+ NOTI_REMOVE,
+ NOTI_MAX,
+} noti_type;
+
+struct entry_parser {
+ const char *field;
+ ail_error_e (*value_cb)(void *data, char *tag, char *value);
+};
+
+inline static char *_ltrim(char *str)
+{
+ if (!str) return NULL;
+
+ while (*str == ' ' || *str == '\t' || *str == '\n') str ++;
+
+ return str;
+}
+
+
+
+inline static int _rtrim(char *str)
+{
+ int len;
+
+ len = strlen(str);
+ while (--len >= 0 && (str[len] == ' ' || str[len] == '\n' || str[len] == '\t')) str[len] = '\0';
+
+ return len;
+}
+
+struct name_item {
+ char *locale;
+ char *name;
+};
+
+typedef struct {
+ const char* package;
+ char* exec;
+ char* name;
+ char* type;
+ char* icon;
+ char* categories;
+ char* version;
+ char* mimetype;
+ char* x_slp_service;
+ char* x_slp_packagetype;
+ char* x_slp_packagecategories;
+ char* x_slp_packageid;
+ char* x_slp_uri;
+ char* x_slp_svc;
+ char* x_slp_exe_path;
+ char* x_slp_appid;
+ char* x_slp_pkgid;
+ char* x_slp_domain;
+ int x_slp_baselayoutwidth;
+ int x_slp_installedtime;
+ int nodisplay;
+ int x_slp_taskmanage;
+ int x_slp_multiple;
+ int x_slp_removable;
+ int x_slp_ishorizontalscale;
+ int x_slp_inactivated;
+ char* desktop;
+ GSList* localname;
+} desktop_info_s;
+
+
+
+static ail_error_e _read_exec(void *data, char *tag, char *value)
+{
+ desktop_info_s *info = data;
+ char *token_exe_path;
+ char *save_ptr;
+ char *temp_exec;
+
+ retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
+
+ SAFE_FREE_AND_STRDUP(value, info->exec);
+ retv_if(!info->exec, AIL_ERROR_OUT_OF_MEMORY);
+
+ temp_exec = strdup(value);
+ if(!temp_exec) {
+ free(info->exec);
+ return AIL_ERROR_OUT_OF_MEMORY;
+ }
+
+ token_exe_path = strtok_r(temp_exec, argsdelimiter, &save_ptr);
+
+ info->x_slp_exe_path = strdup(token_exe_path);
+ if(!info->x_slp_exe_path) {
+ free(info->exec);
+ info->exec = NULL;
+ free(temp_exec);
+ return AIL_ERROR_OUT_OF_MEMORY;
+ }
+
+ free(temp_exec);
+
+ return AIL_ERROR_OK;
+}
+
+
+
+static ail_error_e _read_name(void *data, char *tag, char *value)
+{
+ desktop_info_s *info = data;
+
+ retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(0 == strlen(value), AIL_ERROR_FAIL);
+
+ if (tag && strlen(tag) > 0) {
+ struct name_item *item;
+ item = (struct name_item *)calloc(1, sizeof(struct name_item));
+ retv_if (NULL == item, AIL_ERROR_OUT_OF_MEMORY);
+
+ SAFE_FREE_AND_STRDUP(tag, item->locale);
+ if(NULL == item->locale) {
+ _E("(NULL == item->locale) return\n");
+ free(item);
+ return AIL_ERROR_OUT_OF_MEMORY;
+ }
+
+ SAFE_FREE_AND_STRDUP(value, item->name);
+ if(NULL == item->name) {
+ _E("(NULL == item->name) return\n");
+ free(item->locale);
+ free(item);
+ return AIL_ERROR_OUT_OF_MEMORY;
+ }
+
+ info->localname = g_slist_append(info->localname, item);
+
+ return AIL_ERROR_OK;
+ } else {
+ SAFE_FREE_AND_STRDUP(value, info->name);
+ retv_if (!info->name, AIL_ERROR_OUT_OF_MEMORY);
+
+ return AIL_ERROR_OK;
+ }
+}
+
+
+
+static ail_error_e _read_type(void *data, char *tag, char *value)
+{
+ desktop_info_s *info = data;
+
+ retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
+
+ SAFE_FREE_AND_STRDUP(value, info->type);
+ retv_if (!info->type, AIL_ERROR_OUT_OF_MEMORY);
+
+ return AIL_ERROR_OK;
+}
+
+
+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 {
+ _E("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) {
+ _E("(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;
+ _D("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 */
+ _E("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;
+ _D("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);
+
+ _D("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 ail_error_e _read_icon(void *data, char *tag, char *value)
+{
+ desktop_info_s *info = data;
+
+ retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
+
+ info->icon = _get_icon_with_path(value);
+
+ retv_if (!info->icon, AIL_ERROR_OUT_OF_MEMORY);
+
+ return AIL_ERROR_OK;
+}
+
+
+
+static ail_error_e _read_categories(void *data, char *tag, char *value)
+{
+ desktop_info_s *info = data;
+
+ retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
+
+ SAFE_FREE_AND_STRDUP(value, info->categories);
+ retv_if (!info->categories, AIL_ERROR_OUT_OF_MEMORY);
+
+ return AIL_ERROR_OK;
+}
+
+
+
+static ail_error_e _read_version(void *data, char *tag, char *value)
+{
+ desktop_info_s *info = data;
+
+ retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
+
+ SAFE_FREE_AND_STRDUP(value, info->version);
+ retv_if (!info->version, AIL_ERROR_OUT_OF_MEMORY);
+
+ return AIL_ERROR_OK;
+}
+
+
+
+static ail_error_e _read_mimetype(void *data, char *tag, char *value)
+{
+ desktop_info_s *info = data;
+ int size, total_len = 0;
+ char *mimes_origin, *mimes_changed, *token_unalias, *save_ptr;
+
+ retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!strlen(value), AIL_ERROR_FAIL);
+
+ mimes_origin = strdup(value);
+ retv_if(!mimes_origin, AIL_ERROR_OUT_OF_MEMORY);
+
+ size = getpagesize();
+ mimes_changed = calloc(1, size);
+ if(mimes_changed == NULL) {
+ _E("(mimes_changed == NULL) return\n");
+ free(mimes_origin);
+ return AIL_ERROR_OUT_OF_MEMORY;
+ }
+
+ token_unalias = strtok_r(mimes_origin, ";", &save_ptr);
+
+ while (token_unalias) {
+ int token_len;
+ const char *token_alias;
+
+ _rtrim(token_unalias);
+ token_unalias = _ltrim(token_unalias);
+
+ token_alias = xdg_mime_unalias_mime_type(token_unalias);
+ if (!token_alias) continue;
+
+ token_len = strlen(token_alias);
+ if (total_len + token_len + (1<<1) >= size) {
+ char *tmp;
+ size *= 2;
+ tmp = realloc(mimes_changed, size);
+ if(!tmp) {
+ free(mimes_changed);
+ return AIL_ERROR_OUT_OF_MEMORY;
+ }
+ mimes_changed = tmp;
+ }
+
+ strncat(mimes_changed, token_alias, size-1);
+ total_len += token_len;
+
+ token_unalias = strtok_r(NULL, ";", &save_ptr);
+ if (token_unalias) {
+ strncat(mimes_changed, ";", size-strlen(mimes_changed)-1);
+ }
+ }
+
+ SAFE_FREE(info->mimetype);
+ info->mimetype = mimes_changed;
+
+ return AIL_ERROR_OK;
+}
+
+
+
+static ail_error_e _read_nodisplay(void *data, char *tag, char *value)
+{
+ desktop_info_s* info = data;
+
+ retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
+
+ info->nodisplay = !strcasecmp(value, "true");
+
+ return AIL_ERROR_OK;
+}
+
+
+
+static ail_error_e _read_x_slp_service(void *data, char *tag, char *value)
+{
+ desktop_info_s *info = data;
+
+ retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
+
+ SAFE_FREE_AND_STRDUP(value, info->x_slp_service);
+ retv_if(!info->x_slp_service, AIL_ERROR_OUT_OF_MEMORY);
+
+ return AIL_ERROR_OK;
+}
+
+
+
+static ail_error_e _read_x_slp_packagetype(void *data, char *tag, char *value)
+{
+ desktop_info_s *info = data;
+
+ retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
+
+ SAFE_FREE_AND_STRDUP(value, info->x_slp_packagetype);
+ retv_if(!info->x_slp_packagetype, AIL_ERROR_OUT_OF_MEMORY);
+
+ return AIL_ERROR_OK;
+}
+
+
+
+static ail_error_e _read_x_slp_packagecategories(void *data, char *tag, char *value)
+{
+ desktop_info_s *info = data;
+
+ retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
+
+ SAFE_FREE_AND_STRDUP(value, info->x_slp_packagecategories);
+ retv_if(!info->x_slp_packagecategories, AIL_ERROR_OUT_OF_MEMORY);
+
+ return AIL_ERROR_OK;
+}
+
+
+
+static ail_error_e _read_x_slp_packageid(void *data, char *tag, char *value)
+{
+ desktop_info_s *info = data;
+
+ retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
+
+ SAFE_FREE_AND_STRDUP(value, info->x_slp_packageid);
+ retv_if(!info->x_slp_packageid, AIL_ERROR_OUT_OF_MEMORY);
+
+ return AIL_ERROR_OK;
+}
+
+
+
+static ail_error_e _read_x_slp_uri(void *data, char *tag, char *value)
+{
+ desktop_info_s *info = data;
+
+ retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
+
+ SAFE_FREE_AND_STRDUP(value, info->x_slp_uri);
+ retv_if(!info->x_slp_uri, AIL_ERROR_OUT_OF_MEMORY);
+
+ return AIL_ERROR_OK;
+}
+
+
+
+static ail_error_e _read_x_slp_svc(void *data, char *tag, char *value)
+{
+ desktop_info_s *info = data;
+
+ retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
+
+ SAFE_FREE_AND_STRDUP(value, info->x_slp_svc);
+ retv_if(!info->x_slp_svc, AIL_ERROR_OUT_OF_MEMORY);
+
+ return AIL_ERROR_OK;
+}
+
+
+
+static ail_error_e _read_x_slp_taskmanage(void *data, char *tag, char *value)
+{
+ desktop_info_s *info = data;
+
+ retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
+
+ info->x_slp_taskmanage = !strcasecmp(value, "true");
+
+ return AIL_ERROR_OK;
+}
+
+
+
+static ail_error_e _read_x_slp_multiple(void *data, char *tag, char *value)
+{
+ desktop_info_s *info = data;
+
+ retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
+
+ info->x_slp_multiple = !strcasecmp(value, "true");
+
+ return AIL_ERROR_OK;
+}
+
+
+
+static ail_error_e _read_x_slp_removable(void *data, char *tag, char *value)
+{
+ desktop_info_s *info = data;
+
+ retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
+
+ info->x_slp_removable = !strcasecmp(value, "true");
+
+ return AIL_ERROR_OK;
+}
+
+
+static ail_error_e _read_x_slp_appid(void *data, char *tag, char *value)
+{
+ desktop_info_s *info = data;
+
+ retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
+
+ SAFE_FREE_AND_STRDUP(value, info->x_slp_appid);
+ retv_if(!info->x_slp_appid, AIL_ERROR_OUT_OF_MEMORY);
+
+ return AIL_ERROR_OK;
+}
+
+
+static ail_error_e _read_x_slp_pkgid(void *data, char *tag, char *value)
+{
+ desktop_info_s *info = data;
+
+ retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
+
+ SAFE_FREE_AND_STRDUP(value, info->x_slp_pkgid);
+ retv_if(!info->x_slp_pkgid, AIL_ERROR_OUT_OF_MEMORY);
+
+ return AIL_ERROR_OK;
+}
+
+
+static ail_error_e _read_x_slp_domain(void *data, char *tag, char *value)
+{
+ desktop_info_s *info = data;
+
+ retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
+
+ SAFE_FREE_AND_STRDUP(value, info->x_slp_domain);
+ retv_if(!info->x_slp_appid, AIL_ERROR_OUT_OF_MEMORY);
+
+ return AIL_ERROR_OK;
+}
+
+
+static struct entry_parser entry_parsers[] = {
+ {
+ .field = "exec",
+ .value_cb = _read_exec,
+ },
+ {
+ .field = "name",
+ .value_cb = _read_name,
+ },
+ {
+ .field = "type",
+ .value_cb = _read_type,
+ },
+ {
+ .field = "icon",
+ .value_cb = _read_icon,
+ },
+ {
+ .field = "categories",
+ .value_cb = _read_categories,
+ },
+ {
+ .field = "version",
+ .value_cb = _read_version,
+ },
+ {
+ .field = "mimetype",
+ .value_cb = _read_mimetype,
+ },
+ {
+ .field = "x-tizen-service",
+ .value_cb = _read_x_slp_service,
+ },
+ {
+ .field = "x-tizen-packagetype",
+ .value_cb = _read_x_slp_packagetype,
+ },
+ {
+ .field = "x-tizen-packagecategories",
+ .value_cb = _read_x_slp_packagecategories,
+ },
+ {
+ .field = "x-tizen-packageid",
+ .value_cb = _read_x_slp_packageid,
+ },
+ {
+ .field = "x-tizen-uri",
+ .value_cb = _read_x_slp_uri,
+ },
+ {
+ .field = "x-tizen-svc",
+ .value_cb = _read_x_slp_svc,
+ },
+ {
+ .field = "nodisplay",
+ .value_cb = _read_nodisplay,
+ },
+ {
+ .field = "x-tizen-taskmanage",
+ .value_cb = _read_x_slp_taskmanage,
+ },
+ {
+ .field = "x-tizen-multiple",
+ .value_cb = _read_x_slp_multiple,
+ },
+ {
+ .field = "x-tizen-removable",
+ .value_cb = _read_x_slp_removable,
+ },
+ {
+ .field = "x-tizen-appid",
+ .value_cb = _read_x_slp_appid,
+ },
+ {
+ .field = "x-tizen-pkgid",
+ .value_cb = _read_x_slp_pkgid,
+ },
+ {
+ .field = "x-tizen-domain",
+ .value_cb = _read_x_slp_domain,
+ },
+ {
+ .field = NULL,
+ .value_cb = NULL,
+ },
+};
+
+
+
+/* Utility functions */
+static int _count_all(void)
+{
+ ail_error_e ret;
+ int count;
+
+ ret = ail_filter_count_appinfo(NULL, &count);
+ if(ret != AIL_ERROR_OK) {
+ _E("cannot count appinfo");
+ count = -1;
+ }
+
+ retv_if(ret != AIL_ERROR_OK, -1);
+
+ return count;
+}
+
+
+
+char *_pkgname_to_desktop(const char *package)
+{
+ char *desktop;
+ int size;
+
+ retv_if(!package, NULL);
+
+ size = strlen(OPT_DESKTOP_DIRECTORY) + strlen(package) + 10;
+ desktop = malloc(size);
+ retv_if(!desktop, NULL);
+
+ snprintf(desktop, size, OPT_DESKTOP_DIRECTORY"/%s.desktop", package);
+
+ if (access(desktop, R_OK) == 0)
+ return desktop;
+
+ snprintf(desktop, size, USR_DESKTOP_DIRECTORY"/%s.desktop", package);
+
+ return desktop;
+}
+
+
+
+static inline int _strlen_desktop_info(desktop_info_s* info)
+{
+ int len = 0;
+
+ retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
+
+ if (info->package) len += strlen(info->package);
+ if (info->exec) len += strlen(info->exec);
+ if (info->name) len += strlen(info->name);
+ if (info->type) len += strlen(info->type);
+ if (info->icon) len += strlen(info->icon);
+ if (info->categories) len += strlen(info->categories);
+ if (info->version) len += strlen(info->version);
+ if (info->mimetype) len += strlen(info->mimetype);
+ if (info->x_slp_service) len += strlen(info->x_slp_service);
+ if (info->x_slp_packagetype) len += strlen(info->x_slp_packagetype);
+ if (info->x_slp_packagecategories) len += strlen(info->x_slp_packagecategories);
+ if (info->x_slp_packageid) len += strlen(info->x_slp_packageid);
+ if (info->x_slp_uri) len += strlen(info->x_slp_uri);
+ if (info->x_slp_svc) len += strlen(info->x_slp_svc);
+ if (info->x_slp_exe_path) len += strlen(info->x_slp_exe_path);
+ if (info->x_slp_appid) len += strlen(info->x_slp_appid);
+ if (info->desktop) len += strlen(info->desktop);
+
+ return len;
+}
+
+
+int __is_ail_initdb(void)
+{
+ if( getenv("AIL_INITDB") || getenv("INITDB") )
+ return 1;
+ else
+ return 0;
+}
+
+
+
+/* Manipulating desktop_info functions */
+static ail_error_e _init_desktop_info(desktop_info_s *info, const char *package)
+{
+ static int is_initdb = -1;
+
+ if(is_initdb == -1)
+ is_initdb = __is_ail_initdb();
+
+ retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!package, AIL_ERROR_INVALID_PARAMETER);
+
+ /* defaults */
+ info->package = package;
+
+ info->x_slp_taskmanage = 1;
+ info->x_slp_removable = 1;
+
+ if(is_initdb)
+ info->x_slp_installedtime = 0;
+ else
+ info->x_slp_installedtime = time(NULL);
+
+#ifdef PKGTYPE
+ info->x_slp_packagetype = strdup(PKGTYPE);
+#else
+ info->x_slp_packagetype = strdup("rpm");
+#endif
+ retv_if(!info->x_slp_packagetype, AIL_ERROR_OUT_OF_MEMORY);
+
+ info->x_slp_packageid = strdup(package);
+ retv_if(!info->x_slp_packageid, AIL_ERROR_OUT_OF_MEMORY);
+ info->x_slp_appid = strdup(package);
+ retv_if(!info->x_slp_appid, AIL_ERROR_OUT_OF_MEMORY);
+
+ info->desktop = _pkgname_to_desktop(package);
+ retv_if(!info->desktop, AIL_ERROR_FAIL);
+
+ return AIL_ERROR_OK;
+}
+
+
+
+static ail_error_e _read_desktop_info(desktop_info_s* info)
+{
+ char *line = NULL;
+ FILE *fp;
+ size_t size = 0;
+ ssize_t read;
+
+ retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
+
+ fp = fopen(info->desktop, "r");
+ retv_if(!fp, AIL_ERROR_FAIL);
+
+ while ((read = getline(&line, &size, fp)) != -1) {
+ int len, idx;
+ char *tmp, *field, *field_name, *tag, *value;
+
+ tmp = _ltrim(line);
+ if(tmp == NULL) continue;
+ if (*tmp == '#') continue;
+ if (_rtrim(tmp) <= 0) continue;
+
+ len = strlen(line) + 1;
+ field = calloc(1, len);
+ field_name = calloc(1, len);
+ tag = calloc(1, len);
+ value = calloc(1, len);
+
+ if (!field || !field_name || !tag || !value) {
+ goto NEXT;
+ }
+
+ sscanf(tmp, "%[^=]=%[^\n]", field, value);
+ _rtrim(field);
+ tmp = _ltrim(value);
+
+ sscanf(field, "%[^[][%[^]]]", field_name, tag);
+
+ if (!field_name || !strlen(field_name)){
+ goto NEXT;
+ }
+
+ for (idx = 0; entry_parsers[idx].field; idx ++) {
+ if (!g_ascii_strcasecmp(entry_parsers[idx].field, field_name) && entry_parsers[idx].value_cb) {
+ if (entry_parsers[idx].value_cb(info, tag, tmp) != AIL_ERROR_OK) {
+ _E("field - [%s] is wrong.", field_name);
+ }
+ break;
+ }
+ }
+NEXT:
+ SAFE_FREE(field);
+ SAFE_FREE(field_name);
+ SAFE_FREE(tag);
+ SAFE_FREE(value);
+ }
+
+ _D("Read (%s).", info->package);
+ fclose(fp);
+
+ return AIL_ERROR_OK;
+}
+
+
+
+static ail_error_e _modify_desktop_info_bool(desktop_info_s* info,
+ const char *property,
+ bool value)
+{
+ ail_prop_bool_e prop;
+ int val;
+
+ retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!property, AIL_ERROR_INVALID_PARAMETER);
+
+ prop = _ail_convert_to_prop_bool(property);
+
+ if (prop < E_AIL_PROP_BOOL_MIN || prop > E_AIL_PROP_BOOL_MAX)
+ return AIL_ERROR_INVALID_PARAMETER;
+
+ switch (prop) {
+ case E_AIL_PROP_X_SLP_INACTIVATED_BOOL:
+ info->x_slp_inactivated = (int)value;
+ break;
+ default:
+ return AIL_ERROR_FAIL;
+ }
+
+ return AIL_ERROR_OK;
+}
+
+
+
+static ail_error_e _create_table(void)
+{
+ int i;
+ ail_error_e ret;
+ const char *tbls[3] = {
+ "CREATE TABLE app_info "
+ "(package TEXT PRIMARY KEY, "
+ "exec TEXT DEFAULT 'No Exec', "
+ "name TEXT DEFAULT 'No Name', "
+ "type TEXT DEFAULT 'Application', "
+ "icon TEXT DEFAULT 'No Icon', "
+ "categories TEXT, "
+ "version TEXT, "
+ "mimetype TEXT, "
+ "x_slp_service TEXT, "
+ "x_slp_packagetype TEXT, "
+ "x_slp_packagecategories TEXT, "
+ "x_slp_packageid TEXT, "
+ "x_slp_uri TEXT, "
+ "x_slp_svc TEXT, "
+ "x_slp_exe_path TEXT, "
+ "x_slp_appid TEXT, "
+ "x_slp_pkgid TEXT, "
+ "x_slp_domain TEXT, "
+ "x_slp_baselayoutwidth INTEGER DEFAULT 0, "
+ "x_slp_installedtime INTEGER DEFAULT 0, "
+ "nodisplay INTEGER DEFAULT 0, "
+ "x_slp_taskmanage INTEGER DEFAULT 1, "
+ "x_slp_multiple INTEGER DEFAULT 0, "
+ "x_slp_removable INTEGER DEFAULT 1, "
+ "x_slp_ishorizontalscale INTEGER DEFAULT 0, "
+ "x_slp_inactivated INTEGER DEFAULT 0, "
+ "desktop TEXT UNIQUE NOT NULL);",
+ "CREATE TABLE localname (package TEXT NOT NULL, "
+ "locale TEXT NOT NULL, "
+ "name TEXT NOT NULL, PRIMARY KEY (package, locale));",
+ NULL
+ };
+
+ ret = db_open(DB_OPEN_RW);
+ retv_if(ret != AIL_ERROR_OK, AIL_ERROR_DB_FAILED);
+
+ for (i = 0; tbls[i] != NULL; i++) {
+ ret = db_exec(tbls[i]);
+ retv_if(ret != AIL_ERROR_OK, AIL_ERROR_DB_FAILED);
+ }
+
+ return AIL_ERROR_OK;
+}
+
+
+static inline void _insert_localname(gpointer data, gpointer user_data)
+{
+ char query[512];
+
+ struct name_item *item = (struct name_item *)data;
+ desktop_info_s *info = (desktop_info_s *)user_data;
+
+ snprintf(query, sizeof(query), "insert into localname (package, locale, name) "
+ "values ('%s', '%s', '%s');",
+ info->package, item->locale, item->name);
+ if (db_exec(query) < 0)
+ _E("Failed to insert local name of package[%s]",info->package);
+}
+
+static ail_error_e _insert_desktop_info(desktop_info_s *info)
+{
+ char *query;
+ int len;
+ ail_error_e ret;
+
+ len = _strlen_desktop_info(info) + (0x01 << 10);
+ query = calloc(1, len);
+ retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
+
+ sqlite3_snprintf(len, query, "insert into app_info ("
+ "package, "
+ "exec, name, "
+ "type, "
+ "icon, "
+ "categories, "
+ "version, "
+ "mimetype, "
+ "x_slp_service, "
+ "x_slp_packagetype, "
+ "x_slp_packagecategories, "
+ "x_slp_packageid, "
+ "x_slp_uri, "
+ "x_slp_svc, "
+ "x_slp_exe_path, "
+ "x_slp_appid, "
+ "x_slp_pkgid, "
+ "x_slp_domain, "
+ "x_slp_baselayoutwidth, "
+ "x_slp_installedtime, "
+ "nodisplay, "
+ "x_slp_taskmanage, "
+ "x_slp_multiple, "
+ "x_slp_removable, "
+ "x_slp_ishorizontalscale, "
+ "x_slp_inactivated, "
+ "desktop) "
+ "values "
+ "('%q', '%q', '%q', '%q', '%q', "
+ "'%q', '%q', '%q', '%q', '%q', "
+ "'%q', '%q', '%q', '%q', '%q', "
+ "'%q', '%q', '%q', "
+ "%d, %d, %d, %d, %d, %d, "
+ "%d, %d, "
+ "'%q');",
+ info->package,
+ info->exec,
+ info->name,
+ info->type,
+ info->icon,
+ info->categories,
+ info->version,
+ info->mimetype,
+ info->x_slp_service,
+ info->x_slp_packagetype,
+ info->x_slp_packagecategories,
+ info->x_slp_packageid,
+ info->x_slp_uri,
+ info->x_slp_svc,
+ info->x_slp_exe_path,
+ info->x_slp_appid,
+ info->x_slp_pkgid,
+ info->x_slp_domain,
+ info->x_slp_baselayoutwidth,
+ info->x_slp_installedtime,
+ info->nodisplay,
+ info->x_slp_taskmanage,
+ info->x_slp_multiple,
+ info->x_slp_removable,
+ info->x_slp_ishorizontalscale,
+ info->x_slp_inactivated,
+ info->desktop
+ );
+
+ ret = db_open(DB_OPEN_RW);
+ if(ret != AIL_ERROR_OK) {
+ _E("(tmp == NULL) return\n");
+ free(query);
+ return AIL_ERROR_DB_FAILED;
+ }
+
+ ret = db_exec(query);
+ retv_if(ret != AIL_ERROR_OK, AIL_ERROR_DB_FAILED);
+
+ if (info->localname)
+ g_slist_foreach(info->localname, _insert_localname, info);
+
+ _D("Add (%s).", info->package);
+
+ return AIL_ERROR_OK;
+}
+
+
+
+static ail_error_e _update_desktop_info(desktop_info_s *info)
+{
+ char *query;
+ int len;
+
+ retv_if (NULL == info, AIL_ERROR_INVALID_PARAMETER);
+
+ if (db_open(DB_OPEN_RW) < 0) {
+ return AIL_ERROR_DB_FAILED;
+ }
+
+ len = _strlen_desktop_info(info) + (0x01 << 10);
+ query = calloc(1, len);
+ retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
+
+ sqlite3_snprintf ( len, query, "update app_info set "
+ "exec='%q', "
+ "name='%q', "
+ "type='%q', "
+ "icon='%q', "
+ "categories='%q', "
+ "version='%q', "
+ "mimetype='%q', "
+ "x_slp_service='%q', "
+ "x_slp_packagetype='%q', "
+ "x_slp_packagecategories='%q', "
+ "x_slp_packageid='%q', "
+ "x_slp_uri='%q', "
+ "x_slp_svc='%q', "
+ "x_slp_exe_path='%q', "
+ "x_slp_appid='%q', "
+ "x_slp_pkgid='%q', "
+ "x_slp_domain='%q', "
+ "x_slp_baselayoutwidth=%d, "
+ "x_slp_installedtime=%d, "
+ "nodisplay=%d, "
+ "x_slp_taskmanage=%d, "
+ "x_slp_multiple=%d, "
+ "x_slp_removable=%d, "
+ "x_slp_ishorizontalscale=%d, "
+ "x_slp_inactivated=%d, "
+ "desktop='%q'"
+ "where package='%q'",
+ info->exec,
+ info->name,
+ info->type,
+ info->icon,
+ info->categories,
+ info->version,
+ info->mimetype,
+ info->x_slp_service,
+ info->x_slp_packagetype,
+ info->x_slp_packagecategories,
+ info->x_slp_packageid,
+ info->x_slp_uri,
+ info->x_slp_svc,
+ info->x_slp_exe_path,
+ info->x_slp_appid,
+ info->x_slp_pkgid,
+ info->x_slp_domain,
+ info->x_slp_baselayoutwidth,
+ info->x_slp_installedtime,
+ info->nodisplay,
+ info->x_slp_taskmanage,
+ info->x_slp_multiple,
+ info->x_slp_removable,
+ info->x_slp_ishorizontalscale,
+ info->x_slp_inactivated,
+ info->desktop,
+ info->package);
+
+ if (db_exec(query) < 0) {
+ free (query);
+ return AIL_ERROR_DB_FAILED;
+ }
+
+ snprintf(query, len, "delete from localname where package = '%s'", info->package);
+
+ if (db_exec(query) < 0) {
+ free (query);
+ return AIL_ERROR_DB_FAILED;
+ }
+
+ if (info->localname)
+ g_slist_foreach(info->localname, _insert_localname, info);
+
+ _D("Update (%s).", info->package);
+
+ free(query);
+
+ return AIL_ERROR_OK;
+}
+
+
+
+static ail_error_e _remove_package(const char* package)
+{
+ char *query;
+ int size;
+
+ retv_if(!package, AIL_ERROR_INVALID_PARAMETER);
+
+ if (db_open(DB_OPEN_RW) < 0) {
+ return AIL_ERROR_DB_FAILED;
+ }
+
+ size = strlen(package) + (0x01 << 10);
+ query = calloc(1, size);
+ retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
+
+ snprintf(query, size, "delete from app_info where package = '%s'", package);
+
+ if (db_exec(query) < 0) {
+ free(query);
+ return AIL_ERROR_DB_FAILED;
+ }
+
+ snprintf(query, size, "delete from localname where package = '%s'", package);
+ _D("query=%s",query);
+
+ if (db_exec(query) < 0) {
+ free(query);
+ return AIL_ERROR_DB_FAILED;
+ }
+
+ _D("Remove (%s).", package);
+ free(query);
+
+ return AIL_ERROR_OK;
+}
+
+
+
+static ail_error_e _send_db_done_noti(noti_type type, const char *package)
+{
+ char *type_string, *noti_string;
+ int size;
+
+ retv_if(!package, AIL_ERROR_INVALID_PARAMETER);
+
+ switch (type) {
+ case NOTI_ADD:
+ type_string = "create";
+ break;
+ case NOTI_UPDATE:
+ type_string = "update";
+ break;
+ case NOTI_REMOVE:
+ type_string = "delete";
+ break;
+ default:
+ return AIL_ERROR_FAIL;
+ }
+
+ size = strlen(package) + 8;
+ noti_string = calloc(1, size);
+ retv_if(!noti_string, AIL_ERROR_OUT_OF_MEMORY);
+
+ snprintf(noti_string, size, "%s:%s", type_string, package);
+ vconf_set_str("memory/menuscreen/desktop", noti_string);
+ _D("Noti : %s", noti_string);
+
+ free(noti_string);
+
+ return AIL_ERROR_OK;
+}
+
+
+static void inline _name_item_free_func(gpointer data)
+{
+ struct name_item *item = (struct name_item *)data;
+ if (item){
+ SAFE_FREE(item->locale);
+ item->locale = NULL;
+ SAFE_FREE(item->name);
+ item->name = NULL;
+ }
+ SAFE_FREE(item);
+}
+
+static void _fini_desktop_info(desktop_info_s *info)
+{
+ SAFE_FREE(info->exec);
+ SAFE_FREE(info->name);
+ SAFE_FREE(info->type);
+ SAFE_FREE(info->icon);
+ SAFE_FREE(info->categories);
+ SAFE_FREE(info->version);
+ SAFE_FREE(info->mimetype);
+ SAFE_FREE(info->x_slp_service);
+ SAFE_FREE(info->x_slp_packagetype);
+ SAFE_FREE(info->x_slp_packagecategories);
+ SAFE_FREE(info->x_slp_packageid);
+ SAFE_FREE(info->x_slp_uri);
+ SAFE_FREE(info->x_slp_svc);
+ SAFE_FREE(info->x_slp_exe_path);
+ SAFE_FREE(info->x_slp_appid);
+ SAFE_FREE(info->desktop);
+ if (info->localname) {
+ g_slist_free_full(info->localname, _name_item_free_func);
+ info->localname = NULL;
+ }
+
+ return;
+}
+
+
+
+/* Public functions */
+EXPORT_API ail_error_e ail_desktop_add(const char *appid)
+{
+ desktop_info_s info = {0,};
+ ail_error_e ret;
+ int count;
+
+ retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
+
+ count = _count_all();
+ if (count <= 0) {
+ ret = _create_table();
+ if (ret != AIL_ERROR_OK) {
+ _D("Cannot create a table. Maybe there is already a table.");
+ }
+ }
+
+ ret = _init_desktop_info(&info, appid);
+ retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
+
+ ret = _read_desktop_info(&info);
+ retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
+
+ ret = _insert_desktop_info(&info);
+ retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
+
+ ret = _send_db_done_noti(NOTI_ADD, appid);
+ retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
+
+ _fini_desktop_info(&info);
+
+ return AIL_ERROR_OK;
+}
+
+
+
+EXPORT_API ail_error_e ail_desktop_update(const char *appid)
+{
+ desktop_info_s info = {0,};
+ ail_error_e ret;
+
+ retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
+
+ ret = _init_desktop_info(&info, appid);
+ retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
+
+ ret = _read_desktop_info(&info);
+ retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
+
+ ret = _update_desktop_info(&info);
+ retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
+
+ ret = _send_db_done_noti(NOTI_UPDATE, appid);
+ retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
+
+ _fini_desktop_info(&info);
+
+ return AIL_ERROR_OK;
+}
+
+
+
+EXPORT_API ail_error_e ail_desktop_remove(const char *appid)
+{
+ ail_error_e ret;
+
+ retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
+
+ ret = _remove_package(appid);
+ retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
+
+ ret = _send_db_done_noti(NOTI_REMOVE, appid);
+ retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
+
+ return AIL_ERROR_OK;
+}
+
+
+EXPORT_API ail_error_e ail_desktop_appinfo_modify_bool(const char *package,
+ const char *property,
+ bool value)
+{
+ desktop_info_s info = {0,};
+ ail_error_e ret;
+ ail_prop_bool_e prop;
+
+ retv_if(!package, AIL_ERROR_INVALID_PARAMETER);
+
+ retv_if(strcmp(property, AIL_PROP_X_SLP_INACTIVATED_BOOL),
+ AIL_ERROR_INVALID_PARAMETER);
+
+ ret = _init_desktop_info(&info, package);
+ retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
+
+ ret = _modify_desktop_info_bool(&info, property, value);
+ retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
+
+ ret = _update_desktop_info(&info);
+ retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
+
+ ret = _send_db_done_noti(NOTI_UPDATE, package);
+ retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
+
+ _fini_desktop_info(&info);
+
+ return AIL_ERROR_OK;
+}
+
+
+
+
+// End of File
diff --git a/src/ail_filter.c b/src/ail_filter.c
new file mode 100755
index 0000000..2451996
--- /dev/null
+++ b/src/ail_filter.c
@@ -0,0 +1,359 @@
+/*
+ * ail
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>, Jaeho Lee <jaeho81.lee@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+
+#include <stdlib.h>
+#include <glib.h>
+#include <string.h>
+#include <stdio.h>
+#include "ail.h"
+#include "ail_private.h"
+#include "ail_convert.h"
+#include "ail_sql.h"
+#include "ail_package.h"
+#include "ail_db.h"
+
+char *_get_where_clause(ail_filter_h filter);
+
+struct ail_filter {
+ GSList *list;
+};
+
+static inline void _add_cond_to_filter(ail_filter_h filter, struct element *cond)
+{
+ filter->list = g_slist_append(filter->list, cond);
+}
+
+EXPORT_API ail_error_e ail_filter_new(ail_filter_h *filter)
+{
+ struct ail_filter *f;
+
+ retv_if (NULL == filter, AIL_ERROR_INVALID_PARAMETER);
+
+ f = (struct ail_filter *)calloc(1, sizeof(struct ail_filter));
+ retv_if (NULL == f, AIL_ERROR_OUT_OF_MEMORY);
+
+ *filter = f;
+
+ return AIL_ERROR_OK;
+}
+
+static inline void _destroy_cond(gpointer data, gpointer user_data)
+{
+ if (!data)
+ return;
+
+ struct element *cond;
+ cond = (struct element *)data;
+
+ int t;
+ ELEMENT_TYPE(cond, t);
+ if (VAL_TYPE_STR == t) {
+ if(ELEMENT_STR(cond)->value)
+ free(ELEMENT_STR(cond)->value);
+ }
+ free(cond);
+ return;
+}
+
+
+EXPORT_API ail_error_e ail_filter_destroy(ail_filter_h filter)
+{
+ retv_if (NULL == filter, AIL_ERROR_INVALID_PARAMETER);
+
+ if (filter->list){
+ g_slist_foreach(filter->list, _destroy_cond, NULL);
+ g_slist_free(filter->list);
+ }
+
+ free(filter);
+
+ return AIL_ERROR_OK;
+}
+
+EXPORT_API ail_error_e ail_filter_add_bool(ail_filter_h filter, const char *property, bool value)
+{
+ struct element *c;
+ ail_prop_bool_e prop;
+
+ retv_if (NULL == filter, AIL_ERROR_INVALID_PARAMETER);
+ retv_if (NULL == property, AIL_ERROR_INVALID_PARAMETER);
+
+ prop = _ail_convert_to_prop_bool(property);
+
+ if (prop < E_AIL_PROP_BOOL_MIN || prop > E_AIL_PROP_BOOL_MAX)
+ return AIL_ERROR_INVALID_PARAMETER;
+
+ c = (struct element *)calloc(1, sizeof(struct element_bool));
+ retv_if (NULL == c, AIL_ERROR_OUT_OF_MEMORY);
+
+ ELEMENT_BOOL(c)->prop = (int)prop;
+ ELEMENT_BOOL(c)->value = value;
+
+ _add_cond_to_filter(filter, c);
+
+ return AIL_ERROR_OK;
+}
+
+EXPORT_API ail_error_e ail_filter_add_int(ail_filter_h filter, const char *property, int value)
+{
+ struct element *c;
+ ail_prop_int_e prop;
+
+ retv_if (NULL == filter, AIL_ERROR_INVALID_PARAMETER);
+ retv_if (NULL == property, AIL_ERROR_INVALID_PARAMETER);
+
+ prop = _ail_convert_to_prop_int(property);
+
+ if (prop < E_AIL_PROP_INT_MIN || prop > E_AIL_PROP_INT_MAX)
+ return AIL_ERROR_INVALID_PARAMETER;
+
+ c = (struct element *)calloc(1, sizeof(struct element_int));
+ retv_if (NULL == c, AIL_ERROR_OUT_OF_MEMORY);
+
+ ELEMENT_INT(c)->prop = (int)prop;
+ ELEMENT_INT(c)->value = value;
+
+ _add_cond_to_filter(filter, c);
+
+ return AIL_ERROR_OK;
+}
+
+EXPORT_API ail_error_e ail_filter_add_str(ail_filter_h filter, const char *property, const char *value)
+{
+ struct element *c; //condition
+ ail_prop_str_e prop;
+
+ retv_if (NULL == filter, AIL_ERROR_INVALID_PARAMETER);
+ retv_if (NULL == property, AIL_ERROR_INVALID_PARAMETER);
+
+ prop = _ail_convert_to_prop_str(property);
+
+ if (prop < E_AIL_PROP_STR_MIN || prop > E_AIL_PROP_STR_MAX)
+ return AIL_ERROR_INVALID_PARAMETER;
+
+ retv_if (NULL == value, AIL_ERROR_INVALID_PARAMETER);
+ retv_if (strlen(value) == 0, AIL_ERROR_INVALID_PARAMETER);
+
+ c = (struct element *)calloc(1, sizeof(struct element_str));
+
+ retv_if (NULL == c, AIL_ERROR_OUT_OF_MEMORY);
+
+ ELEMENT_STR(c)->prop = (int)prop;
+ ELEMENT_STR(c)->value = strdup(value);
+ if (!ELEMENT_STR(c)->value) {
+ free(c);
+ return AIL_ERROR_OUT_OF_MEMORY;
+ }
+
+ _add_cond_to_filter(filter, c);
+
+ return AIL_ERROR_OK;
+}
+
+static void _get_condition(gpointer data, char **condition)
+{
+ struct element *e = (struct element *)data;
+ const char *f;
+ char buf[AIL_SQL_QUERY_MAX_LEN];
+
+ f = sql_get_filter(e->prop);
+ int t;
+ ELEMENT_TYPE(e, t);
+
+ switch (t) {
+ case VAL_TYPE_BOOL:
+ snprintf(buf, sizeof(buf), f, ELEMENT_BOOL(e)->value);
+ break;
+ case VAL_TYPE_INT:
+ snprintf(buf, sizeof(buf), f, ELEMENT_INT(e)->value);
+ break;
+ case VAL_TYPE_STR:
+ if (E_AIL_PROP_NAME_STR == e->prop) {
+ snprintf(buf, sizeof(buf), f, ELEMENT_STR(e)->value, ELEMENT_STR(e)->value);
+ } else {
+ snprintf(buf, sizeof(buf), f, ELEMENT_STR(e)->value);
+ }
+ break;
+ default:
+ _E("Invalid property type");
+ *condition = NULL;
+ return;
+ }
+
+ *condition = strdup(buf);
+
+ return;
+}
+
+char *_get_where_clause(ail_filter_h filter)
+{
+ char *c;
+ char w[AIL_SQL_QUERY_MAX_LEN] = {0,};
+ c = NULL;
+
+ GSList *l;
+
+ snprintf(w, AIL_SQL_QUERY_MAX_LEN, " WHERE ");
+
+ for (l = filter->list; l; l = g_slist_next(l)) {
+ _get_condition(l->data, &c);
+ if (!c) return NULL;
+ if (*c == 0) {
+ free(c);
+ return NULL;
+ }
+
+ strncat(w, c, sizeof(w)-strlen(w)-1);
+ w[sizeof(w)-1] = '\0';
+ if(c) free(c);
+
+ if (g_slist_next(l)) {
+ strncat(w, " and ", sizeof(w)-strlen(w)-1);
+ w[sizeof(w)-1] = '\0';
+ }
+ }
+
+ _D("where = %s", w);
+
+ return strdup(w);
+}
+
+EXPORT_API ail_error_e ail_filter_count_appinfo(ail_filter_h filter, int *cnt)
+{
+ char q[AIL_SQL_QUERY_MAX_LEN];
+ char *w;
+ char *tmp_q;
+ char *l;
+ int r;
+ int n;
+ sqlite3_stmt *stmt;
+
+ retv_if(!cnt, AIL_ERROR_INVALID_PARAMETER);
+
+ if (db_open(DB_OPEN_RO) != AIL_ERROR_OK)
+ return AIL_ERROR_DB_FAILED;
+
+ snprintf(q, sizeof(q), "SELECT COUNT (*) FROM %s", SQL_TBL_APP_INFO_WITH_LOCALNAME);
+
+ tmp_q = strdup(q);
+ retv_if (NULL == tmp_q, AIL_ERROR_OUT_OF_MEMORY);
+ l = sql_get_locale();
+ if (NULL == l) {
+ _E("Failed to get locale string");
+ free(tmp_q);
+ return AIL_ERROR_FAIL;
+ }
+ snprintf(q, sizeof(q), tmp_q, l);
+ free(l);
+ free(tmp_q);
+
+ if (filter && filter->list) {
+ w = _get_where_clause(filter);
+ retv_if (NULL == w, AIL_ERROR_FAIL);
+ strncat(q, w, sizeof(q)-strlen(q)-1);
+ q[sizeof(q)-1] = '\0';
+ free(w);
+ }
+
+ _D("Query = %s",q);
+
+ if (db_prepare(q, &stmt) != AIL_ERROR_OK) {
+ return AIL_ERROR_DB_FAILED;
+ }
+
+ r = db_step(stmt);
+ if (r == AIL_ERROR_OK) {
+ db_column_int(stmt, 0, &n);
+ *cnt = n;
+ }
+
+ db_finalize(stmt);
+
+ return r;
+}
+
+
+
+EXPORT_API ail_error_e ail_filter_list_appinfo_foreach(ail_filter_h filter, ail_list_appinfo_cb cb, void *user_data)
+{
+ char q[AIL_SQL_QUERY_MAX_LEN];
+ char *tmp_q;
+ char *w;
+ char *l;
+ ail_cb_ret_e r;
+ sqlite3_stmt *stmt;
+ ail_appinfo_h ai;
+
+ retv_if (NULL == cb, AIL_ERROR_INVALID_PARAMETER);
+
+ if (db_open(DB_OPEN_RO) != AIL_ERROR_OK)
+ return AIL_ERROR_DB_FAILED;
+
+ snprintf(q, sizeof(q), "SELECT %s FROM %s", SQL_FLD_APP_INFO_WITH_LOCALNAME, SQL_TBL_APP_INFO_WITH_LOCALNAME);
+
+ tmp_q = strdup(q);
+ retv_if (NULL == tmp_q, AIL_ERROR_OUT_OF_MEMORY);
+ l = sql_get_locale();
+ if (NULL == l) {
+ _E("Failed to get locale string");
+ free(tmp_q);
+ return AIL_ERROR_FAIL;
+ }
+ snprintf(q, sizeof(q), tmp_q, l);
+ free(l);
+ free(tmp_q);
+
+ if (filter && filter->list) {
+ w = _get_where_clause(filter);
+ retv_if (NULL == w, AIL_ERROR_FAIL);
+ strncat(q, w, sizeof(q)-strlen(q)-1);
+ q[sizeof(q)-1] = '\0';
+ strncat(q, " order by app_info.package", sizeof(q)-strlen(q)-1);
+ q[sizeof(q)-1] = '\0';
+ free(w);
+ }
+ else
+ _D("No filter exists. All records are retreived");
+
+ _D("Query = %s",q);
+
+ if (db_prepare(q, &stmt) != AIL_ERROR_OK) {
+ return AIL_ERROR_DB_FAILED;
+ }
+
+ ai = appinfo_create();
+
+ appinfo_set_stmt(ai, stmt);
+ while (db_step(stmt) == AIL_ERROR_OK) {
+
+ r = cb(ai, user_data);
+ if (AIL_CB_RET_CANCEL == r)
+ break;
+ }
+ appinfo_destroy(ai);
+
+ db_finalize(stmt);
+
+ return AIL_ERROR_OK;
+}
+
diff --git a/src/ail_package.c b/src/ail_package.c
new file mode 100755
index 0000000..82af08d
--- /dev/null
+++ b/src/ail_package.c
@@ -0,0 +1,495 @@
+/*
+ * ail
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>, Jaeho Lee <jaeho81.lee@samsung.com>
+ *
+ * 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 <string.h>
+#include <stdlib.h>
+#include <db-util.h>
+#include <vconf.h>
+#include "ail.h"
+#include "ail_private.h"
+#include "ail_convert.h"
+#include "ail_db.h"
+#include "ail_sql.h"
+#include "ail_package.h"
+#include <assert.h>
+#include <unistd.h>
+
+#define LANGUAGE_LENGTH 2
+#define DEFAULT_LOCALE "No Locale"
+#define MAX_QUERY_LEN 4096
+
+struct ail_appinfo {
+ char **values;
+ sqlite3_stmt *stmt;
+};
+
+typedef struct _pkgmgr_locale_x {
+ char *locale;
+} pkgmgr_locale_x;
+
+
+/* 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 __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 locale from localname where package='%s' and locale='%s')", appid, locale);
+ db_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 locale from localname where package='%s' and locale like '%s%s')", appid, lang, wildcard);
+ db_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) {
+ _E("Out of Memory!!!\n");
+ return NULL;
+ }
+ memset(info, NULL, sizeof(*info));
+
+ strncpy(lang, locale, 2);
+ snprintf(query, MAX_QUERY_LEN, "select locale from localname where package='%s' and locale like '%s%s'", appid, lang, wildcard);
+ db_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) {
+ _E("Malloc Failed\n");
+ return NULL;
+ }
+
+ sprintf(locale, "%c%c_%c%c", syslocale[0], syslocale[1], toupper(syslocale[3]), toupper(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) {
+ _D("%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);
+ _D("%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);
+ _D("%s DEFAULT_LOCALE)\n", appid);
+ return strdup(DEFAULT_LOCALE);
+}
+
+void appinfo_set_stmt(ail_appinfo_h ai, sqlite3_stmt *stmt)
+{
+ ai->stmt = stmt;
+}
+
+ail_appinfo_h appinfo_create(void)
+{
+ ail_appinfo_h ai;
+ ai = calloc(1, sizeof(struct ail_appinfo));
+ retv_if (NULL == ai, NULL);
+ ai->stmt = NULL;
+
+ return ai;
+}
+
+void appinfo_destroy(ail_appinfo_h ai)
+{
+ if (ai)
+ free(ai);
+}
+
+
+
+static ail_error_e _retrieve_all_column(ail_appinfo_h ai)
+{
+ int i, j;
+ ail_error_e err;
+ char *col;
+
+ retv_if(!ai, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!ai->stmt, AIL_ERROR_INVALID_PARAMETER);
+
+ ai->values = calloc(NUM_OF_PROP, sizeof(char *));
+ retv_if(!ai->values, AIL_ERROR_OUT_OF_MEMORY);
+
+ for (i = 0; i < NUM_OF_PROP; i++) {
+ err = db_column_str(ai->stmt, i, &col);
+ if (AIL_ERROR_OK != err)
+ break;
+
+ if (!col) {
+ ai->values[i] = NULL;
+ } else {
+ ai->values[i] = strdup(col);
+ if (!ai->values[i]) {
+ err = AIL_ERROR_OUT_OF_MEMORY;
+ break;
+ }
+ }
+ }
+
+ if (err < 0) {
+ for (j = 0; j < i; ++j) {
+ if (ai->values[j])
+ free(ai->values[j]);
+ }
+ if (ai->values)
+ free(ai->values);
+ return err;
+ } else
+ return AIL_ERROR_OK;
+}
+
+
+EXPORT_API ail_error_e ail_package_destroy_appinfo(ail_appinfo_h ai)
+{
+ return ail_destroy_appinfo(ai);
+}
+
+EXPORT_API ail_error_e ail_destroy_appinfo(ail_appinfo_h ai)
+{
+ int i;
+
+ retv_if(!ai, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!ai->values, AIL_ERROR_INVALID_PARAMETER);
+
+ for (i = 0; i < NUM_OF_PROP; i++) {
+ if (ai->values[i]) {
+ free(ai->values[i]);
+ }
+ }
+
+ free(ai->values);
+ free(ai);
+
+ return AIL_ERROR_OK;
+}
+
+
+EXPORT_API ail_error_e ail_package_get_appinfo(const char *package, ail_appinfo_h *ai)
+{
+ return ail_get_appinfo(package, ai);
+}
+
+
+EXPORT_API ail_error_e ail_get_appinfo(const char *appid, ail_appinfo_h *ai)
+{
+ ail_error_e ret;
+ char query[AIL_SQL_QUERY_MAX_LEN];
+ sqlite3_stmt *stmt = NULL;
+ char w[AIL_SQL_QUERY_MAX_LEN];
+
+ retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!ai, AIL_ERROR_INVALID_PARAMETER);
+
+ *ai = appinfo_create();
+ retv_if(!*ai, AIL_ERROR_OUT_OF_MEMORY);
+
+ snprintf(w, sizeof(w), sql_get_filter(E_AIL_PROP_X_SLP_APPID_STR), appid);
+
+ snprintf(query, sizeof(query), "SELECT %s FROM %s WHERE %s",SQL_FLD_APP_INFO, SQL_TBL_APP_INFO, w);
+
+ do {
+ ret = db_open(DB_OPEN_RO);
+ if (ret < 0) break;
+
+ ret = db_prepare(query, &stmt);
+ if (ret < 0) break;
+
+ ret = db_step(stmt);
+ if (ret < 0) {
+ db_finalize(stmt);
+ break;
+ }
+
+ (*ai)->stmt = stmt;
+
+ ret = _retrieve_all_column(*ai);
+ if (ret < 0) {
+ db_finalize((*ai)->stmt);
+ break;
+ }
+
+ ret = db_finalize((*ai)->stmt);
+ if (ret < 0) break;
+ (*ai)->stmt = NULL;
+
+ return AIL_ERROR_OK;
+ } while(0);
+
+ appinfo_destroy(*ai);
+
+ return ret;
+}
+
+
+EXPORT_API ail_error_e ail_appinfo_get_bool(const ail_appinfo_h ai, const char *property, bool *value)
+{
+ ail_prop_bool_e prop;
+ int val;
+
+ retv_if(!ai, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!property, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
+
+ prop = _ail_convert_to_prop_bool(property);
+
+ if (prop < E_AIL_PROP_BOOL_MIN || prop > E_AIL_PROP_BOOL_MAX)
+ return AIL_ERROR_INVALID_PARAMETER;
+
+ if (ai->stmt) {
+ int index;
+ index = sql_get_app_info_idx(prop);
+ if (db_column_bool(ai->stmt, index, value) < 0)
+ return AIL_ERROR_DB_FAILED;
+ } else {
+ val = atoi(ai->values[prop]);
+ *value = (val == 0? false : true);
+ }
+ return AIL_ERROR_OK;
+}
+
+
+
+EXPORT_API ail_error_e ail_appinfo_get_int(const ail_appinfo_h ai, const char *property, int *value)
+{
+ ail_prop_int_e prop;
+
+ retv_if(!ai, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!property, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
+
+ prop = _ail_convert_to_prop_int(property);
+
+ if (prop < E_AIL_PROP_INT_MIN || prop > E_AIL_PROP_INT_MAX)
+ return AIL_ERROR_INVALID_PARAMETER;
+
+ if (ai->stmt) {
+ int index;
+ index = sql_get_app_info_idx(prop);
+ if (db_column_int(ai->stmt, index, value) < 0)
+ return AIL_ERROR_DB_FAILED;
+ } else
+ *value = atoi(ai->values[prop]);
+
+ return AIL_ERROR_OK;
+}
+
+#define QUERY_GET_LOCALNAME "select name from localname where package='%s' and locale='%s'"
+
+char *appinfo_get_localname(const char *package, char *locale)
+{
+ db_open(DB_OPEN_RO);
+ sqlite3_stmt *stmt;
+ char *str = NULL;
+ char *localname;
+ char query[512];
+
+ snprintf(query, sizeof(query), QUERY_GET_LOCALNAME, package, locale);
+
+ _D("Query = %s",query);
+ retv_if (db_prepare(query, &stmt) < 0, NULL);
+
+ do {
+ if (db_step(stmt) < 0)
+ break;
+ if (db_column_str(stmt, 0, &str) < 0)
+ break;
+ if (str)
+ localname = strdup(str);
+ else
+ localname = NULL;
+
+ db_finalize(stmt);
+
+ return localname;
+ } while(0);
+
+ db_finalize(stmt);
+ return NULL;
+}
+
+
+EXPORT_API ail_error_e ail_appinfo_get_str(const ail_appinfo_h ai, const char *property, char **str)
+{
+ int index;
+ char *value;
+ char *pkg;
+ char *pkg_type;
+ char *locale, *localname;
+ ail_prop_str_e prop;
+ char *locale_new;
+
+ retv_if(!ai, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!property, AIL_ERROR_INVALID_PARAMETER);
+ retv_if(!str, AIL_ERROR_INVALID_PARAMETER);
+
+ prop = _ail_convert_to_prop_str(property);
+
+ if (prop < E_AIL_PROP_STR_MIN || prop > E_AIL_PROP_STR_MAX)
+ return AIL_ERROR_INVALID_PARAMETER;
+
+ localname = NULL;
+
+ if (E_AIL_PROP_NAME_STR == prop) {
+ if (ai->stmt) {
+ if (db_column_str(ai->stmt, E_AIL_PROP_X_SLP_PACKAGETYPE_STR, &pkg_type) < 0)
+ return AIL_ERROR_DB_FAILED;
+ if(pkg_type && (strcasecmp(pkg_type, "tpk") ==0))
+ {
+ locale = sql_get_locale();
+ retv_if (NULL == locale, AIL_ERROR_FAIL);
+
+ if (db_column_str(ai->stmt, E_AIL_PROP_PACKAGE_STR, &pkg) < 0){
+ free(locale);
+ return AIL_ERROR_DB_FAILED;
+ }
+ if (pkg == NULL){
+ free(locale);
+ return AIL_ERROR_DB_FAILED;
+ }
+
+ locale_new = __get_app_locale_by_fallback(pkg, locale);
+ localname = (char *)appinfo_get_localname(pkg,locale_new);
+ free(locale);
+ free(locale_new);
+ } else {
+ if (db_column_str(ai->stmt, SQL_LOCALNAME_IDX, &localname) < 0)
+ return AIL_ERROR_DB_FAILED;
+ }
+ } else {
+ pkg_type = ai->values[E_AIL_PROP_X_SLP_PACKAGETYPE_STR];
+ pkg = ai->values[E_AIL_PROP_PACKAGE_STR];
+ retv_if (NULL == pkg, AIL_ERROR_FAIL);
+
+ locale = sql_get_locale();
+ retv_if (NULL == locale, AIL_ERROR_FAIL);
+
+ if(pkg_type && (strcasecmp(pkg_type, "tpk") ==0))
+ {
+ locale_new = __get_app_locale_by_fallback(pkg, locale);
+ localname = (char *)appinfo_get_localname(pkg,locale_new);
+ free(locale);
+ free(locale_new);
+ } else {
+ localname = (char *)appinfo_get_localname(pkg,locale);
+ free(locale);
+ }
+ }
+
+ if (localname) {
+ if (!ai->stmt) {
+ if (ai->values) {
+ if (ai->values[prop])
+ free(ai->values[prop]);
+ ai->values[prop] = localname;
+ }
+ }
+ *str = localname;
+ return AIL_ERROR_OK;
+ }
+ }
+
+ if (ai->stmt) {
+ index = sql_get_app_info_idx(prop);
+ if (db_column_str(ai->stmt, index, &value) < 0){
+ return AIL_ERROR_DB_FAILED;
+ }
+ *str = value;
+ } else
+ *str = ai->values[prop];
+
+ return AIL_ERROR_OK;
+}
+
+
+// End of file
diff --git a/src/ail_package.h b/src/ail_package.h
new file mode 100755
index 0000000..9270334
--- /dev/null
+++ b/src/ail_package.h
@@ -0,0 +1,35 @@
+/*
+ * ail
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>, Jaeho Lee <jaeho81.lee@samsung.com>
+ *
+ * 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 __AIL_PACKAGE_H__
+#define __AIL_PACKAGE_H__
+
+#include <sqlite3.h>
+#include "ail.h"
+
+ail_appinfo_h appinfo_create(void);
+void appinfo_destroy(ail_appinfo_h ai);
+void appinfo_set_stmt(ail_appinfo_h ai, sqlite3_stmt *stmt);
+
+#endif /* __AIL_PACKAGE_H__ */
diff --git a/src/ail_private.h b/src/ail_private.h
new file mode 100755
index 0000000..c7d1130
--- /dev/null
+++ b/src/ail_private.h
@@ -0,0 +1,166 @@
+/*
+ * ail
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>, Jaeho Lee <jaeho81.lee@samsung.com>
+ *
+ * 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 __AIL_PRIVATE_H__
+#define __AIL_PRIVATE_H__
+
+#include <stdbool.h>
+#include <sqlite3.h>
+
+#ifndef EXPORT_API
+#define EXPORT_API __attribute__ ((visibility("default")))
+#endif
+
+#undef LOG_TAG
+#define LOG_TAG "AIL"
+
+#if 1
+#include <dlog.h>
+#define _E(fmt, arg...) LOGE("[%s,%d] "fmt,__FUNCTION__,__LINE__,##arg)
+#define _D(fmt, arg...) LOGD("[%s,%d] "fmt,__FUNCTION__,__LINE__,##arg)
+#else
+#include <stdio.h>
+#define _E(fmt, arg...) fprintf(stderr, "[%s,%d] "fmt,__FUNCTION__,__LINE__,##arg)
+#define _D(fmt, arg...) fprintf(stderr, "[%s,%d] "fmt,__FUNCTION__,__LINE__,##arg)
+#endif
+
+#define retv_if(expr, val) do { \
+ if(expr) { \
+ _E("(%s) -> %s() return\n", #expr, __FUNCTION__); \
+ return (val); \
+ } \
+} while (0)
+
+#define SAFE_FREE_AND_STRDUP(from, to) do { \
+ if (to) free(to); \
+ to = strdup(from); \
+} while (0)
+
+#define SAFE_FREE(ptr) do { \
+ if (ptr) free(ptr); \
+} while (0)
+
+struct element {
+ int prop;
+};
+
+struct element_int {
+ int prop;
+ int value;
+};
+
+struct element_bool {
+ int prop;
+ bool value;
+};
+
+struct element_str {
+ int prop;
+ char *value;
+};
+
+enum {
+ VAL_TYPE_BOOL,
+ VAL_TYPE_INT,
+ VAL_TYPE_STR,
+};
+
+#define ELEMENT_INT(e) ((struct element_int *)(e))
+#define ELEMENT_STR(e) ((struct element_str *)(e))
+#define ELEMENT_BOOL(e) ((struct element_bool *)(e))
+
+#define AIL_SQL_QUERY_MAX_LEN 2048
+#define APP_INFO_DB "/opt/dbspace/.app_info.db"
+
+#define ELEMENT_TYPE(e, t) do { \
+ if(e->prop >= E_AIL_PROP_STR_MIN && e->prop <= E_AIL_PROP_STR_MAX) t= (int)VAL_TYPE_STR; \
+ else if (e->prop >= E_AIL_PROP_INT_MIN && e->prop <= E_AIL_PROP_INT_MAX) t= (int)VAL_TYPE_INT; \
+ else if (e->prop >= E_AIL_PROP_BOOL_MIN && e->prop <= E_AIL_PROP_BOOL_MAX) t= (int)VAL_TYPE_BOOL; \
+ else t = -1; \
+} while(0)
+
+
+#define PROP_TYPE(p, t) do { \
+ if(p >= E_AIL_PROP_STR_MIN && p <= E_AIL_PROP_STR_MAX) t= (int)VAL_TYPE_STR; \
+ else if (p >= E_AIL_PROP_INT_MIN && p <= E_AIL_PROP_INT_MAX) t= (int)VAL_TYPE_INT; \
+ else if (p >= E_AIL_PROP_BOOL_MIN && p <= E_AIL_PROP_BOOL_MAX) t= (int)VAL_TYPE_BOOL; \
+ else t = NULL; \
+} while(0)
+
+
+/**
+ * @brief string type properties
+ */
+typedef enum {
+ E_AIL_PROP_STR_MIN = 0,
+ E_AIL_PROP_PACKAGE_STR = E_AIL_PROP_STR_MIN,
+ E_AIL_PROP_EXEC_STR,
+ E_AIL_PROP_NAME_STR,
+ E_AIL_PROP_TYPE_STR,
+ E_AIL_PROP_ICON_STR,
+ E_AIL_PROP_CATEGORIES_STR,
+ E_AIL_PROP_VERSION_STR,
+ E_AIL_PROP_MIMETYPE_STR,
+ E_AIL_PROP_X_SLP_SERVICE_STR,
+ E_AIL_PROP_X_SLP_PACKAGETYPE_STR,
+ E_AIL_PROP_X_SLP_PACKAGECATEGORIES_STR,
+ E_AIL_PROP_X_SLP_PACKAGEID_STR,
+ E_AIL_PROP_X_SLP_URI_STR,
+ E_AIL_PROP_X_SLP_SVC_STR,
+ E_AIL_PROP_X_SLP_EXE_PATH,
+ E_AIL_PROP_X_SLP_APPID_STR,
+ E_AIL_PROP_X_SLP_PKGID_STR,
+ E_AIL_PROP_X_SLP_DOMAIN_STR,
+ E_AIL_PROP_STR_MAX = E_AIL_PROP_X_SLP_DOMAIN_STR,
+} ail_prop_str_e;
+
+
+/**
+ * @brief integer type properties
+ */
+typedef enum {
+ E_AIL_PROP_INT_MIN = E_AIL_PROP_STR_MAX + 1,
+ E_AIL_PROP_X_SLP_TEMP_INT = E_AIL_PROP_INT_MIN,
+ E_AIL_PROP_X_SLP_INSTALLEDTIME_INT,
+ E_AIL_PROP_INT_MAX = E_AIL_PROP_X_SLP_INSTALLEDTIME_INT,
+} ail_prop_int_e;
+
+
+/**
+ * @brief boolean type properties
+ */
+typedef enum {
+ E_AIL_PROP_BOOL_MIN = E_AIL_PROP_INT_MAX + 1,
+ E_AIL_PROP_NODISPLAY_BOOL = E_AIL_PROP_BOOL_MIN,
+ E_AIL_PROP_X_SLP_TASKMANAGE_BOOL,
+ E_AIL_PROP_X_SLP_MULTIPLE_BOOL,
+ E_AIL_PROP_X_SLP_REMOVABLE_BOOL,
+ E_AIL_PROP_X_SLP_ISHORIZONTALSCALE_BOOL,
+ E_AIL_PROP_X_SLP_INACTIVATED_BOOL,
+ E_AIL_PROP_BOOL_MAX = E_AIL_PROP_X_SLP_INACTIVATED_BOOL,
+} ail_prop_bool_e;
+
+#define NUM_OF_PROP E_AIL_PROP_BOOL_MAX + 1
+
+#endif
diff --git a/src/ail_sql.c b/src/ail_sql.c
new file mode 100755
index 0000000..3b01254
--- /dev/null
+++ b/src/ail_sql.c
@@ -0,0 +1,91 @@
+/*
+ * ail
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>, Jaeho Lee <jaeho81.lee@samsung.com>
+ *
+ * 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 <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "ail.h"
+#include "ail_sql.h"
+#include "ail_db.h"
+#include "vconf.h"
+#include "ail_private.h"
+
+static const char *filter[] = {
+ "app_info.PACKAGE='%s'",
+ "app_info.EXEC='%s'",
+ "((localname.name is NULL and app_info.name like '%%%s%%') or (localname.name like '%%%s%%'))",
+ "app_info.TYPE like '%%%s%%'",
+ "app_info.ICON='%s'",
+ "app_info.CATEGORIES like '%%%s%%'",
+ "app_info.VERSION='%s'",
+ "app_info.MIMETYPE like '%%%s%%'",
+ "app_info.X_SLP_SERVICE like '%%%s%%'",
+ "app_info.X_SLP_PACKAGETYPE='%s'",
+ "app_info.X_SLP_PACKAGECATEGORIES like '%%%s%%'",
+ "app_info.X_SLP_PACKAGEID='%s'",
+ "app_info.X_SLP_URI='%s'",
+ "app_info.X_SLP_SVC like '%%%s%%'",
+ "app_info.X_SLP_EXE_PATH='%s'",
+ "app_info.X_SLP_APPID='%s'",
+ "app_info.X_SLP_PKGID='%s'",
+ "app_info.X_SLP_DOMAIN='%s'",
+ "app_info.X_SLP_BASELAYOUTWIDTH=%d",
+ "app_info.X_SLP_INSTALLEDTIME=%d",
+ "app_info.NODISPLAY=%d",
+ "app_info.X_SLP_TASKMANAGE=%d",
+ "app_info.X_SLP_MULTIPLE=%d",
+ "app_info.X_SLP_REMOVABLE=%d",
+ "app_info.X_SLP_ISHORIZONTALSCALE=%d",
+ "app_info.X_SLP_INACTIVATED=%d",
+ NULL,
+};
+
+
+inline const char *sql_get_filter(int prop)
+{
+ retv_if(prop < 0 || prop >= NUM_OF_PROP , NULL);
+ return filter[prop];
+}
+
+
+inline char *sql_get_locale(void)
+{
+ char *l;
+ char *r;
+ char buf[6];
+
+ retv_if ((l = vconf_get_str(VCONFKEY_LANGSET)) == NULL, NULL);
+ snprintf(buf, sizeof(buf), "%s", l);
+ free(l);
+
+ r = strdup(buf);
+
+ return r;
+}
+
+inline int sql_get_app_info_idx(int prop)
+{
+ return prop;
+}
+
+// End of file
diff --git a/src/ail_sql.h b/src/ail_sql.h
new file mode 100755
index 0000000..8ec0a40
--- /dev/null
+++ b/src/ail_sql.h
@@ -0,0 +1,69 @@
+/*
+ * ail
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>, Jaeho Lee <jaeho81.lee@samsung.com>
+ *
+ * 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 __AIL_SQL_H__
+#define __AIL_SQL_H__
+
+#include "ail.h"
+
+#define SQL_TBL_APP_INFO "app_info"
+#define SQL_TBL_APP_INFO_WITH_LOCALNAME "app_info LEFT OUTER JOIN localname " \
+ "ON app_info.package=localname.package " \
+ "and locale='%s'"
+
+#define SQL_FLD_APP_INFO "app_info.PACKAGE," \
+ "app_info.EXEC," \
+ "app_info.NAME," \
+ "app_info.TYPE," \
+ "app_info.ICON," \
+ "app_info.CATEGORIES," \
+ "app_info.VERSION," \
+ "app_info.MIMETYPE," \
+ "app_info.X_SLP_SERVICE," \
+ "app_info.X_SLP_PACKAGETYPE," \
+ "app_info.X_SLP_PACKAGECATEGORIES," \
+ "app_info.X_SLP_PACKAGEID," \
+ "app_info.X_SLP_URI," \
+ "app_info.X_SLP_SVC," \
+ "app_info.X_SLP_EXE_PATH," \
+ "app_info.X_SLP_APPID," \
+ "app_info.X_SLP_PKGID," \
+ "app_info.X_SLP_DOMAIN," \
+ "app_info.X_SLP_BASELAYOUTWIDTH," \
+ "app_info.X_SLP_INSTALLEDTIME," \
+ "app_info.NODISPLAY," \
+ "app_info.X_SLP_TASKMANAGE," \
+ "app_info.X_SLP_MULTIPLE," \
+ "app_info.X_SLP_REMOVABLE," \
+ "app_info.X_SLP_ISHORIZONTALSCALE," \
+ "app_info.X_SLP_INACTIVATED" \
+
+
+#define SQL_FLD_APP_INFO_WITH_LOCALNAME SQL_FLD_APP_INFO",""localname.name"
+#define SQL_LOCALNAME_IDX NUM_OF_PROP + 0
+
+const char *sql_get_filter(int prop);
+char *sql_get_locale();
+int sql_get_app_info_idx(int prop);
+
+#endif /* __AIL_SQL_H__ */