Author: philippr
Date: Wed Feb 13 12:43:46 2008
New Revision: 637
URL: http://svn.gnome.org/viewvc/brasero?rev=637&view=rev

Log:
2008-02-13  Philippe Rouquier  <[EMAIL PROTECTED]>

        Ported some fixes from stable branch
        - Fixed invalid character in .desktop file. Closes bgo #513097 (Luis 
Medinas)
        - better fix for #513742 (Philippe Rouquier)
        fix for a small problem where key sense data wasn\'t correct in some 
cases
        fix for #502703 – Data Integrity Check Always Fails AND Burning Speed 
Slow (except dvd which ignored setting).
        instead of reading volume declared size we correct the size when we 
detect a track written in SAO mode (and a multisession disc)
        this means READ CD scsi function was implemented

        * src/Makefile.am:
        * src/burn-medium.c: (brasero_medium_track_written_SAO),
        (brasero_medium_track_get_info), (brasero_medium_set_track_type),
        (brasero_medium_get_CD_sessions_info),
        (brasero_medium_get_sessions_info), (brasero_medium_get_contents):
        * src/scsi-command.h:
        * src/scsi-error.c:
        * src/scsi-error.h:
        * src/scsi-mmc1.h:
        * src/scsi-opcodes.h:
        * src/scsi-read-toc-pma-atip.h:
        * src/scsi-sense-data.c: (brasero_sense_data_illegal_request):
        * src/scsi-sg.c:
        * src/scsi-utils.h:

Added:
   trunk/src/scsi-read-cd.c
   trunk/src/scsi-read-cd.h
Modified:
   trunk/ChangeLog
   trunk/src/Makefile.am
   trunk/src/burn-medium.c
   trunk/src/scsi-command.h
   trunk/src/scsi-error.c
   trunk/src/scsi-error.h
   trunk/src/scsi-mmc1.h
   trunk/src/scsi-opcodes.h
   trunk/src/scsi-read-toc-pma-atip.h
   trunk/src/scsi-sense-data.c
   trunk/src/scsi-sg.c
   trunk/src/scsi-utils.h

Modified: trunk/src/Makefile.am
==============================================================================
--- trunk/src/Makefile.am       (original)
+++ trunk/src/Makefile.am       Wed Feb 13 12:43:46 2008
@@ -168,6 +168,8 @@
        scsi-dvd-structures.h         \
        scsi-read-format-capacities.c         \
        scsi-read-format-capacities.h         \
+       scsi-read-cd.h  \
+       scsi-read-cd.c  \
        burn-debug.c         \
        burn-debug.h         \
        burn-track.h         \

Modified: trunk/src/burn-medium.c
==============================================================================
--- trunk/src/burn-medium.c     (original)
+++ trunk/src/burn-medium.c     Wed Feb 13 12:43:46 2008
@@ -1111,37 +1111,6 @@
  * Functions to get information about disc contents
  */
 
-static void
-brasero_medium_set_track_type (BraseroMedium *self,
-                              BraseroMediumTrack *track,
-                              guchar control)
-{
-       BraseroMediumPrivate *priv;
-
-       priv = BRASERO_MEDIUM_PRIVATE (self);
-
-       if (control & BRASERO_SCSI_TRACK_COPY)
-               track->type |= BRASERO_MEDIUM_TRACK_COPY;
-
-       if (!(control & BRASERO_SCSI_TRACK_DATA)) {
-               track->type |= BRASERO_MEDIUM_TRACK_AUDIO;
-               priv->info |= BRASERO_MEDIUM_HAS_AUDIO;
-
-               if (control & BRASERO_SCSI_TRACK_PREEMP)
-                       track->type |= BRASERO_MEDIUM_TRACK_PREEMP;
-
-               if (control & BRASERO_SCSI_TRACK_4_CHANNELS)
-                       track->type |= BRASERO_MEDIUM_TRACK_4_CHANNELS;
-       }
-       else {
-               track->type |= BRASERO_MEDIUM_TRACK_DATA;
-               priv->info |= BRASERO_MEDIUM_HAS_DATA;
-
-               if (control & BRASERO_SCSI_TRACK_DATA_INCREMENTAL)
-                       track->type |= BRASERO_MEDIUM_TRACK_INCREMENTAL;
-       }
-}
-
 static BraseroBurnResult
 brasero_medium_track_volume_size (BraseroMedium *self,
                                  BraseroMediumTrack *track,
@@ -1184,8 +1153,64 @@
        return BRASERO_BURN_OK;
 }
 
+static gboolean
+brasero_medium_track_written_SAO (BraseroDeviceHandle *handle,
+                                 int track_num,
+                                 int track_start)
+{
+       unsigned char buffer [2048];
+       BraseroScsiResult result;
+
+       BRASERO_BURN_LOG ("Checking for TDBs in track pregap.");
+
+       /* The two following sectors are readable */
+       result = brasero_mmc1_read_block (handle,
+                                         TRUE,
+                                         BRASERO_SCSI_BLOCK_TYPE_ANY,
+                                         BRASERO_SCSI_BLOCK_HEADER_NONE,
+                                         BRASERO_SCSI_BLOCK_NO_SUBCHANNEL,
+                                         track_start - 1,
+                                         1,
+                                         buffer,
+                                         sizeof (buffer),
+                                         NULL);
+
+       if (result == BRASERO_SCSI_OK) {
+               int i;
+
+               if (buffer [0] != 'T' || buffer [1] != 'D' || buffer [2] != 
'I') {
+                       BRASERO_BURN_LOG ("Track was probably recorded in SAO 
mode - no TDB.");
+                       return TRUE;
+               }
+
+               /* Find the TDU (16 bytes) for the track (there can be for 
other tracks).
+                * i must be < 128 = ((2048 - 8 (size TDB)) / 16 (size TDU). */
+               for (i = 0; i < 128; i ++) {
+                       if (BRASERO_GET_BCD (buffer [8 + i * 16]) != track_num)
+                               break;
+               }
+
+               if (i >= 128) {
+                       BRASERO_BURN_LOG ("No appropriate TDU for track");
+                       return TRUE;
+               }
+
+               if (buffer [8 + i * 16] == 0x80 || buffer [8 + i * 16] == 0x00) 
{
+                       BRASERO_BURN_LOG ("Track was recorded in TAO mode.");
+                       return FALSE;
+               }
+
+               BRASERO_BURN_LOG ("Track was recorded in Packet mode.");
+               return FALSE;
+       }
+
+       BRASERO_BURN_LOG ("No pregap. That track must have been recorded in SAO 
mode.");
+       return TRUE;
+}
+
 static BraseroBurnResult
 brasero_medium_track_get_info (BraseroMedium *self,
+                              gboolean multisession,
                               BraseroMediumTrack *track,
                               int track_num,
                               BraseroDeviceHandle *handle,
@@ -1224,18 +1249,81 @@
        track->blocks_num = BRASERO_GET_32 (track_info.track_size);
        track->session = BRASERO_SCSI_SESSION_NUM (track_info);
 
-       /* Now here is a potential bug: we can write tracks (data or not)
-        * shorter than 300 Kio /2 sec but they will be padded to reach this
-        * floor value. That means that is blocks_num is 300 blocks that may
-        * mean that the data length on the track is actually shorter.
-        * So we read the volume descriptor. If it works, good otherwise
-        * use the old value.
-        * That's important for checksuming to have a perfect account of the 
-        * data size. */
        if (track->blocks_num <= 300) {
+               /* Now here is a potential bug: we can write tracks (data or
+                * not) shorter than 300 Kio /2 sec but they will be padded to
+                * reach this floor value. It means that blocks_num is always
+                * 300 blocks even if the data length on the track is actually
+                * shorter.
+                * So we read the volume descriptor. If it works, good otherwise
+                * use the old value.
+                * That's important for checksuming to have a perfect account of
+                * the data size. */
                BRASERO_BURN_LOG ("300 sectors size. Checking for real size");
                brasero_medium_track_volume_size (self, track, handle);
        }
+       /* NOTE: for multisession CDs only
+        * if the session was incremental (TAO/packet/...) by opposition to DAO
+        * and SAO, then 2 blocks (run-out) have been added at the end of user
+        * track for linking. That's why we have 2 additional sectors when the
+        * track has been recorded in TAO mode
+        * See MMC5
+        * 6.44.3.2 CD-R Fixed Packet, Variable Packet, Track-At-Once
+        * Now, strangely track_get_info always removes two blocks, whereas read
+        * raw toc adds them (always) and this, whatever the mode, the position.
+        * It means that when we detect a SAO session we have to add 2 blocks to
+        * all tracks in it. 
+        * See # for any information:
+        * if first track is recorded in SAO/DAO then the length will be two sec
+        * shorter. If not, if it was recorded in TAO, that's fine.
+        * The other way would be to use read raw toc but then that's the
+        * opposite that happens and that latter will return two more bytes for
+        * TAO recorded session.
+        * So there are 2 workarounds:
+        * - read the volume size (can be unreliable)
+        * - read the 2 last blocks and see if they are run-outs
+        * here we do solution 2 but only for CDRW, not blank, and for first
+        * session only since that's the only one that can be recorded in DAO. 
*/
+       else if (track->session == 1
+            && (track->type & BRASERO_MEDIUM_TRACK_DATA)
+            &&  multisession
+            &&  (priv->info & BRASERO_MEDIUM_CD)
+            && !(priv->info & BRASERO_MEDIUM_ROM)) {
+               BRASERO_BURN_LOG ("Data track belongs to first session of 
multisession CD. "
+                                 "Checking for real size (%i sectors 
currently).",
+                                 track->blocks_num);
+
+               /* we test the pregaps blocks for TDB: these are special blocks
+                * filling the pregap of a track when it was recorded as TAO or
+                * as Packet.
+                * NOTE: in this case we need to skip 7 sectors before since if
+                * it was recorded incrementally then there is also 4 runins,
+                * 1 link sector and 2 runouts (at end of pregap). 
+                * we also make sure that the two blocks we're adding are
+                * actually readable. */
+               /* Test the last block, the before last and the one before 
before last */
+               result = brasero_mmc1_read_block (handle,
+                                                 FALSE,
+                                                 BRASERO_SCSI_BLOCK_TYPE_ANY,
+                                                 
BRASERO_SCSI_BLOCK_HEADER_NONE,
+                                                 
BRASERO_SCSI_BLOCK_NO_SUBCHANNEL,
+                                                 track->blocks_num + 
track->start,
+                                                 2,
+                                                 NULL,
+                                                 0,
+                                                 NULL);
+
+               if (result == BRASERO_SCSI_OK) {
+                       BRASERO_BURN_LOG ("Following two sectors are 
readable.");
+
+                       if (brasero_medium_track_written_SAO (handle, 
track_num, track->start)) {
+                               track->blocks_num += 2;
+                               BRASERO_BURN_LOG ("Correcting track size (now 
%i)", track->blocks_num);
+                       }
+               }
+               else
+                       BRASERO_BURN_LOG ("Detected runouts");
+       }
 
        if (track_info.next_wrt_address_valid)
                priv->next_wr_add = BRASERO_GET_32 
(track_info.next_wrt_address);
@@ -1250,6 +1338,39 @@
        return BRASERO_BURN_OK;
 }
 
+#if 0
+
+static void
+brasero_medium_set_track_type (BraseroMedium *self,
+                              BraseroMediumTrack *track,
+                              guchar control)
+{
+       BraseroMediumPrivate *priv;
+
+       priv = BRASERO_MEDIUM_PRIVATE (self);
+
+       if (control & BRASERO_SCSI_TRACK_COPY)
+               track->type |= BRASERO_MEDIUM_TRACK_COPY;
+
+       if (!(control & BRASERO_SCSI_TRACK_DATA)) {
+               track->type |= BRASERO_MEDIUM_TRACK_AUDIO;
+               priv->info |= BRASERO_MEDIUM_HAS_AUDIO;
+
+               if (control & BRASERO_SCSI_TRACK_PREEMP)
+                       track->type |= BRASERO_MEDIUM_TRACK_PREEMP;
+
+               if (control & BRASERO_SCSI_TRACK_4_CHANNELS)
+                       track->type |= BRASERO_MEDIUM_TRACK_4_CHANNELS;
+       }
+       else {
+               track->type |= BRASERO_MEDIUM_TRACK_DATA;
+               priv->info |= BRASERO_MEDIUM_HAS_DATA;
+
+               if (control & BRASERO_SCSI_TRACK_DATA_INCREMENTAL)
+                       track->type |= BRASERO_MEDIUM_TRACK_INCREMENTAL;
+       }
+}
+
 /**
  * return :
  *  0 when it's not possible to determine (fallback to formatted toc)
@@ -1548,7 +1669,12 @@
                track->start = leadout_start;
                track->type = BRASERO_MEDIUM_TRACK_LEADOUT;
 
-               brasero_medium_track_get_info (self, track, g_slist_length 
(priv->tracks), handle, code); 
+               brasero_medium_track_get_info (self,
+                                              FALSE,
+                                              track,
+                                              g_slist_length (priv->tracks),
+                                              handle,
+                                              code); 
        }
 
        priv->tracks = g_slist_reverse (priv->tracks);
@@ -1575,6 +1701,8 @@
        return BRASERO_BURN_OK;
 }
 
+#endif
+
 /**
  * NOTE: for DVD-R multisession we lose 28688 blocks for each session
  * so the capacity is the addition of all session sizes + 28688 for each
@@ -1622,6 +1750,7 @@
                                  BraseroScsiErrCode *code)
 {
        int num, i, size;
+       gboolean multisession;
        BraseroScsiResult result;
        BraseroScsiTocDesc *desc;
        BraseroMediumPrivate *priv;
@@ -1645,6 +1774,9 @@
        num = (size - sizeof (BraseroScsiFormattedTocData)) /
               sizeof (BraseroScsiTocDesc);
 
+       /* remove 1 for leadout */
+       multisession = (priv->info & BRASERO_MEDIUM_APPENDABLE) || (num -1) != 
1;
+
        BRASERO_BURN_LOG ("%i track(s) found", num);
 
        desc = toc->desc;
@@ -1659,12 +1791,6 @@
                track->start = BRASERO_GET_32 (desc->track_start);
 
                /* we shouldn't request info on a track if the disc is closed */
-               brasero_medium_track_get_info (self,
-                                              track,
-                                              g_slist_length (priv->tracks),
-                                              handle,
-                                              code);
-
                if (desc->control & BRASERO_SCSI_TRACK_COPY)
                        track->type |= BRASERO_MEDIUM_TRACK_COPY;
 
@@ -1678,8 +1804,26 @@
                        if (desc->control & BRASERO_SCSI_TRACK_4_CHANNELS)
                                track->type |= BRASERO_MEDIUM_TRACK_4_CHANNELS;
                }
-               else if (BRASERO_MEDIUM_IS (priv->info, 
BRASERO_MEDIUM_DVDRW_PLUS)
-                    ||  BRASERO_MEDIUM_IS (priv->info, 
BRASERO_MEDIUM_DVDRW_RESTRICTED)) {
+               else {
+                       track->type |= BRASERO_MEDIUM_TRACK_DATA;
+                       priv->info |= BRASERO_MEDIUM_HAS_DATA;
+
+                       if (desc->control & BRASERO_SCSI_TRACK_DATA_INCREMENTAL)
+                               track->type |= BRASERO_MEDIUM_TRACK_INCREMENTAL;
+               }
+
+               brasero_medium_track_get_info (self,
+                                              multisession,
+                                              track,
+                                              g_slist_length (priv->tracks),
+                                              handle,
+                                              code);
+
+               if (desc->control & BRASERO_SCSI_TRACK_COPY)
+                       track->type |= BRASERO_MEDIUM_TRACK_COPY;
+
+               if (BRASERO_MEDIUM_IS (priv->info, BRASERO_MEDIUM_DVDRW_PLUS)
+               ||  BRASERO_MEDIUM_IS (priv->info, 
BRASERO_MEDIUM_DVDRW_RESTRICTED)) {
                        BraseroBurnResult result;
 
                        /* a special case for these two kinds of media (DVD+RW)
@@ -1687,29 +1831,15 @@
                        result = brasero_medium_track_volume_size (self, 
                                                                   track,
                                                                   handle);
-                       if (result == BRASERO_BURN_OK) {
-                               track->type |= BRASERO_MEDIUM_TRACK_DATA;
-                               priv->info |= BRASERO_MEDIUM_HAS_DATA;
-
-                               priv->next_wr_add = 0;
-
-                               if (desc->control & 
BRASERO_SCSI_TRACK_DATA_INCREMENTAL)
-                                       track->type |= 
BRASERO_MEDIUM_TRACK_INCREMENTAL;
-                       }
-                       else {
+                       if (result != BRASERO_BURN_OK) {
                                priv->tracks = g_slist_remove (priv->tracks, 
track);
                                g_free (track);
 
                                priv->info |= BRASERO_MEDIUM_BLANK;
                                priv->info &= ~BRASERO_MEDIUM_CLOSED;
                        }
-               }
-               else {
-                       track->type |= BRASERO_MEDIUM_TRACK_DATA;
-                       priv->info |= BRASERO_MEDIUM_HAS_DATA;
-
-                       if (desc->control & BRASERO_SCSI_TRACK_DATA_INCREMENTAL)
-                               track->type |= BRASERO_MEDIUM_TRACK_INCREMENTAL;
+                       else
+                               priv->next_wr_add = 0;
                }
        }
 
@@ -1730,6 +1860,7 @@
                track->type = BRASERO_MEDIUM_TRACK_LEADOUT;
 
                brasero_medium_track_get_info (self,
+                                              FALSE,
                                               track,
                                               g_slist_length (priv->tracks),
                                               handle,
@@ -1787,6 +1918,7 @@
                        priv->tracks = g_slist_prepend (priv->tracks, track);
                        
                        brasero_medium_track_get_info (self,
+                                                      FALSE,
                                                       track,
                                                       1,
                                                       handle,
@@ -1804,21 +1936,12 @@
                BRASERO_BURN_LOG ("Closed media");
        }
 
-       if (priv->info & BRASERO_MEDIUM_CD) {
-               result = brasero_medium_get_CD_sessions_info (self, handle, 
code);
-               if (result != BRASERO_BURN_OK)
-                       result = brasero_medium_get_sessions_info (self, 
handle, code);
-       }
-       else
-               result = brasero_medium_get_sessions_info (self, handle, code);
-
-       if (result != BRASERO_BURN_OK)
-               goto end;
+       result = brasero_medium_get_sessions_info (self, handle, code);
 
 end:
 
        g_free (info);
-       return BRASERO_BURN_OK;
+       return result;
 }
 
 static void

Modified: trunk/src/scsi-command.h
==============================================================================
--- trunk/src/scsi-command.h    (original)
+++ trunk/src/scsi-command.h    Wed Feb 13 12:43:46 2008
@@ -51,8 +51,6 @@
 };
 typedef struct _BraseroScsiCmdInfo BraseroScsiCmdInfo;
 
-typedef struct _BraseroScsiCmd BraseroScsiCmd;
-
 #define BRASERO_SCSI_COMMAND_DEFINE(cdb, name, fd_flags, direction)            
\
 static const BraseroScsiCmdInfo info =                                         
\
 {      /* SCSI commands always end by 1 byte of ctl */                         
\

Modified: trunk/src/scsi-error.c
==============================================================================
--- trunk/src/scsi-error.c      (original)
+++ trunk/src/scsi-error.c      Wed Feb 13 12:43:46 2008
@@ -38,6 +38,7 @@
                                        N_("invalid field in command"),
                                        N_("the device timed out"),
                                        N_("key not established"),
+                                       N_("invalid track mode"),
                                        NULL    };      /* errno */
 
 const gchar *

Modified: trunk/src/scsi-error.h
==============================================================================
--- trunk/src/scsi-error.h      (original)
+++ trunk/src/scsi-error.h      Wed Feb 13 12:43:46 2008
@@ -51,6 +51,7 @@
        BRASERO_SCSI_INVALID_FIELD,
        BRASERO_SCSI_TIMEOUT,
        BRASERO_SCSI_KEY_NOT_ESTABLISHED,
+       BRASERO_SCSI_INVALID_TRACK_MODE,
        BRASERO_SCSI_ERRNO,
        BRASERO_SCSI_ERROR_LAST
 } BraseroScsiErrCode;

Modified: trunk/src/scsi-mmc1.h
==============================================================================
--- trunk/src/scsi-mmc1.h       (original)
+++ trunk/src/scsi-mmc1.h       Wed Feb 13 12:43:46 2008
@@ -27,6 +27,7 @@
 #include "scsi-base.h"
 #include "scsi-device.h"
 #include "scsi-error.h"
+#include "scsi-read-cd.h"
 #include "scsi-read-disc-info.h"
 #include "scsi-read-toc-pma-atip.h"
 #include "scsi-read-track-information.h"
@@ -68,6 +69,18 @@
                              int *size,
                              BraseroScsiErrCode *error);
 
+BraseroScsiResult
+brasero_mmc1_read_block (BraseroDeviceHandle *handle,
+                        gboolean user_data,
+                        BraseroScsiBlockType type,
+                        BraseroScsiBlockHeader header,
+                        BraseroScsiBlockSubChannel channel,
+                        int start,
+                        int size,
+                        unsigned char *buffer,
+                        int buffer_len,
+                        BraseroScsiErrCode *error);
+
 G_END_DECLS
 
 #endif /* _BURN_MMC1_H */

Modified: trunk/src/scsi-opcodes.h
==============================================================================
--- trunk/src/scsi-opcodes.h    (original)
+++ trunk/src/scsi-opcodes.h    Wed Feb 13 12:43:46 2008
@@ -52,6 +52,8 @@
 #define BRASERO_READ_SUB_CHANNEL_OPCODE                        0x42
 #define BRASERO_READ_MASTER_CUE_OPCODE                 0x59
 
+#define BRASERO_READ_CD_OPCODE                         0xBE
+
 /**
  *     MMC2
  */

Added: trunk/src/scsi-read-cd.c
==============================================================================
--- (empty file)
+++ trunk/src/scsi-read-cd.c    Wed Feb 13 12:43:46 2008
@@ -0,0 +1,146 @@
+/***************************************************************************
+ *            scsi-read-cd.c
+ *
+ *  Sun Jan 27 20:39:40 2008
+ *  Copyright  2008  Philippe Rouquier
+ *  <[EMAIL PROTECTED]>
+ ****************************************************************************/
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Library General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor Boston, MA 02110-1301,  
USA
+ */
+
+#include <fcntl.h>
+
+#include <glib.h>
+
+#include "scsi-error.h"
+#include "scsi-utils.h"
+#include "scsi-base.h"
+#include "scsi-command.h"
+#include "scsi-opcodes.h"
+#include "scsi-read-cd.h"
+
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+
+struct _BraseroReadCDCDB {
+       uchar opcode;
+
+       uchar rel_add           :1;
+       uchar reserved1         :1;
+       uchar sec_type          :3;
+       uchar reserved0         :3;
+
+       uchar start_lba         [4];
+       uchar len               [3];
+
+       uchar reserved2         :1;
+       uchar error             :2;
+       uchar edc               :1;
+       uchar user_data         :1;
+       uchar header            :2;
+       uchar sync              :1;
+
+       uchar subchannel        :3;
+       uchar reserved3         :5;
+
+       uchar ctl;
+};
+
+#else
+
+struct _BraseroReadCDCDB {
+       uchar opcode;
+
+       uchar reserved0         :3;
+       uchar sec_type          :3;
+       uchar reserved1         :1;
+       uchar rel_add           :1;
+
+       uchar start_lba         [4];
+       uchar len               [3];
+
+       uchar sync              :1;
+       uchar header            :2;
+       uchar user_data         :1;
+       uchar edc               :1;
+       uchar error             :2;
+       uchar reserved2         :1;
+
+       uchar reserved3         :5;
+       uchar subchannel        :3;
+
+       uchar ctl;
+};
+
+#endif
+
+typedef struct _BraseroReadCDCDB BraseroReadCDCDB;
+
+BRASERO_SCSI_COMMAND_DEFINE (BraseroReadCDCDB,
+                            READ_CD,
+                            O_RDONLY,
+                            BRASERO_SCSI_READ);
+
+BraseroScsiResult
+brasero_mmc1_read_block (BraseroDeviceHandle *handle,
+                        gboolean user_data,
+                        BraseroScsiBlockType type,
+                        BraseroScsiBlockHeader header,
+                        BraseroScsiBlockSubChannel channel,
+                        int start,
+                        int size,
+                        unsigned char *buffer,
+                        int buffer_len,
+                        BraseroScsiErrCode *error)
+{
+       BraseroReadCDCDB *cdb;
+       BraseroScsiResult res;
+
+       cdb = brasero_scsi_command_new (&info, handle);
+       BRASERO_SET_32 (cdb->start_lba, start);
+
+       /* NOTE: if we just want to test if block is readable len can be 0 */
+       BRASERO_SET_24 (cdb->len, size);
+
+       /* reladr should be O */
+       /* no sync field included */
+       cdb->sync = 0;
+
+       /* no filtering */
+       cdb->sec_type = type;
+
+       /* header ?*/
+       cdb->header = header;
+
+       /* returns user data ?*/
+       cdb->user_data = user_data;
+
+       /* no EDC */
+       /* no error/C2 error */
+
+       /* subchannel */
+       cdb->subchannel = channel;
+
+       if (buffer)
+               memset (buffer, 0, buffer_len);
+
+       res = brasero_scsi_command_issue_sync (cdb,
+                                              buffer,
+                                              buffer_len,
+                                              error);
+
+       return res;
+}

Added: trunk/src/scsi-read-cd.h
==============================================================================
--- (empty file)
+++ trunk/src/scsi-read-cd.h    Wed Feb 13 12:43:46 2008
@@ -0,0 +1,58 @@
+/***************************************************************************
+ *            scsi-read-cd.h
+ *
+ *  Sun Jan 27 20:39:17 2008
+ *  Copyright  2008  Philippe Rouquier
+ *  <[EMAIL PROTECTED]>
+ ****************************************************************************/
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Library General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor Boston, MA 02110-1301,  
USA
+ */
+ 
+#ifndef _SCSI_READ_CD_H
+#define _SCSI_READ_CD_H
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+
+typedef enum {
+       BRASERO_SCSI_BLOCK_HEADER_NONE          = 0,
+       BRASERO_SCSI_BLOCK_HEADER_MAIN          = 1,
+       BRASERO_SCSI_BLOCK_HEADER_SUB           = 1 << 1
+} BraseroScsiBlockHeader;
+
+typedef enum {
+       BRASERO_SCSI_BLOCK_TYPE_ANY             = 0,
+       BRASERO_SCSI_BLOCK_TYPE_CDDA            = 1,
+       BRASERO_SCSI_BLOCK_TYPE_MODE1           = 2,
+       BRASERO_SCSI_BLOCK_TYPE_MODE2_FORMLESS  = 3,
+       BRASERO_SCSI_BLOCK_TYPE_MODE2_FORM1     = 4,
+       BRASERO_SCSI_BLOCK_TYPE_MODE2_FORM2     = 5
+} BraseroScsiBlockType;
+
+typedef enum {
+       BRASERO_SCSI_BLOCK_NO_SUBCHANNEL        = 0,
+       BRASERO_SCSI_BLOCK_SUB_Q                = 2,
+       BRASERO_SCSI_BLOCK_SUB_R_W              = 4
+} BraseroScsiBlockSubChannel;
+
+
+G_END_DECLS
+
+#endif /* _SCSI_READ_CD_H */
+

Modified: trunk/src/scsi-read-toc-pma-atip.h
==============================================================================
--- trunk/src/scsi-read-toc-pma-atip.h  (original)
+++ trunk/src/scsi-read-toc-pma-atip.h  Wed Feb 13 12:43:46 2008
@@ -29,10 +29,7 @@
 #ifndef _SCSI_READ_TOC_PMA_ATIP_H
 #define _SCSI_READ_TOC_PMA_ATIP_H
 
-#ifdef __cplusplus
-extern "C"
-{
-#endif
+G_BEGIN_DECLS
 
 #if G_BYTE_ORDER == G_LITTLE_ENDIAN
 
@@ -328,8 +325,6 @@
 
 #define BRASERO_SCSI_TRACK_LEADOUT_START       0xAA
 
-#ifdef __cplusplus
-}
-#endif
+G_END_DECLS
 
 #endif /* _SCSI_READ_TOC_PMA_ATIP_H */

Modified: trunk/src/scsi-sense-data.c
==============================================================================
--- trunk/src/scsi-sense-data.c (original)
+++ trunk/src/scsi-sense-data.c Wed Feb 13 12:43:46 2008
@@ -39,7 +39,7 @@
  * (defined in SCSI Primary command 3 / SPC specs)
  **/
 
-#define SENSE_DATA_KEY(sense)                  ((sense) ? (sense) [2] & 0xFF : 
0x00)                   /* Sense code itself */
+#define SENSE_DATA_KEY(sense)                  ((sense) ? (sense) [2] & 0x0F : 
0x00)                   /* Sense code itself */
 #define SENSE_DATA_ASC(sense)                  ((sense) ? (sense) [12] : 0x00) 
                        /* Additional Sense Code */
 #define SENSE_DATA_ASCQ(sense)                 ((sense) ? (sense) [13] : 0x00) 
                        /* Additional Sense Code Qualifier */
 #define SENSE_DATA_ASC_ASCQ(sense)             ((sense) ? (sense) [12] << 8 | 
(sense) [13] : 0x00)     /* ASC and ASCQ combined */
@@ -60,6 +60,7 @@
 #define ASC_ASCQ_CODE_INSUFFICIENT_TIME_FOR_OPERATION  0x2E00
 #define ASC_ASCQ_CODE_KEY_NOT_ESTABLISHED              0x6F02
 #define ASC_ASCQ_CODE_SCRAMBLED_SECTOR                 0x6F03
+#define ASC_ASCQ_CODE_INVALID_TRACK_MODE               0x6400
 
 /**
  * error processing 
@@ -138,6 +139,10 @@
                        BRASERO_SCSI_SET_ERRCODE (err, 
BRASERO_SCSI_KEY_NOT_ESTABLISHED);
                        break;
 
+               case ASC_ASCQ_CODE_INVALID_TRACK_MODE:
+                       BRASERO_SCSI_SET_ERRCODE (err, 
BRASERO_SCSI_INVALID_TRACK_MODE);
+                       break;
+
                default:
                        res = brasero_sense_data_unknown (sense_data, err);
                        break;

Modified: trunk/src/scsi-sg.c
==============================================================================
--- trunk/src/scsi-sg.c (original)
+++ trunk/src/scsi-sg.c Wed Feb 13 12:43:46 2008
@@ -57,6 +57,7 @@
 
        const BraseroScsiCmdInfo *info;
 };
+typedef struct _BraseroScsiCmd BraseroScsiCmd;
 
 #define BRASERO_SCSI_CMD_OPCODE_OFF                    0
 #define BRASERO_SCSI_CMD_SET_OPCODE(command)           (command->cmd 
[BRASERO_SCSI_CMD_OPCODE_OFF] = command->info->opcode)

Modified: trunk/src/scsi-utils.h
==============================================================================
--- trunk/src/scsi-utils.h      (original)
+++ trunk/src/scsi-utils.h      Wed Feb 13 12:43:46 2008
@@ -40,6 +40,7 @@
 
 #define BRASERO_SET_BCD(data, num)     
(uchar)(data)=((((num)/10)<<4)&0xF0)|((num)-(((num)/10)*10))
 #define BRASERO_SET_16(data, num)      
(data)[0]=(((num)>>8)&0xFF);(data)[1]=(uchar)((num)&0xFF)
+#define BRASERO_SET_24(data, num)      
(data)[0]=(uchar)(((num)>>16)&0xFF);(data)[1]=(uchar)(((num)>>8)&0xFF);(data)[2]=(uchar)((num)&0xFF);
 #define BRASERO_SET_32(data, num)      
(data)[0]=(uchar)(((num)>>24)&0xFF);(data)[1]=(uchar)(((num)>>16)&0xFF);(data)[2]=(uchar)(((num)>>8)&0xFF);(data)[3]=(uchar)((num)&0xFF)
 
 #define BRASERO_MSF_TO_LBA(minute, second, frame)      
(((minute)*60+(second))*75+frame)
_______________________________________________
SVN-commits-list mailing list (read only)
http://mail.gnome.org/mailman/listinfo/svn-commits-list

Want to limit the commits to a few modules? Go to above URL, log in to edit 
your options and select the modules ('topics') you want.
Module maintainer? It is possible to set the reply-to to your development 
mailing list. Email [EMAIL PROTECTED] if interested.

Reply via email to