+2007-06-21 [colin] 2.9.2cvs72
+
+ * src/common/plugin.c
+ * src/common/plugin.h
+ Change plugin API to know whether it's safe to
+ unload plugins or whether we should just hide
+ them
+ * src/plugins/bogofilter/bogofilter.c
+ * src/plugins/clamav/clamav_plugin.c
+ * src/plugins/demo/demo.c
+ * src/plugins/dillo_viewer/dillo_viewer.c
+ * src/plugins/pgpcore/plugin.c
+ * src/plugins/pgpinline/plugin.c
+ * src/plugins/pgpmime/plugin.c
+ * src/plugins/spamassassin/spamassassin.c
+ * src/plugins/trayicon/trayicon.c
+ Update API
+
2007-06-19 [colin] 2.9.2cvs71
* src/compose.c
( cvs diff -u -r 1.654.2.2699 -r 1.654.2.2700 configure.ac; ) > 2.9.2cvs69.patchset
( cvs diff -u -r 1.14.2.14 -r 1.14.2.15 src/importldif.c; ) > 2.9.2cvs70.patchset
( cvs diff -u -r 1.382.2.390 -r 1.382.2.391 src/compose.c; cvs diff -u -r 1.94.2.135 -r 1.94.2.136 src/messageview.c; ) > 2.9.2cvs71.patchset
+( cvs diff -u -r 1.13.2.27 -r 1.13.2.28 src/common/plugin.c; cvs diff -u -r 1.5.2.10 -r 1.5.2.11 src/common/plugin.h; cvs diff -u -r 1.1.2.30 -r 1.1.2.31 src/plugins/bogofilter/bogofilter.c; cvs diff -u -r 1.13.2.32 -r 1.13.2.33 src/plugins/clamav/clamav_plugin.c; cvs diff -u -r 1.13.2.14 -r 1.13.2.15 src/plugins/demo/demo.c; cvs diff -u -r 1.12.2.20 -r 1.12.2.21 src/plugins/dillo_viewer/dillo_viewer.c; cvs diff -u -r 1.1.2.17 -r 1.1.2.18 src/plugins/pgpcore/plugin.c; cvs diff -u -r 1.1.2.16 -r 1.1.2.17 src/plugins/pgpinline/plugin.c; cvs diff -u -r 1.1.2.25 -r 1.1.2.26 src/plugins/pgpmime/plugin.c; cvs diff -u -r 1.18.2.53 -r 1.18.2.54 src/plugins/spamassassin/spamassassin.c; cvs diff -u -r 1.14.2.53 -r 1.14.2.54 src/plugins/trayicon/trayicon.c; ) > 2.9.2cvs72.patchset
MICRO_VERSION=2
INTERFACE_AGE=0
BINARY_AGE=0
-EXTRA_VERSION=71
+EXTRA_VERSION=72
EXTRA_RELEASE=
EXTRA_GTK2_VERSION=
GSList *rdeps;
gchar *error;
+ gboolean unloaded_hidden;
};
const gchar *plugin_feature_names[] =
for (plugin_cur = plugins; plugin_cur != NULL; plugin_cur = g_slist_next(plugin_cur)) {
plugin = (Plugin *) plugin_cur->data;
+ if (plugin->unloaded_hidden)
+ continue;
+
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 (plugin->unloaded_hidden)
+ continue;
if (!strcmp(plugin->type(), type_cur->data))
fprintf(pfile->fp, "%s\n", plugin->filename);
for(; cur; cur = cur->next) {
Plugin *p = (Plugin *)cur->data;
struct PluginFeature *cur_features = p->provides();
+ if (p->unloaded_hidden)
+ continue;
for (j = 0; cur_features[j].type != PLUGIN_NOTHING; j++) {
for (i = 0; features[i].type != PLUGIN_NOTHING; i++) {
if (cur_features[j].type == features[i].type &&
/* check duplicate plugin path name */
if (plugin_is_loaded(filename)) {
- *error = g_strdup(_("Plugin already loaded"));
- return NULL;
+ plugin = plugin_get_by_filename(filename);
+ if (plugin->unloaded_hidden) {
+ /* reshow it */
+ goto init_plugin;
+ } else {
+ *error = g_strdup(_("Plugin already loaded"));
+ return NULL;
+ }
}
plugin_remove_from_unloaded_list(filename);
return NULL;
}
+init_plugin:
if (!g_module_symbol(plugin->module, "plugin_name", &plugin_name) ||
!g_module_symbol(plugin->module, "plugin_desc", &plugin_desc) ||
!g_module_symbol(plugin->module, "plugin_version", &plugin_version) ||
!g_module_symbol(plugin->module, "plugin_provides", (gpointer)&plugin_provides) ||
!g_module_symbol(plugin->module, "plugin_init", (gpointer)&plugin_init)) {
*error = g_strdup(g_module_error());
+ if (plugin->unloaded_hidden)
+ return NULL;
g_module_close(plugin->module);
g_free(plugin);
return NULL;
if (strcmp(plugin_licence(), "GPL")
&& strncmp(plugin_licence(), "GPL-compatible", strlen("GPL-compatible"))) {
*error = g_strdup(_("This module is not licenced under a GPL compatible licence."));
+ if (plugin->unloaded_hidden)
+ return NULL;
g_module_close(plugin->module);
g_free(plugin);
return NULL;
if (!strcmp(plugin_type(), "GTK")) {
*error = g_strdup(_("This module is for Claws Mail GTK1."));
+ if (plugin->unloaded_hidden)
+ return NULL;
g_module_close(plugin->module);
g_free(plugin);
return NULL;
}
if ((*error = plugin_check_features(plugin_provides())) != NULL) {
+ if (plugin->unloaded_hidden)
+ return NULL;
g_module_close(plugin->module);
g_free(plugin);
return NULL;
plugin->provides = plugin_provides;
plugin->filename = g_strdup(filename);
plugin->error = NULL;
+
if ((ok = plugin_init(error)) < 0) {
if (*error)
plugin->error = g_strdup(*error);
return NULL;
}
- plugins = g_slist_append(plugins, plugin);
+ if (!plugin->unloaded_hidden)
+ plugins = g_slist_append(plugins, plugin);
+ plugin->unloaded_hidden = FALSE;
debug_print("Plugin %s (from file %s) loaded\n", plugin->name(), filename);
void plugin_unload(Plugin *plugin)
{
- void (*plugin_done) (void);
+ gboolean (*plugin_done) (void);
+ gboolean can_unload = TRUE;
plugin_unload_rdeps(plugin);
+ if (plugin->unloaded_hidden)
+ return;
+
if (plugin->error) {
plugin_remove_from_unloaded_list(plugin->filename);
return;
}
if (g_module_symbol(plugin->module, "plugin_done", (gpointer) &plugin_done)) {
- plugin_done();
+ can_unload = plugin_done();
}
+ if (can_unload) {
#ifdef HAVE_VALGRIND
- if (!RUNNING_ON_VALGRIND) {
- g_module_close(plugin->module);
- }
+ if (!RUNNING_ON_VALGRIND) {
+ g_module_close(plugin->module);
+ }
#else
- g_module_close(plugin->module);
+ g_module_close(plugin->module);
#endif
- plugins = g_slist_remove(plugins, plugin);
- g_free(plugin->filename);
- g_free(plugin);
+ plugins = g_slist_remove(plugins, plugin);
+ g_free(plugin->filename);
+ g_free(plugin);
+ } else {
+ plugin->unloaded_hidden = TRUE;
+ }
+
}
void plugin_load_all(const gchar *type)
GSList *plugin_get_list(void)
{
- return g_slist_copy(plugins);
+ GSList *new = NULL;
+ GSList *cur = plugins;
+ for (; cur; cur = cur->next) {
+ Plugin *p = (Plugin *)cur->data;
+ if (!p->unloaded_hidden)
+ new = g_slist_prepend(new, p);
+ }
+ new = g_slist_reverse(new);
+ return new;
}
GSList *plugin_get_unloaded_list(void)
/* Functions to implement by the plugin */
gint plugin_init (gchar **error);
-void plugin_done (void);
+gboolean plugin_done (void);
const gchar *plugin_name (void);
const gchar *plugin_desc (void);
const gchar *plugin_version (void);
hook_id = -1;
- if (!check_plugin_version(MAKE_NUMERIC_VERSION(0, 9, 3, 86),
+ if (!check_plugin_version(MAKE_NUMERIC_VERSION(2,9,2,72),
VERSION_NUMERIC, PLUGIN_NAME, error))
return -1;
return item;
}
-void plugin_done(void)
+gboolean plugin_done(void)
{
if (hook_id != -1) {
bogofilter_unregister_hook();
procmsg_unregister_spam_learner(bogofilter_learn);
procmsg_spam_set_folder(NULL, NULL);
debug_print("Bogofilter plugin unloaded\n");
+ return TRUE;
}
const gchar *plugin_name(void)
unsigned int no;
#endif
- if (!check_plugin_version(MAKE_NUMERIC_VERSION(0, 9, 3, 86),
+ if (!check_plugin_version(MAKE_NUMERIC_VERSION(2,9,2,72),
VERSION_NUMERIC, PLUGIN_NAME, error))
return -1;
}
-void plugin_done(void)
+gboolean plugin_done(void)
{
hooks_unregister_hook(MAIL_FILTERING_HOOKLIST, hook_id);
g_free(config.clamav_save_folder);
clamav_gtk_done();
debug_print("ClamAV plugin unloaded\n");
+ return TRUE;
}
const gchar *plugin_name(void)
gint plugin_init(gchar **error)
{
- if (!check_plugin_version(MAKE_NUMERIC_VERSION(0, 8, 11, 39),
+ if (!check_plugin_version(MAKE_NUMERIC_VERSION(2,9,2,72),
VERSION_NUMERIC, PLUGIN_NAME, error))
return -1;
return 0;
}
-void plugin_done(void)
+gboolean plugin_done(void)
{
hooks_unregister_hook(LOG_APPEND_TEXT_HOOKLIST, hook_id);
printf("Demo plugin unloaded\n");
+ return TRUE;
}
const gchar *plugin_name(void)
gint plugin_init(gchar **error)
{
- if (!check_plugin_version(MAKE_NUMERIC_VERSION(0, 9, 3, 86),
+ if (!check_plugin_version(MAKE_NUMERIC_VERSION(2,9,2,72),
VERSION_NUMERIC, PLUGIN_NAME, error))
return -1;
return 0;
}
-void plugin_done(void)
+gboolean plugin_done(void)
{
mimeview_unregister_viewer_factory(&dillo_viewer_factory);
dillo_prefs_done();
+ return TRUE;
}
const gchar *plugin_name(void)
gint plugin_init(gchar **error)
{
- if (!check_plugin_version(MAKE_NUMERIC_VERSION(2, 1, 0, 1),
+ if (!check_plugin_version(MAKE_NUMERIC_VERSION(2,9,2,72),
VERSION_NUMERIC, PLUGIN_NAME, error))
return -1;
return 0;
}
-void plugin_done(void)
+gboolean plugin_done(void)
{
pgp_viewer_done();
prefs_gpg_done();
sgpgme_done();
+ return TRUE;
}
const gchar *plugin_name(void)
gint plugin_init(gchar **error)
{
- if (!check_plugin_version(MAKE_NUMERIC_VERSION(2, 1, 0, 1),
+ if (!check_plugin_version(MAKE_NUMERIC_VERSION(2,9,2,72),
VERSION_NUMERIC, PLUGIN_NAME, error))
return -1;
return 0;
}
-void plugin_done(void)
+gboolean plugin_done(void)
{
pgpinline_done();
+ return TRUE;
}
const gchar *plugin_name(void)
gint plugin_init(gchar **error)
{
- if (!check_plugin_version(MAKE_NUMERIC_VERSION(2, 1, 0, 1),
+ if (!check_plugin_version(MAKE_NUMERIC_VERSION(2,9,2,72),
VERSION_NUMERIC, PLUGIN_NAME, error))
return -1;
return 0;
}
-void plugin_done(void)
+gboolean plugin_done(void)
{
pgpmime_done();
+ return TRUE;
}
const gchar *plugin_name(void)
hook_id = -1;
- if (!check_plugin_version(MAKE_NUMERIC_VERSION(0, 9, 3, 86),
+ if (!check_plugin_version(MAKE_NUMERIC_VERSION(2,9,2,72),
VERSION_NUMERIC, PLUGIN_NAME, error))
return -1;
}
-void plugin_done(void)
+gboolean plugin_done(void)
{
if (hook_id != -1) {
spamassassin_unregister_hook();
procmsg_unregister_spam_learner(spamassassin_learn);
procmsg_spam_set_folder(NULL, NULL);
debug_print("SpamAssassin plugin unloaded\n");
+ return TRUE;
}
const gchar *plugin_name(void)
int plugin_init(gchar **error)
{
- if (!check_plugin_version(MAKE_NUMERIC_VERSION(0, 9, 3, 86),
+ if (!check_plugin_version(MAKE_NUMERIC_VERSION(2,9,2,72),
VERSION_NUMERIC, PLUGIN_NAME, error))
return -1;
return 0;
}
-void plugin_done(void)
+gboolean plugin_done(void)
{
trayicon_prefs_done();
hooks_unregister_hook(MAIN_WINDOW_GOT_ICONIFIED, iconified_hook_id);
if (claws_is_exiting())
- return;
+ return TRUE;
g_signal_handler_disconnect(G_OBJECT(trayicon), destroy_signal_id);
while (gtk_events_pending()) {
gtk_main_iteration();
}
+ return TRUE;
}
const gchar *plugin_name(void)