From d510189bccbe0205be699c8d7b17bc4a9a895fc6 Mon Sep 17 00:00:00 2001 From: Hwankyu Jhun Date: Fri, 13 Oct 2017 13:34:38 +0900 Subject: [PATCH] Remove voice-control-elm dependency This patch removes the voice-control-elm dependency. After this patch is applied, the appcore-efl-base calls dlopen() to use the voice-control-elm APIs. Change-Id: Iddb550cbf2aca3241e05b8eb1d419266ab5b37fd Signed-off-by: Hwankyu Jhun --- CMakeLists.txt | 2 +- packaging/app-core.spec | 1 - src/efl_base/appcore_efl_base.c | 129 ++++++++++++++++++++++++++++++++-------- 3 files changed, 104 insertions(+), 28 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c9cc480..2a2289b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -88,7 +88,7 @@ SET(SRCS_efl src/legacy/appcore-efl.c src/efl_base/appcore_efl_base.c) SET(HEADERS_efl appcore-efl.h appcore_efl_base.h) INCLUDE(FindPkgConfig) -SET(APPCORE_PKG_CHECK_MODULES2 "elementary dlog aul bundle voice-control-elm") +SET(APPCORE_PKG_CHECK_MODULES2 "elementary dlog aul bundle") pkg_check_modules(pkg_efl REQUIRED ${APPCORE_PKG_CHECK_MODULES2}) diff --git a/packaging/app-core.spec b/packaging/app-core.spec index d417968..ab08ec2 100644 --- a/packaging/app-core.spec +++ b/packaging/app-core.spec @@ -24,7 +24,6 @@ BuildRequires: pkgconfig(pkgmgr-info) BuildRequires: pkgconfig(ttrace) BuildRequires: cmake BuildRequires: pkgconfig(capi-system-info) -BuildRequires: pkgconfig(voice-control-elm) %description SLP common application basic diff --git a/src/efl_base/appcore_efl_base.c b/src/efl_base/appcore_efl_base.c index a133d1c..2a2bb75 100644 --- a/src/efl_base/appcore_efl_base.c +++ b/src/efl_base/appcore_efl_base.c @@ -19,15 +19,74 @@ #include #include #include +#include #include #include -#include -#include #include "appcore_efl_base_private.h" #include "appcore_efl_base.h" -static bool vc_elm_initialized; +#define PATH_LIB_VC_ELM "/usr/lib/libvc-elm.so.0" + +static bool __vc_elm_initialized; +static void *__vc_elm_handle; +static int (*__vc_elm_initialize)(void); +static int (*__vc_elm_deinitialize)(void); +static int (*__vc_elm_set_auto_register_mode)(int, int); + +static void __unload_vc_elm(void) +{ + if (!__vc_elm_handle) + return; + + __vc_elm_initialize = NULL; + __vc_elm_deinitialize = NULL; + __vc_elm_set_auto_register_mode = NULL; + + dlclose(__vc_elm_handle); + __vc_elm_handle = NULL; +} + +static int __load_vc_elm(void) +{ + if (__vc_elm_handle) + return 0; + + if (access(PATH_LIB_VC_ELM, F_OK) != 0) { + _ERR("Failed to access %s", PATH_LIB_VC_ELM); + return -1; + } + + __vc_elm_handle = dlopen(PATH_LIB_VC_ELM, RTLD_LAZY | RTLD_GLOBAL); + if (!__vc_elm_handle) { + _ERR("Failed to open %s", PATH_LIB_VC_ELM); + return -1; + } + + __vc_elm_initialize = dlsym(__vc_elm_handle, "vc_elm_initialize"); + if (!__vc_elm_initialize) { + _ERR("Failed to load vc_elm_initialize"); + __unload_vc_elm(); + return -1; + } + + __vc_elm_deinitialize = dlsym(__vc_elm_handle, "vc_elm_deinitialize"); + if (!__vc_elm_deinitialize) { + _ERR("Failed to load vc_elm_deinitialize"); + __unload_vc_elm(); + return -1; + } + + __vc_elm_set_auto_register_mode = dlsym(__vc_elm_handle, + "vc_elm_set_auto_register_mode"); + if (!__vc_elm_set_auto_register_mode) { + _ERR("Failed to load vc_elm_set_auto_register_mode"); + __unload_vc_elm(); + return -1; + } + + return 0; +} static void __vc_vtauto_changed_cb(keynode_t *key, void *data) { @@ -40,22 +99,54 @@ static void __vc_vtauto_changed_cb(keynode_t *key, void *data) vt_automode = vconf_keynode_get_bool(key); if (vt_automode) { - if (!vc_elm_initialized) { - vc_elm_initialize(); - vc_elm_initialized = true; + if (!__vc_elm_initialized) { + __vc_elm_initialize(); + __vc_elm_initialized = true; } - vc_elm_set_auto_register_mode(2, 0); + __vc_elm_set_auto_register_mode(2, 0); } else { - vc_elm_deinitialize(); - vc_elm_initialized = false; + __vc_elm_deinitialize(); + __vc_elm_initialized = false; } } +static void __vc_elm_init(void) +{ + int vt_automode = 0; + int r; + + r = __load_vc_elm(); + if (r < 0) + return; + + vconf_notify_key_changed(VCONFKEY_VC_VOICE_TOUCH_AUTOMODE, + __vc_vtauto_changed_cb, NULL); + vconf_get_bool(VCONFKEY_VC_VOICE_TOUCH_AUTOMODE, &vt_automode); + if (vt_automode) { + if (!__vc_elm_initialized) { + __vc_elm_initialize(); + __vc_elm_initialized = true; + } + __vc_elm_set_auto_register_mode(2, 0); + } +} + +static void __vc_elm_finish(void) +{ + vconf_ignore_key_changed(VCONFKEY_VC_VOICE_TOUCH_AUTOMODE, + __vc_vtauto_changed_cb); + if (__vc_elm_initialized) { + __vc_elm_deinitialize(); + __vc_elm_initialized = false; + } + + __unload_vc_elm(); +} + static void __efl_app_init(int argc, char **argv, void *data) { int hint; const char *hwacc; - int vt_automode = 0; elm_init(argc, argv); @@ -76,26 +167,12 @@ static void __efl_app_init(int argc, char **argv, void *data) } /* VC voice touch setting */ - vconf_notify_key_changed(VCONFKEY_VC_VOICE_TOUCH_AUTOMODE, - __vc_vtauto_changed_cb, NULL); - vconf_get_bool(VCONFKEY_VC_VOICE_TOUCH_AUTOMODE, &vt_automode); - if (vt_automode) { - if (!vc_elm_initialized) { - vc_elm_initialize(); - vc_elm_initialized = true; - } - vc_elm_set_auto_register_mode(2, 0); - } + __vc_elm_init(); } static void __efl_app_finish(void) { - vconf_ignore_key_changed(VCONFKEY_VC_VOICE_TOUCH_AUTOMODE, - __vc_vtauto_changed_cb); - if (vc_elm_initialized) { - vc_elm_deinitialize(); - vc_elm_initialized = false; - } + __vc_elm_finish(); elm_shutdown(); -- 2.7.4