 * don't place non-disk volumes in computer:///
 * place non-disk volumes in network:///, including monitoring for
   mount/umount of volumes.

 -- James Henstridge <james.henstridge@canonical.com>

Index: modules/computer-method.c
===================================================================
RCS file: /cvs/gnome/gnome-vfs/modules/computer-method.c,v
retrieving revision 1.8
diff -u -p -r1.8 computer-method.c
--- modules/computer-method.c	12 Aug 2004 09:08:56 -0000	1.8
+++ modules/computer-method.c	10 Sep 2004 07:30:52 -0000
@@ -254,18 +254,20 @@ volume_mounted (GnomeVFSVolumeMonitor *v
 {
 	ComputerFile *file;
 	GnomeVFSDrive *drive;
-	char *name;
+	/*char *name;*/
 	
 	G_LOCK (root_dir);
 	if (gnome_vfs_volume_is_user_visible (volume)) {
 		drive = gnome_vfs_volume_get_drive (volume);
 		if (drive == NULL) {
+			/*
 			file = computer_file_new (COMPUTER_VOLUME);
 			name = gnome_vfs_volume_get_display_name (volume);
 			file->file_name = build_file_name (name, ".volume");
 			g_free (name);
 			file->volume = gnome_vfs_volume_ref (volume);
 			computer_file_add (dir, file);
+			*/
 		} else {
 			file = get_drive_file (dir, drive);
 			if (file != NULL) {
@@ -341,9 +343,9 @@ static void
 fill_root (ComputerDir *dir)
 {
 	GnomeVFSVolumeMonitor *monitor;
-	GnomeVFSVolume *volume;
+	/*GnomeVFSVolume *volume;*/
 	GnomeVFSDrive *drive;
-	GList *volumes, *drives, *l;
+	GList /* *volumes, */ *drives, *l;
 	ComputerFile *file;
 	char *name;
 	
@@ -364,7 +366,7 @@ fill_root (ComputerDir *dir)
 	file->file_name = g_strdup ("Network.desktop");
 	computer_file_add (dir, file);
 	
-	volumes = gnome_vfs_volume_monitor_get_mounted_volumes (monitor);
+	/*volumes = gnome_vfs_volume_monitor_get_mounted_volumes (monitor);*/
 	drives = gnome_vfs_volume_monitor_get_connected_drives (monitor);
 	
 	for (l = drives; l != NULL; l = l->next) {
@@ -379,6 +381,7 @@ fill_root (ComputerDir *dir)
 		}
 	}
 	
+	/*
 	for (l = volumes; l != NULL; l = l->next) {
 		volume = l->data;
 		if (gnome_vfs_volume_is_user_visible (volume)) {
@@ -394,11 +397,12 @@ fill_root (ComputerDir *dir)
 			gnome_vfs_drive_unref (drive);
 		}
 	}
+	*/
 
 	g_list_foreach (drives, (GFunc) gnome_vfs_drive_unref, NULL);
-	g_list_foreach (volumes, (GFunc) gnome_vfs_volume_unref, NULL);
+	/*g_list_foreach (volumes, (GFunc) gnome_vfs_volume_unref, NULL);*/
 	g_list_free (drives);
-	g_list_free (volumes);
+	/*g_list_free (volumes);*/
 
 	g_signal_connect (monitor, "volume_mounted",
 			  G_CALLBACK (volume_mounted), dir);
Index: modules/network-method.c
===================================================================
RCS file: /cvs/gnome/gnome-vfs/modules/network-method.c,v
retrieving revision 1.5
diff -u -p -r1.5 network-method.c
--- modules/network-method.c	24 Jun 2004 14:29:27 -0000	1.5
+++ modules/network-method.c	10 Sep 2004 07:30:54 -0000
@@ -476,6 +476,66 @@ network_monitor_remove (NetworkMonitor *
 
 }
 
+/* functions to handle volumes */
+static char *
+build_volume_filename (GnomeVFSVolume *volume)
+{
+	char *name, *escaped, *ret;
+
+	name = gnome_vfs_volume_get_display_name (volume);
+	escaped = gnome_vfs_escape_string (name);
+	ret = g_strconcat ("volume-", escaped, NULL);
+	g_free(escaped);
+	g_free(name);
+
+	return ret;
+}
+
+static void
+volume_mounted (GnomeVFSVolumeMonitor *monitor,
+		GnomeVFSVolume        *volume,
+		gpointer               user_data)
+{
+	GnomeVFSDrive *drive;
+	char *volume_file, *volume_uri;
+	char *volume_name, *volume_icon;
+
+	G_LOCK (network);
+	if (gnome_vfs_volume_is_user_visible (volume)) {
+		drive = gnome_vfs_volume_get_drive (volume);
+		if (drive == NULL) {
+			volume_file = build_volume_filename (volume);
+			volume_uri = gnome_vfs_volume_get_activation_uri (volume);
+			volume_name = gnome_vfs_volume_get_display_name (volume);
+			volume_icon = gnome_vfs_volume_get_icon (volume);
+
+			add_link (volume_file, volume_uri,
+				  volume_name, volume_icon);
+			g_free (volume_icon);
+			g_free (volume_name);
+			g_free (volume_uri);
+			g_free (volume_file);
+		}
+		gnome_vfs_drive_unref (drive);
+	}
+	G_UNLOCK (network);
+}
+
+static void
+volume_unmounted (GnomeVFSVolumeMonitor *volume_monitor,
+		  GnomeVFSVolume        *volume,
+		  gpointer               user_data)
+{
+	char *volume_file;
+
+	G_LOCK (network);
+
+	volume_file = build_volume_filename (volume);
+	remove_link (volume_file);
+	g_free (volume_file);
+
+	G_UNLOCK (network);
+}
 
 static GnomeVFSResult
 do_open (GnomeVFSMethod *method,
@@ -1337,6 +1397,8 @@ vfs_module_init (const char *method_name
 	GConfClient *gconf_client;
 	GnomeVFSURI *uri;
 	char *workgroup_uri, *workgroup_escaped, *setting;
+	GnomeVFSVolumeMonitor *monitor;
+	GList *volumes, *l;
 	
 	gconf_client = gconf_client_get_default ();
 
@@ -1396,7 +1458,43 @@ vfs_module_init (const char *method_name
 			  "gnome-fs-network");
 	}
 
-	
+	/* add non-drive volumes to network:/// folder */
+	monitor = gnome_vfs_get_volume_monitor ();
+	volumes = gnome_vfs_volume_monitor_get_mounted_volumes (monitor);
+	for (l = volumes; l != NULL; l = l->next) {
+		GnomeVFSVolume *volume = l->data;
+
+		if (gnome_vfs_volume_is_user_visible (volume)) {
+			GnomeVFSDrive *drive = gnome_vfs_volume_get_drive (volume);
+			gchar *volume_file, *volume_uri;
+			gchar *volume_name, *volume_icon;
+
+			if (drive != NULL) {
+				gnome_vfs_drive_unref (drive);
+				continue;
+			}
+
+			volume_file = build_volume_filename (volume);
+			volume_uri = gnome_vfs_volume_get_activation_uri (volume);
+			volume_name = gnome_vfs_volume_get_display_name (volume);
+			volume_icon = gnome_vfs_volume_get_icon (volume);
+
+			add_link (volume_file, volume_uri,
+				  volume_name, volume_icon);
+			g_free (volume_icon);
+			g_free (volume_name);
+			g_free (volume_uri);
+			g_free (volume_file);
+		}
+	}
+	g_list_foreach (volumes, (GFunc) gnome_vfs_volume_unref, NULL);
+	g_list_free (volumes);
+
+	g_signal_connect (monitor, "volume_mounted",
+			  G_CALLBACK (volume_mounted), NULL);
+	g_signal_connect (monitor, "volume_unmounted",
+			  G_CALLBACK (volume_unmounted), NULL);
+
 	return &method;
 }
 
