diff options
Diffstat (limited to 'e-util')
-rw-r--r-- | e-util/ChangeLog | 6 | ||||
-rw-r--r-- | e-util/e-plugin.c | 28 | ||||
-rw-r--r-- | e-util/e-plugin.h | 10 |
3 files changed, 39 insertions, 5 deletions
diff --git a/e-util/ChangeLog b/e-util/ChangeLog index f96e121ffe..eeeb8e00ea 100644 --- a/e-util/ChangeLog +++ b/e-util/ChangeLog @@ -1,5 +1,11 @@ 2004-10-07 Not Zed <NotZed@Ximian.com> + * e-plugin.c (epl_invoke): noop if we're disabled, and do some + lifecycle stuff now, call e_plugin_lib_enable on the module if it + exists. + +2004-10-07 Not Zed <NotZed@Ximian.com> + * e-config.c (ec_rebuild): show the toplevel notebook if we had to create one, always. diff --git a/e-util/e-plugin.c b/e-util/e-plugin.c index d64360c382..08fc304699 100644 --- a/e-util/e-plugin.c +++ b/e-util/e-plugin.c @@ -624,6 +624,7 @@ e_plugin_xml_content_domain(xmlNodePtr node, const char *domain) /* ********************************************************************** */ static void *epl_parent_class; +/* this looks weird, but it saves a lot of typing */ #define epl ((EPluginLib *)ep) /* TODO: @@ -640,20 +641,37 @@ static void *epl_parent_class; static void * epl_invoke(EPlugin *ep, const char *name, void *data) { - void *(*cb)(EPlugin *ep, void *data); + EPluginLibFunc cb; - if (epl->module == NULL - && (epl->module = g_module_open(epl->location, 0)) == NULL) { - g_warning("can't load plugin '%s'", g_module_error()); + 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; + } + + if (g_module_symbol(epl->module, "e_plugin_lib_enable", (void *)&enable)) { + if (enable(epl, TRUE) != 0) { + ep->enabled = FALSE; + g_module_close(epl->module); + epl->module = NULL; + 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; } - return cb(ep, data); + return cb(epl, data); } static int diff --git a/e-util/e-plugin.h b/e-util/e-plugin.h index 802469acb4..1ecc75b308 100644 --- a/e-util/e-plugin.h +++ b/e-util/e-plugin.h @@ -102,6 +102,13 @@ char *e_plugin_xml_content_domain(xmlNodePtr node, const char *domain); typedef struct _EPluginLib EPluginLib; typedef struct _EPluginLibClass EPluginLibClass; +/* The callback signature used for epluginlib methods */ +typedef void *(EPluginLibFunc)(EPluginLib *ep, void *data); +/* The setup method, this will be called when the plugin is + * initialised. In the future it may also be called when the plugin + * is disabled. */ +typedef int (EPluginLibEnableFunc)(EPluginLib *ep, int enable); + /** * struct _EPluginLib - * @@ -112,6 +119,9 @@ typedef struct _EPluginLibClass EPluginLibClass; * This is a concrete EPlugin class. It loads and invokes dynamically * loaded libraries using GModule. The shared object isn't loaded * until the first callback is invoked. + * + * When the plugin is loaded, and if it exists, "e_plugin_lib_enable" + * will be invoked to initialise the **/ struct _EPluginLib { EPlugin plugin; |