brasero r1804 - in trunk: . libbrasero-media src/plugins/cdrkit src/plugins/growisofs



Author: philippr
Date: Wed Jan 21 21:09:09 2009
New Revision: 1804
URL: http://svn.gnome.org/viewvc/brasero?rev=1804&view=rev

Log:
2009-01-21  Philippe Rouquier  <ykw localhost localdomain>

	Fix/Improve unformatted DVD+RW detection and all disc detection in general
	See #567582 â Fails to burn a DVD iso

	* libbrasero-media/brasero-medium.c
	(brasero_medium_get_page_2A_write_speed_desc),
	(brasero_medium_get_speed), (brasero_medium_get_medium_type),
	(brasero_medium_init_real):
	* libbrasero-media/scsi-get-configuration.c
	(brasero_get_configuration),
	(brasero_mmc2_get_configuration_feature),
	(brasero_mmc2_get_profile):
	* libbrasero-media/scsi-mmc2.h:
	* src/plugins/cdrkit/burn-wodim.c (brasero_wodim_export_caps):
	* src/plugins/growisofs/burn-growisofs.c
	(brasero_growisofs_export_caps):

Modified:
   trunk/ChangeLog
   trunk/libbrasero-media/brasero-medium.c
   trunk/libbrasero-media/scsi-get-configuration.c
   trunk/libbrasero-media/scsi-mmc2.h
   trunk/src/plugins/cdrkit/burn-wodim.c
   trunk/src/plugins/growisofs/burn-growisofs.c

Modified: trunk/libbrasero-media/brasero-medium.c
==============================================================================
--- trunk/libbrasero-media/brasero-medium.c	(original)
+++ trunk/libbrasero-media/brasero-medium.c	Wed Jan 21 21:09:09 2009
@@ -1337,14 +1337,29 @@
 
 	page_2A = (BraseroScsiStatusPage *) &data->page;
 
-	/* FIXME: the following is not necessarily true */
-	if (size < sizeof (BraseroScsiStatusPage)) {
+	if (size < 18) {
 		g_free (data);
-
-		BRASERO_MEDIA_LOG ("wrong size in page");
+		BRASERO_MEDIA_LOG ("wrong page size");
 		return BRASERO_BURN_ERR;
 	}
 
+	priv->max_rd = BRASERO_GET_16 (page_2A->rd_max_speed);
+	priv->max_wrt = BRASERO_GET_16 (page_2A->wr_max_speed);
+
+	/* Check if we can use the speed descriptors; if not use maximum */
+	if (size < 20) {
+		BRASERO_MEDIA_LOG ("Maximum Speed (Page 2A [old]) %i", priv->max_wrt);
+
+		/* also add fake speed descriptors */
+		priv->wr_speeds = g_new0 (gint, 2);
+		priv->wr_speeds [0] = BRASERO_GET_16 (page_2A->wr_max_speed);
+		priv->rd_speeds = g_new0 (gint, 2);
+		priv->rd_speeds [0] = BRASERO_GET_16 (page_2A->rd_max_speed);
+
+		g_free (data);
+		return BRASERO_BURN_OK;
+	}
+
 	desc_num = BRASERO_GET_16 (page_2A->wr_speed_desc_num);
 	max_num = size -
 		  sizeof (BraseroScsiStatusPage) -
@@ -1364,70 +1379,33 @@
 		max_wrt = MAX (max_wrt, priv->wr_speeds [i]);
 	}
 
-	if (!max_wrt)
-		priv->max_wrt = BRASERO_GET_16 (page_2A->wr_max_speed);
-	else
+	if (max_wrt)
 		priv->max_wrt = max_wrt;
 
 	BRASERO_MEDIA_LOG ("Maximum Speed (Page 2A) %i", priv->max_wrt);
-
-	priv->max_rd = BRASERO_GET_16 (page_2A->rd_max_speed);
 	g_free (data);
 
 	return BRASERO_BURN_OK;
 }
 
 static BraseroBurnResult
-brasero_medium_get_page_2A_max_speed (BraseroMedium *self,
-				      BraseroDeviceHandle *handle,
-				      BraseroScsiErrCode *code)
+brasero_medium_get_speed (BraseroMedium *self,
+			  BraseroDeviceHandle *handle,
+			  BraseroScsiErrCode *code)
 {
-	BraseroScsiStatusPage *page_2A = NULL;
-	BraseroScsiModeData *data = NULL;
-	BraseroMediumPrivate *priv;
 	BraseroScsiResult result;
-	int size = 0;
-
-	BRASERO_MEDIA_LOG ("Retrieving speed (2A max)");
-
-	priv = BRASERO_MEDIUM_PRIVATE (self);
-
-	result = brasero_spc1_mode_sense_get_page (handle,
-						   BRASERO_SPC_PAGE_STATUS,
-						   &data,
-						   &size,
-						   code);
-	if (result != BRASERO_SCSI_OK) {
-		g_free (data);
-
-		BRASERO_MEDIA_LOG ("MODE SENSE failed");
-		return BRASERO_BURN_ERR;
-	}
-
-	page_2A = (BraseroScsiStatusPage *) &data->page;
-
-	if (size < 0x14) {
-		g_free (data);
-
-		BRASERO_MEDIA_LOG ("wrong page size");
-		return BRASERO_BURN_ERR;
-	}
-
-	priv->max_rd = BRASERO_GET_16 (page_2A->rd_max_speed);
-	priv->max_wrt = BRASERO_GET_16 (page_2A->wr_max_speed);
 
-	BRASERO_MEDIA_LOG ("Maximum Speed (Page 2A [old]) %i", priv->max_wrt);
+	BRASERO_MEDIA_LOG ("Retrieving media available speeds");
 
-	/* also add it to the speed descriptors */
-	priv->wr_speeds = g_new0 (gint, 2);
-	priv->wr_speeds [0] = BRASERO_GET_16 (page_2A->wr_max_speed);
-	priv->rd_speeds = g_new0 (gint, 2);
-	priv->rd_speeds [0] = BRASERO_GET_16 (page_2A->rd_max_speed);
+	result = brasero_medium_get_speed_mmc3 (self, handle, code);
+	if (result == BRASERO_BURN_OK)
+		return result;
 
-	g_free (data);
-	return BRASERO_BURN_OK;
+	/* Fallback */
+	result = brasero_medium_get_page_2A_write_speed_desc (self, handle, code);
+	return result;
 }
- 
+
 /**
  * Functions to get information about disc contents
  */
@@ -2192,6 +2170,8 @@
 	return result;
 }
 
+#if 0
+
 /**
  * These are special routines for old CD-R(W) drives that don't conform to MMC
  */
@@ -2645,6 +2625,8 @@
 	return BRASERO_BURN_ERR;
 }
 
+#endif
+
 /**
  * Some identification functions
  */
@@ -2654,19 +2636,15 @@
 				BraseroDeviceHandle *handle,
 				BraseroScsiErrCode *code)
 {
-	BraseroScsiGetConfigHdr *hdr = NULL;
+	BraseroScsiProfile profile;
 	BraseroMediumPrivate *priv;
 	BraseroScsiResult result;
-	int size;
 
 	BRASERO_MEDIA_LOG ("Retrieving media profile");
 
 	priv = BRASERO_MEDIUM_PRIVATE (self);
-	result = brasero_mmc2_get_configuration_feature (handle,
-							 BRASERO_SCSI_FEAT_REAL_TIME_STREAM,
-							 &hdr,
-							 &size,
-							 code);
+	result = brasero_mmc2_get_profile (handle, &profile, code);
+
 	if (result != BRASERO_SCSI_OK) {
 		BraseroScsiAtipData *data = NULL;
 		int size = 0;
@@ -2679,16 +2657,14 @@
 		 * will be provided by read_disc_information. */
 
 		/* retrieve the speed */
-		result = brasero_medium_get_page_2A_max_speed (self,
-							       handle,
-							       code);
+		result = brasero_medium_get_page_2A_write_speed_desc (self,
+								      handle,
+								      code);
 
 		/* If this fails it means that this drive is probably older than
-		 * MMC1 spec or does not conform to it. Try our last chance. */
+		 * MMC1 spec or does not conform to it. */
 		if (result != BRASERO_BURN_OK)
-			return brasero_medium_check_old_drive (self,
-							       handle,
-							       code);
+			return BRASERO_BURN_ERR;
 
 		/* The only thing here left to determine is if that's a WRITABLE
 		 * or a REWRITABLE. To determine that information, we need to
@@ -2731,7 +2707,7 @@
 		return result;
 	}
 
-	switch (BRASERO_GET_16 (hdr->current_profile)) {
+	switch (profile) {
 	case BRASERO_SCSI_PROF_CDROM:
 		priv->info = BRASERO_MEDIUM_CDROM;
 		priv->type = types [1];
@@ -2836,43 +2812,15 @@
 	case BRASERO_SCSI_PROF_HD_DVD_R:
 	case BRASERO_SCSI_PROF_HD_DVD_RAM:
 		priv->info = BRASERO_MEDIUM_UNSUPPORTED;
-		g_free (hdr);
 		return BRASERO_BURN_NOT_SUPPORTED;
 	}
 
-	/* try all SCSI functions to get write/read speeds in order */
-	if (hdr->desc->add_len >= sizeof (BraseroScsiRTStreamDesc)) {
-		BraseroScsiRTStreamDesc *stream;
-
-		/* means it's at least an MMC3 drive */
-		stream = (BraseroScsiRTStreamDesc *) hdr->desc->data;
-		if (stream->wrt_spd) {
-			result = brasero_medium_get_speed_mmc3 (self, handle, code);
-			if (result == BRASERO_BURN_OK)
-				goto end;
-		}
-
-		if (stream->mp2a) {
-			result = brasero_medium_get_page_2A_write_speed_desc (self, handle, code);
-			if (result == BRASERO_BURN_OK)
-				goto end;
-		}
-	}
-
-	/* fallback for speeds */
-	result = brasero_medium_get_page_2A_max_speed (self, handle, code);
-
-end:
-
-	g_free (hdr);
-
-	if (result != BRASERO_BURN_OK)
-		return result;
-
 	/* for BDs media we need to check the number of layers */
 	if (BRASERO_MEDIUM_IS (priv->info, BRASERO_MEDIUM_BD|BRASERO_MEDIUM_SRM)) {
+		BraseroScsiGetConfigHdr *hdr = NULL;
+		int size = 0;
+
 		/* check for POW */
-		hdr = NULL;
 		result = brasero_mmc2_get_configuration_feature (handle,
 								 BRASERO_SCSI_FEAT_BDR_POW,
 								 &hdr,
@@ -3254,7 +3202,16 @@
 	if (priv->probe_cancelled)
 		return;
 
+	result = brasero_medium_get_speed (object, handle, &code);
+	if (result != BRASERO_BURN_OK)
+		return;
+
+	if (priv->probe_cancelled)
+		return;
+
 	brasero_medium_get_capacity_by_type (object, handle, &code);
+	if (priv->probe_cancelled)
+		return;
 
 	result = brasero_medium_get_contents (object, handle, &code);
 	if (result != BRASERO_BURN_OK)
@@ -3272,7 +3229,6 @@
 		return;
 
 	brasero_medium_init_caps (object, handle, &code);
-
 	if (priv->probe_cancelled)
 		return;
 

Modified: trunk/libbrasero-media/scsi-get-configuration.c
==============================================================================
--- trunk/libbrasero-media/scsi-get-configuration.c	(original)
+++ trunk/libbrasero-media/scsi-get-configuration.c	Wed Jan 21 21:09:09 2009
@@ -126,6 +126,8 @@
 		request_size = 65530;
 	}
 	else if (request_size <= sizeof (hdr)) {
+		/* NOTE: if there is a feature, the size must be larger than the
+		 * header size. */
 		BRASERO_MEDIA_LOG ("Undersized data (%i) setting to max (65530)", request_size);
 		request_size = 65530;
 	}
@@ -145,6 +147,13 @@
 		      G_STRUCT_OFFSET (BraseroScsiGetConfigHdr, len) +
 		      sizeof (hdr.len);
 
+	if (buffer_size < sizeof (BraseroScsiGetConfigHdr) + 2) {
+		/* we can't have a size less or equal to that of the header */
+		BRASERO_MEDIA_LOG ("Size of buffer is less or equal to size of header");
+		g_free (buffer);
+		return BRASERO_SCSI_FAILURE;
+	}
+
 	if (buffer_size != request_size)
 		BRASERO_MEDIA_LOG ("Sizes mismatch asked %i / received %i",
 				  request_size,
@@ -177,6 +186,7 @@
 
 	/* make sure the desc is the one we want */
 	if ((*data) && BRASERO_GET_16 ((*data)->desc->code) != type) {
+		BRASERO_MEDIA_LOG ("Wrong type returned %d", (*data)->desc->code);
 		BRASERO_SCSI_SET_ERRCODE (error, BRASERO_SCSI_TYPE_MISMATCH);
 
 		g_free (*data);
@@ -186,3 +196,30 @@
 
 	return res;
 }
+
+BraseroScsiResult
+brasero_mmc2_get_profile (BraseroDeviceHandle *handle,
+			  BraseroScsiProfile *profile,
+			  BraseroScsiErrCode *error)
+{
+	BraseroScsiGetConfigHdr hdr;
+	BraseroGetConfigCDB *cdb;
+	BraseroScsiResult res;
+
+	g_return_val_if_fail (profile != NULL, BRASERO_SCSI_FAILURE);
+
+	cdb = brasero_scsi_command_new (&info, handle);
+	BRASERO_SET_16 (cdb->feature_num, BRASERO_SCSI_FEAT_CORE);
+	cdb->returned_data = BRASERO_GET_CONFIG_RETURN_ONLY_FEATURE;
+
+	memset (&hdr, 0, sizeof (hdr));
+	BRASERO_SET_16 (cdb->alloc_len, sizeof (hdr));
+	res = brasero_scsi_command_issue_sync (cdb, &hdr, sizeof (hdr), error);
+	if (res)
+		return res;
+
+	brasero_scsi_command_free (cdb);
+
+	*profile = BRASERO_GET_16 (hdr.current_profile);
+	return BRASERO_SCSI_OK;
+}

Modified: trunk/libbrasero-media/scsi-mmc2.h
==============================================================================
--- trunk/libbrasero-media/scsi-mmc2.h	(original)
+++ trunk/libbrasero-media/scsi-mmc2.h	Wed Jan 21 21:09:09 2009
@@ -43,6 +43,11 @@
 G_BEGIN_DECLS
 
 BraseroScsiResult
+brasero_mmc2_get_profile (BraseroDeviceHandle *handle,
+			  BraseroScsiProfile *profile,
+			  BraseroScsiErrCode *error);
+
+BraseroScsiResult
 brasero_mmc2_read_capacity (BraseroDeviceHandle *handle,
 			    BraseroScsiReadCapacityData *data,
 			    int size,

Modified: trunk/src/plugins/cdrkit/burn-wodim.c
==============================================================================
--- trunk/src/plugins/cdrkit/burn-wodim.c	(original)
+++ trunk/src/plugins/cdrkit/burn-wodim.c	Wed Jan 21 21:09:09 2009
@@ -1249,7 +1249,7 @@
 				  BRASERO_BURN_FLAG_NOGRACE,
 				  BRASERO_BURN_FLAG_NONE);
 
-	/* For DVD+W limited capabilites to blank media */
+	/* For DVD+R limited capabilites to blank media */
 	brasero_plugin_set_flags (plugin,
 				  BRASERO_MEDIUM_DVDR_PLUS|
 				  BRASERO_MEDIUM_BLANK,

Modified: trunk/src/plugins/growisofs/burn-growisofs.c
==============================================================================
--- trunk/src/plugins/growisofs/burn-growisofs.c	(original)
+++ trunk/src/plugins/growisofs/burn-growisofs.c	Wed Jan 21 21:09:09 2009
@@ -735,7 +735,7 @@
 	if (result != BRASERO_BURN_OK)
 		return result;
 
-	/* growisofs can write images to any type of DVD as long as it's blank */
+	/* growisofs can write images to any type of DVD-R as long as it's blank */
 	input = brasero_caps_image_new (BRASERO_PLUGIN_IO_ACCEPT_PIPE|
 					BRASERO_PLUGIN_IO_ACCEPT_FILE,
 					BRASERO_IMAGE_FORMAT_BIN);



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