glib r6399 - in trunk/gio: . fam inotify



Author: alexl
Date: Mon Jan 28 19:43:10 2008
New Revision: 6399
URL: http://svn.gnome.org/viewvc/glib?rev=6399&view=rev

Log:
2008-01-28  Alexander Larsson  <alexl redhat com>

        * giomodule.[ch]:
        * gio.symbols:
	Add registration hooks for extension points.
	Register the gio extension points.
	
        * fam/gfamdirectorymonitor.c:
        * fam/gfamfilemonitor.c:
        * glocaldirectorymonitor.[ch]:
        * glocalfilemonitor.[ch]:
        * gnativevolumemonitor.h:
        * gunionvolumemonitor.c:
        * gunixvolumemonitor.c:
        * gvfs.[ch]:
        * gvolumemonitor.h:
        * inotify/ginotifydirectorymonitor.c:
        * inotify/ginotifyfilemonitor.c:
	Use the extension points registration instead
	of g_type_children().



Modified:
   trunk/gio/ChangeLog
   trunk/gio/fam/gfamdirectorymonitor.c
   trunk/gio/fam/gfamfilemonitor.c
   trunk/gio/gio.symbols
   trunk/gio/giomodule.c
   trunk/gio/giomodule.h
   trunk/gio/glocaldirectorymonitor.c
   trunk/gio/glocaldirectorymonitor.h
   trunk/gio/glocalfilemonitor.c
   trunk/gio/glocalfilemonitor.h
   trunk/gio/gnativevolumemonitor.h
   trunk/gio/gunionvolumemonitor.c
   trunk/gio/gunixvolumemonitor.c
   trunk/gio/gvfs.c
   trunk/gio/gvfs.h
   trunk/gio/gvolumemonitor.h
   trunk/gio/inotify/ginotifydirectorymonitor.c
   trunk/gio/inotify/ginotifyfilemonitor.c

Modified: trunk/gio/fam/gfamdirectorymonitor.c
==============================================================================
--- trunk/gio/fam/gfamdirectorymonitor.c	(original)
+++ trunk/gio/fam/gfamdirectorymonitor.c	Mon Jan 28 19:43:10 2008
@@ -112,7 +112,6 @@
   gobject_class->constructor = g_fam_directory_monitor_constructor;
   file_monitor_class->cancel = g_fam_directory_monitor_cancel;
 
-  local_directory_monitor_class->prio = 10;
   local_directory_monitor_class->mount_notify = FALSE;
   local_directory_monitor_class->is_supported = g_fam_directory_monitor_is_supported;
 }
@@ -146,5 +145,9 @@
 g_fam_directory_monitor_register (GIOModule *module)
 {
   g_fam_directory_monitor_register_type (G_TYPE_MODULE (module));
+  g_io_extension_point_implement (G_LOCAL_DIRECTORY_MONITOR_EXTENSION_POINT_NAME,
+				  G_TYPE_FAM_DIRECTORY_MONITOR,
+				  "fam",
+				  10);
 }
 

Modified: trunk/gio/fam/gfamfilemonitor.c
==============================================================================
--- trunk/gio/fam/gfamfilemonitor.c	(original)
+++ trunk/gio/fam/gfamfilemonitor.c	Mon Jan 28 19:43:10 2008
@@ -112,7 +112,6 @@
   gobject_class->constructor = g_fam_file_monitor_constructor;
   file_monitor_class->cancel = g_fam_file_monitor_cancel;
 
-  local_file_monitor_class->prio = 10;
   local_file_monitor_class->is_supported = g_fam_file_monitor_is_supported;
 }
 
@@ -144,5 +143,9 @@
 g_fam_file_monitor_register (GIOModule *module)
 {
   g_fam_file_monitor_register_type (G_TYPE_MODULE (module));
+  g_io_extension_point_implement (G_LOCAL_FILE_MONITOR_EXTENSION_POINT_NAME,
+				  G_TYPE_FAM_FILE_MONITOR,
+				  "fam",
+				  10);
 }
 

Modified: trunk/gio/gio.symbols
==============================================================================
--- trunk/gio/gio.symbols	(original)
+++ trunk/gio/gio.symbols	Mon Jan 28 19:43:10 2008
@@ -486,6 +486,17 @@
 g_io_module_get_type  G_GNUC_CONST
 g_io_module_new 
 g_io_modules_load_all_in_directory
+g_io_extension_point_register
+g_io_extension_point_lookup
+g_io_extension_point_set_required_type
+g_io_extension_point_get_required_type
+g_io_extension_point_get_extensions
+g_io_extension_point_get_extension_by_name
+g_io_extension_point_implement
+g_io_extension_get_type
+g_io_extension_get_name
+g_io_extension_get_priority
+g_io_extension_ref_class
 #endif
 #endif
 

Modified: trunk/gio/giomodule.c
==============================================================================
--- trunk/gio/giomodule.c	(original)
+++ trunk/gio/giomodule.c	Mon Jan 28 19:43:10 2008
@@ -22,6 +22,8 @@
 
 #include <config.h>
 
+#include <string.h>
+
 #include "giomodule.h"
 #include "giomodule-priv.h"
 #include "glocalfilemonitor.h"
@@ -247,20 +249,30 @@
 {
   GList *modules, *l;
   static gboolean loaded_dirs = FALSE;
-  int i;
-  GType *types;
-  guint n_types;
-  GQuark private_q, name_q;
+  GIOExtensionPoint *ep;
 
   G_LOCK (loaded_dirs);
 
   if (!loaded_dirs)
     {
       loaded_dirs = TRUE;
-      modules = g_io_modules_load_all_in_directory (GIO_MODULE_DIR);
 
-      private_q = g_quark_from_static_string ("gio-prio");
-      name_q = g_quark_from_static_string ("gio-name");
+      ep = g_io_extension_point_register (G_LOCAL_DIRECTORY_MONITOR_EXTENSION_POINT_NAME);
+      g_io_extension_point_set_required_type (ep, G_TYPE_LOCAL_DIRECTORY_MONITOR);
+      
+      ep = g_io_extension_point_register (G_LOCAL_FILE_MONITOR_EXTENSION_POINT_NAME);
+      g_io_extension_point_set_required_type (ep, G_TYPE_LOCAL_FILE_MONITOR);
+
+      ep = g_io_extension_point_register (G_VOLUME_MONITOR_EXTENSION_POINT_NAME);
+      g_io_extension_point_set_required_type (ep, G_TYPE_VOLUME_MONITOR);
+      
+      ep = g_io_extension_point_register (G_NATIVE_VOLUME_MONITOR_EXTENSION_POINT_NAME);
+      g_io_extension_point_set_required_type (ep, G_TYPE_NATIVE_VOLUME_MONITOR);
+      
+      ep = g_io_extension_point_register (G_VFS_EXTENSION_POINT_NAME);
+      g_io_extension_point_set_required_type (ep, G_TYPE_VFS);
+      
+      modules = g_io_modules_load_all_in_directory (GIO_MODULE_DIR);
 
       /* Initialize types from built-in "modules" */
 #if defined(HAVE_SYS_INOTIFY_H) || defined(HAVE_LINUX_INOTIFY_H)
@@ -271,49 +283,7 @@
       _g_unix_volume_monitor_get_type ();
 #endif
       _g_local_vfs_get_type ();
-
-      /* Copy over all prios to static gtype data so
-       * we can avoid loading the module again
-       */
-
-      types = g_type_children (G_TYPE_LOCAL_FILE_MONITOR, &n_types);
-      for (i = 0; i < n_types; i++)
-	{
-	  GLocalFileMonitorClass *klass = g_type_class_ref (types[i]);
-	  g_type_set_qdata (types[i], private_q, GINT_TO_POINTER (klass->prio));
-	  g_type_class_unref (klass);
-	}
-      g_free (types);
-
-      types = g_type_children (G_TYPE_LOCAL_DIRECTORY_MONITOR, &n_types);
-      for (i = 0; i < n_types; i++)
-	{
-	  GLocalDirectoryMonitorClass *klass = g_type_class_ref (types[i]);
-	  g_type_set_qdata (types[i], private_q, GINT_TO_POINTER (klass->prio));
-	  g_type_class_unref (klass);
-	}
-      g_free (types);
-
-      types = g_type_children (G_TYPE_NATIVE_VOLUME_MONITOR, &n_types);
-      for (i = 0; i < n_types; i++)
-	{
-	  GNativeVolumeMonitorClass *klass = g_type_class_ref (types[i]);
-	  g_type_set_qdata (types[i], private_q, GINT_TO_POINTER (klass->priority));
-	  g_type_set_qdata (types[i], name_q, g_strdup (klass->name));
-	  g_type_class_unref (klass);
-	}
-      g_free (types);
-      
-      types = g_type_children (G_TYPE_VFS, &n_types);
-      for (i = 0; i < n_types; i++)
-	{
-	  GVfsClass *klass = g_type_class_ref (types[i]);
-	  g_type_set_qdata (types[i], private_q, GINT_TO_POINTER (klass->priority));
-	  g_type_set_qdata (types[i], name_q, g_strdup (klass->name));
-	  g_type_class_unref (klass);
-	}
-      g_free (types);
-      
+    
       for (l = modules; l != NULL; l = l->next)
 	g_type_module_unuse (G_TYPE_MODULE (l->data));
       
@@ -323,5 +293,193 @@
   G_UNLOCK (loaded_dirs);
 }
 
+struct _GIOExtension {
+  char *name;
+  GType type;
+  gint priority;
+};
+
+struct _GIOExtensionPoint {
+  GType required_type;
+  char *name;
+  GList *extensions;
+};
+
+static GHashTable *extension_points = NULL;
+G_LOCK_DEFINE_STATIC(extension_points);
+
+
+static void
+g_io_extension_point_free (GIOExtensionPoint *ep)
+{
+  g_free (ep->name);
+  g_free (ep);
+}
+
+GIOExtensionPoint *
+g_io_extension_point_register (const char *name)
+{
+  GIOExtensionPoint *ep;
+  
+  G_LOCK (extension_points);
+  if (extension_points == NULL)
+    extension_points = g_hash_table_new_full (g_str_hash,
+					      g_str_equal,
+					      NULL,
+					      (GDestroyNotify)g_io_extension_point_free);
+
+  if (g_hash_table_lookup (extension_points, name) != NULL)
+    {
+      g_warning ("Extension point %s registered multiple times", name);
+      G_UNLOCK (extension_points);
+      return NULL;
+    }
+
+  ep = g_new0 (GIOExtensionPoint, 1);
+  ep->name = g_strdup (name);
+  
+  g_hash_table_insert (extension_points, ep->name, ep);
+  
+  G_UNLOCK (extension_points);
+
+  return ep;
+}
+
+GIOExtensionPoint *
+g_io_extension_point_lookup (const char *name)
+{
+  GIOExtensionPoint *ep;
+
+  G_LOCK (extension_points);
+  ep = NULL;
+  if (extension_points != NULL)
+    ep = g_hash_table_lookup (extension_points, name);
+  
+  G_UNLOCK (extension_points);
+
+  return ep;
+  
+}
+
+void
+g_io_extension_point_set_required_type (GIOExtensionPoint *extension_point,
+					GType              type)
+{
+  extension_point->required_type = type;
+}
+
+GType
+g_io_extension_point_get_required_type (GIOExtensionPoint *extension_point)
+{
+  return extension_point->required_type;
+}
+
+GList *
+g_io_extension_point_get_extensions (GIOExtensionPoint *extension_point)
+{
+  return extension_point->extensions;
+}
+
+GIOExtension *
+g_io_extension_point_get_extension_by_name (GIOExtensionPoint *extension_point,
+					    const char        *name)
+{
+  GList *l;
+
+  for (l = extension_point->extensions; l != NULL; l = l->next)
+    {
+      GIOExtension *e = l->data;
+
+      if (e->name != NULL &&
+	  strcmp (e->name, name) == 0)
+	return e;
+    }
+  
+  return NULL;
+}
+
+static gint
+extension_prio_compare (gconstpointer  a,
+			gconstpointer  b)
+{
+  const GIOExtension *extension_a = a, *extension_b = b;
+
+  return extension_b->priority - extension_a->priority;
+}
+
+GIOExtension *
+g_io_extension_point_implement (const char *extension_point_name,
+				GType type,
+				const char *extension_name,
+				gint priority)
+{
+  GIOExtensionPoint *extension_point;
+  GIOExtension *extension;
+  GList *l;
+
+  g_return_val_if_fail (extension_point_name != NULL, NULL);
+
+  extension_point = g_io_extension_point_lookup (extension_point_name);
+  if (extension_point == NULL)
+    {
+      g_warning ("Tried to implement non-registered extension point %s", extension_point_name);
+      return NULL;
+    }
+  
+  if (extension_point->required_type != 0 &&
+      !g_type_is_a (type, extension_point->required_type))
+    {
+      g_warning ("Tried to register an extension of the type %s to extension point %s. "
+		 "Expected type is %s.",
+		 g_type_name (type),
+		 extension_point_name, 
+		 g_type_name (extension_point->required_type));
+      return NULL;
+    }      
+
+  /* Its safe to register the same type multiple times */
+  for (l = extension_point->extensions; l != NULL; l = l->next)
+    {
+      extension = l->data;
+      if (extension->type == type)
+	return extension;
+    }
+  
+  extension = g_slice_new0 (GIOExtension);
+  extension->type = type;
+  extension->name = g_strdup (extension_name);
+  extension->priority = priority;
+  
+  extension_point->extensions = g_list_insert_sorted (extension_point->extensions,
+						      extension, extension_prio_compare);
+  
+  return extension;
+}
+
+GTypeClass *
+g_io_extension_ref_class (GIOExtension *extension)
+{
+  return g_type_class_ref (extension->type);
+}
+
+
+GType
+g_io_extension_get_type (GIOExtension *extension)
+{
+  return extension->type;
+}
+
+const char *
+g_io_extension_get_name (GIOExtension *extension)
+{
+  return extension->name;
+}
+
+gint
+g_io_extension_get_priority (GIOExtension *extension)
+{
+  return extension->priority;
+}
+
 #define __G_IO_MODULE_C__
 #include "gioaliasdef.c"

Modified: trunk/gio/giomodule.h
==============================================================================
--- trunk/gio/giomodule.h	(original)
+++ trunk/gio/giomodule.h	Mon Jan 28 19:43:10 2008
@@ -47,10 +47,31 @@
 typedef struct _GIOModule GIOModule;
 typedef struct _GIOModuleClass GIOModuleClass;
 
+typedef struct _GIOExtensionPoint GIOExtensionPoint;
+typedef struct _GIOExtension GIOExtension;
+
 GType      g_io_module_get_type (void) G_GNUC_CONST;
 GIOModule *g_io_module_new      (const gchar *filename);
 
-GList *    g_io_modules_load_all_in_directory (const char *dirname);
+GList *g_io_modules_load_all_in_directory            (const char *dirname);
+
+GIOExtensionPoint *g_io_extension_point_register              (const char        *extension_point);
+GIOExtensionPoint *g_io_extension_point_lookup                (const char        *extension_point);
+void               g_io_extension_point_set_required_type     (GIOExtensionPoint *extension_point,
+							       GType              type);
+GType              g_io_extension_point_get_required_type     (GIOExtensionPoint *extension_point);
+GList             *g_io_extension_point_get_extensions        (GIOExtensionPoint *extension_point);
+GIOExtension *     g_io_extension_point_get_extension_by_name (GIOExtensionPoint *extension_point,
+							       const char        *name);
+GIOExtension *     g_io_extension_point_implement             (const char        *extension_point_name,
+							       GType              type,
+							       const char        *extension_name,
+							       gint               priority);
+
+GType                   g_io_extension_get_type     (GIOExtension *extension);
+const char *            g_io_extension_get_name     (GIOExtension *extension);
+gint                    g_io_extension_get_priority (GIOExtension *extension);
+GTypeClass*             g_io_extension_ref_class    (GIOExtension *extension);
 
 /* API for the modules to implement */
 /**

Modified: trunk/gio/glocaldirectorymonitor.c
==============================================================================
--- trunk/gio/glocaldirectorymonitor.c	(original)
+++ trunk/gio/glocaldirectorymonitor.c	Mon Jan 28 19:43:10 2008
@@ -202,52 +202,27 @@
     }
 }
 
-static gint
-_compare_monitor_type_by_prio (gconstpointer _a,
-			       gconstpointer _b,
-			       gpointer      user_data)
-{
-  const GType *a = _a, *b = _b;
-  int prio_a, prio_b;
-  gint ret;
-  GQuark private_q;
-
-  private_q = g_quark_from_static_string ("gio-prio");
-
-  prio_a = GPOINTER_TO_INT (g_type_get_qdata (*a, private_q));
-  prio_b = GPOINTER_TO_INT (g_type_get_qdata (*b, private_q));
-
-  ret = prio_b - prio_a;
-
-  return ret;
-}
-
 static gpointer
 get_default_local_directory_monitor (gpointer data)
 {
-  GType *monitor_impls;
-  guint n_monitor_impls;
-  gint i;
   GLocalDirectoryMonitorClass *chosen_class;
   GLocalDirectoryMonitorClass **ret = data;
+  GIOExtensionPoint *ep;
+  GList *extensions, *l;
 
   _g_io_modules_ensure_loaded ();
-  
-  monitor_impls = g_type_children (G_TYPE_LOCAL_DIRECTORY_MONITOR,
-                                   &n_monitor_impls);
 
-  g_qsort_with_data (monitor_impls,
-                     n_monitor_impls,
-                     sizeof (GType),
-                     _compare_monitor_type_by_prio,
-                     NULL);
+  ep = g_io_extension_point_lookup (G_LOCAL_DIRECTORY_MONITOR_EXTENSION_POINT_NAME);
 
+  extensions = g_io_extension_point_get_extensions (ep);
+  
   chosen_class = NULL;
-  for (i = 0; i < n_monitor_impls; i++)
-    {    
+  for (l = extensions; l != NULL; l = l->next)
+    {
+      GIOExtension *extension = l->data;
       GLocalDirectoryMonitorClass *klass;
       
-      klass = G_LOCAL_DIRECTORY_MONITOR_CLASS (g_type_class_ref (monitor_impls[i]));
+      klass = G_LOCAL_DIRECTORY_MONITOR_CLASS (g_io_extension_ref_class (extension));
       
       if (klass->is_supported ())
 	{
@@ -257,8 +232,6 @@
       else
 	g_type_class_unref (klass);
     }
-
-  g_free (monitor_impls);
   
   if (chosen_class)
     {

Modified: trunk/gio/glocaldirectorymonitor.h
==============================================================================
--- trunk/gio/glocaldirectorymonitor.h	(original)
+++ trunk/gio/glocaldirectorymonitor.h	Mon Jan 28 19:43:10 2008
@@ -36,6 +36,8 @@
 #define G_IS_LOCAL_DIRECTORY_MONITOR(o)		(G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_LOCAL_DIRECTORY_MONITOR))
 #define G_IS_LOCAL_DIRECTORY_MONITOR_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_LOCAL_DIRECTORY_MONITOR))
 
+#define G_LOCAL_DIRECTORY_MONITOR_EXTENSION_POINT_NAME "gio-local-directory-monitor"
+
 typedef struct _GLocalDirectoryMonitor      GLocalDirectoryMonitor;
 typedef struct _GLocalDirectoryMonitorClass GLocalDirectoryMonitorClass;
 
@@ -50,8 +52,6 @@
 
 struct _GLocalDirectoryMonitorClass {
   GFileMonitorClass parent_class;
-  gint prio;
-  char *name; /* Not used atm */
   gboolean mount_notify;
   gboolean (*is_supported) (void);
 };

Modified: trunk/gio/glocalfilemonitor.c
==============================================================================
--- trunk/gio/glocalfilemonitor.c	(original)
+++ trunk/gio/glocalfilemonitor.c	Mon Jan 28 19:43:10 2008
@@ -129,52 +129,27 @@
                                                         G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB));
 }
 
-static gint
-_compare_monitor_type_by_prio (gconstpointer _a,
-			       gconstpointer _b,
-			       gpointer      user_data)
-{
-  const GType *a = _a, *b = _b;
-  int prio_a, prio_b;
-  gint ret;
-  GQuark private_q;
-
-  private_q = g_quark_from_static_string ("gio-prio");
-
-  prio_a = GPOINTER_TO_INT (g_type_get_qdata (*a, private_q));
-  prio_b = GPOINTER_TO_INT (g_type_get_qdata (*b, private_q));
-
-  ret = prio_b - prio_a;
-
-  return ret;
-}
-
 static gpointer
 get_default_local_file_monitor (gpointer data)
 {
-  GType *monitor_impls;
-  guint n_monitor_impls;
-  gint i;
   GLocalFileMonitorClass *chosen_class;
   GLocalFileMonitorClass **ret = data;
+  GIOExtensionPoint *ep;
+  GList *extensions, *l;
 
   _g_io_modules_ensure_loaded ();
-  
-  monitor_impls = g_type_children (G_TYPE_LOCAL_FILE_MONITOR,
-                                   &n_monitor_impls);
 
-  g_qsort_with_data (monitor_impls,
-                     n_monitor_impls,
-                     sizeof (GType),
-                     _compare_monitor_type_by_prio,
-                     NULL);
+  ep = g_io_extension_point_lookup (G_LOCAL_FILE_MONITOR_EXTENSION_POINT_NAME);
 
+  extensions = g_io_extension_point_get_extensions (ep);
+  
   chosen_class = NULL;
-  for (i = 0; i < n_monitor_impls; i++)
-    {    
+  for (l = extensions; l != NULL; l = l->next)
+    {
+      GIOExtension *extension = l->data;
       GLocalFileMonitorClass *klass;
       
-      klass = G_LOCAL_FILE_MONITOR_CLASS (g_type_class_ref (monitor_impls[i]));
+      klass = G_LOCAL_FILE_MONITOR_CLASS (g_io_extension_ref_class (extension));
       
       if (klass->is_supported ())
 	{
@@ -184,8 +159,6 @@
       else
 	g_type_class_unref (klass);
     }
-
-  g_free (monitor_impls);
   
   if (chosen_class)
     {

Modified: trunk/gio/glocalfilemonitor.h
==============================================================================
--- trunk/gio/glocalfilemonitor.h	(original)
+++ trunk/gio/glocalfilemonitor.h	Mon Jan 28 19:43:10 2008
@@ -34,6 +34,8 @@
 #define G_IS_LOCAL_FILE_MONITOR(o)		(G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_LOCAL_FILE_MONITOR))
 #define G_IS_LOCAL_FILE_MONITOR_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_LOCAL_FILE_MONITOR))
 
+#define G_LOCAL_FILE_MONITOR_EXTENSION_POINT_NAME "gio-local-file-monitor"
+
 typedef struct _GLocalFileMonitor      GLocalFileMonitor;
 typedef struct _GLocalFileMonitorClass GLocalFileMonitorClass;
 
@@ -45,8 +47,6 @@
 
 struct _GLocalFileMonitorClass {
   GFileMonitorClass parent_class;
-  gint prio;
-  char *name; /* Not used atm */
   gboolean (*is_supported) (void);
 };
 

Modified: trunk/gio/gnativevolumemonitor.h
==============================================================================
--- trunk/gio/gnativevolumemonitor.h	(original)
+++ trunk/gio/gnativevolumemonitor.h	Mon Jan 28 19:43:10 2008
@@ -12,6 +12,8 @@
 #define G_IS_NATIVE_VOLUME_MONITOR(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_NATIVE_VOLUME_MONITOR))
 #define G_IS_NATIVE_VOLUME_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_NATIVE_VOLUME_MONITOR))
 
+#define G_NATIVE_VOLUME_MONITOR_EXTENSION_POINT_NAME "gio-native-volume-monitor"
+
 typedef struct _GNativeVolumeMonitor GNativeVolumeMonitor;
 typedef struct _GNativeVolumeMonitorClass GNativeVolumeMonitorClass;
 

Modified: trunk/gio/gunionvolumemonitor.c
==============================================================================
--- trunk/gio/gunionvolumemonitor.c	(original)
+++ trunk/gio/gunionvolumemonitor.c	Mon Jan 28 19:43:10 2008
@@ -390,54 +390,14 @@
   g_signal_handlers_disconnect_by_func (child_monitor, child_drive_changed, union_monitor);
 }
 
-/* Note: This compares in reverse order.
-   Higher prio -> sort first
- */
-static gint
-compare_monitor_type (gconstpointer  a,
-		      gconstpointer  b,
-		      gpointer       user_data)
-{
-  GType a_type, b_type;
-  char *a_name, *b_name;
-  int a_prio, b_prio;
-  gint res;
-  const char *use_this_monitor;
-  GQuark private_q, name_q;
-
-  private_q = g_quark_from_static_string ("gio-prio");
-  name_q = g_quark_from_static_string ("gio-name");
-  
-  use_this_monitor = user_data;
-  a_type = *(GType *)a;
-  b_type = *(GType *)b;
-  a_prio = GPOINTER_TO_INT (g_type_get_qdata (a_type, private_q));
-  a_name = g_type_get_qdata (a_type, name_q);
-  b_prio = GPOINTER_TO_INT (g_type_get_qdata (b_type, private_q));
-  b_name = g_type_get_qdata (b_type, name_q);
-
-  if (a_type == b_type)
-    res = 0;
-  else if (use_this_monitor != NULL &&
-	   strcmp (a_name, use_this_monitor) == 0)
-    res = -1;
-  else if (use_this_monitor != NULL &&
-	   strcmp (b_name, use_this_monitor) == 0)
-    res = 1;
-  else 
-    res = b_prio - a_prio;
-  
-  return res;
-}
-
 static GType
 get_default_native_class (gpointer data)
 {
   GNativeVolumeMonitorClass *klass, *native_class, **native_class_out;
-  GType *monitors;
-  guint n_monitors;
   const char *use_this;
-  int i;
+  GIOExtensionPoint *ep;
+  GIOExtension *extension;
+  GList *l;
 
   native_class_out = data;
   
@@ -446,28 +406,37 @@
   /* Ensure vfs in modules loaded */
   _g_io_modules_ensure_loaded ();
 
-  monitors = g_type_children (G_TYPE_NATIVE_VOLUME_MONITOR, &n_monitors);
-
-  g_qsort_with_data (monitors,
-                     n_monitors,
-                     sizeof (GType),
-                     compare_monitor_type,
-                     (gpointer)use_this);
+  ep = g_io_extension_point_lookup (G_NATIVE_VOLUME_MONITOR_EXTENSION_POINT_NAME);
 
   native_class = NULL;
-  for (i = 0; i < n_monitors; i++)
-    {    
-      klass = g_type_class_ref (monitors[i]);
-      if (G_VOLUME_MONITOR_CLASS (klass)->is_supported())
+  if (use_this)
+    {
+      extension = g_io_extension_point_get_extension_by_name (ep, use_this);
+      if (extension)
 	{
-	  native_class = klass;
-	  break;
+	  klass = G_NATIVE_VOLUME_MONITOR_CLASS (g_io_extension_ref_class (extension));
+	  if (G_VOLUME_MONITOR_CLASS (klass)->is_supported())
+	    native_class = klass;
+	  else
+	    g_type_class_unref (klass);
 	}
-      else
-	g_type_class_unref (klass);
     }
 
-  g_free (monitors);
+  if (native_class == NULL)
+    {
+      for (l = g_io_extension_point_get_extensions (ep); l != NULL; l = l->next)
+	{
+	  extension = l->data;
+	  klass = G_NATIVE_VOLUME_MONITOR_CLASS (g_io_extension_ref_class (extension));
+	  if (G_VOLUME_MONITOR_CLASS (klass)->is_supported())
+	    {
+	      native_class = klass;
+	      break;
+	    }
+	  else
+	    g_type_class_unref (klass);
+	}
+    }
  
   if (native_class)
     {
@@ -502,11 +471,11 @@
 g_union_volume_monitor_init (GUnionVolumeMonitor *union_monitor)
 {
   GVolumeMonitor *monitor;
-  GType *monitors;
-  guint n_monitors;
   GNativeVolumeMonitorClass *native_class;
   GVolumeMonitorClass *klass;
-  int i;
+  GIOExtensionPoint *ep;
+  GIOExtension *extension;
+  GList *l;
 
   native_class = get_native_class ();
 
@@ -517,26 +486,21 @@
       g_object_unref (monitor);
       g_type_class_unref (native_class);
     }
-  
-  monitors = g_type_children (G_TYPE_VOLUME_MONITOR, &n_monitors);
-  
-  for (i = 0; i < n_monitors; i++)
-    {
-      if (monitors[i] == G_TYPE_UNION_VOLUME_MONITOR ||
-	  g_type_is_a (monitors[i], G_TYPE_NATIVE_VOLUME_MONITOR))
-	continue;
 
-      klass = g_type_class_ref (monitors[i]);
+  ep = g_io_extension_point_lookup (G_VOLUME_MONITOR_EXTENSION_POINT_NAME);
+  for (l = g_io_extension_point_get_extensions (ep); l != NULL; l = l->next)
+    {
+      extension = l->data;
+      
+      klass = G_VOLUME_MONITOR_CLASS (g_io_extension_ref_class (extension));
       if (klass->is_supported == NULL || klass->is_supported())
 	{
-	  monitor = g_object_new (monitors[i], NULL);
+	  monitor = g_object_new (g_io_extension_get_type (extension), NULL);
 	  g_union_volume_monitor_add_monitor (union_monitor, monitor);
 	  g_object_unref (monitor);
 	}
       g_type_class_unref (klass);
     }
-      
-  g_free (monitors);
 }
 
 static GUnionVolumeMonitor *

Modified: trunk/gio/gunixvolumemonitor.c
==============================================================================
--- trunk/gio/gunixvolumemonitor.c	(original)
+++ trunk/gio/gunixvolumemonitor.c	Mon Jan 28 19:43:10 2008
@@ -57,7 +57,11 @@
 static void update_mounts            (GUnixVolumeMonitor *monitor);
 
 #define g_unix_volume_monitor_get_type _g_unix_volume_monitor_get_type
-G_DEFINE_TYPE (GUnixVolumeMonitor, g_unix_volume_monitor, G_TYPE_NATIVE_VOLUME_MONITOR);
+G_DEFINE_TYPE_WITH_CODE (GUnixVolumeMonitor, g_unix_volume_monitor, G_TYPE_NATIVE_VOLUME_MONITOR,
+                         g_io_extension_point_implement (G_NATIVE_VOLUME_MONITOR_EXTENSION_POINT_NAME,
+							 g_define_type_id,
+							 "unix",
+							 0));
 
 static void
 g_unix_volume_monitor_finalize (GObject *object)
@@ -168,8 +172,6 @@
   monitor_class->get_mount_for_uuid = get_mount_for_uuid;
   monitor_class->is_supported = is_supported;
 
-  native_class->priority = 0;
-  native_class->name = "unix";
   native_class->get_mount_for_mount_path = get_mount_for_mount_path;
 }
 

Modified: trunk/gio/gvfs.c
==============================================================================
--- trunk/gio/gvfs.c	(original)
+++ trunk/gio/gvfs.c	Mon Jan 28 19:43:10 2008
@@ -210,36 +210,48 @@
 static gpointer
 get_default_vfs (gpointer arg)
 {
-  GType *vfs_impls;
-  int i;
-  guint n_vfs_impls;
   const char *use_this;
   GVfs *vfs;
+  GList *l;
+  GIOExtensionPoint *ep;
+  GIOExtension *extension;
+  
 
   use_this = g_getenv ("GIO_USE_VFS");
   
   /* Ensure vfs in modules loaded */
   _g_io_modules_ensure_loaded ();
 
-  vfs_impls = g_type_children (G_TYPE_VFS, &n_vfs_impls);
+  ep = g_io_extension_point_lookup (G_VFS_EXTENSION_POINT_NAME);
 
-  g_qsort_with_data (vfs_impls, n_vfs_impls, sizeof (GType),
-		     compare_vfs_type, (gpointer)use_this);
-  
-  for (i = 0; i < n_vfs_impls; i++)
+  if (use_this)
+    {
+      extension = g_io_extension_point_get_extension_by_name (ep, use_this);
+      if (extension)
+	{
+	  vfs = g_object_new (g_io_extension_get_type (extension), NULL);
+	  
+	  if (g_vfs_is_active (vfs))
+	    return vfs;
+	  
+	  g_object_unref (vfs);
+	}
+    }
+
+  for (l = g_io_extension_point_get_extensions (ep); l != NULL; l = l->next)
     {
-      vfs = g_object_new (vfs_impls[i], NULL);
+      extension = l->data;
+
+      vfs = g_object_new (g_io_extension_get_type (extension), NULL);
 
       if (g_vfs_is_active (vfs))
-	break;
+	return vfs;
 
       g_object_unref (vfs);
-      vfs = NULL;
     }
   
-  g_free (vfs_impls);
 
-  return vfs;
+  return NULL;
 }
 
 /**

Modified: trunk/gio/gvfs.h
==============================================================================
--- trunk/gio/gvfs.h	(original)
+++ trunk/gio/gvfs.h	Mon Jan 28 19:43:10 2008
@@ -39,6 +39,8 @@
 #define G_IS_VFS(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_VFS))
 #define G_IS_VFS_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_VFS))
 
+#define G_VFS_EXTENSION_POINT_NAME "gio-vfs"
+
 /**
  * GVfs:
  * 

Modified: trunk/gio/gvolumemonitor.h
==============================================================================
--- trunk/gio/gvolumemonitor.h	(original)
+++ trunk/gio/gvolumemonitor.h	Mon Jan 28 19:43:10 2008
@@ -42,6 +42,8 @@
 #define G_IS_VOLUME_MONITOR(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_VOLUME_MONITOR))
 #define G_IS_VOLUME_MONITOR_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_VOLUME_MONITOR))
 
+#define G_VOLUME_MONITOR_EXTENSION_POINT_NAME "gio-volume-monitor"
+
 /**
  * GVolumeMonitor:
  * @parent_instance: The parent instance.

Modified: trunk/gio/inotify/ginotifydirectorymonitor.c
==============================================================================
--- trunk/gio/inotify/ginotifydirectorymonitor.c	(original)
+++ trunk/gio/inotify/ginotifydirectorymonitor.c	Mon Jan 28 19:43:10 2008
@@ -42,7 +42,11 @@
 static gboolean g_inotify_directory_monitor_cancel (GFileMonitor* monitor);
 
 #define g_inotify_directory_monitor_get_type _g_inotify_directory_monitor_get_type
-G_DEFINE_TYPE (GInotifyDirectoryMonitor, g_inotify_directory_monitor, G_TYPE_LOCAL_DIRECTORY_MONITOR)
+G_DEFINE_TYPE_WITH_CODE (GInotifyDirectoryMonitor, g_inotify_directory_monitor, G_TYPE_LOCAL_DIRECTORY_MONITOR,
+			 g_io_extension_point_implement (G_LOCAL_DIRECTORY_MONITOR_EXTENSION_POINT_NAME,
+							 g_define_type_id,
+							 "inotify",
+							 20))
 
 static void
 g_inotify_directory_monitor_finalize (GObject *object)
@@ -63,8 +67,8 @@
 
 static GObject *
 g_inotify_directory_monitor_constructor (GType type,
-                                    guint n_construct_properties,
-                                    GObjectConstructParam *construct_properties)
+					 guint n_construct_properties,
+					 GObjectConstructParam *construct_properties)
 {
   GObject *obj;
   GInotifyDirectoryMonitorClass *klass;
@@ -116,7 +120,6 @@
   gobject_class->constructor = g_inotify_directory_monitor_constructor;
   directory_monitor_class->cancel = g_inotify_directory_monitor_cancel;
 
-  local_directory_monitor_class->prio = 20;
   local_directory_monitor_class->mount_notify = TRUE;
   local_directory_monitor_class->is_supported = g_inotify_directory_monitor_is_supported;
 }

Modified: trunk/gio/inotify/ginotifyfilemonitor.c
==============================================================================
--- trunk/gio/inotify/ginotifyfilemonitor.c	(original)
+++ trunk/gio/inotify/ginotifyfilemonitor.c	Mon Jan 28 19:43:10 2008
@@ -44,7 +44,11 @@
 static gboolean g_inotify_file_monitor_cancel (GFileMonitor* monitor);
 
 #define g_inotify_file_monitor_get_type _g_inotify_file_monitor_get_type
-G_DEFINE_TYPE (GInotifyFileMonitor, g_inotify_file_monitor, G_TYPE_LOCAL_FILE_MONITOR)
+G_DEFINE_TYPE_WITH_CODE (GInotifyFileMonitor, g_inotify_file_monitor, G_TYPE_LOCAL_FILE_MONITOR,
+			 g_io_extension_point_implement (G_LOCAL_FILE_MONITOR_EXTENSION_POINT_NAME,
+							 g_define_type_id,
+							 "inotify",
+							 20))
 
 static void
 g_inotify_file_monitor_finalize (GObject *object)
@@ -135,7 +139,6 @@
   gobject_class->constructor = g_inotify_file_monitor_constructor;
   file_monitor_class->cancel = g_inotify_file_monitor_cancel;
 
-  local_file_monitor_class->prio = 20;
   local_file_monitor_class->is_supported = g_inotify_file_monitor_is_supported;
 }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]