aboutsummaryrefslogtreecommitdiffstats
path: root/e-util/e-plugin.c
diff options
context:
space:
mode:
Diffstat (limited to 'e-util/e-plugin.c')
-rw-r--r--e-util/e-plugin.c46
1 files changed, 36 insertions, 10 deletions
diff --git a/e-util/e-plugin.c b/e-util/e-plugin.c
index 93ec47f3b6..7d778b59e0 100644
--- a/e-util/e-plugin.c
+++ b/e-util/e-plugin.c
@@ -608,8 +608,7 @@ e_plugin_load_plugins(void)
}
while ( (d = g_dir_read_name(dir)) ) {
- if (strlen(d) > 6
- && !strcmp(d + strlen(d) - 6, ".eplug")) {
+ if (g_str_has_suffix (d, ".eplug")) {
char * name = g_build_filename(path, d, NULL);
ep_load(name, i);
@@ -987,8 +986,10 @@ static gpointer epl_parent_class;
pages.
*/
+static GList *missing_symbols = NULL;
+
static int
-epl_loadmodule(EPlugin *ep)
+epl_loadmodule(EPlugin *ep, gboolean fatal)
{
EPluginLib *epl = E_PLUGIN_LIB (ep);
EPluginLibEnableFunc enable;
@@ -997,7 +998,10 @@ epl_loadmodule(EPlugin *ep)
return 0;
if ((epl->module = g_module_open(epl->location, 0)) == NULL) {
- g_warning("can't load plugin '%s': %s", epl->location, g_module_error());
+ if (fatal)
+ g_warning("can't load plugin '%s': %s", epl->location, g_module_error());
+ else
+ missing_symbols = g_list_prepend (missing_symbols, g_object_ref (ep));
return -1;
}
@@ -1013,6 +1017,22 @@ epl_loadmodule(EPlugin *ep)
return 0;
}
+void
+e_plugin_load_plugins_with_missing_symbols (void)
+{
+ GList *list = missing_symbols;
+
+ while (list) {
+ EPlugin *ep = list->data;
+ epl_loadmodule (ep, TRUE);
+ g_object_unref (ep);
+ list = g_list_next (list);
+ }
+
+ g_list_free (missing_symbols);
+ missing_symbols = NULL;
+}
+
static void *
epl_invoke(EPlugin *ep, const char *name, void *data)
{
@@ -1024,7 +1044,7 @@ epl_invoke(EPlugin *ep, const char *name, void *data)
return NULL;
}
- if (epl_loadmodule(ep) != 0)
+ if (epl_loadmodule(ep, FALSE) != 0)
return NULL;
if (!g_module_symbol(epl->module, name, (void *)&cb)) {
@@ -1041,7 +1061,7 @@ epl_get_symbol(EPlugin *ep, const gchar *name)
EPluginLib *epl = E_PLUGIN_LIB (ep);
gpointer symbol;
- if (epl_loadmodule (ep) != 0)
+ if (epl_loadmodule (ep, FALSE) != 0)
return NULL;
if (!g_module_symbol (epl->module, name, &symbol))
@@ -1080,9 +1100,15 @@ epl_construct(EPlugin *ep, xmlNodePtr root)
tmp = xmlGetProp(root, (const unsigned char *)"load-on-startup");
if (tmp) {
+ if (strcmp (tmp, "after-ui") == 0) {
+ missing_symbols = g_list_prepend (missing_symbols, g_object_ref (ep));
+ } else {
+ if (epl_loadmodule(ep, FALSE) != 0) {
+ xmlFree(tmp);
+ return -1;
+ }
+ }
xmlFree(tmp);
- if (epl_loadmodule(ep) != 0)
- return -1;
}
}
@@ -1097,7 +1123,7 @@ epl_get_configure_widget (EPlugin *ep)
pd (printf ("\n epl_get_configure_widget \n"));
- if (epl_loadmodule (ep) != 0) {
+ if (epl_loadmodule (ep, FALSE) != 0) {
pd (printf ("\n epl_loadmodule \n"));
return NULL;
}
@@ -1122,7 +1148,7 @@ epl_enable(EPlugin *ep, int state)
return;
/* this will noop if we're disabling since we tested it above */
- if (epl_loadmodule(ep) != 0)
+ if (epl_loadmodule(ep, FALSE) != 0)
return;
if (g_module_symbol(epl->module, "e_plugin_lib_enable", (void *)&enable)) {