libpurple/plugins.c

branch
soc.2013.gobjectification.plugins
changeset 36463
b1ce7f2998e4
parent 36460
8c939ea45957
child 36467
52aa83c47311
--- a/libpurple/plugins.c	Wed Aug 07 05:10:58 2013 +0530
+++ b/libpurple/plugins.c	Wed Aug 07 15:18:26 2013 +0530
@@ -102,7 +102,7 @@
 	loaded_plugins = g_list_append(loaded_plugins, plugin);
 
 	purple_debug_info("plugins", "Loaded plugin %s\n",
-			purple_plugin_get_filename(plugin));
+	                  purple_plugin_get_filename(plugin));
 
 	purple_signal_emit(purple_plugins_get_handle(), "plugin-load", plugin);
 
@@ -286,6 +286,23 @@
 	return priv->loadable;
 }
 
+gboolean
+purple_plugin_loads_on_query(const PurplePlugin *plugin)
+{
+#ifdef PURPLE_PLUGINS
+	GPluginPluginInfo *info;
+
+	g_return_val_if_fail(plugin != NULL, FALSE);
+
+	info = GPLUGIN_PLUGIN_INFO(purple_plugin_get_info(plugin));
+	return (gplugin_plugin_info_get_flags(info) &
+	        GPLUGIN_PLUGIN_INFO_FLAGS_LOAD_ON_QUERY);
+
+#else
+	return FALSE;
+#endif
+}
+
 gchar *
 purple_plugin_get_error(const PurplePlugin *plugin)
 {
@@ -766,7 +783,24 @@
 purple_plugins_refresh(void)
 {
 #ifdef PURPLE_PLUGINS
+	GList *plugins, *l;
+
 	gplugin_plugin_manager_refresh();
+
+	plugins = purple_plugins_find_all();
+	for (l = plugins; l != NULL; l = l->next) {
+		PurplePlugin *plugin = PURPLE_PLUGIN(l->data);
+		if (purple_plugin_is_loaded(plugin))
+			continue;
+
+		if (purple_plugin_loads_on_query(plugin)) {
+			purple_debug_info("plugins", "Auto-loading plugin %s\n",
+			                  purple_plugin_get_filename(plugin));
+			purple_plugin_load(plugin);
+		}
+	}
+
+	g_list_free(plugins);
 #endif
 }
 
@@ -821,6 +855,9 @@
 
 	for (pl = purple_plugins_get_loaded(); pl != NULL; pl = pl->next) {
 		PurplePlugin *plugin = PURPLE_PLUGIN(pl->data);
+		if (purple_plugin_loads_on_query(plugin))
+			continue;
+
 		if (!g_list_find(plugins_to_disable, plugin))
 			files = g_list_append(files, (gchar *)purple_plugin_get_filename(plugin));
 	}

mercurial