noop if we're disabled, and do some lifecycle stuff now, call
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. svn path=/trunk/; revision=27494
This commit is contained in:
@ -1,3 +1,9 @@
|
||||
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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
|
||||
Reference in New Issue
Block a user