diff options
author | Junghoon Park <jh9216.park@samsung.com> | 2016-08-05 17:44:41 +0900 |
---|---|---|
committer | Junghoon Park <jh9216.park@samsung.com> | 2017-02-10 10:59:03 +0900 |
commit | 7793bf891bae20429871984c85a8298b6be05069 (patch) | |
tree | b5d254910a956a15d2146cdaaceff0bcfe9dda7b /src | |
parent | 8de4e7c19fab704fec3f393252a676e2da091c41 (diff) | |
download | appcore-agent-7793bf891bae20429871984c85a8298b6be05069.tar.gz appcore-agent-7793bf891bae20429871984c85a8298b6be05069.tar.bz2 appcore-agent-7793bf891bae20429871984c85a8298b6be05069.zip |
Refactor APIs using appcore_base
Change-Id: I6288e37a431da6b6202eb5a9c52aa80a31075177
Signed-off-by: Junghoon Park <jh9216.park@samsung.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/appcore-agent.c | 1118 | ||||
-rw-r--r-- | src/service_app_error.c | 60 | ||||
-rw-r--r-- | src/service_app_main.c | 480 | ||||
-rw-r--r-- | src/service_app_private.h | 34 |
4 files changed, 130 insertions, 1562 deletions
diff --git a/src/appcore-agent.c b/src/appcore-agent.c deleted file mode 100644 index 591eaac..0000000 --- a/src/appcore-agent.c +++ /dev/null @@ -1,1118 +0,0 @@ -/* - * service-app-core - * - * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>, Jaeho Lee <jaeho81.lee@samsung.com> - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - -#define _GNU_SOURCE - -#include <errno.h> -#include <string.h> -#include <stdlib.h> -#include <sys/types.h> -#include <unistd.h> -#include <malloc.h> -#include <Ecore.h> -#include <linux/limits.h> -#include <dlfcn.h> -#include <glib.h> - -#include <bundle.h> -#include <aul.h> -#include <appcore-common.h> -#include <app_control_internal.h> -#include <dlog.h> -#include <vconf.h> -#include <system_info.h> - -#include "appcore-agent.h" - -#include <gio/gio.h> - -#define RESOURCED_FREEZER_PATH "/Org/Tizen/Resourced/Freezer" -#define RESOURCED_FREEZER_INTERFACE "org.tizen.resourced.frezer" -#define RESOURCED_FREEZER_SIGNAL "FreezerState" -#define APPFW_SUSPEND_HINT_PATH "/Org/Tizen/Appfw/SuspendHint" -#define APPFW_SUSPEND_HINT_INTERFACE "org.tizen.appfw.SuspendHint" -#define APPFW_SUSPEND_HINT_SIGNAL "SuspendHint" - -#ifdef LOG_TAG -#undef LOG_TAG -#endif - -#define LOG_TAG "APPCORE_AGENT" -#define SQLITE_FLUSH_MAX (1024 * 1024) - -#define _ERR(fmt, arg...) LOGE(fmt, ##arg) -#define _INFO(fmt, arg...) LOGI(fmt, ##arg) -#define _DBG(fmt, arg...) LOGD(fmt, ##arg) - -#ifndef EXPORT_API -#define EXPORT_API __attribute__ ((visibility("default"))) -#endif - -#ifndef _ERR -#define _ERR(fmt, arg...) LOGE(fmt, ##arg) -#endif - -#ifndef _INFO -#define _INFO(...) LOGI(__VA_ARGS__) -#endif - -#ifndef _DBG -#define _DBG(...) LOGD(__VA_ARGS__) -#endif - -#define _warn_if(expr, fmt, arg...) do { \ - if (expr) { \ - _ERR(fmt, ##arg); \ - } \ - } while (0) - -#define _ret_if(expr) do { \ - if (expr) { \ - return; \ - } \ - } while (0) - -#define _retv_if(expr, val) do { \ - if (expr) { \ - return (val); \ - } \ - } while (0) - -#define _retm_if(expr, fmt, arg...) do { \ - if (expr) { \ - _ERR(fmt, ##arg); \ - return; \ - } \ - } while (0) - -#define _retvm_if(expr, val, fmt, arg...) do { \ - if (expr) { \ - _ERR(fmt, ##arg); \ - return (val); \ - } \ - } while (0) - -#define APPID_MAX 256 -#define PATH_LOCALE "locale" - - -typedef enum { - TIZEN_PROFILE_UNKNOWN = 0, - TIZEN_PROFILE_MOBILE = 0x1, - TIZEN_PROFILE_WEARABLE = 0x2, - TIZEN_PROFILE_TV = 0x4, - TIZEN_PROFILE_IVI = 0x8, - TIZEN_PROFILE_COMMON = 0x10, -} tizen_profile_t; - -static tizen_profile_t _get_tizen_profile() -{ - static tizen_profile_t profile = TIZEN_PROFILE_UNKNOWN; - char *profileName; - - if (__builtin_expect(profile != TIZEN_PROFILE_UNKNOWN, 1)) - return profile; - - system_info_get_platform_string("http://tizen.org/feature/profile", &profileName); - switch (*profileName) { - case 'm': - case 'M': - profile = TIZEN_PROFILE_MOBILE; - break; - case 'w': - case 'W': - profile = TIZEN_PROFILE_WEARABLE; - break; - case 't': - case 'T': - profile = TIZEN_PROFILE_TV; - break; - case 'i': - case 'I': - profile = TIZEN_PROFILE_IVI; - break; - default: // common or unknown ==> ALL ARE COMMON. - profile = TIZEN_PROFILE_COMMON; - } - free(profileName); - - return profile; -} -#define TIZEN_FEATURE_BACKGROUND_MANAGEMENT (_get_tizen_profile() & (TIZEN_PROFILE_MOBILE | TIZEN_PROFILE_WEARABLE)) - -static pid_t _pid; - -/** - * Appcore internal system event - */ -enum sys_event { - SE_UNKNOWN, - SE_LOWMEM, - SE_LOWBAT, - SE_LANGCHG, - SE_REGIONCHG, - SE_SUSPENDED_STATE, - SE_MAX -}; - -/** - * agent internal state - */ -enum agent_state { - AGS_NONE, - AGS_CREATED, - AGS_RUNNING, - AGS_STOPED, - AGS_DYING, -}; - -enum agent_event { - AGE_UNKNOWN, - AGE_CREATE, - AGE_TERMINATE, - AGE_STOP, - AGE_REQUEST, - AGE_MAX -}; - - -static enum appcore_agent_event to_ae[SE_MAX] = { - APPCORE_AGENT_EVENT_UNKNOWN, /* SE_UNKNOWN */ - APPCORE_AGENT_EVENT_LOW_MEMORY, /* SE_LOWMEM */ - APPCORE_AGENT_EVENT_LOW_BATTERY, /* SE_LOWBAT */ - APPCORE_AGENT_EVENT_LANG_CHANGE, /* SE_LANGCHG */ - APPCORE_AGENT_EVENT_REGION_CHANGE, /* SE_REGIONCHG */ - APPCORE_AGENT_EVENT_SUSPENDED_STATE_CHANGE, /* SE_SUSPENDED_STATE */ -}; - -static int appcore_agent_event_initialized[SE_MAX] = {0}; - -enum cb_type { /* callback */ - _CB_NONE, - _CB_SYSNOTI, - _CB_APPNOTI, - _CB_VCONF, -}; - -enum appcore_agent_suspended_state { - APPCORE_AGENT_SUSPENDED_STATE_WILL_ENTER_SUSPEND = 0, - APPCORE_AGENT_SUSPENDED_STATE_DID_EXIT_FROM_SUSPEND -}; - -struct evt_ops { - enum cb_type type; - union { - enum appcore_agent_event sys; - enum agent_event app; - const char *vkey; - } key; - - int (*cb_pre) (void *); - int (*cb) (void *); - int (*cb_post) (void *); - - int (*vcb_pre) (void *, void *); - int (*vcb) (void *, void *); - int (*vcb_post) (void *, void *); -}; - -struct agent_priv { - enum agent_state state; - - struct agent_appcore *app_core; - struct agentcore_ops *ops; -}; - -static struct agent_priv priv; - -struct agent_ops { - void *data; - void (*cb_app)(enum agent_event, void *, bundle *); -}; - -/** - * Appcore system event operation - */ -struct sys_op { - int (*func) (void *, void *); - void *data; -}; - -struct agent_appcore { - int state; - unsigned int tid; - bool suspended_state; - bool allowed_bg; - - const struct agent_ops *ops; - struct sys_op sops[SE_MAX]; -}; - -static struct agent_appcore core; - -static int __sys_lowmem_post(void *data, void *evt); -static int __sys_lowmem(void *data, void *evt); -static int __sys_lowbatt(void *data, void *evt); -static int __sys_langchg_pre(void *data, void *evt); -static int __sys_langchg(void *data, void *evt); -static int __sys_regionchg_pre(void *data, void *evt); -static int __sys_regionchg(void *data, void *evt); - -static struct evt_ops evtops[] = { - { - .type = _CB_VCONF, - .key.vkey = VCONFKEY_SYSMAN_LOW_MEMORY, - .vcb_post = __sys_lowmem_post, - .vcb = __sys_lowmem, - }, - { - .type = _CB_VCONF, - .key.vkey = VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, - .vcb = __sys_lowbatt, - }, - { - .type = _CB_VCONF, - .key.vkey = VCONFKEY_LANGSET, - .vcb_pre = __sys_langchg_pre, - .vcb = __sys_langchg, - }, - { - .type = _CB_VCONF, - .key.vkey = VCONFKEY_REGIONFORMAT, - .vcb_pre = __sys_regionchg_pre, - .vcb = __sys_regionchg, - }, - { - .type = _CB_VCONF, - .key.vkey = VCONFKEY_REGIONFORMAT_TIME1224, - .vcb = __sys_regionchg, - }, -}; - -static GDBusConnection *bus = NULL; -static guint __suspend_dbus_handler_initialized = 0; - -extern int app_control_create_event(bundle *data, struct app_control_s **app_control); -static int __sys_do(struct agent_appcore *ac, void *event_info, enum sys_event event); - -/* LCOV_EXCL_START */ -static int appcore_agent_flush_memory(void) -{ - int (*flush_fn) (int); - - if (!core.state) { - _ERR("Appcore not initialized"); - return -1; - } - - flush_fn = dlsym(RTLD_DEFAULT, "sqlite3_release_memory"); - if (flush_fn) { - flush_fn(SQLITE_FLUSH_MAX); - } - - malloc_trim(0); - - return 0; -} -/* LCOV_EXCL_STOP */ - -/* LCOV_EXCL_START */ -static void __prepare_to_suspend(void *data) -{ - int suspend = APPCORE_AGENT_SUSPENDED_STATE_WILL_ENTER_SUSPEND; - struct agent_appcore *ac = data; - - if (ac && !ac->allowed_bg && !ac->suspended_state) { - _DBG("[__SUSPEND__]"); - __sys_do(ac, &suspend, SE_SUSPENDED_STATE); - ac->suspended_state = true; - } -} -/* LCOV_EXCL_STOP */ - -/* LCOV_EXCL_START */ -static void __exit_from_suspend(void *data) -{ - if (TIZEN_FEATURE_BACKGROUND_MANAGEMENT) { - int suspend = APPCORE_AGENT_SUSPENDED_STATE_DID_EXIT_FROM_SUSPEND; - struct agent_appcore *ac = data; - - if (ac && !ac->allowed_bg && ac->suspended_state) { - _DBG("[__SUSPEND__]"); - __sys_do(ac, &suspend, SE_SUSPENDED_STATE); - ac->suspended_state = false; - } - } -} -/* LCOV_EXCL_START */ - -/* LCOV_EXCL_START */ -static gboolean __flush_memory(gpointer data) -{ - struct agent_appcore *ac = (struct agent_appcore *)data; - - appcore_agent_flush_memory(); - - if (!ac) { - return FALSE; - } - ac->tid = 0; - - _DBG("[__SUSPEND__] flush case"); - __prepare_to_suspend(ac); - return FALSE; -} -/* LCOV_EXCL_STOP */ - -/* LCOV_EXCL_START */ -static void __add_suspend_timer(struct agent_appcore *ac) -{ - if (TIZEN_FEATURE_BACKGROUND_MANAGEMENT) - ac->tid = g_timeout_add_seconds(5, __flush_memory, ac); -} -/* LCOV_EXCL_STOP */ - -/* LCOV_EXCL_START */ -static void __remove_suspend_timer(struct agent_appcore *ac) -{ - if (TIZEN_FEATURE_BACKGROUND_MANAGEMENT && ac->tid > 0) { - g_source_remove(ac->tid); - ac->tid = 0; - } -} -/* LCOV_EXCL_STOP */ - -static void __exit_loop(void *data) -{ - ecore_main_loop_quit(); - __remove_suspend_timer(&core); -} - -static void __do_app(enum agent_event event, void *data, bundle * b) -{ - struct agent_priv *svc = data; - app_control_h app_control = NULL; - - _ret_if(svc == NULL); - - if (event == AGE_TERMINATE) { - svc->state = AGS_DYING; - ecore_main_loop_thread_safe_call_sync((Ecore_Data_Cb)__exit_loop, NULL); - return; - } - - _ret_if(svc->ops == NULL); - - if (app_control_create_event(b, &app_control) != 0) - return; - - switch (event) { - case AGE_REQUEST: - if (svc->ops->app_control) - svc->ops->app_control(app_control, svc->ops->data); - svc->state = AGS_RUNNING; - break; -/* case AGE_STOP: - if(svc->state == AGS_RUNNING) { - if (svc->ops->stop) - svc->ops->stop(svc->ops->data); - svc->state = AGS_STOPED; - } - break; -*/ default: - /* do nothing */ - break; - } - app_control_destroy(app_control); -} - -static struct agent_ops s_ops = { - .data = &priv, - .cb_app = __do_app, -}; - -static int __set_data(struct agent_priv *agent, struct agentcore_ops *ops) -{ - if (ops == NULL) { - errno = EINVAL; - return -1; - } - - agent->ops = ops; - agent->app_core = NULL; - - _pid = getpid(); - - return 0; -} - -static int __agent_request(void *data, bundle * k) -{ - struct agent_appcore *ac = data; - _retv_if(ac == NULL || ac->ops == NULL, -1); - _retv_if(ac->ops->cb_app == NULL, 0); - - ac->ops->cb_app(AGE_REQUEST, ac->ops->data, k); - - return 0; -} - -/* LCOV_EXCL_START */ -static int __agent_terminate(void *data) -{ - struct agent_appcore *ac = data; - - _retv_if(ac == NULL || ac->ops == NULL, -1); - _retv_if(ac->ops->cb_app == NULL, 0); - - ac->ops->cb_app(AGE_TERMINATE, ac->ops->data, NULL); - - return 0; -} -/* LCOV_EXCL_STOP */ - -static int __sys_do_default(struct agent_appcore *ac, enum sys_event event) -{ - int r; - - switch (event) { - case SE_LOWBAT: - /*r = __def_lowbatt(ac);*/ - r = 0; - break; - default: - r = 0; - break; - }; - - return r; -} - -static int __sys_do(struct agent_appcore *ac, void *event_info, enum sys_event event) -{ - struct sys_op *op; - - _retv_if(ac == NULL || event >= SE_MAX, -1); - - op = &ac->sops[event]; - - if (op->func == NULL) - return __sys_do_default(ac, event); - - return op->func(event_info, op->data); -} - -static int __sys_lowmem_post(void *data, void *evt) -{ -#if defined(MEMORY_FLUSH_ACTIVATE) - struct agent_appcore *ac = data; - ac->ops->cb_app(AE_LOWMEM_POST, ac->ops->data, NULL); -#else - malloc_trim(0); -#endif - return 0; -} - -static int __sys_lowmem(void *data, void *evt) -{ - keynode_t *key = evt; - int val; - - val = vconf_keynode_get_int(key); - - if (val >= VCONFKEY_SYSMAN_LOW_MEMORY_SOFT_WARNING) - return __sys_do(data, (void *)&val, SE_LOWMEM); - - return 0; -} - -static int __sys_lowbatt(void *data, void *evt) -{ - keynode_t *key = evt; - int val; - - val = vconf_keynode_get_int(key); - - /* VCONFKEY_SYSMAN_BAT_CRITICAL_LOW or VCONFKEY_SYSMAN_POWER_OFF */ - if (val <= VCONFKEY_SYSMAN_BAT_CRITICAL_LOW) - return __sys_do(data, (void *)&val, SE_LOWBAT); - - return 0; -} - -static int __sys_langchg_pre(void *data, void *evt) -{ - keynode_t *key = evt; - char language[32]; - char *lang; - char *r; - - lang = vconf_keynode_get_str(key); - if (lang) { - snprintf(language, sizeof(language), "%s:en_US:en_GB:en", lang); - setenv("LANGUAGE", language, 1); - setenv("LANG", lang, 1); - setenv("LC_MESSAGES", lang, 1); - - r = setlocale(LC_ALL, lang); - if (r == NULL) { - r = setlocale(LC_ALL, lang); - if (r) - _DBG("*****appcore-agent setlocale=%s\n", r); - } - } - - return 0; -} - -static int __sys_langchg(void *data, void *evt) -{ - keynode_t *key = evt; - char *val; - - val = vconf_keynode_get_str(key); - - return __sys_do(data, (void *)val, SE_LANGCHG); -} - -static int __sys_regionchg_pre(void *data, void *evt) -{ - keynode_t *key = evt; - char *region; - char *r; - - region = vconf_keynode_get_str(key); - if (region) { - setenv("LC_CTYPE", region, 1); - setenv("LC_NUMERIC", region, 1); - setenv("LC_TIME", region, 1); - setenv("LC_COLLATE", region, 1); - setenv("LC_MONETARY", region, 1); - setenv("LC_PAPER", region, 1); - setenv("LC_NAME", region, 1); - setenv("LC_ADDRESS", region, 1); - setenv("LC_TELEPHONE", region, 1); - setenv("LC_MEASUREMENT", region, 1); - setenv("LC_IDENTIFICATION", region, 1); - - r = setlocale(LC_ALL, ""); - if (r != NULL) - _DBG("*****appcore-agent setlocale=%s\n", r); - } - - return 0; -} - -static int __sys_regionchg(void *data, void *evt) -{ - keynode_t *key = evt; - char *val = NULL; - const char *name; - - name = vconf_keynode_get_name(key); - if (!strcmp(name, VCONFKEY_REGIONFORMAT)) - val = vconf_keynode_get_str(key); - - return __sys_do(data, (void *)val, SE_REGIONCHG); -} - -static void __vconf_do(struct evt_ops *eo, keynode_t * key, void *data) -{ - _ret_if(eo == NULL); - - if (eo->vcb_pre) - eo->vcb_pre(data, key); - - if (eo->vcb) - eo->vcb(data, key); - - if (eo->vcb_post) - eo->vcb_post(data, key); -} - -static void __vconf_cb(keynode_t *key, void *data) -{ - int i; - const char *name; - - name = vconf_keynode_get_name(key); - _ret_if(name == NULL); - - SECURE_LOGD("[APP %d] vconf changed: %s", _pid, name); - - for (i = 0; i < sizeof(evtops) / sizeof(evtops[0]); i++) { - struct evt_ops *eo = &evtops[i]; - - switch (eo->type) { - case _CB_VCONF: - if (!strcmp(name, eo->key.vkey)) - __vconf_do(eo, key, data); - break; - default: - /* do nothing */ - break; - } - } -} - -static int __add_vconf(struct agent_appcore *ac, enum sys_event se) -{ - int r; - - switch (se) { - case SE_LOWMEM: - r = vconf_notify_key_changed(VCONFKEY_SYSMAN_LOW_MEMORY, __vconf_cb, ac); - break; - case SE_LOWBAT: - r = vconf_notify_key_changed(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, __vconf_cb, ac); - break; - case SE_LANGCHG: - r = vconf_notify_key_changed(VCONFKEY_LANGSET, __vconf_cb, ac); - break; - case SE_REGIONCHG: - r = vconf_notify_key_changed(VCONFKEY_REGIONFORMAT, __vconf_cb, ac); - if (r < 0) - break; - - r = vconf_notify_key_changed(VCONFKEY_REGIONFORMAT_TIME1224, __vconf_cb, ac); - break; - default: - r = -1; - break; - } - - return r; -} - -static int __del_vconf(enum sys_event se) -{ - int r; - - switch (se) { - case SE_LOWMEM: - r = vconf_ignore_key_changed(VCONFKEY_SYSMAN_LOW_MEMORY, __vconf_cb); - break; - case SE_LOWBAT: - r = vconf_ignore_key_changed(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, __vconf_cb); - break; - case SE_LANGCHG: - r = vconf_ignore_key_changed(VCONFKEY_LANGSET, __vconf_cb); - break; - case SE_REGIONCHG: - r = vconf_ignore_key_changed(VCONFKEY_REGIONFORMAT, __vconf_cb); - if (r < 0) - break; - - r = vconf_ignore_key_changed(VCONFKEY_REGIONFORMAT_TIME1224, __vconf_cb); - break; - default: - r = -1; - break; - } - - return r; -} - -static int __del_vconf_list(void) -{ - int r; - enum sys_event se; - - for (se = SE_LOWMEM; se < SE_MAX; se++) { - if (appcore_agent_event_initialized[se]) { - r = __del_vconf(se); - if (r < 0) - _ERR("Delete vconf callback failed"); - else - appcore_agent_event_initialized[se] = 0; - } - } - - return 0; -} - -static int __aul_handler(aul_type type, bundle *b, void *data) -{ - int ret = 0; - char *bg = NULL; - struct agent_appcore *ac = data; - - switch (type) { - case AUL_START: - bundle_get_str(b, AUL_K_ALLOWED_BG, &bg); - if (bg && strncmp(bg, "ALLOWED_BG", strlen("ALLOWED_BG")) == 0) { - _DBG("[__SUSPEND__] allowed background"); - ac->allowed_bg = true; - __remove_suspend_timer(data); - } - ret = __agent_request(data, b); - break; - case AUL_RESUME: - bundle_get_str(b, AUL_K_ALLOWED_BG, &bg); - if (bg && strncmp(bg, "ALLOWED_BG", strlen("ALLOWED_BG")) == 0) { - _DBG("[__SUSPEND__] allowed background"); - ac->allowed_bg = true; - __remove_suspend_timer(data); - } - break; -/* case AUL_STOP: - __service_stop(data); - break; -*/ - case AUL_TERMINATE: - case AUL_TERMINATE_BGAPP: - if (!ac->allowed_bg) { - __remove_suspend_timer(data); - } - ret = __agent_terminate(data); - break; - case AUL_SUSPEND: - ac->allowed_bg = false; - _DBG("[__SUSPEND__] suspend"); - __add_suspend_timer(data); - break; - case AUL_WAKE: - if (!ac->allowed_bg) { - _DBG("[__SUSPEND__] wake"); - __remove_suspend_timer(data); - __exit_from_suspend(data); - } - - if (b) { - bundle_get_str(b, AUL_K_ALLOWED_BG, &bg); - if (bg && strcmp(bg, "ALLOWED_BG") == 0) { - _DBG("[__SUSPEND__] allowed background"); - ac->allowed_bg = true; - } - } - break; - default: - /* do nothing */ - break; - } - - return ret; -} - -static int __get_package_app_name(int pid, char **app_name) -{ - char *name_token = NULL; - char appid[APPID_MAX] = {0}; - int r; - - r = aul_app_get_appid_bypid(pid, appid, APPID_MAX); - if (r != AUL_R_OK) - return -1; - - if (appid[0] == '\0') - return -1; - - name_token = strrchr(appid, '.'); - if (name_token == NULL) - return -1; - - name_token++; - - *app_name = strdup(name_token); - if (*app_name == NULL) - return -1; - - return 0; -} - -EXPORT_API int appcore_agent_set_event_callback(enum appcore_agent_event event, - int (*cb) (void *, void *), void *data) -{ - struct agent_appcore *ac = &core; - struct sys_op *op; - enum sys_event se; - int r = 0; - - for (se = SE_UNKNOWN; se < SE_MAX; se++) { - if (event == to_ae[se]) - break; - } - - if (se == SE_UNKNOWN || se >= SE_MAX) { - _ERR("Unregistered event"); - errno = EINVAL; - return -1; - } - - op = &ac->sops[se]; - - op->func = cb; - op->data = data; - - if (op->func && !appcore_agent_event_initialized[se]) { - r = __add_vconf(ac, se); - if (r < 0) - _ERR("Add vconf callback failed"); - else - appcore_agent_event_initialized[se] = 1; - } else if (!op->func && appcore_agent_event_initialized[se]) { - r = __del_vconf(se); - if (r < 0) - _ERR("Delete vconf callback failed"); - else - appcore_agent_event_initialized[se] = 0; - } - - return r; -} - -static gboolean __init_suspend(gpointer data) -{ - int r; - - r = _appcore_agent_init_suspend_dbus_handler(&core); - if (r == -1) - _ERR("Initailzing suspended state handler failed"); - - return FALSE; -} - -static int __get_locale_resource_dir(char *locale_dir, int size) -{ - const char *res_path; - - res_path = aul_get_app_resource_path(); - if (res_path == NULL) { - _ERR("Failed to get resource path"); - return -1; - } - - snprintf(locale_dir, size, "%s" PATH_LOCALE, res_path); - if (access(locale_dir, R_OK) != 0) - return -1; - - return 0; -} - -EXPORT_API int appcore_agent_init(const struct agent_ops *ops, - int argc, char **argv) -{ - int r; - char locale_dir[PATH_MAX]; - char *app_name = NULL; - - if (core.state != 0) { - errno = EALREADY; - return -1; - } - - if (ops == NULL || ops->cb_app == NULL) { - errno = EINVAL; - return -1; - } - - r = __get_package_app_name(getpid(), &app_name); - if (r < 0) - return -1; - - r = __get_locale_resource_dir(locale_dir, sizeof(locale_dir)); - SECURE_LOGD("dir : %s", locale_dir); - SECURE_LOGD("app name : %s", app_name); - r = appcore_set_i18n(app_name, locale_dir); - free(app_name); - _retv_if(r == -1, -1); - - if (TIZEN_FEATURE_BACKGROUND_MANAGEMENT) - g_idle_add(__init_suspend, NULL); - - r = aul_launch_init(__aul_handler, &core); - if (r < 0) - goto err; - - r = aul_launch_argv_handler(argc, argv); - if (r < 0) - goto err; - - core.ops = ops; - core.state = 1; /* TODO: use enum value */ - core.tid = 0; - core.suspended_state = false; - core.allowed_bg = false; - - return 0; - err: - __del_vconf_list(); - return -1; -} - -static void appcore_agent_get_app_core(struct agent_appcore **ac) -{ - *ac = &core; -} - -static int __before_loop(struct agent_priv *agent, int argc, char **argv) -{ - int r; - struct agent_appcore *ac = NULL; - - if (argc <= 0 || argv == NULL) { - errno = EINVAL; - return -1; - } - - if (!ecore_init()) { - LOGE("Failed to initialize ecore"); - return -1; - } - - r = appcore_agent_init(&s_ops, argc, argv); - if (r < 0) { - ecore_shutdown(); - return -1; - } - - appcore_agent_get_app_core(&ac); - agent->app_core = ac; - SECURE_LOGD("[__SUSPEND__] agent appcore initialized, appcore addr: 0x%x", ac); - - if (agent->ops && agent->ops->create) { - r = agent->ops->create(agent->ops->data); - if (r < 0) { - if (agent->ops && agent->ops->terminate) - agent->ops->terminate(agent->ops->data); - ecore_shutdown(); - errno = ECANCELED; - return -1; - } - } - agent->state = AGS_CREATED; - - return 0; -} - -static void __after_loop(struct agent_priv *agent) -{ - __del_vconf_list(); - priv.state = AGS_DYING; - if (agent->ops && agent->ops->terminate) - agent->ops->terminate(agent->ops->data); - ecore_shutdown(); -} - -EXPORT_API int appcore_agent_terminate() -{ - __del_vconf_list(); - ecore_main_loop_thread_safe_call_sync((Ecore_Data_Cb)__exit_loop, NULL); - - return 0; -} - -EXPORT_API int appcore_agent_terminate_without_restart() -{ - __del_vconf_list(); - aul_status_update(STATUS_NORESTART); - ecore_main_loop_thread_safe_call_sync((Ecore_Data_Cb)__exit_loop, NULL); - - return 0; -} - -EXPORT_API int appcore_agent_main(int argc, char **argv, - struct agentcore_ops *ops) -{ - int r; - - r = __set_data(&priv, ops); - _retv_if(r == -1, -1); - - r = __before_loop(&priv, argc, argv); - if (r == -1) - return -1; - - ecore_main_loop_begin(); - - aul_status_update(STATUS_DYING); - - __after_loop(&priv); - - return 0; -} - -/* LCOV_EXCL_START */ -static void __suspend_dbus_signal_handler(GDBusConnection *connection, - const gchar *sender_name, - const gchar *object_path, - const gchar *interface_name, - const gchar *signal_name, - GVariant *parameters, - gpointer user_data) -{ - struct agent_appcore *ac = (struct agent_appcore *)user_data; - gint suspend = APPCORE_SUSPENDED_STATE_DID_EXIT_FROM_SUSPEND; - gint pid; - gint status; - - if (g_strcmp0(signal_name, RESOURCED_FREEZER_SIGNAL) == 0) { - g_variant_get(parameters, "(ii)", &status, &pid); - if (pid == getpid() && status == 0) { /* thawed */ - if (ac && !ac->allowed_bg && ac->suspended_state) { - __remove_suspend_timer(ac); - __sys_do(ac, &suspend, SE_SUSPENDED_STATE); - ac->suspended_state = false; - __add_suspend_timer(ac); - } - } - } -} -/* LCOV_EXCL_STOP */ - -int _appcore_agent_init_suspend_dbus_handler(void *data) -{ - GError *err = NULL; - - if (__suspend_dbus_handler_initialized) - return 0; - - if (!bus) { - bus = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &err); - if (!bus) { - _ERR("Failed to connect to the D-BUS daemon: %s", - err->message); - g_error_free(err); - return -1; - } - } - - __suspend_dbus_handler_initialized = g_dbus_connection_signal_subscribe( - bus, - NULL, - RESOURCED_FREEZER_INTERFACE, - RESOURCED_FREEZER_SIGNAL, - RESOURCED_FREEZER_PATH, - NULL, - G_DBUS_SIGNAL_FLAGS_NONE, - __suspend_dbus_signal_handler, - data, - NULL); - if (__suspend_dbus_handler_initialized == 0) { - _ERR("g_dbus_connection_signal_subscribe() is failed."); - return -1; - } - - _DBG("[__SUSPEND__] suspend signal initialized"); - - return 0; -} diff --git a/src/service_app_error.c b/src/service_app_error.c deleted file mode 100644 index 814808c..0000000 --- a/src/service_app_error.c +++ /dev/null @@ -1,60 +0,0 @@ -/* - * 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 <string.h> -#include <libintl.h> - -#include <dlog.h> -#include <app_common.h> - -#include "service_app_private.h" - -#ifdef LOG_TAG -#undef LOG_TAG -#endif - -#define LOG_TAG "CAPI_APPFW_APPLICATION" - -static const char* service_app_error_to_string(app_error_e error) -{ - switch (error) { - case APP_ERROR_NONE: - return "NONE"; - case APP_ERROR_INVALID_PARAMETER: - return "INVALID_PARAMETER"; - case APP_ERROR_OUT_OF_MEMORY: - return "OUT_OF_MEMORY"; - case APP_ERROR_INVALID_CONTEXT: - return "INVALID_CONTEXT"; - case APP_ERROR_NO_SUCH_FILE: - return "NO_SUCH_FILE"; - case APP_ERROR_ALREADY_RUNNING: - return "ALREADY_RUNNING"; - default: - return "UNKNOWN"; - } -} - -int service_app_error(app_error_e error, const char* function, const char *description) -{ - if (description) - LOGE("[%s] %s(0x%08x) : %s", function, service_app_error_to_string(error), error, description); - else - LOGE("[%s] %s(0x%08x)", function, service_app_error_to_string(error), error); - - return error; -} diff --git a/src/service_app_main.c b/src/service_app_main.c index de9c8f1..894fd03 100644 --- a/src/service_app_main.c +++ b/src/service_app_main.c @@ -14,7 +14,6 @@ * limitations under the License. */ - #include <stdlib.h> #include <unistd.h> #include <bundle.h> @@ -22,87 +21,31 @@ #include <dlog.h> #include <vconf-internal-keys.h> #include <app_common.h> -#include <Eina.h> -#include <appcore-agent.h> +#include <Ecore.h> +#include <appcore_base.h> +#include <service_app.h> -#include "service_app_private.h" #include "service_app_extension.h" #ifdef LOG_TAG #undef LOG_TAG #endif -#ifndef TIZEN_PATH_MAX -#define TIZEN_PATH_MAX 1024 -#endif - #define LOG_TAG "CAPI_APPFW_APPLICATION" -typedef enum { - SERVICE_APP_STATE_NOT_RUNNING, /* The application has been launched or was running but was terminated */ - SERVICE_APP_STATE_CREATING, /* The application is initializing the resources on service_app_create_cb callback */ - SERVICE_APP_STATE_RUNNING, /* The application is running in the foreground and background */ -} service_app_state_e; - -static int _service_app_get_id(char **id) -{ - static char id_buf[TIZEN_PATH_MAX] = {0, }; - int ret = -1; - - if (id == NULL) - return service_app_error(APP_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); - - if (id_buf[0] == '\0') { - ret = aul_app_get_appid_bypid(getpid(), id_buf, sizeof(id_buf)); - if (ret < 0) - return service_app_error(APP_ERROR_INVALID_CONTEXT, __FUNCTION__, "failed to get the application ID"); - } - - if (id_buf[0] == '\0') - return service_app_error(APP_ERROR_INVALID_CONTEXT, __FUNCTION__, "failed to get the application ID"); - - *id = strdup(id_buf); - if (*id == NULL) - return service_app_error(APP_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL); - - return APP_ERROR_NONE; -} - -static int _service_appget_package_app_name(const char *appid, char **name) -{ - char *name_token = NULL; - - if (appid == NULL) - return service_app_error(APP_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); - - /* com.vendor.name -> name */ - name_token = strrchr(appid, '.'); - if (name_token == NULL) - return service_app_error(APP_ERROR_INVALID_CONTEXT, __FUNCTION__, NULL); - - name_token++; - - *name = strdup(name_token); - if (*name == NULL) - return service_app_error(APP_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL); - - return APP_ERROR_NONE; -} +extern int app_control_create_event(bundle *data, struct app_control_s **app_control); -EXPORT_API void service_app_exit_without_restart(void) -{ - appcore_agent_terminate_without_restart(); -} - -#define SERVICE_APP_EVENT_MAX 6 -static Eina_List *handler_list[SERVICE_APP_EVENT_MAX] = {NULL, }; -static int handler_initialized = 0; -static int appcore_agent_initialized = 0; +typedef enum { + APP_STATE_NOT_RUNNING, + APP_STATE_CREATING, + APP_STATE_RUNNING, +} app_state_e; struct app_event_handler { app_event_type_e type; app_event_cb cb; void *data; + void* raw; }; struct app_event_info { @@ -111,335 +54,177 @@ struct app_event_info { }; struct service_app_context { - char *package; - char *service_app_name; - service_app_state_e state; - service_app_lifecycle_callback_s *callback; + service_app_lifecycle_callback_s callback; void *data; }; -static void _free_handler_list(void) -{ - int i; - app_event_handler_h handler; +static struct service_app_context __context; +static app_state_e __app_state = APP_STATE_NOT_RUNNING; - for (i = 0; i < SERVICE_APP_EVENT_MAX; i++) { - EINA_LIST_FREE(handler_list[i], handler) - if (handler) - free(handler); - } +static int __app_event_converter[APPCORE_BASE_EVENT_MAX] = { + [APP_EVENT_LOW_MEMORY] = APPCORE_BASE_EVENT_LOW_MEMORY, + [APP_EVENT_LOW_BATTERY] = APPCORE_BASE_EVENT_LOW_BATTERY, + [APP_EVENT_LANGUAGE_CHANGED] = APPCORE_BASE_EVENT_LANG_CHANGE, + [APP_EVENT_DEVICE_ORIENTATION_CHANGED] = APPCORE_BASE_EVENT_DEVICE_ORIENTATION_CHANGED, + [APP_EVENT_REGION_FORMAT_CHANGED] = APPCORE_BASE_EVENT_REGION_CHANGE, + [APP_EVENT_SUSPENDED_STATE_CHANGED] = APPCORE_BASE_EVENT_SUSPENDED_STATE_CHANGE, +}; - eina_shutdown(); -} +static int __on_error(app_error_e error, const char *function, const char *description); -static int _service_app_low_memory(void *event_info, void *data) +static int __service_app_create(void *data) { - Eina_List *l; - app_event_handler_h handler; - struct app_event_info event; - - LOGI("service_app_low_memory"); - - event.type = APP_EVENT_LOW_MEMORY; - event.value = event_info; - - EINA_LIST_FOREACH(handler_list[APP_EVENT_LOW_MEMORY], l, handler) { - handler->cb(&event, handler->data); - } + appcore_base_on_create(); + ecore_init(); + if (__context.callback.create == NULL || + __context.callback.create(__context.data) == false) + return __on_error(APP_ERROR_INVALID_CONTEXT, __FUNCTION__, "service_app_create_cb() returns false"); return APP_ERROR_NONE; } -static int _service_app_low_battery(void *event_info, void *data) +static int __service_app_terminate(void *data) { - Eina_List *l; - app_event_handler_h handler; - struct app_event_info event; - - LOGI("service_app_low_battery"); + appcore_base_on_terminate(); - event.type = APP_EVENT_LOW_BATTERY; - event.value = event_info; - - EINA_LIST_FOREACH(handler_list[APP_EVENT_LOW_BATTERY], l, handler) { - handler->cb(&event, handler->data); - } + if (__context.callback.terminate) + __context.callback.terminate(__context.data); return APP_ERROR_NONE; } -static int _service_app_lang_changed(void *event_info, void *data) +static int __service_app_control(bundle *b, void *data) { - Eina_List *l; - app_event_handler_h handler; - struct app_event_info event; + app_control_h app_control = NULL; - LOGI("service_app_lang_changed"); + LOGD("[SERVICE_APP] app_control callback"); + appcore_base_on_control(b); - event.type = APP_EVENT_LANGUAGE_CHANGED; - event.value = event_info; + if (app_control_create_event(b, &app_control) != 0) + return -1; - EINA_LIST_FOREACH(handler_list[APP_EVENT_LANGUAGE_CHANGED], l, handler) { - handler->cb(&event, handler->data); - } + if (__context.callback.app_control) + __context.callback.app_control(app_control, __context.data); - return APP_ERROR_NONE; -} - -static int _service_app_region_changed(void *event_info, void *data) -{ - Eina_List *l; - app_event_handler_h handler; - struct app_event_info event; - - if (event_info == NULL) { - LOGI("receive empy event, ignore it"); - return APP_ERROR_NONE; - } - - LOGI("service_app_region_changed"); + app_control_destroy(app_control); - event.type = APP_EVENT_REGION_FORMAT_CHANGED; - event.value = event_info; - - EINA_LIST_FOREACH(handler_list[APP_EVENT_REGION_FORMAT_CHANGED], l, handler) { - handler->cb(&event, handler->data); - } - - return APP_ERROR_NONE; + return 0; } -/* LCOV_EXCL_START */ -static int _service_app_appcore_suspended_state_changed(void *event_info, void *data) +static void __loop_run(void *data) { - Eina_List *l; - app_event_handler_h handler; - struct app_event_info event; - - LOGI("_service_app_appcore_suspended_state_changed"); - LOGD("[__SUSPEND__] suspended state: %d (0: suspend, 1: wake)", *(int *)event_info); - - event.type = APP_EVENT_SUSPENDED_STATE_CHANGED; - event.value = event_info; - - EINA_LIST_FOREACH(handler_list[APP_EVENT_SUSPENDED_STATE_CHANGED], l, handler) { - handler->cb(&event, handler->data); - } - - return APP_ERROR_NONE; + ecore_main_loop_begin(); } -/* LCOV_EXCL_STOP */ -static void _service_app_appcore_agent_set_event_cb(app_event_type_e event_type) +static void __loop_exit(void *data) { - switch (event_type) { - case APP_EVENT_LOW_MEMORY: - appcore_agent_set_event_callback(APPCORE_AGENT_EVENT_LOW_MEMORY, _service_app_low_memory, NULL); - break; - case APP_EVENT_LOW_BATTERY: - appcore_agent_set_event_callback(APPCORE_AGENT_EVENT_LOW_BATTERY, _service_app_low_battery, NULL); - break; - case APP_EVENT_LANGUAGE_CHANGED: - appcore_agent_set_event_callback(APPCORE_AGENT_EVENT_LANG_CHANGE, _service_app_lang_changed, NULL); - break; - case APP_EVENT_REGION_FORMAT_CHANGED: - appcore_agent_set_event_callback(APPCORE_AGENT_EVENT_REGION_CHANGE, _service_app_region_changed, NULL); - break; - case APP_EVENT_SUSPENDED_STATE_CHANGED: - LOGD("[__SUSPEND__]"); - appcore_agent_set_event_callback(APPCORE_AGENT_EVENT_SUSPENDED_STATE_CHANGE, _service_app_appcore_suspended_state_changed, NULL); - break; - default: - break; - } + ecore_main_loop_quit(); } -static void _service_app_appcore_agent_unset_event_cb(app_event_type_e event_type) +static const char *__error_to_string(app_error_e error) { - switch (event_type) { - case APP_EVENT_LOW_MEMORY: - appcore_agent_set_event_callback(APPCORE_AGENT_EVENT_LOW_MEMORY, NULL, NULL); - break; - case APP_EVENT_LOW_BATTERY: - appcore_agent_set_event_callback(APPCORE_AGENT_EVENT_LOW_BATTERY, NULL, NULL); - break; - case APP_EVENT_LANGUAGE_CHANGED: - appcore_agent_set_event_callback(APPCORE_AGENT_EVENT_LANG_CHANGE, NULL, NULL); - break; - case APP_EVENT_REGION_FORMAT_CHANGED: - appcore_agent_set_event_callback(APPCORE_AGENT_EVENT_REGION_CHANGE, NULL, NULL); - break; - case APP_EVENT_SUSPENDED_STATE_CHANGED: - LOGD("[__SUSPEND__]"); - appcore_agent_set_event_callback(APPCORE_AGENT_EVENT_SUSPENDED_STATE_CHANGE, NULL, NULL); - break; + switch (error) { + case APP_ERROR_NONE: + return "NONE"; + case APP_ERROR_INVALID_PARAMETER: + return "INVALID_PARAMETER"; + case APP_ERROR_OUT_OF_MEMORY: + return "OUT_OF_MEMORY"; + case APP_ERROR_INVALID_CONTEXT: + return "INVALID_CONTEXT"; + case APP_ERROR_NO_SUCH_FILE: + return "NO_SUCH_FILE"; + case APP_ERROR_ALREADY_RUNNING: + return "ALREADY_RUNNING"; default: - break; + return "UNKNOWN"; } } -static void _service_app_set_appcore_event_cb(void) +static int __on_error(app_error_e error, const char *function, const char *description) { - _service_app_appcore_agent_set_event_cb(APP_EVENT_LOW_MEMORY); - _service_app_appcore_agent_set_event_cb(APP_EVENT_LANGUAGE_CHANGED); - _service_app_appcore_agent_set_event_cb(APP_EVENT_REGION_FORMAT_CHANGED); + if (description) + LOGE("[%s] %s(0x%08x) : %s", function, __error_to_string(error), error, description); + else + LOGE("[%s] %s(0x%08x)", function, __error_to_string(error), error); - if (eina_list_count(handler_list[APP_EVENT_LOW_BATTERY]) > 0) - _service_app_appcore_agent_set_event_cb(APP_EVENT_LOW_BATTERY); - - if (eina_list_count(handler_list[APP_EVENT_SUSPENDED_STATE_CHANGED]) > 0) - _service_app_appcore_agent_set_event_cb(APP_EVENT_SUSPENDED_STATE_CHANGED); + return error; } -static void _service_app_unset_appcore_event_cb(void) -{ - _service_app_appcore_agent_unset_event_cb(APP_EVENT_LOW_MEMORY); - _service_app_appcore_agent_unset_event_cb(APP_EVENT_LANGUAGE_CHANGED); - _service_app_appcore_agent_unset_event_cb(APP_EVENT_REGION_FORMAT_CHANGED); - - if (eina_list_count(handler_list[APP_EVENT_LOW_BATTERY]) > 0) - _service_app_appcore_agent_unset_event_cb(APP_EVENT_LOW_BATTERY); - - if (eina_list_count(handler_list[APP_EVENT_SUSPENDED_STATE_CHANGED]) > 0) - _service_app_appcore_agent_unset_event_cb(APP_EVENT_SUSPENDED_STATE_CHANGED); -} - -static int _service_app_create(void *data) +EXPORT_API int service_app_main(int argc, char **argv, service_app_lifecycle_callback_s *callback, void *user_data) { - struct service_app_context *app_context = data; - service_app_create_cb create_cb; - - if (app_context == NULL) - return service_app_error(APP_ERROR_INVALID_CONTEXT, __FUNCTION__, NULL); - - appcore_agent_initialized = 1; - _service_app_set_appcore_event_cb(); + int ret; + appcore_base_ops ops = appcore_base_get_default_ops(); - create_cb = app_context->callback->create; - if (create_cb == NULL || create_cb(app_context->data) == false) - return service_app_error(APP_ERROR_INVALID_CONTEXT, __FUNCTION__, "service_app_create_cb() returns false"); + if (argc < 1 || argv == NULL || callback == NULL) + return __on_error(APP_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); - app_context->state = SERVICE_APP_STATE_RUNNING; + if (callback->create == NULL) + return __on_error(APP_ERROR_INVALID_PARAMETER, __FUNCTION__, "service_app_create_cb() callback must be registered"); + + if (__app_state != APP_STATE_NOT_RUNNING) + return __on_error(APP_ERROR_ALREADY_RUNNING, __FUNCTION__, NULL); + + /* override methods */ + ops.create = __service_app_create; + ops.terminate = __service_app_terminate; + ops.control = __service_app_control; + ops.run = __loop_run; + ops.exit = __loop_exit; + + __context.callback = *callback; + __context.data = user_data; + + __app_state = APP_STATE_CREATING; + ret = appcore_base_init(ops, argc, argv, NULL); + if (ret < 0) { + __app_state = APP_STATE_NOT_RUNNING; + return __on_error(APP_ERROR_INVALID_CONTEXT, __FUNCTION__, NULL); + } + appcore_base_fini(); + __app_state = APP_STATE_NOT_RUNNING; return APP_ERROR_NONE; } -static int _service_app_terminate(void *data) +EXPORT_API void service_app_exit(void) { - struct service_app_context *app_context = data; - service_app_terminate_cb terminate_cb; - - if (app_context == NULL) - return service_app_error(APP_ERROR_INVALID_CONTEXT, __FUNCTION__, NULL); - - terminate_cb = app_context->callback->terminate; - if (terminate_cb != NULL) - terminate_cb(app_context->data); - - _service_app_unset_appcore_event_cb(); - - if (handler_initialized) - _free_handler_list(); - - return APP_ERROR_NONE; + __loop_exit(NULL); } -static int _service_app_reset(app_control_h app_control, void *data) +static int __event_cb(void *event, void *data) { - struct service_app_context *app_context = data; - service_app_control_cb service_cb; + app_event_handler_h handler = data; - if (app_context == NULL) - return service_app_error(APP_ERROR_INVALID_CONTEXT, __FUNCTION__, NULL); + struct app_event_info app_event; - service_cb = app_context->callback->app_control; - if (service_cb != NULL) - service_cb(app_control, app_context->data); + app_event.type = handler->type; + app_event.value = event; - return APP_ERROR_NONE; -} - -EXPORT_API int service_app_main(int argc, char **argv, service_app_lifecycle_callback_s *callback, void *user_data) -{ - struct service_app_context app_context = { - .state = SERVICE_APP_STATE_NOT_RUNNING, - .callback = callback, - .data = user_data - }; - - struct agentcore_ops appcore_context = { - .data = &app_context, - .create = _service_app_create, - .terminate = _service_app_terminate, - .app_control = _service_app_reset, - }; - - if (argc <= 0 || argv == NULL || callback == NULL) - return service_app_error(APP_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); - - if (callback->create == NULL) - return service_app_error(APP_ERROR_INVALID_PARAMETER, __FUNCTION__, "service_app_create_cb() callback must be registered"); - - if (app_context.state != SERVICE_APP_STATE_NOT_RUNNING) - return service_app_error(APP_ERROR_ALREADY_RUNNING, __FUNCTION__, NULL); - - if (_service_app_get_id(&(app_context.package)) == APP_ERROR_NONE) { - if (_service_appget_package_app_name(app_context.package, &(app_context.service_app_name)) != APP_ERROR_NONE) { - free(app_context.package); - app_context.package = NULL; - } - } - - app_context.state = SERVICE_APP_STATE_CREATING; - - appcore_agent_main(argc, argv, &appcore_context); - - if (app_context.service_app_name) - free(app_context.service_app_name); - if (app_context.package) - free(app_context.package); - - return APP_ERROR_NONE; -} - -EXPORT_API void service_app_exit(void) -{ - appcore_agent_terminate(); + if (handler->cb) + handler->cb(&app_event, handler->data); + return 0; } EXPORT_API int service_app_add_event_handler(app_event_handler_h *event_handler, app_event_type_e event_type, app_event_cb callback, void *user_data) { app_event_handler_h handler; - Eina_List *l_itr; - - if (!handler_initialized) { - eina_init(); - handler_initialized = 1; - } if (event_handler == NULL || callback == NULL) - return service_app_error(APP_ERROR_INVALID_PARAMETER, __FUNCTION__, "null parameter"); + return __on_error(APP_ERROR_INVALID_PARAMETER, __FUNCTION__, "null parameter"); - if (event_type < APP_EVENT_LOW_MEMORY || event_type > APP_EVENT_SUSPENDED_STATE_CHANGED) - return service_app_error(APP_ERROR_INVALID_PARAMETER, __FUNCTION__, "invalid event type"); - - EINA_LIST_FOREACH(handler_list[event_type], l_itr, handler) { - if (handler->cb == callback) - return service_app_error(APP_ERROR_INVALID_PARAMETER, __FUNCTION__, "already registered"); - } + if (event_type < APP_EVENT_LOW_MEMORY || event_type > APP_EVENT_SUSPENDED_STATE_CHANGED || + event_type == APP_EVENT_DEVICE_ORIENTATION_CHANGED) + return __on_error(APP_ERROR_INVALID_PARAMETER, __FUNCTION__, "invalid event type"); handler = calloc(1, sizeof(struct app_event_handler)); if (!handler) - return service_app_error(APP_ERROR_OUT_OF_MEMORY, __FUNCTION__, "insufficient memory"); + return __on_error(APP_ERROR_OUT_OF_MEMORY, __FUNCTION__, "insufficient memory"); handler->type = event_type; handler->cb = callback; handler->data = user_data; - - if (appcore_agent_initialized && eina_list_count(handler_list[event_type]) == 0) - _service_app_appcore_agent_set_event_cb(event_type); - - handler_list[event_type] = eina_list_append(handler_list[event_type], handler); + handler->raw = appcore_base_add_event(__app_event_converter[event_type], __event_cb, handler); *event_handler = handler; @@ -448,36 +233,31 @@ EXPORT_API int service_app_add_event_handler(app_event_handler_h *event_handler, EXPORT_API int service_app_remove_event_handler(app_event_handler_h event_handler) { - app_event_handler_h handler; + int ret; app_event_type_e type; - Eina_List *l_itr; - Eina_List *l_next; if (event_handler == NULL) - return service_app_error(APP_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); - - if (!handler_initialized) { - LOGI("handler list is not initialzed"); - return APP_ERROR_NONE; - } + return __on_error(APP_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); type = event_handler->type; - if (type < APP_EVENT_LOW_MEMORY - || type > APP_EVENT_REGION_FORMAT_CHANGED - || type == APP_EVENT_DEVICE_ORIENTATION_CHANGED) - return service_app_error(APP_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + if (type < APP_EVENT_LOW_MEMORY || + type > APP_EVENT_SUSPENDED_STATE_CHANGED || + type == APP_EVENT_DEVICE_ORIENTATION_CHANGED) + return __on_error(APP_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); - EINA_LIST_FOREACH_SAFE(handler_list[type], l_itr, l_next, handler) { - if (handler == event_handler) { - free(handler); - handler_list[type] = eina_list_remove_list(handler_list[type], l_itr); + ret = appcore_base_remove_event(event_handler->raw); + free(event_handler); - if (appcore_agent_initialized && eina_list_count(handler_list[type]) == 0) - _service_app_appcore_agent_unset_event_cb(type); + if (ret < 0) + return __on_error(APP_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); - return APP_ERROR_NONE; - } - } + return APP_ERROR_NONE; +} - return service_app_error(APP_ERROR_INVALID_PARAMETER, __FUNCTION__, "cannot find such handler"); +EXPORT_API void service_app_exit_without_restart(void) +{ + aul_status_update(STATUS_NORESTART); + __loop_exit(NULL); } + + diff --git a/src/service_app_private.h b/src/service_app_private.h deleted file mode 100644 index ba58ecf..0000000 --- a/src/service_app_private.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * 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_SERVICE_APP_PRIVATE_H__ -#define __TIZEN_APPFW_SERVICE_APP_PRIVATE_H__ - -#include <service_app.h> -#include <app_common.h> - -#ifdef __cplusplus -extern "C" { -#endif - -int service_app_error(app_error_e error, const char* function, const char *description); - -#ifdef __cplusplus -} -#endif - -#endif /* __TIZEN_APPFW_SERVICE_APP_PRIVATE_H__ */ |