#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
+#include <dlfcn.h>
#include <Elementary.h>
#include <vconf.h>
-#include <voice_control_elm.h>
-#include <voice_control_elm_private.h>
#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)
{
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);
}
/* 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();