brasero r997 - in trunk: . src



Author: philippr
Date: Wed Jul 16 11:19:07 2008
New Revision: 997
URL: http://svn.gnome.org/viewvc/brasero?rev=997&view=rev

Log:
	Try to improve things to fix #509895 â CD is not ejected after burn

	* src/burn-volume-obj.c (brasero_volume_eject_finish),
	(brasero_volume_eject):
	* src/burn.c (brasero_burn_eject_src_media),
	(brasero_burn_unlock_src_media), (brasero_burn_unlock_dest_media),
	(brasero_burn_unlock_medias), (brasero_burn_check),
	(brasero_burn_same_src_dest), (brasero_burn_record),
	(brasero_burn_blank):

Modified:
   trunk/ChangeLog
   trunk/src/burn-volume-obj.c
   trunk/src/burn.c

Modified: trunk/src/burn-volume-obj.c
==============================================================================
--- trunk/src/burn-volume-obj.c	(original)
+++ trunk/src/burn-volume-obj.c	Wed Jul 16 11:19:07 2008
@@ -458,9 +458,14 @@
 	BraseroVolumePrivate *priv;
 
 	priv = BRASERO_VOLUME_PRIVATE (self);
-	priv->result = g_drive_eject_finish (G_DRIVE (source),
-					     result,
-					     &priv->error);
+	if (G_IS_DRIVE (source))
+		priv->result = g_drive_eject_finish (G_DRIVE (source),
+						     result,
+						     &priv->error);
+	else
+		priv->result = g_volume_eject_finish (G_VOLUME (source),
+						      result,
+						      &priv->error);
 
 	if (priv->error) {
 		if (priv->error->code == G_IO_ERROR_FAILED_HANDLED) {
@@ -498,7 +503,8 @@
 	gdrive = g_volume_get_drive (volume);
 	g_object_unref (volume);
 
-	if (!g_drive_can_eject (gdrive)) {
+	if ((!gdrive || !g_drive_can_eject (gdrive))
+	&&   !g_volume_can_eject (volume)) {
 		g_object_unref (gdrive);
 		return FALSE;
 	}
@@ -513,11 +519,18 @@
 					      G_CALLBACK (brasero_volume_ejected_cb),
 					      self);
 
-		g_drive_eject (gdrive,
-			       G_MOUNT_UNMOUNT_NONE,
-			       priv->cancel,
-			       brasero_volume_eject_finish,
-			       self);
+		if (g_drive_can_eject (gdrive))
+			g_drive_eject (gdrive,
+				       G_MOUNT_UNMOUNT_NONE,
+				       priv->cancel,
+				       brasero_volume_eject_finish,
+				       self);
+		else
+			g_volume_eject (volume,
+					G_MOUNT_UNMOUNT_NONE,
+					priv->cancel,
+					brasero_volume_eject_finish,
+					self);
 
 		g_object_ref (self);
 		result = brasero_volume_wait_for_operation_end (self, error);
@@ -528,15 +541,24 @@
 		g_signal_handler_disconnect (drive, eject_sig);
 	}
 	else {
-		g_drive_eject (gdrive,
-			       G_MOUNT_UNMOUNT_NONE,
-			       priv->cancel,
-			       NULL,
-			       self);
+		if (g_drive_can_eject (gdrive))
+			g_drive_eject (gdrive,
+				       G_MOUNT_UNMOUNT_NONE,
+				       priv->cancel,
+				       NULL,
+				       self);
+		else
+			g_volume_eject (volume,
+					G_MOUNT_UNMOUNT_NONE,
+					priv->cancel,
+					NULL,
+					self);
 		result = TRUE;
 	}
 
-	g_object_unref (gdrive);
+	if (gdrive)
+		g_object_unref (gdrive);
+
 	return result;
 }
 

Modified: trunk/src/burn.c
==============================================================================
--- trunk/src/burn.c	(original)
+++ trunk/src/burn.c	Wed Jul 16 11:19:07 2008
@@ -374,18 +374,19 @@
 		}
 	}
 
-	brasero_volume_eject (BRASERO_VOLUME (medium), TRUE, NULL);
+	brasero_volume_eject (BRASERO_VOLUME (medium), TRUE, error);
 	medium = brasero_drive_get_medium (priv->src);
 	if (medium && brasero_medium_get_status (medium) != BRASERO_MEDIUM_NONE) {
 		gchar *name;
 
 		name = brasero_drive_get_display_name (priv->src);
 
-		g_set_error (error,
-			     BRASERO_BURN_ERROR,
-			     BRASERO_BURN_ERROR_GENERAL,
-			     _("the media in %s can't be ejected"),
-			     name);
+		if (error && !(*error))
+			g_set_error (error,
+				     BRASERO_BURN_ERROR,
+				     BRASERO_BURN_ERROR_GENERAL,
+				     _("the media in %s can't be ejected"),
+				     name);
 
 		g_free (name);
 
@@ -1063,7 +1064,8 @@
 }
 
 static BraseroBurnResult
-brasero_burn_unlock_src_media (BraseroBurn *burn)
+brasero_burn_unlock_src_media (BraseroBurn *burn,
+			       GError **error)
 {
 	BraseroBurnPrivate *priv = BRASERO_BURN_PRIVATE (burn);
 	BraseroMedium *medium;
@@ -1078,7 +1080,7 @@
 
 	medium = brasero_drive_get_medium (priv->src);
 	if (priv->mounted_by_us) {
-		brasero_volume_umount (BRASERO_VOLUME (medium), TRUE, NULL);
+		brasero_volume_umount (BRASERO_VOLUME (medium), TRUE, error);
 		priv->mounted_by_us = 0;
 	}
 
@@ -1086,14 +1088,15 @@
 	brasero_drive_unlock (priv->src);
 
 	if (BRASERO_BURN_SESSION_EJECT (priv->session))
-		brasero_volume_eject (BRASERO_VOLUME (medium), FALSE, NULL);
+		brasero_volume_eject (BRASERO_VOLUME (medium), FALSE, error);
 
 	priv->src = NULL;
 	return BRASERO_BURN_OK;
 }
 
 static BraseroBurnResult
-brasero_burn_unlock_dest_media (BraseroBurn *burn)
+brasero_burn_unlock_dest_media (BraseroBurn *burn,
+				GError **error)
 {
 	BraseroBurnPrivate *priv = BRASERO_BURN_PRIVATE (burn);
 	BraseroMedium *medium;
@@ -1111,17 +1114,18 @@
 	medium = brasero_drive_get_medium (priv->dest);
 
 	if (BRASERO_BURN_SESSION_EJECT (priv->session))
-		brasero_volume_eject (BRASERO_VOLUME (medium), FALSE, NULL);
+		brasero_volume_eject (BRASERO_VOLUME (medium), FALSE, error);
 
 	priv->dest = NULL;
 	return BRASERO_BURN_OK;
 }
 
 static BraseroBurnResult
-brasero_burn_unlock_medias (BraseroBurn *burn)
+brasero_burn_unlock_medias (BraseroBurn *burn,
+			    GError **error)
 {
-	brasero_burn_unlock_dest_media (burn);
-	brasero_burn_unlock_src_media (burn);
+	brasero_burn_unlock_dest_media (burn, error);
+	brasero_burn_unlock_src_media (burn, error);
 
 	return BRASERO_BURN_OK;
 }
@@ -2164,14 +2168,17 @@
 
 	result = brasero_burn_check_real (self, track, error);
 
-	brasero_burn_unlock_medias (self);
-
 	brasero_burn_powermanagement (self, FALSE);
 
 	/* no need to check the result of the comparison, it's set in session */
 	priv->session = NULL;
 	g_object_unref (session);
 
+	if (result == BRASERO_BURN_OK)
+		result = brasero_burn_unlock_medias (self, error);
+	else
+		brasero_burn_unlock_medias (self, NULL);
+
 	return result;
 }
 
@@ -2241,7 +2248,7 @@
 	/* run */
 	result = brasero_burn_record_session (self, TRUE, error);
 	if (result != BRASERO_BURN_OK) {
-		brasero_burn_unlock_src_media (self);
+		brasero_burn_unlock_src_media (self, NULL);
 		goto end;
 	}
 
@@ -2336,7 +2343,7 @@
 
 			/* see if we still need it to be locked */
 			if (brasero_burn_session_get_input_type (session, NULL) != BRASERO_TRACK_TYPE_DISC)
-				brasero_burn_unlock_src_media (burn);
+				brasero_burn_unlock_src_media (burn, NULL);
 
 			result = brasero_burn_record_session (burn, TRUE, error);
 			if (result != BRASERO_BURN_OK)
@@ -2346,7 +2353,10 @@
 
 end:
 
-	brasero_burn_unlock_medias (burn);
+	if (result == BRASERO_BURN_OK)
+		result = brasero_burn_unlock_medias (burn, error);
+	else
+		brasero_burn_unlock_medias (burn, NULL);
 
 	if (error && (*error) == NULL
 	&& (result == BRASERO_BURN_NOT_READY
@@ -2466,12 +2476,14 @@
 	if (ret_error)
 		g_propagate_error (error, ret_error);
 
-	brasero_burn_unlock_medias (burn);
+	if (result == BRASERO_BURN_OK && !ret_error)
+		result = brasero_burn_unlock_medias (burn, error);
+	else
+		brasero_burn_unlock_medias (burn, NULL);
 
 	if (result == BRASERO_BURN_OK)
 		brasero_burn_action_changed_real (burn, BRASERO_BURN_ACTION_FINISHED);
 
-
 	brasero_burn_powermanagement (burn, FALSE);
 
 	/* release session */



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]