Upload Tizen2.0 source
[framework/api/app-manager.git] / src / app_manager.c
index cf87e86..701b3cf 100755 (executable)
 #include <unistd.h>
 
 #include <aul.h>
-#include <aul_service.h>
-#include <vconf.h>
-#include <ail.h>
 #include <dlog.h>
 
-#include <app_manager_private.h>
 #include <app_manager.h>
+#include <app_manager_private.h>
 
 #ifdef LOG_TAG
 #undef LOG_TAG
 
 #define LOG_TAG "TIZEN_N_APP_MANAGER"
 
-#define MENU_PKG_VCONF_KEY "memory/menuscreen/desktop"
 
-#define EVENT_CREATE "create"
-#define EVENT_UPDATE "update"
-#define EVENT_DELETE "delete"
+static const char* app_manager_error_to_string(app_manager_error_e error)
+{
+       switch (error)
+       {
+       case APP_MANAGER_ERROR_NONE:
+               return "NONE";
 
-typedef struct {
-       app_manager_app_running_cb cb;
-       void *user_data;
-       bool *foreach_break;
-} running_apps_foreach_cb_context;
+       case APP_MANAGER_ERROR_INVALID_PARAMETER:
+               return "INVALID_PARAMETER";
 
-typedef struct {
-       app_manager_app_installed_cb cb;
-       void *user_data;
-} installed_apps_foreach_cb_context;
+       case APP_MANAGER_ERROR_OUT_OF_MEMORY:
+               return "OUT_OF_MEMORY";
 
-static app_manager_app_list_changed_cb app_list_changed_cb = NULL;
+       case APP_MANAGER_ERROR_IO_ERROR:
+               return "IO_ERROR";
 
-static void app_manager_meun_pkg_changed(keynode_t* node, void *data);
+       case APP_MANAGER_ERROR_NO_SUCH_APP:
+               return "NO_SUCH_APP";
 
-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;
+       case APP_MANAGER_ERROR_DB_FAILED:
+               return "DB_FAILED";
 
-       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;
-       }
+       case APP_MANAGER_ERROR_INVALID_PACKAGE:
+               return "INVALID_PACKAGE";
 
-       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;
+       default :
+               return "UNKNOWN";
        }
+}
 
-       // 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)
+int app_manager_error(app_manager_error_e error, const char* function, const char *description)
+{
+       if (description)
        {
-               return 0;
+               LOGE("[%s] %s(0x%08x) : %s", function, app_manager_error_to_string(error), error, description); 
        }
-
-       foreach_cb_context = (running_apps_foreach_cb_context *)appcore_user_data;
-
-       if (foreach_cb_context->cb != NULL && *(foreach_cb_context->foreach_break) == false)
+       else
        {
-               if (foreach_cb_context->cb(appcore_app_info->pkg_name, foreach_cb_context->user_data) == false)
-               {
-                       *(foreach_cb_context->foreach_break) = true;
-               }
+               LOGE("[%s] %s(0x%08x)", function, app_manager_error_to_string(error), error);   
        }
 
-       return 0;
+       return error;
 }
 
-static ail_cb_ret_e foreach_installed_app_cb_broker(const ail_appinfo_h appinfo, void *ail_user_data)
+
+int app_manager_set_app_context_event_cb(app_manager_app_context_event_cb callback, void *user_data)
 {
-       installed_apps_foreach_cb_context *foreach_cb_context = NULL;
-       char *package;
+       int retval;
 
-       if (appinfo == NULL || ail_user_data == NULL)
+       retval = app_context_set_event_cb(callback, user_data);
+
+       if (retval != APP_MANAGER_ERROR_NONE)
        {
-               return AIL_CB_RET_CANCEL;
+               return app_manager_error(retval, __FUNCTION__, NULL);
        }
-
-       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;
+               return APP_MANAGER_ERROR_NONE;
        }
-       
-       return AIL_CB_RET_CONTINUE;
-
 }
 
+void app_manager_unset_app_context_event_cb(void)
+{
+       app_context_unset_event_cb();
+}
 
-static int app_manager_ail_error_handler(ail_error_e ail_error, const char *func)
+int app_manager_foreach_app_context(app_manager_app_context_cb callback, void *user_data)
 {
-       int error_code;
-       char *error_msg;
+       int retval;
 
-       switch(ail_error)
+       retval = app_context_foreach_app_context(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)
+int app_manager_get_app_context(const char *app_id, app_context_h *app_context)
 {
-       bool foreach_break = false;
+       int retval;
 
-       running_apps_foreach_cb_context foreach_cb_context = {
-               .cb = callback,
-               .user_data = user_data,
-               .foreach_break = &foreach_break
-       };
+       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);
+       }
+       else
+       {
+               return APP_MANAGER_ERROR_NONE;
        }
-
-       aul_app_get_running_app_info(foreach_running_app_cb_broker, &foreach_cb_context);
-
-       return APP_MANAGER_ERROR_NONE;
 }
 
-int app_manager_is_running(const char *package, bool *is_running)
+int app_manager_resume_app(app_context_h app_context)
 {
-       if (package == NULL)
+       char *app_id;
+
+       if (app_context == NULL)
        {
-               LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid package", __FUNCTION__, APP_MANAGER_ERROR_INVALID_PARAMETER);
-               return APP_MANAGER_ERROR_INVALID_PARAMETER;
+               return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
        }
 
-       if (is_running == NULL)
+       if (app_context_get_app_id(app_context, &app_id) != APP_MANAGER_ERROR_NONE)
        {
-               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(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, "failed to get the application ID");
        }
 
-       *is_running = aul_app_is_running(package);
+       aul_resume_app(app_id);
 
        return APP_MANAGER_ERROR_NONE;
 }
 
- int app_manager_foreach_app_installed(app_manager_app_installed_cb callback, void *user_data)
+int app_manager_set_app_info_event_cb(app_manager_app_info_event_cb callback, void *user_data)
 {
-       ail_filter_h filter;
-       ail_error_e ret;
+       int retval;
 
-       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__);
-       }
+       retval = app_info_set_event_cb(callback, user_data);
 
-       // Provide visible application to 3rd party developer
-       ret = ail_filter_add_bool(filter, AIL_PROP_NODISPLAY_BOOL, false);
-       if (ret != AIL_ERROR_OK)
+       if (retval != APP_MANAGER_ERROR_NONE)
        {
-               ail_filter_destroy(filter);
-               return app_manager_ail_error_handler(ret, __FUNCTION__);
+               return app_manager_error(retval, __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)
+       else
        {
-               ail_filter_destroy(filter);
-               return app_manager_ail_error_handler(ret, __FUNCTION__);
+               return APP_MANAGER_ERROR_NONE;
        }
+}
 
-       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;
+void app_manager_unset_app_info_event_cb(void)
+{
+       app_info_unset_event_cb();
 }
 
-static int app_manager_get_appinfo(const char *package, ail_prop_str_e property, char **value)
+
+int app_manager_foreach_app_info(app_manager_app_info_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_foreach_app_info(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)
+int app_manager_get_app_info(const char *app_id, app_info_h *app_info)
 {
-       if (package == NULL)
+       int retval;
+
+       retval = app_info_get_app_info(app_id, app_info);
+
+       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);
        }
-
-       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)
+       else
        {
-               LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid package", __FUNCTION__, APP_MANAGER_ERROR_INVALID_PARAMETER);
-               return APP_MANAGER_ERROR_INVALID_PARAMETER;
+               return APP_MANAGER_ERROR_NONE;
        }
-
-       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_get_package(pid_t pid, char **package)
 {
-       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);
+       // TODO: this function must be deprecated
+       return app_manager_get_app_id(pid, package);
 }
 
-int app_manager_set_app_list_changed_cb(app_manager_app_list_changed_cb callback, void* user_data)
+int app_manager_get_app_id(pid_t pid, char **app_id)
 {
-       if (callback == NULL) 
+       char buffer[256] = {0, };
+       char *app_id_dup = NULL;
+
+       if (app_id == NULL)
        {
-               LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid callback", __FUNCTION__, APP_MANAGER_ERROR_INVALID_PARAMETER);
-               return APP_MANAGER_ERROR_INVALID_PARAMETER;
+               return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
        }
 
-       if (app_list_changed_cb == NULL)
+       if (aul_app_get_pkgname_bypid(pid, buffer, sizeof(buffer)) != AUL_R_OK)
        {
-               vconf_notify_key_changed(MENU_PKG_VCONF_KEY, app_manager_meun_pkg_changed, user_data);
+               return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, "Invalid process ID");
        }
 
-       app_list_changed_cb = callback;
-
-       return APP_MANAGER_ERROR_NONE;
-}
+       app_id_dup = strdup(buffer);
 
-int app_manager_unset_app_list_changed_cb()
-{      
-       if (app_list_changed_cb != NULL)
+       if (app_id_dup == NULL)
        {
-               if (vconf_ignore_key_changed(MENU_PKG_VCONF_KEY, app_manager_meun_pkg_changed))
-               {
-                       LOGE("[%s] DB_FAILED(0x%08x)", __FUNCTION__, APP_MANAGER_ERROR_DB_FAILED);
-                       return APP_MANAGER_ERROR_DB_FAILED;
-               }
+               return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
        }
 
-       app_list_changed_cb = NULL;
+       *app_id = app_id_dup;
 
        return APP_MANAGER_ERROR_NONE;
+
 }
 
-static void app_manager_meun_pkg_changed(keynode_t* node, void *data)
+int app_manager_terminate_app(app_context_h app_context)
 {
-       char *pkg_event;
-       char type[10];
-       char package[1024];
-
-       pkg_event = vconf_get_str(vconf_keynode_get_name(node));
-       if(!pkg_event) {
-               LOGE("[%s] failed to get the package event");
-               return;
-       }
+       pid_t pid = 0;
 
-       if (sscanf(pkg_event, "%10[^:]:%1023s", type, package) != 2)
+       if (app_context == NULL)
        {
-               LOGE("[%s] failed to parse the package event format : [%s], [%s]", __FUNCTION__, type, package);
+               return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
        }
 
-
-       if(app_list_changed_cb == NULL)
-       {
-               return;
-       }
-       
-       if(!strcasecmp(type, EVENT_CREATE))
-       {
-               // A new application has been installed.
-               app_list_changed_cb(APP_MANAGER_EVENT_INSTALLED, package, data);
-       }
-       else if( !strcasecmp(type, EVENT_UPDATE))
-       {
-               // An existing application has been updated.
-               app_list_changed_cb(APP_MANAGER_EVENT_UPDATED , package, data);
+       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");
        }
 
-       else if( !strcasecmp(type, EVENT_DELETE))
+       aul_terminate_pid(pid);
+
+       return APP_MANAGER_ERROR_NONE;
+}
+
+int app_manager_is_running(const char *app_id, bool *running)
+{
+       if (app_id == NULL)
        {
-               // An existing application has been uninstalled.
-               app_list_changed_cb(APP_MANAGER_EVENT_UNINSTALLED  , package, data);
+               LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid package", __FUNCTION__, APP_MANAGER_ERROR_INVALID_PARAMETER);
+               return APP_MANAGER_ERROR_INVALID_PARAMETER;
        }
-       else
+
+       if (running == NULL)
        {
-               LOGE("[%s] invalid event : type(%s)", __FUNCTION__, type);
+               LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid output param", __FUNCTION__, APP_MANAGER_ERROR_INVALID_PARAMETER);
+               return APP_MANAGER_ERROR_INVALID_PARAMETER;
        }
 
-}
+       *running = aul_app_is_running(app_id);
 
+       return APP_MANAGER_ERROR_NONE;
+}