brasero r1804 - in trunk: . libbrasero-media src/plugins/cdrkit src/plugins/growisofs
- From: philippr svn gnome org
- To: svn-commits-list gnome org
- Subject: brasero r1804 - in trunk: . libbrasero-media src/plugins/cdrkit src/plugins/growisofs
- Date: Wed, 21 Jan 2009 21:09:09 +0000 (UTC)
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]