File nautilus-open-unmounted-drive-error-bug264956.patch of Package nautilus

diff -Npur nau_old/src/file-manager/fm-directory-view.c nau_new/src/file-manager/fm-directory-view.c
--- nau_old/src/file-manager/fm-directory-view.c	2007-08-17 13:32:20.000000000 +0800
+++ nau_new/src/file-manager/fm-directory-view.c	2007-08-17 13:36:00.000000000 +0800
@@ -280,8 +280,14 @@ typedef struct {
 	gboolean mounting;
 	gboolean cancelled;
 	gulong file_changed_id;
+	GnomeVFSDrive *drive;
 } ActivateParameters;
 
+typedef struct {
+	ActivateParameters *parameters;
+	GnomeVFSDrive *drive;
+} DriveBeingMounted;
+
 enum {
 	GNOME_COPIED_FILES,
 	UTF8_STRING
@@ -7455,41 +7461,42 @@ static void
 activation_file_changed_after_drive_mounted (NautilusFile *file,
 					     gpointer data)
 {
+	DriveBeingMounted *drive_being_mounted;
 	ActivateParameters *parameters;
-
-	parameters = data;
+	
+	drive_being_mounted = data;
+	parameters = drive_being_mounted->parameters;
 
 	g_signal_handler_disconnect (parameters->file, parameters->file_changed_id);
 	parameters->file_changed_id = 0;
 
 	activate_activation_uri_ready_callback (parameters->file, parameters);
+	gnome_vfs_drive_unref (drive_being_mounted->drive);
+	g_free (drive_being_mounted);
 }
 
+/*dliang mark */
 static void
 activation_drive_mounted_callback (gboolean succeeded,
 				   char *error,
 				   char *detailed_error,
 				   gpointer callback_data)
 {
+	DriveBeingMounted *drive_being_mounted;
 	ActivateParameters *parameters;
-
-	parameters = callback_data;
+	drive_being_mounted = callback_data;
+	parameters = drive_being_mounted->parameters;
 
 	parameters->mounted = TRUE;
 	parameters->mounting = FALSE;
 	
 	if (succeeded && !parameters->cancelled) {
-		GnomeVFSDrive *drive;
-
-		/* fprintf (stderr, "LOG: activation_drive_mounted_callback(): drive got mounted successfully\n"); */
-
-		drive = nautilus_file_get_drive (parameters->file); /* we don't own this reference */
-		g_assert (drive != NULL);
-
-		if (gnome_vfs_drive_is_mounted (drive)) {
+		if (gnome_vfs_drive_is_mounted (drive_being_mounted->drive)) {
 			/* fprintf (stderr, "LOG: activation_drive_mounted_callback(): drive is really mounted; activating...\n"); */
 			activate_activation_uri_ready_callback (parameters->file,
 								parameters);
+			gnome_vfs_drive_unref (drive_being_mounted->drive);
+			g_free (drive_being_mounted);
 		} else {
 			/* Hack alert:  Here, the drive is already mounted, but
 			 * gnome-vfs-volume-monitor thinks that it is not.  This
@@ -7504,7 +7511,7 @@ activation_drive_mounted_callback (gbool
 			parameters->file_changed_id =
 				g_signal_connect (parameters->file, "changed",
 						  G_CALLBACK (activation_file_changed_after_drive_mounted),
-						  parameters);
+						  drive_being_mounted);
 		}
 	} else {
 		/* fprintf (stderr, "LOG: activation_drive_mounted_callback(): drive didn't get mounted\n"); */
@@ -7516,10 +7523,10 @@ activation_drive_mounted_callback (gbool
 			                                    detailed_error, 
 							    NULL);
 		}
-		
+		gnome_vfs_drive_unref (drive_being_mounted->drive);
 		nautilus_file_unref (parameters->file);
-		
 		g_free (parameters);
+		g_free (drive_being_mounted);
 	}
 }
 
@@ -7555,8 +7562,13 @@ activate_activation_uri_ready_callback (
 		if (drive != NULL &&
 		    !gnome_vfs_drive_is_mounted (drive)) {
 			parameters->mounting = TRUE;
+			
+			DriveBeingMounted *drive_being_mounted;
+			drive_being_mounted = g_new (DriveBeingMounted, 1);
+			drive_being_mounted->parameters = parameters;
+			drive_being_mounted->drive 	= gnome_vfs_drive_ref (drive);
 			/* fprintf (stderr, "LOG: activate_activation_uri_ready_callback() calling gnome_vfs_drive_mount()\n"); */
-			gnome_vfs_drive_mount (drive, activation_drive_mounted_callback, callback_data);
+			gnome_vfs_drive_mount (drive, activation_drive_mounted_callback, drive_being_mounted);
 			return;
 		}
 	}
openSUSE Build Service is sponsored by