File nautilus-142860-vfs-drive-for-extensions.diff of Package nautilus

https://bugzilla.novell.com/show_bug.cgi?id=142860

2006-05-09  Federico Mena Quintero  <federico@novell.com>

	Let an extension query for the GnomeVFSDrive that may correspond
	to a NautilusFileInfo:

	* libnautilus-extension/nautilus-file-info.h: Added prototype for
	nautilus_file_info_get_drive().
	(struct _NautilusFileInfoIface): Added a "get_drive" method.

	* libnautilus-extension/nautilus-file-info.c
	(nautilus_file_info_get_drive): New public function; gets the
	GnomeVFSDrive that may correspond to a NautilusFileInfo.

	Implementation of NautilusFileInfo::get_drive() for
	NautilusDesktopIconFile:

	* libnautilus-private/nautilus-desktop-icon-file.c: Use
	G_DEFINE_TYPE_WITH_CODE() instead of EEL_CLASS_BOILERPLATE() so
	that we can implement an interface. 
	(file_info_iface_init): New function, initializes the
	NautilusFileInfoIface for the desktop icon file class.
	(nautilus_desktop_icon_file_get_drive): Implement the
	::get_drive() method from NautilusFileInfoIface.

Index: nautilus/libnautilus-extension/nautilus-file-info.c
===================================================================
RCS file: /cvsroot/novell/nautilus/libnautilus-extension/nautilus-file-info.c,v
retrieving revision 1.1.1.1
diff -u -p -r1.1.1.1 nautilus-file-info.c
--- nautilus/libnautilus-extension/nautilus-file-info.c	7 Apr 2006 20:12:27 -0000	1.1.1.1
+++ nautilus/libnautilus-extension/nautilus-file-info.c	9 May 2006 22:19:00 -0000
@@ -156,6 +156,21 @@ nautilus_file_info_is_directory (Nautilu
 	return NAUTILUS_FILE_INFO_GET_IFACE (file)->is_directory (file);
 }
 
+GnomeVFSDrive *
+nautilus_file_info_get_drive (NautilusFileInfo *file)
+{
+	NautilusFileInfoIface *iface;
+
+	g_return_val_if_fail (NAUTILUS_IS_FILE_INFO (file), NULL);
+
+	iface = NAUTILUS_FILE_INFO_GET_IFACE (file);
+
+	if (iface->get_drive)
+		return NAUTILUS_FILE_INFO_GET_IFACE (file)->get_drive (file);
+	else
+		return NULL;
+}
+
 GnomeVFSFileInfo *
 nautilus_file_info_get_vfs_file_info (NautilusFileInfo *file)
 {
Index: nautilus/libnautilus-extension/nautilus-file-info.h
===================================================================
RCS file: /cvsroot/novell/nautilus/libnautilus-extension/nautilus-file-info.h,v
retrieving revision 1.1.1.1
diff -u -p -r1.1.1.1 nautilus-file-info.h
--- nautilus/libnautilus-extension/nautilus-file-info.h	7 Apr 2006 20:12:27 -0000	1.1.1.1
+++ nautilus/libnautilus-extension/nautilus-file-info.h	9 May 2006 23:04:59 -0000
@@ -27,6 +27,7 @@
 #define NAUTILUS_FILE_INFO_H
 
 #include <glib-object.h>
+#include <libgnomevfs/gnome-vfs-drive.h>
 #include <libgnomevfs/gnome-vfs-file-info.h>
 
 G_BEGIN_DECLS
@@ -74,6 +75,7 @@ struct _NautilusFileInfoIface 
 						   const char       *attribute_name,
 						   const char       *value);
 	void              (*invalidate_extension_info) (NautilusFileInfo *file);
+	GnomeVFSDrive *   (*get_drive)            (NautilusFileInfo *file);
 };
 
 GList            *nautilus_file_info_list_copy            (GList            *files);
@@ -95,6 +97,9 @@ gboolean          nautilus_file_info_is_
 							   const char       *mime_type);
 gboolean          nautilus_file_info_is_directory         (NautilusFileInfo *file);
 
+/* Drive */
+GnomeVFSDrive    *nautilus_file_info_get_drive            (NautilusFileInfo *file);
+
 
 
 /* Other File Info */
Index: nautilus/libnautilus-private/nautilus-desktop-icon-file.c
===================================================================
RCS file: /cvsroot/novell/nautilus/libnautilus-private/nautilus-desktop-icon-file.c,v
retrieving revision 1.2
diff -u -p -r1.2 nautilus-desktop-icon-file.c
--- nautilus/libnautilus-private/nautilus-desktop-icon-file.c	11 Apr 2006 16:46:34 -0000	1.2
+++ nautilus/libnautilus-private/nautilus-desktop-icon-file.c	10 May 2006 00:24:37 -0000
@@ -43,13 +43,16 @@ struct NautilusDesktopIconFileDetails {
 	NautilusDesktopLink *link;
 };
 
-static void nautilus_desktop_icon_file_init       (gpointer   object,
-						   gpointer   klass);
-static void nautilus_desktop_icon_file_class_init (gpointer   klass);
-
-EEL_CLASS_BOILERPLATE (NautilusDesktopIconFile,
-		       nautilus_desktop_icon_file,
-		       NAUTILUS_TYPE_FILE)
+static void nautilus_desktop_icon_file_init       (NautilusDesktopIconFile      *icon_file);
+static void nautilus_desktop_icon_file_class_init (NautilusDesktopIconFileClass *klass);
+
+static void file_info_iface_init (NautilusFileInfoIface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (NautilusDesktopIconFile,
+			 nautilus_desktop_icon_file,
+			 NAUTILUS_TYPE_FILE,
+			 G_IMPLEMENT_INTERFACE (NAUTILUS_TYPE_FILE_INFO,
+						file_info_iface_init));
 
 static void
 desktop_icon_file_monitor_add (NautilusFile *file,
@@ -164,13 +167,9 @@ desktop_icon_file_get_where_string (Naut
 }
 
 static void
-nautilus_desktop_icon_file_init (gpointer object, gpointer klass)
+nautilus_desktop_icon_file_init (NautilusDesktopIconFile *icon_file)
 {
-	NautilusDesktopIconFile *desktop_file;
-
-	desktop_file = NAUTILUS_DESKTOP_ICON_FILE (object);
-
-	desktop_file->details = g_new0 (NautilusDesktopIconFileDetails, 1);
+	icon_file->details = g_new0 (NautilusDesktopIconFileDetails, 1);
 }	
 
 static void
@@ -342,11 +341,13 @@ desktop_icon_file_finalize (GObject *obj
 
 	g_free (desktop_file->details);
 
-	EEL_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
+	if (G_OBJECT_CLASS (nautilus_desktop_icon_file_parent_class)->finalize) {
+		G_OBJECT_CLASS (nautilus_desktop_icon_file_parent_class)->finalize (object);
+	}
 }
 
 static void
-nautilus_desktop_icon_file_class_init (gpointer klass)
+nautilus_desktop_icon_file_class_init (NautilusDesktopIconFileClass *klass)
 {
 	GObjectClass *object_class;
 	NautilusFileClass *file_class;
@@ -367,3 +368,36 @@ nautilus_desktop_icon_file_class_init (g
 	file_class->get_date = desktop_icon_file_get_date;
 	file_class->get_where_string = desktop_icon_file_get_where_string;
 }
+
+static GnomeVFSDrive *
+nautilus_desktop_icon_file_get_drive (NautilusFileInfo *file)
+{
+	NautilusDesktopIconFile *icon_file;
+	NautilusDesktopLink *link;
+	GObject *drive_or_volume;
+
+	icon_file = NAUTILUS_DESKTOP_ICON_FILE (file);
+	link = icon_file->details->link;
+
+	if (nautilus_desktop_link_get_link_type (link) != NAUTILUS_DESKTOP_LINK_VOLUME) {
+		return NULL;
+	}
+
+	drive_or_volume = nautilus_desktop_link_get_drive_or_volume (link);
+	if (GNOME_IS_VFS_DRIVE (drive_or_volume)) {
+		return GNOME_VFS_DRIVE (drive_or_volume); /* comes with a new reference count */
+	} else {
+		GnomeVFSDrive *drive;
+
+		drive = gnome_vfs_volume_get_drive (GNOME_VFS_VOLUME (drive_or_volume)); /* comes with a new reference count */
+		gnome_vfs_volume_unref (GNOME_VFS_VOLUME (drive_or_volume));
+
+		return drive;
+	}
+}
+
+static void
+file_info_iface_init (NautilusFileInfoIface *iface)
+{
+	iface->get_drive = nautilus_desktop_icon_file_get_drive;
+}
openSUSE Build Service is sponsored by