diff options
-rw-r--r-- | e-util/ChangeLog | 6 | ||||
-rw-r--r-- | e-util/e-plugin.c | 67 |
2 files changed, 53 insertions, 20 deletions
diff --git a/e-util/ChangeLog b/e-util/ChangeLog index 9244442c84..4464929ffd 100644 --- a/e-util/ChangeLog +++ b/e-util/ChangeLog @@ -1,3 +1,9 @@ +2004-11-18 Not Zed <NotZed@Ximian.com> + + * e-plugin.c (epl_loadmodule): split out module loadng code. + (epl_construct): if we're enabled, and load-on-startup is set, + load the module right away. Not to be abused! + 2004-11-03 Not Zed <NotZed@Ximian.com> * e-plugin.c (e_plugin_list_plugins): added helper api to list all diff --git a/e-util/e-plugin.c b/e-util/e-plugin.c index 0a0688a5cd..d163a8a5ec 100644 --- a/e-util/e-plugin.c +++ b/e-util/e-plugin.c @@ -736,22 +736,15 @@ static void *epl_parent_class; pages. */ -static void * -epl_invoke(EPlugin *ep, const char *name, void *data) +static int +epl_loadmodule(EPlugin *ep) { - EPluginLibFunc cb; - - if (!ep->enabled) { - g_warning("trying to invoke '%s' on disabled plugin '%s'", name, ep->id); - return NULL; - } - if (epl->module == NULL) { EPluginLibEnableFunc enable; if ((epl->module = g_module_open(epl->location, 0)) == NULL) { g_warning("can't load plugin '%s'", g_module_error()); - return NULL; + return -1; } if (g_module_symbol(epl->module, "e_plugin_lib_enable", (void *)&enable)) { @@ -759,11 +752,27 @@ epl_invoke(EPlugin *ep, const char *name, void *data) ep->enabled = FALSE; g_module_close(epl->module); epl->module = NULL; - return NULL; + return -1; } } } + return 0; +} + +static void * +epl_invoke(EPlugin *ep, const char *name, void *data) +{ + EPluginLibFunc cb; + + if (!ep->enabled) { + g_warning("trying to invoke '%s' on disabled plugin '%s'", name, ep->id); + return NULL; + } + + if (epl_loadmodule(ep) != 0) + return NULL; + if (!g_module_symbol(epl->module, name, (void *)&cb)) { g_warning("Cannot resolve symbol '%s' in plugin '%s' (not exported?)", name, epl->location); return NULL; @@ -783,28 +792,46 @@ epl_construct(EPlugin *ep, xmlNodePtr root) if (epl->location == NULL) return -1; + /* If we're enabled, check for the load-on-startup property */ + if (ep->enabled) { + xmlChar *tmp; + + tmp = xmlGetProp(root, "load-on-startup"); + if (tmp) { + xmlFree(tmp); + if (epl_loadmodule(ep) != 0) + return -1; + } + } + return 0; } static void epl_enable(EPlugin *ep, int state) { + EPluginLibEnableFunc enable; + ((EPluginClass *)epl_parent_class)->enable(ep, state); - /* try and unload the module if the plugin will let us */ - /* This may cause more problems than its worth ... so actual module removal disabled for now */ - if (epl->module && !state) { - EPluginLibEnableFunc enable; + /* if we're disabling and it isn't loaded, nothing to do */ + if (!state && epl->module == NULL) + return; - if (g_module_symbol(epl->module, "e_plugin_lib_enable", (void *)&enable)) { - if (enable(epl, FALSE) != 0) - return; - } + /* this will noop if we're disabling since we tested it above */ + if (epl_loadmodule(ep) != 0) + return; + + if (g_module_symbol(epl->module, "e_plugin_lib_enable", (void *)&enable)) { + if (enable(epl, state) != 0) + return; + } #if 0 + if (!state) { g_module_close(epl->module); epl->module = NULL; -#endif } +#endif } static void |