diff options
-rw-r--r-- | client/ug-client.c | 19 | ||||
-rw-r--r-- | include/ug-module.h | 2 | ||||
-rw-r--r-- | src/module.c | 15 | ||||
-rw-r--r-- | src/ug.c | 11 |
4 files changed, 36 insertions, 11 deletions
diff --git a/client/ug-client.c b/client/ug-client.c index 38fe98f..bce59d5 100644 --- a/client/ug-client.c +++ b/client/ug-client.c @@ -20,8 +20,11 @@ */ #include <stdio.h> +#include <dlfcn.h> +#include <errno.h> #include <appcore-efl.h> #include <ui-gadget.h> +#include <ug-module.h> #include <dlog.h> #include <aul.h> @@ -492,9 +495,22 @@ func_out: static int app_terminate(void *data) { struct appdata *ad = data; + char *ug_file_path = NULL; + void *handle; + int ret; LOGD("app_terminate called"); + ret = ug_module_get_file_path(ad->name, &ug_file_path); + if (ret == 0) { + handle = dlopen(ug_file_path, RTLD_LAZY); + if (!handle) + LOGE("Failed to dlopen the ug file (%d)", errno); + } + + if (ug_file_path) + free(ug_file_path); + _ug_client_dbus_signal_handler_fini(data); evas_object_smart_callback_del(ad->win, "wm,rotation,changed", rotate); @@ -513,9 +529,6 @@ static int app_terminate(void *data) app_control_destroy(ad->request); - if (ad->name) - free(ad->name); - LOGD("app_terminate end"); return 0; diff --git a/include/ug-module.h b/include/ug-module.h index 2db135f..36811d4 100644 --- a/include/ug-module.h +++ b/include/ug-module.h @@ -33,6 +33,6 @@ struct ug_module { struct ug_module *ug_module_load(const char *name); int ug_module_unload(struct ug_module *module); -int ug_exist(const char* name); +int ug_module_get_file_path(const char *name, char **ug_file_path); #endif /* __UG_MODULE_H__ */ diff --git a/src/module.c b/src/module.c index 2df10e2..b66e772 100644 --- a/src/module.c +++ b/src/module.c @@ -42,6 +42,11 @@ #define MEM_ADDR_LEN 8 #define MEM_ADDR_TOT_LEN 17 +#ifndef UG_API +#define UG_API __attribute__ ((visibility("default"))) +#endif + + static char *__ug_module_get_addr(const char *ug_name) { FILE *file; @@ -278,14 +283,12 @@ int ug_module_unload(struct ug_module *module) return 0; } -int ug_exist(const char* name) +UG_API int ug_module_get_file_path(const char *name, char **ug_file_path) { - int ret = 1; - - if (__get_ug_info(name, NULL) < 0) { + if (__get_ug_info(name, ug_file_path) < 0) { _ERR("error in getting ug file path"); - ret = 0; + return -1; } - return ret; + return 0; } @@ -377,12 +377,21 @@ UG_API int ug_disable_effect(ui_gadget_h ug) UG_API int ug_is_installed(const char *name) { + int ret = 1; + char *ug_file_path = NULL; + if (name == NULL) { _ERR("name is null"); return -1; } - return ug_exist(name); + if (!ug_module_get_file_path(name, &ug_file_path)) + ret = 0; + + if (ug_file_path) + free(ug_file_path); + + return ret; } #ifdef ENABLE_UG_CREATE_CB |