summaryrefslogtreecommitdiff
path: root/libpurple/plugin.c
diff options
context:
space:
mode:
authorRichard Laager <rlaager@pidgin.im>2007-10-07 16:02:55 +0000
committerRichard Laager <rlaager@pidgin.im>2007-10-07 16:02:55 +0000
commit0a88f1e3f37c478c3843b397d0bd1910de35e0c9 (patch)
tree125689adf74d36da6cd85c0447f463c0dfe125c5 /libpurple/plugin.c
parent59bf0304e92947649443d1d13b56b7c3b31e3351 (diff)
downloadpidgin-0a88f1e3f37c478c3843b397d0bd1910de35e0c9.tar.gz
* Add purple_plugin_disable() to prevent plugins from loading on the next
startup. A UI would call this when purple_plugin_unload() returns FALSE. * Make purple_plugin_unload() set plugin->error instead of popping up a notification if a dependent plugin can't be unloaded.
Diffstat (limited to 'libpurple/plugin.c')
-rw-r--r--libpurple/plugin.c51
1 files changed, 31 insertions, 20 deletions
diff --git a/libpurple/plugin.c b/libpurple/plugin.c
index 3b568a438c..f9280728f7 100644
--- a/libpurple/plugin.c
+++ b/libpurple/plugin.c
@@ -58,6 +58,7 @@ static GList *protocol_plugins = NULL;
#ifdef PURPLE_PLUGINS
static GList *load_queue = NULL;
static GList *plugin_loaders = NULL;
+static GList *plugins_to_disable = NULL;
#endif
static void (*probe_cb)(void *) = NULL;
@@ -658,15 +659,10 @@ purple_plugin_unload(PurplePlugin *plugin)
{
if (!purple_plugin_unload(dep_plugin))
{
- char *tmp;
-
- tmp = g_strdup_printf(_("The dependent plugin %s failed to unload."),
- _(dep_plugin->info->name));
-
- purple_notify_error(NULL, NULL,
- _("There were errors unloading the plugin."), tmp);
- g_free(tmp);
-
+ g_free(plugin->error);
+ plugin->error = g_strdup_printf(_("%s requires %s, but it failed to unload."),
+ _(plugin->info->name),
+ _(dep_plugin->info->name));
return FALSE;
}
else
@@ -691,9 +687,8 @@ purple_plugin_unload(PurplePlugin *plugin)
}
if (plugin->native_plugin) {
- if (plugin->info->unload != NULL)
- if (!plugin->info->unload(plugin))
- return FALSE;
+ if (plugin->info->unload && !plugin->info->unload(plugin))
+ return FALSE;
if (plugin->info->type == PURPLE_PLUGIN_PROTOCOL) {
PurplePluginProtocolInfo *prpl_info;
@@ -728,9 +723,8 @@ purple_plugin_unload(PurplePlugin *plugin)
loader_info = PURPLE_PLUGIN_LOADER_INFO(loader);
- if (loader_info->unload != NULL)
- if (!loader_info->unload(plugin))
- return FALSE;
+ if (loader_info->unload && !loader_info->unload(plugin))
+ return FALSE;
}
/* cancel any pending dialogs the plugin has */
@@ -743,8 +737,16 @@ purple_plugin_unload(PurplePlugin *plugin)
loaded_plugins = g_list_remove(loaded_plugins, plugin);
if ((plugin->info != NULL) && PURPLE_IS_PROTOCOL_PLUGIN(plugin))
protocol_plugins = g_list_remove(protocol_plugins, plugin);
+ plugins_to_disable = g_list_remove(plugins_to_disable, plugin);
plugin->loaded = FALSE;
+ /* We wouldn't be anywhere near here if the plugin wasn't loaded, so
+ * if plugin->error is set at all, it had to be from a previous
+ * unload failure. It's obviously okay now.
+ */
+ g_free(plugin->error);
+ plugin->error = NULL;
+
if (unload_cb != NULL)
unload_cb(plugin, unload_cb_data);
@@ -758,6 +760,15 @@ purple_plugin_unload(PurplePlugin *plugin)
#endif /* PURPLE_PLUGINS */
}
+void
+purple_plugin_disable(PurplePlugin *plugin)
+{
+ g_return_if_fail(plugin != NULL);
+
+ if (!g_list_find(plugins_to_disable, plugin))
+ plugins_to_disable = g_list_prepend(plugins_to_disable, plugin);
+}
+
gboolean
purple_plugin_reload(PurplePlugin *plugin)
{
@@ -1223,14 +1234,14 @@ purple_plugins_save_loaded(const char *key)
#ifdef PURPLE_PLUGINS
GList *pl;
GList *files = NULL;
- PurplePlugin *p;
for (pl = purple_plugins_get_loaded(); pl != NULL; pl = pl->next) {
- p = pl->data;
+ PurplePlugin *plugin = pl->data;
- if (p->info->type != PURPLE_PLUGIN_PROTOCOL &&
- p->info->type != PURPLE_PLUGIN_LOADER) {
- files = g_list_append(files, p->path);
+ if (plugin->info->type != PURPLE_PLUGIN_PROTOCOL &&
+ plugin->info->type != PURPLE_PLUGIN_LOADER &&
+ !g_list_find(plugins_to_disable, plugin)) {
+ files = g_list_append(files, plugin->path);
}
}