diff src/audacious/pluginenum.c @ 3437:3092a8b3fe34 trunk

Big plugin system changes (part 1 of who knows, it's still a big mess): - remove plugin_matrix, replacing it with a mowgli.dictionary of all loaded plugins pointing back to their handles - input_is_enabled() craq -> gboolean plugin::enabled (this craq was pointed out by ccr) - consolidate a lot of crap in ui_preferences.c (a LOT more to come) - introduce probably countless loads of bugs and SIGSEGVs. - you WILL need to recompile plugins after this, and some which do not use C99-style struct initialisers will likely fail to build.
author William Pitcock <nenolod@atheme.org>
date Fri, 07 Sep 2007 03:20:28 -0500
parents e21930ccd5a8
children 7043b5c94a94
line wrap: on
line diff
--- a/src/audacious/pluginenum.c	Fri Sep 07 02:02:53 2007 -0500
+++ b/src/audacious/pluginenum.c	Fri Sep 07 03:20:28 2007 -0500
@@ -31,8 +31,6 @@
 # define SHARED_SUFFIX G_MODULE_SUFFIX
 #endif
 
-#include "pluginenum.h"
-
 #include <glib.h>
 #include <gmodule.h>
 #include <glib/gprintf.h>
@@ -51,15 +49,19 @@
 #include "output.h"
 #include "visualization.h"
 #include "discovery.h"
+
+#include "pluginenum.h"
+
 const gchar *plugin_dir_list[] = {
     PLUGINSUBS,
     NULL
 };
 
-GHashTable *plugin_matrix = NULL;
 GList *lowlevel_list = NULL;
 extern GList *vfs_transports;
 
+mowgli_dictionary_t *plugin_dict = NULL;
+
 static gint
 inputlist_compare_func(gconstpointer a, gconstpointer b)
 {
@@ -123,45 +125,46 @@
 static gboolean
 plugin_is_duplicate(const gchar * filename)
 {
-    GList *l;
-    const gchar *basename = g_basename(filename);
-
-    /* FIXME: messy stuff */
-
-    for (l = ip_data.input_list; l; l = g_list_next(l))
-        if (!strcmp(basename, g_basename(INPUT_PLUGIN(l->data)->filename)))
-            return TRUE;
-
-    for (l = op_data.output_list; l; l = g_list_next(l))
-        if (!strcmp(basename, g_basename(OUTPUT_PLUGIN(l->data)->filename)))
-            return TRUE;
+    gchar *base_filename = g_path_get_basename(filename);
 
-    for (l = ep_data.effect_list; l; l = g_list_next(l))
-        if (!strcmp(basename, g_basename(EFFECT_PLUGIN(l->data)->filename)))
-            return TRUE;
-
-    for (l = gp_data.general_list; l; l = g_list_next(l))
-        if (!strcmp(basename, g_basename(GENERAL_PLUGIN(l->data)->filename)))
-            return TRUE;
+    if (mowgli_dictionary_retrieve(plugin_dict, base_filename) != NULL)
+    {
+        g_free(base_filename);
+        return TRUE;
+    }
 
-    for (l = vp_data.vis_list; l; l = g_list_next(l))
-        if (!strcmp(basename, g_basename(VIS_PLUGIN(l->data)->filename)))
-            return TRUE;
-
-    for (l = lowlevel_list; l; l = g_list_next(l))
-        if (!strcmp(basename, g_basename(LOWLEVEL_PLUGIN(l->data)->filename)))
-            return TRUE;
-
-    for (l = dp_data.discovery_list; l; l = g_list_next(l))
-        if (!strcmp(basename, g_basename(DISCOVERY_PLUGIN(l->data)->filename)))
-            return TRUE;
+    g_free(base_filename);
 
     return FALSE;
 }
 
+gboolean
+plugin_is_enabled(const gchar *filename)
+{
+    Plugin *plugin = mowgli_dictionary_retrieve(plugin_dict, filename);
 
-#define PLUGIN_GET_INFO(x) ((PluginGetInfoFunc)(x))()
-typedef Plugin * (*PluginGetInfoFunc) (void);
+    if (!plugin)
+        return FALSE;
+
+    return plugin->enabled;
+}
+
+void
+plugin_set_enabled(const gchar *filename, gboolean enabled)
+{
+    Plugin *plugin = mowgli_dictionary_retrieve(plugin_dict, filename);
+
+    if (!plugin)
+        return;
+
+    plugin->enabled = enabled;
+}
+
+Plugin *
+plugin_get_plugin(const gchar *filename)
+{
+    return mowgli_dictionary_retrieve(plugin_dict, filename);
+}
 
 static void
 input_plugin_init(Plugin * plugin)
@@ -180,8 +183,11 @@
 
     ip_data.input_list = g_list_append(ip_data.input_list, p);
     
-    g_hash_table_replace(plugin_matrix, g_path_get_basename(p->filename),
-                         GINT_TO_POINTER(1));
+    p->enabled = TRUE;
+
+    /* XXX: we need something better than p->filename if plugins
+       will eventually provide multiple plugins --nenolod */
+    mowgli_dictionary_add(plugin_dict, g_basename(p->filename), p);
 }
 
 static void
@@ -189,6 +195,8 @@
 {
     OutputPlugin *p = OUTPUT_PLUGIN(plugin);
     op_data.output_list = g_list_append(op_data.output_list, p);    
+
+    mowgli_dictionary_add(plugin_dict, g_basename(p->filename), p);
 }
 
 static void
@@ -196,6 +204,8 @@
 {
     EffectPlugin *p = EFFECT_PLUGIN(plugin);
     ep_data.effect_list = g_list_append(ep_data.effect_list, p);
+
+    mowgli_dictionary_add(plugin_dict, g_basename(p->filename), p);
 }
 
 static void
@@ -203,6 +213,8 @@
 {
     GeneralPlugin *p = GENERAL_PLUGIN(plugin);
     gp_data.general_list = g_list_append(gp_data.general_list, p);
+
+    mowgli_dictionary_add(plugin_dict, g_basename(p->filename), p);
 }
 
 static void
@@ -211,6 +223,8 @@
     VisPlugin *p = VIS_PLUGIN(plugin);
     p->disable_plugin = vis_disable_plugin;
     vp_data.vis_list = g_list_append(vp_data.vis_list, p);
+
+    mowgli_dictionary_add(plugin_dict, g_basename(p->filename), p);
 }
 
 static void
@@ -218,6 +232,8 @@
 {
     DiscoveryPlugin *p = DISCOVERY_PLUGIN(plugin);
     dp_data.discovery_list = g_list_append(dp_data.discovery_list, p);
+
+    mowgli_dictionary_add(plugin_dict, g_basename(p->filename), p);
 }
 
 /*******************************************************************/
@@ -246,7 +262,6 @@
     VisPlugin **vp_iter;
     DiscoveryPlugin **dp_iter;
 
-
     if (header->magic != PLUGIN_MAGIC)
         return plugin2_dispose(module, "plugin <%s> discarded, invalid module magic", filename);
 
@@ -406,8 +421,7 @@
         return;
     }
 
-    plugin_matrix = g_hash_table_new_full(g_str_hash, g_str_equal, g_free,
-                                          NULL);
+    plugin_dict = mowgli_dictionary_create(g_ascii_strcasecmp);
 
 #ifndef DISABLE_USER_PLUGIN_DIR
     scan_plugins(bmp_paths[BMP_PATH_USER_PLUGIN_DIR]);
@@ -505,9 +519,9 @@
 
     if (cfg.disabled_iplugins) {
         disabled = g_strsplit(cfg.disabled_iplugins, ":", 0);
+
         while (disabled[i]) {
-            g_hash_table_replace(plugin_matrix, disabled[i],
-                                 GINT_TO_POINTER(FALSE));
+            INPUT_PLUGIN(plugin_get_plugin(disabled))->enabled = FALSE;
             i++;
         }
 
@@ -684,5 +698,5 @@
         vfs_transports = NULL;
     }
 
-    g_hash_table_destroy( plugin_matrix );
+    mowgli_dictionary_destroy(plugin_dict, NULL, NULL);
 }