2006-02-16 [cleroy] 2.0.0cvs59
authorColin Leroy <colin@colino.net>
Thu, 16 Feb 2006 17:26:29 +0000 (17:26 +0000)
committerColin Leroy <colin@colino.net>
Thu, 16 Feb 2006 17:26:29 +0000 (17:26 +0000)
* src/main.c
* src/common/plugin.c
* src/common/plugin.h
* src/gtk/pluginwindow.c
Keep track of requested (but unloaded) plugins
in some error cases.

ChangeLog
PATCHSETS
configure.ac
src/common/plugin.c
src/common/plugin.h
src/gtk/pluginwindow.c
src/main.c

index 280941afdee102646d4ad31ce62973f56d32441c..53d9a82db3e52941ec5669cd5567c75c67fdc58d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2006-02-16 [cleroy]    2.0.0cvs59
+
+       * src/main.c
+       * src/common/plugin.c
+       * src/common/plugin.h
+       * src/gtk/pluginwindow.c
+               Keep track of requested (but unloaded) plugins
+               in some error cases.
+
 2006-02-16 [wwp]       2.0.0cvs58
 
        * src/gtk/gtkaspell.c
index 4365ac87b224641c91d14848043aa8e354a113ab..366f01750d66164f2377fdefc624a3c48101428a 100644 (file)
--- a/PATCHSETS
+++ b/PATCHSETS
 ( cvs diff -u -r 1.83.2.64 -r 1.83.2.65 src/mimeview.c;  cvs diff -u -r 1.20.2.7 -r 1.20.2.8 src/mimeview.h;  cvs diff -u -r 1.395.2.169 -r 1.395.2.170 src/summaryview.c;  cvs diff -u -r 1.1.4.27 -r 1.1.4.28 src/etpan/imap-thread.c;  ) > 2.0.0cvs56.patchset
 ( cvs diff -u -r 1.22.2.18 -r 1.22.2.19 src/quote_fmt_parse.y;  ) > 2.0.0cvs57.patchset
 ( cvs diff -u -r 1.9.2.36 -r 1.9.2.37 src/gtk/gtkaspell.c;  cvs diff -u -r 1.5.2.4 -r 1.5.2.5 src/gtk/gtkaspell.h;  cvs diff -u -r 1.5.2.18 -r 1.5.2.19 src/prefs_spelling.c;  cvs diff -u -r 1.382.2.241 -r 1.382.2.242 src/compose.c;  cvs diff -u -r 1.204.2.75 -r 1.204.2.76 src/prefs_common.c;  cvs diff -u -r 1.103.2.40 -r 1.103.2.41 src/prefs_common.h;  ) > 2.0.0cvs58.patchset
+( cvs diff -u -r 1.115.2.75 -r 1.115.2.76 src/main.c;  cvs diff -u -r 1.13.2.16 -r 1.13.2.17 src/common/plugin.c;  cvs diff -u -r 1.5.2.4 -r 1.5.2.5 src/common/plugin.h;  cvs diff -u -r 1.5.2.26 -r 1.5.2.27 src/gtk/pluginwindow.c;  ) > 2.0.0cvs59.patchset
index a50778a3599058cdcc0ad167fc6390c922003039..7f211ed91e32e46412948ff71c07689d88e77e42 100644 (file)
@@ -11,7 +11,7 @@ MINOR_VERSION=0
 MICRO_VERSION=0
 INTERFACE_AGE=0
 BINARY_AGE=0
-EXTRA_VERSION=58
+EXTRA_VERSION=59
 EXTRA_RELEASE=
 EXTRA_GTK2_VERSION=
 
index cdc920642ba03f33e32dd1dcf8916e550217e0eb..5bfb8c32add85cc61189832644e0f489e1d8156c 100644 (file)
@@ -43,6 +43,7 @@ struct _Plugin
        const gchar *(*type) (void);
        const gchar *(*licence) (void);
        GSList *rdeps;
+       gchar *error;
 };
 
 /**
@@ -51,6 +52,11 @@ struct _Plugin
 GSList *plugins = NULL;
 GSList *plugin_types = NULL;
 
+/* 
+ * List of plugins unloaded for some fixable reason
+ */
+static GSList *unloaded_plugins = NULL;
+
 static gint list_find_by_string(gconstpointer data, gconstpointer str)
 {
        return strcmp((gchar *)data, (gchar *)str) ? TRUE : FALSE;
@@ -92,6 +98,12 @@ void plugin_save_list(void)
                        if (!strcmp(plugin->type(), type_cur->data))
                                fprintf(pfile->fp, "%s\n", plugin->filename);
                }
+               for (plugin_cur = unloaded_plugins; plugin_cur != NULL; plugin_cur = g_slist_next(plugin_cur)) {
+                       plugin = (Plugin *) plugin_cur->data;
+                       
+                       if (!strcmp(plugin->type(), type_cur->data))
+                               fprintf(pfile->fp, "%s\n", plugin->filename);
+               }
                fprintf(pfile->fp, "\n");
 
                if (prefs_file_close(pfile) < 0)
@@ -192,6 +204,22 @@ static void plugin_unload_rdeps(Plugin *plugin)
        g_slist_free(plugin->rdeps);
        plugin->rdeps = NULL;
 }
+
+static void plugin_remove_from_unloaded_list (const gchar *filename)
+{
+       GSList *item = g_slist_find_custom(unloaded_plugins, 
+                               (gpointer) filename, (GCompareFunc)list_find_by_plugin_filename);
+       Plugin *unloaded_plugin = item ? ((Plugin *)item->data):NULL;
+       if (unloaded_plugin != NULL) {
+               debug_print("removing %s from unloaded list\n", unloaded_plugin->filename);
+               unloaded_plugins = g_slist_remove(unloaded_plugins, unloaded_plugin);
+               g_module_close(unloaded_plugin->module);
+               g_free(unloaded_plugin->filename);
+               g_free(unloaded_plugin->error);
+               g_free(unloaded_plugin);
+       }
+}
+
 /**
  * Loads a plugin
  *
@@ -217,6 +245,8 @@ Plugin *plugin_load(const gchar *filename, gchar **error)
                return NULL;                
        }                               
        
+       plugin_remove_from_unloaded_list(filename);
+       
        if (plugin_load_deps(filename, error) < 0)
                return NULL;
        plugin = g_new0(Plugin, 1);
@@ -260,18 +290,19 @@ Plugin *plugin_load(const gchar *filename, gchar **error)
                return NULL;
        }
 
-       if ((ok = plugin_init(error)) < 0) {
-               g_module_close(plugin->module);
-               g_free(plugin);
-               return NULL;
-       }
-
        plugin->name = plugin_name;
        plugin->desc = plugin_desc;
        plugin->version = plugin_version;
        plugin->type = plugin_type;
        plugin->licence = plugin_licence;
        plugin->filename = g_strdup(filename);
+       plugin->error = NULL;
+       if ((ok = plugin_init(error)) < 0) {
+               if (*error)
+                       plugin->error = g_strdup(*error);
+               unloaded_plugins = g_slist_append(unloaded_plugins, plugin);
+               return NULL;
+       }
 
        plugins = g_slist_append(plugins, plugin);
 
@@ -286,6 +317,10 @@ void plugin_unload(Plugin *plugin)
 
        plugin_unload_rdeps(plugin);
 
+       if (plugin->error) {
+               plugin_remove_from_unloaded_list(plugin->filename);
+               return;
+       }
        if (g_module_symbol(plugin->module, "plugin_done", (gpointer) &plugin_done)) {
                plugin_done();
        }
@@ -351,7 +386,7 @@ void plugin_unload_all(const gchar *type)
        cur = g_slist_find_custom(plugin_types, (gpointer) type, list_find_by_string);
        if (cur) {
                g_free(cur->data);
-               g_slist_remove(plugin_types, cur);
+               plugin_types = g_slist_remove(plugin_types, cur);
        }
 }
 
@@ -360,6 +395,11 @@ GSList *plugin_get_list(void)
        return g_slist_copy(plugins);
 }
 
+GSList *plugin_get_unloaded_list(void)
+{
+       return g_slist_copy(unloaded_plugins);
+}
+
 const gchar *plugin_get_name(Plugin *plugin)
 {
        return plugin->name();
@@ -374,3 +414,8 @@ const gchar *plugin_get_version(Plugin *plugin)
 {
        return plugin->version();
 }
+
+const gchar *plugin_get_error(Plugin *plugin)
+{
+       return plugin->error;
+}
index d770e9851b18a256ba67701f8c6a11a2ba99c36b..9d0869092816e039a52ddcf1e94ad61d99cb03b7 100644 (file)
@@ -40,8 +40,9 @@ void plugin_unload_all                (const gchar     *type);
 void plugin_save_list          (void);
 
 GSList *plugin_get_list                (void);
+GSList *plugin_get_unloaded_list(void);
 const gchar *plugin_get_name   (Plugin          *plugin);
 const gchar *plugin_get_desc   (Plugin          *plugin);
 const gchar *plugin_get_version        (Plugin          *plugin);
-
+const gchar *plugin_get_error  (Plugin          *plugin);
 #endif
index 764532ff8c19ff8e973ba6d00f7b029ef77ac043..56c5883f8a6b4ef565db1166c7c2361f18370736 100644 (file)
@@ -38,6 +38,7 @@
 enum {
        PLUGINWINDOW_NAME,              /*<! plugin name */
        PLUGINWINDOW_DATA,              /*<! Plugin pointer */
+       PLUGINWINDOW_STYLE,             /*<! italic if error */
        N_PLUGINWINDOW_COLUMNS
 };
 
@@ -70,7 +71,7 @@ static void close_cb(GtkButton *button, PluginWindow *pluginwindow)
 
 static void set_plugin_list(PluginWindow *pluginwindow)
 {
-       GSList *plugins, *cur;
+       GSList *plugins, *cur, *unloaded;
        const gchar *text;
        GtkListStore *store;
        GtkTreeIter iter;
@@ -79,6 +80,7 @@ static void set_plugin_list(PluginWindow *pluginwindow)
        GtkTreeSelection *selection;
 
        plugins = plugin_get_list();
+       unloaded = plugin_get_unloaded_list();
 
        store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW
                                (pluginwindow->plugin_list_view)));
@@ -102,6 +104,19 @@ static void set_plugin_list(PluginWindow *pluginwindow)
                gtk_list_store_set(store, &iter,
                                   PLUGINWINDOW_NAME, text,
                                   PLUGINWINDOW_DATA, plugin,
+                                  PLUGINWINDOW_STYLE, PANGO_STYLE_NORMAL,
+                                  -1);
+       }
+
+       for(cur = unloaded; cur != NULL; cur = g_slist_next(cur)) {
+               Plugin *plugin = (Plugin *) cur->data;
+
+               gtk_list_store_append(store, &iter);
+               text = plugin_get_name(plugin);
+               gtk_list_store_set(store, &iter,
+                                  PLUGINWINDOW_NAME, text,
+                                  PLUGINWINDOW_DATA, plugin,
+                                  PLUGINWINDOW_STYLE, PANGO_STYLE_ITALIC,
                                   -1);
        }
 
@@ -123,12 +138,22 @@ static void select_row_cb(Plugin *plugin, PluginWindow *pluginwindow)
        pluginwindow->selected_plugin = plugin;
 
        if (pluginwindow->selected_plugin != NULL) {
+               const gchar *desc = plugin_get_desc(plugin);
+               const gchar *err = plugin_get_error(plugin);
                gtk_text_buffer_get_start_iter(textbuf, &start_iter);
                gtk_text_buffer_get_end_iter(textbuf, &end_iter);
                gtk_text_buffer_delete(textbuf, &start_iter, &end_iter);
-               text = g_strconcat(plugin_get_desc(plugin), _("\n\nVersion: "),
+               
+               if (err == NULL)
+                       text = g_strconcat(desc, _("\n\nVersion: "),
+                                  plugin_get_version(plugin), "\n", NULL);
+               else
+                       text = g_strconcat(_("Error: "),
+                                  err, "\n", _("Plugin is not functional."), 
+                                  "\n\n", desc, _("\n\nVersion: "),
                                   plugin_get_version(plugin), "\n", NULL);
                gtk_text_buffer_insert(textbuf, &start_iter, text, strlen(text));
+               g_free(text);
                gtk_widget_set_sensitive(pluginwindow->unload_btn, TRUE);
        } else {
                gtk_widget_set_sensitive(pluginwindow->unload_btn, FALSE);
@@ -365,6 +390,7 @@ static GtkListStore* pluginwindow_create_data_store(void)
        return gtk_list_store_new(N_PLUGINWINDOW_COLUMNS,
                                  G_TYPE_STRING,        
                                  G_TYPE_POINTER,
+                                 PANGO_TYPE_STYLE,
                                  -1);
 }
 
@@ -402,6 +428,7 @@ static void pluginwindow_create_list_view_columns(GtkWidget *list_view)
                (_("Plugins"),
                 renderer,
                 "text", PLUGINWINDOW_NAME,
+                "style", PLUGINWINDOW_STYLE,
                 NULL);
        gtk_tree_view_append_column(GTK_TREE_VIEW(list_view), column);          
 }
index 324a9d6c2f89d922bdd4f3b8c229235054ea340b..a1f53eea06cba958275f50379d73b0c3833a888e 100644 (file)
@@ -521,6 +521,12 @@ int main(int argc, char *argv[])
 
        plugin_load_all("GTK2");
        
+       if (plugin_get_unloaded_list() != NULL) {
+               alertpanel_warning(_("Some plugin(s) failed to load. "
+                                    "Check the Plugins configuration "
+                                    "for more information."));
+       }
+       
        if (!folder_have_mailbox()) {
                alertpanel_error(_("Sylpheed-Claws has detected a configured "
                                   "mailbox, but could not load it. It is "