diff options
-rwxr-xr-x | CMakeLists.txt | 2 | ||||
-rw-r--r--[-rwxr-xr-x] | debian/README | 0 | ||||
-rw-r--r--[-rwxr-xr-x] | debian/capi-appfw-app-manager-dev.install | 0 | ||||
-rw-r--r--[-rwxr-xr-x] | debian/capi-appfw-app-manager-dev.postinst | 0 | ||||
-rw-r--r--[-rwxr-xr-x] | debian/capi-appfw-app-manager.install | 0 | ||||
-rw-r--r--[-rwxr-xr-x] | debian/capi-appfw-app-manager.postinst | 0 | ||||
-rw-r--r--[-rwxr-xr-x] | debian/changelog | 121 | ||||
-rw-r--r--[-rwxr-xr-x] | debian/compat | 0 | ||||
-rwxr-xr-x | debian/control | 4 | ||||
-rwxr-xr-x | include/app_context.h | 159 | ||||
-rwxr-xr-x | include/app_info.h | 144 | ||||
-rwxr-xr-x | include/app_manager.h | 255 | ||||
-rwxr-xr-x | include/app_manager_deprecated.h | 189 | ||||
-rwxr-xr-x | include/app_manager_private.h | 27 | ||||
-rw-r--r--[-rwxr-xr-x] | packaging/capi-appfw-app-manager.spec | 10 | ||||
-rwxr-xr-x | src/app_context.c | 492 | ||||
-rwxr-xr-x | src/app_info.c | 395 | ||||
-rwxr-xr-x | src/app_manager.c | 395 | ||||
-rwxr-xr-x | src/app_manager_deprecated.c | 366 |
19 files changed, 2193 insertions, 366 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 5d95bd9..3f23595 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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) diff --git a/debian/README b/debian/README index e69de29..e69de29 100755..100644 --- a/debian/README +++ b/debian/README diff --git a/debian/capi-appfw-app-manager-dev.install b/debian/capi-appfw-app-manager-dev.install index 761a28b..761a28b 100755..100644 --- a/debian/capi-appfw-app-manager-dev.install +++ b/debian/capi-appfw-app-manager-dev.install diff --git a/debian/capi-appfw-app-manager-dev.postinst b/debian/capi-appfw-app-manager-dev.postinst index 1a24852..1a24852 100755..100644 --- a/debian/capi-appfw-app-manager-dev.postinst +++ b/debian/capi-appfw-app-manager-dev.postinst diff --git a/debian/capi-appfw-app-manager.install b/debian/capi-appfw-app-manager.install index 4a755a4..4a755a4 100755..100644 --- a/debian/capi-appfw-app-manager.install +++ b/debian/capi-appfw-app-manager.install diff --git a/debian/capi-appfw-app-manager.postinst b/debian/capi-appfw-app-manager.postinst index 1a24852..1a24852 100755..100644 --- a/debian/capi-appfw-app-manager.postinst +++ b/debian/capi-appfw-app-manager.postinst diff --git a/debian/changelog b/debian/changelog index b7c47e4..95f103f 100755..100644 --- a/debian/changelog +++ b/debian/changelog @@ -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 diff --git a/debian/compat b/debian/compat index 7ed6ff8..7ed6ff8 100755..100644 --- a/debian/compat +++ b/debian/compat diff --git a/debian/control b/debian/control index 45102ab..710fff9 100755 --- a/debian/control +++ b/debian/control @@ -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 index 0000000..79e8eb1 --- /dev/null +++ b/include/app_context.h @@ -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 index 0000000..4b1fa53 --- /dev/null +++ b/include/app_info.h @@ -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 */ diff --git a/include/app_manager.h b/include/app_manager.h index 72362b2..93ae325 100755 --- a/include/app_manager.h +++ b/include/app_manager.h @@ -20,6 +20,11 @@ #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 index 0000000..4d3f25c --- /dev/null +++ b/include/app_manager_deprecated.h @@ -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 */ + diff --git a/include/app_manager_private.h b/include/app_manager_private.h index 17088da..e5837a1 100755 --- a/include/app_manager_private.h +++ b/include/app_manager_private.h @@ -18,15 +18,34 @@ #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__ */ + diff --git a/packaging/capi-appfw-app-manager.spec b/packaging/capi-appfw-app-manager.spec index 9c47400..7267feb 100755..100644 --- a/packaging/capi-appfw-app-manager.spec +++ b/packaging/capi-appfw-app-manager.spec @@ -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 index 0000000..641399f --- /dev/null +++ b/src/app_context.c @@ -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 index 0000000..66738e1 --- /dev/null +++ b/src/app_info.c @@ -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; +} + diff --git a/src/app_manager.c b/src/app_manager.c index 219fc66..701b3cf 100755 --- a/src/app_manager.c +++ b/src/app_manager.c @@ -21,14 +21,10 @@ #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 @@ -36,366 +32,245 @@ #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 index 0000000..9e84566 --- /dev/null +++ b/src/app_manager_deprecated.c @@ -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; +} + |