Upload Tizen2.0 source 2.0alpha master 2.0_alpha submit/master/20120920.151019
authorSewook Park <sewook7.park@samsung.com>
Tue, 21 Aug 2012 10:59:36 +0000 (19:59 +0900)
committerSewook Park <sewook7.park@samsung.com>
Tue, 21 Aug 2012 10:59:36 +0000 (19:59 +0900)
19 files changed:
CMakeLists.txt
debian/README [changed mode: 0755->0644]
debian/capi-appfw-app-manager-dev.install [changed mode: 0755->0644]
debian/capi-appfw-app-manager-dev.postinst [changed mode: 0755->0644]
debian/capi-appfw-app-manager.install [changed mode: 0755->0644]
debian/capi-appfw-app-manager.postinst [changed mode: 0755->0644]
debian/changelog [changed mode: 0755->0644]
debian/compat [changed mode: 0755->0644]
debian/control
include/app_context.h [new file with mode: 0755]
include/app_info.h [new file with mode: 0755]
include/app_manager.h
include/app_manager_deprecated.h [new file with mode: 0755]
include/app_manager_private.h
packaging/capi-appfw-app-manager.spec [changed mode: 0755->0644]
src/app_context.c [new file with mode: 0755]
src/app_info.c [new file with mode: 0755]
src/app_manager.c
src/app_manager_deprecated.c [new file with mode: 0755]

index 5d95bd9..3f23595 100755 (executable)
@@ -10,7 +10,7 @@ SET(PREFIX ${CMAKE_INSTALL_PREFIX})
 SET(INC_DIR include)
 INCLUDE_DIRECTORIES(${INC_DIR})
 
-SET(requires "capi-base-common dlog vconf aul ail pkgmgr")
+SET(requires "capi-base-common dlog vconf aul ail pkgmgr glib-2.0")
 SET(pc_requires "capi-base-common")
 
 INCLUDE(FindPkgConfig)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index b7c47e4..95f103f
@@ -1,17 +1,48 @@
+capi-appfw-app-manager (0.1.0-11) unstable; urgency=low
+
+  * Added App-Context API
+  * Added functions to resume and terminate the running app
+  * Git: slp/api/app-manager
+  * Tag: capi-appfw-app-manager_0.1.0-11
+
+ -- Junghyuk Park <junghyuk.park@samsung.com>  Thu, 31 May 2012 19:55:22 +0900
+
+capi-appfw-app-manager (0.1.0-10) unstable; urgency=low
+
+  * Removed filter in app_manager_foreach_app_installed API
+  * Git: slp/api/app-manager
+  * Tag: capi-appfw-app-manager_0.1.0-10
+
+ -- Jaeho Lee <jaeho81.lee@samsung.com>  Thu, 17 May 2012 21:29:00 +0900
+
 capi-appfw-app-manager (0.1.0-9) unstable; urgency=low
 
   * Updated build configuration
-  * App-list APIs are re-implemented by package-manager lib
-  * Updated for AIL API changes
-  * Git: api/app-manager
+  * Git: slp/api/app-manager
   * Tag: capi-appfw-app-manager_0.1.0-9
 
  -- Junghyuk Park <junghyuk.park@samsung.com>  Thu, 15 Mar 2012 11:37:29 +0900
 
+capi-appfw-app-manager (0.1.0-8) unstable; urgency=low
+
+  * Updated for AIL API changes
+  * Git: slp/api/app-manager
+  * Tag: capi-appfw-app-manager_0.1.0-8
+
+ -- Junghyuk Park <junghyuk.park@samsung.com>  Mon, 05 Mar 2012 19:11:54 +0900
+
+capi-appfw-app-manager (0.1.0-7) unstable; urgency=low
+
+  * App-list APIs are re-implemented by package-manager lib
+  * Git: slp/api/app-manager
+  * Tag: capi-appfw-app-manager_0.1.0-7
+
+ -- Junghyuk Park <junghyuk.park@samsung.com>  Wed, 29 Feb 2012 15:25:19 +0900
+
 capi-appfw-app-manager (0.1.0-6) unstable; urgency=low
 
   * Added version numbering
-  * Git: api/app-manager
+  * Git: slp/api/app-manager
   * Tag: capi-appfw-app-manager_0.1.0-6
 
  -- Kyuhun Jung <kyuhun.jung@samsung.com>  Wed, 15 Feb 2012 10:48:50 +0900
@@ -19,13 +50,89 @@ capi-appfw-app-manager (0.1.0-6) unstable; urgency=low
 capi-appfw-app-manager (0.1.0-5) unstable; urgency=low
 
   * Changed function signature : app_manager_unset_app_list_changed_cb()
-  * Git: api/app-manager
+  * Git: slp/api/app-manager
   * Tag: capi-appfw-app-manager_0.1.0-5
 
  -- Kyuhun Jung <kyuhun.jung@samsung.com>  Mon, 30 Jan 2012 13:57:12 +0900
 
 capi-appfw-app-manager (0.1.0-4) unstable; urgency=low
 
-  * Initial release.
+  * Delete app_manager_get_app_type() API
+  * Git: slp/api/app-manager
+  * Tag: capi-appfw-app-manager_0.1.0-4
+
+ -- Kyuhun Jung <kyuhun.jung@samsung.com>  Mon, 19 Dec 2011 11:07:58 +0300
+
+capi-appfw-app-manager (0.1.0-3) unstable; urgency=low
+
+  * Update boilerplate
+  * Git: slp/api/app-manager
+  * Tag: capi-appfw-app-manager_0.1.0-3
+
+ -- Kyuhun Jung <kyuhun.jung@samsung.com>  Tue, 06 Dec 2011 12:44:34 +0300
+
+capi-appfw-app-manager (0.1.0-2) unstable; urgency=low
+
+  * Using Tizen namespace
+  * Git: slp-source.sec.samsung.net:slp/api/app-manager
+  * Tag: capi-appfw-app-manager_0.1.0-2
+
+ -- Kyuhun Jung <kyuhun.jung@samsung.com>  Wed, 23 Nov 2011 07:11:03 +0300
+
+capi-appfw-app-manager (0.1.0-1) unstable; urgency=low
+
+  * Alpha release
+  * Git: slp-source.sec.samsung.net:slp/api/app-manager
+  * Tag: capi-appfw-app-manager_0.1.0-1
+ -- Kyuhun Jung <kyuhun.jung@samsung.com>  Tue, 27 Sep 2011 20:49:05 +0900
+
+capi-appfw-app-manager (0.0.1-5) unstable; urgency=low
+
+  * foreach function name is changed for consistency
+  * Git: slp-source.sec.samsung.net:slp/api/app-manager
+  * Tag: capi-appfw-app-manager_0.0.1-5
+
+ -- Kyuhun Jung <kyuhun.jung@samsung.com>  Mon, 26 Sep 2011 15:01:59 +0900
+
+capi-appfw-app-manager (0.0.1-4) unstable; urgency=low
+
+  * Change API names for consistency
+  * app_manager_get_application_name -> app_manager_get_app_name
+  * app_manager_get_application_type -> app_manager_get_app_type
+  * app_manager_get_application_icon_path -> app_manager_get_app_icon_path
+  * app_manager_get_application_version -> app_manager_get_app_version
+  * app_manager_set_applist_changed_cb -> app_manager_set_app_list_changed_cb
+  * app_manager_unset_applist_changed_cb -> app_manager_unset_app_list_changed_cb
+  * Git: slp-source.sec.samsung.net:slp/api/app-manager
+  * Tag: capi-appfw-app-manager_0.0.1-4
+
+
+ -- Kyuhun Jung <kyuhun.jung@samsung.com>  Mon, 05 Sep 2011 19:12:37 +0900
+
+capi-appfw-app-manager (0.0.1-3) unstable; urgency=low
+
+  * some APIs are changed
+  * Return type of app_manager_unset_applist_changed_cb
+  * app_list_cb api's  pacakge parameter
+  * Git: slp-source.sec.samsung.net:slp/api/app-manager
+  * Tag: capi-appfw-app-manager_0.0.1-3 
+
+ -- Kyuhun Jung <kyuhun.jung@samsung.com>  Thu, 25 Aug 2011 20:25:43 +0900
+
+capi-appfw-app-manager (0.0.1-2) unstable; urgency=low
+
+  * Add application database API
+  * Git: slp-source.sec.samsung.net:slp/api/app-manager
+  * Tag: capi-appfw-app-manager_0.0.1-2
+
+ -- Kyuhun Jung <kyuhun.jung@samsung.com>  Mon, 22 Aug 2011 20:41:58 +0900
+
+capi-appfw-app-manager (0.0.1-1) unstable; urgency=low
+
+  * Initial upload
+  * Git: slp-source.sec.samsung.net:slp/api/app-manager
+  * Tag: capi-appfw-app-manager_0.0.1-1
+
+ -- Woongsuk Cho <ws77.cho@samsung.com>  Thu, 04 Aug 2011 18:49:46 +0900
 
- -- Kyuhun Jung <kyuhun.jung@samsung.com>  Wed, 07 Dec 2011 05:33:23 +0300
old mode 100755 (executable)
new mode 100644 (file)
index 45102ab..710fff9 100755 (executable)
@@ -2,8 +2,8 @@
 Source: capi-appfw-app-manager
 Section: libs
 Priority: extra
-Maintainer: Woongsuk Cho <ws77.cho@samsung.com>, junghyuk park <junghyuk.park@samsung.com>
-Build-Depends: debhelper (>= 5), dlog-dev, libaul-1-dev, capi-base-common-dev, libail-0-dev, libvconf-dev, libpkgmgr-client-dev
+Maintainer: Woongsuk Cho <ws77.cho@samsung.com>, junghyuk park <junghyuk.park@samsung.com>, Jaeho Lee <jaeho81.lee@samsung.com>
+Build-Depends: debhelper (>= 5), dlog-dev, libaul-1-dev, capi-base-common-dev, libail-0-dev, libvconf-dev, libpkgmgr-client-dev, libglib2.0-dev
 
 Package: capi-appfw-app-manager
 Architecture: any
diff --git a/include/app_context.h b/include/app_context.h
new file mode 100755 (executable)
index 0000000..79e8eb1
--- /dev/null
@@ -0,0 +1,159 @@
+/*
+ * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License. 
+ */
+
+#ifndef __TIZEN_APPFW_APP_CONTEXT_H
+#define __TIZEN_APPFW_APP_CONTEXT_H
+
+#include <sys/types.h>
+#include <tizen.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/**
+ * @defgroup CAPI_APP_CONTEXT_MODULE Application Context
+ * @ingroup CAPI_APPLICATION_MANAGER_MODULE
+ */
+
+
+/**
+ * @addtogroup CAPI_APP_CONTEXT_MODULE
+ * @{
+ */
+
+
+/**
+ * @brief Application context handle.
+ */
+typedef struct app_context_s *app_context_h;
+
+
+/**
+ * @brief Enumerations of event type for the application context event
+ */
+typedef enum
+{
+       APP_CONTEXT_EVENT_LAUNCHED, /**< The application is launched */
+       APP_CONTEXT_EVENT_TERMINATED, /**< The application is terminated */
+} app_context_event_e;
+
+
+/**
+ * @brief Destroys the application context handle and releases all its resources.
+ * @param [in] app_context The application context handle
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #APP_MANAGER_ERROR_NONE Successful
+ * @retval #APP_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @see app_manager_foreach_app_context()
+ * @see app_manager_get_app_context()
+ */
+int app_context_destroy(app_context_h app_context);
+
+
+/**
+ * @brief Gets the package with the given application context.
+ * @remark This function is @b deprecated. Use app_context_get_app_id() instead.
+ * @remarks @a package must be released with free() by you.
+ * @param [in] app_context The application context
+ * @param [out] package The package of the given application context
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #APP_MANAGER_ERROR_NONE Successful
+ * @retval #APP_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #APP_MANAGER_ERROR_DB_FAILED Database error occurred
+ * @retval #APP_MANAGER_ERROR_OUT_OF_MEMORY Out of memory
+ */
+int app_context_get_package(app_context_h app_context, char **package);
+
+
+/**
+ * @brief Gets the application ID with the given application context.
+ * @remarks @a app_id must be released with free() by you.
+ * @param [in] app_context The application context
+ * @param [out] app_id The application ID of the given application context
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #APP_MANAGER_ERROR_NONE Successful
+ * @retval #APP_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #APP_MANAGER_ERROR_DB_FAILED Database error occurred
+ * @retval #APP_MANAGER_ERROR_OUT_OF_MEMORY Out of memory
+ */
+int app_context_get_app_id(app_context_h app_context, char **app_id);
+
+
+/**
+ * @brief Gets the process ID with the given application context.
+ * @param [in] app_context The application context
+ * @param [out] pid The process ID of the given application context
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #APP_MANAGER_ERROR_NONE Successful
+ * @retval #APP_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #APP_MANAGER_ERROR_DB_FAILED Database error occurred
+ * @retval #APP_MANAGER_ERROR_OUT_OF_MEMORY Out of memory
+ */
+int app_context_get_pid(app_context_h app_context, pid_t *pid);
+
+
+/**
+ * @brief Checks whether the application with the given application context is terminated.
+ * @param [in] app_context     The application context
+ * @param [out] terminated true if the application is terminated, false if the application is running
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #APP_MANAGER_ERROR_NONE Successful
+ * @retval #APP_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #APP_MANAGER_ERROR_DB_FAILED Database error occurred
+ * @retval #APP_MANAGER_ERROR_OUT_OF_MEMORY Out of memory
+ */
+int app_context_is_terminated(app_context_h app_context, bool *terminated);
+
+
+/**
+ * @brief Checks whether two application contexts are equal.
+ * @param [in] lhs     The first application context to compare
+ * @param [in] rhs     The second application context to compare
+ * @param [out] equal true if the application contexts are equal, otherwise false
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #APP_MANAGER_ERROR_NONE Successful
+ * @retval #APP_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #APP_MANAGER_ERROR_DB_FAILED Database error occurred
+ * @retval #APP_MANAGER_ERROR_OUT_OF_MEMORY Out of memory
+ */
+int app_context_is_equal(app_context_h lhs, app_context_h rhs, bool *equal);
+
+
+/**
+ * @brief Clones the application context handle.
+ * @param [out] clone If successful, a newly created application context handle will be returned.
+ * @param [in] app_context The application context
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #APP_MANAGER_ERROR_NONE Successful
+ * @retval #APP_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #APP_MANAGER_ERROR_DB_FAILED Database error occurred
+ * @retval #APP_MANAGER_ERROR_OUT_OF_MEMORY Out of memory
+ */
+int app_context_clone(app_context_h *clone, app_context_h app_context);
+
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __TIZEN_APPFW_APP_CONTEXT_H */
diff --git a/include/app_info.h b/include/app_info.h
new file mode 100755 (executable)
index 0000000..4b1fa53
--- /dev/null
@@ -0,0 +1,144 @@
+/*
+ * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License. 
+ */
+
+#ifndef __TIZEN_APPFW_APP_INFO_H
+#define __TIZEN_APPFW_APP_INFO_H
+
+#include <tizen.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/**
+ * @brief Application information handle.
+ */
+typedef struct app_info_s *app_info_h;
+
+
+/**
+ * @brief Enumerations of event type for the application information event
+ */
+typedef enum
+{
+       APP_INFO_EVENT_INSTALLED, /**< The application is newly installed */
+       APP_INFO_EVENT_UNINSTALLED, /**< The application is uninstalled */
+       APP_INFO_EVENT_UPDATED, /**< The application is updated */
+} app_info_event_e;
+
+
+/**
+ * @brief Destroys the application information handle and releases all its resources.
+ * @param [in] app_info The application information handle
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #APP_MANAGER_ERROR_NONE Successful
+ * @retval #APP_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @see app_manager_foreach_app_info()
+ * @see app_manager_get_app_info()
+ */
+int app_info_destroy(app_info_h app_info);
+
+
+/**
+ * @brief Gets the application ID with the given application context.
+ * @remarks @a app_id must be released with free() by you.
+ * @param [in] app_info The application information
+ * @param [out] app_id The application ID of the given application context
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #APP_MANAGER_ERROR_NONE Successful
+ * @retval #APP_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #APP_MANAGER_ERROR_DB_FAILED Database error occurred
+ * @retval #APP_MANAGER_ERROR_OUT_OF_MEMORY Out of memory
+ */
+int app_info_get_app_id(app_info_h app_info, char **app_id);
+
+
+/**
+ * @brief Gets the name of the application
+ * @remarks @a name must be released with free() by you.
+ * @param [in] app_info The application information
+ * @param [out] name The name of the application
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #APP_MANAGER_ERROR_NONE Successful
+ * @retval #APP_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #APP_MANAGER_ERROR_DB_FAILED Database error occurred
+ * @retval #APP_MANAGER_ERROR_OUT_OF_MEMORY Out of memory
+ */
+int app_info_get_name(app_info_h app_info, char **name);
+
+
+/**
+ * @brief Gets the version of the application
+ * @remarks @a version must be released with free() by you.
+ * @param [in] app_info The application information
+ * @param [out] version The version of the application
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #APP_MANAGER_ERROR_NONE Successful
+ * @retval #APP_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #APP_MANAGER_ERROR_DB_FAILED Database error occurred
+ * @retval #APP_MANAGER_ERROR_OUT_OF_MEMORY Out of memory
+ */
+int app_info_get_version(app_info_h app_info, char **version);
+
+
+/**
+ * @brief Gets the absolute path to the icon image
+ * @remarks @a path must be released with free() by you.
+ * @param [in] app_info The application information
+ * @param [out] path The absolute path to the icon
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #APP_MANAGER_ERROR_NONE Successful
+ * @retval #APP_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #APP_MANAGER_ERROR_DB_FAILED Database error occurred
+ * @retval #APP_MANAGER_ERROR_OUT_OF_MEMORY Out of memory
+ */
+int app_info_get_icon(app_info_h app_info, char **path);
+
+
+/**
+ * @brief Checks whether two application information are equal.
+ * @param [in] lhs     The first application information to compare
+ * @param [in] rhs     The second application information to compare
+ * @param [out] equal true if the application information are equal, otherwise false
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #APP_MANAGER_ERROR_NONE Successful
+ * @retval #APP_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #APP_MANAGER_ERROR_DB_FAILED Database error occurred
+ * @retval #APP_MANAGER_ERROR_OUT_OF_MEMORY Out of memory
+ */
+int app_info_is_equal(app_info_h lhs, app_info_h rhs, bool *equal);
+
+
+/**
+ * @brief Clones the application information handle.
+ * @param [out] clone If successful, a newly created application information handle will be returned.
+ * @param [in] app_info The application information
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #APP_MANAGER_ERROR_NONE Successful
+ * @retval #APP_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #APP_MANAGER_ERROR_DB_FAILED Database error occurred
+ * @retval #APP_MANAGER_ERROR_OUT_OF_MEMORY Out of memory
+ */
+int app_info_clone(app_info_h *clone, app_info_h app_info);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __TIZEN_APPFW_APP_INFO_H */
index 72362b2..93ae325 100755 (executable)
 
 #include <tizen.h>
 
+#include <app_context.h>
+#include <app_info.h>
+
+#include <app_manager_deprecated.h>
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -29,6 +34,7 @@ extern "C" {
  * @{
  */
 
+
 /**
  * @brief Enumerations of error code for Application Manager.
  */
@@ -37,171 +43,244 @@ typedef enum
        APP_MANAGER_ERROR_NONE = TIZEN_ERROR_NONE,      /**< Successful */
        APP_MANAGER_ERROR_INVALID_PARAMETER = TIZEN_ERROR_INVALID_PARAMETER, /**< Invalid parameter */
        APP_MANAGER_ERROR_OUT_OF_MEMORY = TIZEN_ERROR_OUT_OF_MEMORY, /**< Out of memory */
-       APP_MANAGER_ERROR_DB_FAILED = TIZEN_ERROR_APPLICATION_CLASS | 0x03,     /**< Database error  */
-       APP_MANAGER_ERROR_INVALID_PACKAGE = TIZEN_ERROR_APPLICATION_CLASS | 0x04, /**< Can not find the package */
+       APP_MANAGER_ERROR_IO_ERROR = TIZEN_ERROR_IO_ERROR, /**< Internal I/O error */
+       APP_MANAGER_ERROR_NO_SUCH_APP = TIZEN_ERROR_APPLICATION_CLASS | 0x01, /**< No such application */
+
+       APP_MANAGER_ERROR_DB_FAILED = TIZEN_ERROR_APPLICATION_CLASS | 0x03, /**< Database error  */
+       APP_MANAGER_ERROR_INVALID_PACKAGE = TIZEN_ERROR_APPLICATION_CLASS | 0x04, /**< Invalid package name */
 } app_manager_error_e;
 
+
 /**
- * @brief Enumerations of event type for the list of the installed applications.
+ * @brief Called when an application gets launched or termiated.
+ * @param[in] app_context The application context of the application launched or termiated
+ * @param[in] event The application context event
+ * @param[in] user_data The user data passed from the foreach function
+ * @pre This function is called when an application gets launched or terminated after you register this callback using app_manager_set_app_context_event_cb()
+ * @see app_manager_set_app_context_event_cb()
+ * @see app_manager_unset_app_context_event_cb()
  */
-typedef enum
-{
-       APP_MANAGER_EVENT_INSTALLED = 40,       /**< Install event */
-       APP_MANAGER_EVENT_UNINSTALLED = 41,             /**< Uninstall event */
-       APP_MANAGER_EVENT_UPDATED = 42,         /**< Update event */
-} app_manger_event_type_e;
+typedef void (*app_manager_app_context_event_cb) (app_context_h app_context, app_context_event_e event, void *user_data);
+
 
 /**
- * @brief Called to get the package name once for each running application.
- * @param[in] package The package name of each running application
+ * @brief Called to get the application context once for each running application.
+ * @param[in] app_context The application context of each running application
  * @param[in] user_data The user data passed from the foreach function
  * @return @c true to continue with the next iteration of the loop, \n @c false to break out of the loop.
- * @pre        app_manager_foreach_app_running() will invoke this callback.
- * @see app_manager_foreach_app_running()
+ * @pre app_manager_foreach_app_context() will invoke this callback.
+ * @see app_manager_foreach_app_context()
  */
-typedef bool (*app_manager_app_running_cb) (const char *package, void *user_data);
+typedef bool (*app_manager_app_context_cb) (app_context_h app_context, void *user_data);
+
 
 /**
- * @brief Called to get the package name once for each installed application.
- *
- * @param[in] package The package name of each installed application
+ * @internal
+ * @brief Called when an application gets installed, terminated or updated.
+ * @param[in] app_info The application information of the application installed, terminated or updated
+ * @param[in] event The application information event
+ * @param[in] user_data The user data passed from the foreach function
+ * @pre This function is called when an application gets installed, uninstalled or updated after you register this callback using app_manager_set_app_info_event_cb()
+ * @see app_manager_set_app_info_event_cb()
+ * @see app_manager_unset_app_info_event_cb()
+ */
+typedef void (*app_manager_app_info_event_cb) (app_info_h app_info, app_info_event_e event, void *user_data);
+
+
+/**
+ * @internal
+ * @brief Called to get the application information once for each installed application.
+ * @param[in] app_info The application information of each installed application
  * @param[in] user_data The user data passed from the foreach function
  * @return @c true to continue with the next iteration of the loop, \n @c false to break out of the loop.
- * @pre        app_manager_foreach_app_installed() will invoke this callback.
- * @see app_manager_foreach_app_installed()
+ * @pre app_manager_foreach_app_info() will invoke this callback.
+ * @see app_manager_foreach_app_info()
  */
-typedef bool (*app_manager_app_installed_cb) (const char *package, void *user_data);
+typedef bool (*app_manager_app_info_cb) (app_info_h app_info, void *user_data);
+
 
 /**
- * @brief  Called when the list of the installed applications changes.
- *
- * @param[in] event_type The type of applist modification event
- * @param[in] package The package name of application installed or uninstalled
- * @param[in] user_data The user data passed from the callback registration function
- * @pre        An application registers this callback using app_manager_set_app_list_changed_cb() 
- *     to detect change of list of the installed applications.
- * @see app_manager_set_app_list_changed_cb()
- * @see app_manager_unset_app_list_changed_cb()
+ * @brief Registers a callback function to be invoked when the applications gets launched or termiated.
+ * @param[in] callback The callback function to register
+ * @param[in] user_data The user data to be passed to the callback function
+ * @return  0 on success, otherwise a negative error value.
+ * @retval #APP_MANAGER_ERROR_NONE On Successful
+ * @retval #APP_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #APP_MANAGER_ERROR_OUT_OF_MEMORY Out of memory
+ * @post       It will invoke app_manager_app_context_event_cb() when the application is launched or termiated.
+ * @see app_manager_unset_app_context_event_cb()
+ * @see app_manager_app_context_event_cb()
  */
-typedef void(*app_manager_app_list_changed_cb) (app_manger_event_type_e event_type, const char *package, void *user_data);
+int app_manager_set_app_context_event_cb(app_manager_app_context_event_cb callback, void *user_data);
+
 
 /**
- * @brief Retrieves the package names of all running applications 
- * by invoking the callback once for each running application to get their package names.
- *
- * @param [in] callback The callback function to invoke
- * @param [in] user_data The user data to be passed to the callback function
+ * @brief Unregisters the callback function.
  * @return 0 on success, otherwise a negative error value.
  * @retval #APP_MANAGER_ERROR_NONE Successful
- * @retval #APP_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
- * @post       This function invokes app_manager_app_running_cb() repeatedly for each running application.
- * @see        app_manager_app_running_cb()
+ * @see app_manager_set_app_event_cb()
+ * @see app_manager_app_context_event_cb()
  */
-int app_manager_foreach_app_running(app_manager_app_running_cb callback, void *user_data);
+void app_manager_unset_app_context_event_cb(void);
+
 
 /**
- * @brief Retrieves the package names of all installed applications 
- * by invoking the callback once for each installed application to get their package names.
- *
+ * @brief Retrieves all application contexts of running applications
  * @param [in] callback The callback function to invoke
  * @param [in] user_data The user data to be passed to the callback function
  * @return 0 on success, otherwise a negative error value.
  * @retval #APP_MANAGER_ERROR_NONE Successful
  * @retval #APP_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
- * @retval #APP_MANAGER_ERROR_OUT_OF_MEMORY Out of memory
- * @post       This function invokes app_manager_app_installed_cb() repeatedly for each installed application.
- * @see        app_manager_app_installed_cb()
+ * @post       This function invokes app_manager_app_context_cb() repeatedly for each application context.
+ * @see app_manager_app_context_cb()
  */
-int app_manager_foreach_app_installed(app_manager_app_installed_cb callback, void *user_data);
+int app_manager_foreach_app_context(app_manager_app_context_cb callback, void *user_data);
+
 
 /**
- * @brief Checks whether the application with the given package name is running.
- *
- *
- * @param [in] package The package name of the application
- * @param [out] is_running @c true if the application is running, \n @c false if not running.
+ * @brief Gets the application context for the given ID of the application
+ * @remarks This function returns #APP_MANAGER_ERROR_NO_SUCH_APP if the application with the given application ID is not running \n
+ * @a app_context must be released with app_context_destroy() by you.
+ * @param [in] app_id The ID of the application
+ * @param [out] app_context The application context of the given application ID
  * @return 0 on success, otherwise a negative error value.
  * @retval #APP_MANAGER_ERROR_NONE Successful
  * @retval #APP_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #APP_MANAGER_ERROR_DB_FAILED Database error occurred
+ * @retval #APP_MANAGER_ERROR_OUT_OF_MEMORY Out of memory
+ * @retval #APP_MANAGER_ERROR_NO_SUCH_APP No such application
  */
-int app_manager_is_running(const char *package, bool *is_running);
+int app_manager_get_app_context(const char *app_id, app_context_h *app_context);
+
 
 /**
- * @brief Gets the application name with the given package name.
- *
- * @remarks @a name must be released with free() by you.
- * @param [in] package The package name of the application
- * @param [out] name   The application name
+ * @brief Gets the name of the application package for the given process ID of the application
+ * @remark This function is @b deprecated. Use app_manager_get_app_id() instead.
+ * @remarks This function returns #APP_MANAGER_ERROR_NO_SUCH_APP if the application with the given process ID is not valid \n
+ * @a package must be released with free() by you.
+ * @param [in] pid The process ID of the given application
+ * @param [out] package The package name of the application
  * @return 0 on success, otherwise a negative error value.
  * @retval #APP_MANAGER_ERROR_NONE Successful
  * @retval #APP_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
- * @retval #APP_MANAGER_ERROR_INVALID_PACKAGE Package name is invalid, Can not find the package
  * @retval #APP_MANAGER_ERROR_DB_FAILED Database error occurred
  * @retval #APP_MANAGER_ERROR_OUT_OF_MEMORY Out of memory
+ * @retval #APP_MANAGER_ERROR_NO_SUCH_APP No such application
  */
-int app_manager_get_app_name(const char *package, char **name);
+int app_manager_get_package(pid_t pid, char **package);
+
 
 /**
- * @brief Gets the application icon path with the given package name.
- *
- * @remarks @a icon_path must be released with free() by you.
- * @param [in] package The package name of the application
- * @param [out] icon_path The icon path to represent the application
+ * @brief Gets the ID of the application for the given process ID
+ * @remarks This function returns #APP_MANAGER_ERROR_NO_SUCH_APP if the application with the given process ID is not valid \n
+ * @a app_id must be released with free() by you.
+ * @param [in] pid The process ID of the application
+ * @param [out] app_id The ID of the application
  * @return 0 on success, otherwise a negative error value.
  * @retval #APP_MANAGER_ERROR_NONE Successful
  * @retval #APP_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
- * @retval #APP_MANAGER_ERROR_INVALID_PACKAGE Package name is invalid, Can not find the package
  * @retval #APP_MANAGER_ERROR_DB_FAILED Database error occurred
  * @retval #APP_MANAGER_ERROR_OUT_OF_MEMORY Out of memory
+ * @retval #APP_MANAGER_ERROR_NO_SUCH_APP No such application
  */
-int app_manager_get_app_icon_path(const char *package, char **icon_path);
+int app_manager_get_app_id(pid_t pid, char **app_id);
+
 
 /**
- * @brief Gets the application version with the given package name.
- *
- * @remarks @a version must be released with free() by you.
- * @param [in] package The package name of the application
- * @param [out] version The version of the application
+ * @brief Checks whether the application with the given package name is running.
+ * @param [in] app_id The ID of the application
+ * @param [out] running @c true if the application is running, \n @c false if not running.
  * @return 0 on success, otherwise a negative error value.
  * @retval #APP_MANAGER_ERROR_NONE Successful
  * @retval #APP_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
- * @retval #APP_MANAGER_ERROR_INVALID_PACKAGE Package name is invalid, Can not find the package
- * @retval #APP_MANAGER_ERROR_DB_FAILED Database error occurred
- * @retval #APP_MANAGER_ERROR_OUT_OF_MEMORY Out of memory
  */
-int app_manager_get_app_version(const char *package, char **version);
+int app_manager_is_running(const char *app_id, bool *running);
+
 
 /**
- * @brief   Registers a callback function to be invoked when the list of the installed applications changes.
- *
+ * @brief Resume the application
+ * @param [in] app_context The application context
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #APP_MANAGER_ERROR_NONE Successful
+ * @retval #APP_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ */
+int app_manager_resume_app(app_context_h app_context);
+
+
+/**
+ * @brief Terminate the application
+ * @param [in] app_context The application context
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #APP_MANAGER_ERROR_NONE Successful
+ * @retval #APP_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ */
+int app_manager_terminate_app(app_context_h app_context);
+
+
+/**
+ * @internal
+ * @brief Registers a callback function to be invoked when the applications gets installed, uninstalled or updated.
  * @param[in] callback The callback function to register
  * @param[in] user_data The user data to be passed to the callback function
  * @return  0 on success, otherwise a negative error value.
- * @retval  #APP_MANAGER_ERROR_NONE On Successful
- * @retval  #APP_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #APP_MANAGER_ERROR_NONE On Successful
+ * @retval #APP_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
  * @retval #APP_MANAGER_ERROR_OUT_OF_MEMORY Out of memory
- * @post       It will invoke app_manager_app_list_changed_cb() when the list of installed application changes.
- * @see app_manager_unset_app_list_changed_cb()
- * @see app_manager_app_list_changed_cb()
+ * @post       It will invoke app_manager_app_info_event_cb() when the application gets installed, uninstalled or updated.
+ * @see app_manager_unset_app_info_event_cb()
+ * @see app_manager_app_info_event_cb()
  */
-int app_manager_set_app_list_changed_cb(app_manager_app_list_changed_cb callback, void *user_data);
+int app_manager_set_app_info_event_cb(app_manager_app_info_event_cb callback, void *user_data);
+
 
 /**
- * @brief   Unregisters the callback function.
- *
+ * @internal
+ * @brief Unregisters the callback function.
  * @return 0 on success, otherwise a negative error value.
  * @retval #APP_MANAGER_ERROR_NONE Successful
- * @see app_manager_set_app_list_changed_cb()
- * @see app_manager_app_list_changed_cb()
+ * @see app_manager_set_app_info_event_cb()
+ * @see app_manager_app_info_event_cb()
  */
-int app_manager_unset_app_list_changed_cb(void);
+void app_manager_unset_app_info_event_cb(void);
+
+
+/**
+ * @internal
+ * @brief Retrieves all application information of installed applications
+ * @param [in] callback The callback function to invoke
+ * @param [in] user_data The user data to be passed to the callback function
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #APP_MANAGER_ERROR_NONE Successful
+ * @retval #APP_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @post       This function invokes app_manager_app_info_cb() repeatedly for each application information.
+ * @see app_manager_app_info_cb()
+ */
+int app_manager_foreach_app_info(app_manager_app_info_cb callback, void *user_data);
+
+
+/**
+ * @internal
+ * @brief Gets the application information for the given application ID
+ * @remarks @a app_info must be released with app_info_destroy() by you.
+ * @param [in] app_id The ID of the application
+ * @param [out] app_info The application information for the given application ID
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #APP_MANAGER_ERROR_NONE Successful
+ * @retval #APP_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #APP_MANAGER_ERROR_DB_FAILED Database error occurred
+ * @retval #APP_MANAGER_ERROR_OUT_OF_MEMORY Out of memory
+ */
+int app_manager_get_app_info(const char *app_id, app_info_h *app_info);
+
 
 /**
  * @}
  */
 
+
 #ifdef __cplusplus
 }
 #endif
 
 #endif /* __TIZEN_APPFW_APP_MANAGER_H */
+
diff --git a/include/app_manager_deprecated.h b/include/app_manager_deprecated.h
new file mode 100755 (executable)
index 0000000..4d3f25c
--- /dev/null
@@ -0,0 +1,189 @@
+/*
+ * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License. 
+ */
+
+#ifndef __TIZEN_APPFW_APP_MANAGER_DEPRECATED_H
+#define __TIZEN_APPFW_APP_MANAGER_DEPRECATED_H
+
+#include <tizen.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/**
+ * @addtogroup CAPI_APPLICATION_MANAGER_MODULE
+ * @{
+ */
+
+/**
+ * @brief Enumerations of event type for the list of the installed applications.
+ */
+typedef enum
+{
+       APP_MANAGER_EVENT_INSTALLED = 40,       /**< Install event */
+       APP_MANAGER_EVENT_UNINSTALLED = 41,             /**< Uninstall event */
+       APP_MANAGER_EVENT_UPDATED = 42,         /**< Update event */
+} app_manger_event_type_e;
+
+/**
+ * @internal
+ * @remark This callback is @b deprecated. Use app_manager_app_context_cb() instead.
+ * @brief Called to get the package name once for each running application.
+ * @param[in] package The package name of each running application
+ * @param[in] user_data The user data passed from the foreach function
+ * @return @c true to continue with the next iteration of the loop, \n @c false to break out of the loop.
+ * @pre        app_manager_foreach_app_running() will invoke this callback.
+ * @see app_manager_foreach_app_running()
+ */
+typedef bool (*app_manager_app_running_cb) (const char *package, void *user_data);
+
+/**
+ * @brief Called to get the package name once for each installed application.
+ *
+ * @param[in] package The package name of each installed application
+ * @param[in] user_data The user data passed from the foreach function
+ * @return @c true to continue with the next iteration of the loop, \n @c false to break out of the loop.
+ * @pre        app_manager_foreach_app_installed() will invoke this callback.
+ * @see app_manager_foreach_app_installed()
+ */
+typedef bool (*app_manager_app_installed_cb) (const char *package, void *user_data);
+
+/**
+ * @brief  Called when the list of the installed applications changes.
+ *
+ * @param[in] event_type The type of applist modification event
+ * @param[in] package The package name of application installed or uninstalled
+ * @param[in] user_data The user data passed from the callback registration function
+ * @pre        An application registers this callback using app_manager_set_app_list_changed_cb() 
+ *     to detect change of list of the installed applications.
+ * @see app_manager_set_app_list_changed_cb()
+ * @see app_manager_unset_app_list_changed_cb()
+ */
+typedef void(*app_manager_app_list_changed_cb) (app_manger_event_type_e event_type, const char *package, void *user_data);
+
+/**
+ * @internal
+ * @remark This function is @b deprecated. Use app_manager_foreach_app_context() instead.
+ * @brief Retrieves the package names of all running applications 
+ * by invoking the callback once for each running application to get their package names.
+ *
+ * @param [in] callback The callback function to invoke
+ * @param [in] user_data The user data to be passed to the callback function
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #APP_MANAGER_ERROR_NONE Successful
+ * @retval #APP_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @post       This function invokes app_manager_app_running_cb() repeatedly for each running application.
+ * @see        app_manager_app_running_cb()
+ */
+int app_manager_foreach_app_running(app_manager_app_running_cb callback, void *user_data);
+
+/**
+ * @brief Retrieves the package names of all installed applications 
+ * by invoking the callback once for each installed application to get their package names.
+ *
+ * @param [in] callback The callback function to invoke
+ * @param [in] user_data The user data to be passed to the callback function
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #APP_MANAGER_ERROR_NONE Successful
+ * @retval #APP_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #APP_MANAGER_ERROR_OUT_OF_MEMORY Out of memory
+ * @post       This function invokes app_manager_app_installed_cb() repeatedly for each installed application.
+ * @see        app_manager_app_installed_cb()
+ */
+int app_manager_foreach_app_installed(app_manager_app_installed_cb callback, void *user_data);
+
+/**
+ * @brief Gets the application name with the given package name.
+ *
+ * @remarks @a name must be released with free() by you.
+ * @param [in] package The package name of the application
+ * @param [out] name   The application name
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #APP_MANAGER_ERROR_NONE Successful
+ * @retval #APP_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #APP_MANAGER_ERROR_INVALID_PACKAGE Package name is invalid, Can not find the package
+ * @retval #APP_MANAGER_ERROR_DB_FAILED Database error occurred
+ * @retval #APP_MANAGER_ERROR_OUT_OF_MEMORY Out of memory
+ */
+int app_manager_get_app_name(const char *package, char **name);
+
+/**
+ * @brief Gets the application icon path with the given package name.
+ *
+ * @remarks @a icon_path must be released with free() by you.
+ * @param [in] package The package name of the application
+ * @param [out] icon_path The icon path to represent the application
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #APP_MANAGER_ERROR_NONE Successful
+ * @retval #APP_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #APP_MANAGER_ERROR_INVALID_PACKAGE Package name is invalid, Can not find the package
+ * @retval #APP_MANAGER_ERROR_DB_FAILED Database error occurred
+ * @retval #APP_MANAGER_ERROR_OUT_OF_MEMORY Out of memory
+ */
+int app_manager_get_app_icon_path(const char *package, char **icon_path);
+
+/**
+ * @brief Gets the application version with the given package name.
+ *
+ * @remarks @a version must be released with free() by you.
+ * @param [in] package The package name of the application
+ * @param [out] version The version of the application
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #APP_MANAGER_ERROR_NONE Successful
+ * @retval #APP_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #APP_MANAGER_ERROR_INVALID_PACKAGE Package name is invalid, Can not find the package
+ * @retval #APP_MANAGER_ERROR_DB_FAILED Database error occurred
+ * @retval #APP_MANAGER_ERROR_OUT_OF_MEMORY Out of memory
+ */
+int app_manager_get_app_version(const char *package, char **version);
+
+/**
+ * @brief   Registers a callback function to be invoked when the list of the installed applications changes.
+ *
+ * @param[in] callback The callback function to register
+ * @param[in] user_data The user data to be passed to the callback function
+ * @return  0 on success, otherwise a negative error value.
+ * @retval #APP_MANAGER_ERROR_NONE On Successful
+ * @retval #APP_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #APP_MANAGER_ERROR_OUT_OF_MEMORY Out of memory
+ * @post       It will invoke app_manager_app_list_changed_cb() when the list of installed application changes.
+ * @see app_manager_unset_app_list_changed_cb()
+ * @see app_manager_app_list_changed_cb()
+ */
+int app_manager_set_app_list_changed_cb(app_manager_app_list_changed_cb callback, void *user_data);
+
+/**
+ * @brief   Unregisters the callback function.
+ *
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #APP_MANAGER_ERROR_NONE Successful
+ * @see app_manager_set_app_list_changed_cb()
+ * @see app_manager_app_list_changed_cb()
+ */
+int app_manager_unset_app_list_changed_cb(void);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __TIZEN_APPFW_APP_MANAGER_DEPRECATED_H */
+
index 17088da..e5837a1 100755 (executable)
 #ifndef __TIZEN_APPFW_APP_MANAGER_PRIVATE_H__
 #define __TIZEN_APPFW_APP_MANAGER_PRIVATE_H__
 
-#include <aul.h>
-#include <ail.h>
-
+#include <app_context.h>
+#include <app_info.h>
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
+int app_manager_error(app_manager_error_e error, const char* function, const char *description);
+
+int app_context_foreach_app_context(app_manager_app_context_cb callback, void *user_data);
+
+int app_context_get_app_context(const char *app_id, app_context_h *app_context);
+
+int app_context_set_event_cb(app_manager_app_context_event_cb callback, void *user_data);
+
+void app_context_unset_event_cb(void);
+
+int app_info_foreach_app_info(app_manager_app_info_cb callback, void *user_data);
+
+int app_info_get_app_info(const char *app_id, app_info_h *app_info);
+
+int app_info_set_event_cb(app_manager_app_info_event_cb callback, void *user_data);
+
+void app_info_unset_event_cb(void);
+
 #ifdef __cplusplus
 }
 #endif
-#endif                         /* __TIZEN_APPFW_APP_MANAGER_PRIVATE_H__ */
+
+#endif /* __TIZEN_APPFW_APP_MANAGER_PRIVATE_H__ */
+
old mode 100755 (executable)
new mode 100644 (file)
index 9c47400..7267feb
@@ -1,9 +1,10 @@
+#sbs-git:slp/api/app-manager capi-appfw-app-manager 0.1.0 76739af2bfbeb46dc9db0cb3e044f880ddcb9440
 Name:       capi-appfw-app-manager
 Summary:    Application Manager API
-Version:    0.1.0
-Release:    1
+Version: 0.1.0
+Release:    11
 Group:      TO_BE/FILLED_IN
-License:    Apache-2.0
+License:    TO BE FILLED IN
 Source0:    %{name}-%{version}.tar.gz
 BuildRequires:  cmake
 BuildRequires:  pkgconfig(dlog)
@@ -12,6 +13,7 @@ BuildRequires:  pkgconfig(aul)
 BuildRequires:  pkgconfig(ail)
 BuildRequires:  pkgconfig(pkgmgr)
 BuildRequires:  pkgconfig(capi-base-common)
+BuildRequires:  pkgconfig(glib-2.0)
 Requires(post): /sbin/ldconfig  
 Requires(postun): /sbin/ldconfig
 
@@ -50,7 +52,7 @@ rm -rf %{buildroot}
 %{_libdir}/libcapi-appfw-app-manager.so.*
 
 %files devel
-%{_includedir}/appfw/app_manager.h
+%{_includedir}/appfw/*.h
 %{_libdir}/libcapi-appfw-app-manager.so
 %{_libdir}/pkgconfig/*.pc
 
diff --git a/src/app_context.c b/src/app_context.c
new file mode 100755 (executable)
index 0000000..641399f
--- /dev/null
@@ -0,0 +1,492 @@
+/*
+ * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License. 
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <pthread.h>
+
+#include <glib.h>
+
+#include <aul.h>
+#include <dlog.h>
+
+#include <app_context.h>
+#include <app_manager.h>
+#include <app_manager_private.h>
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#endif
+
+#define LOG_TAG "TIZEN_N_APP_MANAGER"
+
+#define APPID_MAX 128
+
+static int app_context_create(const char *app_id, pid_t pid, app_context_h *app_context);
+
+static int app_context_get_app_context_by_pid(pid_t pid, app_context_h *app_context);
+
+struct app_context_s {
+       char *app_id;
+       pid_t pid;
+};
+
+typedef struct _foreach_context_ {
+       app_manager_app_context_cb callback;
+       void *user_data;
+       bool iteration;
+} foreach_context_s;
+
+typedef struct _retrieval_context_{
+       const char *app_id;
+       pid_t pid;
+       bool matched;
+} retrieval_context_s;
+
+static int app_context_foreach_app_context_cb(const aul_app_info *aul_app_context, void *cb_data)
+{
+       foreach_context_s* foreach_context = cb_data;
+
+       if (foreach_context == NULL)
+       {
+               app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+               return 0;
+       }
+
+       if (foreach_context->iteration == true)
+       {
+               app_context_h app_context = NULL;
+
+               if (app_context_create(aul_app_context->pkg_name, aul_app_context->pid, &app_context) == APP_MANAGER_ERROR_NONE)
+               {
+                       foreach_context->iteration = foreach_context->callback(app_context, foreach_context->user_data);
+                       app_context_destroy(app_context);
+               }
+       }
+
+       return 0;
+}
+
+
+int app_context_foreach_app_context(app_manager_app_context_cb callback, void *user_data)
+{
+       foreach_context_s foreach_context = {
+               .callback = callback,
+               .user_data = user_data,
+               .iteration = true
+       };
+
+       if (callback == NULL)
+       {
+               return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       aul_app_get_running_app_info(app_context_foreach_app_context_cb, &foreach_context);
+
+       return APP_MANAGER_ERROR_NONE;
+}
+
+
+static int app_context_retrieve_app_context(const aul_app_info *aul_app_context, void *cb_data)
+{
+       retrieval_context_s *retrieval_context = cb_data;
+
+       if (aul_app_context != NULL && retrieval_context != NULL && retrieval_context->matched == false)
+       {
+               if (!strcmp(aul_app_context->pkg_name, retrieval_context->app_id))
+               {
+                       retrieval_context->pid = aul_app_context->pid;
+                       retrieval_context->matched = true;
+               }
+       }
+
+       return 0;
+}
+
+int app_context_get_app_context(const char *app_id, app_context_h *app_context)
+{
+       retrieval_context_s retrieval_context =  {
+               .app_id = app_id,
+               .pid = 0,
+               .matched = false
+       };
+
+       if (app_id == NULL || app_context == NULL)
+       {
+               return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       if (aul_app_is_running(app_id) == 0)
+       {
+               return app_manager_error(APP_MANAGER_ERROR_NO_SUCH_APP, __FUNCTION__, NULL);
+       }
+
+       aul_app_get_running_app_info(app_context_retrieve_app_context, &retrieval_context);
+
+       if (retrieval_context.matched == false)
+       {
+               return app_manager_error(APP_MANAGER_ERROR_NO_SUCH_APP, __FUNCTION__, NULL);
+       }
+
+       return app_context_create(retrieval_context.app_id, retrieval_context.pid, app_context);
+}
+
+static int app_context_get_app_context_by_pid(pid_t pid, app_context_h *app_context)
+{
+       int retval;
+       char appid[APPID_MAX] = {0, };
+
+       if (pid < 0 || app_context == NULL)
+       {
+               return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       if (aul_app_get_pkgname_bypid(pid, appid, sizeof(appid)) != AUL_R_OK)
+       {
+               return app_manager_error(APP_MANAGER_ERROR_NO_SUCH_APP, __FUNCTION__, NULL);
+       }
+
+       retval = app_context_get_app_context(appid, app_context);
+
+       if (retval != APP_MANAGER_ERROR_NONE)
+       {
+               return app_manager_error(retval, __FUNCTION__, NULL);
+       }
+
+       return APP_MANAGER_ERROR_NONE;
+}
+
+static int app_context_create(const char *app_id, pid_t pid, app_context_h *app_context)
+{
+       app_context_h app_context_created;
+
+       if (app_id == NULL || pid <= 0 || app_context == NULL)
+       {
+               return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       app_context_created = calloc(1, sizeof(struct app_context_s));
+
+       if (app_context_created == NULL)
+       {
+               return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
+       }
+
+       app_context_created->app_id = strdup(app_id);
+
+       if (app_context_created->app_id == NULL)
+       {
+               free(app_context_created);
+               return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
+       }
+
+       app_context_created->pid = pid;
+
+       *app_context = app_context_created;
+
+       return APP_MANAGER_ERROR_NONE;
+}
+
+int app_context_destroy(app_context_h app_context)
+{
+       if (app_context == NULL)
+       {
+               return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       free(app_context->app_id);
+       free(app_context);
+
+       return APP_MANAGER_ERROR_NONE;
+}
+
+int app_context_get_package(app_context_h app_context, char **package)
+{
+       // TODO: this function must be deprecated
+       return app_context_get_app_id(app_context, package);
+}
+
+
+int app_context_get_app_id(app_context_h app_context, char **app_id)
+{
+       char *app_id_dup;
+
+       if (app_context == NULL || app_id == NULL)
+       {
+               return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       app_id_dup = strdup(app_context->app_id);
+
+       if (app_id_dup == NULL)
+       {
+               return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
+       }
+
+       *app_id = app_id_dup;
+
+       return APP_MANAGER_ERROR_NONE;
+}
+
+
+int app_context_get_pid(app_context_h app_context, pid_t *pid)
+{
+       if (app_context == NULL || pid == NULL)
+       {
+               return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       *pid = app_context->pid;
+
+       return APP_MANAGER_ERROR_NONE;
+}
+
+int app_context_is_terminated(app_context_h app_context, bool *terminated)
+{
+       if (app_context == NULL || terminated == NULL)
+       {
+               return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       if (aul_app_is_running(app_context->app_id) == 1)
+       {
+               *terminated = false;
+       }
+       else
+       {
+               char appid[APPID_MAX] = {0, };
+
+               if (aul_app_get_pkgname_bypid(app_context->pid, appid, sizeof(appid)) == AUL_R_OK)
+               {
+                       *terminated = false;
+               }
+               else
+               {
+                       *terminated = true;
+               }
+       }
+
+       return APP_MANAGER_ERROR_NONE;
+}
+
+int app_context_is_equal(app_context_h lhs, app_context_h rhs, bool *equal)
+{
+       if (lhs == NULL || rhs == NULL || equal == NULL)
+       {
+               return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       if (!strcmp(lhs->app_id, rhs->app_id) && lhs->pid == rhs->pid)
+       {
+               *equal = true;
+       }
+       else
+       {
+               *equal = false;
+       }
+
+       return APP_MANAGER_ERROR_NONE;
+}
+
+int app_context_clone(app_context_h *clone, app_context_h app_context)
+{
+       int retval;
+
+       if (clone == NULL || app_context == NULL)
+       {
+               return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       retval = app_context_create(app_context->app_id, app_context->pid, clone);
+
+       if (retval != APP_MANAGER_ERROR_NONE)
+       {
+               return app_manager_error(retval, __FUNCTION__, NULL);
+       }
+
+       return APP_MANAGER_ERROR_NONE;
+}
+
+typedef struct _event_cb_context_ {
+       GHashTable *pid_table;
+       app_manager_app_context_event_cb callback;
+       void *user_data;
+} event_cb_context_s;
+
+static pthread_mutex_t event_cb_context_mutex = PTHREAD_MUTEX_INITIALIZER;
+static event_cb_context_s *event_cb_context = NULL;
+
+static void app_context_lock_event_cb_context()
+{
+       pthread_mutex_lock(&event_cb_context_mutex);
+}
+
+static void app_context_unlock_event_cb_context()
+{
+       pthread_mutex_unlock(&event_cb_context_mutex);
+}
+
+static bool app_context_load_all_app_context_cb_locked(app_context_h app_context, void *user_data)
+{
+       app_context_h app_context_cloned;
+
+       if (app_context_clone(&app_context_cloned, app_context) == APP_MANAGER_ERROR_NONE)
+       {
+               LOGI("[%s] app_id(%s), pid(%d)", __FUNCTION__, app_context->app_id, app_context->pid);
+
+               if (event_cb_context != NULL && event_cb_context->pid_table != NULL)
+               {
+                       g_hash_table_insert(event_cb_context->pid_table, GINT_TO_POINTER(&(app_context_cloned->pid)), app_context_cloned);
+               }
+               else
+               {
+                       app_context_destroy(app_context_cloned);
+                       app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, "invalid callback context");
+               }
+       }
+
+       return true;
+}
+
+static void app_context_pid_table_entry_destroyed_cb(void * data)
+{
+       app_context_h app_context = data;
+
+       if (app_context != NULL)
+       {
+               char *app_id;
+               int pid;
+               app_context_get_package(app_context, &app_id);
+               app_context_get_pid(app_context, &pid);
+               LOGI("[%s] app_id(%s), pid(%d)", __FUNCTION__, app_context->app_id, app_context->pid);
+               free(app_id);
+
+               app_context_destroy(app_context);
+       }
+}
+
+static int app_context_launched_event_cb(pid_t pid, void *data)
+{
+       app_context_h app_context;
+
+       app_context_lock_event_cb_context();
+
+       if (app_context_get_app_context_by_pid(pid, &app_context) == APP_MANAGER_ERROR_NONE)
+       {
+               if (event_cb_context != NULL && event_cb_context->pid_table != NULL)
+               {
+                       g_hash_table_insert(event_cb_context->pid_table, GINT_TO_POINTER(&(app_context->pid)), app_context);
+                       event_cb_context->callback(app_context, APP_CONTEXT_EVENT_LAUNCHED, event_cb_context->user_data);
+               }
+               else
+               {
+                       app_context_destroy(app_context);
+                       app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, "invalid callback context");
+               }
+       }
+
+       app_context_unlock_event_cb_context();
+
+       return 0;
+}
+
+static int app_context_terminated_event_cb(pid_t pid, void *data)
+{
+       app_context_h app_context;
+       int lookup_key = pid;
+
+       app_context_lock_event_cb_context();
+
+       if (event_cb_context != NULL && event_cb_context->pid_table != NULL)
+       {
+               app_context = g_hash_table_lookup(event_cb_context->pid_table, GINT_TO_POINTER(&lookup_key));
+
+               if (app_context != NULL)
+               {
+                       event_cb_context->callback(app_context, APP_CONTEXT_EVENT_TERMINATED, event_cb_context->user_data);
+                       g_hash_table_remove(event_cb_context->pid_table, GINT_TO_POINTER(&(app_context->pid)));
+               }
+       }
+       else
+       {
+               app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, "invalid callback context");
+       }
+
+       app_context_unlock_event_cb_context();
+
+       return 0;
+}
+
+int app_context_set_event_cb(app_manager_app_context_event_cb callback, void *user_data)
+{
+       if (callback == NULL)
+       {
+               return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       app_context_lock_event_cb_context();
+
+       if (event_cb_context == NULL)
+       {
+               event_cb_context = calloc(1, sizeof(event_cb_context_s));
+
+               if (event_cb_context == NULL)
+               {
+                       return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
+               }
+
+               event_cb_context->pid_table = g_hash_table_new_full(g_int_hash, g_int_equal, NULL, app_context_pid_table_entry_destroyed_cb);
+       
+               if (event_cb_context->pid_table == NULL)
+               {
+                       return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, "failed to initialize pid-table");
+               }
+
+               app_context_foreach_app_context(app_context_load_all_app_context_cb_locked, NULL);
+
+               aul_listen_app_dead_signal(app_context_terminated_event_cb, NULL);
+               aul_listen_app_launch_signal(app_context_launched_event_cb, NULL);
+
+       }
+       
+       event_cb_context->callback = callback;
+       event_cb_context->user_data = user_data;
+
+       app_context_unlock_event_cb_context();
+
+       return APP_MANAGER_ERROR_NONE;
+}
+
+void app_context_unset_event_cb(void)
+{
+       app_context_lock_event_cb_context();
+
+       if (event_cb_context != NULL)
+       {
+               //aul_listen_app_dead_signal(NULL, NULL);
+               //aul_listen_app_launch_signal(NULL, NULL);
+
+               g_hash_table_destroy(event_cb_context->pid_table);
+               free(event_cb_context);
+               event_cb_context = NULL;
+       }
+
+       app_context_unlock_event_cb_context();
+}
+
diff --git a/src/app_info.c b/src/app_info.c
new file mode 100755 (executable)
index 0000000..66738e1
--- /dev/null
@@ -0,0 +1,395 @@
+/*
+ * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License. 
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <ail.h>
+#include <package-manager.h>
+#include <dlog.h>
+
+#include <app_info.h>
+#include <app_manager.h>
+#include <app_manager_private.h>
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#endif
+
+#define LOG_TAG "TIZEN_N_APP_MANAGER"
+
+static int app_info_create(const char *app_id, app_info_h *app_info);
+
+struct app_info_s {
+       char *app_id;
+       ail_appinfo_h ail_app_info;
+};
+
+typedef struct _foreach_context_{
+       app_manager_app_info_cb callback;
+       void *user_data;
+} foreach_context_s;
+
+
+static ail_cb_ret_e app_info_foreach_app_info_cb(const ail_appinfo_h ail_app_info, void *cb_data)
+{
+       foreach_context_s *foreach_context = cb_data;
+       app_info_h app_info = NULL;
+       char *app_id;
+       bool iteration_next = true;
+
+       if (ail_app_info == NULL || foreach_context == NULL)
+       {
+               app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+               return AIL_CB_RET_CANCEL;
+       }
+
+       ail_appinfo_get_str(ail_app_info, AIL_PROP_PACKAGE_STR, &app_id);
+
+       if (app_info_create(app_id, &app_info) == APP_MANAGER_ERROR_NONE)
+       {
+               iteration_next = foreach_context->callback(app_info, foreach_context->user_data);
+               app_info_destroy(app_info);
+       }
+
+       if (iteration_next == true)
+       {
+               return AIL_CB_RET_CONTINUE;
+       }
+       else
+       {
+               return AIL_CB_RET_CANCEL;
+       }
+}
+
+int app_info_foreach_app_info(app_manager_app_info_cb callback, void *user_data)
+{
+       foreach_context_s foreach_context = {
+               .callback = callback,
+               .user_data = user_data,
+       };
+
+       if (callback == NULL)
+       {
+               return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       ail_filter_list_appinfo_foreach(NULL, app_info_foreach_app_info_cb, &foreach_context);
+
+       return APP_MANAGER_ERROR_NONE;
+}
+
+int app_info_get_app_info(const char *app_id, app_info_h *app_info)
+{
+       return app_info_create(app_id, app_info);
+}
+
+static int app_info_create(const char *app_id, app_info_h *app_info)
+{
+       app_info_h app_info_created;
+       ail_appinfo_h ail_app_info;
+
+       if (app_id == NULL || app_info == NULL)
+       {
+               return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       if (ail_package_get_appinfo(app_id, &ail_app_info) != AIL_ERROR_OK)
+       {
+               return app_manager_error(APP_MANAGER_ERROR_NO_SUCH_APP, __FUNCTION__, NULL);
+       }
+
+       app_info_created = calloc(1, sizeof(struct app_info_s));
+
+       if (app_info_created == NULL)
+       {
+               ail_package_destroy_appinfo(ail_app_info);
+               return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
+       }
+
+       app_info_created->app_id = strdup(app_id);
+
+       if (app_info_created->app_id == NULL)
+       {
+               ail_package_destroy_appinfo(ail_app_info);
+               free(app_info_created);
+               return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
+       }
+
+       app_info_created->ail_app_info = ail_app_info;
+
+       *app_info = app_info_created;
+
+       return APP_MANAGER_ERROR_NONE;
+}
+
+int app_info_destroy(app_info_h app_info)
+{
+       if (app_info == NULL)
+       {
+               return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       free(app_info->app_id);
+
+       ail_package_destroy_appinfo(app_info->ail_app_info);
+
+       free(app_info); 
+
+       return APP_MANAGER_ERROR_NONE;
+}
+
+int app_info_get_app_id(app_info_h app_info, char **app_id)
+{
+       char *app_id_dup;
+
+       if (app_info == NULL || app_id == NULL)
+       {
+               return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       app_id_dup = strdup(app_info->app_id);
+
+       if (app_id_dup == NULL)
+       {
+               return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
+       }
+
+       *app_id = app_id_dup;
+
+       return APP_MANAGER_ERROR_NONE;
+}
+
+
+int app_info_get_name(app_info_h app_info, char **name)
+{
+       char *ail_value = NULL;
+       char *name_dup;
+
+       if (app_info == NULL || name == NULL)
+       {
+               return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       if (ail_appinfo_get_str(app_info->ail_app_info, AIL_PROP_NAME_STR, &ail_value) != AIL_ERROR_OK)
+       {
+               return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+       }
+
+       name_dup = strdup(ail_value);
+
+       if (name_dup == NULL)
+       {
+               return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
+       }
+
+       *name = name_dup;
+
+       return APP_MANAGER_ERROR_NONE;
+}
+
+
+int app_info_get_version(app_info_h app_info, char **version)
+{
+       char *ail_value = NULL;
+       char *version_dup;
+
+       if (app_info == NULL || version == NULL)
+       {
+               return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       if (ail_appinfo_get_str(app_info->ail_app_info, AIL_PROP_VERSION_STR, &ail_value) != AIL_ERROR_OK)
+       {
+               return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+       }
+
+       version_dup = strdup(ail_value);
+
+       if (version_dup == NULL)
+       {
+               return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
+       }
+
+       *version = version_dup;
+
+       return APP_MANAGER_ERROR_NONE;
+}
+
+
+int app_info_get_icon(app_info_h app_info, char **path)
+{
+       char *ail_value = NULL;
+       char *path_dup;
+
+       if (app_info == NULL || path == NULL)
+       {
+               return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       if (ail_appinfo_get_str(app_info->ail_app_info, AIL_PROP_ICON_STR, &ail_value) != AIL_ERROR_OK)
+       {
+               return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+       }
+
+       path_dup = strdup(ail_value);
+
+       if (path_dup == NULL)
+       {
+               return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
+       }
+
+       *path = path_dup;
+
+       return APP_MANAGER_ERROR_NONE;
+}
+
+
+int app_info_is_equal(app_info_h lhs, app_info_h rhs, bool *equal)
+{
+       if (lhs == NULL || rhs == NULL || equal == NULL)
+       {
+               return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       if (!strcmp(lhs->app_id, rhs->app_id))
+       {
+               *equal = true;
+       }
+       else
+       {
+               *equal = false;
+       }
+
+       return APP_MANAGER_ERROR_NONE;
+}
+
+
+int app_info_clone(app_info_h *clone, app_info_h app_info)
+{
+       int retval;
+
+       if (clone == NULL || app_info == NULL)
+       {
+               return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       retval = app_info_create(app_info->app_id, clone);
+
+       if (retval != APP_MANAGER_ERROR_NONE)
+       {
+               return app_manager_error(retval, __FUNCTION__, NULL);
+       }
+
+       return APP_MANAGER_ERROR_NONE;
+}
+
+static pkgmgr_client *package_event_listener = NULL;
+static app_manager_app_info_event_cb app_info_event_cb = NULL;
+static void *app_info_event_cb_data = NULL;
+
+static app_info_event_e app_info_get_app_info_event(const char *value)
+{
+       if (!strcasecmp(value, "install"))
+       {
+               return APP_INFO_EVENT_INSTALLED;
+       }
+       else if (!strcasecmp(value, "uninstall"))
+       {
+               return APP_INFO_EVENT_UNINSTALLED;      
+       }
+       else if (!strcasecmp(value, "update"))
+       {
+               return APP_INFO_EVENT_UPDATED;          
+       }
+       else
+       {
+               return APP_MANAGER_ERROR_INVALID_PARAMETER;
+       }
+}
+
+static int app_info_package_event_listener_cb(
+       int id, const char *type, const char *package, const char *key, const char *val, const void *msg, void *data)
+{
+       static int event_id = -1;
+       static app_info_event_e event_type = -1;
+
+       if (!strcasecmp(key, "start"))
+       {
+               event_id = id;
+               event_type = app_info_get_app_info_event(val);
+       }
+       else if (!strcasecmp(key, "end") && !strcasecmp(val, "ok") && id == event_id)
+       {
+               if (app_info_event_cb != NULL && event_type >= 0)
+               {
+                       app_info_h app_info;
+                       
+                       if (app_info_create(package, &app_info) == APP_MANAGER_ERROR_NONE)
+                       {
+                               app_info_event_cb(app_info, event_type, app_info_event_cb_data);
+                               app_info_destroy(app_info);
+                       }
+               }
+
+               event_id = -1;
+               event_type = -1;
+       }
+
+       return APP_MANAGER_ERROR_NONE;
+}
+
+int app_info_set_event_cb(app_manager_app_info_event_cb callback, void *user_data)
+{
+       if (callback == NULL)
+       {
+               return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       if (app_info_event_cb == NULL)
+       {
+               package_event_listener = pkgmgr_client_new(PC_LISTENING);
+               
+               if (package_event_listener == NULL)
+               {
+                       return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
+               }
+
+               pkgmgr_client_listen_status(package_event_listener, app_info_package_event_listener_cb, NULL);
+       }
+
+       app_info_event_cb = callback;
+       app_info_event_cb_data = user_data;
+
+       return APP_MANAGER_ERROR_NONE;
+}
+
+
+void app_info_unset_event_cb(void)
+{
+       if (app_info_event_cb != NULL)
+       {
+               pkgmgr_client_free(package_event_listener);
+               package_event_listener = NULL;
+       }
+
+       app_info_event_cb = NULL;
+       app_info_event_cb_data = NULL;
+}
+
index 219fc66..701b3cf 100755 (executable)
 #include <unistd.h>
 
 #include <aul.h>
-#include <aul_service.h>
-#include <vconf.h>
-#include <ail.h>
-#include <package-manager.h>
 #include <dlog.h>
 
-#include <app_manager_private.h>
 #include <app_manager.h>
+#include <app_manager_private.h>
 
 #ifdef LOG_TAG
 #undef LOG_TAG
 
 #define LOG_TAG "TIZEN_N_APP_MANAGER"
 
-typedef struct {
-       app_manager_app_running_cb cb;
-       void *user_data;
-       bool foreach_break;
-} running_apps_foreach_cb_context;
-
-typedef struct {
-       app_manager_app_installed_cb cb;
-       void *user_data;
-} installed_apps_foreach_cb_context;
-
-static pkgmgr_client *package_manager = NULL;
-static app_manager_app_list_changed_cb app_list_changed_cb = NULL;
-static void *app_list_changed_cb_data = NULL;
 
-static int foreach_running_app_cb_broker(const aul_app_info * appcore_app_info, void *appcore_user_data)
+static const char* app_manager_error_to_string(app_manager_error_e error)
 {
-       ail_appinfo_h handle;
-       ail_error_e ret;
-       bool task_manage = false;
-       running_apps_foreach_cb_context *foreach_cb_context = NULL;
-
-       if (appcore_app_info == NULL || appcore_user_data == NULL) 
+       switch (error)
        {
-               LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid callback context", __FUNCTION__, APP_MANAGER_ERROR_INVALID_PARAMETER);
-               return 0;
-       }
+       case APP_MANAGER_ERROR_NONE:
+               return "NONE";
 
-       ret = ail_package_get_appinfo(appcore_app_info->pkg_name, &handle);
-       if (ret != AIL_ERROR_OK)
-       {
-               LOGE("[%s] DB_FAILED(0x%08x) : failed to get the app-info", __FUNCTION__, APP_MANAGER_ERROR_DB_FAILED);
-               return 0;
-       }
+       case APP_MANAGER_ERROR_INVALID_PARAMETER:
+               return "INVALID_PARAMETER";
 
-       // do not call callback function when X-SLP-TaskManage is set to false
-       ret = ail_appinfo_get_bool(handle, AIL_PROP_X_SLP_TASKMANAGE_BOOL, &task_manage);
+       case APP_MANAGER_ERROR_OUT_OF_MEMORY:
+               return "OUT_OF_MEMORY";
 
-       ail_package_destroy_appinfo(handle);
+       case APP_MANAGER_ERROR_IO_ERROR:
+               return "IO_ERROR";
 
-       if (ret != AIL_ERROR_OK || task_manage == false)
-       {
-               return 0;
-       }
+       case APP_MANAGER_ERROR_NO_SUCH_APP:
+               return "NO_SUCH_APP";
 
-       foreach_cb_context = (running_apps_foreach_cb_context *)appcore_user_data;
+       case APP_MANAGER_ERROR_DB_FAILED:
+               return "DB_FAILED";
 
-       if (foreach_cb_context->cb != NULL && foreach_cb_context->foreach_break == false)
-       {
-               if (foreach_cb_context->cb(appcore_app_info->pkg_name, foreach_cb_context->user_data) == false)
-               {
-                       foreach_cb_context->foreach_break = true;
-               }
-       }
+       case APP_MANAGER_ERROR_INVALID_PACKAGE:
+               return "INVALID_PACKAGE";
 
-       return 0;
+       default :
+               return "UNKNOWN";
+       }
 }
 
-static ail_cb_ret_e foreach_installed_app_cb_broker(const ail_appinfo_h appinfo, void *ail_user_data)
+int app_manager_error(app_manager_error_e error, const char* function, const char *description)
 {
-       installed_apps_foreach_cb_context *foreach_cb_context = NULL;
-       char *package;
-
-       if (appinfo == NULL || ail_user_data == NULL)
+       if (description)
        {
-               return AIL_CB_RET_CANCEL;
+               LOGE("[%s] %s(0x%08x) : %s", function, app_manager_error_to_string(error), error, description); 
        }
-
-       foreach_cb_context = (installed_apps_foreach_cb_context *)ail_user_data;
-
-       ail_appinfo_get_str(appinfo, AIL_PROP_PACKAGE_STR, &package);
-
-       if (foreach_cb_context->cb(package, foreach_cb_context->user_data)  == false)
+       else
        {
-               return AIL_CB_RET_CANCEL;
+               LOGE("[%s] %s(0x%08x)", function, app_manager_error_to_string(error), error);   
        }
-       
-       return AIL_CB_RET_CONTINUE;
 
+       return error;
 }
 
 
-static int app_manager_ail_error_handler(ail_error_e ail_error, const char *func)
+int app_manager_set_app_context_event_cb(app_manager_app_context_event_cb callback, void *user_data)
 {
-       int error_code;
-       char *error_msg;
+       int retval;
 
-       switch(ail_error)
+       retval = app_context_set_event_cb(callback, user_data);
+
+       if (retval != APP_MANAGER_ERROR_NONE)
        {
-               case AIL_ERROR_FAIL:
-                       error_code = APP_MANAGER_ERROR_INVALID_PARAMETER;
-                       error_msg = "INVALID_PARAMETER";
-                       break;
-
-               case AIL_ERROR_DB_FAILED:
-                       error_code = APP_MANAGER_ERROR_DB_FAILED;
-                       error_msg = "DB_FAILED";
-                       break;
-
-               case AIL_ERROR_OUT_OF_MEMORY:
-                       error_code = APP_MANAGER_ERROR_OUT_OF_MEMORY;
-                       error_msg = "OUT_OF_MEMORY";
-                       break;
-
-               case AIL_ERROR_INVALID_PARAMETER:
-                       error_code = APP_MANAGER_ERROR_INVALID_PARAMETER;
-                       error_msg = "INVALID_PARAMETER";
-                       break;
-               
-               case AIL_ERROR_OK:
-                       error_code = APP_MANAGER_ERROR_NONE;
-                       break;
-                       
-               default:
-                       error_code = APP_MANAGER_ERROR_INVALID_PARAMETER;
-                       error_msg = "INVALID_PARAMETER";
+               return app_manager_error(retval, __FUNCTION__, NULL);
        }
-
-       if (error_code != APP_MANAGER_ERROR_NONE)
+       else
        {
-               LOGE("[%s] %s(0x%08x)", func, error_msg, error_code);
+               return APP_MANAGER_ERROR_NONE;
        }
-
-       return error_code;
 }
 
-
-int app_manager_foreach_app_running(app_manager_app_running_cb callback, void *user_data)
+void app_manager_unset_app_context_event_cb(void)
 {
-       running_apps_foreach_cb_context foreach_cb_context = {
-               .cb = callback,
-               .user_data = user_data,
-               .foreach_break = false
-       };
-
-       if (callback == NULL)
-       {
-               LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid callback", __FUNCTION__, APP_MANAGER_ERROR_INVALID_PARAMETER);
-               return APP_MANAGER_ERROR_INVALID_PARAMETER;
-       }
-
-       aul_app_get_running_app_info(foreach_running_app_cb_broker, &foreach_cb_context);
-
-       return APP_MANAGER_ERROR_NONE;
+       app_context_unset_event_cb();
 }
 
-int app_manager_is_running(const char *package, bool *is_running)
+int app_manager_foreach_app_context(app_manager_app_context_cb callback, void *user_data)
 {
-       if (package == NULL)
+       int retval;
+
+       retval = app_context_foreach_app_context(callback, user_data);
+
+       if (retval != APP_MANAGER_ERROR_NONE)
        {
-               LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid package", __FUNCTION__, APP_MANAGER_ERROR_INVALID_PARAMETER);
-               return APP_MANAGER_ERROR_INVALID_PARAMETER;
+               return app_manager_error(retval, __FUNCTION__, NULL);
        }
-
-       if (is_running == NULL)
+       else
        {
-               LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid output param", __FUNCTION__, APP_MANAGER_ERROR_INVALID_PARAMETER);
-               return APP_MANAGER_ERROR_INVALID_PARAMETER;
+               return APP_MANAGER_ERROR_NONE;
        }
-
-       *is_running = aul_app_is_running(package);
-
-       return APP_MANAGER_ERROR_NONE;
 }
 
- int app_manager_foreach_app_installed(app_manager_app_installed_cb callback, void *user_data)
+int app_manager_get_app_context(const char *app_id, app_context_h *app_context)
 {
-       ail_filter_h filter;
-       ail_error_e ret;
+       int retval;
+
+       retval = app_context_get_app_context(app_id, app_context);
 
-       if (callback == NULL)
+       if (retval != APP_MANAGER_ERROR_NONE)
        {
-               LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid callback", __FUNCTION__, APP_MANAGER_ERROR_INVALID_PARAMETER);
-               return APP_MANAGER_ERROR_INVALID_PARAMETER;
+               return app_manager_error(retval, __FUNCTION__, NULL);
        }
-
-       ret = ail_filter_new(&filter);
-       if (ret != AIL_ERROR_OK)
+       else
        {
-               return app_manager_ail_error_handler(ret, __FUNCTION__);
+               return APP_MANAGER_ERROR_NONE;
        }
+}
 
-       // Provide visible application to 3rd party developer
-       ret = ail_filter_add_bool(filter, AIL_PROP_NODISPLAY_BOOL, false);
-       if (ret != AIL_ERROR_OK)
+int app_manager_resume_app(app_context_h app_context)
+{
+       char *app_id;
+
+       if (app_context == NULL)
        {
-               ail_filter_destroy(filter);
-               return app_manager_ail_error_handler(ret, __FUNCTION__);
+               return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
        }
 
-       // Provide task manageable app only to 3rd party developer
-       ret = ail_filter_add_bool(filter, AIL_PROP_X_SLP_TASKMANAGE_BOOL, true);
-       if (ret != AIL_ERROR_OK)
+       if (app_context_get_app_id(app_context, &app_id) != APP_MANAGER_ERROR_NONE)
        {
-               ail_filter_destroy(filter);
-               return app_manager_ail_error_handler(ret, __FUNCTION__);
+               return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, "failed to get the application ID");
        }
 
-       installed_apps_foreach_cb_context foreach_cb_context = {
-               .cb = callback,
-               .user_data = user_data,
-       };
-
-       ail_filter_list_appinfo_foreach(filter, foreach_installed_app_cb_broker, &foreach_cb_context);
+       aul_resume_app(app_id);
 
-       ail_filter_destroy(filter);
-       
        return APP_MANAGER_ERROR_NONE;
 }
 
-static int app_manager_get_appinfo(const char *package, const char *property, char **value)
+int app_manager_set_app_info_event_cb(app_manager_app_info_event_cb callback, void *user_data)
 {
-       ail_error_e ail_error;
-       ail_appinfo_h appinfo;
-       char *appinfo_value;
-       char *appinfo_value_dup;
+       int retval;
 
-       ail_error = ail_package_get_appinfo(package, &appinfo);
-       if (ail_error != AIL_ERROR_OK)
-       {
-               return app_manager_ail_error_handler(ail_error, __FUNCTION__);
-       }
+       retval = app_info_set_event_cb(callback, user_data);
 
-       ail_error = ail_appinfo_get_str(appinfo, property, &appinfo_value);
-       if (ail_error != AIL_ERROR_OK)
+       if (retval != APP_MANAGER_ERROR_NONE)
        {
-               ail_package_destroy_appinfo(appinfo);
-               return app_manager_ail_error_handler(ail_error, __FUNCTION__);
+               return app_manager_error(retval, __FUNCTION__, NULL);
        }
-
-       appinfo_value_dup = strdup(appinfo_value);
-
-       ail_package_destroy_appinfo(appinfo);
-
-       if (appinfo_value_dup == NULL)
+       else
        {
-               LOGE("[%s] OUT_OF_MEMORY(0x%08x)", __FUNCTION__, APP_MANAGER_ERROR_OUT_OF_MEMORY);
-               return APP_MANAGER_ERROR_OUT_OF_MEMORY;
+               return APP_MANAGER_ERROR_NONE;
        }
-
-       *value = appinfo_value_dup;
-       
-       return APP_MANAGER_ERROR_NONE;
 }
 
-int app_manager_get_app_name(const char *package, char** name)
+void app_manager_unset_app_info_event_cb(void)
 {
-       if (package == NULL)
-       {
-               LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid package", __FUNCTION__, APP_MANAGER_ERROR_INVALID_PARAMETER);
-               return APP_MANAGER_ERROR_INVALID_PARAMETER;
-       }
-
-       return app_manager_get_appinfo(package, AIL_PROP_NAME_STR, name);
+       app_info_unset_event_cb();
 }
-int app_manager_get_app_icon_path(const char *package, char** icon_path)
-{
-       if (package == NULL)
-       {
-               LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid package", __FUNCTION__, APP_MANAGER_ERROR_INVALID_PARAMETER);
-               return APP_MANAGER_ERROR_INVALID_PARAMETER;
-       }
 
-       return app_manager_get_appinfo(package, AIL_PROP_ICON_STR, icon_path);
-}
 
-int app_manager_get_app_version(const char *package, char** version)
+int app_manager_foreach_app_info(app_manager_app_info_cb callback, void *user_data)
 {
-       if (package == NULL)
-       {
-               LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid package", __FUNCTION__, APP_MANAGER_ERROR_INVALID_PARAMETER);
-               return APP_MANAGER_ERROR_INVALID_PARAMETER;
-       }
+       int retval;
 
-       return app_manager_get_appinfo(package, AIL_PROP_VERSION_STR, version);
-}
+       retval = app_info_foreach_app_info(callback, user_data);
 
-static app_manger_event_type_e app_manager_app_list_pkgmgr_event(const char *value)
-{
-       if (!strcasecmp(value, "install"))
+       if (retval != APP_MANAGER_ERROR_NONE)
        {
-               return APP_MANAGER_EVENT_INSTALLED;
+               return app_manager_error(retval, __FUNCTION__, NULL);
        }
-       else if (!strcasecmp(value, "uninstall"))
+       else
        {
-               return APP_MANAGER_EVENT_UNINSTALLED;   
+               return APP_MANAGER_ERROR_NONE;
        }
-       else if (!strcasecmp(value, "update"))
+}
+
+int app_manager_get_app_info(const char *app_id, app_info_h *app_info)
 {
-               return APP_MANAGER_EVENT_UPDATED;               
+       int retval;
+
+       retval = app_info_get_app_info(app_id, app_info);
+
+       if (retval != APP_MANAGER_ERROR_NONE)
+       {
+               return app_manager_error(retval, __FUNCTION__, NULL);
        }
        else
        {
-               return APP_MANAGER_ERROR_INVALID_PARAMETER;
+               return APP_MANAGER_ERROR_NONE;
        }
 }
 
-static int app_manager_app_list_changed_cb_broker(int id, const char *type, const char *package, const char *key, const char *val, const void *msg, void *data)
-       {
-       static int event_id = -1;
-       static app_manger_event_type_e event_type;
+int app_manager_get_package(pid_t pid, char **package)
+{
+       // TODO: this function must be deprecated
+       return app_manager_get_app_id(pid, package);
+}
+
+int app_manager_get_app_id(pid_t pid, char **app_id)
+{
+       char buffer[256] = {0, };
+       char *app_id_dup = NULL;
 
-       if (!strcasecmp(key, "start"))
+       if (app_id == NULL)
        {
-               event_id = id;
-               event_type = app_manager_app_list_pkgmgr_event(val);
-}
-       else if (!strcasecmp(key, "end") && !strcasecmp(val, "ok") && id == event_id)
+               return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
+       }
+
+       if (aul_app_get_pkgname_bypid(pid, buffer, sizeof(buffer)) != AUL_R_OK)
        {
-               if (app_list_changed_cb != NULL && event_type >= 0)
-               {
-                       app_list_changed_cb(event_type, package, app_list_changed_cb_data);
-               }
+               return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, "Invalid process ID");
+       }
 
-               event_id = -1;
-               event_type = -1;
+       app_id_dup = strdup(buffer);
+
+       if (app_id_dup == NULL)
+       {
+               return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
        }
 
+       *app_id = app_id_dup;
+
        return APP_MANAGER_ERROR_NONE;
+
 }
 
-int app_manager_set_app_list_changed_cb(app_manager_app_list_changed_cb callback, void* user_data)
+int app_manager_terminate_app(app_context_h app_context)
 {
-       if (callback == NULL) 
-{
-               LOGE("[%s] INVALID_PARAMETER(0x%08x)", __FUNCTION__, APP_MANAGER_ERROR_INVALID_PARAMETER);
-               return APP_MANAGER_ERROR_INVALID_PARAMETER;
-       }
+       pid_t pid = 0;
 
-       if (app_list_changed_cb == NULL)
+       if (app_context == NULL)
        {
-               package_manager = pkgmgr_client_new(PC_LISTENING);
-
-               if (package_manager == NULL)
-       {
-                       LOGE("[%s] OUT_OF_MEMORY(0x%08x)", __FUNCTION__, APP_MANAGER_ERROR_OUT_OF_MEMORY);
-                       return APP_MANAGER_ERROR_OUT_OF_MEMORY;
+               return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
        }
-       
-               pkgmgr_client_listen_status(package_manager, app_manager_app_list_changed_cb_broker, NULL);
+
+       if (app_context_get_pid(app_context, &pid) != APP_MANAGER_ERROR_NONE) {
+               return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, "failed to get the process ID");
        }
 
-       app_list_changed_cb = callback;
-       app_list_changed_cb_data = user_data;
+       aul_terminate_pid(pid);
 
        return APP_MANAGER_ERROR_NONE;
-       }
+}
 
-int app_manager_unset_app_list_changed_cb()
+int app_manager_is_running(const char *app_id, bool *running)
+{
+       if (app_id == NULL)
        {
-       if (app_list_changed_cb != NULL)
+               LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid package", __FUNCTION__, APP_MANAGER_ERROR_INVALID_PARAMETER);
+               return APP_MANAGER_ERROR_INVALID_PARAMETER;
+       }
+
+       if (running == NULL)
        {
-               pkgmgr_client_free(package_manager);
-               package_manager = NULL;
+               LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid output param", __FUNCTION__, APP_MANAGER_ERROR_INVALID_PARAMETER);
+               return APP_MANAGER_ERROR_INVALID_PARAMETER;
        }
 
-       app_list_changed_cb = NULL;
-       app_list_changed_cb_data = NULL;
+       *running = aul_app_is_running(app_id);
 
        return APP_MANAGER_ERROR_NONE;
 }
-
diff --git a/src/app_manager_deprecated.c b/src/app_manager_deprecated.c
new file mode 100755 (executable)
index 0000000..9e84566
--- /dev/null
@@ -0,0 +1,366 @@
+/*
+ * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License. 
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <aul.h>
+#include <aul_service.h>
+#include <vconf.h>
+#include <ail.h>
+#include <package-manager.h>
+#include <dlog.h>
+
+#include <app_manager.h>
+#include <app_manager_private.h>
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#endif
+
+#define LOG_TAG "TIZEN_N_APP_MANAGER"
+
+typedef struct {
+       app_manager_app_running_cb cb;
+       void *user_data;
+       bool foreach_break;
+} running_apps_foreach_cb_context;
+
+typedef struct {
+       app_manager_app_installed_cb cb;
+       void *user_data;
+} installed_apps_foreach_cb_context;
+
+static pkgmgr_client *package_manager = NULL;
+static app_manager_app_list_changed_cb app_list_changed_cb = NULL;
+static void *app_list_changed_cb_data = NULL;
+
+static int foreach_running_app_cb_broker(const aul_app_info * appcore_app_info, void *appcore_user_data)
+{
+       ail_appinfo_h handle;
+       ail_error_e ret;
+       bool task_manage = false;
+       running_apps_foreach_cb_context *foreach_cb_context = NULL;
+
+       if (appcore_app_info == NULL || appcore_user_data == NULL) 
+       {
+               LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid callback context", __FUNCTION__, APP_MANAGER_ERROR_INVALID_PARAMETER);
+               return 0;
+       }
+
+       ret = ail_package_get_appinfo(appcore_app_info->pkg_name, &handle);
+       if (ret != AIL_ERROR_OK)
+       {
+               LOGE("[%s] DB_FAILED(0x%08x) : failed to get the app-info", __FUNCTION__, APP_MANAGER_ERROR_DB_FAILED);
+               return 0;
+       }
+
+       // do not call callback function when X-SLP-TaskManage is set to false
+       ret = ail_appinfo_get_bool(handle, AIL_PROP_X_SLP_TASKMANAGE_BOOL, &task_manage);
+
+       ail_package_destroy_appinfo(handle);
+
+       if (ret != AIL_ERROR_OK || task_manage == false)
+       {
+               return 0;
+       }
+
+       foreach_cb_context = (running_apps_foreach_cb_context *)appcore_user_data;
+
+       if (foreach_cb_context->cb != NULL && foreach_cb_context->foreach_break == false)
+       {
+               if (foreach_cb_context->cb(appcore_app_info->pkg_name, foreach_cb_context->user_data) == false)
+               {
+                       foreach_cb_context->foreach_break = true;
+               }
+       }
+
+       return 0;
+}
+
+static ail_cb_ret_e foreach_installed_app_cb_broker(const ail_appinfo_h appinfo, void *ail_user_data)
+{
+       installed_apps_foreach_cb_context *foreach_cb_context = NULL;
+       char *package;
+
+       if (appinfo == NULL || ail_user_data == NULL)
+       {
+               return AIL_CB_RET_CANCEL;
+       }
+
+       foreach_cb_context = (installed_apps_foreach_cb_context *)ail_user_data;
+
+       ail_appinfo_get_str(appinfo, AIL_PROP_PACKAGE_STR, &package);
+
+       if (foreach_cb_context->cb(package, foreach_cb_context->user_data)  == false)
+       {
+               return AIL_CB_RET_CANCEL;
+       }
+       
+       return AIL_CB_RET_CONTINUE;
+
+}
+
+
+static int app_manager_ail_error_handler(ail_error_e ail_error, const char *func)
+{
+       int error_code;
+       char *error_msg;
+
+       switch(ail_error)
+       {
+               case AIL_ERROR_FAIL:
+                       error_code = APP_MANAGER_ERROR_INVALID_PARAMETER;
+                       error_msg = "INVALID_PARAMETER";
+                       break;
+
+               case AIL_ERROR_DB_FAILED:
+                       error_code = APP_MANAGER_ERROR_DB_FAILED;
+                       error_msg = "DB_FAILED";
+                       break;
+
+               case AIL_ERROR_OUT_OF_MEMORY:
+                       error_code = APP_MANAGER_ERROR_OUT_OF_MEMORY;
+                       error_msg = "OUT_OF_MEMORY";
+                       break;
+
+               case AIL_ERROR_INVALID_PARAMETER:
+                       error_code = APP_MANAGER_ERROR_INVALID_PARAMETER;
+                       error_msg = "INVALID_PARAMETER";
+                       break;
+               
+               case AIL_ERROR_OK:
+                       error_code = APP_MANAGER_ERROR_NONE;
+                       break;
+                       
+               default:
+                       error_code = APP_MANAGER_ERROR_INVALID_PARAMETER;
+                       error_msg = "INVALID_PARAMETER";
+       }
+
+       if (error_code != APP_MANAGER_ERROR_NONE)
+       {
+               LOGE("[%s] %s(0x%08x)", func, error_msg, error_code);
+       }
+
+       return error_code;
+}
+
+
+int app_manager_foreach_app_running(app_manager_app_running_cb callback, void *user_data)
+{
+       running_apps_foreach_cb_context foreach_cb_context = {
+               .cb = callback,
+               .user_data = user_data,
+               .foreach_break = false
+       };
+
+       if (callback == NULL)
+       {
+               LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid callback", __FUNCTION__, APP_MANAGER_ERROR_INVALID_PARAMETER);
+               return APP_MANAGER_ERROR_INVALID_PARAMETER;
+       }
+
+       aul_app_get_running_app_info(foreach_running_app_cb_broker, &foreach_cb_context);
+
+       return APP_MANAGER_ERROR_NONE;
+}
+
+ int app_manager_foreach_app_installed(app_manager_app_installed_cb callback, void *user_data)
+{
+       ail_filter_h filter;
+       ail_error_e ret;
+
+       if (callback == NULL)
+       {
+               LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid callback", __FUNCTION__, APP_MANAGER_ERROR_INVALID_PARAMETER);
+               return APP_MANAGER_ERROR_INVALID_PARAMETER;
+       }
+
+       ret = ail_filter_new(&filter);
+       if (ret != AIL_ERROR_OK)
+       {
+               return app_manager_ail_error_handler(ret, __FUNCTION__);
+       }
+
+       installed_apps_foreach_cb_context foreach_cb_context = {
+               .cb = callback,
+               .user_data = user_data,
+       };
+
+       ail_filter_list_appinfo_foreach(filter, foreach_installed_app_cb_broker, &foreach_cb_context);
+
+       ail_filter_destroy(filter);
+       
+       return APP_MANAGER_ERROR_NONE;
+}
+
+static int app_manager_get_appinfo(const char *package, const char *property, char **value)
+{
+       ail_error_e ail_error;
+       ail_appinfo_h appinfo;
+       char *appinfo_value;
+       char *appinfo_value_dup;
+
+       ail_error = ail_package_get_appinfo(package, &appinfo);
+       if (ail_error != AIL_ERROR_OK)
+       {
+               return app_manager_ail_error_handler(ail_error, __FUNCTION__);
+       }
+
+       ail_error = ail_appinfo_get_str(appinfo, property, &appinfo_value);
+       if (ail_error != AIL_ERROR_OK)
+       {
+               ail_package_destroy_appinfo(appinfo);
+               return app_manager_ail_error_handler(ail_error, __FUNCTION__);
+       }
+
+       appinfo_value_dup = strdup(appinfo_value);
+
+       ail_package_destroy_appinfo(appinfo);
+
+       if (appinfo_value_dup == NULL)
+       {
+               LOGE("[%s] OUT_OF_MEMORY(0x%08x)", __FUNCTION__, APP_MANAGER_ERROR_OUT_OF_MEMORY);
+               return APP_MANAGER_ERROR_OUT_OF_MEMORY;
+       }
+
+       *value = appinfo_value_dup;
+       
+       return APP_MANAGER_ERROR_NONE;
+}
+
+int app_manager_get_app_name(const char *package, char** name)
+{
+       if (package == NULL)
+       {
+               LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid package", __FUNCTION__, APP_MANAGER_ERROR_INVALID_PARAMETER);
+               return APP_MANAGER_ERROR_INVALID_PARAMETER;
+       }
+
+       return app_manager_get_appinfo(package, AIL_PROP_NAME_STR, name);
+}
+int app_manager_get_app_icon_path(const char *package, char** icon_path)
+{
+       if (package == NULL)
+       {
+               LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid package", __FUNCTION__, APP_MANAGER_ERROR_INVALID_PARAMETER);
+               return APP_MANAGER_ERROR_INVALID_PARAMETER;
+       }
+
+       return app_manager_get_appinfo(package, AIL_PROP_ICON_STR, icon_path);
+}
+
+int app_manager_get_app_version(const char *package, char** version)
+{
+       if (package == NULL)
+       {
+               LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid package", __FUNCTION__, APP_MANAGER_ERROR_INVALID_PARAMETER);
+               return APP_MANAGER_ERROR_INVALID_PARAMETER;
+       }
+
+       return app_manager_get_appinfo(package, AIL_PROP_VERSION_STR, version);
+}
+
+static app_manger_event_type_e app_manager_app_list_pkgmgr_event(const char *value)
+{
+       if (!strcasecmp(value, "install"))
+       {
+               return APP_MANAGER_EVENT_INSTALLED;
+       }
+       else if (!strcasecmp(value, "uninstall"))
+       {
+               return APP_MANAGER_EVENT_UNINSTALLED;   
+       }
+       else if (!strcasecmp(value, "update"))
+       {
+               return APP_MANAGER_EVENT_UPDATED;               
+       }
+       else
+       {
+               return APP_MANAGER_ERROR_INVALID_PARAMETER;
+       }
+}
+
+static int app_manager_app_list_changed_cb_broker(int id, const char *type, const char *package, const char *key, const char *val, const void *msg, void *data)
+{
+       static int event_id = -1;
+       static app_manger_event_type_e event_type;
+
+       if (!strcasecmp(key, "start"))
+       {
+               event_id = id;
+               event_type = app_manager_app_list_pkgmgr_event(val);
+       }
+       else if (!strcasecmp(key, "end") && !strcasecmp(val, "ok") && id == event_id)
+       {
+               if (app_list_changed_cb != NULL && event_type >= 0)
+               {
+                       app_list_changed_cb(event_type, package, app_list_changed_cb_data);
+               }
+
+               event_id = -1;
+               event_type = -1;
+       }
+
+       return APP_MANAGER_ERROR_NONE;
+}
+
+int app_manager_set_app_list_changed_cb(app_manager_app_list_changed_cb callback, void* user_data)
+{
+       if (callback == NULL) 
+       {
+               LOGE("[%s] INVALID_PARAMETER(0x%08x)", __FUNCTION__, APP_MANAGER_ERROR_INVALID_PARAMETER);
+               return APP_MANAGER_ERROR_INVALID_PARAMETER;
+       }
+
+       if (app_list_changed_cb == NULL)
+       {
+               package_manager = pkgmgr_client_new(PC_LISTENING);
+
+               if (package_manager == NULL)
+               {
+                       LOGE("[%s] OUT_OF_MEMORY(0x%08x)", __FUNCTION__, APP_MANAGER_ERROR_OUT_OF_MEMORY);
+                       return APP_MANAGER_ERROR_OUT_OF_MEMORY;
+               }
+
+               pkgmgr_client_listen_status(package_manager, app_manager_app_list_changed_cb_broker, NULL);
+       }
+
+       app_list_changed_cb = callback;
+       app_list_changed_cb_data = user_data;
+
+       return APP_MANAGER_ERROR_NONE;
+}
+
+int app_manager_unset_app_list_changed_cb()
+{      
+       if (app_list_changed_cb != NULL)
+       {
+               pkgmgr_client_free(package_manager);
+               package_manager = NULL;
+       }
+
+       app_list_changed_cb = NULL;
+       app_list_changed_cb_data = NULL;
+
+       return APP_MANAGER_ERROR_NONE;
+}
+