diff options
Diffstat (limited to 'navit/plugin.c')
-rw-r--r-- | navit/plugin.c | 528 |
1 files changed, 252 insertions, 276 deletions
diff --git a/navit/plugin.c b/navit/plugin.c index 2b4749efb..81d9aaa45 100644 --- a/navit/plugin.c +++ b/navit/plugin.c @@ -51,9 +51,8 @@ typedef void * GModule; #define G_MODULE_BIND_LOCAL 1 #define G_MODULE_BIND_LAZY 2 static int -g_module_supported(void) -{ - return 1; +g_module_supported(void) { + return 1; } #ifdef HAVE_API_WIN32_BASE @@ -62,381 +61,358 @@ static DWORD last_error; static char errormsg[64]; static void * -g_module_open(char *name, int flags) -{ - HINSTANCE handle; - int len=MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, name, -1, 0, 0); - wchar_t filename[len]; - MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, name, -1, filename, len) ; - - handle = LoadLibraryW (filename); - if (!handle) - last_error=GetLastError(); - return handle; +g_module_open(char *name, int flags) { + HINSTANCE handle; + int len=MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, name, -1, 0, 0); + wchar_t filename[len]; + MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, name, -1, filename, len) ; + + handle = LoadLibraryW (filename); + if (!handle) + last_error=GetLastError(); + return handle; } static char * -g_module_error(void) -{ - sprintf(errormsg,"dll error %d",(int)last_error); - return errormsg; +g_module_error(void) { + sprintf(errormsg,"dll error %d",(int)last_error); + return errormsg; } static int -g_module_symbol(GModule *handle, char *symbol, gpointer *addr) -{ +g_module_symbol(GModule *handle, char *symbol, gpointer *addr) { #ifdef HAVE_API_WIN32_CE - int len=MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, symbol, -1, 0, 0); - wchar_t wsymbol[len+1]; - MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, symbol, -1, wsymbol, len) ; - *addr=GetProcAddress ((HANDLE)handle, wsymbol); + int len=MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, symbol, -1, 0, 0); + wchar_t wsymbol[len+1]; + MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, symbol, -1, wsymbol, len) ; + *addr=GetProcAddress ((HANDLE)handle, wsymbol); #else - *addr=GetProcAddress ((HANDLE)handle, symbol); + *addr=GetProcAddress ((HANDLE)handle, symbol); #endif - if (*addr) - return 1; - last_error=GetLastError(); - return 0; + if (*addr) + return 1; + last_error=GetLastError(); + return 0; } static void -g_module_close(GModule *handle) -{ - FreeLibrary((HANDLE)handle); +g_module_close(GModule *handle) { + FreeLibrary((HANDLE)handle); } #else static void * -g_module_open(char *name, int flags) -{ - return dlopen(name, - (flags & G_MODULE_BIND_LAZY ? RTLD_LAZY : RTLD_NOW) | - (flags & G_MODULE_BIND_LOCAL ? RTLD_LOCAL : RTLD_GLOBAL)); +g_module_open(char *name, int flags) { + return dlopen(name, + (flags & G_MODULE_BIND_LAZY ? RTLD_LAZY : RTLD_NOW) | + (flags & G_MODULE_BIND_LOCAL ? RTLD_LOCAL : RTLD_GLOBAL)); } static char * -g_module_error(void) -{ - return dlerror(); +g_module_error(void) { + return dlerror(); } static int -g_module_symbol(GModule *handle, char *symbol, gpointer *addr) -{ - *addr=dlsym(handle, symbol); - return (*addr != NULL); +g_module_symbol(GModule *handle, char *symbol, gpointer *addr) { + *addr=dlsym(handle, symbol); + return (*addr != NULL); } static void -g_module_close(GModule *handle) -{ - dlclose(handle); +g_module_close(GModule *handle) { + dlclose(handle); } #endif #endif #endif struct plugin { - int active; - int lazy; - int ondemand; - char *name; + int active; + int lazy; + int ondemand; + char *name; #ifdef USE_PLUGINS - GModule *mod; + GModule *mod; #endif - void (*init)(void); + void (*init)(void); }; struct plugins { - GHashTable *hash; - GList *list; + GHashTable *hash; + GList *list; } *pls; static struct plugin * -plugin_new_from_path(char *plugin) -{ +plugin_new_from_path(char *plugin) { #ifdef USE_PLUGINS - struct plugin *ret; - if (! g_module_supported()) { - return NULL; - } - ret=g_new0(struct plugin, 1); - ret->name=g_strdup(plugin); - return ret; + struct plugin *ret; + if (! g_module_supported()) { + return NULL; + } + ret=g_new0(struct plugin, 1); + ret->name=g_strdup(plugin); + return ret; #else - return NULL; + return NULL; #endif } int -plugin_load(struct plugin *pl) -{ +plugin_load(struct plugin *pl) { #ifdef USE_PLUGINS - gpointer init; - - GModule *mod; - - if (pl->mod) { - dbg(lvl_debug,"'%s' already loaded, returning", pl->name); - return 1; - } - mod=g_module_open(pl->name, G_MODULE_BIND_LOCAL | (pl->lazy ? G_MODULE_BIND_LAZY : 0)); - if (! mod) { - dbg(lvl_error,"can't load '%s', Error '%s'", pl->name, g_module_error()); - return 0; - } - if (!g_module_symbol(mod, "plugin_init", &init)) { - dbg(lvl_error,"can't load '%s', plugin_init not found", pl->name); - g_module_close(mod); - return 0; - } else { - dbg(lvl_debug, "loaded module %s", pl->name); - pl->mod=mod; - pl->init=init; - } - return 1; + gpointer init; + + GModule *mod; + + if (pl->mod) { + dbg(lvl_debug,"'%s' already loaded, returning", pl->name); + return 1; + } + mod=g_module_open(pl->name, G_MODULE_BIND_LOCAL | (pl->lazy ? G_MODULE_BIND_LAZY : 0)); + if (! mod) { + dbg(lvl_error,"can't load '%s', Error '%s'", pl->name, g_module_error()); + return 0; + } + if (!g_module_symbol(mod, "plugin_init", &init)) { + dbg(lvl_error,"can't load '%s', plugin_init not found", pl->name); + g_module_close(mod); + return 0; + } else { + dbg(lvl_debug, "loaded module %s", pl->name); + pl->mod=mod; + pl->init=init; + } + return 1; #else - return 0; + return 0; #endif } char * -plugin_get_name(struct plugin *pl) -{ - return pl->name; +plugin_get_name(struct plugin *pl) { + return pl->name; } int -plugin_get_active(struct plugin *pl) -{ - return pl->active; +plugin_get_active(struct plugin *pl) { + return pl->active; } void -plugin_set_active(struct plugin *pl, int active) -{ - pl->active=active; +plugin_set_active(struct plugin *pl, int active) { + pl->active=active; } void -plugin_set_lazy(struct plugin *pl, int lazy) -{ - pl->lazy=lazy; +plugin_set_lazy(struct plugin *pl, int lazy) { + pl->lazy=lazy; } #ifdef USE_PLUGINS static int -plugin_get_ondemand(struct plugin *pl) -{ - return pl->ondemand; +plugin_get_ondemand(struct plugin *pl) { + return pl->ondemand; } #endif static void -plugin_set_ondemand(struct plugin *pl, int ondemand) -{ - pl->ondemand=ondemand; +plugin_set_ondemand(struct plugin *pl, int ondemand) { + pl->ondemand=ondemand; } void -plugin_call_init(struct plugin *pl) -{ - pl->init(); +plugin_call_init(struct plugin *pl) { + pl->init(); } void -plugin_unload(struct plugin *pl) -{ +plugin_unload(struct plugin *pl) { #ifdef USE_PLUGINS - g_module_close(pl->mod); - pl->mod=NULL; + g_module_close(pl->mod); + pl->mod=NULL; #endif } void -plugin_destroy(struct plugin *pl) -{ - g_free(pl); +plugin_destroy(struct plugin *pl) { + g_free(pl); } struct plugins * -plugins_new(void) -{ - struct plugins *ret=g_new0(struct plugins, 1); - ret->hash=g_hash_table_new(g_str_hash, g_str_equal); - pls=ret; - return ret; +plugins_new(void) { + struct plugins *ret=g_new0(struct plugins, 1); + ret->hash=g_hash_table_new(g_str_hash, g_str_equal); + pls=ret; + return ret; } struct plugin * plugin_new(struct attr *parent, struct attr **attrs) { #ifdef USE_PLUGINS - struct attr *path_attr, *attr; - struct file_wordexp *we; - int active=1; // default active - int lazy=0, ondemand=0; - int i, count; - char **array; - char *name; - struct plugin *pl=NULL; - struct plugins *pls=NULL; - - if (parent) - pls=parent->u.plugins; - - if (! (path_attr=attr_search(attrs, NULL, attr_path))) { - dbg(lvl_error,"missing path"); - return NULL; - } - if ( (attr=attr_search(attrs, NULL, attr_active))) { - active=attr->u.num; - } - if ( (attr=attr_search(attrs, NULL, attr_lazy))) { - lazy=attr->u.num; - } - if ( (attr=attr_search(attrs, NULL, attr_ondemand))) { - ondemand=attr->u.num; - } - dbg(lvl_debug, "path=\"%s\", active=%d, lazy=%d, ondemand=%d",path_attr->u.str, active, lazy, ondemand); - - we=file_wordexp_new(path_attr->u.str); - count=file_wordexp_get_count(we); - array=file_wordexp_get_array(we); - dbg(lvl_info,"expanded to %d words",count); - if (count != 1 || file_exists(array[0])) { - for (i = 0 ; i < count ; i++) { - name=array[i]; - dbg(lvl_info,"found plugin module file [%d]: '%s'", i, name); - if (! (pls && (pl=g_hash_table_lookup(pls->hash, name)))) { - pl=plugin_new_from_path(name); - if (! pl) { - dbg(lvl_error,"failed to create plugin from file '%s'", name); - continue; - } - if (pls) { - g_hash_table_insert(pls->hash, plugin_get_name(pl), pl); - pls->list=g_list_append(pls->list, pl); - } - } else { - if (pls) { - pls->list=g_list_remove(pls->list, pl); - pls->list=g_list_append(pls->list, pl); - } - } - plugin_set_active(pl, active); - plugin_set_lazy(pl, lazy); - plugin_set_ondemand(pl, ondemand); - if (!pls && active) { - if (!plugin_load(pl)) - plugin_set_active(pl, 0); - else - plugin_call_init(pl); - } - } - } - file_wordexp_destroy(we); - return pl; + struct attr *path_attr, *attr; + struct file_wordexp *we; + int active=1; // default active + int lazy=0, ondemand=0; + int i, count; + char **array; + char *name; + struct plugin *pl=NULL; + struct plugins *pls=NULL; + + if (parent) + pls=parent->u.plugins; + + if (! (path_attr=attr_search(attrs, NULL, attr_path))) { + dbg(lvl_error,"missing path"); + return NULL; + } + if ( (attr=attr_search(attrs, NULL, attr_active))) { + active=attr->u.num; + } + if ( (attr=attr_search(attrs, NULL, attr_lazy))) { + lazy=attr->u.num; + } + if ( (attr=attr_search(attrs, NULL, attr_ondemand))) { + ondemand=attr->u.num; + } + dbg(lvl_debug, "path=\"%s\", active=%d, lazy=%d, ondemand=%d",path_attr->u.str, active, lazy, ondemand); + + we=file_wordexp_new(path_attr->u.str); + count=file_wordexp_get_count(we); + array=file_wordexp_get_array(we); + dbg(lvl_info,"expanded to %d words",count); + if (count != 1 || file_exists(array[0])) { + for (i = 0 ; i < count ; i++) { + name=array[i]; + dbg(lvl_info,"found plugin module file [%d]: '%s'", i, name); + if (! (pls && (pl=g_hash_table_lookup(pls->hash, name)))) { + pl=plugin_new_from_path(name); + if (! pl) { + dbg(lvl_error,"failed to create plugin from file '%s'", name); + continue; + } + if (pls) { + g_hash_table_insert(pls->hash, plugin_get_name(pl), pl); + pls->list=g_list_append(pls->list, pl); + } + } else { + if (pls) { + pls->list=g_list_remove(pls->list, pl); + pls->list=g_list_append(pls->list, pl); + } + } + plugin_set_active(pl, active); + plugin_set_lazy(pl, lazy); + plugin_set_ondemand(pl, ondemand); + if (!pls && active) { + if (!plugin_load(pl)) + plugin_set_active(pl, 0); + else + plugin_call_init(pl); + } + } + } + file_wordexp_destroy(we); + return pl; #else return 0; #endif } void -plugins_init(struct plugins *pls) -{ +plugins_init(struct plugins *pls) { #ifdef USE_PLUGINS - struct plugin *pl; - GList *l; - - l=pls->list; - if (l){ - while (l) { - pl=l->data; - if (! plugin_get_ondemand(pl)) { - if (plugin_get_active(pl)) - if (!plugin_load(pl)) - plugin_set_active(pl, 0); - if (plugin_get_active(pl)) - plugin_call_init(pl); - } - l=g_list_next(l); - } - } else { - dbg(lvl_error, "Warning: No plugins found. Is Navit installed correctly?"); - } + struct plugin *pl; + GList *l; + + l=pls->list; + if (l) { + while (l) { + pl=l->data; + if (! plugin_get_ondemand(pl)) { + if (plugin_get_active(pl)) + if (!plugin_load(pl)) + plugin_set_active(pl, 0); + if (plugin_get_active(pl)) + plugin_call_init(pl); + } + l=g_list_next(l); + } + } else { + dbg(lvl_error, "Warning: No plugins found. Is Navit installed correctly?"); + } #endif } void -plugins_destroy(struct plugins *pls) -{ - GList *l; - struct plugin *pl; - - l=pls->list; - while (l) { - pl=l->data; - plugin_unload(pl); - plugin_destroy(pl); - } - g_list_free(pls->list); - g_hash_table_destroy(pls->hash); - g_free(pls); +plugins_destroy(struct plugins *pls) { + GList *l; + struct plugin *pl; + + l=pls->list; + while (l) { + pl=l->data; + plugin_unload(pl); + plugin_destroy(pl); + } + g_list_free(pls->list); + g_hash_table_destroy(pls->hash); + g_free(pls); } static void * -find_by_name(enum plugin_category category, const char *name) -{ - GList *name_list=plugin_categories[category]; - while (name_list) { - struct name_val *nv=name_list->data; - if (!g_ascii_strcasecmp(nv->name, name)) - return nv->val; - name_list=g_list_next(name_list); - } - return NULL; +find_by_name(enum plugin_category category, const char *name) { + GList *name_list=plugin_categories[category]; + while (name_list) { + struct name_val *nv=name_list->data; + if (!g_ascii_strcasecmp(nv->name, name)) + return nv->val; + name_list=g_list_next(name_list); + } + return NULL; } void * -plugin_get_category(enum plugin_category category, const char *category_name, const char *name) -{ - GList *plugin_list; - struct plugin *pl; - char *mod_name, *filename=NULL, *corename=NULL; - void *result=NULL; - - dbg(lvl_debug, "category=\"%s\", name=\"%s\"", category_name, name); - - if ((result=find_by_name(category, name))) { - return result; - } - if (!pls) - return NULL; - plugin_list=pls->list; - filename=g_strjoin("", "lib", category_name, "_", name, NULL); - corename=g_strjoin("", "lib", category_name, "_", "core", NULL); - while (plugin_list) { - pl=plugin_list->data; - if ((mod_name=g_strrstr(pl->name, "/"))) - mod_name++; - else - mod_name=pl->name; - if (!g_ascii_strncasecmp(mod_name, filename, strlen(filename)) || !g_ascii_strncasecmp(mod_name, corename, strlen(corename))) { - dbg(lvl_debug, "Loading module \"%s\"",pl->name) ; - if (plugin_get_active(pl)) - if (!plugin_load(pl)) - plugin_set_active(pl, 0); - if (plugin_get_active(pl)) - plugin_call_init(pl); - if ((result=find_by_name(category, name))) { - g_free(filename); - g_free(corename); - return result; - } - } - plugin_list=g_list_next(plugin_list); - } - g_free(filename); - g_free(corename); - return NULL; +plugin_get_category(enum plugin_category category, const char *category_name, const char *name) { + GList *plugin_list; + struct plugin *pl; + char *mod_name, *filename=NULL, *corename=NULL; + void *result=NULL; + + dbg(lvl_debug, "category=\"%s\", name=\"%s\"", category_name, name); + + if ((result=find_by_name(category, name))) { + return result; + } + if (!pls) + return NULL; + plugin_list=pls->list; + filename=g_strjoin("", "lib", category_name, "_", name, NULL); + corename=g_strjoin("", "lib", category_name, "_", "core", NULL); + while (plugin_list) { + pl=plugin_list->data; + if ((mod_name=g_strrstr(pl->name, "/"))) + mod_name++; + else + mod_name=pl->name; + if (!g_ascii_strncasecmp(mod_name, filename, strlen(filename)) + || !g_ascii_strncasecmp(mod_name, corename, strlen(corename))) { + dbg(lvl_debug, "Loading module \"%s\"",pl->name) ; + if (plugin_get_active(pl)) + if (!plugin_load(pl)) + plugin_set_active(pl, 0); + if (plugin_get_active(pl)) + plugin_call_init(pl); + if ((result=find_by_name(category, name))) { + g_free(filename); + g_free(corename); + return result; + } + } + plugin_list=g_list_next(plugin_list); + } + g_free(filename); + g_free(corename); + return NULL; } |