* don't place non-disk volumes in computer:/// * place non-disk volumes in network:///, including monitoring for mount/umount of volumes. -- James Henstridge 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; }