Author: philippr
Date: Mon Feb 11 19:23:03 2008
New Revision: 634
URL: http://svn.gnome.org/viewvc/brasero?rev=634&view=rev

Log:
        A few changes to support new OS more easily

        * configure.in:
        * src/Makefile.am:
        * src/burn-medium.c: (brasero_medium_get_capacity_CD_RW),
        (brasero_medium_get_capacity_DVD_RW),
        (brasero_medium_get_capacity_by_type),
        (brasero_medium_get_speed_mmc3),
        (brasero_medium_get_page_2A_write_speed_desc),
        (brasero_medium_get_page_2A_max_speed),
        (brasero_medium_get_medium_type), (brasero_medium_get_css_feature),
        (brasero_medium_track_volume_size),
        (brasero_medium_track_get_info), (brasero_medium_check_BCD_use),
        (brasero_medium_get_CD_sessions_info),
        (brasero_medium_get_sessions_info), (brasero_medium_get_contents),
        (brasero_medium_init_real), (brasero_medium_retry_open),
        (brasero_medium_try_open):
        * src/scsi-base.h:
        * src/scsi-command.h:
        * src/scsi-device.h:
        * src/scsi-error.c:
        * src/scsi-get-configuration.c:
        (brasero_mmc2_get_configuration_feature):
        * src/scsi-get-performance.c:
        (brasero_mmc3_get_performance_wrt_spd_desc):
        * src/scsi-mmc1.h:
        * src/scsi-mmc2.h:
        * src/scsi-mmc3.h:
        * src/scsi-mode-pages.h:
        * src/scsi-mode-sense.c: (brasero_spc1_mode_sense_get_page):
        * src/scsi-read-capacity.c: (brasero_mmc2_read_capacity):
        * src/scsi-read-disc-info.c:
        (brasero_mmc1_read_disc_information_std),
        (brasero_mmc5_read_disc_information_tracks),
        (brasero_mmc5_read_disc_information_pows):
        * src/scsi-read-disc-structure.c:
        (brasero_mmc2_read_generic_structure),
        (brasero_mmc2_read_dvd_structure),
        (brasero_mmc5_read_bd_structure):
        * src/scsi-read-format-capacities.c:
        (brasero_mmc2_read_format_capacities):
        * src/scsi-read-toc-pma-atip.c: (brasero_mmc1_read_toc_formatted),
        (brasero_mmc1_read_toc_raw), (brasero_mmc3_read_cd_text),
        (brasero_mmc1_read_atip):
        * src/scsi-read-track-information.c:
        (brasero_mmc1_read_track_info):
        * src/scsi-sg.c: (brasero_sg_command_setup),
        (brasero_scsi_command_issue_sync), (brasero_scsi_command_new),
        (brasero_scsi_command_free), (brasero_device_handle_open),
        (brasero_device_handle_close), (brasero_device_handle_get_fd):
        * src/scsi-spc1.h:
        * src/scsi/scsi-base.h:
        * src/scsi/scsi-command.c:
        * src/scsi/scsi-command.h:
        * src/scsi/scsi-dvd-structures.h:
        * src/scsi/scsi-error.c:
        * src/scsi/scsi-error.h:
        * src/scsi/scsi-get-configuration.c:
        * src/scsi/scsi-get-configuration.h:
        * src/scsi/scsi-get-performance.c:
        * src/scsi/scsi-get-performance.h:
        * src/scsi/scsi-mmc1.h:
        * src/scsi/scsi-mmc2.h:
        * src/scsi/scsi-mmc3.h:
        * src/scsi/scsi-mode-pages.h:
        * src/scsi/scsi-mode-sense.c:
        * src/scsi/scsi-opcodes.h:
        * src/scsi/scsi-q-subchannel.h:
        * src/scsi/scsi-read-capacity.c:
        * src/scsi/scsi-read-capacity.h:
        * src/scsi/scsi-read-disc-info.c:
        * src/scsi/scsi-read-disc-info.h:
        * src/scsi/scsi-read-disc-structure.c:
        * src/scsi/scsi-read-disc-structure.h:
        * src/scsi/scsi-read-format-capacities.c:
        * src/scsi/scsi-read-format-capacities.h:
        * src/scsi/scsi-read-toc-pma-atip.c:
        * src/scsi/scsi-read-toc-pma-atip.h:
        * src/scsi/scsi-read-track-information.c:
        * src/scsi/scsi-read-track-information.h:
        * src/scsi/scsi-sense-data.c:
        * src/scsi/scsi-sense-data.h:
        * src/scsi/scsi-sg.c:
        * src/scsi/scsi-sg.h:
        * src/scsi/scsi-spc1.h:
        * src/scsi/scsi-status-page.h:
        * src/scsi/scsi-utils.h:

Added:
   trunk/src/scsi-base.h
      - copied, changed from r632, /trunk/src/scsi/scsi-base.h
   trunk/src/scsi-command.h
      - copied, changed from r632, /trunk/src/scsi/scsi-command.h
   trunk/src/scsi-device.h
   trunk/src/scsi-dvd-structures.h
      - copied unchanged from r632, /trunk/src/scsi/scsi-dvd-structures.h
   trunk/src/scsi-error.c
      - copied, changed from r632, /trunk/src/scsi/scsi-error.c
   trunk/src/scsi-error.h
      - copied unchanged from r632, /trunk/src/scsi/scsi-error.h
   trunk/src/scsi-get-configuration.c
      - copied, changed from r632, /trunk/src/scsi/scsi-get-configuration.c
   trunk/src/scsi-get-configuration.h
      - copied unchanged from r632, /trunk/src/scsi/scsi-get-configuration.h
   trunk/src/scsi-get-performance.c
      - copied, changed from r632, /trunk/src/scsi/scsi-get-performance.c
   trunk/src/scsi-get-performance.h
      - copied unchanged from r632, /trunk/src/scsi/scsi-get-performance.h
   trunk/src/scsi-mmc1.h
      - copied, changed from r632, /trunk/src/scsi/scsi-mmc1.h
   trunk/src/scsi-mmc2.h
      - copied, changed from r632, /trunk/src/scsi/scsi-mmc2.h
   trunk/src/scsi-mmc3.h
      - copied, changed from r632, /trunk/src/scsi/scsi-mmc3.h
   trunk/src/scsi-mode-pages.h
   trunk/src/scsi-mode-sense.c
      - copied, changed from r632, /trunk/src/scsi/scsi-mode-sense.c
   trunk/src/scsi-opcodes.h
      - copied unchanged from r632, /trunk/src/scsi/scsi-opcodes.h
   trunk/src/scsi-q-subchannel.h
      - copied unchanged from r632, /trunk/src/scsi/scsi-q-subchannel.h
   trunk/src/scsi-read-capacity.c
      - copied, changed from r632, /trunk/src/scsi/scsi-read-capacity.c
   trunk/src/scsi-read-capacity.h
      - copied unchanged from r632, /trunk/src/scsi/scsi-read-capacity.h
   trunk/src/scsi-read-disc-info.c
      - copied, changed from r632, /trunk/src/scsi/scsi-read-disc-info.c
   trunk/src/scsi-read-disc-info.h
      - copied unchanged from r632, /trunk/src/scsi/scsi-read-disc-info.h
   trunk/src/scsi-read-disc-structure.c
      - copied, changed from r632, /trunk/src/scsi/scsi-read-disc-structure.c
   trunk/src/scsi-read-disc-structure.h
      - copied unchanged from r632, /trunk/src/scsi/scsi-read-disc-structure.h
   trunk/src/scsi-read-format-capacities.c
      - copied, changed from r632, /trunk/src/scsi/scsi-read-format-capacities.c
   trunk/src/scsi-read-format-capacities.h
      - copied unchanged from r632, 
/trunk/src/scsi/scsi-read-format-capacities.h
   trunk/src/scsi-read-toc-pma-atip.c
      - copied, changed from r632, /trunk/src/scsi/scsi-read-toc-pma-atip.c
   trunk/src/scsi-read-toc-pma-atip.h
      - copied unchanged from r632, /trunk/src/scsi/scsi-read-toc-pma-atip.h
   trunk/src/scsi-read-track-information.c
      - copied, changed from r632, /trunk/src/scsi/scsi-read-track-information.c
   trunk/src/scsi-read-track-information.h
      - copied unchanged from r632, 
/trunk/src/scsi/scsi-read-track-information.h
   trunk/src/scsi-sense-data.c
      - copied unchanged from r632, /trunk/src/scsi/scsi-sense-data.c
   trunk/src/scsi-sense-data.h
      - copied unchanged from r632, /trunk/src/scsi/scsi-sense-data.h
   trunk/src/scsi-sg.c
      - copied, changed from r632, /trunk/src/scsi/scsi-sg.c
   trunk/src/scsi-spc1.h
      - copied, changed from r632, /trunk/src/scsi/scsi-spc1.h
   trunk/src/scsi-status-page.h
      - copied unchanged from r632, /trunk/src/scsi/scsi-status-page.h
   trunk/src/scsi-utils.h
      - copied unchanged from r632, /trunk/src/scsi/scsi-utils.h
Removed:
   trunk/src/scsi/
Modified:
   trunk/ChangeLog
   trunk/configure.in
   trunk/po/ChangeLog
   trunk/po/POTFILES.in
   trunk/src/Makefile.am
   trunk/src/burn-medium.c

Modified: trunk/configure.in
==============================================================================
--- trunk/configure.in  (original)
+++ trunk/configure.in  Mon Feb 11 19:23:03 2008
@@ -38,6 +38,17 @@
 AM_PROG_CC_STDC
 AC_HEADER_STDC
 
+dnl ***************** SCSI related *****************************
+
+dnl ***************** check for linux sg interface *************
+AC_CHECK_TYPES([sg_io_hdr_t],[has_sg="yes"],[has_sg="no"],
+[#include <sys/types.h>
+ #include <scsi/sg.h>])
+
+if test x"$has_sg" = "xno"; then
+       AC_ERROR([Linux sg interface headers could not be found])
+fi
+
 dnl ***************** LARGE FILE SUPPORT ***********************
 
 AC_SYS_LARGEFILE

Modified: trunk/po/POTFILES.in
==============================================================================
--- trunk/po/POTFILES.in        (original)
+++ trunk/po/POTFILES.in        Mon Feb 11 19:23:03 2008
@@ -71,7 +71,7 @@
 src/plugins/libburnia/burn-libread-disc.c
 src/plugins/local-track/burn-local-image.c
 src/plugins/transcode/burn-transcode.c
-src/scsi/scsi-error.c
+src/scsi-error.c
 src/brasero-preview.c
 src/brasero-split-dialog.c
 src/brasero-time-button.c

Modified: trunk/src/Makefile.am
==============================================================================
--- trunk/src/Makefile.am       (original)
+++ trunk/src/Makefile.am       Mon Feb 11 19:23:03 2008
@@ -9,8 +9,6 @@
 INCLUDES = \
        -I$(top_srcdir)                                                 \
        -I$(top_builddir)                                               \
-       -I./scsi                                                        \
-       -I./md5                                                         \
        -DBRASERO_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\"      \
        -DBRASERO_PREFIX=\"$(prefix)\"                                  \
        -DBRASERO_SYSCONFDIR=\"$(sysconfdir)\"                          \
@@ -136,42 +134,40 @@
        burn-iso-field.h         \
        burn-medium.h         \
        burn-medium.c         \
-       scsi/scsi-base.h         \
-       scsi/scsi-command.c         \
-       scsi/scsi-command.h         \
-       scsi/scsi-error.h         \
-       scsi/scsi-get-configuration.c         \
-       scsi/scsi-get-configuration.h         \
-       scsi/scsi-mmc1.h         \
-       scsi/scsi-mmc2.h         \
-       scsi/scsi-opcodes.h         \
-       scsi/scsi-read-disc-info.c         \
-       scsi/scsi-read-disc-info.h         \
-       scsi/scsi-read-toc-pma-atip.c         \
-       scsi/scsi-read-toc-pma-atip.h         \
-       scsi/scsi-sense-data.c         \
-       scsi/scsi-sense-data.h         \
-       scsi/scsi-sg.c         \
-       scsi/scsi-sg.h         \
-       scsi/scsi-utils.h         \
-       scsi/scsi-q-subchannel.h         \
-       scsi/scsi-error.c         \
-       scsi/scsi-read-track-information.c         \
-       scsi/scsi-read-track-information.h         \
-       scsi/scsi-get-performance.c         \
-       scsi/scsi-get-performance.h         \
-       scsi/scsi-mmc3.h         \
-       scsi/scsi-mode-pages.h         \
-       scsi/scsi-mode-sense.c         \
-       scsi/scsi-status-page.h         \
-       scsi/scsi-spc1.h         \
-       scsi/scsi-read-capacity.c         \
-       scsi/scsi-read-capacity.h         \
-       scsi/scsi-read-disc-structure.c         \
-       scsi/scsi-read-disc-structure.h         \
-       scsi/scsi-dvd-structures.h         \
-       scsi/scsi-read-format-capacities.c         \
-       scsi/scsi-read-format-capacities.h         \
+       scsi-base.h         \
+       scsi-command.h         \
+       scsi-error.h         \
+       scsi-get-configuration.c         \
+       scsi-get-configuration.h         \
+       scsi-mmc1.h         \
+       scsi-mmc2.h         \
+       scsi-opcodes.h         \
+       scsi-read-disc-info.c         \
+       scsi-read-disc-info.h         \
+       scsi-read-toc-pma-atip.c         \
+       scsi-read-toc-pma-atip.h         \
+       scsi-sense-data.c         \
+       scsi-sense-data.h         \
+       scsi-sg.c         \
+       scsi-utils.h         \
+       scsi-q-subchannel.h         \
+       scsi-error.c         \
+       scsi-read-track-information.c         \
+       scsi-read-track-information.h         \
+       scsi-get-performance.c         \
+       scsi-get-performance.h         \
+       scsi-mmc3.h         \
+       scsi-mode-pages.h         \
+       scsi-mode-sense.c         \
+       scsi-status-page.h         \
+       scsi-spc1.h         \
+       scsi-read-capacity.c         \
+       scsi-read-capacity.h         \
+       scsi-read-disc-structure.c         \
+       scsi-read-disc-structure.h         \
+       scsi-dvd-structures.h         \
+       scsi-read-format-capacities.c         \
+       scsi-read-format-capacities.h         \
        burn-debug.c         \
        burn-debug.h         \
        burn-track.h         \
@@ -237,9 +233,11 @@
        brasero-disc-message.h         \
        brasero-disc-message.c         \
        baobab-cell-renderer-progress.c         \
-       baobab-cell-renderer-progress.h 
+       baobab-cell-renderer-progress.h         \
+       scsi-device.h 
 
-brasero_LDADD = $(BRASERO_LIBS)
+brasero_LDADD =        \
+       $(BRASERO_LIBS)
 
 
 

Modified: trunk/src/burn-medium.c
==============================================================================
--- trunk/src/burn-medium.c     (original)
+++ trunk/src/burn-medium.c     Mon Feb 11 19:23:03 2008
@@ -39,6 +39,8 @@
 #include "burn-basics.h"
 #include "burn-debug.h"
 #include "burn-medium.h"
+
+#include "scsi-device.h"
 #include "scsi-mmc1.h"
 #include "scsi-mmc2.h"
 #include "scsi-mmc3.h"
@@ -113,7 +115,6 @@
  * No exclusive at the moment since when the medium is mounted we can't use 
excl
  */
 
-#define OPEN_FLAGS                     O_RDONLY /*|O_EXCL */|O_NONBLOCK
 #define BUSY_RETRY_TIME                        1000
 
 enum
@@ -511,7 +512,7 @@
 
 static BraseroBurnResult
 brasero_medium_get_capacity_CD_RW (BraseroMedium *self,
-                                  int fd,
+                                  BraseroDeviceHandle *handle,
                                   BraseroScsiErrCode *code)
 {
        BraseroScsiAtipData *atip_data = NULL;
@@ -523,7 +524,7 @@
 
        BRASERO_BURN_LOG ("Retrieving capacity from atip");
 
-       result = brasero_mmc1_read_atip (fd,
+       result = brasero_mmc1_read_atip (handle,
                                         &atip_data,
                                         &size,
                                         NULL);
@@ -556,7 +557,7 @@
 
 static BraseroBurnResult
 brasero_medium_get_capacity_DVD_RW (BraseroMedium *self,
-                                   int fd,
+                                   BraseroDeviceHandle *handle,
                                    BraseroScsiErrCode *code)
 {
        BraseroScsiFormatCapacitiesHdr *hdr = NULL;
@@ -568,7 +569,7 @@
        BRASERO_BURN_LOG ("Retrieving format capacity");
 
        priv = BRASERO_MEDIUM_PRIVATE (self);
-       result = brasero_mmc2_read_format_capacities (fd,
+       result = brasero_mmc2_read_format_capacities (handle,
                                                      &hdr,
                                                      &size,
                                                      code);
@@ -626,7 +627,7 @@
 
 static BraseroBurnResult
 brasero_medium_get_capacity_by_type (BraseroMedium *self,
-                                    int fd,
+                                    BraseroDeviceHandle *handle,
                                     BraseroScsiErrCode *code)
 {
        BraseroMediumPrivate *priv;
@@ -639,9 +640,9 @@
                return BRASERO_BURN_OK;
 
        if (priv->info & BRASERO_MEDIUM_CD)
-               brasero_medium_get_capacity_CD_RW (self, fd, code);
+               brasero_medium_get_capacity_CD_RW (self, handle, code);
        else
-               brasero_medium_get_capacity_DVD_RW (self, fd, code);
+               brasero_medium_get_capacity_DVD_RW (self, handle, code);
 
        return BRASERO_BURN_OK;
 }
@@ -652,7 +653,7 @@
 
 static BraseroBurnResult
 brasero_medium_get_speed_mmc3 (BraseroMedium *self,
-                              int fd,
+                              BraseroDeviceHandle *handle,
                               BraseroScsiErrCode *code)
 {
        int size;
@@ -668,7 +669,7 @@
        /* NOTE: this only work if there is RT streaming feature with
         * wspd bit set to 1. At least an MMC3 drive. */
        priv = BRASERO_MEDIUM_PRIVATE (self);
-       result = brasero_mmc3_get_performance_wrt_spd_desc (fd,
+       result = brasero_mmc3_get_performance_wrt_spd_desc (handle,
                                                            &wrt_perf,
                                                            &size,
                                                            code);
@@ -719,7 +720,7 @@
 
 static BraseroBurnResult
 brasero_medium_get_page_2A_write_speed_desc (BraseroMedium *self,
-                                            int fd,
+                                            BraseroDeviceHandle *handle,
                                             BraseroScsiErrCode *code)
 {
        BraseroScsiStatusPage *page_2A = NULL;
@@ -735,7 +736,7 @@
        BRASERO_BURN_LOG ("Retrieving speed (2A speeds)");
 
        priv = BRASERO_MEDIUM_PRIVATE (self);
-       result = brasero_spc1_mode_sense_get_page (fd,
+       result = brasero_spc1_mode_sense_get_page (handle,
                                                   BRASERO_SPC_PAGE_STATUS,
                                                   &data,
                                                   &size,
@@ -789,7 +790,7 @@
 
 static BraseroBurnResult
 brasero_medium_get_page_2A_max_speed (BraseroMedium *self,
-                                     int fd,
+                                     BraseroDeviceHandle *handle,
                                      BraseroScsiErrCode *code)
 {
        BraseroScsiStatusPage *page_2A = NULL;
@@ -802,7 +803,7 @@
 
        priv = BRASERO_MEDIUM_PRIVATE (self);
 
-       result = brasero_spc1_mode_sense_get_page (fd,
+       result = brasero_spc1_mode_sense_get_page (handle,
                                                   BRASERO_SPC_PAGE_STATUS,
                                                   &data,
                                                   &size,
@@ -832,7 +833,7 @@
 
 static BraseroBurnResult
 brasero_medium_get_medium_type (BraseroMedium *self,
-                               int fd,
+                               BraseroDeviceHandle *handle,
                                BraseroScsiErrCode *code)
 {
        BraseroScsiGetConfigHdr *hdr = NULL;
@@ -843,7 +844,7 @@
        BRASERO_BURN_LOG ("Retrieving media profile");
 
        priv = BRASERO_MEDIUM_PRIVATE (self);
-       result = brasero_mmc2_get_configuration_feature (fd,
+       result = brasero_mmc2_get_configuration_feature (handle,
                                                         
BRASERO_SCSI_FEAT_REAL_TIME_STREAM,
                                                         &hdr,
                                                         &size,
@@ -864,7 +865,7 @@
                 * read TocPmaAtip. It if fails that's a ROM, if it succeeds.
                 * No need to set error code since we consider that it's a ROM
                 * if a failure happens. */
-               result = brasero_mmc1_read_atip (fd,
+               result = brasero_mmc1_read_atip (handle,
                                                 &data,
                                                 &size,
                                                 NULL);
@@ -902,7 +903,7 @@
 
                /* retrieve the speed */
                result = brasero_medium_get_page_2A_max_speed (self,
-                                                              fd,
+                                                              handle,
                                                               code);
                return result;
        }
@@ -1041,20 +1042,20 @@
                /* means it's at least an MMC3 drive */
                stream = (BraseroScsiRTStreamDesc *) hdr->desc->data;
                if (stream->wrt_spd) {
-                       result = brasero_medium_get_speed_mmc3 (self, fd, code);
+                       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, fd, code);
+                       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, fd, code);
+       result = brasero_medium_get_page_2A_max_speed (self, handle, code);
 
 end:
 
@@ -1068,7 +1069,7 @@
 
 static BraseroBurnResult
 brasero_medium_get_css_feature (BraseroMedium *self,
-                               int fd,
+                               BraseroDeviceHandle *handle,
                                BraseroScsiErrCode *code)
 {
        BraseroScsiGetConfigHdr *hdr = NULL;
@@ -1079,7 +1080,7 @@
        priv = BRASERO_MEDIUM_PRIVATE (self);
 
        BRASERO_BURN_LOG ("Testing for Css encrypted media");
-       result = brasero_mmc2_get_configuration_feature (fd,
+       result = brasero_mmc2_get_configuration_feature (handle,
                                                         
BRASERO_SCSI_FEAT_DVD_CSS,
                                                         &hdr,
                                                         &size,
@@ -1144,7 +1145,7 @@
 static BraseroBurnResult
 brasero_medium_track_volume_size (BraseroMedium *self,
                                  BraseroMediumTrack *track,
-                                 int fd)
+                                 BraseroDeviceHandle *handle)
 {
        BraseroMediumPrivate *priv;
        BraseroBurnResult res;
@@ -1165,7 +1166,7 @@
         * So we check if their first and only volume is valid. 
         * That's also used when the track size is reported a 300 Kio
         * see below */
-       res = brasero_volume_get_size_fd (fd,
+       res = brasero_volume_get_size_fd (brasero_device_handle_get_fd (handle),
                                          track->start,
                                          &nb_blocks,
                                          NULL);
@@ -1187,7 +1188,7 @@
 brasero_medium_track_get_info (BraseroMedium *self,
                               BraseroMediumTrack *track,
                               int track_num,
-                              int fd,
+                              BraseroDeviceHandle *handle,
                               BraseroScsiErrCode *code)
 {
        BraseroScsiTrackInfo track_info;
@@ -1209,7 +1210,7 @@
        else
                size = 36;
 
-       result = brasero_mmc1_read_track_info (fd,
+       result = brasero_mmc1_read_track_info (handle,
                                               track_num,
                                               &track_info,
                                               &size,
@@ -1233,7 +1234,7 @@
         * data size. */
        if (track->blocks_num <= 300) {
                BRASERO_BURN_LOG ("300 sectors size. Checking for real size");
-               brasero_medium_track_volume_size (self, track, fd);
+               brasero_medium_track_volume_size (self, track, handle);
        }
 
        if (track_info.next_wrt_address_valid)
@@ -1256,7 +1257,7 @@
  *  1 for HEX */
 static guint
 brasero_medium_check_BCD_use (BraseroMedium *self,
-                             int fd,
+                             BraseroDeviceHandle *handle,
                              BraseroScsiRawTocDesc *desc,
                              guint num,
                              BraseroScsiErrCode *code)
@@ -1348,7 +1349,7 @@
                start_LBA -= 150;
                start_BCD -= 150;
 
-               result = brasero_mmc1_read_track_info (fd,
+               result = brasero_mmc1_read_track_info (handle,
                                                       track_num,
                                                       &track_info,
                                                       &size,
@@ -1387,7 +1388,7 @@
        size = 36;
 
        /* leadout number is number of tracks + 1 */
-       result = brasero_mmc1_read_track_info (fd,
+       result = brasero_mmc1_read_track_info (handle,
                                               track_num + 1,
                                               &track_info,
                                               &size,
@@ -1421,7 +1422,7 @@
  * this one. */
 static BraseroBurnResult
 brasero_medium_get_CD_sessions_info (BraseroMedium *self,
-                                    int fd,
+                                    BraseroDeviceHandle *handle,
                                     BraseroScsiErrCode *code)
 {
        gint use_bcd;
@@ -1438,7 +1439,7 @@
        priv = BRASERO_MEDIUM_PRIVATE (self);
 
        size = 0;
-       result = brasero_mmc1_read_toc_raw (fd,
+       result = brasero_mmc1_read_toc_raw (handle,
                                            0,
                                            &toc,
                                            &size,
@@ -1454,7 +1455,7 @@
        BRASERO_BURN_LOG ("%i track(s) found", num);
 
        desc = toc->desc;
-       use_bcd = brasero_medium_check_BCD_use (self, fd, desc, num, code);
+       use_bcd = brasero_medium_check_BCD_use (self, handle, desc, num, code);
        if (!use_bcd) {
                g_free (toc);
 
@@ -1547,7 +1548,7 @@
                track->start = leadout_start;
                track->type = BRASERO_MEDIUM_TRACK_LEADOUT;
 
-               brasero_medium_track_get_info (self, track, g_slist_length 
(priv->tracks), fd, code); 
+               brasero_medium_track_get_info (self, track, g_slist_length 
(priv->tracks), handle, code); 
        }
 
        priv->tracks = g_slist_reverse (priv->tracks);
@@ -1560,7 +1561,7 @@
                /* check for tracks less that 300 sectors */
                if (track->blocks_num <= 300 && track->type != 
BRASERO_MEDIUM_TRACK_LEADOUT) {
                        BRASERO_BURN_LOG ("300 sectors size. Checking for real 
size");
-                       brasero_medium_track_volume_size (self, track, fd);
+                       brasero_medium_track_volume_size (self, track, handle);
                }
 
                BRASERO_BURN_LOG ("Track %i: type = %i start = %llu size = 
%llu",
@@ -1617,7 +1618,7 @@
 
 static BraseroBurnResult
 brasero_medium_get_sessions_info (BraseroMedium *self,
-                                 int fd,
+                                 BraseroDeviceHandle *handle,
                                  BraseroScsiErrCode *code)
 {
        int num, i, size;
@@ -1629,7 +1630,7 @@
        BRASERO_BURN_LOG ("Reading Toc");
 
        priv = BRASERO_MEDIUM_PRIVATE (self);
-       result = brasero_mmc1_read_toc_formatted (fd,
+       result = brasero_mmc1_read_toc_formatted (handle,
                                                  0,
                                                  &toc,
                                                  &size,
@@ -1661,7 +1662,7 @@
                brasero_medium_track_get_info (self,
                                               track,
                                               g_slist_length (priv->tracks),
-                                              fd,
+                                              handle,
                                               code);
 
                if (desc->control & BRASERO_SCSI_TRACK_COPY)
@@ -1685,7 +1686,7 @@
                         * which have only one track: the first. */
                        result = brasero_medium_track_volume_size (self, 
                                                                   track,
-                                                                  fd);
+                                                                  handle);
                        if (result == BRASERO_BURN_OK) {
                                track->type |= BRASERO_MEDIUM_TRACK_DATA;
                                priv->info |= BRASERO_MEDIUM_HAS_DATA;
@@ -1731,7 +1732,7 @@
                brasero_medium_track_get_info (self,
                                               track,
                                               g_slist_length (priv->tracks),
-                                              fd,
+                                              handle,
                                               code);
        }
 
@@ -1742,7 +1743,7 @@
 
 static BraseroBurnResult
 brasero_medium_get_contents (BraseroMedium *self,
-                            int fd,
+                            BraseroDeviceHandle *handle,
                             BraseroScsiErrCode *code)
 {
        int size;
@@ -1754,7 +1755,7 @@
 
        priv = BRASERO_MEDIUM_PRIVATE (self);
 
-       result = brasero_mmc1_read_disc_information_std (fd,
+       result = brasero_mmc1_read_disc_information_std (handle,
                                                         &info,
                                                         &size,
                                                         code);
@@ -1788,7 +1789,7 @@
                        brasero_medium_track_get_info (self,
                                                       track,
                                                       1,
-                                                      fd,
+                                                      handle,
                                                       code);
                }
                goto end;
@@ -1804,12 +1805,12 @@
        }
 
        if (priv->info & BRASERO_MEDIUM_CD) {
-               result = brasero_medium_get_CD_sessions_info (self, fd, code);
+               result = brasero_medium_get_CD_sessions_info (self, handle, 
code);
                if (result != BRASERO_BURN_OK)
-                       result = brasero_medium_get_sessions_info (self, fd, 
code);
+                       result = brasero_medium_get_sessions_info (self, 
handle, code);
        }
        else
-               result = brasero_medium_get_sessions_info (self, fd, code);
+               result = brasero_medium_get_sessions_info (self, handle, code);
 
        if (result != BRASERO_BURN_OK)
                goto end;
@@ -1821,7 +1822,8 @@
 }
 
 static void
-brasero_medium_init_real (BraseroMedium *object, int fd)
+brasero_medium_init_real (BraseroMedium *object,
+                         BraseroDeviceHandle *handle)
 {
        gchar *name;
        BraseroBurnResult result;
@@ -1834,20 +1836,20 @@
        BRASERO_BURN_LOG ("Initializing information for medium in %s", name);
        g_free (name);
 
-       result = brasero_medium_get_medium_type (object, fd, &code);
+       result = brasero_medium_get_medium_type (object, handle, &code);
        if (result != BRASERO_BURN_OK)
                return;
 
-       brasero_medium_get_capacity_by_type (object, fd, &code);
+       brasero_medium_get_capacity_by_type (object, handle, &code);
 
-       result = brasero_medium_get_contents (object, fd, &code);
+       result = brasero_medium_get_contents (object, handle, &code);
        if (result != BRASERO_BURN_OK)
                return;
 
        /* assume that css feature is only for DVD-ROM which might be wrong but
         * some drives wrongly reports that css is enabled for blank DVD+R/W */
        if (BRASERO_MEDIUM_IS (priv->info, 
(BRASERO_MEDIUM_DVD|BRASERO_MEDIUM_ROM)))
-               brasero_medium_get_css_feature (object, fd, &code);
+               brasero_medium_get_css_feature (object, handle, &code);
 
        BRASERO_BURN_LOG_DISC_TYPE (priv->info, "media is ");
 }
@@ -1855,21 +1857,20 @@
 static gboolean
 brasero_medium_retry_open (gpointer object)
 {
-       int fd;
        const gchar *path;
        BraseroMedium *self;
+       BraseroScsiErrCode code;
        BraseroMediumPrivate *priv;
+       BraseroDeviceHandle *handle;
 
        self = BRASERO_MEDIUM (object);
        priv = BRASERO_MEDIUM_PRIVATE (object);
        path = nautilus_burn_drive_get_device (priv->drive);
 
        BRASERO_BURN_LOG ("Retrying to open device %s", path);
-       fd = open (path, OPEN_FLAGS);
-       if (fd < 0) {
-               if (errno == EBUSY
-               ||  errno == EAGAIN
-               ||  errno == EWOULDBLOCK) {
+       handle = brasero_device_handle_open (path, &code);
+       if (!handle) {
+               if (code == BRASERO_SCSI_NOT_READY) {
                        BRASERO_BURN_LOG ("Device busy");
                        /* we'll retry in a second */
                        return TRUE;
@@ -1887,8 +1888,8 @@
 
        priv->retry_id = 0;
 
-       brasero_medium_init_real (self, fd);
-       close (fd);
+       brasero_medium_init_real (self, handle);
+       brasero_device_handle_close (handle);
 
        return FALSE;
 }
@@ -1896,9 +1897,10 @@
 static void
 brasero_medium_try_open (BraseroMedium *self)
 {
-       int fd;
        const gchar *path;
+       BraseroScsiErrCode code;
        BraseroMediumPrivate *priv;
+       BraseroDeviceHandle *handle;
 
        priv = BRASERO_MEDIUM_PRIVATE (self);
        path = nautilus_burn_drive_get_device (priv->drive);
@@ -1906,11 +1908,9 @@
        /* the drive might be busy (a burning is going on) so we don't block
         * but we re-try to open it every second */
        BRASERO_BURN_LOG ("Trying to open device %s", path);
-       fd = open (path, OPEN_FLAGS);
-       if (fd < 0) {
-               if (errno == EAGAIN
-               ||  errno == EWOULDBLOCK
-               ||  errno == EBUSY) {
+       handle = brasero_device_handle_open (path, &code);
+       if (!handle) {
+               if (code == BRASERO_SCSI_NOT_READY) {
                        BRASERO_BURN_LOG ("Device busy");
                        priv->info = BRASERO_MEDIUM_BUSY;
                        priv->icon = icons [0];
@@ -1925,8 +1925,8 @@
        }
 
        BRASERO_BURN_LOG ("Open () succeeded");
-       brasero_medium_init_real (self, fd);
-       close (fd);
+       brasero_medium_init_real (self, handle);
+       brasero_device_handle_close (handle);
 }
 
 static void

Copied: trunk/src/scsi-base.h (from r632, /trunk/src/scsi/scsi-base.h)
==============================================================================
--- /trunk/src/scsi/scsi-base.h (original)
+++ trunk/src/scsi-base.h       Mon Feb 11 19:23:03 2008
@@ -22,11 +22,15 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor Boston, MA 02110-1301,  
USA
  */
 
-#ifndef _SCSI_BASE_H
-#define _SCSI_BASE_H
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
 
 #include <glib.h>
 
+#ifndef _SCSI_BASE_H
+#define _SCSI_BASE_H
+
 G_BEGIN_DECLS
 
 typedef unsigned char uchar;

Copied: trunk/src/scsi-command.h (from r632, /trunk/src/scsi/scsi-command.h)
==============================================================================
--- /trunk/src/scsi/scsi-command.h      (original)
+++ trunk/src/scsi-command.h    Mon Feb 11 19:23:03 2008
@@ -24,6 +24,7 @@
 
 #include <glib.h>
 
+#include "scsi-device.h"
 #include "scsi-error.h"
 #include "scsi-utils.h"
 #include "scsi-base.h"
@@ -31,10 +32,7 @@
 #ifndef _BURN_SCSI_COMMAND_H
 #define _BURN_SCSI_COMMAND_H
 
-#ifdef __cplusplus
-extern "C"
-{
-#endif
+G_BEGIN_DECLS
 
 /* Most scsi commands are <= 16 (apparently some of the new mmc can be longer) 
*/
 #define BRASERO_SCSI_CMD_MAX_LEN       16
@@ -53,6 +51,8 @@
 };
 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 */                         
\
@@ -63,7 +63,8 @@
 }
 
 gpointer
-brasero_scsi_command_new (const BraseroScsiCmdInfo *info, int fd);
+brasero_scsi_command_new (const BraseroScsiCmdInfo *info,
+                         BraseroDeviceHandle *handle);
 
 BraseroScsiResult
 brasero_scsi_command_free (gpointer command);
@@ -73,14 +74,7 @@
                                 gpointer buffer,
                                 int size,
                                 BraseroScsiErrCode *error);
-BraseroScsiResult
-brasero_scsi_command_issue_immediate (gpointer command,
-                                     gpointer buffer,
-                                     int size,
-                                     BraseroScsiErrCode *error);
-#ifdef __cplusplus
-}
-#endif
+G_END_DECLS
 
 #endif /* _BURN_SCSI_COMMAND_H */
 

Added: trunk/src/scsi-device.h
==============================================================================
--- (empty file)
+++ trunk/src/scsi-device.h     Mon Feb 11 19:23:03 2008
@@ -0,0 +1,49 @@
+/***************************************************************************
+ *            scsi-device.h
+ *
+ *  Mon Feb 11 16:55:05 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_DEVICE_H
+#define _SCSI_DEVICE_H
+
+#include <glib.h>
+
+#include "scsi-error.h"
+
+G_BEGIN_DECLS
+
+typedef struct _BraseroDeviceHandle BraseroDeviceHandle;
+
+BraseroDeviceHandle *
+brasero_device_handle_open (const gchar *path, BraseroScsiErrCode *error);
+
+void
+brasero_device_handle_close (BraseroDeviceHandle *handle);
+
+int
+brasero_device_handle_get_fd (BraseroDeviceHandle *handle);
+
+G_END_DECLS
+
+#endif /* _SCSI_DEVICE_H */
+
+ 

Copied: trunk/src/scsi-error.c (from r632, /trunk/src/scsi/scsi-error.c)
==============================================================================
--- /trunk/src/scsi/scsi-error.c        (original)
+++ trunk/src/scsi-error.c      Mon Feb 11 19:23:03 2008
@@ -24,7 +24,7 @@
 #include <glib/gi18n-lib.h>
 
 #include "burn-basics.h"
-#include "scsi/scsi-error.h"
+#include "scsi-error.h"
 
 static const gchar *error_string [] = {        N_("unknown error"),
                                        N_("size mismatch"),

Copied: trunk/src/scsi-get-configuration.c (from r632, 
/trunk/src/scsi/scsi-get-configuration.c)
==============================================================================
--- /trunk/src/scsi/scsi-get-configuration.c    (original)
+++ trunk/src/scsi-get-configuration.c  Mon Feb 11 19:23:03 2008
@@ -149,7 +149,7 @@
 }
 
 BraseroScsiResult
-brasero_mmc2_get_configuration_feature (int fd,
+brasero_mmc2_get_configuration_feature (BraseroDeviceHandle *handle,
                                        BraseroScsiFeatureType type,
                                        BraseroScsiGetConfigHdr **data,
                                        int *size,
@@ -161,7 +161,7 @@
        g_return_val_if_fail (data != NULL, BRASERO_SCSI_FAILURE);
        g_return_val_if_fail (size != NULL, BRASERO_SCSI_FAILURE);
 
-       cdb = brasero_scsi_command_new (&info, fd);
+       cdb = brasero_scsi_command_new (&info, handle);
        BRASERO_SET_16 (cdb->feature_num, type);
        cdb->returned_data = BRASERO_GET_CONFIG_RETURN_ONLY_FEATURE;
 

Copied: trunk/src/scsi-get-performance.c (from r632, 
/trunk/src/scsi/scsi-get-performance.c)
==============================================================================
--- /trunk/src/scsi/scsi-get-performance.c      (original)
+++ trunk/src/scsi-get-performance.c    Mon Feb 11 19:23:03 2008
@@ -172,7 +172,7 @@
  */
 
 BraseroScsiResult
-brasero_mmc3_get_performance_wrt_spd_desc (int fd,
+brasero_mmc3_get_performance_wrt_spd_desc (BraseroDeviceHandle *handle,
                                           BraseroScsiGetPerfData **data,
                                           int *size,
                                           BraseroScsiErrCode *error)
@@ -180,7 +180,7 @@
        BraseroGetPerformanceCDB *cdb;
        BraseroScsiResult res;
 
-       cdb = brasero_scsi_command_new (&info, fd);
+       cdb = brasero_scsi_command_new (&info, handle);
        cdb->type = BRASERO_GET_PERFORMANCE_WR_SPEED_TYPE;
 
        res = brasero_get_performance (cdb, sizeof (BraseroScsiWrtSpdDesc), 
data, size, error);

Copied: trunk/src/scsi-mmc1.h (from r632, /trunk/src/scsi/scsi-mmc1.h)
==============================================================================
--- /trunk/src/scsi/scsi-mmc1.h (original)
+++ trunk/src/scsi-mmc1.h       Mon Feb 11 19:23:03 2008
@@ -22,6 +22,10 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor Boston, MA 02110-1301,  
USA
  */
 
+#include <glib.h>
+
+#include "scsi-base.h"
+#include "scsi-device.h"
 #include "scsi-error.h"
 #include "scsi-read-disc-info.h"
 #include "scsi-read-toc-pma-atip.h"
@@ -34,31 +38,31 @@
 G_BEGIN_DECLS
 
 BraseroScsiResult
-brasero_mmc1_read_disc_information_std (int fd,
+brasero_mmc1_read_disc_information_std (BraseroDeviceHandle *handle,
                                        BraseroScsiDiscInfoStd **info_return,
                                        int *size,
                                        BraseroScsiErrCode *error);
 
 BraseroScsiResult
-brasero_mmc1_read_toc_formatted (int fd,
+brasero_mmc1_read_toc_formatted (BraseroDeviceHandle *handle,
                                 int track_num,
                                 BraseroScsiFormattedTocData **data,
                                 int *size,
                                 BraseroScsiErrCode *error);
 BraseroScsiResult
-brasero_mmc1_read_toc_raw (int fd,
+brasero_mmc1_read_toc_raw (BraseroDeviceHandle *handle,
                           int session_num,
                           BraseroScsiRawTocData **data,
                           int *size,
                           BraseroScsiErrCode *error);
 BraseroScsiResult
-brasero_mmc1_read_atip (int fd,
+brasero_mmc1_read_atip (BraseroDeviceHandle *handle,
                        BraseroScsiAtipData **data,
                        int *size,
                        BraseroScsiErrCode *error);
 
 BraseroScsiResult
-brasero_mmc1_read_track_info (int fd,
+brasero_mmc1_read_track_info (BraseroDeviceHandle *handle,
                              int track_num,
                              BraseroScsiTrackInfo *track_info,
                              int *size,

Copied: trunk/src/scsi-mmc2.h (from r632, /trunk/src/scsi/scsi-mmc2.h)
==============================================================================
--- /trunk/src/scsi/scsi-mmc2.h (original)
+++ trunk/src/scsi-mmc2.h       Mon Feb 11 19:23:03 2008
@@ -22,6 +22,9 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor Boston, MA 02110-1301,  
USA
  */
 
+#include <glib.h>
+
+#include "scsi-base.h"
 #include "scsi-error.h"
 #include "scsi-read-capacity.h"
 #include "scsi-get-configuration.h"
@@ -34,27 +37,27 @@
 G_BEGIN_DECLS
 
 BraseroScsiResult
-brasero_mmc2_read_capacity (int fd,
+brasero_mmc2_read_capacity (BraseroDeviceHandle *handle,
                            BraseroScsiReadCapacityData *data,
                            int size,
                            BraseroScsiErrCode *error);
 
 BraseroScsiResult
-brasero_mmc2_get_configuration_feature (int fd,
+brasero_mmc2_get_configuration_feature (BraseroDeviceHandle *handle,
                                        BraseroScsiFeatureType type,
                                        BraseroScsiGetConfigHdr **data,
                                        int *size,
                                        BraseroScsiErrCode *error);
 
 BraseroScsiResult
-brasero_mmc2_read_generic_structure (int fd,
+brasero_mmc2_read_generic_structure (BraseroDeviceHandle *handle,
                                     BraseroScsiGenericFormatType type,
                                     BraseroScsiReadDiscStructureHdr **data,
                                     int *size,
                                     BraseroScsiErrCode *error);
 
 BraseroScsiResult
-brasero_mmc2_read_format_capacities (int fd,
+brasero_mmc2_read_format_capacities (BraseroDeviceHandle *handle,
                                     BraseroScsiFormatCapacitiesHdr **data,
                                     int *size,
                                     BraseroScsiErrCode *error);

Copied: trunk/src/scsi-mmc3.h (from r632, /trunk/src/scsi/scsi-mmc3.h)
==============================================================================
--- /trunk/src/scsi/scsi-mmc3.h (original)
+++ trunk/src/scsi-mmc3.h       Mon Feb 11 19:23:03 2008
@@ -22,6 +22,9 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor Boston, MA 02110-1301,  
USA
  */
 
+#include <glib.h>
+
+#include "scsi-base.h"
 #include "scsi-error.h"
 #include "scsi-get-performance.h"
 #include "scsi-read-toc-pma-atip.h"
@@ -29,26 +32,21 @@
 #ifndef _BURN_MMC3_H
 #define _BURN_MMC3_H
 
-#ifdef __cplusplus
-extern "C"
-{
-#endif
+G_BEGIN_DECLS
 
 BraseroScsiResult
-brasero_mmc3_read_cd_text (int fd,
+brasero_mmc3_read_cd_text (BraseroDeviceHandle *handle,
                           BraseroScsiCDTextData **data,
                           int *size,
                           BraseroScsiErrCode *error);
 
 BraseroScsiResult
-brasero_mmc3_get_performance_wrt_spd_desc (int fd,
+brasero_mmc3_get_performance_wrt_spd_desc (BraseroDeviceHandle *handle,
                                           BraseroScsiGetPerfData **data,
                                           int *data_size,
                                           BraseroScsiErrCode *error);
 
-#ifdef __cplusplus
-}
-#endif
+G_END_DECLS
 
 #endif /* _BURN_MMC3_H */
 

Added: trunk/src/scsi-mode-pages.h
==============================================================================
--- (empty file)
+++ trunk/src/scsi-mode-pages.h Mon Feb 11 19:23:03 2008
@@ -0,0 +1,91 @@
+/***************************************************************************
+ *            scsi-mode-pages.h
+ *
+ *  Sat Oct 21 19:11:53 2006
+ *  Copyright  2006  algernon
+ *  <[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 <glib.h>
+
+#include "scsi-base.h"
+
+#ifndef _SCSI_MODE_PAGES_H
+#define _SCSI_MODE_PAGES_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+
+struct _BraseroScsiModePage {
+       uchar code                      :6;
+       uchar reserved                  :1;
+       uchar ps                                :1;
+
+       uchar len;
+};
+
+#else
+
+struct _BraseroScsiModePage {
+       uchar ps                        :1;
+       uchar reserved                  :1;
+       uchar code                      :6;
+
+       uchar len;
+};
+
+#endif
+
+typedef struct _BraseroScsiModePage BraseroScsiModePage;
+
+struct _BraseroScsiModeHdr {
+       uchar len                       [2];
+       uchar medium_type               :8;
+       uchar device_param              :8;
+       uchar reserved                  [2];
+       uchar bdlen                     [2];
+};
+typedef struct _BraseroScsiModeHdr BraseroScsiModeHdr;
+
+struct _BraseroScsiModeData {
+       BraseroScsiModeHdr hdr;
+       BraseroScsiModePage page;
+};
+typedef struct _BraseroScsiModeData BraseroScsiModeData;
+
+/**
+ * Pages codes
+ */
+
+typedef enum {
+       BRASERO_SPC_PAGE_NULL           = 0x00,
+       BRASERO_SPC_PAGE_STATUS         = 0x2a,
+} BraseroSPCPageType;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SCSI_MODE-PAGES_H */
+
+ 

Copied: trunk/src/scsi-mode-sense.c (from r632, 
/trunk/src/scsi/scsi-mode-sense.c)
==============================================================================
--- /trunk/src/scsi/scsi-mode-sense.c   (original)
+++ trunk/src/scsi-mode-sense.c Mon Feb 11 19:23:03 2008
@@ -89,7 +89,7 @@
 #define BRASERO_MODE_DATA(data)                        ((BraseroScsiModeData 
*) (data))
 
 BraseroScsiResult
-brasero_spc1_mode_sense_get_page (int fd,
+brasero_spc1_mode_sense_get_page (BraseroDeviceHandle *handle,
                                  BraseroSPCPageType num,
                                  BraseroScsiModeData **data,
                                  int *data_size,
@@ -109,7 +109,7 @@
        }
 
        /* issue a first command to get the size of the page ... */
-       cdb = brasero_scsi_command_new (&info, fd);
+       cdb = brasero_scsi_command_new (&info, handle);
        cdb->dbd = 1;
        cdb->page_code = num;
        BRASERO_SET_16 (cdb->alloc_len, sizeof (header));

Copied: trunk/src/scsi-read-capacity.c (from r632, 
/trunk/src/scsi/scsi-read-capacity.c)
==============================================================================
--- /trunk/src/scsi/scsi-read-capacity.c        (original)
+++ trunk/src/scsi-read-capacity.c      Mon Feb 11 19:23:03 2008
@@ -76,7 +76,7 @@
                             BRASERO_SCSI_READ);
 
 BraseroScsiResult
-brasero_mmc2_read_capacity (int fd,
+brasero_mmc2_read_capacity (BraseroDeviceHandle *handle,
                            BraseroScsiReadCapacityData *data,
                            int size,
                            BraseroScsiErrCode *error)
@@ -85,7 +85,7 @@
        BraseroScsiResult res;
 
        /* NOTE: all the fields are ignored by MM drives */
-       cdb = brasero_scsi_command_new (&info, fd);
+       cdb = brasero_scsi_command_new (&info, handle);
 
        memset (data, 0, size);
        res = brasero_scsi_command_issue_sync (cdb, data, size, error);

Copied: trunk/src/scsi-read-disc-info.c (from r632, 
/trunk/src/scsi/scsi-read-disc-info.c)
==============================================================================
--- /trunk/src/scsi/scsi-read-disc-info.c       (original)
+++ trunk/src/scsi-read-disc-info.c     Mon Feb 11 19:23:03 2008
@@ -85,7 +85,7 @@
 
 
 BraseroScsiResult
-brasero_mmc1_read_disc_information_std (int fd,
+brasero_mmc1_read_disc_information_std (BraseroDeviceHandle *handle,
                                        BraseroScsiDiscInfoStd **info_return,
                                        int *size,
                                        BraseroScsiErrCode *error)
@@ -102,7 +102,7 @@
                return BRASERO_SCSI_FAILURE;
        }
 
-       cdb = brasero_scsi_command_new (&info, fd);
+       cdb = brasero_scsi_command_new (&info, handle);
        cdb->data_type = BRASERO_DISC_INFO_STD;
        BRASERO_SET_16 (cdb->alloc_len, sizeof (BraseroScsiDiscInfoStd));
 
@@ -144,7 +144,7 @@
 }
 
 BraseroScsiResult
-brasero_mmc5_read_disc_information_tracks (int fd,
+brasero_mmc5_read_disc_information_tracks (BraseroDeviceHandle *handle,
                                           BraseroScsiTrackResInfo *info_return,
                                           int size,
                                           BraseroScsiErrCode *error)
@@ -152,7 +152,7 @@
        BraseroRdDiscInfoCDB *cdb;
        BraseroScsiResult res;
 
-       cdb = brasero_scsi_command_new (&info, fd);
+       cdb = brasero_scsi_command_new (&info, handle);
        cdb->data_type = BRASERO_DISC_INFO_TRACK_RES;
        BRASERO_SET_16 (cdb->alloc_len, size);
 
@@ -163,7 +163,7 @@
 }
 
 BraseroScsiResult
-brasero_mmc5_read_disc_information_pows (int fd,
+brasero_mmc5_read_disc_information_pows (BraseroDeviceHandle *handle,
                                         BraseroScsiPOWResInfo *info_return,
                                         int size,
                                         BraseroScsiErrCode *error)
@@ -171,7 +171,7 @@
        BraseroRdDiscInfoCDB *cdb;
        BraseroScsiResult res;
 
-       cdb = brasero_scsi_command_new (&info, fd);
+       cdb = brasero_scsi_command_new (&info, handle);
        cdb->data_type = BRASERO_DISC_INFO_POW_RES;
        BRASERO_SET_16 (cdb->alloc_len, size);
 

Copied: trunk/src/scsi-read-disc-structure.c (from r632, 
/trunk/src/scsi/scsi-read-disc-structure.c)
==============================================================================
--- /trunk/src/scsi/scsi-read-disc-structure.c  (original)
+++ trunk/src/scsi-read-disc-structure.c        Mon Feb 11 19:23:03 2008
@@ -139,7 +139,7 @@
 }
 
 BraseroScsiResult
-brasero_mmc2_read_generic_structure (int fd,
+brasero_mmc2_read_generic_structure (BraseroDeviceHandle *handle,
                                     BraseroScsiGenericFormatType type,
                                     BraseroScsiReadDiscStructureHdr **data,
                                     int *size,
@@ -148,7 +148,7 @@
        BraseroReadDiscStructureCDB *cdb;
        BraseroScsiResult res;
 
-       cdb = brasero_scsi_command_new (&info, fd);
+       cdb = brasero_scsi_command_new (&info, handle);
        cdb->format = type;
 
        res = brasero_read_disc_structure (cdb, data, size, error);
@@ -157,7 +157,7 @@
 }
 
 BraseroScsiResult
-brasero_mmc2_read_dvd_structure (int fd,
+brasero_mmc2_read_dvd_structure (BraseroDeviceHandle *handle,
                                 int address,
                                 BraseroScsiDVDFormatType type,
                                 BraseroScsiReadDiscStructureHdr **data,
@@ -167,7 +167,7 @@
        BraseroReadDiscStructureCDB *cdb;
        BraseroScsiResult res;
 
-       cdb = brasero_scsi_command_new (&info, fd);
+       cdb = brasero_scsi_command_new (&info, handle);
        cdb->format = type;
        cdb->media_type = BRASERO_MEDIA_DVD_HD_DVD;
        BRASERO_SET_32 (cdb->address, address);
@@ -178,7 +178,7 @@
 }
 
 BraseroScsiResult
-brasero_mmc5_read_bd_structure (int fd,
+brasero_mmc5_read_bd_structure (BraseroDeviceHandle *handle,
                                BraseroScsiBDFormatType type,
                                BraseroScsiReadDiscStructureHdr **data,
                                int *size,
@@ -187,7 +187,7 @@
        BraseroReadDiscStructureCDB *cdb;
        BraseroScsiResult res;
 
-       cdb = brasero_scsi_command_new (&info, fd);
+       cdb = brasero_scsi_command_new (&info, handle);
        cdb->format = type;
        cdb->media_type = BRASERO_MEDIA_BD;
 

Copied: trunk/src/scsi-read-format-capacities.c (from r632, 
/trunk/src/scsi/scsi-read-format-capacities.c)
==============================================================================
--- /trunk/src/scsi/scsi-read-format-capacities.c       (original)
+++ trunk/src/scsi-read-format-capacities.c     Mon Feb 11 19:23:03 2008
@@ -48,7 +48,7 @@
                             BRASERO_SCSI_READ);
 
 BraseroScsiResult
-brasero_mmc2_read_format_capacities (int fd,
+brasero_mmc2_read_format_capacities (BraseroDeviceHandle *handle,
                                     BraseroScsiFormatCapacitiesHdr **data,
                                     int *size,
                                     BraseroScsiErrCode *error)
@@ -64,7 +64,7 @@
                return BRASERO_SCSI_FAILURE;
        }
 
-       cdb = brasero_scsi_command_new (&info, fd);
+       cdb = brasero_scsi_command_new (&info, handle);
        BRASERO_SET_16 (cdb->alloc_len, sizeof 
(BraseroScsiFormatCapacitiesHdr));
 
        memset (&hdr, 0, sizeof (BraseroScsiFormatCapacitiesHdr));

Copied: trunk/src/scsi-read-toc-pma-atip.c (from r632, 
/trunk/src/scsi/scsi-read-toc-pma-atip.c)
==============================================================================
--- /trunk/src/scsi/scsi-read-toc-pma-atip.c    (original)
+++ trunk/src/scsi-read-toc-pma-atip.c  Mon Feb 11 19:23:03 2008
@@ -154,7 +154,7 @@
  */
 
 BraseroScsiResult
-brasero_mmc1_read_toc_formatted (int fd,
+brasero_mmc1_read_toc_formatted (BraseroDeviceHandle *handle,
                                 int track_num,
                                 BraseroScsiFormattedTocData **data,
                                 int *size,
@@ -163,7 +163,7 @@
        BraseroRdTocPmaAtipCDB *cdb;
        BraseroScsiResult res;
 
-       cdb = brasero_scsi_command_new (&info, fd);
+       cdb = brasero_scsi_command_new (&info, handle);
        cdb->format = BRASERO_RD_TAP_FORMATTED_TOC;
 
        /* first track for which this function will return information */
@@ -183,7 +183,7 @@
  */
 
 BraseroScsiResult
-brasero_mmc1_read_toc_raw (int fd,
+brasero_mmc1_read_toc_raw (BraseroDeviceHandle *handle,
                           int session_num,
                           BraseroScsiRawTocData **data,
                           int *size,
@@ -192,7 +192,7 @@
        BraseroRdTocPmaAtipCDB *cdb;
        BraseroScsiResult res;
 
-       cdb = brasero_scsi_command_new (&info, fd);
+       cdb = brasero_scsi_command_new (&info, handle);
        cdb->format = BRASERO_RD_TAP_RAW_TOC;
 
        /* first session for which this function will return information */
@@ -212,7 +212,7 @@
  */
 
 BraseroScsiResult
-brasero_mmc3_read_cd_text (int fd,
+brasero_mmc3_read_cd_text (BraseroDeviceHandle *handle,
                           BraseroScsiCDTextData **data,
                           int *size,
                           BraseroScsiErrCode *error)
@@ -220,7 +220,7 @@
        BraseroRdTocPmaAtipCDB *cdb;
        BraseroScsiResult res;
 
-       cdb = brasero_scsi_command_new (&info, fd);
+       cdb = brasero_scsi_command_new (&info, handle);
        cdb->format = BRASERO_RD_TAP_CD_TEXT;
 
        res = brasero_read_toc_pma_atip (cdb,
@@ -237,7 +237,7 @@
  */
 
 BraseroScsiResult
-brasero_mmc1_read_atip (int fd,
+brasero_mmc1_read_atip (BraseroDeviceHandle *handle,
                        BraseroScsiAtipData **data,
                        int *size,
                        BraseroScsiErrCode *error)
@@ -248,7 +248,7 @@
        /* In here we have to ask how many bytes the drive wants to return first
         * indeed there is a difference in the descriptor size between MMC1/MMC2
         * and MMC3. */
-       cdb = brasero_scsi_command_new (&info, fd);
+       cdb = brasero_scsi_command_new (&info, handle);
        cdb->format = BRASERO_RD_TAP_ATIP;
        cdb->msf = 1;                           /* specs says it's compulsory */
 

Copied: trunk/src/scsi-read-track-information.c (from r632, 
/trunk/src/scsi/scsi-read-track-information.c)
==============================================================================
--- /trunk/src/scsi/scsi-read-track-information.c       (original)
+++ trunk/src/scsi-read-track-information.c     Mon Feb 11 19:23:03 2008
@@ -153,7 +153,7 @@
  */
  
 BraseroScsiResult
-brasero_mmc1_read_track_info (int fd,
+brasero_mmc1_read_track_info (BraseroDeviceHandle *handle,
                              int track_num,
                              BraseroScsiTrackInfo *track_info,
                              int *size,
@@ -162,7 +162,7 @@
        BraseroRdTrackInfoCDB *cdb;
        BraseroScsiResult res;
 
-       cdb = brasero_scsi_command_new (&info, fd);
+       cdb = brasero_scsi_command_new (&info, handle);
        cdb->addr_num_type = BRASERO_FIELD_TRACK_NUM;
        BRASERO_SET_32 (cdb->blk_addr_trk_ses_num, track_num);
 

Copied: trunk/src/scsi-sg.c (from r632, /trunk/src/scsi/scsi-sg.c)
==============================================================================
--- /trunk/src/scsi/scsi-sg.c   (original)
+++ trunk/src/scsi-sg.c Mon Feb 11 19:23:03 2008
@@ -22,47 +22,179 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor Boston, MA 02110-1301,  
USA
  */
 
-#include <string.h>
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <errno.h>
 #include <unistd.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <string.h>
 #include <sys/ioctl.h>
 #include <scsi/scsi.h>
-#include <scsi/sg.h>
 
-#include "scsi-sg.h"
+#include "scsi-command.h"
+#include "burn-debug.h"
 #include "scsi-utils.h"
 #include "scsi-error.h"
 #include "scsi-sense-data.h"
 
-BraseroScsiResult
-brasero_sg_send_command (int fd, struct sg_io_hdr *command, BraseroScsiErrCode 
*error)
-{
-       unsigned char sense_buffer [32];
-       BraseroScsiErrCode res;
+/* Only work for linux when it has the SG interface */
+#if HAVE_SG_IO_HDR_T
+
+#include <scsi/sg.h>
+
+struct _BraseroDeviceHandle {
+       int fd;
+};
+
+struct _BraseroScsiCmd {
+       uchar cmd [BRASERO_SCSI_CMD_MAX_LEN];
+       BraseroDeviceHandle *handle;
+
+       const BraseroScsiCmdInfo *info;
+};
+
+#define BRASERO_SCSI_CMD_OPCODE_OFF                    0
+#define BRASERO_SCSI_CMD_SET_OPCODE(command)           (command->cmd 
[BRASERO_SCSI_CMD_OPCODE_OFF] = command->info->opcode)
 
-       /* NOTE: the sense buffer is the result of the first write command
-        * (REQUEST SENSE usually) since SG_IO is both write and read. */
-       memset (&sense_buffer, 0, sizeof (sense_buffer));
+#define OPEN_FLAGS                     O_RDONLY /*|O_EXCL */|O_NONBLOCK
 
-       command->interface_id = 'S';                            /* mandatory */
-       command->flags = SG_FLAG_LUN_INHIBIT|SG_FLAG_DIRECT_IO;
+/**
+ * This is to send a command
+ */
+
+static void
+brasero_sg_command_setup (struct sg_io_hdr *transport,
+                         uchar *sense_data,
+                         BraseroScsiCmd *cmd,
+                         uchar *buffer,
+                         int size)
+{
+       memset (sense_data, 0, BRASERO_SENSE_DATA_SIZE);
+       memset (transport, 0, sizeof (struct sg_io_hdr));
+       
+       transport->interface_id = 'S';                          /* mandatory */
+//     transport->flags = SG_FLAG_LUN_INHIBIT|SG_FLAG_DIRECT_IO;
+       transport->cmdp = cmd->cmd;
+       transport->cmd_len = cmd->info->size;
+       transport->dxferp = buffer;
+       transport->dxfer_len = size;
 
        /* where to output the scsi sense buffer */
-       command->sbp = sense_buffer;
-       command->mx_sb_len = sizeof (sense_buffer);
+       transport->sbp = sense_data;
+       transport->mx_sb_len = BRASERO_SENSE_DATA_SIZE;
+
+       if (cmd->info->direction & BRASERO_SCSI_READ)
+               transport->dxfer_direction = SG_DXFER_FROM_DEV;
+       else if (cmd->info->direction & BRASERO_SCSI_WRITE)
+               transport->dxfer_direction = SG_DXFER_TO_DEV;
+}
+
+BraseroScsiResult
+brasero_scsi_command_issue_sync (gpointer command,
+                                gpointer buffer,
+                                int size,
+                                BraseroScsiErrCode *error)
+{
+       uchar sense_buffer [BRASERO_SENSE_DATA_SIZE];
+       struct sg_io_hdr transport;
+       BraseroScsiResult res;
+       BraseroScsiCmd *cmd;
+
+       cmd = command;
+       brasero_sg_command_setup (&transport,
+                                 sense_buffer,
+                                 cmd,
+                                 buffer,
+                                 size);
+
+       /* for the time being only sg driver is supported */
 
        /* NOTE on SG_IO: only for TEST UNIT READY, REQUEST/MODE SENSE, INQUIRY,
         * READ CAPACITY, READ BUFFER, READ and LOG SENSE are allowed with it */
-       res = ioctl (fd, SG_IO, command);
+       res = ioctl (cmd->handle->fd, SG_IO, &transport);
        if (res) {
                BRASERO_SCSI_SET_ERRCODE (error, BRASERO_SCSI_ERRNO);
                return BRASERO_SCSI_FAILURE;
        }
 
-       if ((command->info & SG_INFO_OK_MASK) == SG_INFO_OK)
+       if ((transport.info & SG_INFO_OK_MASK) == SG_INFO_OK)
                return BRASERO_SCSI_OK;
 
-       if ((command->masked_status & CHECK_CONDITION) && command->sb_len_wr)
-               return brasero_sense_data_process (sense_buffer, &res);
+       if ((transport.masked_status & CHECK_CONDITION) && transport.sb_len_wr)
+               return brasero_sense_data_process (sense_buffer, error);
 
        return BRASERO_SCSI_FAILURE;
 }
+
+gpointer
+brasero_scsi_command_new (const BraseroScsiCmdInfo *info,
+                         BraseroDeviceHandle *handle) 
+{
+       BraseroScsiCmd *cmd;
+
+       /* make sure we can set the flags of the descriptor */
+
+       /* allocate the command */
+       cmd = g_new0 (BraseroScsiCmd, 1);
+       cmd->info = info;
+       cmd->handle = handle;
+
+       BRASERO_SCSI_CMD_SET_OPCODE (cmd);
+       return cmd;
+}
+
+BraseroScsiResult
+brasero_scsi_command_free (gpointer cmd)
+{
+       g_free (cmd);
+       return BRASERO_SCSI_OK;
+}
+
+/**
+ * This is to open a device
+ */
+
+BraseroDeviceHandle *
+brasero_device_handle_open (const gchar *path,
+                           BraseroScsiErrCode *code)
+{
+       int fd;
+       BraseroDeviceHandle *handle;
+
+       fd = open (path, OPEN_FLAGS);
+       if (fd < 0) {
+               if (errno == EAGAIN
+               ||  errno == EWOULDBLOCK
+               ||  errno == EBUSY)
+                       *code = BRASERO_SCSI_NOT_READY;
+               else
+                       *code = BRASERO_SCSI_ERRNO;
+
+               return NULL;
+       }
+
+       handle = g_new (BraseroDeviceHandle, 1);
+       handle->fd = fd;
+
+       return handle;
+}
+
+void
+brasero_device_handle_close (BraseroDeviceHandle *handle)
+{
+       close (handle->fd);
+       g_free (handle);
+}
+
+int
+brasero_device_handle_get_fd (BraseroDeviceHandle *handle)
+{
+       return handle->fd;
+}
+
+#endif /* HAVE_SG_IO_HDR_T */

Copied: trunk/src/scsi-spc1.h (from r632, /trunk/src/scsi/scsi-spc1.h)
==============================================================================
--- /trunk/src/scsi/scsi-spc1.h (original)
+++ trunk/src/scsi-spc1.h       Mon Feb 11 19:23:03 2008
@@ -22,6 +22,10 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor Boston, MA 02110-1301,  
USA
  */
 
+#include <glib.h>
+
+#include "scsi-base.h"
+
 #include "scsi-error.h"
 #include "scsi-mode-pages.h"
 
@@ -34,7 +38,7 @@
 #endif
 
 BraseroScsiResult
-brasero_spc1_mode_sense_get_page (int fd,
+brasero_spc1_mode_sense_get_page (BraseroDeviceHandle *handle,
                                  BraseroSPCPageType num,
                                  BraseroScsiModeData **data,
                                  int *data_size,
_______________________________________________
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