glib r6409 - trunk/gio



Author: alexl
Date: Tue Jan 29 12:18:48 2008
New Revision: 6409
URL: http://svn.gnome.org/viewvc/glib?rev=6409&view=rev

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

        * gfile.[ch]:
        Add g_file_query_default_handler utility to easily look up
	the GAppInfo that handles a file.
	
        * gdesktopappinfo.[ch]:
        * giomodule.c:
	Set up an extension point for g_app_info_get_default_for_uri_scheme()
	
        * gvfs.c:
	Remove unused function




Modified:
   trunk/gio/ChangeLog
   trunk/gio/gdesktopappinfo.c
   trunk/gio/gdesktopappinfo.h
   trunk/gio/gfile.c
   trunk/gio/gfile.h
   trunk/gio/giomodule.c
   trunk/gio/gvfs.c

Modified: trunk/gio/gdesktopappinfo.c
==============================================================================
--- trunk/gio/gdesktopappinfo.c	(original)
+++ trunk/gio/gdesktopappinfo.c	Tue Jan 29 12:18:48 2008
@@ -1607,7 +1607,6 @@
   return info;
 }
 
-
 /**
  * g_app_info_get_default_for_uri_scheme:
  * @uri_scheme: a string containing a URI scheme.
@@ -1622,10 +1621,54 @@
 GAppInfo *
 g_app_info_get_default_for_uri_scheme (const char *uri_scheme)
 {
-  /* TODO: Implement this using giomodules, reading the gconf settings
-   * in /desktop/gnome/url-handlers
-   */
-  return NULL;
+  static gsize lookup = 0;
+  
+  if (g_once_init_enter (&lookup))
+    {
+      gsize setup_value = 1;
+      GDesktopAppInfoLookup *lookup_instance;
+      const char *use_this;
+      GIOExtensionPoint *ep;
+      GIOExtension *extension;
+      GList *l;
+
+      use_this = g_getenv ("GIO_USE_URI_ASSOCIATION");
+      
+      /* Ensure vfs in modules loaded */
+      _g_io_modules_ensure_loaded ();
+      
+      ep = g_io_extension_point_lookup (G_DESKTOP_APP_INFO_LOOKUP_EXTENSION_POINT_NAME);
+
+      lookup_instance = NULL;
+      if (use_this)
+	{
+	  extension = g_io_extension_point_get_extension_by_name (ep, use_this);
+	  if (extension)
+	    lookup_instance = g_object_new (g_io_extension_get_type (extension), NULL);
+	}
+      
+      if (lookup_instance == NULL)
+	{
+	  for (l = g_io_extension_point_get_extensions (ep); l != NULL; l = l->next)
+	    {
+	      extension = l->data;
+	      lookup_instance = g_object_new (g_io_extension_get_type (extension), NULL);
+	      if (lookup_instance != NULL)
+		break;
+	    }
+	}
+
+      if (lookup_instance != NULL)
+	setup_value = (gsize)lookup_instance;
+      
+      g_once_init_leave (&lookup, setup_value);
+    }
+
+  if (lookup == 1)
+    return NULL;
+
+  return g_desktop_app_info_lookup_get_default_for_uri_scheme (G_DESKTOP_APP_INFO_LOOKUP (lookup),
+							       uri_scheme);
 }
 
 
@@ -2284,5 +2327,65 @@
   return desktop_entries;
 }
 
+/* GDesktopAppInfoLookup interface: */
+
+static void g_desktop_app_info_lookup_base_init (gpointer g_class);
+static void g_desktop_app_info_lookup_class_init (gpointer g_class,
+						  gpointer class_data);
+
+GType
+g_desktop_app_info_lookup_get_type (void)
+{
+  static GType desktop_app_info_lookup_type = 0;
+
+  if (! desktop_app_info_lookup_type)
+    {
+      static const GTypeInfo desktop_app_info_lookup_info =
+      {
+        sizeof (GDesktopAppInfoLookupIface), /* class_size */
+	g_desktop_app_info_lookup_base_init,   /* base_init */
+	NULL,		/* base_finalize */
+	g_desktop_app_info_lookup_class_init,
+	NULL,		/* class_finalize */
+	NULL,		/* class_data */
+	0,
+	0,              /* n_preallocs */
+	NULL
+      };
+
+      desktop_app_info_lookup_type =
+	g_type_register_static (G_TYPE_INTERFACE, I_("GDesktopAppInfoLookup"),
+				&desktop_app_info_lookup_info, 0);
+
+      g_type_interface_add_prerequisite (desktop_app_info_lookup_type, G_TYPE_OBJECT);
+    }
+
+  return desktop_app_info_lookup_type;
+}
+
+static void
+g_desktop_app_info_lookup_class_init (gpointer g_class,
+				      gpointer class_data)
+{
+}
+
+static void
+g_desktop_app_info_lookup_base_init (gpointer g_class)
+{
+}
+
+GAppInfo *
+g_desktop_app_info_lookup_get_default_for_uri_scheme (GDesktopAppInfoLookup *lookup,
+						      const char  *uri_scheme)
+{
+  GDesktopAppInfoLookupIface *iface;
+  
+  g_return_val_if_fail (G_IS_DESKTOP_APP_INFO_LOOKUP (lookup), FALSE);
+
+  iface = G_DESKTOP_APP_INFO_LOOKUP_GET_IFACE (lookup);
+
+  return (* iface->get_default_for_uri_scheme) (lookup, uri_scheme);
+}
+
 #define __G_DESKTOP_APP_INFO_C__
 #include "gioaliasdef.c"

Modified: trunk/gio/gdesktopappinfo.h
==============================================================================
--- trunk/gio/gdesktopappinfo.h	(original)
+++ trunk/gio/gdesktopappinfo.h	Tue Jan 29 12:18:48 2008
@@ -24,6 +24,7 @@
 #define __G_DESKTOP_APP_INFO_H__
 
 #include <gio/gio.h>
+#include "giomodule-priv.h"
 
 G_BEGIN_DECLS
 
@@ -42,6 +43,7 @@
   GObjectClass parent_class;
 };
 
+
 GType g_desktop_app_info_get_type (void) G_GNUC_CONST;
   
 GDesktopAppInfo *g_desktop_app_info_new_from_filename (const char      *filename);
@@ -50,6 +52,29 @@
 
 void             g_desktop_app_info_set_desktop_env   (const char *desktop_env);
 
+
+#define G_TYPE_DESKTOP_APP_INFO_LOOKUP           (g_desktop_app_info_lookup_get_type ())
+#define G_DESKTOP_APP_INFO_LOOKUP(obj)           (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_TYPE_DESKTOP_APP_INFO_LOOKUP, GDesktopAppInfoLookup))
+#define G_IS_DESKTOP_APP_INFO_LOOKUP(obj)	 (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_DESKTOP_APP_INFO_LOOKUP))
+#define G_DESKTOP_APP_INFO_LOOKUP_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), G_TYPE_DESKTOP_APP_INFO_LOOKUP, GDesktopAppInfoLookupIface))
+
+#define G_DESKTOP_APP_INFO_LOOKUP_EXTENSION_POINT_NAME "gio-desktop-app-info-lookup"
+
+typedef struct _GDesktopAppInfoLookup GDesktopAppInfoLookup;
+typedef struct _GDesktopAppInfoLookupIface GDesktopAppInfoLookupIface;
+
+struct _GDesktopAppInfoLookupIface
+{
+  GTypeInterface g_iface;
+
+  GAppInfo * (*get_default_for_uri_scheme) (GDesktopAppInfoLookup *lookup,
+					    const char  *uri_scheme);
+};
+
+GType g_desktop_app_info_lookup_get_type (void) G_GNUC_CONST;
+GAppInfo * g_desktop_app_info_lookup_get_default_for_uri_scheme (GDesktopAppInfoLookup *lookup,
+								 const char  *uri_scheme);
+
 G_END_DECLS
 
 

Modified: trunk/gio/gfile.c
==============================================================================
--- trunk/gio/gfile.c	(original)
+++ trunk/gio/gfile.c	Tue Jan 29 12:18:48 2008
@@ -4572,6 +4572,57 @@
  *   Utility functions                      *
  ********************************************/
 
+GAppInfo *
+g_file_query_default_handler (GFile                  *file,
+			      GCancellable           *cancellable,
+			      GError                **error)
+{
+  char *uri_scheme;
+  const char *content_type;
+  GAppInfo *appinfo;
+  GFileInfo *info;
+  char *path;
+  
+  uri_scheme = g_file_get_uri_scheme (file);
+  appinfo = g_app_info_get_default_for_uri_scheme (uri_scheme);
+  g_free (uri_scheme);
+
+  if (appinfo != NULL)
+    return appinfo;
+
+  info = g_file_query_info (file,
+			    G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
+			    0,
+			    cancellable,
+			    error);
+  if (info == NULL)
+    return NULL;
+
+  appinfo = NULL;
+
+  content_type = g_file_info_get_content_type (info);
+  if (content_type)
+    {
+      /* Don't use is_native(), as we want to support fuse paths if availible */
+      path = g_file_get_path (file);
+      appinfo = g_app_info_get_default_for_type (content_type,
+						 path == NULL);
+      g_free (path);
+    }
+  
+  g_object_unref (info);
+
+  if (appinfo != NULL)
+    return appinfo;
+
+  g_set_error (error, G_IO_ERROR,
+	       G_IO_ERROR_NOT_SUPPORTED,
+	       _("No application is registered as handling this file"));
+  return NULL;
+  
+}
+
+
 #define GET_CONTENT_BLOCK_SIZE 8192
 
 /**

Modified: trunk/gio/gfile.h
==============================================================================
--- trunk/gio/gfile.h	(original)
+++ trunk/gio/gfile.h	Tue Jan 29 12:18:48 2008
@@ -33,6 +33,7 @@
 #include <gio/gfileinputstream.h>
 #include <gio/gfileoutputstream.h>
 #include <gio/gmountoperation.h>
+#include <gio/gappinfo.h>
 
 G_BEGIN_DECLS
 
@@ -838,6 +839,9 @@
 
 /* Utilities */
 
+GAppInfo *g_file_query_default_handler       (GFile                  *file,
+					      GCancellable           *cancellable,
+					      GError                **error);
 gboolean g_file_load_contents                (GFile                  *file,
 					      GCancellable           *cancellable,
 					      char                  **contents,

Modified: trunk/gio/giomodule.c
==============================================================================
--- trunk/gio/giomodule.c	(original)
+++ trunk/gio/giomodule.c	Tue Jan 29 12:18:48 2008
@@ -30,7 +30,9 @@
 #include "glocaldirectorymonitor.h"
 #include "gnativevolumemonitor.h"
 #include "gvfs.h"
-
+#ifdef G_OS_UNIX
+#include "gdesktopappinfo.h"
+#endif
 #include "gioalias.h"
 
 /**
@@ -257,6 +259,11 @@
     {
       loaded_dirs = TRUE;
 
+#ifdef G_OS_UNIX
+      ep = g_io_extension_point_register (G_DESKTOP_APP_INFO_LOOKUP_EXTENSION_POINT_NAME);
+      g_io_extension_point_set_required_type (ep, G_TYPE_DESKTOP_APP_INFO_LOOKUP);
+#endif
+      
       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);
       

Modified: trunk/gio/gvfs.c
==============================================================================
--- trunk/gio/gvfs.c	(original)
+++ trunk/gio/gvfs.c	Tue Jan 29 12:18:48 2008
@@ -167,46 +167,6 @@
   return (* class->parse_name) (vfs, parse_name);
 }
 
-/* Note: This compares in reverse order.
-   Higher prio -> sort first
- */
-static gint
-compare_vfs_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 gpointer
 get_default_vfs (gpointer arg)
 {



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