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;
+}