aboutsummaryrefslogtreecommitdiff
path: root/sysutils/brasero
diff options
context:
space:
mode:
authorJoe Marcus Clarke <marcus@FreeBSD.org>2009-01-10 05:22:13 +0000
committerJoe Marcus Clarke <marcus@FreeBSD.org>2009-01-10 05:22:13 +0000
commit610ae5681637c1051a0c17b54e29d97f53da2f3a (patch)
treec231a1eb74b07e444fa7363012cb84bf23d83ce0 /sysutils/brasero
parent15b6544926b07a98710eeb765baf03e3fc9a195c (diff)
downloadports-610ae5681637c1051a0c17b54e29d97f53da2f3a.tar.gz
ports-610ae5681637c1051a0c17b54e29d97f53da2f3a.zip
Presenting GNOME 2.24 for FreeBSD.
See http://library.gnome.org/misc/release-notes/2.24/ for the general release notes. On the FreeBSD front, this release introduces Fuse support in HAL, adds multi-CPU support to libgtop, WebKit updates, and fixes some long-standing seahorse and gnome-keyring bugs. The documentation updates to the website are forthcoming. This release features commits by adamw, ahze, kwm, mezz, and myself. It would not have been possible without are contributors and testers: Alexander Loginov Craig Butler [1] Dmitry Marakasov [6] Eric L. Chen Joseph S. Atkinson Kris Moore Lapo Luchini [7] Nikos Ntarmos Pawel Worach Romain Tartiere TAOKA Fumiyoshi [3] Yasuda Keisuke Zyl aZ [4] bf [2] [5] Florent Thoumie Peter Wemm pluknet PR: 125857 [1] 126993 [2] 130031 [3] 127399 [4] 127661 [5] 124302 [6] 129570 [7] 129936 123790
Notes
Notes: svn path=/head/; revision=225629
Diffstat (limited to 'sysutils/brasero')
-rw-r--r--sysutils/brasero/Makefile11
-rw-r--r--sysutils/brasero/distinfo6
-rw-r--r--sysutils/brasero/files/patch-configure264
-rw-r--r--sysutils/brasero/files/patch-src_Makefile.in275
-rw-r--r--sysutils/brasero/files/patch-src_brasero-ncb.h12
-rw-r--r--sysutils/brasero/files/patch-src_burn-job.c31
-rw-r--r--sysutils/brasero/files/patch-src_burn-job.h12
-rw-r--r--sysutils/brasero/files/patch-src_burn-medium-cam.c1928
-rw-r--r--sysutils/brasero/files/patch-src_burn-medium-scsi.c2073
-rw-r--r--sysutils/brasero/files/patch-src_burn-medium.c2073
-rw-r--r--sysutils/brasero/files/patch-src_cam1361
-rw-r--r--sysutils/brasero/files/patch-src_plugins_cdrtools_burn-cdrecord.c11
-rw-r--r--sysutils/brasero/pkg-plist94
13 files changed, 97 insertions, 8054 deletions
diff --git a/sysutils/brasero/Makefile b/sysutils/brasero/Makefile
index cd09844a6b99..10343c02a55f 100644
--- a/sysutils/brasero/Makefile
+++ b/sysutils/brasero/Makefile
@@ -3,11 +3,10 @@
# Whom: Michael Johnson <ahze@FreeBSD.org>
#
# $FreeBSD$
-# $MCom: ports/sysutils/brasero/Makefile,v 1.23 2008/02/06 07:11:46 marcus Exp $
+# $MCom: ports/sysutils/brasero/Makefile,v 1.34 2009/01/09 22:03:01 kwm Exp $
PORTNAME= brasero
-PORTVERSION= 0.7.1
-PORTREVISION= 5
+PORTVERSION= 0.8.4
CATEGORIES= sysutils audio multimedia gnome
MASTER_SITES= ${MASTER_SITE_GNOME}
MASTER_SITE_SUBDIR= sources/${PORTNAME}/${PORTVERSION:C/^([0-9]+\.[0-9]+).*/\1/}
@@ -17,7 +16,7 @@ MAINTAINER= gnome@FreeBSD.org
COMMENT= CD/DVD mastering tool for the GNOME desktop
LIB_DEPENDS= notify.1:${PORTSDIR}/devel/libnotify \
- totem-plparser.10:${PORTSDIR}/multimedia/totem-pl-parser
+ totem-plparser.12:${PORTSDIR}/multimedia/totem-pl-parser
USE_GETTEXT= yes
USE_BZIP2= yes
@@ -25,9 +24,9 @@ GNU_CONFIGURE= yes
USE_GMAKE= yes
USE_GNOME= gnomehier nautiluscdburner
USE_GSTREAMER= gconf core
+INSTALLS_OMF= yes
INSTALLS_ICONS= yes
-CONFIGURE_ARGS= --disable-inotify \
- --with-cam
+CONFIGURE_ARGS= --disable-inotify
CONFIGURE_ENV= CPPFLAGS="-I${LOCALBASE}/include" \
LDFLAGS="-L${LOCALBASE}/lib"
diff --git a/sysutils/brasero/distinfo b/sysutils/brasero/distinfo
index ba88da57f993..c63fa75cf437 100644
--- a/sysutils/brasero/distinfo
+++ b/sysutils/brasero/distinfo
@@ -1,3 +1,3 @@
-MD5 (gnome2/brasero-0.7.1.tar.bz2) = 2754fca21c31f00016981cc8fe7c48be
-SHA256 (gnome2/brasero-0.7.1.tar.bz2) = 0ad851ba9f05c2e4ae0778e61c74aee56bbae3a4181b172009698cde03387f5c
-SIZE (gnome2/brasero-0.7.1.tar.bz2) = 1483716
+MD5 (gnome2/brasero-0.8.4.tar.bz2) = 5d0ad796e1f7b68a31f8757f1b3f9aef
+SHA256 (gnome2/brasero-0.8.4.tar.bz2) = 6cbe0367e9049f6c93d67f6d9a48b530430e52d3d48ec3ae4b9bc96b79870bba
+SIZE (gnome2/brasero-0.8.4.tar.bz2) = 2755878
diff --git a/sysutils/brasero/files/patch-configure b/sysutils/brasero/files/patch-configure
deleted file mode 100644
index 3f4958a84b2e..000000000000
--- a/sysutils/brasero/files/patch-configure
+++ /dev/null
@@ -1,264 +0,0 @@
---- configure.orig 2008-01-24 16:49:00.000000000 -0500
-+++ configure 2008-01-24 16:49:16.000000000 -0500
-@@ -885,6 +885,8 @@ BRASERO_BASE_CFLAGS
- BRASERO_BASE_LIBS
- BRASERO_CFLAGS
- BRASERO_LIBS
-+WITH_CAM_TRUE
-+WITH_CAM_FALSE
- LIBBURNIA_CFLAGS
- LIBBURNIA_LIBS
- BRASERO_LIBBURNIA_CFLAGS
-@@ -1610,6 +1612,7 @@ Optional Packages:
- --with-pic try to use only PIC/non-PIC objects [default=use
- both]
- --with-tags[=TAGS] include additional configurations [automatic]
-+ --with-cam Build with CAM backend instead of Linux SCSI [default = no]
- --with-gconf-source=sourceaddress Config database for installing schema files.
- --with-gconf-schema-file-dir=dir Directory for installing schema files.
-
-@@ -4514,7 +4517,7 @@ ia64-*-hpux*)
- ;;
- *-*-irix6*)
- # Find out which ABI we are using.
-- echo '#line 4517 "configure"' > conftest.$ac_ext
-+ echo '#line 4520 "configure"' > conftest.$ac_ext
- if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
-@@ -7252,11 +7255,11 @@ else
- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
- -e 's:$: $lt_compiler_flag:'`
-- (eval echo "\"\$as_me:7255: $lt_compile\"" >&5)
-+ (eval echo "\"\$as_me:7258: $lt_compile\"" >&5)
- (eval "$lt_compile" 2>conftest.err)
- ac_status=$?
- cat conftest.err >&5
-- echo "$as_me:7259: \$? = $ac_status" >&5
-+ echo "$as_me:7262: \$? = $ac_status" >&5
- if (exit $ac_status) && test -s "$ac_outfile"; then
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings other than the usual output.
-@@ -7542,11 +7545,11 @@ else
- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
- -e 's:$: $lt_compiler_flag:'`
-- (eval echo "\"\$as_me:7545: $lt_compile\"" >&5)
-+ (eval echo "\"\$as_me:7548: $lt_compile\"" >&5)
- (eval "$lt_compile" 2>conftest.err)
- ac_status=$?
- cat conftest.err >&5
-- echo "$as_me:7549: \$? = $ac_status" >&5
-+ echo "$as_me:7552: \$? = $ac_status" >&5
- if (exit $ac_status) && test -s "$ac_outfile"; then
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings other than the usual output.
-@@ -7646,11 +7649,11 @@ else
- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
- -e 's:$: $lt_compiler_flag:'`
-- (eval echo "\"\$as_me:7649: $lt_compile\"" >&5)
-+ (eval echo "\"\$as_me:7652: $lt_compile\"" >&5)
- (eval "$lt_compile" 2>out/conftest.err)
- ac_status=$?
- cat out/conftest.err >&5
-- echo "$as_me:7653: \$? = $ac_status" >&5
-+ echo "$as_me:7656: \$? = $ac_status" >&5
- if (exit $ac_status) && test -s out/conftest2.$ac_objext
- then
- # The compiler can only warn and ignore the option if not recognized
-@@ -9997,7 +10000,7 @@ else
- lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
- lt_status=$lt_dlunknown
- cat > conftest.$ac_ext <<EOF
--#line 10000 "configure"
-+#line 10003 "configure"
- #include "confdefs.h"
-
- #if HAVE_DLFCN_H
-@@ -10097,7 +10100,7 @@ else
- lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
- lt_status=$lt_dlunknown
- cat > conftest.$ac_ext <<EOF
--#line 10100 "configure"
-+#line 10103 "configure"
- #include "confdefs.h"
-
- #if HAVE_DLFCN_H
-@@ -12517,11 +12520,11 @@ else
- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
- -e 's:$: $lt_compiler_flag:'`
-- (eval echo "\"\$as_me:12520: $lt_compile\"" >&5)
-+ (eval echo "\"\$as_me:12523: $lt_compile\"" >&5)
- (eval "$lt_compile" 2>conftest.err)
- ac_status=$?
- cat conftest.err >&5
-- echo "$as_me:12524: \$? = $ac_status" >&5
-+ echo "$as_me:12527: \$? = $ac_status" >&5
- if (exit $ac_status) && test -s "$ac_outfile"; then
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings other than the usual output.
-@@ -12621,11 +12624,11 @@ else
- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
- -e 's:$: $lt_compiler_flag:'`
-- (eval echo "\"\$as_me:12624: $lt_compile\"" >&5)
-+ (eval echo "\"\$as_me:12627: $lt_compile\"" >&5)
- (eval "$lt_compile" 2>out/conftest.err)
- ac_status=$?
- cat out/conftest.err >&5
-- echo "$as_me:12628: \$? = $ac_status" >&5
-+ echo "$as_me:12631: \$? = $ac_status" >&5
- if (exit $ac_status) && test -s out/conftest2.$ac_objext
- then
- # The compiler can only warn and ignore the option if not recognized
-@@ -14185,11 +14188,11 @@ else
- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
- -e 's:$: $lt_compiler_flag:'`
-- (eval echo "\"\$as_me:14188: $lt_compile\"" >&5)
-+ (eval echo "\"\$as_me:14191: $lt_compile\"" >&5)
- (eval "$lt_compile" 2>conftest.err)
- ac_status=$?
- cat conftest.err >&5
-- echo "$as_me:14192: \$? = $ac_status" >&5
-+ echo "$as_me:14195: \$? = $ac_status" >&5
- if (exit $ac_status) && test -s "$ac_outfile"; then
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings other than the usual output.
-@@ -14289,11 +14292,11 @@ else
- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
- -e 's:$: $lt_compiler_flag:'`
-- (eval echo "\"\$as_me:14292: $lt_compile\"" >&5)
-+ (eval echo "\"\$as_me:14295: $lt_compile\"" >&5)
- (eval "$lt_compile" 2>out/conftest.err)
- ac_status=$?
- cat out/conftest.err >&5
-- echo "$as_me:14296: \$? = $ac_status" >&5
-+ echo "$as_me:14299: \$? = $ac_status" >&5
- if (exit $ac_status) && test -s out/conftest2.$ac_objext
- then
- # The compiler can only warn and ignore the option if not recognized
-@@ -16478,11 +16481,11 @@ else
- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
- -e 's:$: $lt_compiler_flag:'`
-- (eval echo "\"\$as_me:16481: $lt_compile\"" >&5)
-+ (eval echo "\"\$as_me:16484: $lt_compile\"" >&5)
- (eval "$lt_compile" 2>conftest.err)
- ac_status=$?
- cat conftest.err >&5
-- echo "$as_me:16485: \$? = $ac_status" >&5
-+ echo "$as_me:16488: \$? = $ac_status" >&5
- if (exit $ac_status) && test -s "$ac_outfile"; then
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings other than the usual output.
-@@ -16768,11 +16771,11 @@ else
- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
- -e 's:$: $lt_compiler_flag:'`
-- (eval echo "\"\$as_me:16771: $lt_compile\"" >&5)
-+ (eval echo "\"\$as_me:16774: $lt_compile\"" >&5)
- (eval "$lt_compile" 2>conftest.err)
- ac_status=$?
- cat conftest.err >&5
-- echo "$as_me:16775: \$? = $ac_status" >&5
-+ echo "$as_me:16778: \$? = $ac_status" >&5
- if (exit $ac_status) && test -s "$ac_outfile"; then
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings other than the usual output.
-@@ -16872,11 +16875,11 @@ else
- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
- -e 's:$: $lt_compiler_flag:'`
-- (eval echo "\"\$as_me:16875: $lt_compile\"" >&5)
-+ (eval echo "\"\$as_me:16878: $lt_compile\"" >&5)
- (eval "$lt_compile" 2>out/conftest.err)
- ac_status=$?
- cat out/conftest.err >&5
-- echo "$as_me:16879: \$? = $ac_status" >&5
-+ echo "$as_me:16882: \$? = $ac_status" >&5
- if (exit $ac_status) && test -s out/conftest2.$ac_objext
- then
- # The compiler can only warn and ignore the option if not recognized
-@@ -22350,6 +22353,27 @@ BRASERO_LIBS="$BRASERO_BASE_LIBS $BRASER
- LIBBURN_REQUIRED=0.4.0
- LIBISOFS_REQUIRED=0.2.8
-
-+
-+# Check whether --with-cam was given.
-+if test "${with_cam+set}" = set; then
-+ withval=$with_cam;
-+else
-+ with_cam="no"
-+fi
-+
-+
-+if text x"$with_cam" = "xyes"; then
-+ BRASERO_LIBS="$BRASERO_LIBS -lcam"
-+fi
-+ if test x"$with_cam" = "xyes"; then
-+ WITH_CAM_TRUE=
-+ WITH_CAM_FALSE='#'
-+else
-+ WITH_CAM_TRUE='#'
-+ WITH_CAM_FALSE=
-+fi
-+
-+
- # Check whether --enable-libburnia was given.
- if test "${enable_libburnia+set}" = set; then
- enableval=$enable_libburnia;
-@@ -25144,6 +25168,13 @@ echo "$as_me: error: conditional \"am__f
- Usually this means the macro was only invoked conditionally." >&2;}
- { (exit 1); exit 1; }; }
- fi
-+if test -z "${WITH_CAM_TRUE}" && test -z "${WITH_CAM_FALSE}"; then
-+ { { echo "$as_me:$LINENO: error: conditional \"WITH_CAM\" was never defined.
-+Usually this means the macro was only invoked conditionally." >&5
-+echo "$as_me: error: conditional \"WITH_CAM\" was never defined.
-+Usually this means the macro was only invoked conditionally." >&2;}
-+ { (exit 1); exit 1; }; }
-+fi
- if test -z "${BUILD_LIBBURNIA_TRUE}" && test -z "${BUILD_LIBBURNIA_FALSE}"; then
- { { echo "$as_me:$LINENO: error: conditional \"BUILD_LIBBURNIA\" was never defined.
- Usually this means the macro was only invoked conditionally." >&5
-@@ -25945,6 +25976,8 @@ BRASERO_BASE_CFLAGS!$BRASERO_BASE_CFLAGS
- BRASERO_BASE_LIBS!$BRASERO_BASE_LIBS$ac_delim
- BRASERO_CFLAGS!$BRASERO_CFLAGS$ac_delim
- BRASERO_LIBS!$BRASERO_LIBS$ac_delim
-+WITH_CAM_TRUE!$WITH_CAM_TRUE$ac_delim
-+WITH_CAM_FALSE!$WITH_CAM_FALSE$ac_delim
- LIBBURNIA_CFLAGS!$LIBBURNIA_CFLAGS$ac_delim
- LIBBURNIA_LIBS!$LIBBURNIA_LIBS$ac_delim
- BRASERO_LIBBURNIA_CFLAGS!$BRASERO_LIBBURNIA_CFLAGS$ac_delim
-@@ -26019,8 +26052,6 @@ INTLTOOL_UPDATE!$INTLTOOL_UPDATE$ac_deli
- INTLTOOL_PERL!$INTLTOOL_PERL$ac_delim
- ALL_LINGUAS!$ALL_LINGUAS$ac_delim
- SCHEMAS_INSTALL_TRUE!$SCHEMAS_INSTALL_TRUE$ac_delim
--SCHEMAS_INSTALL_FALSE!$SCHEMAS_INSTALL_FALSE$ac_delim
--GCONFTOOL!$GCONFTOOL$ac_delim
- _ACEOF
-
- if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then
-@@ -26062,6 +26093,8 @@ _ACEOF
- ac_delim='%!_!# '
- for ac_last_try in false false false false false :; do
- cat >conf$$subs.sed <<_ACEOF
-+SCHEMAS_INSTALL_FALSE!$SCHEMAS_INSTALL_FALSE$ac_delim
-+GCONFTOOL!$GCONFTOOL$ac_delim
- GCONF_SCHEMA_CONFIG_SOURCE!$GCONF_SCHEMA_CONFIG_SOURCE$ac_delim
- GCONF_SCHEMA_FILE_DIR!$GCONF_SCHEMA_FILE_DIR$ac_delim
- GCONF_SCHEMAS_INSTALL_TRUE!$GCONF_SCHEMAS_INSTALL_TRUE$ac_delim
-@@ -26070,7 +26103,7 @@ LIBOBJS!$LIBOBJS$ac_delim
- LTLIBOBJS!$LTLIBOBJS$ac_delim
- _ACEOF
-
-- if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 6; then
-+ if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 8; then
- break
- elif $ac_last_try; then
- { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
diff --git a/sysutils/brasero/files/patch-src_Makefile.in b/sysutils/brasero/files/patch-src_Makefile.in
deleted file mode 100644
index c57255769ee6..000000000000
--- a/sysutils/brasero/files/patch-src_Makefile.in
+++ /dev/null
@@ -1,275 +0,0 @@
---- src/Makefile.in.orig 2008-01-24 16:49:38.000000000 -0500
-+++ src/Makefile.in 2008-01-24 16:49:47.000000000 -0500
-@@ -45,7 +45,96 @@ CONFIG_CLEAN_FILES =
- am__installdirs = "$(DESTDIR)$(bindir)"
- binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
- PROGRAMS = $(bin_PROGRAMS)
-+am__brasero_SOURCES_DIST = brasero-marshal.h brasero-marshal.c main.c \
-+ brasero-utils.h brasero-utils.c burn-dbus.h burn-dbus.c \
-+ brasero-search-entry.c brasero-search-entry.h \
-+ brasero-search-beagle.c brasero-search-beagle.h \
-+ brasero-mime-filter.c brasero-mime-filter.h brasero-playlist.c \
-+ brasero-playlist.h brasero-player.c brasero-player.h \
-+ brasero-menu.h brasero-burn-dialog.c brasero-burn-dialog.h \
-+ brasero-disc-copy-dialog.c brasero-disc-copy-dialog.h \
-+ brasero-blank-dialog.c brasero-blank-dialog.h inotify.h \
-+ brasero-metadata.c brasero-metadata.h inotify-syscalls.h \
-+ brasero-filtered-window.c brasero-filtered-window.h \
-+ brasero-disc.c brasero-disc.h brasero-data-disc.c \
-+ brasero-data-disc.h brasero-audio-disc.c brasero-audio-disc.h \
-+ brasero-project.c brasero-project.h \
-+ brasero-project-type-chooser.c brasero-project-type-chooser.h \
-+ brasero-player-bacon.c brasero-player-bacon.h \
-+ brasero-progress.c brasero-progress.h \
-+ brasero-song-properties.c brasero-song-properties.h \
-+ brasero-tray.c brasero-tray.h burn.c burn.h burn-job.c \
-+ burn-job.h burn-process.c burn-process.h burn-basics.h \
-+ burn-basics.c burn-caps.c burn-caps.h brasero-session.c \
-+ brasero-session.h brasero-app.h brasero-uri-container.c \
-+ brasero-uri-container.h brasero-project-manager.c \
-+ brasero-project-manager.h brasero-layout.c brasero-layout.h \
-+ brasero-file-chooser.c brasero-file-chooser.h \
-+ brasero-project-size.c brasero-project-size.h burn-session.h \
-+ brasero-sum-dialog.c brasero-sum-dialog.h \
-+ brasero-tool-dialog.c brasero-tool-dialog.h brasero-ncb.h \
-+ brasero-ncb.c burn-task.c burn-task.h brasero-vfs.c \
-+ brasero-vfs.h brasero-async-task-manager.c \
-+ brasero-async-task-manager.h eggtreemultidnd.c \
-+ eggtreemultidnd.h brasero-multi-dnd.c brasero-multi-dnd.h \
-+ brasero-image-option-dialog.c brasero-image-option-dialog.h \
-+ brasero-disc-option-dialog.c brasero-disc-option-dialog.h \
-+ brasero-image-type-chooser.c brasero-image-type-chooser.h \
-+ burn-iso9660.c burn-iso9660.h brasero-layout-object.c \
-+ brasero-layout-object.h burn-volume.c burn-volume.h \
-+ burn-susp.c burn-susp.h burn-iso-field.c burn-iso-field.h \
-+ burn-medium.h cam/cam-cdrom.h cam/freebsd_dvd_rw_utils.h \
-+ scsi/scsi-base.h scsi/scsi-command.h scsi/scsi-error.h \
-+ scsi/scsi-get-configuration.h scsi/scsi-mmc1.h \
-+ scsi/scsi-mmc2.h scsi/scsi-opcodes.h \
-+ scsi/scsi-read-disc-info.h scsi/scsi-read-toc-pma-atip.h \
-+ scsi/scsi-sense-data.h scsi/scsi-sg.h scsi/scsi-utils.h \
-+ scsi/scsi-q-subchannel.h scsi/scsi-read-track-information.h \
-+ scsi/scsi-get-performance.h scsi/scsi-mmc3.h \
-+ scsi/scsi-mode-pages.h scsi/scsi-status-page.h \
-+ scsi/scsi-spc1.h scsi/scsi-read-capacity.h \
-+ scsi/scsi-read-disc-structure.h scsi/scsi-dvd-structures.h \
-+ scsi/scsi-read-format-capacities.h scsi/scsi-command.c \
-+ scsi/scsi-get-configuration.c scsi/scsi-read-disc-info.c \
-+ scsi/scsi-read-toc-pma-atip.c scsi/scsi-sense-data.c \
-+ scsi/scsi-sg.c scsi/scsi-error.c \
-+ scsi/scsi-read-track-information.c scsi/scsi-get-performance.c \
-+ scsi/scsi-mode-sense.c scsi/scsi-read-capacity.c \
-+ scsi/scsi-read-disc-structure.c \
-+ scsi/scsi-read-format-capacities.c burn-medium-scsi.c \
-+ cam/cam-cdrom.c cam/freebsd_dvd_rw_utils.c burn-medium-cam.c \
-+ burn-debug.c burn-debug.h burn-track.h burn-plugin.h \
-+ burn-plugin.c burn-plugin-private.h burn-plugin-manager.c \
-+ burn-plugin-manager.h burn-task-ctx.h burn-task-item.c \
-+ burn-task-item.h burn-task-ctx.c burn-mkisofs-base.c \
-+ burn-mkisofs-base.h brasero-drive-selection.h \
-+ brasero-drive-selection.c brasero-src-selection.h \
-+ brasero-src-selection.c brasero-dest-selection.h \
-+ brasero-dest-selection.c brasero-drive-info.c \
-+ brasero-drive-info.h brasero-drive-properties.h \
-+ brasero-drive-properties.c brasero-image-properties.h \
-+ brasero-image-properties.c brasero-xfer.c brasero-xfer.h \
-+ burn-session.c burn-track.c brasero-plugin-manager-ui.c \
-+ brasero-plugin-manager-ui.h brasero-pref.h brasero-pref.c \
-+ brasero-plugin-option.h brasero-plugin-option.c \
-+ brasero-split-dialog.h brasero-split-dialog.c \
-+ brasero-time-button.h brasero-time-button.c brasero-preview.h \
-+ brasero-preview.c burn-image-format.c burn-image-format.h
- am__objects_1 = brasero-marshal.$(OBJEXT)
-+am__objects_2 = scsi-command.$(OBJEXT) \
-+ scsi-get-configuration.$(OBJEXT) scsi-read-disc-info.$(OBJEXT) \
-+ scsi-read-toc-pma-atip.$(OBJEXT) scsi-sense-data.$(OBJEXT) \
-+ scsi-sg.$(OBJEXT) scsi-error.$(OBJEXT) \
-+ scsi-read-track-information.$(OBJEXT) \
-+ scsi-get-performance.$(OBJEXT) scsi-mode-sense.$(OBJEXT) \
-+ scsi-read-capacity.$(OBJEXT) \
-+ scsi-read-disc-structure.$(OBJEXT) \
-+ scsi-read-format-capacities.$(OBJEXT) \
-+ burn-medium-scsi.$(OBJEXT)
-+am__objects_3 = cam-cdrom.$(OBJEXT) freebsd_dvd_rw_utils.$(OBJEXT) \
-+ burn-medium-cam.$(OBJEXT)
-+@WITH_CAM_FALSE@am__objects_4 = $(am__objects_2)
-+@WITH_CAM_TRUE@am__objects_4 = $(am__objects_3)
- am_brasero_OBJECTS = $(am__objects_1) main.$(OBJEXT) \
- brasero-utils.$(OBJEXT) burn-dbus.$(OBJEXT) \
- brasero-search-entry.$(OBJEXT) brasero-search-beagle.$(OBJEXT) \
-@@ -72,19 +161,11 @@ am_brasero_OBJECTS = $(am__objects_1) ma
- brasero-disc-option-dialog.$(OBJEXT) \
- brasero-image-type-chooser.$(OBJEXT) burn-iso9660.$(OBJEXT) \
- brasero-layout-object.$(OBJEXT) burn-volume.$(OBJEXT) \
-- burn-susp.$(OBJEXT) burn-iso-field.$(OBJEXT) \
-- burn-medium.$(OBJEXT) scsi-command.$(OBJEXT) \
-- scsi-get-configuration.$(OBJEXT) scsi-read-disc-info.$(OBJEXT) \
-- scsi-read-toc-pma-atip.$(OBJEXT) scsi-sense-data.$(OBJEXT) \
-- scsi-sg.$(OBJEXT) scsi-error.$(OBJEXT) \
-- scsi-read-track-information.$(OBJEXT) \
-- scsi-get-performance.$(OBJEXT) scsi-mode-sense.$(OBJEXT) \
-- scsi-read-capacity.$(OBJEXT) \
-- scsi-read-disc-structure.$(OBJEXT) \
-- scsi-read-format-capacities.$(OBJEXT) burn-debug.$(OBJEXT) \
-- burn-plugin.$(OBJEXT) burn-plugin-manager.$(OBJEXT) \
-- burn-task-item.$(OBJEXT) burn-task-ctx.$(OBJEXT) \
-- burn-mkisofs-base.$(OBJEXT) brasero-drive-selection.$(OBJEXT) \
-+ burn-susp.$(OBJEXT) burn-iso-field.$(OBJEXT) $(am__objects_4) \
-+ burn-debug.$(OBJEXT) burn-plugin.$(OBJEXT) \
-+ burn-plugin-manager.$(OBJEXT) burn-task-item.$(OBJEXT) \
-+ burn-task-ctx.$(OBJEXT) burn-mkisofs-base.$(OBJEXT) \
-+ brasero-drive-selection.$(OBJEXT) \
- brasero-src-selection.$(OBJEXT) \
- brasero-dest-selection.$(OBJEXT) brasero-drive-info.$(OBJEXT) \
- brasero-drive-properties.$(OBJEXT) \
-@@ -110,7 +191,7 @@ LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLF
- --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
- $(LDFLAGS) -o $@
- SOURCES = $(brasero_SOURCES)
--DIST_SOURCES = $(brasero_SOURCES)
-+DIST_SOURCES = $(am__brasero_SOURCES_DIST)
- RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
- html-recursive info-recursive install-data-recursive \
- install-dvi-recursive install-exec-recursive \
-@@ -316,6 +397,7 @@ INCLUDES = \
- -I$(top_srcdir) \
- -I$(top_builddir) \
- -I./scsi \
-+ -I./cam \
- -I./md5 \
- -DBRASERO_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \
- -DBRASERO_PREFIX=\"$(prefix)\" \
-@@ -327,9 +409,30 @@ INCLUDES = \
-
- CLEANFILES = $(RECMARSHALFILES)
- AM_CFLAGS = -g
--EXTRA_DIST = cd-content-marshal.list
-+CAMFILES = cam/cam-cdrom.c \
-+ cam/freebsd_dvd_rw_utils.c \
-+ burn-medium-cam.c
-+
-+SCSIFILES = scsi/scsi-command.c \
-+ scsi/scsi-get-configuration.c \
-+ scsi/scsi-read-disc-info.c \
-+ scsi/scsi-read-toc-pma-atip.c \
-+ scsi/scsi-sense-data.c \
-+ scsi/scsi-sg.c \
-+ scsi/scsi-error.c \
-+ scsi/scsi-read-track-information.c \
-+ scsi/scsi-get-performance.c \
-+ scsi/scsi-mode-sense.c \
-+ scsi/scsi-read-capacity.c \
-+ scsi/scsi-read-disc-structure.c \
-+ scsi/scsi-read-format-capacities.c \
-+ burn-medium-scsi.c
-+
-+EXTRA_DIST = cd-content-marshal.list $(CAMFILES) $(SCSIFILES)
- GLIB_GENMARSHAL = `pkg-config --variable=glib_genmarshal glib-2.0`
- RECMARSHALFILES = brasero-marshal.h brasero-marshal.c
-+@WITH_CAM_FALSE@SCSISOURCES = $(SCSIFILES)
-+@WITH_CAM_TRUE@SCSISOURCES = $(CAMFILES)
- brasero_SOURCES = \
- $(RECMARSHALFILES) \
- main.c \
-@@ -435,43 +538,32 @@ brasero_SOURCES = \
- burn-iso-field.c \
- burn-iso-field.h \
- burn-medium.h \
-- burn-medium.c \
-+ cam/cam-cdrom.h \
-+ cam/freebsd_dvd_rw_utils.h \
- 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 \
-+ $(SCSISOURCES) \
- burn-debug.c \
- burn-debug.h \
- burn-track.h \
-@@ -647,7 +739,8 @@ distclean-compile:
- @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/burn-iso-field.Po@am__quote@
- @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/burn-iso9660.Po@am__quote@
- @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/burn-job.Po@am__quote@
--@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/burn-medium.Po@am__quote@
-+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/burn-medium-cam.Po@am__quote@
-+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/burn-medium-scsi.Po@am__quote@
- @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/burn-mkisofs-base.Po@am__quote@
- @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/burn-plugin-manager.Po@am__quote@
- @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/burn-plugin.Po@am__quote@
-@@ -660,7 +753,9 @@ distclean-compile:
- @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/burn-track.Po@am__quote@
- @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/burn-volume.Po@am__quote@
- @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/burn.Po@am__quote@
-+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cam-cdrom.Po@am__quote@
- @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eggtreemultidnd.Po@am__quote@
-+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/freebsd_dvd_rw_utils.Po@am__quote@
- @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@
- @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scsi-command.Po@am__quote@
- @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scsi-error.Po@am__quote@
-@@ -879,6 +974,34 @@ scsi-read-format-capacities.obj: scsi/sc
- @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o scsi-read-format-capacities.obj `if test -f 'scsi/scsi-read-format-capacities.c'; then $(CYGPATH_W) 'scsi/scsi-read-format-capacities.c'; else $(CYGPATH_W) '$(srcdir)/scsi/scsi-read-format-capacities.c'; fi`
-
-+cam-cdrom.o: cam/cam-cdrom.c
-+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cam-cdrom.o -MD -MP -MF $(DEPDIR)/cam-cdrom.Tpo -c -o cam-cdrom.o `test -f 'cam/cam-cdrom.c' || echo '$(srcdir)/'`cam/cam-cdrom.c
-+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/cam-cdrom.Tpo $(DEPDIR)/cam-cdrom.Po
-+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cam/cam-cdrom.c' object='cam-cdrom.o' libtool=no @AMDEPBACKSLASH@
-+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cam-cdrom.o `test -f 'cam/cam-cdrom.c' || echo '$(srcdir)/'`cam/cam-cdrom.c
-+
-+cam-cdrom.obj: cam/cam-cdrom.c
-+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cam-cdrom.obj -MD -MP -MF $(DEPDIR)/cam-cdrom.Tpo -c -o cam-cdrom.obj `if test -f 'cam/cam-cdrom.c'; then $(CYGPATH_W) 'cam/cam-cdrom.c'; else $(CYGPATH_W) '$(srcdir)/cam/cam-cdrom.c'; fi`
-+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/cam-cdrom.Tpo $(DEPDIR)/cam-cdrom.Po
-+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cam/cam-cdrom.c' object='cam-cdrom.obj' libtool=no @AMDEPBACKSLASH@
-+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cam-cdrom.obj `if test -f 'cam/cam-cdrom.c'; then $(CYGPATH_W) 'cam/cam-cdrom.c'; else $(CYGPATH_W) '$(srcdir)/cam/cam-cdrom.c'; fi`
-+
-+freebsd_dvd_rw_utils.o: cam/freebsd_dvd_rw_utils.c
-+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT freebsd_dvd_rw_utils.o -MD -MP -MF $(DEPDIR)/freebsd_dvd_rw_utils.Tpo -c -o freebsd_dvd_rw_utils.o `test -f 'cam/freebsd_dvd_rw_utils.c' || echo '$(srcdir)/'`cam/freebsd_dvd_rw_utils.c
-+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/freebsd_dvd_rw_utils.Tpo $(DEPDIR)/freebsd_dvd_rw_utils.Po
-+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cam/freebsd_dvd_rw_utils.c' object='freebsd_dvd_rw_utils.o' libtool=no @AMDEPBACKSLASH@
-+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o freebsd_dvd_rw_utils.o `test -f 'cam/freebsd_dvd_rw_utils.c' || echo '$(srcdir)/'`cam/freebsd_dvd_rw_utils.c
-+
-+freebsd_dvd_rw_utils.obj: cam/freebsd_dvd_rw_utils.c
-+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT freebsd_dvd_rw_utils.obj -MD -MP -MF $(DEPDIR)/freebsd_dvd_rw_utils.Tpo -c -o freebsd_dvd_rw_utils.obj `if test -f 'cam/freebsd_dvd_rw_utils.c'; then $(CYGPATH_W) 'cam/freebsd_dvd_rw_utils.c'; else $(CYGPATH_W) '$(srcdir)/cam/freebsd_dvd_rw_utils.c'; fi`
-+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/freebsd_dvd_rw_utils.Tpo $(DEPDIR)/freebsd_dvd_rw_utils.Po
-+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cam/freebsd_dvd_rw_utils.c' object='freebsd_dvd_rw_utils.obj' libtool=no @AMDEPBACKSLASH@
-+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o freebsd_dvd_rw_utils.obj `if test -f 'cam/freebsd_dvd_rw_utils.c'; then $(CYGPATH_W) 'cam/freebsd_dvd_rw_utils.c'; else $(CYGPATH_W) '$(srcdir)/cam/freebsd_dvd_rw_utils.c'; fi`
-+
- mostlyclean-libtool:
- -rm -f *.lo
-
diff --git a/sysutils/brasero/files/patch-src_brasero-ncb.h b/sysutils/brasero/files/patch-src_brasero-ncb.h
deleted file mode 100644
index bd5106d64789..000000000000
--- a/sysutils/brasero/files/patch-src_brasero-ncb.h
+++ /dev/null
@@ -1,12 +0,0 @@
---- src/brasero-ncb.h.orig 2008-01-02 15:01:39.000000000 -0500
-+++ src/brasero-ncb.h 2008-01-02 15:02:15.000000000 -0500
-@@ -42,6 +42,9 @@ nautilus_burn_drive_get_drive_type ((dri
- #define NCB_DRIVE_GET_DEVICE(drive) \
- nautilus_burn_drive_get_device (drive)
-
-+#define NCB_DRIVE_GET_CRECORD_DEVICE(drive) \
-+nautilus_burn_drive_get_cdrecord_device (drive)
-+
- #define NCB_DRIVE_GET_LIST(list, recorders, image) \
- { \
- NautilusBurnDriveMonitor *monitor; \
diff --git a/sysutils/brasero/files/patch-src_burn-job.c b/sysutils/brasero/files/patch-src_burn-job.c
deleted file mode 100644
index c26d1bb72169..000000000000
--- a/sysutils/brasero/files/patch-src_burn-job.c
+++ /dev/null
@@ -1,31 +0,0 @@
---- src/burn-job.c.orig 2008-01-02 15:00:34.000000000 -0500
-+++ src/burn-job.c 2008-01-02 15:01:15.000000000 -0500
-@@ -1300,6 +1300,28 @@ brasero_job_get_device (BraseroJob *self
- }
-
- BraseroBurnResult
-+brasero_job_get_cdrecord_device (BraseroJob *self, gchar **device)
-+{
-+ BraseroBurnSession *session;
-+ NautilusBurnDrive *drive;
-+ BraseroJobPrivate *priv;
-+ const gchar *path;
-+
-+ BRASERO_JOB_DEBUG (self);
-+
-+ g_return_val_if_fail (device != NULL, BRASERO_BURN_ERR);
-+
-+ priv = BRASERO_JOB_PRIVATE (self);
-+ session = brasero_task_ctx_get_session (priv->ctx);
-+
-+ drive = brasero_burn_session_get_burner (session);
-+ path = NCB_DRIVE_GET_CRECORD_DEVICE (drive);
-+ *device = g_strdup (path);
-+
-+ return BRASERO_BURN_OK;
-+}
-+
-+BraseroBurnResult
- brasero_job_get_media (BraseroJob *self, BraseroMedia *media)
- {
- BraseroBurnSession *session;
diff --git a/sysutils/brasero/files/patch-src_burn-job.h b/sysutils/brasero/files/patch-src_burn-job.h
deleted file mode 100644
index d73d8e6e2d99..000000000000
--- a/sysutils/brasero/files/patch-src_burn-job.h
+++ /dev/null
@@ -1,12 +0,0 @@
---- src/burn-job.h.orig 2008-01-02 14:59:55.000000000 -0500
-+++ src/burn-job.h 2008-01-02 15:00:13.000000000 -0500
-@@ -148,6 +148,9 @@ BraseroBurnResult
- brasero_job_get_device (BraseroJob *job, gchar **device);
-
- BraseroBurnResult
-+brasero_job_get_cdrecord_device (BraseroJob *job, gchar **device);
-+
-+BraseroBurnResult
- brasero_job_get_media (BraseroJob *job, BraseroMedia *media);
-
- BraseroBurnResult
diff --git a/sysutils/brasero/files/patch-src_burn-medium-cam.c b/sysutils/brasero/files/patch-src_burn-medium-cam.c
deleted file mode 100644
index 2db8d00ca985..000000000000
--- a/sysutils/brasero/files/patch-src_burn-medium-cam.c
+++ /dev/null
@@ -1,1928 +0,0 @@
---- src/burn-medium-cam.c.orig 2008-02-06 01:53:39.000000000 -0500
-+++ src/burn-medium-cam.c 2008-02-06 01:56:01.000000000 -0500
-@@ -0,0 +1,1925 @@
-+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-+/*
-+ * brasero
-+ * Copyright (C) Philippe Rouquier 2007 <bonfire-app@wanadoo.fr>
-+ * Joe Marcus Clarke 2007 <marcus@FreeBSD.org>
-+ *
-+ * brasero is free software.
-+ *
-+ * You may 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.
-+ *
-+ * brasero 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 General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with brasero. If not, write to:
-+ * The Free Software Foundation, Inc.,
-+ * 51 Franklin Street, Fifth Floor
-+ * Boston, MA 02110-1301, USA.
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif
-+
-+#include <sys/types.h>
-+#include <sys/stat.h>
-+#include <stdlib.h>
-+#include <fcntl.h>
-+#include <errno.h>
-+
-+#include <glib.h>
-+#include <glib/gi18n-lib.h>
-+
-+#include <nautilus-burn-drive.h>
-+
-+#include "burn-basics.h"
-+#include "burn-debug.h"
-+#include "burn-medium.h"
-+#include "cam-cdrom.h"
-+#include "scsi-read-format-capacities.h"
-+#include "scsi-read-toc-pma-atip.h"
-+#include "scsi-get-configuration.h"
-+#include "scsi-q-subchannel.h"
-+#include "scsi-utils.h"
-+#include "freebsd_dvd_rw_utils.h"
-+#include "burn-volume.h"
-+#include "brasero-ncb.h"
-+
-+const gchar *icons [] = { "gnome-dev-removable",
-+ "gnome-dev-cdrom",
-+ "gnome-dev-disc-cdr",
-+ "gnome-dev-disc-cdrw",
-+ "gnome-dev-disc-dvdrom",
-+ "gnome-dev-disc-dvdr",
-+ "gnome-dev-disc-dvdrw",
-+ "gnome-dev-disc-dvdr-plus",
-+ "gnome-dev-disc-dvdram",
-+ NULL };
-+const gchar *types [] = { N_("file"),
-+ N_("CDROM"),
-+ N_("CD-R"),
-+ N_("CD-RW"),
-+ N_("DVDROM"),
-+ N_("DVD-R"),
-+ N_("DVD-RW"),
-+ N_("DVD+R"),
-+ N_("DVD+RW"),
-+ N_("DVD+R dual layer"),
-+ N_("DVD+RW dual layer"),
-+ N_("DVD-R dual layer"),
-+ N_("DVD-RAM"),
-+ N_("Blu-ray disc"),
-+ N_("Writable Blu-ray disc"),
-+ N_("Rewritable Blu-ray disc"),
-+ NULL };
-+
-+
-+typedef struct _BraseroMediumPrivate BraseroMediumPrivate;
-+struct _BraseroMediumPrivate
-+{
-+ gint retry_id;
-+
-+ GSList * tracks;
-+
-+ const gchar *type;
-+ const gchar *icon;
-+
-+ gint max_rd;
-+ gint max_wrt;
-+
-+ gint *rd_speeds;
-+ gint *wr_speeds;
-+
-+ gint64 block_num;
-+ gint64 block_size;
-+
-+ guint64 next_wr_add;
-+ BraseroMedia info;
-+ NautilusBurnDrive * drive;
-+};
-+
-+#define BRASERO_MEDIUM_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), BRASERO_TYPE_MEDIUM, BraseroMediumPrivate))
-+
-+enum
-+{
-+ PROP_0,
-+ PROP_DRIVE
-+};
-+
-+static GObjectClass* parent_class = NULL;
-+
-+const gchar *
-+brasero_medium_get_type_string (BraseroMedium *medium)
-+{
-+ BraseroMediumPrivate *priv;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (medium);
-+ return priv->type;
-+}
-+
-+const gchar *
-+brasero_medium_get_icon (BraseroMedium *medium)
-+{
-+ BraseroMediumPrivate *priv;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (medium);
-+ return priv->icon;
-+}
-+
-+BraseroMedia
-+brasero_medium_get_status (BraseroMedium *medium)
-+{
-+ BraseroMediumPrivate *priv;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (medium);
-+ return priv->info;
-+}
-+
-+GSList *
-+brasero_medium_get_tracks (BraseroMedium *medium)
-+{
-+ BraseroMediumPrivate *priv;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (medium);
-+ return g_slist_copy (priv->tracks);
-+}
-+
-+gboolean
-+brasero_medium_get_last_data_track_address (BraseroMedium *medium,
-+ gint64 *byte,
-+ gint64 *sector)
-+{
-+ GSList *iter;
-+ BraseroMediumPrivate *priv;
-+ BraseroMediumTrack *track = NULL;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (medium);
-+
-+ for (iter = priv->tracks; iter; iter = iter->next) {
-+ BraseroMediumTrack *current;
-+
-+ current = iter->data;
-+ if (current->type & BRASERO_MEDIUM_TRACK_DATA)
-+ track = current;
-+ }
-+
-+ if (!track) {
-+ if (byte)
-+ *byte = -1;
-+ if (sector)
-+ *sector = -1;
-+ return FALSE;
-+ }
-+
-+ if (byte)
-+ *byte = track->start * priv->block_size;
-+
-+ if (sector)
-+ *sector = track->start;
-+
-+ return TRUE;
-+}
-+
-+gboolean
-+brasero_medium_get_last_data_track_space (BraseroMedium *medium,
-+ gint64 *size,
-+ gint64 *blocks)
-+{
-+ GSList *iter;
-+ BraseroMediumPrivate *priv;
-+ BraseroMediumTrack *track = NULL;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (medium);
-+
-+ for (iter = priv->tracks; iter; iter = iter->next) {
-+ BraseroMediumTrack *current;
-+
-+ current = iter->data;
-+ if (current->type & BRASERO_MEDIUM_TRACK_DATA)
-+ track = current;
-+ }
-+
-+ if (!track) {
-+ if (size)
-+ *size = -1;
-+ if (blocks)
-+ *blocks = -1;
-+ return FALSE;
-+ }
-+
-+ if (size)
-+ *size = track->blocks_num * priv->block_size;
-+ if (blocks)
-+ *blocks = track->blocks_num;
-+
-+ return TRUE;
-+}
-+
-+guint
-+brasero_medium_get_track_num (BraseroMedium *medium)
-+{
-+ guint retval = 0;
-+ GSList *iter;
-+ BraseroMediumPrivate *priv;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (medium);
-+ for (iter = priv->tracks; iter; iter = iter->next) {
-+ BraseroMediumTrack *current;
-+
-+ current = iter->data;
-+ if (current->type & BRASERO_MEDIUM_TRACK_LEADOUT)
-+ break;
-+
-+ retval ++;
-+ }
-+
-+ return retval;
-+}
-+
-+static BraseroMediumTrack *
-+brasero_medium_get_track (BraseroMedium *medium,
-+ guint num)
-+{
-+ guint i = 1;
-+ GSList *iter;
-+ BraseroMediumPrivate *priv;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (medium);
-+
-+ for (iter = priv->tracks; iter; iter = iter->next) {
-+ BraseroMediumTrack *current;
-+
-+ current = iter->data;
-+ if (current->type == BRASERO_MEDIUM_TRACK_LEADOUT)
-+ break;
-+
-+ if (i == num)
-+ return current;
-+
-+ i++;
-+ }
-+
-+ return NULL;
-+}
-+
-+gboolean
-+brasero_medium_get_track_space (BraseroMedium *medium,
-+ guint num,
-+ gint64 *size,
-+ gint64 *blocks)
-+{
-+ BraseroMediumPrivate *priv;
-+ BraseroMediumTrack *track;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (medium);
-+
-+ track = brasero_medium_get_track (medium, num);
-+ if (!track) {
-+ if (size)
-+ *size = -1;
-+ if (blocks)
-+ *blocks = -1;
-+ return FALSE;
-+ }
-+
-+ if (size)
-+ *size = track->blocks_num * priv->block_size;
-+ if (blocks)
-+ *blocks = track->blocks_num;
-+
-+ return TRUE;
-+}
-+
-+gboolean
-+brasero_medium_get_track_address (BraseroMedium *medium,
-+ guint num,
-+ gint64 *byte,
-+ gint64 *sector)
-+{
-+ BraseroMediumPrivate *priv;
-+ BraseroMediumTrack *track;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (medium);
-+
-+ track = brasero_medium_get_track (medium, num);
-+ if (!track) {
-+ if (byte)
-+ *byte = -1;
-+ if (sector)
-+ *sector = -1;
-+ return FALSE;
-+ }
-+
-+ if (byte)
-+ *byte = track->start * priv->block_size;
-+ if (sector)
-+ *sector = track->start;
-+
-+ return TRUE;
-+}
-+
-+gint64
-+brasero_medium_get_next_writable_address (BraseroMedium *medium)
-+{
-+ BraseroMediumPrivate *priv;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (medium);
-+ return priv->next_wr_add;
-+}
-+
-+gint64
-+brasero_medium_get_max_write_speed (BraseroMedium *medium)
-+{
-+ BraseroMediumPrivate *priv;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (medium);
-+ return priv->max_wrt * 1024;
-+}
-+
-+/**
-+ * NOTEs about the following functions:
-+ * for all closed media (including ROM types) capacity == size of data and
-+ * should be the size of all data on the disc, free space is 0
-+ * for all blank -R types capacity == free space and size of data == 0
-+ * for all multisession -R types capacity == free space since having the real
-+ * capacity of the media would be useless as we can only use this type of media
-+ * to append more data
-+ * for all -RW types capacity = free space + size of data. Here they can be
-+ * appended (use free space) or rewritten (whole capacity).
-+ *
-+ * Usually:
-+ * the free space is the size of the leadout track
-+ * the size of data is the sum of track sizes (excluding leadout)
-+ * the capacity depends on the media:
-+ * for closed discs == sum of track sizes
-+ * for multisession discs == free space (leadout size)
-+ * for blank discs == (free space) leadout size
-+ * for rewritable/blank == use SCSI functions to get capacity (see below)
-+ *
-+ * In fact we should really need the size of data in DVD+/-RW cases since the
-+ * session is always equal to the size of the disc.
-+ */
-+
-+void
-+brasero_medium_get_data_size (BraseroMedium *medium,
-+ gint64 *size,
-+ gint64 *blocks)
-+{
-+ GSList *iter;
-+ BraseroMediumPrivate *priv;
-+ BraseroMediumTrack *track = NULL;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (medium);
-+
-+ if (!priv->tracks) {
-+ /* that's probably because it wasn't possible to retrieve info */
-+ if (size)
-+ *size = 0;
-+
-+ if (blocks)
-+ *blocks = 0;
-+
-+ return;
-+ }
-+
-+ for (iter = priv->tracks; iter; iter = iter->next) {
-+ BraseroMediumTrack *tmp;
-+
-+ tmp = iter->data;
-+ if (tmp->type == BRASERO_MEDIUM_TRACK_LEADOUT)
-+ break;
-+
-+ track = iter->data;
-+ }
-+
-+ if (size)
-+ *size = track ? (track->start + track->blocks_num) * priv->block_size: 0;
-+
-+ if (blocks)
-+ *blocks = track ? track->start + track->blocks_num: 0;
-+}
-+
-+void
-+brasero_medium_get_free_space (BraseroMedium *medium,
-+ gint64 *size,
-+ gint64 *blocks)
-+{
-+ GSList *iter;
-+ BraseroMediumPrivate *priv;
-+ BraseroMediumTrack *track = NULL;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (medium);
-+
-+ if (!priv->tracks) {
-+ /* that's probably because it wasn't possible to retrieve info.
-+ * maybe it also happens with unformatted DVD+RW */
-+
-+ if (priv->info & BRASERO_MEDIUM_CLOSED) {
-+ if (size)
-+ *size = 0;
-+
-+ if (blocks)
-+ *blocks = 0;
-+ }
-+ else {
-+ if (size)
-+ *size = priv->block_num * priv->block_size;
-+
-+ if (blocks)
-+ *blocks = priv->block_num;
-+ }
-+
-+ return;
-+ }
-+
-+ for (iter = priv->tracks; iter; iter = iter->next) {
-+ BraseroMediumTrack *tmp;
-+
-+ tmp = iter->data;
-+ if (tmp->type == BRASERO_MEDIUM_TRACK_LEADOUT) {
-+ track = iter->data;
-+ break;
-+ }
-+ }
-+
-+ if (size) {
-+ if (!track) {
-+ /* No leadout was found so the disc is probably closed:
-+ * no free space left. */
-+ *size = 0;
-+ }
-+ else if (track->blocks_num <= 0)
-+ *size = (priv->block_num - track->start) * priv->block_size;
-+ else
-+ *size = track->blocks_num * priv->block_size;
-+ }
-+
-+ if (blocks) {
-+ if (!track) {
-+ /* No leadout was found so the disc is probably closed:
-+ * no free space left. */
-+ *blocks = 0;
-+ }
-+ else if (track->blocks_num <= 0)
-+ *blocks = priv->block_num - track->blocks_num;
-+ else
-+ *blocks = track->blocks_num;
-+ }
-+}
-+
-+void
-+brasero_medium_get_capacity (BraseroMedium *medium,
-+ gint64 *size,
-+ gint64 *blocks)
-+{
-+ BraseroMediumPrivate *priv;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (medium);
-+
-+ if (priv->info & BRASERO_MEDIUM_REWRITABLE) {
-+ if (size)
-+ *size = priv->block_num * priv->block_size;
-+
-+ if (blocks)
-+ *blocks = priv->block_num;
-+ }
-+ else if (priv->info & BRASERO_MEDIUM_CLOSED)
-+ brasero_medium_get_data_size (medium, size, blocks);
-+ else
-+ brasero_medium_get_free_space (medium, size, blocks);
-+}
-+
-+/**
-+ * Function to retrieve the capacity of a media
-+ */
-+
-+static BraseroBurnResult
-+brasero_medium_get_capacity_CD_RW (BraseroMedium *self,
-+ BRASEROCDROM *cdrom)
-+{
-+ unsigned char *atip_data = NULL;
-+ unsigned char *desc;
-+ BraseroMediumPrivate *priv;
-+ int result;
-+ int size;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (self);
-+
-+ BRASERO_BURN_LOG ("Retrieving capacity from atip");
-+
-+ result = brasero_cdrom_read_atip (cdrom, &atip_data);
-+
-+ if (result != 0) {
-+ g_free (atip_data);
-+
-+ BRASERO_BURN_LOG ("READ ATIP failed (scsi error)");
-+ return BRASERO_BURN_ERR;
-+ }
-+
-+ size = (atip_data[0] << 8 | atip_data[1]) - 2;
-+
-+ /* check the size of the structure: it must be at least 16 bytes long */
-+ if (size < 16) {
-+ if (size)
-+ g_free (atip_data);
-+
-+ BRASERO_BURN_LOG ("READ ATIP failed (wrong size)");
-+ return BRASERO_BURN_ERR;
-+ }
-+
-+ desc = atip_data + 8;
-+
-+ priv->block_num = BRASERO_MSF_TO_LBA (desc[8], desc[9], desc[10]);
-+ g_free (atip_data);
-+
-+ BRASERO_BURN_LOG ("Format capacity %lli %lli",
-+ priv->block_num,
-+ priv->block_size);
-+
-+ return BRASERO_BURN_OK;
-+}
-+
-+static BraseroBurnResult
-+brasero_medium_get_capacity_DVD_RW (BraseroMedium *self,
-+ BRASEROCDROM *cdrom)
-+{
-+ unsigned char *hdr = NULL;
-+ unsigned char *current;
-+ BraseroMediumPrivate *priv;
-+ int result;
-+
-+ BRASERO_BURN_LOG ("Retrieving format capacity");
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (self);
-+ result = brasero_cdrom_read_format_capacities (cdrom, &hdr);
-+ if (result != 0) {
-+ g_free (hdr);
-+
-+ BRASERO_BURN_LOG ("READ FORMAT CAPACITIES failed");
-+ return BRASERO_BURN_ERR;
-+ }
-+
-+ current = hdr + 5;
-+
-+ /* see if the media is already formatted */
-+ if ((current[4] & 3) != BRASERO_SCSI_DESC_FORMATTED) {
-+ int i, max;
-+ unsigned char *desc;
-+
-+ max = (hdr[4] - 8) / 8;
-+
-+ desc = hdr + 5;
-+ for (i = 0; i < max; i ++, desc += 8) {
-+ /* search for the correct descriptor */
-+ if (BRASERO_MEDIUM_IS (priv->info, BRASERO_MEDIUM_DVDRW_PLUS)) {
-+ if ((desc[4] >> 2) == BRASERO_SCSI_DVDRW_PLUS) {
-+ priv->block_num = (desc[0] << 24 | desc[1] << 16 | desc[2] << 8 | desc[3]);
-+ priv->block_size = (desc[5] << 16 | desc[6] << 8 | desc[7]);
-+
-+ /* that can happen */
-+ if (!priv->block_size)
-+ priv->block_size = 2048;
-+ break;
-+ }
-+ }
-+ else if ((desc[4] >> 2) == BRASERO_SCSI_BLOCK_SIZE_DEFAULT_AND_DB) {
-+ priv->block_num = (desc[0] << 24 | desc[1] << 16 | desc[2] << 8 | desc[3]);
-+ priv->block_size = (desc[5] << 16 | desc[6] << 8 | desc[7]);
-+ break;
-+ }
-+ }
-+ }
-+ else {
-+ priv->block_num = (current[0] << 24 | current[1] << 16 | current[2] << 8 | current[3]);
-+ priv->block_size = (current[5] << 16 | current[6] << 8 | current[7]);
-+ }
-+
-+ BRASERO_BURN_LOG ("Format capacity %lli %lli",
-+ priv->block_num,
-+ priv->block_size);
-+
-+ g_free (hdr);
-+ return BRASERO_BURN_OK;
-+}
-+
-+static BraseroBurnResult
-+brasero_medium_get_capacity_by_type (BraseroMedium *self,
-+ BRASEROCDROM *cdrom)
-+{
-+ BraseroMediumPrivate *priv;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (self);
-+
-+ priv->block_size = 2048;
-+
-+ if (!(priv->info & BRASERO_MEDIUM_REWRITABLE))
-+ return BRASERO_BURN_OK;
-+
-+ if (priv->info & BRASERO_MEDIUM_CD)
-+ brasero_medium_get_capacity_CD_RW (self, cdrom);
-+ else
-+ brasero_medium_get_capacity_DVD_RW (self, cdrom);
-+
-+ return BRASERO_BURN_OK;
-+}
-+
-+/**
-+ * Functions to retrieve the speed
-+ */
-+
-+static BraseroBurnResult
-+brasero_medium_get_speed_mmc3 (BraseroMedium *self,
-+ BRASEROCDROM *cdrom)
-+{
-+ int size;
-+ int num_desc, i;
-+ gint max_rd, max_wrt;
-+ int result;
-+ BraseroMediumPrivate *priv;
-+ unsigned char *desc;
-+ unsigned char *wrt_perf = NULL;
-+
-+ BRASERO_BURN_LOG ("Retrieving speed (Get Performance)");
-+
-+ /* 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_cdrom_get_performance_wrt_spd_desc (cdrom, &wrt_perf);
-+
-+ if (result != 0) {
-+ g_free (wrt_perf);
-+
-+ BRASERO_BURN_LOG ("GET PERFORMANCE failed");
-+ return BRASERO_BURN_ERR;
-+ }
-+
-+ size = 4 + (wrt_perf[0] << 24 | wrt_perf[1] << 16 | wrt_perf[2] << 8 | wrt_perf[3]);
-+
-+ num_desc = (size - 8) / 16;
-+
-+ if (num_desc <= 0)
-+ goto end;
-+
-+ priv->rd_speeds = g_new0 (gint, num_desc + 1);
-+ priv->wr_speeds = g_new0 (gint, num_desc + 1);
-+
-+ max_rd = 0;
-+ max_wrt = 0;
-+
-+ desc = wrt_perf + 8;
-+ for (i = 0; i < num_desc; i ++, desc += 16) {
-+ priv->rd_speeds [i] = (desc[8] << 24 | desc[9] << 16 | desc[10] << 8 || desc[11]);
-+ priv->wr_speeds [i] = (desc[12] << 24 | desc[13] << 16 | desc[14] << 8 | desc[15]);
-+
-+ max_rd = MAX (max_rd, priv->rd_speeds [i]);
-+ max_wrt = MAX (max_wrt, priv->wr_speeds [i]);
-+ }
-+
-+ priv->max_rd = max_rd;
-+ priv->max_wrt = max_wrt;
-+
-+end:
-+
-+ g_free (wrt_perf);
-+
-+ /* strangely there are so drives (I know one case) which support this
-+ * function but don't report any speed. So if our top speed is 0 then
-+ * use the other way to get the speed. It was a Teac */
-+ if (!priv->max_wrt)
-+ return BRASERO_BURN_ERR;
-+
-+ return BRASERO_BURN_OK;
-+}
-+
-+static BraseroBurnResult
-+brasero_medium_get_page_2A_write_speed_desc (BraseroMedium *self,
-+ BRASEROCDROM *cdrom)
-+{
-+ BraseroMediumPrivate *priv;
-+ int result;
-+ char *wspeeds;
-+ int rspeed, wspeed;
-+
-+ BRASERO_BURN_LOG ("Retrieving speed (2A speeds)");
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (self);
-+ result = brasero_cdrom_get_read_write_speed (cdrom, &rspeed, &wspeed, &wspeeds);
-+
-+ if (result != 0) {
-+ BRASERO_BURN_LOG ("MODE SENSE failed");
-+ return BRASERO_BURN_ERR;
-+ }
-+
-+ if (wspeeds != NULL) {
-+ char **speedv;
-+ int i;
-+
-+ speedv = g_strsplit_set (wspeeds, ",", 0);
-+ g_free (wspeeds);
-+ priv->wr_speeds = g_new0 (gint, g_strv_length (speedv) + 1);
-+ for (i = 0; speedv[i] != NULL; i++) {
-+ if (*(speedv[i]))
-+ priv->wr_speeds[i] = atoi (speedv[i]);
-+ }
-+ g_strfreev (speedv);
-+ }
-+
-+ priv->max_wrt = wspeed;
-+ priv->max_rd = rspeed;
-+
-+ return BRASERO_BURN_OK;
-+}
-+
-+static BraseroBurnResult
-+brasero_medium_get_page_2A_max_speed (BraseroMedium *self,
-+ BRASEROCDROM *cdrom)
-+{
-+ BraseroMediumPrivate *priv;
-+ int result;
-+ int rspeed, wspeed;
-+ char *wspeeds;
-+
-+ BRASERO_BURN_LOG ("Retrieving speed (2A max)");
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (self);
-+
-+ result = brasero_cdrom_get_read_write_speed (cdrom, &rspeed, &wspeed, &wspeeds);
-+
-+ if (result != 0) {
-+ BRASERO_BURN_LOG ("MODE SENSE failed");
-+ return BRASERO_BURN_ERR;
-+ }
-+
-+ priv->max_rd = rspeed;
-+ priv->max_wrt = wspeed;
-+
-+ g_free (wspeeds);
-+
-+ return BRASERO_BURN_OK;
-+}
-+
-+static BraseroBurnResult
-+brasero_medium_get_medium_type (BraseroMedium *self,
-+ BRASEROCDROM *cdrom)
-+{
-+ unsigned char *hdr = NULL;
-+ unsigned char *confdesc;
-+ BraseroMediumPrivate *priv;
-+ BraseroBurnResult result;
-+ int profile;
-+ int res;
-+
-+ BRASERO_BURN_LOG ("Retrieving media profile");
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (self);
-+ res = brasero_cdrom_get_configuration_feature (cdrom,
-+ BRASERO_SCSI_FEAT_REAL_TIME_STREAM,
-+ &hdr);
-+ if (res != 0) {
-+ unsigned char *data = NULL;
-+ unsigned char *desc;
-+ int size;
-+
-+ BRASERO_BURN_LOG ("GET CONFIGURATION failed");
-+
-+ /* This could be a MMC1 drive since this command was
-+ * introduced in MMC2 and is supported onward. So it
-+ * has to be a CD (R/RW). The rest of the information
-+ * will be provided by read_disc_information. */
-+
-+ /* The only thing here left to determine is if that's a WRITABLE
-+ * or a REWRITABLE. To determine that information, we need to
-+ * read TocPmaAtip. It if fails that's a ROM, if it succeeds.
-+ */
-+ res = brasero_cdrom_read_atip (cdrom, &data);
-+ if (res != 0) {
-+ /* CDROM */
-+ priv->info = BRASERO_MEDIUM_CDROM;
-+ priv->type = types [1];
-+ priv->icon = icons [1];
-+ }
-+ else {
-+ /* check the size of the structure: it must be at least 8 bytes long */
-+ size = (data[0] << 8 | data[1]) - 2;
-+ if (size < 8) {
-+ if (size)
-+ g_free (data);
-+
-+ BRASERO_BURN_LOG ("READ ATIP failed (wrong size)");
-+ return BRASERO_BURN_ERR;
-+ }
-+
-+ desc = data + 4;
-+
-+ if ((desc[2] >> 6) & 1) {
-+ /* CDRW */
-+ priv->info = BRASERO_MEDIUM_CDRW;
-+ priv->type = types [3];
-+ priv->icon = icons [3];
-+ }
-+ else {
-+ /* CDR */
-+ priv->info = BRASERO_MEDIUM_CDR;
-+ priv->type = types [2];
-+ priv->icon = icons [2];
-+ }
-+
-+ g_free (data);
-+ }
-+
-+ /* retrieve the speed */
-+ result = brasero_medium_get_page_2A_max_speed (self, cdrom);
-+ return result;
-+ }
-+
-+ profile = (hdr[6] << 8 | hdr[7]);
-+
-+ switch (profile) {
-+ case BRASERO_SCSI_PROF_CDROM:
-+ priv->info = BRASERO_MEDIUM_CDROM;
-+ priv->type = types [1];
-+ priv->icon = icons [1];
-+ break;
-+
-+ case BRASERO_SCSI_PROF_CDR:
-+ priv->info = BRASERO_MEDIUM_CDR;
-+ priv->type = types [2];
-+ priv->icon = icons [2];
-+ break;
-+
-+ case BRASERO_SCSI_PROF_CDRW:
-+ priv->info = BRASERO_MEDIUM_CDRW;
-+ priv->type = types [3];
-+ priv->icon = icons [3];
-+ break;
-+
-+ case BRASERO_SCSI_PROF_DVD_ROM:
-+ priv->info = BRASERO_MEDIUM_DVD_ROM;
-+ priv->type = types [4];
-+ priv->icon = icons [4];
-+ break;
-+
-+ case BRASERO_SCSI_PROF_DVD_R:
-+ priv->info = BRASERO_MEDIUM_DVDR;
-+ priv->type = types [5];
-+ priv->icon = icons [5];
-+ break;
-+
-+ case BRASERO_SCSI_PROF_DVD_RW_RESTRICTED:
-+ priv->info = BRASERO_MEDIUM_DVDRW_RESTRICTED;
-+ priv->type = types [6];
-+ priv->icon = icons [6];
-+ break;
-+
-+ case BRASERO_SCSI_PROF_DVD_RW_SEQUENTIAL:
-+ priv->info = BRASERO_MEDIUM_DVDRW;
-+ priv->type = types [6];
-+ priv->icon = icons [6];
-+ break;
-+
-+ case BRASERO_SCSI_PROF_DVD_R_PLUS:
-+ priv->info = BRASERO_MEDIUM_DVDR_PLUS;
-+ priv->type = types [7];
-+ priv->icon = icons [7];
-+ break;
-+
-+ case BRASERO_SCSI_PROF_DVD_RW_PLUS:
-+ priv->info = BRASERO_MEDIUM_DVDRW_PLUS;
-+ priv->type = types [8];
-+ priv->icon = icons [7];
-+ break;
-+
-+ /* WARNING: these types are recognized, no more */
-+ case BRASERO_SCSI_PROF_DVD_R_PLUS_DL:
-+ priv->info = BRASERO_MEDIUM_DVDR_PLUS_DL;
-+ priv->type = types [9];
-+ priv->icon = icons [7];
-+ break;
-+
-+ case BRASERO_SCSI_PROF_DVD_RW_PLUS_DL:
-+ priv->info = BRASERO_MEDIUM_DVDRW_PLUS_DL;
-+ priv->type = types [10];
-+ priv->icon = icons [7];
-+ break;
-+
-+ case BRASERO_SCSI_PROF_DVD_R_DL_SEQUENTIAL:
-+ priv->info = BRASERO_MEDIUM_DVDR_DL;
-+ priv->type = types [11];
-+ priv->icon = icons [5];
-+ break;
-+
-+ case BRASERO_SCSI_PROF_DVD_R_DL_JUMP:
-+ priv->info = BRASERO_MEDIUM_DVDR_JUMP_DL;
-+ priv->type = types [11];
-+ priv->icon = icons [5];
-+ break;
-+
-+ case BRASERO_SCSI_PROF_DVD_RAM:
-+ priv->info = BRASERO_MEDIUM_DVD_RAM;
-+ priv->type = types [12];
-+ priv->icon = icons [8];
-+ break;
-+
-+ case BRASERO_SCSI_PROF_BD_ROM:
-+ priv->info = BRASERO_MEDIUM_BD_ROM;
-+ priv->type = types [13];
-+ priv->icon = icons [4];
-+ break;
-+
-+ case BRASERO_SCSI_PROF_BR_R_SEQUENTIAL:
-+ priv->info = BRASERO_MEDIUM_BDR;
-+ priv->type = types [14];
-+ priv->icon = icons [5];
-+ break;
-+
-+ case BRASERO_SCSI_PROF_BR_R_RANDOM:
-+ priv->info = BRASERO_MEDIUM_BDR_RANDOM;
-+ priv->type = types [14];
-+ priv->icon = icons [5];
-+ break;
-+
-+ case BRASERO_SCSI_PROF_BD_RW:
-+ priv->info = BRASERO_MEDIUM_BDRW;
-+ priv->type = types [15];
-+ priv->icon = icons [6];
-+ break;
-+
-+ case BRASERO_SCSI_PROF_NON_REMOVABLE:
-+ case BRASERO_SCSI_PROF_REMOVABLE:
-+ case BRASERO_SCSI_PROF_MO_ERASABLE:
-+ case BRASERO_SCSI_PROF_MO_WRITE_ONCE:
-+ case BRASERO_SCSI_PROF_MO_ADVANCED_STORAGE:
-+ case BRASERO_SCSI_PROF_DDCD_ROM:
-+ case BRASERO_SCSI_PROF_DDCD_R:
-+ case BRASERO_SCSI_PROF_DDCD_RW:
-+ case BRASERO_SCSI_PROF_HD_DVD_ROM:
-+ case BRASERO_SCSI_PROF_HD_DVD_R:
-+ case BRASERO_SCSI_PROF_HD_DVD_RAM:
-+ priv->info = BRASERO_MEDIUM_UNSUPPORTED;
-+ priv->icon = icons [0];
-+ g_free (hdr);
-+ return BRASERO_BURN_NOT_SUPPORTED;
-+ }
-+
-+ confdesc = hdr + 8;
-+
-+ /* try all SCSI functions to get write/read speeds in order */
-+ if (confdesc[4] >= 4) {
-+ unsigned char *stream;
-+
-+ /* means it's at least an MMC3 drive */
-+ stream = confdesc + 5;
-+ if ((stream[0] >> 1) & 1) {
-+ result = brasero_medium_get_speed_mmc3 (self, cdrom);
-+ if (result == BRASERO_BURN_OK)
-+ goto end;
-+ }
-+
-+ if ((stream[0] >> 2) & 1) {
-+ result = brasero_medium_get_page_2A_write_speed_desc (self, cdrom);
-+ if (result == BRASERO_BURN_OK)
-+ goto end;
-+ }
-+ }
-+
-+ /* fallback for speeds */
-+ result = brasero_medium_get_page_2A_max_speed (self, cdrom);
-+
-+end:
-+
-+ g_free (hdr);
-+
-+ if (result != BRASERO_BURN_OK)
-+ return result;
-+
-+ return BRASERO_BURN_OK;
-+}
-+
-+static BraseroBurnResult
-+brasero_medium_get_css_feature (BraseroMedium *self,
-+ BRASEROCDROM *cdrom)
-+{
-+ unsigned char *hdr = NULL;
-+ BraseroMediumPrivate *priv;
-+ int result;
-+ int size;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (self);
-+
-+ BRASERO_BURN_LOG ("Testing for Css encrypted media");
-+ result = brasero_cdrom_get_configuration_feature (cdrom,
-+ BRASERO_SCSI_FEAT_DVD_CSS,
-+ &hdr);
-+ if (result != 0) {
-+ g_free (hdr);
-+
-+ BRASERO_BURN_LOG ("GET CONFIGURATION failed");
-+ return BRASERO_BURN_ERR;
-+ }
-+
-+ size = 4 + (hdr[0] << 24 | hdr[1] << 16 | hdr[2] << 8 | hdr[3]);
-+
-+ if (size < 9 || hdr[12] < 4) {
-+ g_free (hdr);
-+ return BRASERO_BURN_OK;
-+ }
-+
-+ /* here we just need to see if this feature is current or not */
-+ if (hdr[11] & 1) {
-+ priv->info |= BRASERO_MEDIUM_PROTECTED;
-+ BRASERO_BURN_LOG ("media is Css protected");
-+ }
-+
-+ g_free (hdr);
-+ return BRASERO_BURN_OK;
-+}
-+
-+/**
-+ * 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,
-+ BRASEROCDROM *cdrom)
-+{
-+ BraseroMediumPrivate *priv;
-+ BraseroBurnResult res;
-+ GError *error = NULL;
-+ gint64 nb_blocks;
-+
-+ if (!track)
-+ return BRASERO_BURN_ERR;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (self);
-+
-+ /* This is a special case. For DVD+RW and DVD-RW in restricted
-+ * mode, there is only one session that takes the whole disc size
-+ * once formatted. That doesn't necessarily means they have data
-+ * Note also that they are reported as complete though you can
-+ * still add data (with growisofs). It is nevertheless on the
-+ * condition that the fs is valid.
-+ * 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 (brasero_cdrom_get_fd (cdrom),
-+ track->start,
-+ &nb_blocks,
-+ NULL);
-+ if (!res) {
-+ BRASERO_BURN_LOG ("Failed to retrieve the volume size: %s",
-+ error && error->message ?
-+ error->message:"unknown error");
-+
-+ if (error)
-+ g_error_free (error);
-+ return BRASERO_BURN_ERR;
-+ }
-+
-+ track->blocks_num = nb_blocks;
-+ return BRASERO_BURN_OK;
-+}
-+
-+static BraseroBurnResult
-+brasero_medium_track_get_info (BraseroMedium *self,
-+ BraseroMediumTrack *track,
-+ int track_num,
-+ BRASEROCDROM *cdrom)
-+{
-+ unsigned char track_info[48];
-+ BraseroMediumPrivate *priv;
-+ int result;
-+ int size;
-+ int next_wrt;
-+
-+ BRASERO_BURN_LOG ("Retrieving track information for %i", track_num);
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (self);
-+
-+ /* at this point we know the type of the disc that's why we set the
-+ * size according to this type. That may help to avoid outrange address
-+ * errors. */
-+ if (BRASERO_MEDIUM_IS (priv->info, BRASERO_MEDIUM_DL|BRASERO_MEDIUM_WRITABLE))
-+ size = 48;
-+ else if (BRASERO_MEDIUM_IS (priv->info, BRASERO_MEDIUM_PLUS|BRASERO_MEDIUM_WRITABLE))
-+ size = 40;
-+ else
-+ size = 36;
-+
-+ result = brasero_cdrom_read_track_info (cdrom, track_num, track_info, size);
-+
-+ if (result != 0) {
-+ BRASERO_BURN_LOG ("READ TRACK INFO failed");
-+ return BRASERO_BURN_ERR;
-+ }
-+
-+ track->blocks_num = (track_info[24] << 24 | track_info[25] << 16 | track_info[26] << 8 | track_info[27]);
-+ track->session = (track_info[33] << 8 | track_info[3]);
-+
-+ /* 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) {
-+ BRASERO_BURN_LOG ("300 sectors size. Checking for real size");
-+ brasero_medium_track_volume_size (self, track, cdrom);
-+ }
-+
-+ next_wrt = (track_info[12] << 24 | track_info[13] << 16 | track_info[14] << 7 | track_info[15]);
-+
-+ if (next_wrt);
-+ priv->next_wr_add = next_wrt;
-+
-+ BRASERO_BURN_LOG ("Track %i (session %i): type = %i start = %llu size = %llu",
-+ track_num,
-+ track->session,
-+ track->type,
-+ track->start,
-+ track->blocks_num);
-+
-+ return BRASERO_BURN_OK;
-+}
-+
-+/**
-+ * return :
-+ * 0 when it's not possible to determine (fallback to formatted toc)
-+ * -1 for BCD
-+ * 1 for HEX */
-+static guint
-+brasero_medium_check_BCD_use (BraseroMedium *self,
-+ BRASEROCDROM *cdrom,
-+ unsigned char *desc,
-+ guint num)
-+{
-+ guint i;
-+ int size;
-+ guint leadout = 0;
-+ guint track_num = 0;
-+ gboolean use_BCD = TRUE;
-+ gboolean use_HEX = TRUE;
-+ int result;
-+ unsigned char *dptr;
-+ unsigned char track_info[48];
-+ guint start_BCD, start_LBA, track_start;
-+
-+ /* first check if all values are valid BCD numbers in the descriptors */
-+ dptr = desc;
-+ for (i = 0; i < num; i++, dptr += 11) {
-+ if ((dptr[1] >> 4) == 1 && dptr[3] <= BRASERO_SCSI_Q_SUB_CHANNEL_TRACK_START) {
-+ if (!BRASERO_IS_BCD_VALID (dptr[8])
-+ || !BRASERO_IS_BCD_VALID (dptr[9])
-+ || !BRASERO_IS_BCD_VALID (dptr[10])) {
-+ use_BCD = FALSE;
-+ break;
-+ }
-+ }
-+ else if (dptr[3] == BRASERO_SCSI_Q_SUB_CHANNEL_LEADOUT_START) {
-+ if (!BRASERO_IS_BCD_VALID (dptr[8])
-+ || !BRASERO_IS_BCD_VALID (dptr[9])
-+ || !BRASERO_IS_BCD_VALID (dptr[10])) {
-+ use_BCD = FALSE;
-+ break;
-+ }
-+ }
-+ }
-+
-+ /* then check if there are valid Hex values */
-+ dptr = desc;
-+ for (i = 0; i < num; i++, dptr += 11) {
-+ if ((dptr[i] >> 4) != 1 || dptr[3] > BRASERO_SCSI_Q_SUB_CHANNEL_TRACK_START)
-+ continue;
-+
-+ if (dptr[8] > 99
-+ || dptr[9] > 59
-+ || dptr[10] > 74) {
-+ use_HEX = FALSE;
-+ break;
-+ }
-+ }
-+
-+ if (use_BCD != use_HEX) {
-+ if (use_BCD)
-+ return -1;
-+
-+ return 1;
-+ }
-+
-+ /* To check if the drive uses BCD values or HEX values we ask for the
-+ * track information that contains also the start for the track but in
-+ * HEX values. If values are the same then it works. */
-+
-+ /* NOTE: there could be another way to do it: get first track, in LBA
-+ * and BCD it must be 150. */
-+
-+ /* First find the first track and get track start address in BCD */
-+ BRASERO_BURN_LOG ("Retrieving track information to determine number format");
-+
-+ dptr = desc;
-+ for (i = 0; i < num; i++, dptr += 11) {
-+ if ((dptr[1] >> 4) == BRASERO_SCSI_Q_SUB_CHANNEL_LEADIN_MODE5
-+ && dptr[3] == BRASERO_SCSI_Q_SUB_CHANNEL_MULTI_NEXT_SESSION) {
-+ /* store the leadout number just in case */
-+ leadout = i;
-+ continue;
-+ }
-+
-+ if ((dptr[1] >> 4) != 1 || dptr[3] > BRASERO_SCSI_Q_SUB_CHANNEL_TRACK_START)
-+ continue;
-+
-+ track_num ++;
-+
-+ start_BCD = BRASERO_MSF_TO_LBA (BRASERO_GET_BCD (dptr[8]),
-+ BRASERO_GET_BCD (dptr[9]),
-+ BRASERO_GET_BCD (dptr[10]));
-+
-+ start_LBA = BRASERO_MSF_TO_LBA (dptr[8], dptr[9], dptr[10]);
-+
-+ BRASERO_BURN_LOG ("Comparing to track information from READ TRACK INFO for track %i", track_num);
-+
-+ size = 36;
-+ start_LBA -= 150;
-+ start_BCD -= 150;
-+
-+ result = brasero_cdrom_read_track_info (cdrom,
-+ track_num,
-+ track_info,
-+ size);
-+
-+ if (result != 0) {
-+ BRASERO_BURN_LOG ("READ TRACK INFO failed");
-+ /* Fallback to formatted toc */
-+ return 0;
-+ }
-+
-+ track_start = (track_info[8] << 24 | track_info[9] << 16 | track_info[10] << 8 | track_info[11]);
-+ BRASERO_BURN_LOG ("comparing DCB %i and LBA %i to real start address %i",
-+ start_BCD, start_LBA, track_start);
-+
-+ /* try to find a conclusive match */
-+ if (track_start == start_BCD && track_start != start_LBA)
-+ return -1;
-+
-+ if (track_start == start_LBA && track_start != start_BCD)
-+ return 1;
-+ }
-+
-+ /* Our last chance, the leadout.
-+ * NOTE: no need to remove 150 sectors here. */
-+ dptr = desc + (leadout * 11);
-+ start_BCD = BRASERO_MSF_TO_LBA (BRASERO_GET_BCD (dptr[4]),
-+ BRASERO_GET_BCD (dptr[5]),
-+ BRASERO_GET_BCD (dptr[6]));
-+
-+ start_LBA = BRASERO_MSF_TO_LBA (dptr[4], dptr[5], dptr[6]);
-+
-+ BRASERO_BURN_LOG ("Comparing to track information from READ TRACK INFO for leadout");
-+
-+ size = 36;
-+
-+ /* leadout number is number of tracks + 1 */
-+ result = brasero_cdrom_read_track_info (cdrom,
-+ track_num + 1,
-+ track_info,
-+ size);
-+
-+ if (result != 0) {
-+ BRASERO_BURN_LOG ("READ TRACK INFO failed for leadout");
-+ /* Fallback to formatted toc */
-+ return 0;
-+ }
-+
-+ track_start = (track_info[8] << 24 | track_info[9] << 16 | track_info[10] << 8 | track_info[11]);
-+ BRASERO_BURN_LOG ("comparing DCB %i and LBA %i to real start address %i",
-+ start_BCD, start_LBA, track_start);
-+
-+ /* try to find a conclusive match */
-+ if (track_start == start_BCD && track_start != start_LBA)
-+ return -1;
-+
-+ if (track_start == start_LBA && track_start != start_BCD)
-+ return 1;
-+
-+ /* fallback to formatted toc */
-+ return 0;
-+}
-+
-+/**
-+ * The reason why we use this perhaps more lengthy method is that with
-+ * multisession discs, the first track is reported to be two sectors shorter
-+ * than it should. As I don't know why and since the following works we use
-+ * this one. */
-+static BraseroBurnResult
-+brasero_medium_get_CD_sessions_info (BraseroMedium *self,
-+ BRASEROCDROM *cdrom)
-+{
-+ gint use_bcd;
-+ GSList *iter;
-+ int num, i, size, res;
-+ gint leadout_start = 0;
-+ BraseroMediumPrivate *priv;
-+ unsigned char *desc;
-+ unsigned char *toc = NULL;
-+
-+ BRASERO_BURN_LOG ("Reading Raw Toc");
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (self);
-+
-+ res = brasero_cdrom_read_toc_raw (cdrom, 0, &toc);
-+ if (res != 0) {
-+ BRASERO_BURN_LOG ("READ TOC failed");
-+ return BRASERO_BURN_ERR;
-+ }
-+
-+ size = (toc[0] << 8 | toc[1]) - 2;
-+ num = size / 11;
-+
-+ BRASERO_BURN_LOG ("%i track(s) found", num);
-+
-+ desc = toc + 4;
-+ use_bcd = brasero_medium_check_BCD_use (self, cdrom, desc, num);
-+ if (!use_bcd) {
-+ g_free (toc);
-+
-+ BRASERO_BURN_LOG ("Fallback to formatted toc");
-+ return BRASERO_BURN_ERR;
-+ }
-+
-+ if (use_bcd > 0)
-+ use_bcd = 0;
-+
-+ if (use_bcd) {
-+ BRASERO_BURN_LOG ("Using BCD format");
-+ }
-+ else {
-+ BRASERO_BURN_LOG ("Using HEX format");
-+ }
-+
-+ for (i = 0; i < num; i++, desc += 11) {
-+ BraseroMediumTrack *track;
-+
-+ track = NULL;
-+ if ((desc[1] >> 4) == 1 && desc[3] <= BRASERO_SCSI_Q_SUB_CHANNEL_TRACK_START) {
-+ track = g_new0 (BraseroMediumTrack, 1);
-+ track->session = desc[0];
-+
-+ brasero_medium_set_track_type (self, track, (desc[1] & 15));
-+ if (use_bcd)
-+ track->start = BRASERO_MSF_TO_LBA (BRASERO_GET_BCD (desc[8]),
-+ BRASERO_GET_BCD (desc[9]),
-+ BRASERO_GET_BCD (desc[10]));
-+ else
-+ track->start = BRASERO_MSF_TO_LBA (desc[8],
-+ desc[9],
-+ desc[10]);
-+
-+ track->start -= 150;
-+
-+ /* if there are tracks and the last previously added track is in
-+ * the same session then set the size */
-+ if (priv->tracks) {
-+ BraseroMediumTrack *last_track;
-+
-+ last_track = priv->tracks->data;
-+ if (last_track->session == track->session)
-+ last_track->blocks_num = track->start - last_track->start;
-+ }
-+
-+ priv->tracks = g_slist_prepend (priv->tracks, track);
-+ }
-+ else if (desc[3] == BRASERO_SCSI_Q_SUB_CHANNEL_LEADOUT_START) {
-+ /* NOTE: the leadout session is first in the list. So if
-+ * we have tracks in the list set the last session track
-+ * size when we reach a new leadout (and therefore a new
-+ * session). */
-+
-+ if (priv->tracks) {
-+ BraseroMediumTrack *last_track;
-+
-+ last_track = priv->tracks->data;
-+ last_track->blocks_num = leadout_start - last_track->start;
-+ }
-+
-+ if (use_bcd)
-+ leadout_start = BRASERO_MSF_TO_LBA (BRASERO_GET_BCD (desc[8]),
-+ BRASERO_GET_BCD (desc[9]),
-+ BRASERO_GET_BCD (desc[10]));
-+ else
-+ leadout_start = BRASERO_MSF_TO_LBA (desc[8],
-+ desc[9],
-+ desc[10]);
-+ leadout_start -= 150;
-+ }
-+ }
-+
-+ if (priv->tracks) {
-+ BraseroMediumTrack *last_track;
-+
-+ /* set the last found track size */
-+ last_track = priv->tracks->data;
-+ last_track->blocks_num = leadout_start - last_track->start;
-+ }
-+
-+ /* Add a leadout */
-+ if (!(priv->info & BRASERO_MEDIUM_CLOSED)) {
-+ BraseroMediumTrack *track;
-+
-+ /* we shouldn't request info on leadout if the disc is closed */
-+ track = g_new0 (BraseroMediumTrack, 1);
-+ priv->tracks = g_slist_prepend (priv->tracks, track);
-+ track->start = leadout_start;
-+ track->type = BRASERO_MEDIUM_TRACK_LEADOUT;
-+
-+ brasero_medium_track_get_info (self, track, g_slist_length (priv->tracks), cdrom);
-+ }
-+
-+ priv->tracks = g_slist_reverse (priv->tracks);
-+
-+ for (iter = priv->tracks; iter; iter = iter->next) {
-+ BraseroMediumTrack *track;
-+
-+ track = iter->data;
-+
-+ /* 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, cdrom);
-+ }
-+
-+ BRASERO_BURN_LOG ("Track %i: type = %i start = %llu size = %llu",
-+ g_slist_index (priv->tracks, track),
-+ track->type,
-+ track->start,
-+ track->blocks_num);
-+ }
-+
-+ g_free (toc);
-+ return BRASERO_BURN_OK;
-+}
-+
-+/**
-+ * 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
-+ * For all multisession DVD-/+R and CDR-RW the remaining size is given
-+ * in the leadout. One exception though with DVD+/-RW.
-+ */
-+
-+static void
-+brasero_medium_add_DVD_plus_RW_leadout (BraseroMedium *self,
-+ gint32 start)
-+{
-+ BraseroMediumTrack *leadout;
-+ BraseroMediumPrivate *priv;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (self);
-+
-+ leadout = g_new0 (BraseroMediumTrack, 1);
-+ priv->tracks = g_slist_append (priv->tracks, leadout);
-+
-+ leadout->start = start;
-+ leadout->type = BRASERO_MEDIUM_TRACK_LEADOUT;
-+
-+ /* we fabricate the leadout here. We don't really need one in
-+ * fact since it is always at the last sector whatever the
-+ * amount of data written. So we need in fact to read the file
-+ * system and get the last sector from it. Hopefully it won't be
-+ * buggy */
-+ priv->next_wr_add = 0;
-+
-+ leadout->blocks_num = priv->block_num;
-+ if (g_slist_length (priv->tracks) > 1) {
-+ BraseroMediumTrack *track;
-+
-+ track = priv->tracks->data;
-+ leadout->blocks_num -= ((track->blocks_num > 300) ? track->blocks_num : 300);
-+ }
-+ BRASERO_BURN_LOG ("Adding fabricated leadout start = %llu length = %llu",
-+ leadout->start,
-+ leadout->blocks_num);
-+}
-+
-+static BraseroBurnResult
-+brasero_medium_get_sessions_info (BraseroMedium *self,
-+ BRASEROCDROM *cdrom)
-+{
-+ int num, i, size, res;
-+ gint32 tstart;
-+ unsigned char *toc = NULL;
-+ unsigned char *desc;
-+ BraseroMediumPrivate *priv;
-+
-+ BRASERO_BURN_LOG ("Reading Toc");
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (self);
-+ res = brasero_cdrom_read_toc_formatted (cdrom, 0, &toc);
-+ if (res != 0) {
-+ g_free (toc);
-+
-+ BRASERO_BURN_LOG ("READ TOC failed");
-+ return BRASERO_BURN_ERR;
-+ }
-+
-+ size = (toc[0] << 8 | toc[1]) - 2;
-+
-+ num = size / 8; /* Each track description is 8 bytes. */
-+
-+ BRASERO_BURN_LOG ("%i track(s) found", num);
-+
-+ for (desc = toc + 4, i = 0; i < num; i ++, desc += 8) {
-+ BraseroMediumTrack *track;
-+
-+ if (desc[2] == BRASERO_SCSI_TRACK_LEADOUT_START)
-+ break;
-+
-+ tstart = (desc[4] << 24 | desc[5] << 16 | desc[6] << 8 | desc[7]);
-+
-+ track = g_new0 (BraseroMediumTrack, 1);
-+ priv->tracks = g_slist_prepend (priv->tracks, track);
-+ track->start = tstart;
-+
-+ /* 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),
-+ cdrom);
-+
-+ if ((desc[1] & 15) & BRASERO_SCSI_TRACK_COPY)
-+ track->type |= BRASERO_MEDIUM_TRACK_COPY;
-+
-+ if (!((desc[1] & 15) & BRASERO_SCSI_TRACK_DATA)) {
-+ track->type |= BRASERO_MEDIUM_TRACK_AUDIO;
-+ priv->info |= BRASERO_MEDIUM_HAS_AUDIO;
-+
-+ if ((desc[1] & 15) & BRASERO_SCSI_TRACK_PREEMP)
-+ track->type |= BRASERO_MEDIUM_TRACK_PREEMP;
-+
-+ if ((desc[1] & 15) & 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)) {
-+ BraseroBurnResult result;
-+
-+ /* a special case for these two kinds of media (DVD+RW)
-+ * which have only one track: the first. */
-+ result = brasero_medium_track_volume_size (self,
-+ track,
-+ cdrom);
-+ if (result == BRASERO_BURN_OK) {
-+ track->type |= BRASERO_MEDIUM_TRACK_DATA;
-+ priv->info |= BRASERO_MEDIUM_HAS_DATA;
-+
-+ priv->next_wr_add = 0;
-+
-+ if ((desc[1] & 15) & BRASERO_SCSI_TRACK_DATA_INCREMENTAL)
-+ track->type |= BRASERO_MEDIUM_TRACK_INCREMENTAL;
-+ }
-+ else {
-+ 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[1] & 15) & BRASERO_SCSI_TRACK_DATA_INCREMENTAL)
-+ track->type |= BRASERO_MEDIUM_TRACK_INCREMENTAL;
-+ }
-+ }
-+
-+ /* put the tracks in the right order */
-+ priv->tracks = g_slist_reverse (priv->tracks);
-+ tstart = (desc[4] << 24 | desc[5] << 16 | desc[6] << 8 | desc[7]);
-+
-+ if (BRASERO_MEDIUM_IS (priv->info, BRASERO_MEDIUM_DVDRW_PLUS)
-+ || BRASERO_MEDIUM_IS (priv->info, BRASERO_MEDIUM_DVDRW_RESTRICTED))
-+ brasero_medium_add_DVD_plus_RW_leadout (self, tstart);
-+ else if (!(priv->info & BRASERO_MEDIUM_CLOSED)) {
-+ BraseroMediumTrack *track;
-+
-+ /* we shouldn't request info on leadout if the disc is closed
-+ * (except for DVD+/- (restricted) RW (see above) */
-+ track = g_new0 (BraseroMediumTrack, 1);
-+ priv->tracks = g_slist_append (priv->tracks, track);
-+ track->start = tstart;
-+ track->type = BRASERO_MEDIUM_TRACK_LEADOUT;
-+
-+ brasero_medium_track_get_info (self,
-+ track,
-+ g_slist_length (priv->tracks),
-+ cdrom);
-+ }
-+
-+ g_free (toc);
-+
-+ return BRASERO_BURN_OK;
-+}
-+
-+static BraseroBurnResult
-+brasero_medium_get_contents (BraseroMedium *self,
-+ BRASEROCDROM *cdrom)
-+{
-+ BraseroBurnResult result;
-+ int res;
-+ BraseroMediumPrivate *priv;
-+ unsigned char buf[32];
-+
-+ BRASERO_BURN_LOG ("Retrieving media status");
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (self);
-+
-+ res = brasero_cdrom_read_disc_information_std (cdrom, buf);
-+ if (res != 0) {
-+ BRASERO_BURN_LOG ("READ DISC INFORMATION failed");
-+ return BRASERO_BURN_ERR;
-+ }
-+
-+ if (buf[2] & 16) /* Erasable */
-+ priv->info |= BRASERO_MEDIUM_REWRITABLE;
-+
-+ if ((buf[2] & 3) == 0) { /* Empty disc */
-+ BraseroMediumTrack *track;
-+
-+ BRASERO_BURN_LOG ("Empty media");
-+
-+ priv->info |= BRASERO_MEDIUM_BLANK;
-+ priv->block_size = 2048;
-+
-+ if (BRASERO_MEDIUM_IS (priv->info, BRASERO_MEDIUM_DVDRW_PLUS)
-+ || BRASERO_MEDIUM_IS (priv->info, BRASERO_MEDIUM_DVDRW_RESTRICTED))
-+ brasero_medium_add_DVD_plus_RW_leadout (self, 0);
-+ else {
-+ track = g_new0 (BraseroMediumTrack, 1);
-+ track->start = 0;
-+ track->type = BRASERO_MEDIUM_TRACK_LEADOUT;
-+ priv->tracks = g_slist_prepend (priv->tracks, track);
-+
-+ brasero_medium_track_get_info (self,
-+ track,
-+ 1,
-+ cdrom);
-+ }
-+ goto end;
-+ }
-+
-+ if (buf[2] & 1) { /* Appendable */
-+ priv->info |= BRASERO_MEDIUM_APPENDABLE;
-+ BRASERO_BURN_LOG ("Appendable media");
-+ }
-+ else if (buf[2] & 2) { /* Complete */
-+ priv->info |= BRASERO_MEDIUM_CLOSED;
-+ BRASERO_BURN_LOG ("Closed media");
-+ }
-+
-+ if (priv->info & BRASERO_MEDIUM_CD) {
-+ result = brasero_medium_get_CD_sessions_info (self, cdrom);
-+ if (result != BRASERO_BURN_OK)
-+ result = brasero_medium_get_sessions_info (self, cdrom);
-+ }
-+ else
-+ result = brasero_medium_get_sessions_info (self, cdrom);
-+
-+ if (result != BRASERO_BURN_OK)
-+ goto end;
-+
-+end:
-+
-+ return BRASERO_BURN_OK;
-+}
-+
-+static void
-+brasero_medium_init_real (BraseroMedium *object, BRASEROCDROM *cdrom)
-+{
-+ gchar *name;
-+ BraseroBurnResult result;
-+ BraseroMediumPrivate *priv;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (object);
-+
-+ name = nautilus_burn_drive_get_name_for_display (priv->drive);
-+ BRASERO_BURN_LOG ("Initializing information for medium in %s", name);
-+ g_free (name);
-+
-+ result = brasero_medium_get_medium_type (object, cdrom);
-+ if (result != BRASERO_BURN_OK)
-+ return;
-+
-+ brasero_medium_get_capacity_by_type (object, cdrom);
-+
-+ result = brasero_medium_get_contents (object, cdrom);
-+ 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, cdrom);
-+
-+ BRASERO_BURN_LOG_DISC_TYPE (priv->info, "media is ");
-+}
-+
-+static void
-+brasero_medium_try_open (BraseroMedium *self)
-+{
-+ const gchar *path;
-+ BRASEROCDROM *cdrom;
-+ BraseroMediumPrivate *priv;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (self);
-+ path = nautilus_burn_drive_get_device (priv->drive);
-+
-+ BRASERO_BURN_LOG ("Trying to create BRASERCDROM for device %s", path);
-+ cdrom = brasero_cdrom_new (path);
-+ if (cdrom == NULL) {
-+ BRASERO_BURN_LOG ("Creation failed");
-+ return;
-+ }
-+
-+ BRASERO_BURN_LOG ("Creation succeeded");
-+ brasero_medium_init_real (self, cdrom);
-+ brasero_cdrom_free (cdrom);
-+}
-+
-+static void
-+brasero_medium_init (BraseroMedium *object)
-+{
-+ BraseroMediumPrivate *priv;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (object);
-+ priv->next_wr_add = -1;
-+
-+ /* we can't do anything here since properties haven't been set yet */
-+}
-+
-+static void
-+brasero_medium_finalize (GObject *object)
-+{
-+ BraseroMediumPrivate *priv;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (object);
-+
-+ if (priv->retry_id) {
-+ g_source_remove (priv->retry_id);
-+ priv->retry_id = 0;
-+ }
-+
-+ g_free (priv->rd_speeds);
-+ priv->rd_speeds = NULL;
-+
-+ g_free (priv->wr_speeds);
-+ priv->wr_speeds = NULL;
-+
-+ g_slist_foreach (priv->tracks, (GFunc) g_free, NULL);
-+ g_slist_free (priv->tracks);
-+ priv->tracks = NULL;
-+
-+ nautilus_burn_drive_unref (priv->drive);
-+ priv->drive = NULL;
-+
-+ G_OBJECT_CLASS (parent_class)->finalize (object);
-+}
-+
-+static void
-+brasero_medium_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
-+{
-+ BraseroMediumPrivate *priv;
-+
-+ g_return_if_fail (BRASERO_IS_MEDIUM (object));
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (object);
-+
-+ switch (prop_id)
-+ {
-+ case PROP_DRIVE:
-+ priv->drive = g_value_get_object (value);
-+ nautilus_burn_drive_ref (priv->drive);
-+ brasero_medium_try_open (BRASERO_MEDIUM (object));
-+ break;
-+ default:
-+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-+ break;
-+ }
-+}
-+
-+static void
-+brasero_medium_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
-+{
-+ BraseroMediumPrivate *priv;
-+
-+ g_return_if_fail (BRASERO_IS_MEDIUM (object));
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (object);
-+
-+ switch (prop_id)
-+ {
-+ case PROP_DRIVE:
-+ nautilus_burn_drive_ref (priv->drive);
-+ g_value_set_object (value, priv->drive);
-+ break;
-+ default:
-+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-+ break;
-+ }
-+}
-+
-+static void
-+brasero_medium_class_init (BraseroMediumClass *klass)
-+{
-+ GObjectClass* object_class = G_OBJECT_CLASS (klass);
-+ parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (klass));
-+
-+ g_type_class_add_private (klass, sizeof (BraseroMediumPrivate));
-+
-+ object_class->finalize = brasero_medium_finalize;
-+ object_class->set_property = brasero_medium_set_property;
-+ object_class->get_property = brasero_medium_get_property;
-+
-+ g_object_class_install_property (object_class,
-+ PROP_DRIVE,
-+ g_param_spec_object ("drive",
-+ "drive",
-+ "drive in which medium is inserted",
-+ NAUTILUS_BURN_TYPE_DRIVE,
-+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
-+}
-+
-+GType
-+brasero_medium_get_type (void)
-+{
-+ static GType our_type = 0;
-+
-+ if (our_type == 0)
-+ {
-+ static const GTypeInfo our_info =
-+ {
-+ sizeof (BraseroMediumClass), /* class_size */
-+ (GBaseInitFunc) NULL, /* base_init */
-+ (GBaseFinalizeFunc) NULL, /* base_finalize */
-+ (GClassInitFunc) brasero_medium_class_init, /* class_init */
-+ (GClassFinalizeFunc) NULL, /* class_finalize */
-+ NULL /* class_data */,
-+ sizeof (BraseroMedium), /* instance_size */
-+ 0, /* n_preallocs */
-+ (GInstanceInitFunc) brasero_medium_init, /* instance_init */
-+ NULL /* value_table */
-+ };
-+
-+ our_type = g_type_register_static (G_TYPE_OBJECT, "BraseroMedium",
-+ &our_info, 0);
-+ }
-+
-+ return our_type;
-+}
-+
-+BraseroMedium *
-+brasero_medium_new (NautilusBurnDrive *drive)
-+{
-+ g_return_val_if_fail (drive != NULL, NULL);
-+ return BRASERO_MEDIUM (g_object_new (BRASERO_TYPE_MEDIUM,
-+ "drive", drive,
-+ NULL));
-+}
diff --git a/sysutils/brasero/files/patch-src_burn-medium-scsi.c b/sysutils/brasero/files/patch-src_burn-medium-scsi.c
deleted file mode 100644
index 974754cdef2b..000000000000
--- a/sysutils/brasero/files/patch-src_burn-medium-scsi.c
+++ /dev/null
@@ -1,2073 +0,0 @@
---- src/burn-medium-scsi.c.orig 2008-02-06 01:53:39.000000000 -0500
-+++ src/burn-medium-scsi.c 2008-02-06 01:54:19.000000000 -0500
-@@ -0,0 +1,2070 @@
-+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-+/*
-+ * brasero
-+ * Copyright (C) Philippe Rouquier 2007 <bonfire-app@wanadoo.fr>
-+ *
-+ * brasero is free software.
-+ *
-+ * You may 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.
-+ *
-+ * brasero 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 General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with brasero. If not, write to:
-+ * The Free Software Foundation, Inc.,
-+ * 51 Franklin Street, Fifth Floor
-+ * Boston, MA 02110-1301, USA.
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif
-+
-+#include <sys/types.h>
-+#include <sys/stat.h>
-+#include <fcntl.h>
-+#include <errno.h>
-+
-+#include <glib.h>
-+#include <glib/gi18n-lib.h>
-+
-+#include <nautilus-burn-drive.h>
-+
-+#include "burn-basics.h"
-+#include "burn-debug.h"
-+#include "burn-medium.h"
-+#include "scsi-mmc1.h"
-+#include "scsi-mmc2.h"
-+#include "scsi-mmc3.h"
-+#include "scsi-spc1.h"
-+#include "scsi-utils.h"
-+#include "scsi-mode-pages.h"
-+#include "scsi-status-page.h"
-+#include "scsi-q-subchannel.h"
-+#include "scsi-dvd-structures.h"
-+#include "burn-volume.h"
-+#include "brasero-ncb.h"
-+
-+const gchar *icons [] = { "gnome-dev-removable",
-+ "gnome-dev-cdrom",
-+ "gnome-dev-disc-cdr",
-+ "gnome-dev-disc-cdrw",
-+ "gnome-dev-disc-dvdrom",
-+ "gnome-dev-disc-dvdr",
-+ "gnome-dev-disc-dvdrw",
-+ "gnome-dev-disc-dvdr-plus",
-+ "gnome-dev-disc-dvdram",
-+ NULL };
-+const gchar *types [] = { N_("file"),
-+ N_("CDROM"),
-+ N_("CD-R"),
-+ N_("CD-RW"),
-+ N_("DVDROM"),
-+ N_("DVD-R"),
-+ N_("DVD-RW"),
-+ N_("DVD+R"),
-+ N_("DVD+RW"),
-+ N_("DVD+R dual layer"),
-+ N_("DVD+RW dual layer"),
-+ N_("DVD-R dual layer"),
-+ N_("DVD-RAM"),
-+ N_("Blu-ray disc"),
-+ N_("Writable Blu-ray disc"),
-+ N_("Rewritable Blu-ray disc"),
-+ NULL };
-+
-+
-+typedef struct _BraseroMediumPrivate BraseroMediumPrivate;
-+struct _BraseroMediumPrivate
-+{
-+ gint retry_id;
-+
-+ GSList * tracks;
-+
-+ const gchar *type;
-+ const gchar *icon;
-+
-+ gint max_rd;
-+ gint max_wrt;
-+
-+ gint *rd_speeds;
-+ gint *wr_speeds;
-+
-+ gint64 block_num;
-+ gint64 block_size;
-+
-+ guint64 next_wr_add;
-+ BraseroMedia info;
-+ NautilusBurnDrive * drive;
-+};
-+
-+#define BRASERO_MEDIUM_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), BRASERO_TYPE_MEDIUM, BraseroMediumPrivate))
-+
-+/**
-+ * Try to open the drive exclusively but don't block; if drive can't be opened
-+ * exclusively then retry every second until we're shut or the drive state
-+ * changes to not busy.
-+ * 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
-+{
-+ PROP_0,
-+ PROP_DRIVE
-+};
-+
-+static GObjectClass* parent_class = NULL;
-+
-+const gchar *
-+brasero_medium_get_type_string (BraseroMedium *medium)
-+{
-+ BraseroMediumPrivate *priv;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (medium);
-+ return priv->type;
-+}
-+
-+const gchar *
-+brasero_medium_get_icon (BraseroMedium *medium)
-+{
-+ BraseroMediumPrivate *priv;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (medium);
-+ return priv->icon;
-+}
-+
-+BraseroMedia
-+brasero_medium_get_status (BraseroMedium *medium)
-+{
-+ BraseroMediumPrivate *priv;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (medium);
-+ return priv->info;
-+}
-+
-+GSList *
-+brasero_medium_get_tracks (BraseroMedium *medium)
-+{
-+ BraseroMediumPrivate *priv;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (medium);
-+ return g_slist_copy (priv->tracks);
-+}
-+
-+gboolean
-+brasero_medium_get_last_data_track_address (BraseroMedium *medium,
-+ gint64 *byte,
-+ gint64 *sector)
-+{
-+ GSList *iter;
-+ BraseroMediumPrivate *priv;
-+ BraseroMediumTrack *track = NULL;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (medium);
-+
-+ for (iter = priv->tracks; iter; iter = iter->next) {
-+ BraseroMediumTrack *current;
-+
-+ current = iter->data;
-+ if (current->type & BRASERO_MEDIUM_TRACK_DATA)
-+ track = current;
-+ }
-+
-+ if (!track) {
-+ if (byte)
-+ *byte = -1;
-+ if (sector)
-+ *sector = -1;
-+ return FALSE;
-+ }
-+
-+ if (byte)
-+ *byte = track->start * priv->block_size;
-+
-+ if (sector)
-+ *sector = track->start;
-+
-+ return TRUE;
-+}
-+
-+gboolean
-+brasero_medium_get_last_data_track_space (BraseroMedium *medium,
-+ gint64 *size,
-+ gint64 *blocks)
-+{
-+ GSList *iter;
-+ BraseroMediumPrivate *priv;
-+ BraseroMediumTrack *track = NULL;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (medium);
-+
-+ for (iter = priv->tracks; iter; iter = iter->next) {
-+ BraseroMediumTrack *current;
-+
-+ current = iter->data;
-+ if (current->type & BRASERO_MEDIUM_TRACK_DATA)
-+ track = current;
-+ }
-+
-+ if (!track) {
-+ if (size)
-+ *size = -1;
-+ if (blocks)
-+ *blocks = -1;
-+ return FALSE;
-+ }
-+
-+ if (size)
-+ *size = track->blocks_num * priv->block_size;
-+ if (blocks)
-+ *blocks = track->blocks_num;
-+
-+ return TRUE;
-+}
-+
-+guint
-+brasero_medium_get_track_num (BraseroMedium *medium)
-+{
-+ guint retval = 0;
-+ GSList *iter;
-+ BraseroMediumPrivate *priv;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (medium);
-+ for (iter = priv->tracks; iter; iter = iter->next) {
-+ BraseroMediumTrack *current;
-+
-+ current = iter->data;
-+ if (current->type & BRASERO_MEDIUM_TRACK_LEADOUT)
-+ break;
-+
-+ retval ++;
-+ }
-+
-+ return retval;
-+}
-+
-+static BraseroMediumTrack *
-+brasero_medium_get_track (BraseroMedium *medium,
-+ guint num)
-+{
-+ guint i = 1;
-+ GSList *iter;
-+ BraseroMediumPrivate *priv;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (medium);
-+
-+ for (iter = priv->tracks; iter; iter = iter->next) {
-+ BraseroMediumTrack *current;
-+
-+ current = iter->data;
-+ if (current->type == BRASERO_MEDIUM_TRACK_LEADOUT)
-+ break;
-+
-+ if (i == num)
-+ return current;
-+
-+ i++;
-+ }
-+
-+ return NULL;
-+}
-+
-+gboolean
-+brasero_medium_get_track_space (BraseroMedium *medium,
-+ guint num,
-+ gint64 *size,
-+ gint64 *blocks)
-+{
-+ BraseroMediumPrivate *priv;
-+ BraseroMediumTrack *track;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (medium);
-+
-+ track = brasero_medium_get_track (medium, num);
-+ if (!track) {
-+ if (size)
-+ *size = -1;
-+ if (blocks)
-+ *blocks = -1;
-+ return FALSE;
-+ }
-+
-+ if (size)
-+ *size = track->blocks_num * priv->block_size;
-+ if (blocks)
-+ *blocks = track->blocks_num;
-+
-+ return TRUE;
-+}
-+
-+gboolean
-+brasero_medium_get_track_address (BraseroMedium *medium,
-+ guint num,
-+ gint64 *byte,
-+ gint64 *sector)
-+{
-+ BraseroMediumPrivate *priv;
-+ BraseroMediumTrack *track;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (medium);
-+
-+ track = brasero_medium_get_track (medium, num);
-+ if (!track) {
-+ if (byte)
-+ *byte = -1;
-+ if (sector)
-+ *sector = -1;
-+ return FALSE;
-+ }
-+
-+ if (byte)
-+ *byte = track->start * priv->block_size;
-+ if (sector)
-+ *sector = track->start;
-+
-+ return TRUE;
-+}
-+
-+gint64
-+brasero_medium_get_next_writable_address (BraseroMedium *medium)
-+{
-+ BraseroMediumPrivate *priv;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (medium);
-+ return priv->next_wr_add;
-+}
-+
-+gint64
-+brasero_medium_get_max_write_speed (BraseroMedium *medium)
-+{
-+ BraseroMediumPrivate *priv;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (medium);
-+ return priv->max_wrt * 1024;
-+}
-+
-+/**
-+ * NOTEs about the following functions:
-+ * for all closed media (including ROM types) capacity == size of data and
-+ * should be the size of all data on the disc, free space is 0
-+ * for all blank -R types capacity == free space and size of data == 0
-+ * for all multisession -R types capacity == free space since having the real
-+ * capacity of the media would be useless as we can only use this type of media
-+ * to append more data
-+ * for all -RW types capacity = free space + size of data. Here they can be
-+ * appended (use free space) or rewritten (whole capacity).
-+ *
-+ * Usually:
-+ * the free space is the size of the leadout track
-+ * the size of data is the sum of track sizes (excluding leadout)
-+ * the capacity depends on the media:
-+ * for closed discs == sum of track sizes
-+ * for multisession discs == free space (leadout size)
-+ * for blank discs == (free space) leadout size
-+ * for rewritable/blank == use SCSI functions to get capacity (see below)
-+ *
-+ * In fact we should really need the size of data in DVD+/-RW cases since the
-+ * session is always equal to the size of the disc.
-+ */
-+
-+void
-+brasero_medium_get_data_size (BraseroMedium *medium,
-+ gint64 *size,
-+ gint64 *blocks)
-+{
-+ GSList *iter;
-+ BraseroMediumPrivate *priv;
-+ BraseroMediumTrack *track = NULL;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (medium);
-+
-+ if (!priv->tracks) {
-+ /* that's probably because it wasn't possible to retrieve info */
-+ if (size)
-+ *size = 0;
-+
-+ if (blocks)
-+ *blocks = 0;
-+
-+ return;
-+ }
-+
-+ for (iter = priv->tracks; iter; iter = iter->next) {
-+ BraseroMediumTrack *tmp;
-+
-+ tmp = iter->data;
-+ if (tmp->type == BRASERO_MEDIUM_TRACK_LEADOUT)
-+ break;
-+
-+ track = iter->data;
-+ }
-+
-+ if (size)
-+ *size = track ? (track->start + track->blocks_num) * priv->block_size: 0;
-+
-+ if (blocks)
-+ *blocks = track ? track->start + track->blocks_num: 0;
-+}
-+
-+void
-+brasero_medium_get_free_space (BraseroMedium *medium,
-+ gint64 *size,
-+ gint64 *blocks)
-+{
-+ GSList *iter;
-+ BraseroMediumPrivate *priv;
-+ BraseroMediumTrack *track = NULL;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (medium);
-+
-+ if (!priv->tracks) {
-+ /* that's probably because it wasn't possible to retrieve info.
-+ * maybe it also happens with unformatted DVD+RW */
-+
-+ if (priv->info & BRASERO_MEDIUM_CLOSED) {
-+ if (size)
-+ *size = 0;
-+
-+ if (blocks)
-+ *blocks = 0;
-+ }
-+ else {
-+ if (size)
-+ *size = priv->block_num * priv->block_size;
-+
-+ if (blocks)
-+ *blocks = priv->block_num;
-+ }
-+
-+ return;
-+ }
-+
-+ for (iter = priv->tracks; iter; iter = iter->next) {
-+ BraseroMediumTrack *tmp;
-+
-+ tmp = iter->data;
-+ if (tmp->type == BRASERO_MEDIUM_TRACK_LEADOUT) {
-+ track = iter->data;
-+ break;
-+ }
-+ }
-+
-+ if (size) {
-+ if (!track) {
-+ /* No leadout was found so the disc is probably closed:
-+ * no free space left. */
-+ *size = 0;
-+ }
-+ else if (track->blocks_num <= 0)
-+ *size = (priv->block_num - track->start) * priv->block_size;
-+ else
-+ *size = track->blocks_num * priv->block_size;
-+ }
-+
-+ if (blocks) {
-+ if (!track) {
-+ /* No leadout was found so the disc is probably closed:
-+ * no free space left. */
-+ *blocks = 0;
-+ }
-+ else if (track->blocks_num <= 0)
-+ *blocks = priv->block_num - track->blocks_num;
-+ else
-+ *blocks = track->blocks_num;
-+ }
-+}
-+
-+void
-+brasero_medium_get_capacity (BraseroMedium *medium,
-+ gint64 *size,
-+ gint64 *blocks)
-+{
-+ BraseroMediumPrivate *priv;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (medium);
-+
-+ if (priv->info & BRASERO_MEDIUM_REWRITABLE) {
-+ if (size)
-+ *size = priv->block_num * priv->block_size;
-+
-+ if (blocks)
-+ *blocks = priv->block_num;
-+ }
-+ else if (priv->info & BRASERO_MEDIUM_CLOSED)
-+ brasero_medium_get_data_size (medium, size, blocks);
-+ else
-+ brasero_medium_get_free_space (medium, size, blocks);
-+}
-+
-+/**
-+ * Function to retrieve the capacity of a media
-+ */
-+
-+static BraseroBurnResult
-+brasero_medium_get_capacity_CD_RW (BraseroMedium *self,
-+ int fd,
-+ BraseroScsiErrCode *code)
-+{
-+ BraseroScsiAtipData *atip_data = NULL;
-+ BraseroMediumPrivate *priv;
-+ BraseroScsiResult result;
-+ int size = 0;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (self);
-+
-+ BRASERO_BURN_LOG ("Retrieving capacity from atip");
-+
-+ result = brasero_mmc1_read_atip (fd,
-+ &atip_data,
-+ &size,
-+ NULL);
-+
-+ if (result != BRASERO_SCSI_OK) {
-+ BRASERO_BURN_LOG ("READ ATIP failed (scsi error)");
-+ return BRASERO_BURN_ERR;
-+ }
-+
-+ /* check the size of the structure: it must be at least 16 bytes long */
-+ if (size < 16) {
-+ if (size)
-+ g_free (atip_data);
-+
-+ BRASERO_BURN_LOG ("READ ATIP failed (wrong size)");
-+ return BRASERO_BURN_ERR;
-+ }
-+
-+ priv->block_num = BRASERO_MSF_TO_LBA (atip_data->desc->leadout_mn,
-+ atip_data->desc->leadout_sec,
-+ atip_data->desc->leadout_frame);
-+ g_free (atip_data);
-+
-+ BRASERO_BURN_LOG ("Format capacity %lli %lli",
-+ priv->block_num,
-+ priv->block_size);
-+
-+ return BRASERO_BURN_OK;
-+}
-+
-+static BraseroBurnResult
-+brasero_medium_get_capacity_DVD_RW (BraseroMedium *self,
-+ int fd,
-+ BraseroScsiErrCode *code)
-+{
-+ BraseroScsiFormatCapacitiesHdr *hdr = NULL;
-+ BraseroScsiMaxCapacityDesc *current;
-+ BraseroMediumPrivate *priv;
-+ BraseroScsiResult result;
-+ gint size;
-+
-+ BRASERO_BURN_LOG ("Retrieving format capacity");
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (self);
-+ result = brasero_mmc2_read_format_capacities (fd,
-+ &hdr,
-+ &size,
-+ code);
-+ if (result != BRASERO_SCSI_OK) {
-+ g_free (hdr);
-+
-+ BRASERO_BURN_LOG ("READ FORMAT CAPACITIES failed");
-+ return BRASERO_BURN_ERR;
-+ }
-+
-+ current = hdr->max_caps;
-+
-+ /* see if the media is already formatted */
-+ if (current->type != BRASERO_SCSI_DESC_FORMATTED) {
-+ int i, max;
-+ BraseroScsiFormattableCapacityDesc *desc;
-+
-+ max = (hdr->len -
-+ sizeof (BraseroScsiMaxCapacityDesc)) /
-+ sizeof (BraseroScsiFormattableCapacityDesc);
-+
-+ desc = hdr->desc;
-+ for (i = 0; i < max; i ++, desc ++) {
-+ /* search for the correct descriptor */
-+ if (BRASERO_MEDIUM_IS (priv->info, BRASERO_MEDIUM_DVDRW_PLUS)) {
-+ if (desc->format_type == BRASERO_SCSI_DVDRW_PLUS) {
-+ priv->block_num = BRASERO_GET_32 (desc->blocks_num);
-+ priv->block_size = BRASERO_GET_24 (desc->type_param);
-+
-+ /* that can happen */
-+ if (!priv->block_size)
-+ priv->block_size = 2048;
-+ break;
-+ }
-+ }
-+ else if (desc->format_type == BRASERO_SCSI_BLOCK_SIZE_DEFAULT_AND_DB) {
-+ priv->block_num = BRASERO_GET_32 (desc->blocks_num);
-+ priv->block_size = BRASERO_GET_24 (desc->type_param);
-+ break;
-+ }
-+ }
-+ }
-+ else {
-+ priv->block_num = BRASERO_GET_32 (current->blocks_num);
-+ priv->block_size = BRASERO_GET_24 (current->block_size);
-+ }
-+
-+ BRASERO_BURN_LOG ("Format capacity %lli %lli",
-+ priv->block_num,
-+ priv->block_size);
-+
-+ g_free (hdr);
-+ return BRASERO_BURN_OK;
-+}
-+
-+static BraseroBurnResult
-+brasero_medium_get_capacity_by_type (BraseroMedium *self,
-+ int fd,
-+ BraseroScsiErrCode *code)
-+{
-+ BraseroMediumPrivate *priv;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (self);
-+
-+ priv->block_size = 2048;
-+
-+ if (!(priv->info & BRASERO_MEDIUM_REWRITABLE))
-+ return BRASERO_BURN_OK;
-+
-+ if (priv->info & BRASERO_MEDIUM_CD)
-+ brasero_medium_get_capacity_CD_RW (self, fd, code);
-+ else
-+ brasero_medium_get_capacity_DVD_RW (self, fd, code);
-+
-+ return BRASERO_BURN_OK;
-+}
-+
-+/**
-+ * Functions to retrieve the speed
-+ */
-+
-+static BraseroBurnResult
-+brasero_medium_get_speed_mmc3 (BraseroMedium *self,
-+ int fd,
-+ BraseroScsiErrCode *code)
-+{
-+ int size;
-+ int num_desc, i;
-+ gint max_rd, max_wrt;
-+ BraseroScsiResult result;
-+ BraseroMediumPrivate *priv;
-+ BraseroScsiWrtSpdDesc *desc;
-+ BraseroScsiGetPerfData *wrt_perf = NULL;
-+
-+ BRASERO_BURN_LOG ("Retrieving speed (Get Performance)");
-+
-+ /* 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,
-+ &wrt_perf,
-+ &size,
-+ code);
-+
-+ if (result != BRASERO_SCSI_OK) {
-+ g_free (wrt_perf);
-+
-+ BRASERO_BURN_LOG ("GET PERFORMANCE failed");
-+ return BRASERO_BURN_ERR;
-+ }
-+
-+ num_desc = (size - sizeof (BraseroScsiGetPerfHdr)) /
-+ sizeof (BraseroScsiWrtSpdDesc);
-+
-+ if (num_desc <= 0)
-+ goto end;
-+
-+ priv->rd_speeds = g_new0 (gint, num_desc + 1);
-+ priv->wr_speeds = g_new0 (gint, num_desc + 1);
-+
-+ max_rd = 0;
-+ max_wrt = 0;
-+
-+ desc = (BraseroScsiWrtSpdDesc*) &wrt_perf->data;
-+ for (i = 0; i < num_desc; i ++, desc ++) {
-+ priv->rd_speeds [i] = BRASERO_GET_32 (desc->rd_speed);
-+ priv->wr_speeds [i] = BRASERO_GET_32 (desc->wr_speed);
-+
-+ max_rd = MAX (max_rd, priv->rd_speeds [i]);
-+ max_wrt = MAX (max_wrt, priv->wr_speeds [i]);
-+ }
-+
-+ priv->max_rd = max_rd;
-+ priv->max_wrt = max_wrt;
-+
-+end:
-+
-+ g_free (wrt_perf);
-+
-+ /* strangely there are so drives (I know one case) which support this
-+ * function but don't report any speed. So if our top speed is 0 then
-+ * use the other way to get the speed. It was a Teac */
-+ if (!priv->max_wrt)
-+ return BRASERO_BURN_ERR;
-+
-+ return BRASERO_BURN_OK;
-+}
-+
-+static BraseroBurnResult
-+brasero_medium_get_page_2A_write_speed_desc (BraseroMedium *self,
-+ int fd,
-+ BraseroScsiErrCode *code)
-+{
-+ BraseroScsiStatusPage *page_2A = NULL;
-+ BraseroScsiStatusWrSpdDesc *desc;
-+ BraseroScsiModeData *data = NULL;
-+ BraseroMediumPrivate *priv;
-+ BraseroScsiResult result;
-+ gint desc_num, i;
-+ gint max_wrt = 0;
-+ gint max_num;
-+ int size = 0;
-+
-+ BRASERO_BURN_LOG ("Retrieving speed (2A speeds)");
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (self);
-+ result = brasero_spc1_mode_sense_get_page (fd,
-+ BRASERO_SPC_PAGE_STATUS,
-+ &data,
-+ &size,
-+ code);
-+ if (result != BRASERO_SCSI_OK) {
-+ g_free (data);
-+
-+ BRASERO_BURN_LOG ("MODE SENSE failed");
-+ return BRASERO_BURN_ERR;
-+ }
-+
-+ page_2A = (BraseroScsiStatusPage *) &data->page;
-+
-+ /* FIXME: the following is not necessarily true */
-+ if (size < sizeof (BraseroScsiStatusPage)) {
-+ g_free (data);
-+
-+ BRASERO_BURN_LOG ("wrong size in page");
-+ return BRASERO_BURN_ERR;
-+ }
-+
-+ desc_num = BRASERO_GET_16 (page_2A->wr_speed_desc_num);
-+ max_num = size -
-+ sizeof (BraseroScsiStatusPage) -
-+ sizeof (BraseroScsiModeHdr);
-+ max_num /= sizeof (BraseroScsiWrtSpdDesc);
-+
-+ if (max_num < 0)
-+ max_num = 0;
-+
-+ if (desc_num > max_num)
-+ desc_num = max_num;
-+
-+ priv->wr_speeds = g_new0 (gint, desc_num + 1);
-+ desc = page_2A->wr_spd_desc;
-+ for (i = 0; i < desc_num; i ++, desc ++) {
-+ priv->wr_speeds [i] = BRASERO_GET_16 (desc->speed);
-+ max_wrt = MAX (max_wrt, priv->wr_speeds [i]);
-+ }
-+
-+ if (!max_wrt)
-+ priv->max_wrt = BRASERO_GET_16 (page_2A->wr_max_speed);
-+ else
-+ priv->max_wrt = max_wrt;
-+
-+ priv->max_rd = BRASERO_GET_16 (page_2A->rd_max_speed);
-+ g_free (data);
-+
-+ return BRASERO_BURN_OK;
-+}
-+
-+static BraseroBurnResult
-+brasero_medium_get_page_2A_max_speed (BraseroMedium *self,
-+ int fd,
-+ BraseroScsiErrCode *code)
-+{
-+ BraseroScsiStatusPage *page_2A = NULL;
-+ BraseroScsiModeData *data = NULL;
-+ BraseroMediumPrivate *priv;
-+ BraseroScsiResult result;
-+ int size = 0;
-+
-+ BRASERO_BURN_LOG ("Retrieving speed (2A max)");
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (self);
-+
-+ result = brasero_spc1_mode_sense_get_page (fd,
-+ BRASERO_SPC_PAGE_STATUS,
-+ &data,
-+ &size,
-+ code);
-+ if (result != BRASERO_SCSI_OK) {
-+ g_free (data);
-+
-+ BRASERO_BURN_LOG ("MODE SENSE failed");
-+ return BRASERO_BURN_ERR;
-+ }
-+
-+ page_2A = (BraseroScsiStatusPage *) &data->page;
-+
-+ if (size < 0x14) {
-+ g_free (data);
-+
-+ BRASERO_BURN_LOG ("wrong page size");
-+ return BRASERO_BURN_ERR;
-+ }
-+
-+ priv->max_rd = BRASERO_GET_16 (page_2A->rd_max_speed);
-+ priv->max_wrt = BRASERO_GET_16 (page_2A->wr_max_speed);
-+
-+ g_free (data);
-+ return BRASERO_BURN_OK;
-+}
-+
-+static BraseroBurnResult
-+brasero_medium_get_medium_type (BraseroMedium *self,
-+ int fd,
-+ BraseroScsiErrCode *code)
-+{
-+ BraseroScsiGetConfigHdr *hdr = NULL;
-+ BraseroMediumPrivate *priv;
-+ BraseroScsiResult result;
-+ int size;
-+
-+ BRASERO_BURN_LOG ("Retrieving media profile");
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (self);
-+ result = brasero_mmc2_get_configuration_feature (fd,
-+ BRASERO_SCSI_FEAT_REAL_TIME_STREAM,
-+ &hdr,
-+ &size,
-+ code);
-+ if (result != BRASERO_SCSI_OK) {
-+ BraseroScsiAtipData *data = NULL;
-+ int size = 0;
-+
-+ BRASERO_BURN_LOG ("GET CONFIGURATION failed");
-+
-+ /* This could be a MMC1 drive since this command was
-+ * introduced in MMC2 and is supported onward. So it
-+ * has to be a CD (R/RW). The rest of the information
-+ * will be provided by read_disc_information. */
-+
-+ /* The only thing here left to determine is if that's a WRITABLE
-+ * or a REWRITABLE. To determine that information, we need to
-+ * 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,
-+ &data,
-+ &size,
-+ NULL);
-+ if (result != BRASERO_SCSI_OK) {
-+ /* CDROM */
-+ priv->info = BRASERO_MEDIUM_CDROM;
-+ priv->type = types [1];
-+ priv->icon = icons [1];
-+ }
-+ else {
-+ /* check the size of the structure: it must be at least 8 bytes long */
-+ if (size < 8) {
-+ if (size)
-+ g_free (data);
-+
-+ BRASERO_BURN_LOG ("READ ATIP failed (wrong size)");
-+ return BRASERO_BURN_ERR;
-+ }
-+
-+ if (data->desc->erasable) {
-+ /* CDRW */
-+ priv->info = BRASERO_MEDIUM_CDRW;
-+ priv->type = types [3];
-+ priv->icon = icons [3];
-+ }
-+ else {
-+ /* CDR */
-+ priv->info = BRASERO_MEDIUM_CDR;
-+ priv->type = types [2];
-+ priv->icon = icons [2];
-+ }
-+
-+ g_free (data);
-+ }
-+
-+ /* retrieve the speed */
-+ result = brasero_medium_get_page_2A_max_speed (self,
-+ fd,
-+ code);
-+ return result;
-+ }
-+
-+ switch (BRASERO_GET_16 (hdr->current_profile)) {
-+ case BRASERO_SCSI_PROF_CDROM:
-+ priv->info = BRASERO_MEDIUM_CDROM;
-+ priv->type = types [1];
-+ priv->icon = icons [1];
-+ break;
-+
-+ case BRASERO_SCSI_PROF_CDR:
-+ priv->info = BRASERO_MEDIUM_CDR;
-+ priv->type = types [2];
-+ priv->icon = icons [2];
-+ break;
-+
-+ case BRASERO_SCSI_PROF_CDRW:
-+ priv->info = BRASERO_MEDIUM_CDRW;
-+ priv->type = types [3];
-+ priv->icon = icons [3];
-+ break;
-+
-+ case BRASERO_SCSI_PROF_DVD_ROM:
-+ priv->info = BRASERO_MEDIUM_DVD_ROM;
-+ priv->type = types [4];
-+ priv->icon = icons [4];
-+ break;
-+
-+ case BRASERO_SCSI_PROF_DVD_R:
-+ priv->info = BRASERO_MEDIUM_DVDR;
-+ priv->type = types [5];
-+ priv->icon = icons [5];
-+ break;
-+
-+ case BRASERO_SCSI_PROF_DVD_RW_RESTRICTED:
-+ priv->info = BRASERO_MEDIUM_DVDRW_RESTRICTED;
-+ priv->type = types [6];
-+ priv->icon = icons [6];
-+ break;
-+
-+ case BRASERO_SCSI_PROF_DVD_RW_SEQUENTIAL:
-+ priv->info = BRASERO_MEDIUM_DVDRW;
-+ priv->type = types [6];
-+ priv->icon = icons [6];
-+ break;
-+
-+ case BRASERO_SCSI_PROF_DVD_R_PLUS:
-+ priv->info = BRASERO_MEDIUM_DVDR_PLUS;
-+ priv->type = types [7];
-+ priv->icon = icons [7];
-+ break;
-+
-+ case BRASERO_SCSI_PROF_DVD_RW_PLUS:
-+ priv->info = BRASERO_MEDIUM_DVDRW_PLUS;
-+ priv->type = types [8];
-+ priv->icon = icons [7];
-+ break;
-+
-+ /* WARNING: these types are recognized, no more */
-+ case BRASERO_SCSI_PROF_DVD_R_PLUS_DL:
-+ priv->info = BRASERO_MEDIUM_DVDR_PLUS_DL;
-+ priv->type = types [9];
-+ priv->icon = icons [7];
-+ break;
-+
-+ case BRASERO_SCSI_PROF_DVD_RW_PLUS_DL:
-+ priv->info = BRASERO_MEDIUM_DVDRW_PLUS_DL;
-+ priv->type = types [10];
-+ priv->icon = icons [7];
-+ break;
-+
-+ case BRASERO_SCSI_PROF_DVD_R_DL_SEQUENTIAL:
-+ priv->info = BRASERO_MEDIUM_DVDR_DL;
-+ priv->type = types [11];
-+ priv->icon = icons [5];
-+ break;
-+
-+ case BRASERO_SCSI_PROF_DVD_R_DL_JUMP:
-+ priv->info = BRASERO_MEDIUM_DVDR_JUMP_DL;
-+ priv->type = types [11];
-+ priv->icon = icons [5];
-+ break;
-+
-+ case BRASERO_SCSI_PROF_DVD_RAM:
-+ priv->info = BRASERO_MEDIUM_DVD_RAM;
-+ priv->type = types [12];
-+ priv->icon = icons [8];
-+ break;
-+
-+ case BRASERO_SCSI_PROF_BD_ROM:
-+ priv->info = BRASERO_MEDIUM_BD_ROM;
-+ priv->type = types [13];
-+ priv->icon = icons [4];
-+ break;
-+
-+ case BRASERO_SCSI_PROF_BR_R_SEQUENTIAL:
-+ priv->info = BRASERO_MEDIUM_BDR;
-+ priv->type = types [14];
-+ priv->icon = icons [5];
-+ break;
-+
-+ case BRASERO_SCSI_PROF_BR_R_RANDOM:
-+ priv->info = BRASERO_MEDIUM_BDR_RANDOM;
-+ priv->type = types [14];
-+ priv->icon = icons [5];
-+ break;
-+
-+ case BRASERO_SCSI_PROF_BD_RW:
-+ priv->info = BRASERO_MEDIUM_BDRW;
-+ priv->type = types [15];
-+ priv->icon = icons [6];
-+ break;
-+
-+ case BRASERO_SCSI_PROF_NON_REMOVABLE:
-+ case BRASERO_SCSI_PROF_REMOVABLE:
-+ case BRASERO_SCSI_PROF_MO_ERASABLE:
-+ case BRASERO_SCSI_PROF_MO_WRITE_ONCE:
-+ case BRASERO_SCSI_PROF_MO_ADVANCED_STORAGE:
-+ case BRASERO_SCSI_PROF_DDCD_ROM:
-+ case BRASERO_SCSI_PROF_DDCD_R:
-+ case BRASERO_SCSI_PROF_DDCD_RW:
-+ case BRASERO_SCSI_PROF_HD_DVD_ROM:
-+ case BRASERO_SCSI_PROF_HD_DVD_R:
-+ case BRASERO_SCSI_PROF_HD_DVD_RAM:
-+ priv->info = BRASERO_MEDIUM_UNSUPPORTED;
-+ priv->icon = icons [0];
-+ g_free (hdr);
-+ return BRASERO_BURN_NOT_SUPPORTED;
-+ }
-+
-+ /* try all SCSI functions to get write/read speeds in order */
-+ if (hdr->desc->add_len >= sizeof (BraseroScsiRTStreamDesc)) {
-+ BraseroScsiRTStreamDesc *stream;
-+
-+ /* means it's at least an MMC3 drive */
-+ stream = (BraseroScsiRTStreamDesc *) hdr->desc->data;
-+ if (stream->wrt_spd) {
-+ result = brasero_medium_get_speed_mmc3 (self, fd, code);
-+ if (result == BRASERO_BURN_OK)
-+ goto end;
-+ }
-+
-+ if (stream->mp2a) {
-+ result = brasero_medium_get_page_2A_write_speed_desc (self, fd, code);
-+ if (result == BRASERO_BURN_OK)
-+ goto end;
-+ }
-+ }
-+
-+ /* fallback for speeds */
-+ result = brasero_medium_get_page_2A_max_speed (self, fd, code);
-+
-+end:
-+
-+ g_free (hdr);
-+
-+ if (result != BRASERO_BURN_OK)
-+ return result;
-+
-+ return BRASERO_BURN_OK;
-+}
-+
-+static BraseroBurnResult
-+brasero_medium_get_css_feature (BraseroMedium *self,
-+ int fd,
-+ BraseroScsiErrCode *code)
-+{
-+ BraseroScsiGetConfigHdr *hdr = NULL;
-+ BraseroMediumPrivate *priv;
-+ BraseroScsiResult result;
-+ int size;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (self);
-+
-+ BRASERO_BURN_LOG ("Testing for Css encrypted media");
-+ result = brasero_mmc2_get_configuration_feature (fd,
-+ BRASERO_SCSI_FEAT_DVD_CSS,
-+ &hdr,
-+ &size,
-+ code);
-+ if (result != BRASERO_SCSI_OK) {
-+ g_free (hdr);
-+
-+ BRASERO_BURN_LOG ("GET CONFIGURATION failed");
-+ return BRASERO_BURN_ERR;
-+ }
-+
-+ if (hdr->desc->add_len < sizeof (BraseroScsiDVDCssDesc)) {
-+ g_free (hdr);
-+ return BRASERO_BURN_OK;
-+ }
-+
-+ /* here we just need to see if this feature is current or not */
-+ if (hdr->desc->current) {
-+ priv->info |= BRASERO_MEDIUM_PROTECTED;
-+ BRASERO_BURN_LOG ("media is Css protected");
-+ }
-+
-+ g_free (hdr);
-+ return BRASERO_BURN_OK;
-+}
-+
-+/**
-+ * 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,
-+ int fd)
-+{
-+ BraseroMediumPrivate *priv;
-+ BraseroBurnResult res;
-+ GError *error = NULL;
-+ gint64 nb_blocks;
-+
-+ if (!track)
-+ return BRASERO_BURN_ERR;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (self);
-+
-+ /* This is a special case. For DVD+RW and DVD-RW in restricted
-+ * mode, there is only one session that takes the whole disc size
-+ * once formatted. That doesn't necessarily means they have data
-+ * Note also that they are reported as complete though you can
-+ * still add data (with growisofs). It is nevertheless on the
-+ * condition that the fs is valid.
-+ * 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,
-+ track->start,
-+ &nb_blocks,
-+ NULL);
-+ if (!res) {
-+ BRASERO_BURN_LOG ("Failed to retrieve the volume size: %s",
-+ error && error->message ?
-+ error->message:"unknown error");
-+
-+ if (error)
-+ g_error_free (error);
-+ return BRASERO_BURN_ERR;
-+ }
-+
-+ track->blocks_num = nb_blocks;
-+ return BRASERO_BURN_OK;
-+}
-+
-+static BraseroBurnResult
-+brasero_medium_track_get_info (BraseroMedium *self,
-+ BraseroMediumTrack *track,
-+ int track_num,
-+ int fd,
-+ BraseroScsiErrCode *code)
-+{
-+ BraseroScsiTrackInfo track_info;
-+ BraseroMediumPrivate *priv;
-+ BraseroScsiResult result;
-+ int size;
-+
-+ BRASERO_BURN_LOG ("Retrieving track information for %i", track_num);
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (self);
-+
-+ /* at this point we know the type of the disc that's why we set the
-+ * size according to this type. That may help to avoid outrange address
-+ * errors. */
-+ if (BRASERO_MEDIUM_IS (priv->info, BRASERO_MEDIUM_DL|BRASERO_MEDIUM_WRITABLE))
-+ size = 48;
-+ else if (BRASERO_MEDIUM_IS (priv->info, BRASERO_MEDIUM_PLUS|BRASERO_MEDIUM_WRITABLE))
-+ size = 40;
-+ else
-+ size = 36;
-+
-+ result = brasero_mmc1_read_track_info (fd,
-+ track_num,
-+ &track_info,
-+ &size,
-+ code);
-+
-+ if (result != BRASERO_SCSI_OK) {
-+ BRASERO_BURN_LOG ("READ TRACK INFO failed");
-+ return BRASERO_BURN_ERR;
-+ }
-+
-+ 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) {
-+ BRASERO_BURN_LOG ("300 sectors size. Checking for real size");
-+ brasero_medium_track_volume_size (self, track, fd);
-+ }
-+
-+ if (track_info.next_wrt_address_valid)
-+ priv->next_wr_add = BRASERO_GET_32 (track_info.next_wrt_address);
-+
-+ BRASERO_BURN_LOG ("Track %i (session %i): type = %i start = %llu size = %llu",
-+ track_num,
-+ track->session,
-+ track->type,
-+ track->start,
-+ track->blocks_num);
-+
-+ return BRASERO_BURN_OK;
-+}
-+
-+/**
-+ * return :
-+ * 0 when it's not possible to determine (fallback to formatted toc)
-+ * -1 for BCD
-+ * 1 for HEX */
-+static guint
-+brasero_medium_check_BCD_use (BraseroMedium *self,
-+ int fd,
-+ BraseroScsiRawTocDesc *desc,
-+ guint num,
-+ BraseroScsiErrCode *code)
-+{
-+ guint i;
-+ int size;
-+ guint leadout = 0;
-+ guint track_num = 0;
-+ gboolean use_BCD = TRUE;
-+ gboolean use_HEX = TRUE;
-+ BraseroScsiResult result;
-+ BraseroScsiTrackInfo track_info;
-+ guint start_BCD, start_LBA, track_start;
-+
-+ /* first check if all values are valid BCD numbers in the descriptors */
-+ for (i = 0; i < num; i++) {
-+ if (desc [i].adr == 1 && desc [i].point <= BRASERO_SCSI_Q_SUB_CHANNEL_TRACK_START) {
-+ if (!BRASERO_IS_BCD_VALID (desc [i].p_min)
-+ || !BRASERO_IS_BCD_VALID (desc [i].p_sec)
-+ || !BRASERO_IS_BCD_VALID (desc [i].p_frame)) {
-+ use_BCD = FALSE;
-+ break;
-+ }
-+ }
-+ else if (desc [i].point == BRASERO_SCSI_Q_SUB_CHANNEL_LEADOUT_START) {
-+ if (!BRASERO_IS_BCD_VALID (desc [i].p_min)
-+ || !BRASERO_IS_BCD_VALID (desc [i].p_sec)
-+ || !BRASERO_IS_BCD_VALID (desc [i].p_frame)) {
-+ use_BCD = FALSE;
-+ break;
-+ }
-+ }
-+ }
-+
-+ /* then check if there are valid Hex values */
-+ for (i = 0; i < num; i++) {
-+ if (desc [i].adr != 1 || desc [i].point > BRASERO_SCSI_Q_SUB_CHANNEL_TRACK_START)
-+ continue;
-+
-+ if (desc [i].p_min > 99
-+ || desc [i].p_sec > 59
-+ || desc [i].p_frame > 74) {
-+ use_HEX = FALSE;
-+ break;
-+ }
-+ }
-+
-+ if (use_BCD != use_HEX) {
-+ if (use_BCD)
-+ return -1;
-+
-+ return 1;
-+ }
-+
-+ /* To check if the drive uses BCD values or HEX values we ask for the
-+ * track information that contains also the start for the track but in
-+ * HEX values. If values are the same then it works. */
-+
-+ /* NOTE: there could be another way to do it: get first track, in LBA
-+ * and BCD it must be 150. */
-+
-+ /* First find the first track and get track start address in BCD */
-+ BRASERO_BURN_LOG ("Retrieving track information to determine number format");
-+
-+ for (i = 0; i < num; i++) {
-+ if (desc [i].adr == BRASERO_SCSI_Q_SUB_CHANNEL_LEADIN_MODE5
-+ && desc [i].point == BRASERO_SCSI_Q_SUB_CHANNEL_MULTI_NEXT_SESSION) {
-+ /* store the leadout number just in case */
-+ leadout = i;
-+ continue;
-+ }
-+
-+ if (desc [i].adr != 1 || desc [i].point > BRASERO_SCSI_Q_SUB_CHANNEL_TRACK_START)
-+ continue;
-+
-+ track_num ++;
-+
-+ start_BCD = BRASERO_MSF_TO_LBA (BRASERO_GET_BCD (desc [i].p_min),
-+ BRASERO_GET_BCD (desc [i].p_sec),
-+ BRASERO_GET_BCD (desc [i].p_frame));
-+
-+ start_LBA = BRASERO_MSF_TO_LBA (desc [i].p_min,
-+ desc [i].p_sec,
-+ desc [i].p_frame);
-+
-+ BRASERO_BURN_LOG ("Comparing to track information from READ TRACK INFO for track %i", track_num);
-+
-+ size = 36;
-+ start_LBA -= 150;
-+ start_BCD -= 150;
-+
-+ result = brasero_mmc1_read_track_info (fd,
-+ track_num,
-+ &track_info,
-+ &size,
-+ code);
-+
-+ if (result != BRASERO_SCSI_OK) {
-+ BRASERO_BURN_LOG ("READ TRACK INFO failed");
-+ /* Fallback to formatted toc */
-+ return 0;
-+ }
-+
-+ track_start = BRASERO_GET_32 (track_info.start_lba);
-+ BRASERO_BURN_LOG ("comparing DCB %i and LBA %i to real start address %i",
-+ start_BCD, start_LBA, track_start);
-+
-+ /* try to find a conclusive match */
-+ if (track_start == start_BCD && track_start != start_LBA)
-+ return -1;
-+
-+ if (track_start == start_LBA && track_start != start_BCD)
-+ return 1;
-+ }
-+
-+ /* Our last chance, the leadout.
-+ * NOTE: no need to remove 150 sectors here. */
-+ start_BCD = BRASERO_MSF_TO_LBA (BRASERO_GET_BCD (desc [leadout].min),
-+ BRASERO_GET_BCD (desc [leadout].sec),
-+ BRASERO_GET_BCD (desc [leadout].frame));
-+
-+ start_LBA = BRASERO_MSF_TO_LBA (desc [leadout].min,
-+ desc [leadout].sec,
-+ desc [leadout].frame);
-+
-+ BRASERO_BURN_LOG ("Comparing to track information from READ TRACK INFO for leadout");
-+
-+ size = 36;
-+
-+ /* leadout number is number of tracks + 1 */
-+ result = brasero_mmc1_read_track_info (fd,
-+ track_num + 1,
-+ &track_info,
-+ &size,
-+ code);
-+
-+ if (result != BRASERO_SCSI_OK) {
-+ BRASERO_BURN_LOG ("READ TRACK INFO failed for leadout");
-+ /* Fallback to formatted toc */
-+ return 0;
-+ }
-+
-+ track_start = BRASERO_GET_32 (track_info.start_lba);
-+ BRASERO_BURN_LOG ("comparing DCB %i and LBA %i to real start address %i",
-+ start_BCD, start_LBA, track_start);
-+
-+ /* try to find a conclusive match */
-+ if (track_start == start_BCD && track_start != start_LBA)
-+ return -1;
-+
-+ if (track_start == start_LBA && track_start != start_BCD)
-+ return 1;
-+
-+ /* fallback to formatted toc */
-+ return 0;
-+}
-+
-+/**
-+ * The reason why we use this perhaps more lengthy method is that with
-+ * multisession discs, the first track is reported to be two sectors shorter
-+ * than it should. As I don't know why and since the following works we use
-+ * this one. */
-+static BraseroBurnResult
-+brasero_medium_get_CD_sessions_info (BraseroMedium *self,
-+ int fd,
-+ BraseroScsiErrCode *code)
-+{
-+ gint use_bcd;
-+ GSList *iter;
-+ int num, i, size;
-+ gint leadout_start = 0;
-+ BraseroScsiResult result;
-+ BraseroMediumPrivate *priv;
-+ BraseroScsiRawTocDesc *desc;
-+ BraseroScsiRawTocData *toc = NULL;
-+
-+ BRASERO_BURN_LOG ("Reading Raw Toc");
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (self);
-+
-+ size = 0;
-+ result = brasero_mmc1_read_toc_raw (fd,
-+ 0,
-+ &toc,
-+ &size,
-+ code);
-+ if (result != BRASERO_SCSI_OK) {
-+ BRASERO_BURN_LOG ("READ TOC failed");
-+ return BRASERO_BURN_ERR;
-+ }
-+
-+ num = (size - sizeof (BraseroScsiRawTocData)) /
-+ sizeof (BraseroScsiRawTocDesc);
-+
-+ BRASERO_BURN_LOG ("%i track(s) found", num);
-+
-+ desc = toc->desc;
-+ use_bcd = brasero_medium_check_BCD_use (self, fd, desc, num, code);
-+ if (!use_bcd) {
-+ g_free (toc);
-+
-+ BRASERO_BURN_LOG ("Fallback to formatted toc");
-+ return BRASERO_BURN_ERR;
-+ }
-+
-+ if (use_bcd > 0)
-+ use_bcd = 0;
-+
-+ if (use_bcd) {
-+ BRASERO_BURN_LOG ("Using BCD format");
-+ }
-+ else {
-+ BRASERO_BURN_LOG ("Using HEX format");
-+ }
-+
-+ for (i = 0; i < num; i++, desc ++) {
-+ BraseroMediumTrack *track;
-+
-+ track = NULL;
-+ if (desc->adr == 1 && desc->point <= BRASERO_SCSI_Q_SUB_CHANNEL_TRACK_START) {
-+ track = g_new0 (BraseroMediumTrack, 1);
-+ track->session = desc->session_num;
-+
-+ brasero_medium_set_track_type (self, track, desc->control);
-+ if (use_bcd)
-+ track->start = BRASERO_MSF_TO_LBA (BRASERO_GET_BCD (desc->p_min),
-+ BRASERO_GET_BCD (desc->p_sec),
-+ BRASERO_GET_BCD (desc->p_frame));
-+ else
-+ track->start = BRASERO_MSF_TO_LBA (desc->p_min,
-+ desc->p_sec,
-+ desc->p_frame);
-+
-+ track->start -= 150;
-+
-+ /* if there are tracks and the last previously added track is in
-+ * the same session then set the size */
-+ if (priv->tracks) {
-+ BraseroMediumTrack *last_track;
-+
-+ last_track = priv->tracks->data;
-+ if (last_track->session == track->session)
-+ last_track->blocks_num = track->start - last_track->start;
-+ }
-+
-+ priv->tracks = g_slist_prepend (priv->tracks, track);
-+ }
-+ else if (desc->point == BRASERO_SCSI_Q_SUB_CHANNEL_LEADOUT_START) {
-+ /* NOTE: the leadout session is first in the list. So if
-+ * we have tracks in the list set the last session track
-+ * size when we reach a new leadout (and therefore a new
-+ * session). */
-+
-+ if (priv->tracks) {
-+ BraseroMediumTrack *last_track;
-+
-+ last_track = priv->tracks->data;
-+ last_track->blocks_num = leadout_start - last_track->start;
-+ }
-+
-+ if (use_bcd)
-+ leadout_start = BRASERO_MSF_TO_LBA (BRASERO_GET_BCD (desc->p_min),
-+ BRASERO_GET_BCD (desc->p_sec),
-+ BRASERO_GET_BCD (desc->p_frame));
-+ else
-+ leadout_start = BRASERO_MSF_TO_LBA (desc->p_min,
-+ desc->p_sec,
-+ desc->p_frame);
-+ leadout_start -= 150;
-+ }
-+ }
-+
-+ if (priv->tracks) {
-+ BraseroMediumTrack *last_track;
-+
-+ /* set the last found track size */
-+ last_track = priv->tracks->data;
-+ last_track->blocks_num = leadout_start - last_track->start;
-+ }
-+
-+ /* Add a leadout */
-+ if (!(priv->info & BRASERO_MEDIUM_CLOSED)) {
-+ BraseroMediumTrack *track;
-+
-+ /* we shouldn't request info on leadout if the disc is closed */
-+ track = g_new0 (BraseroMediumTrack, 1);
-+ priv->tracks = g_slist_prepend (priv->tracks, track);
-+ track->start = leadout_start;
-+ track->type = BRASERO_MEDIUM_TRACK_LEADOUT;
-+
-+ brasero_medium_track_get_info (self, track, g_slist_length (priv->tracks), fd, code);
-+ }
-+
-+ priv->tracks = g_slist_reverse (priv->tracks);
-+
-+ for (iter = priv->tracks; iter; iter = iter->next) {
-+ BraseroMediumTrack *track;
-+
-+ track = iter->data;
-+
-+ /* 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_BURN_LOG ("Track %i: type = %i start = %llu size = %llu",
-+ g_slist_index (priv->tracks, track),
-+ track->type,
-+ track->start,
-+ track->blocks_num);
-+ }
-+
-+ g_free (toc);
-+ return BRASERO_BURN_OK;
-+}
-+
-+/**
-+ * 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
-+ * For all multisession DVD-/+R and CDR-RW the remaining size is given
-+ * in the leadout. One exception though with DVD+/-RW.
-+ */
-+
-+static void
-+brasero_medium_add_DVD_plus_RW_leadout (BraseroMedium *self,
-+ gint32 start)
-+{
-+ BraseroMediumTrack *leadout;
-+ BraseroMediumPrivate *priv;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (self);
-+
-+ leadout = g_new0 (BraseroMediumTrack, 1);
-+ priv->tracks = g_slist_append (priv->tracks, leadout);
-+
-+ leadout->start = start;
-+ leadout->type = BRASERO_MEDIUM_TRACK_LEADOUT;
-+
-+ /* we fabricate the leadout here. We don't really need one in
-+ * fact since it is always at the last sector whatever the
-+ * amount of data written. So we need in fact to read the file
-+ * system and get the last sector from it. Hopefully it won't be
-+ * buggy */
-+ priv->next_wr_add = 0;
-+
-+ leadout->blocks_num = priv->block_num;
-+ if (g_slist_length (priv->tracks) > 1) {
-+ BraseroMediumTrack *track;
-+
-+ track = priv->tracks->data;
-+ leadout->blocks_num -= ((track->blocks_num > 300) ? track->blocks_num : 300);
-+ }
-+ BRASERO_BURN_LOG ("Adding fabricated leadout start = %llu length = %llu",
-+ leadout->start,
-+ leadout->blocks_num);
-+}
-+
-+static BraseroBurnResult
-+brasero_medium_get_sessions_info (BraseroMedium *self,
-+ int fd,
-+ BraseroScsiErrCode *code)
-+{
-+ int num, i, size;
-+ BraseroScsiResult result;
-+ BraseroScsiTocDesc *desc;
-+ BraseroMediumPrivate *priv;
-+ BraseroScsiFormattedTocData *toc = NULL;
-+
-+ BRASERO_BURN_LOG ("Reading Toc");
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (self);
-+ result = brasero_mmc1_read_toc_formatted (fd,
-+ 0,
-+ &toc,
-+ &size,
-+ code);
-+ if (result != BRASERO_SCSI_OK) {
-+ g_free (toc);
-+
-+ BRASERO_BURN_LOG ("READ TOC failed");
-+ return BRASERO_BURN_ERR;
-+ }
-+
-+ num = (size - sizeof (BraseroScsiFormattedTocData)) /
-+ sizeof (BraseroScsiTocDesc);
-+
-+ BRASERO_BURN_LOG ("%i track(s) found", num);
-+
-+ desc = toc->desc;
-+ for (i = 0; i < num; i ++, desc ++) {
-+ BraseroMediumTrack *track;
-+
-+ if (desc->track_num == BRASERO_SCSI_TRACK_LEADOUT_START)
-+ break;
-+
-+ track = g_new0 (BraseroMediumTrack, 1);
-+ priv->tracks = g_slist_prepend (priv->tracks, track);
-+ 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),
-+ fd,
-+ code);
-+
-+ if (desc->control & BRASERO_SCSI_TRACK_COPY)
-+ track->type |= BRASERO_MEDIUM_TRACK_COPY;
-+
-+ if (!(desc->control & BRASERO_SCSI_TRACK_DATA)) {
-+ track->type |= BRASERO_MEDIUM_TRACK_AUDIO;
-+ priv->info |= BRASERO_MEDIUM_HAS_AUDIO;
-+
-+ if (desc->control & BRASERO_SCSI_TRACK_PREEMP)
-+ track->type |= BRASERO_MEDIUM_TRACK_PREEMP;
-+
-+ 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)) {
-+ BraseroBurnResult result;
-+
-+ /* a special case for these two kinds of media (DVD+RW)
-+ * which have only one track: the first. */
-+ result = brasero_medium_track_volume_size (self,
-+ track,
-+ fd);
-+ 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 {
-+ 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;
-+ }
-+ }
-+
-+ /* put the tracks in the right order */
-+ priv->tracks = g_slist_reverse (priv->tracks);
-+
-+ if (BRASERO_MEDIUM_IS (priv->info, BRASERO_MEDIUM_DVDRW_PLUS)
-+ || BRASERO_MEDIUM_IS (priv->info, BRASERO_MEDIUM_DVDRW_RESTRICTED))
-+ brasero_medium_add_DVD_plus_RW_leadout (self, BRASERO_GET_32 (desc->track_start));
-+ else if (!(priv->info & BRASERO_MEDIUM_CLOSED)) {
-+ BraseroMediumTrack *track;
-+
-+ /* we shouldn't request info on leadout if the disc is closed
-+ * (except for DVD+/- (restricted) RW (see above) */
-+ track = g_new0 (BraseroMediumTrack, 1);
-+ priv->tracks = g_slist_append (priv->tracks, track);
-+ track->start = BRASERO_GET_32 (desc->track_start);
-+ track->type = BRASERO_MEDIUM_TRACK_LEADOUT;
-+
-+ brasero_medium_track_get_info (self,
-+ track,
-+ g_slist_length (priv->tracks),
-+ fd,
-+ code);
-+ }
-+
-+ g_free (toc);
-+
-+ return BRASERO_BURN_OK;
-+}
-+
-+static BraseroBurnResult
-+brasero_medium_get_contents (BraseroMedium *self,
-+ int fd,
-+ BraseroScsiErrCode *code)
-+{
-+ int size;
-+ BraseroScsiResult result;
-+ BraseroMediumPrivate *priv;
-+ BraseroScsiDiscInfoStd *info = NULL;
-+
-+ BRASERO_BURN_LOG ("Retrieving media status");
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (self);
-+
-+ result = brasero_mmc1_read_disc_information_std (fd,
-+ &info,
-+ &size,
-+ code);
-+ if (result != BRASERO_SCSI_OK) {
-+ g_free (info);
-+
-+ BRASERO_BURN_LOG ("READ DISC INFORMATION failed");
-+ return BRASERO_BURN_ERR;
-+ }
-+
-+ if (info->erasable)
-+ priv->info |= BRASERO_MEDIUM_REWRITABLE;
-+
-+ if (info->status == BRASERO_SCSI_DISC_EMPTY) {
-+ BraseroMediumTrack *track;
-+
-+ BRASERO_BURN_LOG ("Empty media");
-+
-+ priv->info |= BRASERO_MEDIUM_BLANK;
-+ priv->block_size = 2048;
-+
-+ if (BRASERO_MEDIUM_IS (priv->info, BRASERO_MEDIUM_DVDRW_PLUS)
-+ || BRASERO_MEDIUM_IS (priv->info, BRASERO_MEDIUM_DVDRW_RESTRICTED))
-+ brasero_medium_add_DVD_plus_RW_leadout (self, 0);
-+ else {
-+ track = g_new0 (BraseroMediumTrack, 1);
-+ track->start = 0;
-+ track->type = BRASERO_MEDIUM_TRACK_LEADOUT;
-+ priv->tracks = g_slist_prepend (priv->tracks, track);
-+
-+ brasero_medium_track_get_info (self,
-+ track,
-+ 1,
-+ fd,
-+ code);
-+ }
-+ goto end;
-+ }
-+
-+ if (info->status == BRASERO_SCSI_DISC_INCOMPLETE) {
-+ priv->info |= BRASERO_MEDIUM_APPENDABLE;
-+ BRASERO_BURN_LOG ("Appendable media");
-+ }
-+ else if (info->status == BRASERO_SCSI_DISC_FINALIZED) {
-+ priv->info |= BRASERO_MEDIUM_CLOSED;
-+ BRASERO_BURN_LOG ("Closed media");
-+ }
-+
-+ if (priv->info & BRASERO_MEDIUM_CD) {
-+ result = brasero_medium_get_CD_sessions_info (self, fd, code);
-+ if (result != BRASERO_BURN_OK)
-+ result = brasero_medium_get_sessions_info (self, fd, code);
-+ }
-+ else
-+ result = brasero_medium_get_sessions_info (self, fd, code);
-+
-+ if (result != BRASERO_BURN_OK)
-+ goto end;
-+
-+end:
-+
-+ g_free (info);
-+ return BRASERO_BURN_OK;
-+}
-+
-+static void
-+brasero_medium_init_real (BraseroMedium *object, int fd)
-+{
-+ gchar *name;
-+ BraseroBurnResult result;
-+ BraseroMediumPrivate *priv;
-+ BraseroScsiErrCode code = 0;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (object);
-+
-+ name = nautilus_burn_drive_get_name_for_display (priv->drive);
-+ BRASERO_BURN_LOG ("Initializing information for medium in %s", name);
-+ g_free (name);
-+
-+ result = brasero_medium_get_medium_type (object, fd, &code);
-+ if (result != BRASERO_BURN_OK)
-+ return;
-+
-+ brasero_medium_get_capacity_by_type (object, fd, &code);
-+
-+ result = brasero_medium_get_contents (object, fd, &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_BURN_LOG_DISC_TYPE (priv->info, "media is ");
-+}
-+
-+static gboolean
-+brasero_medium_retry_open (gpointer object)
-+{
-+ int fd;
-+ const gchar *path;
-+ BraseroMedium *self;
-+ BraseroMediumPrivate *priv;
-+
-+ 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) {
-+ BRASERO_BURN_LOG ("Device busy");
-+ /* we'll retry in a second */
-+ return TRUE;
-+ }
-+
-+ BRASERO_BURN_LOG ("Open () failed");
-+ priv->info = BRASERO_MEDIUM_UNSUPPORTED;
-+ priv->retry_id = 0;
-+ return FALSE;
-+ }
-+
-+ BRASERO_BURN_LOG ("Open () succeeded\n");
-+ priv->info = BRASERO_MEDIUM_NONE;
-+ priv->icon = icons [0];
-+
-+ priv->retry_id = 0;
-+
-+ brasero_medium_init_real (self, fd);
-+ close (fd);
-+
-+ return FALSE;
-+}
-+
-+static void
-+brasero_medium_try_open (BraseroMedium *self)
-+{
-+ int fd;
-+ const gchar *path;
-+ BraseroMediumPrivate *priv;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (self);
-+ path = nautilus_burn_drive_get_device (priv->drive);
-+
-+ /* 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) {
-+ BRASERO_BURN_LOG ("Device busy");
-+ priv->info = BRASERO_MEDIUM_BUSY;
-+ priv->icon = icons [0];
-+
-+ priv->retry_id = g_timeout_add (BUSY_RETRY_TIME,
-+ brasero_medium_retry_open,
-+ self);
-+ }
-+
-+ BRASERO_BURN_LOG ("Open () failed");
-+ return;
-+ }
-+
-+ BRASERO_BURN_LOG ("Open () succeeded");
-+ brasero_medium_init_real (self, fd);
-+ close (fd);
-+}
-+
-+static void
-+brasero_medium_init (BraseroMedium *object)
-+{
-+ BraseroMediumPrivate *priv;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (object);
-+ priv->next_wr_add = -1;
-+
-+ /* we can't do anything here since properties haven't been set yet */
-+}
-+
-+static void
-+brasero_medium_finalize (GObject *object)
-+{
-+ BraseroMediumPrivate *priv;
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (object);
-+
-+ if (priv->retry_id) {
-+ g_source_remove (priv->retry_id);
-+ priv->retry_id = 0;
-+ }
-+
-+ g_free (priv->rd_speeds);
-+ priv->rd_speeds = NULL;
-+
-+ g_free (priv->wr_speeds);
-+ priv->wr_speeds = NULL;
-+
-+ g_slist_foreach (priv->tracks, (GFunc) g_free, NULL);
-+ g_slist_free (priv->tracks);
-+ priv->tracks = NULL;
-+
-+ nautilus_burn_drive_unref (priv->drive);
-+ priv->drive = NULL;
-+
-+ G_OBJECT_CLASS (parent_class)->finalize (object);
-+}
-+
-+static void
-+brasero_medium_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
-+{
-+ BraseroMediumPrivate *priv;
-+
-+ g_return_if_fail (BRASERO_IS_MEDIUM (object));
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (object);
-+
-+ switch (prop_id)
-+ {
-+ case PROP_DRIVE:
-+ priv->drive = g_value_get_object (value);
-+ nautilus_burn_drive_ref (priv->drive);
-+ brasero_medium_try_open (BRASERO_MEDIUM (object));
-+ break;
-+ default:
-+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-+ break;
-+ }
-+}
-+
-+static void
-+brasero_medium_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
-+{
-+ BraseroMediumPrivate *priv;
-+
-+ g_return_if_fail (BRASERO_IS_MEDIUM (object));
-+
-+ priv = BRASERO_MEDIUM_PRIVATE (object);
-+
-+ switch (prop_id)
-+ {
-+ case PROP_DRIVE:
-+ nautilus_burn_drive_ref (priv->drive);
-+ g_value_set_object (value, priv->drive);
-+ break;
-+ default:
-+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-+ break;
-+ }
-+}
-+
-+static void
-+brasero_medium_class_init (BraseroMediumClass *klass)
-+{
-+ GObjectClass* object_class = G_OBJECT_CLASS (klass);
-+ parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (klass));
-+
-+ g_type_class_add_private (klass, sizeof (BraseroMediumPrivate));
-+
-+ object_class->finalize = brasero_medium_finalize;
-+ object_class->set_property = brasero_medium_set_property;
-+ object_class->get_property = brasero_medium_get_property;
-+
-+ g_object_class_install_property (object_class,
-+ PROP_DRIVE,
-+ g_param_spec_object ("drive",
-+ "drive",
-+ "drive in which medium is inserted",
-+ NAUTILUS_BURN_TYPE_DRIVE,
-+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
-+}
-+
-+GType
-+brasero_medium_get_type (void)
-+{
-+ static GType our_type = 0;
-+
-+ if (our_type == 0)
-+ {
-+ static const GTypeInfo our_info =
-+ {
-+ sizeof (BraseroMediumClass), /* class_size */
-+ (GBaseInitFunc) NULL, /* base_init */
-+ (GBaseFinalizeFunc) NULL, /* base_finalize */
-+ (GClassInitFunc) brasero_medium_class_init, /* class_init */
-+ (GClassFinalizeFunc) NULL, /* class_finalize */
-+ NULL /* class_data */,
-+ sizeof (BraseroMedium), /* instance_size */
-+ 0, /* n_preallocs */
-+ (GInstanceInitFunc) brasero_medium_init, /* instance_init */
-+ NULL /* value_table */
-+ };
-+
-+ our_type = g_type_register_static (G_TYPE_OBJECT, "BraseroMedium",
-+ &our_info, 0);
-+ }
-+
-+ return our_type;
-+}
-+
-+BraseroMedium *
-+brasero_medium_new (NautilusBurnDrive *drive)
-+{
-+ g_return_val_if_fail (drive != NULL, NULL);
-+ return BRASERO_MEDIUM (g_object_new (BRASERO_TYPE_MEDIUM,
-+ "drive", drive,
-+ NULL));
-+}
diff --git a/sysutils/brasero/files/patch-src_burn-medium.c b/sysutils/brasero/files/patch-src_burn-medium.c
deleted file mode 100644
index accb659e2516..000000000000
--- a/sysutils/brasero/files/patch-src_burn-medium.c
+++ /dev/null
@@ -1,2073 +0,0 @@
---- src/burn-medium.c.orig 2008-01-27 10:25:14.000000000 -0500
-+++ src/burn-medium.c 2008-02-06 01:55:21.000000000 -0500
-@@ -1,2070 +0,0 @@
--/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
--/*
-- * brasero
-- * Copyright (C) Philippe Rouquier 2007 <bonfire-app@wanadoo.fr>
-- *
-- * brasero is free software.
-- *
-- * You may 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.
-- *
-- * brasero 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 General Public License for more details.
-- *
-- * You should have received a copy of the GNU General Public License
-- * along with brasero. If not, write to:
-- * The Free Software Foundation, Inc.,
-- * 51 Franklin Street, Fifth Floor
-- * Boston, MA 02110-1301, USA.
-- */
--
--#ifdef HAVE_CONFIG_H
--# include <config.h>
--#endif
--
--#include <sys/types.h>
--#include <sys/stat.h>
--#include <fcntl.h>
--#include <errno.h>
--
--#include <glib.h>
--#include <glib/gi18n-lib.h>
--
--#include <nautilus-burn-drive.h>
--
--#include "burn-basics.h"
--#include "burn-debug.h"
--#include "burn-medium.h"
--#include "scsi-mmc1.h"
--#include "scsi-mmc2.h"
--#include "scsi-mmc3.h"
--#include "scsi-spc1.h"
--#include "scsi-utils.h"
--#include "scsi-mode-pages.h"
--#include "scsi-status-page.h"
--#include "scsi-q-subchannel.h"
--#include "scsi-dvd-structures.h"
--#include "burn-volume.h"
--#include "brasero-ncb.h"
--
--const gchar *icons [] = { "gnome-dev-removable",
-- "gnome-dev-cdrom",
-- "gnome-dev-disc-cdr",
-- "gnome-dev-disc-cdrw",
-- "gnome-dev-disc-dvdrom",
-- "gnome-dev-disc-dvdr",
-- "gnome-dev-disc-dvdrw",
-- "gnome-dev-disc-dvdr-plus",
-- "gnome-dev-disc-dvdram",
-- NULL };
--const gchar *types [] = { N_("file"),
-- N_("CDROM"),
-- N_("CD-R"),
-- N_("CD-RW"),
-- N_("DVDROM"),
-- N_("DVD-R"),
-- N_("DVD-RW"),
-- N_("DVD+R"),
-- N_("DVD+RW"),
-- N_("DVD+R dual layer"),
-- N_("DVD+RW dual layer"),
-- N_("DVD-R dual layer"),
-- N_("DVD-RAM"),
-- N_("Blu-ray disc"),
-- N_("Writable Blu-ray disc"),
-- N_("Rewritable Blu-ray disc"),
-- NULL };
--
--
--typedef struct _BraseroMediumPrivate BraseroMediumPrivate;
--struct _BraseroMediumPrivate
--{
-- gint retry_id;
--
-- GSList * tracks;
--
-- const gchar *type;
-- const gchar *icon;
--
-- gint max_rd;
-- gint max_wrt;
--
-- gint *rd_speeds;
-- gint *wr_speeds;
--
-- gint64 block_num;
-- gint64 block_size;
--
-- guint64 next_wr_add;
-- BraseroMedia info;
-- NautilusBurnDrive * drive;
--};
--
--#define BRASERO_MEDIUM_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), BRASERO_TYPE_MEDIUM, BraseroMediumPrivate))
--
--/**
-- * Try to open the drive exclusively but don't block; if drive can't be opened
-- * exclusively then retry every second until we're shut or the drive state
-- * changes to not busy.
-- * 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
--{
-- PROP_0,
-- PROP_DRIVE
--};
--
--static GObjectClass* parent_class = NULL;
--
--const gchar *
--brasero_medium_get_type_string (BraseroMedium *medium)
--{
-- BraseroMediumPrivate *priv;
--
-- priv = BRASERO_MEDIUM_PRIVATE (medium);
-- return priv->type;
--}
--
--const gchar *
--brasero_medium_get_icon (BraseroMedium *medium)
--{
-- BraseroMediumPrivate *priv;
--
-- priv = BRASERO_MEDIUM_PRIVATE (medium);
-- return priv->icon;
--}
--
--BraseroMedia
--brasero_medium_get_status (BraseroMedium *medium)
--{
-- BraseroMediumPrivate *priv;
--
-- priv = BRASERO_MEDIUM_PRIVATE (medium);
-- return priv->info;
--}
--
--GSList *
--brasero_medium_get_tracks (BraseroMedium *medium)
--{
-- BraseroMediumPrivate *priv;
--
-- priv = BRASERO_MEDIUM_PRIVATE (medium);
-- return g_slist_copy (priv->tracks);
--}
--
--gboolean
--brasero_medium_get_last_data_track_address (BraseroMedium *medium,
-- gint64 *byte,
-- gint64 *sector)
--{
-- GSList *iter;
-- BraseroMediumPrivate *priv;
-- BraseroMediumTrack *track = NULL;
--
-- priv = BRASERO_MEDIUM_PRIVATE (medium);
--
-- for (iter = priv->tracks; iter; iter = iter->next) {
-- BraseroMediumTrack *current;
--
-- current = iter->data;
-- if (current->type & BRASERO_MEDIUM_TRACK_DATA)
-- track = current;
-- }
--
-- if (!track) {
-- if (byte)
-- *byte = -1;
-- if (sector)
-- *sector = -1;
-- return FALSE;
-- }
--
-- if (byte)
-- *byte = track->start * priv->block_size;
--
-- if (sector)
-- *sector = track->start;
--
-- return TRUE;
--}
--
--gboolean
--brasero_medium_get_last_data_track_space (BraseroMedium *medium,
-- gint64 *size,
-- gint64 *blocks)
--{
-- GSList *iter;
-- BraseroMediumPrivate *priv;
-- BraseroMediumTrack *track = NULL;
--
-- priv = BRASERO_MEDIUM_PRIVATE (medium);
--
-- for (iter = priv->tracks; iter; iter = iter->next) {
-- BraseroMediumTrack *current;
--
-- current = iter->data;
-- if (current->type & BRASERO_MEDIUM_TRACK_DATA)
-- track = current;
-- }
--
-- if (!track) {
-- if (size)
-- *size = -1;
-- if (blocks)
-- *blocks = -1;
-- return FALSE;
-- }
--
-- if (size)
-- *size = track->blocks_num * priv->block_size;
-- if (blocks)
-- *blocks = track->blocks_num;
--
-- return TRUE;
--}
--
--guint
--brasero_medium_get_track_num (BraseroMedium *medium)
--{
-- guint retval = 0;
-- GSList *iter;
-- BraseroMediumPrivate *priv;
--
-- priv = BRASERO_MEDIUM_PRIVATE (medium);
-- for (iter = priv->tracks; iter; iter = iter->next) {
-- BraseroMediumTrack *current;
--
-- current = iter->data;
-- if (current->type & BRASERO_MEDIUM_TRACK_LEADOUT)
-- break;
--
-- retval ++;
-- }
--
-- return retval;
--}
--
--static BraseroMediumTrack *
--brasero_medium_get_track (BraseroMedium *medium,
-- guint num)
--{
-- guint i = 1;
-- GSList *iter;
-- BraseroMediumPrivate *priv;
--
-- priv = BRASERO_MEDIUM_PRIVATE (medium);
--
-- for (iter = priv->tracks; iter; iter = iter->next) {
-- BraseroMediumTrack *current;
--
-- current = iter->data;
-- if (current->type == BRASERO_MEDIUM_TRACK_LEADOUT)
-- break;
--
-- if (i == num)
-- return current;
--
-- i++;
-- }
--
-- return NULL;
--}
--
--gboolean
--brasero_medium_get_track_space (BraseroMedium *medium,
-- guint num,
-- gint64 *size,
-- gint64 *blocks)
--{
-- BraseroMediumPrivate *priv;
-- BraseroMediumTrack *track;
--
-- priv = BRASERO_MEDIUM_PRIVATE (medium);
--
-- track = brasero_medium_get_track (medium, num);
-- if (!track) {
-- if (size)
-- *size = -1;
-- if (blocks)
-- *blocks = -1;
-- return FALSE;
-- }
--
-- if (size)
-- *size = track->blocks_num * priv->block_size;
-- if (blocks)
-- *blocks = track->blocks_num;
--
-- return TRUE;
--}
--
--gboolean
--brasero_medium_get_track_address (BraseroMedium *medium,
-- guint num,
-- gint64 *byte,
-- gint64 *sector)
--{
-- BraseroMediumPrivate *priv;
-- BraseroMediumTrack *track;
--
-- priv = BRASERO_MEDIUM_PRIVATE (medium);
--
-- track = brasero_medium_get_track (medium, num);
-- if (!track) {
-- if (byte)
-- *byte = -1;
-- if (sector)
-- *sector = -1;
-- return FALSE;
-- }
--
-- if (byte)
-- *byte = track->start * priv->block_size;
-- if (sector)
-- *sector = track->start;
--
-- return TRUE;
--}
--
--gint64
--brasero_medium_get_next_writable_address (BraseroMedium *medium)
--{
-- BraseroMediumPrivate *priv;
--
-- priv = BRASERO_MEDIUM_PRIVATE (medium);
-- return priv->next_wr_add;
--}
--
--gint64
--brasero_medium_get_max_write_speed (BraseroMedium *medium)
--{
-- BraseroMediumPrivate *priv;
--
-- priv = BRASERO_MEDIUM_PRIVATE (medium);
-- return priv->max_wrt * 1024;
--}
--
--/**
-- * NOTEs about the following functions:
-- * for all closed media (including ROM types) capacity == size of data and
-- * should be the size of all data on the disc, free space is 0
-- * for all blank -R types capacity == free space and size of data == 0
-- * for all multisession -R types capacity == free space since having the real
-- * capacity of the media would be useless as we can only use this type of media
-- * to append more data
-- * for all -RW types capacity = free space + size of data. Here they can be
-- * appended (use free space) or rewritten (whole capacity).
-- *
-- * Usually:
-- * the free space is the size of the leadout track
-- * the size of data is the sum of track sizes (excluding leadout)
-- * the capacity depends on the media:
-- * for closed discs == sum of track sizes
-- * for multisession discs == free space (leadout size)
-- * for blank discs == (free space) leadout size
-- * for rewritable/blank == use SCSI functions to get capacity (see below)
-- *
-- * In fact we should really need the size of data in DVD+/-RW cases since the
-- * session is always equal to the size of the disc.
-- */
--
--void
--brasero_medium_get_data_size (BraseroMedium *medium,
-- gint64 *size,
-- gint64 *blocks)
--{
-- GSList *iter;
-- BraseroMediumPrivate *priv;
-- BraseroMediumTrack *track = NULL;
--
-- priv = BRASERO_MEDIUM_PRIVATE (medium);
--
-- if (!priv->tracks) {
-- /* that's probably because it wasn't possible to retrieve info */
-- if (size)
-- *size = 0;
--
-- if (blocks)
-- *blocks = 0;
--
-- return;
-- }
--
-- for (iter = priv->tracks; iter; iter = iter->next) {
-- BraseroMediumTrack *tmp;
--
-- tmp = iter->data;
-- if (tmp->type == BRASERO_MEDIUM_TRACK_LEADOUT)
-- break;
--
-- track = iter->data;
-- }
--
-- if (size)
-- *size = track ? (track->start + track->blocks_num) * priv->block_size: 0;
--
-- if (blocks)
-- *blocks = track ? track->start + track->blocks_num: 0;
--}
--
--void
--brasero_medium_get_free_space (BraseroMedium *medium,
-- gint64 *size,
-- gint64 *blocks)
--{
-- GSList *iter;
-- BraseroMediumPrivate *priv;
-- BraseroMediumTrack *track = NULL;
--
-- priv = BRASERO_MEDIUM_PRIVATE (medium);
--
-- if (!priv->tracks) {
-- /* that's probably because it wasn't possible to retrieve info.
-- * maybe it also happens with unformatted DVD+RW */
--
-- if (priv->info & BRASERO_MEDIUM_CLOSED) {
-- if (size)
-- *size = 0;
--
-- if (blocks)
-- *blocks = 0;
-- }
-- else {
-- if (size)
-- *size = priv->block_num * priv->block_size;
--
-- if (blocks)
-- *blocks = priv->block_num;
-- }
--
-- return;
-- }
--
-- for (iter = priv->tracks; iter; iter = iter->next) {
-- BraseroMediumTrack *tmp;
--
-- tmp = iter->data;
-- if (tmp->type == BRASERO_MEDIUM_TRACK_LEADOUT) {
-- track = iter->data;
-- break;
-- }
-- }
--
-- if (size) {
-- if (!track) {
-- /* No leadout was found so the disc is probably closed:
-- * no free space left. */
-- *size = 0;
-- }
-- else if (track->blocks_num <= 0)
-- *size = (priv->block_num - track->start) * priv->block_size;
-- else
-- *size = track->blocks_num * priv->block_size;
-- }
--
-- if (blocks) {
-- if (!track) {
-- /* No leadout was found so the disc is probably closed:
-- * no free space left. */
-- *blocks = 0;
-- }
-- else if (track->blocks_num <= 0)
-- *blocks = priv->block_num - track->blocks_num;
-- else
-- *blocks = track->blocks_num;
-- }
--}
--
--void
--brasero_medium_get_capacity (BraseroMedium *medium,
-- gint64 *size,
-- gint64 *blocks)
--{
-- BraseroMediumPrivate *priv;
--
-- priv = BRASERO_MEDIUM_PRIVATE (medium);
--
-- if (priv->info & BRASERO_MEDIUM_REWRITABLE) {
-- if (size)
-- *size = priv->block_num * priv->block_size;
--
-- if (blocks)
-- *blocks = priv->block_num;
-- }
-- else if (priv->info & BRASERO_MEDIUM_CLOSED)
-- brasero_medium_get_data_size (medium, size, blocks);
-- else
-- brasero_medium_get_free_space (medium, size, blocks);
--}
--
--/**
-- * Function to retrieve the capacity of a media
-- */
--
--static BraseroBurnResult
--brasero_medium_get_capacity_CD_RW (BraseroMedium *self,
-- int fd,
-- BraseroScsiErrCode *code)
--{
-- BraseroScsiAtipData *atip_data = NULL;
-- BraseroMediumPrivate *priv;
-- BraseroScsiResult result;
-- int size = 0;
--
-- priv = BRASERO_MEDIUM_PRIVATE (self);
--
-- BRASERO_BURN_LOG ("Retrieving capacity from atip");
--
-- result = brasero_mmc1_read_atip (fd,
-- &atip_data,
-- &size,
-- NULL);
--
-- if (result != BRASERO_SCSI_OK) {
-- BRASERO_BURN_LOG ("READ ATIP failed (scsi error)");
-- return BRASERO_BURN_ERR;
-- }
--
-- /* check the size of the structure: it must be at least 16 bytes long */
-- if (size < 16) {
-- if (size)
-- g_free (atip_data);
--
-- BRASERO_BURN_LOG ("READ ATIP failed (wrong size)");
-- return BRASERO_BURN_ERR;
-- }
--
-- priv->block_num = BRASERO_MSF_TO_LBA (atip_data->desc->leadout_mn,
-- atip_data->desc->leadout_sec,
-- atip_data->desc->leadout_frame);
-- g_free (atip_data);
--
-- BRASERO_BURN_LOG ("Format capacity %lli %lli",
-- priv->block_num,
-- priv->block_size);
--
-- return BRASERO_BURN_OK;
--}
--
--static BraseroBurnResult
--brasero_medium_get_capacity_DVD_RW (BraseroMedium *self,
-- int fd,
-- BraseroScsiErrCode *code)
--{
-- BraseroScsiFormatCapacitiesHdr *hdr = NULL;
-- BraseroScsiMaxCapacityDesc *current;
-- BraseroMediumPrivate *priv;
-- BraseroScsiResult result;
-- gint size;
--
-- BRASERO_BURN_LOG ("Retrieving format capacity");
--
-- priv = BRASERO_MEDIUM_PRIVATE (self);
-- result = brasero_mmc2_read_format_capacities (fd,
-- &hdr,
-- &size,
-- code);
-- if (result != BRASERO_SCSI_OK) {
-- g_free (hdr);
--
-- BRASERO_BURN_LOG ("READ FORMAT CAPACITIES failed");
-- return BRASERO_BURN_ERR;
-- }
--
-- current = hdr->max_caps;
--
-- /* see if the media is already formatted */
-- if (current->type != BRASERO_SCSI_DESC_FORMATTED) {
-- int i, max;
-- BraseroScsiFormattableCapacityDesc *desc;
--
-- max = (hdr->len -
-- sizeof (BraseroScsiMaxCapacityDesc)) /
-- sizeof (BraseroScsiFormattableCapacityDesc);
--
-- desc = hdr->desc;
-- for (i = 0; i < max; i ++, desc ++) {
-- /* search for the correct descriptor */
-- if (BRASERO_MEDIUM_IS (priv->info, BRASERO_MEDIUM_DVDRW_PLUS)) {
-- if (desc->format_type == BRASERO_SCSI_DVDRW_PLUS) {
-- priv->block_num = BRASERO_GET_32 (desc->blocks_num);
-- priv->block_size = BRASERO_GET_24 (desc->type_param);
--
-- /* that can happen */
-- if (!priv->block_size)
-- priv->block_size = 2048;
-- break;
-- }
-- }
-- else if (desc->format_type == BRASERO_SCSI_BLOCK_SIZE_DEFAULT_AND_DB) {
-- priv->block_num = BRASERO_GET_32 (desc->blocks_num);
-- priv->block_size = BRASERO_GET_24 (desc->type_param);
-- break;
-- }
-- }
-- }
-- else {
-- priv->block_num = BRASERO_GET_32 (current->blocks_num);
-- priv->block_size = BRASERO_GET_24 (current->block_size);
-- }
--
-- BRASERO_BURN_LOG ("Format capacity %lli %lli",
-- priv->block_num,
-- priv->block_size);
--
-- g_free (hdr);
-- return BRASERO_BURN_OK;
--}
--
--static BraseroBurnResult
--brasero_medium_get_capacity_by_type (BraseroMedium *self,
-- int fd,
-- BraseroScsiErrCode *code)
--{
-- BraseroMediumPrivate *priv;
--
-- priv = BRASERO_MEDIUM_PRIVATE (self);
--
-- priv->block_size = 2048;
--
-- if (!(priv->info & BRASERO_MEDIUM_REWRITABLE))
-- return BRASERO_BURN_OK;
--
-- if (priv->info & BRASERO_MEDIUM_CD)
-- brasero_medium_get_capacity_CD_RW (self, fd, code);
-- else
-- brasero_medium_get_capacity_DVD_RW (self, fd, code);
--
-- return BRASERO_BURN_OK;
--}
--
--/**
-- * Functions to retrieve the speed
-- */
--
--static BraseroBurnResult
--brasero_medium_get_speed_mmc3 (BraseroMedium *self,
-- int fd,
-- BraseroScsiErrCode *code)
--{
-- int size;
-- int num_desc, i;
-- gint max_rd, max_wrt;
-- BraseroScsiResult result;
-- BraseroMediumPrivate *priv;
-- BraseroScsiWrtSpdDesc *desc;
-- BraseroScsiGetPerfData *wrt_perf = NULL;
--
-- BRASERO_BURN_LOG ("Retrieving speed (Get Performance)");
--
-- /* 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,
-- &wrt_perf,
-- &size,
-- code);
--
-- if (result != BRASERO_SCSI_OK) {
-- g_free (wrt_perf);
--
-- BRASERO_BURN_LOG ("GET PERFORMANCE failed");
-- return BRASERO_BURN_ERR;
-- }
--
-- num_desc = (size - sizeof (BraseroScsiGetPerfHdr)) /
-- sizeof (BraseroScsiWrtSpdDesc);
--
-- if (num_desc <= 0)
-- goto end;
--
-- priv->rd_speeds = g_new0 (gint, num_desc + 1);
-- priv->wr_speeds = g_new0 (gint, num_desc + 1);
--
-- max_rd = 0;
-- max_wrt = 0;
--
-- desc = (BraseroScsiWrtSpdDesc*) &wrt_perf->data;
-- for (i = 0; i < num_desc; i ++, desc ++) {
-- priv->rd_speeds [i] = BRASERO_GET_32 (desc->rd_speed);
-- priv->wr_speeds [i] = BRASERO_GET_32 (desc->wr_speed);
--
-- max_rd = MAX (max_rd, priv->rd_speeds [i]);
-- max_wrt = MAX (max_wrt, priv->wr_speeds [i]);
-- }
--
-- priv->max_rd = max_rd;
-- priv->max_wrt = max_wrt;
--
--end:
--
-- g_free (wrt_perf);
--
-- /* strangely there are so drives (I know one case) which support this
-- * function but don't report any speed. So if our top speed is 0 then
-- * use the other way to get the speed. It was a Teac */
-- if (!priv->max_wrt)
-- return BRASERO_BURN_ERR;
--
-- return BRASERO_BURN_OK;
--}
--
--static BraseroBurnResult
--brasero_medium_get_page_2A_write_speed_desc (BraseroMedium *self,
-- int fd,
-- BraseroScsiErrCode *code)
--{
-- BraseroScsiStatusPage *page_2A = NULL;
-- BraseroScsiStatusWrSpdDesc *desc;
-- BraseroScsiModeData *data = NULL;
-- BraseroMediumPrivate *priv;
-- BraseroScsiResult result;
-- gint desc_num, i;
-- gint max_wrt = 0;
-- gint max_num;
-- int size = 0;
--
-- BRASERO_BURN_LOG ("Retrieving speed (2A speeds)");
--
-- priv = BRASERO_MEDIUM_PRIVATE (self);
-- result = brasero_spc1_mode_sense_get_page (fd,
-- BRASERO_SPC_PAGE_STATUS,
-- &data,
-- &size,
-- code);
-- if (result != BRASERO_SCSI_OK) {
-- g_free (data);
--
-- BRASERO_BURN_LOG ("MODE SENSE failed");
-- return BRASERO_BURN_ERR;
-- }
--
-- page_2A = (BraseroScsiStatusPage *) &data->page;
--
-- /* FIXME: the following is not necessarily true */
-- if (size < sizeof (BraseroScsiStatusPage)) {
-- g_free (data);
--
-- BRASERO_BURN_LOG ("wrong size in page");
-- return BRASERO_BURN_ERR;
-- }
--
-- desc_num = BRASERO_GET_16 (page_2A->wr_speed_desc_num);
-- max_num = size -
-- sizeof (BraseroScsiStatusPage) -
-- sizeof (BraseroScsiModeHdr);
-- max_num /= sizeof (BraseroScsiWrtSpdDesc);
--
-- if (max_num < 0)
-- max_num = 0;
--
-- if (desc_num > max_num)
-- desc_num = max_num;
--
-- priv->wr_speeds = g_new0 (gint, desc_num + 1);
-- desc = page_2A->wr_spd_desc;
-- for (i = 0; i < desc_num; i ++, desc ++) {
-- priv->wr_speeds [i] = BRASERO_GET_16 (desc->speed);
-- max_wrt = MAX (max_wrt, priv->wr_speeds [i]);
-- }
--
-- if (!max_wrt)
-- priv->max_wrt = BRASERO_GET_16 (page_2A->wr_max_speed);
-- else
-- priv->max_wrt = max_wrt;
--
-- priv->max_rd = BRASERO_GET_16 (page_2A->rd_max_speed);
-- g_free (data);
--
-- return BRASERO_BURN_OK;
--}
--
--static BraseroBurnResult
--brasero_medium_get_page_2A_max_speed (BraseroMedium *self,
-- int fd,
-- BraseroScsiErrCode *code)
--{
-- BraseroScsiStatusPage *page_2A = NULL;
-- BraseroScsiModeData *data = NULL;
-- BraseroMediumPrivate *priv;
-- BraseroScsiResult result;
-- int size = 0;
--
-- BRASERO_BURN_LOG ("Retrieving speed (2A max)");
--
-- priv = BRASERO_MEDIUM_PRIVATE (self);
--
-- result = brasero_spc1_mode_sense_get_page (fd,
-- BRASERO_SPC_PAGE_STATUS,
-- &data,
-- &size,
-- code);
-- if (result != BRASERO_SCSI_OK) {
-- g_free (data);
--
-- BRASERO_BURN_LOG ("MODE SENSE failed");
-- return BRASERO_BURN_ERR;
-- }
--
-- page_2A = (BraseroScsiStatusPage *) &data->page;
--
-- if (size < 0x14) {
-- g_free (data);
--
-- BRASERO_BURN_LOG ("wrong page size");
-- return BRASERO_BURN_ERR;
-- }
--
-- priv->max_rd = BRASERO_GET_16 (page_2A->rd_max_speed);
-- priv->max_wrt = BRASERO_GET_16 (page_2A->wr_max_speed);
--
-- g_free (data);
-- return BRASERO_BURN_OK;
--}
--
--static BraseroBurnResult
--brasero_medium_get_medium_type (BraseroMedium *self,
-- int fd,
-- BraseroScsiErrCode *code)
--{
-- BraseroScsiGetConfigHdr *hdr = NULL;
-- BraseroMediumPrivate *priv;
-- BraseroScsiResult result;
-- int size;
--
-- BRASERO_BURN_LOG ("Retrieving media profile");
--
-- priv = BRASERO_MEDIUM_PRIVATE (self);
-- result = brasero_mmc2_get_configuration_feature (fd,
-- BRASERO_SCSI_FEAT_REAL_TIME_STREAM,
-- &hdr,
-- &size,
-- code);
-- if (result != BRASERO_SCSI_OK) {
-- BraseroScsiAtipData *data = NULL;
-- int size = 0;
--
-- BRASERO_BURN_LOG ("GET CONFIGURATION failed");
--
-- /* This could be a MMC1 drive since this command was
-- * introduced in MMC2 and is supported onward. So it
-- * has to be a CD (R/RW). The rest of the information
-- * will be provided by read_disc_information. */
--
-- /* The only thing here left to determine is if that's a WRITABLE
-- * or a REWRITABLE. To determine that information, we need to
-- * 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,
-- &data,
-- &size,
-- NULL);
-- if (result != BRASERO_SCSI_OK) {
-- /* CDROM */
-- priv->info = BRASERO_MEDIUM_CDROM;
-- priv->type = types [1];
-- priv->icon = icons [1];
-- }
-- else {
-- /* check the size of the structure: it must be at least 8 bytes long */
-- if (size < 8) {
-- if (size)
-- g_free (data);
--
-- BRASERO_BURN_LOG ("READ ATIP failed (wrong size)");
-- return BRASERO_BURN_ERR;
-- }
--
-- if (data->desc->erasable) {
-- /* CDRW */
-- priv->info = BRASERO_MEDIUM_CDRW;
-- priv->type = types [3];
-- priv->icon = icons [3];
-- }
-- else {
-- /* CDR */
-- priv->info = BRASERO_MEDIUM_CDR;
-- priv->type = types [2];
-- priv->icon = icons [2];
-- }
--
-- g_free (data);
-- }
--
-- /* retrieve the speed */
-- result = brasero_medium_get_page_2A_max_speed (self,
-- fd,
-- code);
-- return result;
-- }
--
-- switch (BRASERO_GET_16 (hdr->current_profile)) {
-- case BRASERO_SCSI_PROF_CDROM:
-- priv->info = BRASERO_MEDIUM_CDROM;
-- priv->type = types [1];
-- priv->icon = icons [1];
-- break;
--
-- case BRASERO_SCSI_PROF_CDR:
-- priv->info = BRASERO_MEDIUM_CDR;
-- priv->type = types [2];
-- priv->icon = icons [2];
-- break;
--
-- case BRASERO_SCSI_PROF_CDRW:
-- priv->info = BRASERO_MEDIUM_CDRW;
-- priv->type = types [3];
-- priv->icon = icons [3];
-- break;
--
-- case BRASERO_SCSI_PROF_DVD_ROM:
-- priv->info = BRASERO_MEDIUM_DVD_ROM;
-- priv->type = types [4];
-- priv->icon = icons [4];
-- break;
--
-- case BRASERO_SCSI_PROF_DVD_R:
-- priv->info = BRASERO_MEDIUM_DVDR;
-- priv->type = types [5];
-- priv->icon = icons [5];
-- break;
--
-- case BRASERO_SCSI_PROF_DVD_RW_RESTRICTED:
-- priv->info = BRASERO_MEDIUM_DVDRW_RESTRICTED;
-- priv->type = types [6];
-- priv->icon = icons [6];
-- break;
--
-- case BRASERO_SCSI_PROF_DVD_RW_SEQUENTIAL:
-- priv->info = BRASERO_MEDIUM_DVDRW;
-- priv->type = types [6];
-- priv->icon = icons [6];
-- break;
--
-- case BRASERO_SCSI_PROF_DVD_R_PLUS:
-- priv->info = BRASERO_MEDIUM_DVDR_PLUS;
-- priv->type = types [7];
-- priv->icon = icons [7];
-- break;
--
-- case BRASERO_SCSI_PROF_DVD_RW_PLUS:
-- priv->info = BRASERO_MEDIUM_DVDRW_PLUS;
-- priv->type = types [8];
-- priv->icon = icons [7];
-- break;
--
-- /* WARNING: these types are recognized, no more */
-- case BRASERO_SCSI_PROF_DVD_R_PLUS_DL:
-- priv->info = BRASERO_MEDIUM_DVDR_PLUS_DL;
-- priv->type = types [9];
-- priv->icon = icons [7];
-- break;
--
-- case BRASERO_SCSI_PROF_DVD_RW_PLUS_DL:
-- priv->info = BRASERO_MEDIUM_DVDRW_PLUS_DL;
-- priv->type = types [10];
-- priv->icon = icons [7];
-- break;
--
-- case BRASERO_SCSI_PROF_DVD_R_DL_SEQUENTIAL:
-- priv->info = BRASERO_MEDIUM_DVDR_DL;
-- priv->type = types [11];
-- priv->icon = icons [5];
-- break;
--
-- case BRASERO_SCSI_PROF_DVD_R_DL_JUMP:
-- priv->info = BRASERO_MEDIUM_DVDR_JUMP_DL;
-- priv->type = types [11];
-- priv->icon = icons [5];
-- break;
--
-- case BRASERO_SCSI_PROF_DVD_RAM:
-- priv->info = BRASERO_MEDIUM_DVD_RAM;
-- priv->type = types [12];
-- priv->icon = icons [8];
-- break;
--
-- case BRASERO_SCSI_PROF_BD_ROM:
-- priv->info = BRASERO_MEDIUM_BD_ROM;
-- priv->type = types [13];
-- priv->icon = icons [4];
-- break;
--
-- case BRASERO_SCSI_PROF_BR_R_SEQUENTIAL:
-- priv->info = BRASERO_MEDIUM_BDR;
-- priv->type = types [14];
-- priv->icon = icons [5];
-- break;
--
-- case BRASERO_SCSI_PROF_BR_R_RANDOM:
-- priv->info = BRASERO_MEDIUM_BDR_RANDOM;
-- priv->type = types [14];
-- priv->icon = icons [5];
-- break;
--
-- case BRASERO_SCSI_PROF_BD_RW:
-- priv->info = BRASERO_MEDIUM_BDRW;
-- priv->type = types [15];
-- priv->icon = icons [6];
-- break;
--
-- case BRASERO_SCSI_PROF_NON_REMOVABLE:
-- case BRASERO_SCSI_PROF_REMOVABLE:
-- case BRASERO_SCSI_PROF_MO_ERASABLE:
-- case BRASERO_SCSI_PROF_MO_WRITE_ONCE:
-- case BRASERO_SCSI_PROF_MO_ADVANCED_STORAGE:
-- case BRASERO_SCSI_PROF_DDCD_ROM:
-- case BRASERO_SCSI_PROF_DDCD_R:
-- case BRASERO_SCSI_PROF_DDCD_RW:
-- case BRASERO_SCSI_PROF_HD_DVD_ROM:
-- case BRASERO_SCSI_PROF_HD_DVD_R:
-- case BRASERO_SCSI_PROF_HD_DVD_RAM:
-- priv->info = BRASERO_MEDIUM_UNSUPPORTED;
-- priv->icon = icons [0];
-- g_free (hdr);
-- return BRASERO_BURN_NOT_SUPPORTED;
-- }
--
-- /* try all SCSI functions to get write/read speeds in order */
-- if (hdr->desc->add_len >= sizeof (BraseroScsiRTStreamDesc)) {
-- BraseroScsiRTStreamDesc *stream;
--
-- /* means it's at least an MMC3 drive */
-- stream = (BraseroScsiRTStreamDesc *) hdr->desc->data;
-- if (stream->wrt_spd) {
-- result = brasero_medium_get_speed_mmc3 (self, fd, code);
-- if (result == BRASERO_BURN_OK)
-- goto end;
-- }
--
-- if (stream->mp2a) {
-- result = brasero_medium_get_page_2A_write_speed_desc (self, fd, code);
-- if (result == BRASERO_BURN_OK)
-- goto end;
-- }
-- }
--
-- /* fallback for speeds */
-- result = brasero_medium_get_page_2A_max_speed (self, fd, code);
--
--end:
--
-- g_free (hdr);
--
-- if (result != BRASERO_BURN_OK)
-- return result;
--
-- return BRASERO_BURN_OK;
--}
--
--static BraseroBurnResult
--brasero_medium_get_css_feature (BraseroMedium *self,
-- int fd,
-- BraseroScsiErrCode *code)
--{
-- BraseroScsiGetConfigHdr *hdr = NULL;
-- BraseroMediumPrivate *priv;
-- BraseroScsiResult result;
-- int size;
--
-- priv = BRASERO_MEDIUM_PRIVATE (self);
--
-- BRASERO_BURN_LOG ("Testing for Css encrypted media");
-- result = brasero_mmc2_get_configuration_feature (fd,
-- BRASERO_SCSI_FEAT_DVD_CSS,
-- &hdr,
-- &size,
-- code);
-- if (result != BRASERO_SCSI_OK) {
-- g_free (hdr);
--
-- BRASERO_BURN_LOG ("GET CONFIGURATION failed");
-- return BRASERO_BURN_ERR;
-- }
--
-- if (hdr->desc->add_len < sizeof (BraseroScsiDVDCssDesc)) {
-- g_free (hdr);
-- return BRASERO_BURN_OK;
-- }
--
-- /* here we just need to see if this feature is current or not */
-- if (hdr->desc->current) {
-- priv->info |= BRASERO_MEDIUM_PROTECTED;
-- BRASERO_BURN_LOG ("media is Css protected");
-- }
--
-- g_free (hdr);
-- return BRASERO_BURN_OK;
--}
--
--/**
-- * 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,
-- int fd)
--{
-- BraseroMediumPrivate *priv;
-- BraseroBurnResult res;
-- GError *error = NULL;
-- gint64 nb_blocks;
--
-- if (!track)
-- return BRASERO_BURN_ERR;
--
-- priv = BRASERO_MEDIUM_PRIVATE (self);
--
-- /* This is a special case. For DVD+RW and DVD-RW in restricted
-- * mode, there is only one session that takes the whole disc size
-- * once formatted. That doesn't necessarily means they have data
-- * Note also that they are reported as complete though you can
-- * still add data (with growisofs). It is nevertheless on the
-- * condition that the fs is valid.
-- * 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,
-- track->start,
-- &nb_blocks,
-- NULL);
-- if (!res) {
-- BRASERO_BURN_LOG ("Failed to retrieve the volume size: %s",
-- error && error->message ?
-- error->message:"unknown error");
--
-- if (error)
-- g_error_free (error);
-- return BRASERO_BURN_ERR;
-- }
--
-- track->blocks_num = nb_blocks;
-- return BRASERO_BURN_OK;
--}
--
--static BraseroBurnResult
--brasero_medium_track_get_info (BraseroMedium *self,
-- BraseroMediumTrack *track,
-- int track_num,
-- int fd,
-- BraseroScsiErrCode *code)
--{
-- BraseroScsiTrackInfo track_info;
-- BraseroMediumPrivate *priv;
-- BraseroScsiResult result;
-- int size;
--
-- BRASERO_BURN_LOG ("Retrieving track information for %i", track_num);
--
-- priv = BRASERO_MEDIUM_PRIVATE (self);
--
-- /* at this point we know the type of the disc that's why we set the
-- * size according to this type. That may help to avoid outrange address
-- * errors. */
-- if (BRASERO_MEDIUM_IS (priv->info, BRASERO_MEDIUM_DL|BRASERO_MEDIUM_WRITABLE))
-- size = 48;
-- else if (BRASERO_MEDIUM_IS (priv->info, BRASERO_MEDIUM_PLUS|BRASERO_MEDIUM_WRITABLE))
-- size = 40;
-- else
-- size = 36;
--
-- result = brasero_mmc1_read_track_info (fd,
-- track_num,
-- &track_info,
-- &size,
-- code);
--
-- if (result != BRASERO_SCSI_OK) {
-- BRASERO_BURN_LOG ("READ TRACK INFO failed");
-- return BRASERO_BURN_ERR;
-- }
--
-- 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) {
-- BRASERO_BURN_LOG ("300 sectors size. Checking for real size");
-- brasero_medium_track_volume_size (self, track, fd);
-- }
--
-- if (track_info.next_wrt_address_valid)
-- priv->next_wr_add = BRASERO_GET_32 (track_info.next_wrt_address);
--
-- BRASERO_BURN_LOG ("Track %i (session %i): type = %i start = %llu size = %llu",
-- track_num,
-- track->session,
-- track->type,
-- track->start,
-- track->blocks_num);
--
-- return BRASERO_BURN_OK;
--}
--
--/**
-- * return :
-- * 0 when it's not possible to determine (fallback to formatted toc)
-- * -1 for BCD
-- * 1 for HEX */
--static guint
--brasero_medium_check_BCD_use (BraseroMedium *self,
-- int fd,
-- BraseroScsiRawTocDesc *desc,
-- guint num,
-- BraseroScsiErrCode *code)
--{
-- guint i;
-- int size;
-- guint leadout = 0;
-- guint track_num = 0;
-- gboolean use_BCD = TRUE;
-- gboolean use_HEX = TRUE;
-- BraseroScsiResult result;
-- BraseroScsiTrackInfo track_info;
-- guint start_BCD, start_LBA, track_start;
--
-- /* first check if all values are valid BCD numbers in the descriptors */
-- for (i = 0; i < num; i++) {
-- if (desc [i].adr == 1 && desc [i].point <= BRASERO_SCSI_Q_SUB_CHANNEL_TRACK_START) {
-- if (!BRASERO_IS_BCD_VALID (desc [i].p_min)
-- || !BRASERO_IS_BCD_VALID (desc [i].p_sec)
-- || !BRASERO_IS_BCD_VALID (desc [i].p_frame)) {
-- use_BCD = FALSE;
-- break;
-- }
-- }
-- else if (desc [i].point == BRASERO_SCSI_Q_SUB_CHANNEL_LEADOUT_START) {
-- if (!BRASERO_IS_BCD_VALID (desc [i].p_min)
-- || !BRASERO_IS_BCD_VALID (desc [i].p_sec)
-- || !BRASERO_IS_BCD_VALID (desc [i].p_frame)) {
-- use_BCD = FALSE;
-- break;
-- }
-- }
-- }
--
-- /* then check if there are valid Hex values */
-- for (i = 0; i < num; i++) {
-- if (desc [i].adr != 1 || desc [i].point > BRASERO_SCSI_Q_SUB_CHANNEL_TRACK_START)
-- continue;
--
-- if (desc [i].p_min > 99
-- || desc [i].p_sec > 59
-- || desc [i].p_frame > 74) {
-- use_HEX = FALSE;
-- break;
-- }
-- }
--
-- if (use_BCD != use_HEX) {
-- if (use_BCD)
-- return -1;
--
-- return 1;
-- }
--
-- /* To check if the drive uses BCD values or HEX values we ask for the
-- * track information that contains also the start for the track but in
-- * HEX values. If values are the same then it works. */
--
-- /* NOTE: there could be another way to do it: get first track, in LBA
-- * and BCD it must be 150. */
--
-- /* First find the first track and get track start address in BCD */
-- BRASERO_BURN_LOG ("Retrieving track information to determine number format");
--
-- for (i = 0; i < num; i++) {
-- if (desc [i].adr == BRASERO_SCSI_Q_SUB_CHANNEL_LEADIN_MODE5
-- && desc [i].point == BRASERO_SCSI_Q_SUB_CHANNEL_MULTI_NEXT_SESSION) {
-- /* store the leadout number just in case */
-- leadout = i;
-- continue;
-- }
--
-- if (desc [i].adr != 1 || desc [i].point > BRASERO_SCSI_Q_SUB_CHANNEL_TRACK_START)
-- continue;
--
-- track_num ++;
--
-- start_BCD = BRASERO_MSF_TO_LBA (BRASERO_GET_BCD (desc [i].p_min),
-- BRASERO_GET_BCD (desc [i].p_sec),
-- BRASERO_GET_BCD (desc [i].p_frame));
--
-- start_LBA = BRASERO_MSF_TO_LBA (desc [i].p_min,
-- desc [i].p_sec,
-- desc [i].p_frame);
--
-- BRASERO_BURN_LOG ("Comparing to track information from READ TRACK INFO for track %i", track_num);
--
-- size = 36;
-- start_LBA -= 150;
-- start_BCD -= 150;
--
-- result = brasero_mmc1_read_track_info (fd,
-- track_num,
-- &track_info,
-- &size,
-- code);
--
-- if (result != BRASERO_SCSI_OK) {
-- BRASERO_BURN_LOG ("READ TRACK INFO failed");
-- /* Fallback to formatted toc */
-- return 0;
-- }
--
-- track_start = BRASERO_GET_32 (track_info.start_lba);
-- BRASERO_BURN_LOG ("comparing DCB %i and LBA %i to real start address %i",
-- start_BCD, start_LBA, track_start);
--
-- /* try to find a conclusive match */
-- if (track_start == start_BCD && track_start != start_LBA)
-- return -1;
--
-- if (track_start == start_LBA && track_start != start_BCD)
-- return 1;
-- }
--
-- /* Our last chance, the leadout.
-- * NOTE: no need to remove 150 sectors here. */
-- start_BCD = BRASERO_MSF_TO_LBA (BRASERO_GET_BCD (desc [leadout].min),
-- BRASERO_GET_BCD (desc [leadout].sec),
-- BRASERO_GET_BCD (desc [leadout].frame));
--
-- start_LBA = BRASERO_MSF_TO_LBA (desc [leadout].min,
-- desc [leadout].sec,
-- desc [leadout].frame);
--
-- BRASERO_BURN_LOG ("Comparing to track information from READ TRACK INFO for leadout");
--
-- size = 36;
--
-- /* leadout number is number of tracks + 1 */
-- result = brasero_mmc1_read_track_info (fd,
-- track_num + 1,
-- &track_info,
-- &size,
-- code);
--
-- if (result != BRASERO_SCSI_OK) {
-- BRASERO_BURN_LOG ("READ TRACK INFO failed for leadout");
-- /* Fallback to formatted toc */
-- return 0;
-- }
--
-- track_start = BRASERO_GET_32 (track_info.start_lba);
-- BRASERO_BURN_LOG ("comparing DCB %i and LBA %i to real start address %i",
-- start_BCD, start_LBA, track_start);
--
-- /* try to find a conclusive match */
-- if (track_start == start_BCD && track_start != start_LBA)
-- return -1;
--
-- if (track_start == start_LBA && track_start != start_BCD)
-- return 1;
--
-- /* fallback to formatted toc */
-- return 0;
--}
--
--/**
-- * The reason why we use this perhaps more lengthy method is that with
-- * multisession discs, the first track is reported to be two sectors shorter
-- * than it should. As I don't know why and since the following works we use
-- * this one. */
--static BraseroBurnResult
--brasero_medium_get_CD_sessions_info (BraseroMedium *self,
-- int fd,
-- BraseroScsiErrCode *code)
--{
-- gint use_bcd;
-- GSList *iter;
-- int num, i, size;
-- gint leadout_start = 0;
-- BraseroScsiResult result;
-- BraseroMediumPrivate *priv;
-- BraseroScsiRawTocDesc *desc;
-- BraseroScsiRawTocData *toc = NULL;
--
-- BRASERO_BURN_LOG ("Reading Raw Toc");
--
-- priv = BRASERO_MEDIUM_PRIVATE (self);
--
-- size = 0;
-- result = brasero_mmc1_read_toc_raw (fd,
-- 0,
-- &toc,
-- &size,
-- code);
-- if (result != BRASERO_SCSI_OK) {
-- BRASERO_BURN_LOG ("READ TOC failed");
-- return BRASERO_BURN_ERR;
-- }
--
-- num = (size - sizeof (BraseroScsiRawTocData)) /
-- sizeof (BraseroScsiRawTocDesc);
--
-- BRASERO_BURN_LOG ("%i track(s) found", num);
--
-- desc = toc->desc;
-- use_bcd = brasero_medium_check_BCD_use (self, fd, desc, num, code);
-- if (!use_bcd) {
-- g_free (toc);
--
-- BRASERO_BURN_LOG ("Fallback to formatted toc");
-- return BRASERO_BURN_ERR;
-- }
--
-- if (use_bcd > 0)
-- use_bcd = 0;
--
-- if (use_bcd) {
-- BRASERO_BURN_LOG ("Using BCD format");
-- }
-- else {
-- BRASERO_BURN_LOG ("Using HEX format");
-- }
--
-- for (i = 0; i < num; i++, desc ++) {
-- BraseroMediumTrack *track;
--
-- track = NULL;
-- if (desc->adr == 1 && desc->point <= BRASERO_SCSI_Q_SUB_CHANNEL_TRACK_START) {
-- track = g_new0 (BraseroMediumTrack, 1);
-- track->session = desc->session_num;
--
-- brasero_medium_set_track_type (self, track, desc->control);
-- if (use_bcd)
-- track->start = BRASERO_MSF_TO_LBA (BRASERO_GET_BCD (desc->p_min),
-- BRASERO_GET_BCD (desc->p_sec),
-- BRASERO_GET_BCD (desc->p_frame));
-- else
-- track->start = BRASERO_MSF_TO_LBA (desc->p_min,
-- desc->p_sec,
-- desc->p_frame);
--
-- track->start -= 150;
--
-- /* if there are tracks and the last previously added track is in
-- * the same session then set the size */
-- if (priv->tracks) {
-- BraseroMediumTrack *last_track;
--
-- last_track = priv->tracks->data;
-- if (last_track->session == track->session)
-- last_track->blocks_num = track->start - last_track->start;
-- }
--
-- priv->tracks = g_slist_prepend (priv->tracks, track);
-- }
-- else if (desc->point == BRASERO_SCSI_Q_SUB_CHANNEL_LEADOUT_START) {
-- /* NOTE: the leadout session is first in the list. So if
-- * we have tracks in the list set the last session track
-- * size when we reach a new leadout (and therefore a new
-- * session). */
--
-- if (priv->tracks) {
-- BraseroMediumTrack *last_track;
--
-- last_track = priv->tracks->data;
-- last_track->blocks_num = leadout_start - last_track->start;
-- }
--
-- if (use_bcd)
-- leadout_start = BRASERO_MSF_TO_LBA (BRASERO_GET_BCD (desc->p_min),
-- BRASERO_GET_BCD (desc->p_sec),
-- BRASERO_GET_BCD (desc->p_frame));
-- else
-- leadout_start = BRASERO_MSF_TO_LBA (desc->p_min,
-- desc->p_sec,
-- desc->p_frame);
-- leadout_start -= 150;
-- }
-- }
--
-- if (priv->tracks) {
-- BraseroMediumTrack *last_track;
--
-- /* set the last found track size */
-- last_track = priv->tracks->data;
-- last_track->blocks_num = leadout_start - last_track->start;
-- }
--
-- /* Add a leadout */
-- if (!(priv->info & BRASERO_MEDIUM_CLOSED)) {
-- BraseroMediumTrack *track;
--
-- /* we shouldn't request info on leadout if the disc is closed */
-- track = g_new0 (BraseroMediumTrack, 1);
-- priv->tracks = g_slist_prepend (priv->tracks, track);
-- track->start = leadout_start;
-- track->type = BRASERO_MEDIUM_TRACK_LEADOUT;
--
-- brasero_medium_track_get_info (self, track, g_slist_length (priv->tracks), fd, code);
-- }
--
-- priv->tracks = g_slist_reverse (priv->tracks);
--
-- for (iter = priv->tracks; iter; iter = iter->next) {
-- BraseroMediumTrack *track;
--
-- track = iter->data;
--
-- /* 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_BURN_LOG ("Track %i: type = %i start = %llu size = %llu",
-- g_slist_index (priv->tracks, track),
-- track->type,
-- track->start,
-- track->blocks_num);
-- }
--
-- g_free (toc);
-- return BRASERO_BURN_OK;
--}
--
--/**
-- * 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
-- * For all multisession DVD-/+R and CDR-RW the remaining size is given
-- * in the leadout. One exception though with DVD+/-RW.
-- */
--
--static void
--brasero_medium_add_DVD_plus_RW_leadout (BraseroMedium *self,
-- gint32 start)
--{
-- BraseroMediumTrack *leadout;
-- BraseroMediumPrivate *priv;
--
-- priv = BRASERO_MEDIUM_PRIVATE (self);
--
-- leadout = g_new0 (BraseroMediumTrack, 1);
-- priv->tracks = g_slist_append (priv->tracks, leadout);
--
-- leadout->start = start;
-- leadout->type = BRASERO_MEDIUM_TRACK_LEADOUT;
--
-- /* we fabricate the leadout here. We don't really need one in
-- * fact since it is always at the last sector whatever the
-- * amount of data written. So we need in fact to read the file
-- * system and get the last sector from it. Hopefully it won't be
-- * buggy */
-- priv->next_wr_add = 0;
--
-- leadout->blocks_num = priv->block_num;
-- if (g_slist_length (priv->tracks) > 1) {
-- BraseroMediumTrack *track;
--
-- track = priv->tracks->data;
-- leadout->blocks_num -= ((track->blocks_num > 300) ? track->blocks_num : 300);
-- }
-- BRASERO_BURN_LOG ("Adding fabricated leadout start = %llu length = %llu",
-- leadout->start,
-- leadout->blocks_num);
--}
--
--static BraseroBurnResult
--brasero_medium_get_sessions_info (BraseroMedium *self,
-- int fd,
-- BraseroScsiErrCode *code)
--{
-- int num, i, size;
-- BraseroScsiResult result;
-- BraseroScsiTocDesc *desc;
-- BraseroMediumPrivate *priv;
-- BraseroScsiFormattedTocData *toc = NULL;
--
-- BRASERO_BURN_LOG ("Reading Toc");
--
-- priv = BRASERO_MEDIUM_PRIVATE (self);
-- result = brasero_mmc1_read_toc_formatted (fd,
-- 0,
-- &toc,
-- &size,
-- code);
-- if (result != BRASERO_SCSI_OK) {
-- g_free (toc);
--
-- BRASERO_BURN_LOG ("READ TOC failed");
-- return BRASERO_BURN_ERR;
-- }
--
-- num = (size - sizeof (BraseroScsiFormattedTocData)) /
-- sizeof (BraseroScsiTocDesc);
--
-- BRASERO_BURN_LOG ("%i track(s) found", num);
--
-- desc = toc->desc;
-- for (i = 0; i < num; i ++, desc ++) {
-- BraseroMediumTrack *track;
--
-- if (desc->track_num == BRASERO_SCSI_TRACK_LEADOUT_START)
-- break;
--
-- track = g_new0 (BraseroMediumTrack, 1);
-- priv->tracks = g_slist_prepend (priv->tracks, track);
-- 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),
-- fd,
-- code);
--
-- if (desc->control & BRASERO_SCSI_TRACK_COPY)
-- track->type |= BRASERO_MEDIUM_TRACK_COPY;
--
-- if (!(desc->control & BRASERO_SCSI_TRACK_DATA)) {
-- track->type |= BRASERO_MEDIUM_TRACK_AUDIO;
-- priv->info |= BRASERO_MEDIUM_HAS_AUDIO;
--
-- if (desc->control & BRASERO_SCSI_TRACK_PREEMP)
-- track->type |= BRASERO_MEDIUM_TRACK_PREEMP;
--
-- 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)) {
-- BraseroBurnResult result;
--
-- /* a special case for these two kinds of media (DVD+RW)
-- * which have only one track: the first. */
-- result = brasero_medium_track_volume_size (self,
-- track,
-- fd);
-- 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 {
-- 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;
-- }
-- }
--
-- /* put the tracks in the right order */
-- priv->tracks = g_slist_reverse (priv->tracks);
--
-- if (BRASERO_MEDIUM_IS (priv->info, BRASERO_MEDIUM_DVDRW_PLUS)
-- || BRASERO_MEDIUM_IS (priv->info, BRASERO_MEDIUM_DVDRW_RESTRICTED))
-- brasero_medium_add_DVD_plus_RW_leadout (self, BRASERO_GET_32 (desc->track_start));
-- else if (!(priv->info & BRASERO_MEDIUM_CLOSED)) {
-- BraseroMediumTrack *track;
--
-- /* we shouldn't request info on leadout if the disc is closed
-- * (except for DVD+/- (restricted) RW (see above) */
-- track = g_new0 (BraseroMediumTrack, 1);
-- priv->tracks = g_slist_append (priv->tracks, track);
-- track->start = BRASERO_GET_32 (desc->track_start);
-- track->type = BRASERO_MEDIUM_TRACK_LEADOUT;
--
-- brasero_medium_track_get_info (self,
-- track,
-- g_slist_length (priv->tracks),
-- fd,
-- code);
-- }
--
-- g_free (toc);
--
-- return BRASERO_BURN_OK;
--}
--
--static BraseroBurnResult
--brasero_medium_get_contents (BraseroMedium *self,
-- int fd,
-- BraseroScsiErrCode *code)
--{
-- int size;
-- BraseroScsiResult result;
-- BraseroMediumPrivate *priv;
-- BraseroScsiDiscInfoStd *info = NULL;
--
-- BRASERO_BURN_LOG ("Retrieving media status");
--
-- priv = BRASERO_MEDIUM_PRIVATE (self);
--
-- result = brasero_mmc1_read_disc_information_std (fd,
-- &info,
-- &size,
-- code);
-- if (result != BRASERO_SCSI_OK) {
-- g_free (info);
--
-- BRASERO_BURN_LOG ("READ DISC INFORMATION failed");
-- return BRASERO_BURN_ERR;
-- }
--
-- if (info->erasable)
-- priv->info |= BRASERO_MEDIUM_REWRITABLE;
--
-- if (info->status == BRASERO_SCSI_DISC_EMPTY) {
-- BraseroMediumTrack *track;
--
-- BRASERO_BURN_LOG ("Empty media");
--
-- priv->info |= BRASERO_MEDIUM_BLANK;
-- priv->block_size = 2048;
--
-- if (BRASERO_MEDIUM_IS (priv->info, BRASERO_MEDIUM_DVDRW_PLUS)
-- || BRASERO_MEDIUM_IS (priv->info, BRASERO_MEDIUM_DVDRW_RESTRICTED))
-- brasero_medium_add_DVD_plus_RW_leadout (self, 0);
-- else {
-- track = g_new0 (BraseroMediumTrack, 1);
-- track->start = 0;
-- track->type = BRASERO_MEDIUM_TRACK_LEADOUT;
-- priv->tracks = g_slist_prepend (priv->tracks, track);
--
-- brasero_medium_track_get_info (self,
-- track,
-- 1,
-- fd,
-- code);
-- }
-- goto end;
-- }
--
-- if (info->status == BRASERO_SCSI_DISC_INCOMPLETE) {
-- priv->info |= BRASERO_MEDIUM_APPENDABLE;
-- BRASERO_BURN_LOG ("Appendable media");
-- }
-- else if (info->status == BRASERO_SCSI_DISC_FINALIZED) {
-- priv->info |= BRASERO_MEDIUM_CLOSED;
-- BRASERO_BURN_LOG ("Closed media");
-- }
--
-- if (priv->info & BRASERO_MEDIUM_CD) {
-- result = brasero_medium_get_CD_sessions_info (self, fd, code);
-- if (result != BRASERO_BURN_OK)
-- result = brasero_medium_get_sessions_info (self, fd, code);
-- }
-- else
-- result = brasero_medium_get_sessions_info (self, fd, code);
--
-- if (result != BRASERO_BURN_OK)
-- goto end;
--
--end:
--
-- g_free (info);
-- return BRASERO_BURN_OK;
--}
--
--static void
--brasero_medium_init_real (BraseroMedium *object, int fd)
--{
-- gchar *name;
-- BraseroBurnResult result;
-- BraseroMediumPrivate *priv;
-- BraseroScsiErrCode code = 0;
--
-- priv = BRASERO_MEDIUM_PRIVATE (object);
--
-- name = nautilus_burn_drive_get_name_for_display (priv->drive);
-- BRASERO_BURN_LOG ("Initializing information for medium in %s", name);
-- g_free (name);
--
-- result = brasero_medium_get_medium_type (object, fd, &code);
-- if (result != BRASERO_BURN_OK)
-- return;
--
-- brasero_medium_get_capacity_by_type (object, fd, &code);
--
-- result = brasero_medium_get_contents (object, fd, &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_BURN_LOG_DISC_TYPE (priv->info, "media is ");
--}
--
--static gboolean
--brasero_medium_retry_open (gpointer object)
--{
-- int fd;
-- const gchar *path;
-- BraseroMedium *self;
-- BraseroMediumPrivate *priv;
--
-- 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) {
-- BRASERO_BURN_LOG ("Device busy");
-- /* we'll retry in a second */
-- return TRUE;
-- }
--
-- BRASERO_BURN_LOG ("Open () failed");
-- priv->info = BRASERO_MEDIUM_UNSUPPORTED;
-- priv->retry_id = 0;
-- return FALSE;
-- }
--
-- BRASERO_BURN_LOG ("Open () succeeded\n");
-- priv->info = BRASERO_MEDIUM_NONE;
-- priv->icon = icons [0];
--
-- priv->retry_id = 0;
--
-- brasero_medium_init_real (self, fd);
-- close (fd);
--
-- return FALSE;
--}
--
--static void
--brasero_medium_try_open (BraseroMedium *self)
--{
-- int fd;
-- const gchar *path;
-- BraseroMediumPrivate *priv;
--
-- priv = BRASERO_MEDIUM_PRIVATE (self);
-- path = nautilus_burn_drive_get_device (priv->drive);
--
-- /* 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) {
-- BRASERO_BURN_LOG ("Device busy");
-- priv->info = BRASERO_MEDIUM_BUSY;
-- priv->icon = icons [0];
--
-- priv->retry_id = g_timeout_add (BUSY_RETRY_TIME,
-- brasero_medium_retry_open,
-- self);
-- }
--
-- BRASERO_BURN_LOG ("Open () failed");
-- return;
-- }
--
-- BRASERO_BURN_LOG ("Open () succeeded");
-- brasero_medium_init_real (self, fd);
-- close (fd);
--}
--
--static void
--brasero_medium_init (BraseroMedium *object)
--{
-- BraseroMediumPrivate *priv;
--
-- priv = BRASERO_MEDIUM_PRIVATE (object);
-- priv->next_wr_add = -1;
--
-- /* we can't do anything here since properties haven't been set yet */
--}
--
--static void
--brasero_medium_finalize (GObject *object)
--{
-- BraseroMediumPrivate *priv;
--
-- priv = BRASERO_MEDIUM_PRIVATE (object);
--
-- if (priv->retry_id) {
-- g_source_remove (priv->retry_id);
-- priv->retry_id = 0;
-- }
--
-- g_free (priv->rd_speeds);
-- priv->rd_speeds = NULL;
--
-- g_free (priv->wr_speeds);
-- priv->wr_speeds = NULL;
--
-- g_slist_foreach (priv->tracks, (GFunc) g_free, NULL);
-- g_slist_free (priv->tracks);
-- priv->tracks = NULL;
--
-- nautilus_burn_drive_unref (priv->drive);
-- priv->drive = NULL;
--
-- G_OBJECT_CLASS (parent_class)->finalize (object);
--}
--
--static void
--brasero_medium_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
--{
-- BraseroMediumPrivate *priv;
--
-- g_return_if_fail (BRASERO_IS_MEDIUM (object));
--
-- priv = BRASERO_MEDIUM_PRIVATE (object);
--
-- switch (prop_id)
-- {
-- case PROP_DRIVE:
-- priv->drive = g_value_get_object (value);
-- nautilus_burn_drive_ref (priv->drive);
-- brasero_medium_try_open (BRASERO_MEDIUM (object));
-- break;
-- default:
-- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-- break;
-- }
--}
--
--static void
--brasero_medium_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
--{
-- BraseroMediumPrivate *priv;
--
-- g_return_if_fail (BRASERO_IS_MEDIUM (object));
--
-- priv = BRASERO_MEDIUM_PRIVATE (object);
--
-- switch (prop_id)
-- {
-- case PROP_DRIVE:
-- nautilus_burn_drive_ref (priv->drive);
-- g_value_set_object (value, priv->drive);
-- break;
-- default:
-- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-- break;
-- }
--}
--
--static void
--brasero_medium_class_init (BraseroMediumClass *klass)
--{
-- GObjectClass* object_class = G_OBJECT_CLASS (klass);
-- parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (klass));
--
-- g_type_class_add_private (klass, sizeof (BraseroMediumPrivate));
--
-- object_class->finalize = brasero_medium_finalize;
-- object_class->set_property = brasero_medium_set_property;
-- object_class->get_property = brasero_medium_get_property;
--
-- g_object_class_install_property (object_class,
-- PROP_DRIVE,
-- g_param_spec_object ("drive",
-- "drive",
-- "drive in which medium is inserted",
-- NAUTILUS_BURN_TYPE_DRIVE,
-- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
--}
--
--GType
--brasero_medium_get_type (void)
--{
-- static GType our_type = 0;
--
-- if (our_type == 0)
-- {
-- static const GTypeInfo our_info =
-- {
-- sizeof (BraseroMediumClass), /* class_size */
-- (GBaseInitFunc) NULL, /* base_init */
-- (GBaseFinalizeFunc) NULL, /* base_finalize */
-- (GClassInitFunc) brasero_medium_class_init, /* class_init */
-- (GClassFinalizeFunc) NULL, /* class_finalize */
-- NULL /* class_data */,
-- sizeof (BraseroMedium), /* instance_size */
-- 0, /* n_preallocs */
-- (GInstanceInitFunc) brasero_medium_init, /* instance_init */
-- NULL /* value_table */
-- };
--
-- our_type = g_type_register_static (G_TYPE_OBJECT, "BraseroMedium",
-- &our_info, 0);
-- }
--
-- return our_type;
--}
--
--BraseroMedium *
--brasero_medium_new (NautilusBurnDrive *drive)
--{
-- g_return_val_if_fail (drive != NULL, NULL);
-- return BRASERO_MEDIUM (g_object_new (BRASERO_TYPE_MEDIUM,
-- "drive", drive,
-- NULL));
--}
diff --git a/sysutils/brasero/files/patch-src_cam b/sysutils/brasero/files/patch-src_cam
deleted file mode 100644
index beeeb7033de1..000000000000
--- a/sysutils/brasero/files/patch-src_cam
+++ /dev/null
@@ -1,1361 +0,0 @@
-diff -rupN cam.orig/freebsd_dvd_rw_utils.h cam/freebsd_dvd_rw_utils.h
---- /dev/null 1969-12-31 19:00:00.000000000 -0500
-+++ src/cam/freebsd_dvd_rw_utils.h 2008-01-24 16:52:25.000000000 -0500
-@@ -0,0 +1,49 @@
-+//
-+// This is part of dvd+rw-tools by Andy Polyakov <appro@fy.chalmers.se>
-+//
-+// Use-it-on-your-own-risk, GPL bless...
-+//
-+// For further details see http://fy.chalmers.se/~appro/linux/DVD+RW/
-+//
-+
-+#ifndef FREEBSD_DVD_RW_UTILS_H
-+#define FREEBSD_DVD_RW_UTILS_H
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif
-+
-+#include <glib.h>
-+
-+#include "cam-cdrom.h"
-+
-+#define DRIVE_CDROM_CAPS_DVDRW 1
-+#define DRIVE_CDROM_CAPS_DVDPLUSR 2
-+#define DRIVE_CDROM_CAPS_DVDPLUSRW 4
-+#define DRIVE_CDROM_CAPS_DVDPLUSRWDL 8
-+#define DRIVE_CDROM_CAPS_DVDPLUSRDL 16
-+#define DRIVE_CDROM_CAPS_BDROM 32
-+#define DRIVE_CDROM_CAPS_BDR 64
-+#define DRIVE_CDROM_CAPS_BDRE 128
-+#define DRIVE_CDROM_CAPS_HDDVDROM 256
-+#define DRIVE_CDROM_CAPS_HDDVDR 512
-+#define DRIVE_CDROM_CAPS_HDDVDRW 1024
-+
-+int brasero_cdrom_get_dvd_r_rw_profile (BRASEROCDROM *cdrom);
-+int brasero_cdrom_get_read_write_speed (BRASEROCDROM *cdrom, int *read_speed, int *write_speed, char **write_speeds);
-+int brasero_cdrom_get_disc_capacity_for_type (BRASEROCDROM *cdrom, int type, guint64 *capacity);
-+int brasero_cdrom_get_disc_type (BRASEROCDROM *cdrom);
-+int brasero_cdrom_read_disc_information_std (BRASEROCDROM *cdrom, unsigned char *buf);
-+int brasero_cdrom_disc_is_appendable (BRASEROCDROM *cdrom);
-+int brasero_cdrom_disc_is_rewritable (BRASEROCDROM *cdrom);
-+int brasero_cdrom_read_atip (BRASEROCDROM *cdrom, unsigned char **buf);
-+int brasero_cdrom_read_format_capacities (BRASEROCDROM *cdrom, unsigned char **buf);
-+int brasero_cdrom_get_performance_wrt_spd_desc (BRASEROCDROM *cdrom, unsigned char **buf);
-+int brasero_cdrom_get_configuration_feature (BRASEROCDROM *cdrom, int feature, unsigned char **buf);
-+int brasero_cdrom_read_track_info (BRASEROCDROM *cdrom, int track_num, unsigned char *buf, int size);
-+int brasero_cdrom_read_toc_raw (BRASEROCDROM *cdrom, int track_num, unsigned char **buf);
-+int brasero_cdrom_read_toc_formatted (BRASEROCDROM *cdrom, int track_num, unsigned char **buf);
-+int brasero_read_disc_information_std (BRASEROCDROM *cdrom, unsigned char *buf);
-+int brasero_cdrom_read_format_capacities (BRASEROCDROM *cdrom, unsigned char **buf);
-+
-+#endif /* FREEBSD_DVD_RW_UTILS_H */
---- /dev/null 2008-02-03 02:26:39.000000000 -0500
-+++ src/cam/cam-cdrom.h 2008-02-03 11:32:23.000000000 -0500
-@@ -0,0 +1,68 @@
-+/***************************************************************************
-+ * CVSID: $Id$
-+ *
-+ * hfp-cdrom.h : SCSI CD-ROM abstraction layer
-+ *
-+ * Copyright (C) 2006 Jean-Yves Lefort <jylefort@FreeBSD.org>
-+ *
-+ * 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 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 St, Fifth Floor, Boston, MA 02110-1301 USA
-+ *
-+ **************************************************************************/
-+
-+#ifndef _BRASERO_CDROM_H
-+#define _BRASERO_CDROM_H
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif
-+
-+#include <glib.h>
-+
-+#include <sys/types.h>
-+
-+typedef struct _BRASEROCDROM BRASEROCDROM;
-+
-+typedef enum
-+{
-+ BRASERO_CDROM_DIRECTION_NONE,
-+ BRASERO_CDROM_DIRECTION_IN,
-+ BRASERO_CDROM_DIRECTION_OUT
-+} BRASEROCDROMDirection;
-+
-+/* ATAPI/SCSI commands */
-+enum
-+{
-+ BRASERO_CDROM_TEST_UNIT_READY = 0x00,
-+ BRASERO_CDROM_GET_EVENT_STATUS_NOTIFICATION = 0x4a,
-+ BRASERO_CDROM_MODE_SENSE_BIG = 0x5a
-+};
-+
-+BRASEROCDROM *brasero_cdrom_new (const char *path);
-+
-+gboolean brasero_cdrom_send_ccb (BRASEROCDROM *cdrom,
-+ const char *ccb,
-+ int ccb_len,
-+ BRASEROCDROMDirection direction,
-+ void *data,
-+ int len,
-+ char **err);
-+
-+gboolean brasero_cdrom_test_unit_ready (BRASEROCDROM *cdrom);
-+
-+int brasero_cdrom_get_fd (BRASEROCDROM *cdrom);
-+
-+void brasero_cdrom_free (BRASEROCDROM *cdrom);
-+
-+#endif /* _BRASERO_CDROM_H */
---- /dev/null 2008-02-03 13:11:45.000000000 -0500
-+++ src/cam/cam-cdrom.c 2008-02-03 13:24:53.000000000 -0500
-@@ -0,0 +1,156 @@
-+/***************************************************************************
-+ * CVSID: $Id$
-+ *
-+ * cam-cdrom.c : SCSI CD-ROM abstraction layer
-+ *
-+ * Copyright (C) 2006 Jean-Yves Lefort <jylefort@FreeBSD.org>
-+ *
-+ * 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 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 St, Fifth Floor, Boston, MA 02110-1301 USA
-+ *
-+ **************************************************************************/
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif
-+
-+#include <string.h>
-+#include <errno.h>
-+#include <fcntl.h>
-+#include <unistd.h>
-+#include <sys/ioctl.h>
-+#include <sys/types.h>
-+#include <sys/ata.h>
-+#include <stdio.h>
-+#include <camlib.h>
-+#include <cam/scsi/scsi_message.h>
-+#include <glib.h>
-+
-+#include "cam-cdrom.h"
-+
-+struct _BRASEROCDROM
-+{
-+ struct cam_device *cam; /* for SCSI drives */
-+ int fd;
-+};
-+
-+BRASEROCDROM *
-+brasero_cdrom_new (const char *path)
-+{
-+ BRASEROCDROM *cdrom = NULL;
-+ struct cam_device *cam;
-+ int fd;
-+
-+ g_assert(path != NULL);
-+
-+ /* brasero_open_device() fails unless we use O_RDWR */
-+ cam = cam_open_device(path, O_RDWR);
-+ fd = open(path, O_RDONLY | O_NONBLOCK);
-+ if (cam && fd > -1)
-+ {
-+ cdrom = g_new0(BRASEROCDROM, 1);
-+ cdrom->cam = cam;
-+ cdrom->fd = fd;
-+ }
-+
-+ return cdrom;
-+}
-+
-+gboolean
-+brasero_cdrom_send_ccb (BRASEROCDROM *cdrom,
-+ const char *ccb,
-+ int ccb_len,
-+ BRASEROCDROMDirection direction,
-+ void *data,
-+ int len,
-+ char **err)
-+{
-+ int timeout;
-+
-+ g_assert(cdrom != NULL);
-+ g_assert(ccb != NULL);
-+ g_assert(direction == BRASERO_CDROM_DIRECTION_NONE
-+ || direction == BRASERO_CDROM_DIRECTION_IN
-+ || direction == BRASERO_CDROM_DIRECTION_OUT);
-+ g_assert(direction == BRASERO_CDROM_DIRECTION_NONE || data != NULL);
-+
-+ timeout = 10;
-+
-+ union ccb cam_ccb;
-+ static int scsi_direction[] = { CAM_DIR_NONE, CAM_DIR_IN, CAM_DIR_OUT };
-+
-+ memset(&cam_ccb, 0, sizeof(cam_ccb));
-+
-+ cam_ccb.ccb_h.path_id = cdrom->cam->path_id;
-+ cam_ccb.ccb_h.target_id = cdrom->cam->target_id;
-+ cam_ccb.ccb_h.target_lun = cdrom->cam->target_lun;
-+
-+ cam_fill_csio(&cam_ccb.csio,
-+ 1,
-+ NULL,
-+ scsi_direction[direction],
-+ MSG_SIMPLE_Q_TAG,
-+ data,
-+ len,
-+ sizeof(cam_ccb.csio.sense_data),
-+ ccb_len,
-+ timeout * 1000);
-+
-+ memcpy(cam_ccb.csio.cdb_io.cdb_bytes, ccb, 16);
-+
-+ if (cam_send_ccb(cdrom->cam, &cam_ccb) == -1)
-+ {
-+ if (err)
-+ *err = g_strdup_printf("cam_send_ccb() failure: %s", g_strerror(errno));
-+ }
-+ if ((cam_ccb.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP)
-+ {
-+ if (err)
-+ *err = g_strdup_printf("CCB request failed with status %i", cam_ccb.ccb_h.status & CAM_STATUS_MASK);
-+ return FALSE;
-+ }
-+
-+ return TRUE;
-+}
-+
-+gboolean
-+brasero_cdrom_test_unit_ready (BRASEROCDROM *cdrom)
-+{
-+ static char ccb[16] = { BRASERO_CDROM_TEST_UNIT_READY };
-+
-+ g_assert(cdrom != NULL);
-+
-+ return brasero_cdrom_send_ccb(cdrom, ccb, 6, BRASERO_CDROM_DIRECTION_NONE, NULL, 0, NULL);
-+}
-+
-+int
-+brasero_cdrom_get_fd (BRASEROCDROM *cdrom)
-+{
-+ g_assert(cdrom != NULL);
-+
-+ return (cdrom->fd);
-+}
-+
-+void
-+brasero_cdrom_free (BRASEROCDROM *cdrom)
-+{
-+ g_assert(cdrom != NULL);
-+
-+ if (cdrom->cam)
-+ cam_close_device(cdrom->cam);
-+
-+ close(cdrom->fd);
-+
-+ g_free(cdrom);
-+}
---- /dev/null 2008-02-03 13:11:45.000000000 -0500
-+++ src/cam/freebsd_dvd_rw_utils.c 2008-02-03 13:30:36.000000000 -0500
-@@ -0,0 +1,1075 @@
-+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*-
-+ *
-+ * This is part of dvd+rw-tools by Andy Polyakov <appro@fy.chalmers.se>
-+ *
-+ * Use-it-on-your-own-risk, GPL bless...
-+ *
-+ * For further details see http://fy.chalmers.se/~appro/linux/DVD+RW/
-+*/
-+
-+#include <stdio.h>
-+#include <string.h>
-+#include <stdlib.h>
-+#include <sys/types.h>
-+
-+#include <glib.h>
-+
-+#include "freebsd_dvd_rw_utils.h"
-+
-+typedef enum {
-+ NONE = BRASERO_CDROM_DIRECTION_NONE,
-+ READ = BRASERO_CDROM_DIRECTION_IN,
-+ WRITE = BRASERO_CDROM_DIRECTION_OUT
-+} Direction;
-+
-+typedef struct ScsiCommand ScsiCommand;
-+
-+struct ScsiCommand {
-+ BRASEROCDROM *cdrom;
-+ char ccb[16];
-+ int len;
-+};
-+
-+static ScsiCommand *
-+scsi_command_new_from_cdrom (BRASEROCDROM *cdrom)
-+{
-+ ScsiCommand *cmd;
-+
-+ cmd = g_new0 (ScsiCommand, 1);
-+ cmd->cdrom = cdrom;
-+
-+ return cmd;
-+}
-+
-+static void
-+scsi_command_free (ScsiCommand * cmd)
-+{
-+ free (cmd);
-+}
-+
-+static void
-+scsi_command_init (ScsiCommand * cmd, size_t i, int arg)
-+{
-+ cmd->ccb[i] = arg;
-+ if (i == 0 || i >= cmd->len)
-+ cmd->len = i + 1;
-+}
-+
-+static int
-+scsi_command_transport (ScsiCommand * cmd, Direction dir, void *buf,
-+ size_t sz)
-+{
-+ if (brasero_cdrom_send_ccb(cmd->cdrom, cmd->ccb, cmd->len, dir, buf, sz, NULL))
-+ return 0;
-+ else
-+ return -1;
-+}
-+
-+int
-+brasero_cdrom_get_dvd_r_rw_profile (BRASEROCDROM *cdrom)
-+{
-+ ScsiCommand *cmd;
-+ int retval = 0;
-+ unsigned char page[20];
-+ unsigned char *list;
-+ int i, len;
-+
-+ g_return_val_if_fail (cdrom != NULL, -1);
-+
-+ cmd = scsi_command_new_from_cdrom (cdrom);
-+
-+ scsi_command_init (cmd, 0, 0x46);
-+ scsi_command_init (cmd, 1, 2);
-+ scsi_command_init (cmd, 8, 8);
-+ scsi_command_init (cmd, 9, 0);
-+ if (scsi_command_transport (cmd, READ, page, 8)) {
-+ /* GET CONFIGURATION failed */
-+ scsi_command_free (cmd);
-+ return -1;
-+ }
-+
-+ /* See if it's 2 gen drive by checking if DVD+R profile is an option */
-+ len = 4 + (page[0] << 24 | page[1] << 16 | page[2] << 8 | page[3]);
-+ if (len > 264) {
-+ scsi_command_free (cmd);
-+ /* insane profile list length */
-+ return -1;
-+ }
-+
-+ list = g_new (unsigned char, len);
-+
-+ scsi_command_init (cmd, 0, 0x46);
-+ scsi_command_init (cmd, 1, 2);
-+ scsi_command_init (cmd, 7, len >> 8);
-+ scsi_command_init (cmd, 8, len);
-+ scsi_command_init (cmd, 9, 0);
-+ if (scsi_command_transport (cmd, READ, list, len)) {
-+ /* GET CONFIGURATION failed */
-+ scsi_command_free (cmd);
-+ free (list);
-+ return -1;
-+ }
-+
-+ for (i = 12; i < list[11]; i += 4) {
-+ int profile = (list[i] << 8 | list[i + 1]);
-+ /* 0x13: DVD-RW Restricted Overwrite
-+ * 0x14: DVD-RW Sequential
-+ * 0x1B: DVD+R
-+ * 0x1A: DVD+RW
-+ * 0x2A: DVD+RW DL
-+ * 0x2B: DVD+R DL
-+ * 0x40: BD-ROM
-+ * 0x41: BD-R SRM
-+ * 0x42: BD-R RRM
-+ * 0x43: BD-RE
-+ * 0x50: HD DVD-ROM
-+ * 0x51: HD DVD-R
-+ * 0x52: HD DVD-Rewritable
-+ */
-+
-+ switch (profile) {
-+ case 0x13:
-+ case 0x14:
-+ retval |= DRIVE_CDROM_CAPS_DVDRW;
-+ break;
-+ case 0x1B:
-+ retval |= DRIVE_CDROM_CAPS_DVDPLUSR;
-+ break;
-+ case 0x1A:
-+ retval |= DRIVE_CDROM_CAPS_DVDPLUSRW;
-+ break;
-+ case 0x2A:
-+ retval |= DRIVE_CDROM_CAPS_DVDPLUSRWDL;
-+ break;
-+ case 0x2B:
-+ retval |= DRIVE_CDROM_CAPS_DVDPLUSRDL;
-+ break;
-+ case 0x40:
-+ retval |= DRIVE_CDROM_CAPS_BDROM;
-+ break;
-+ case 0x41:
-+ case 0x42:
-+ retval |= DRIVE_CDROM_CAPS_BDR;
-+ break;
-+ case 0x43:
-+ retval |= DRIVE_CDROM_CAPS_BDRE;
-+ break;
-+ case 0x50:
-+ retval |= DRIVE_CDROM_CAPS_HDDVDROM;
-+ break;
-+ case 0x51:
-+ retval |= DRIVE_CDROM_CAPS_HDDVDR;
-+ break;
-+ case 0x52:
-+ retval |= DRIVE_CDROM_CAPS_HDDVDRW;
-+ break;
-+ default:
-+ break;
-+ }
-+ }
-+
-+ scsi_command_free (cmd);
-+ free (list);
-+
-+ return retval;
-+
-+}
-+
-+static unsigned char *
-+pull_page2a_from_cdrom (BRASEROCDROM *cdrom)
-+{
-+ ScsiCommand *cmd;
-+ unsigned char header[12], *page2A;
-+ unsigned int len, bdlen;
-+
-+ g_return_val_if_fail (cdrom != NULL, NULL);
-+
-+ cmd = scsi_command_new_from_cdrom (cdrom);
-+
-+ scsi_command_init (cmd, 0, 0x5A); /* MODE SENSE */
-+ scsi_command_init (cmd, 1, 0x08); /* Disable Block Descriptors */
-+ scsi_command_init (cmd, 2, 0x2A); /* Capabilities and Mechanical Status */
-+ scsi_command_init (cmd, 8, sizeof (header)); /* header only to start with */
-+ scsi_command_init (cmd, 9, 0);
-+
-+ if (scsi_command_transport (cmd, READ, header, sizeof (header))) {
-+ /* MODE SENSE failed */
-+ scsi_command_free (cmd);
-+ return NULL;
-+ }
-+
-+ len = (header[0] << 8 | header[1]) + 2;
-+ bdlen = header[6] << 8 | header[7];
-+
-+ /* should never happen as we set "DBD" above */
-+ if (bdlen) {
-+ if (len < (8 + bdlen + 30)) {
-+ /* LUN impossible to bear with */
-+ scsi_command_free (cmd);
-+ return NULL;
-+ }
-+ } else if (len < (8 + 2 + (unsigned int) header[9])) {
-+ /* SANYO does this. */
-+ len = 8 + 2 + header[9];
-+ }
-+
-+ page2A = g_new (unsigned char, len);
-+ if (page2A == NULL) {
-+ /* ENOMEM */
-+ scsi_command_free (cmd);
-+ return NULL;
-+ }
-+
-+ scsi_command_init (cmd, 0, 0x5A); /* MODE SENSE */
-+ scsi_command_init (cmd, 1, 0x08); /* Disable Block Descriptors */
-+ scsi_command_init (cmd, 2, 0x2A); /* Capabilities and Mechanical Status */
-+ scsi_command_init (cmd, 7, len >> 8);
-+ scsi_command_init (cmd, 8, len); /* Real length */
-+ scsi_command_init (cmd, 9, 0);
-+ if (scsi_command_transport (cmd, READ, page2A, len)) {
-+ /* MODE SENSE failed */
-+ scsi_command_free (cmd);
-+ free (page2A);
-+ return NULL;
-+ }
-+
-+ scsi_command_free (cmd);
-+
-+ len -= 2;
-+ /* paranoia */
-+ if (len < ((unsigned int) page2A[0] << 8 | page2A[1])) {
-+ page2A[0] = len >> 8;
-+ page2A[1] = len;
-+ }
-+
-+ return page2A;
-+}
-+
-+static int
-+int_compare (const void *a, const void *b)
-+{
-+ /* descending order */
-+ return *((int *) b) - *((int *) a);
-+}
-+
-+/* gets the list of supported write speeds. in the event
-+ * that anything goes wrong, returns NULL.
-+ */
-+static char *
-+get_write_speeds (const unsigned char *p, int length, int max_speed)
-+{
-+ char *result, *str;
-+ int nr_records;
-+ int *tmpspeeds;
-+ int i, j;
-+
-+ result = NULL;
-+
-+ /* paranoia */
-+ if (length < 32)
-+ return NULL;
-+
-+ nr_records = p[30] << 8 | p[31];
-+
-+ /* paranoia */
-+ if (length < 32 + 4 * nr_records)
-+ return NULL;
-+
-+ tmpspeeds = g_new (int, nr_records);
-+
-+ for (i = 0; i < nr_records; i++)
-+ {
-+ tmpspeeds[i] = p[4*i + 34] << 8 | p[4*i + 35];
-+
-+ /* i'm not sure how likely this is to show up, but it's
-+ * definitely wrong. if we see it, abort.
-+ */
-+ if (tmpspeeds[i] == 0)
-+ goto free_tmpspeeds;
-+ }
-+
-+ /* sort */
-+ qsort (tmpspeeds, nr_records, sizeof (int), int_compare);
-+
-+ /* uniq */
-+ for (i = j = 0; i < nr_records; i++)
-+ {
-+ tmpspeeds[j] = tmpspeeds[i];
-+
-+ /* make sure we don't look past the end of the array */
-+ if (i >= (nr_records - 1) || tmpspeeds[i+1] != tmpspeeds[i])
-+ j++;
-+ }
-+
-+ /* j is now the number of unique entries in the array */
-+ if (j == 0)
-+ /* no entries? this isn't right. */
-+ goto free_tmpspeeds;
-+
-+ /* sanity check: the first item in the descending order
-+ * list ought to be the highest speed as detected through
-+ * other means
-+ */
-+ if (tmpspeeds[0] != max_speed)
-+ /* sanity check failed. */
-+ goto free_tmpspeeds;
-+
-+ /* our values are 16-bit. 8 bytes per value
-+ * is more than enough including space for
-+ * ',' and '\0'. we know j is not zero.
-+ */
-+ result = str = g_new (char, 8 * j);
-+
-+ for (i = 0; i < j; i++)
-+ {
-+ if (i > 0)
-+ *(str++) = ',';
-+
-+ str += sprintf (str, "%d", tmpspeeds[i]);
-+ }
-+
-+free_tmpspeeds:
-+ free (tmpspeeds);
-+
-+ return result;
-+}
-+
-+int
-+brasero_cdrom_get_read_write_speed (BRASEROCDROM *cdrom, int *read_speed, int *write_speed, char **write_speeds)
-+{
-+ unsigned char *page2A;
-+ int len, hlen;
-+ unsigned char *p;
-+
-+ g_return_val_if_fail (cdrom != NULL, -1);
-+
-+ *read_speed = 0;
-+ *write_speed = 0;
-+ *write_speeds = NULL;
-+
-+ page2A = pull_page2a_from_cdrom (cdrom);
-+ if (page2A == NULL) {
-+ printf ("Failed to get Page 2A\n");
-+ /* Failed to get Page 2A */
-+ return -1;
-+ }
-+
-+ len = (page2A[0] << 8 | page2A[1]) + 2;
-+ hlen = 8 + (page2A[6] << 8 | page2A[7]);
-+ p = page2A + hlen;
-+
-+ /* Values guessed from the cd_mode_page_2A struct
-+ * in cdrecord's libscg/scg/scsireg.h */
-+ if (len < (hlen + 30) || p[1] < (30 - 2)) {
-+ /* no MMC-3 "Current Write Speed" present,
-+ * try to use the MMC-2 one */
-+ if (len < (hlen + 20) || p[1] < (20 - 2))
-+ *write_speed = 0;
-+ else
-+ *write_speed = p[18] << 8 | p[19];
-+ } else {
-+ *write_speed = p[28] << 8 | p[29];
-+ }
-+
-+ if (len >= hlen+9)
-+ *read_speed = p[8] << 8 | p[9];
-+ else
-+ *read_speed = 0;
-+
-+ *write_speeds = get_write_speeds (p, len, *write_speed);
-+
-+ free (page2A);
-+
-+ return 0;
-+}
-+
-+
-+static int
-+get_disc_capacity_cd (BRASEROCDROM *cdrom, guint64 *size)
-+{
-+ ScsiCommand *cmd;
-+ int retval;
-+ guint64 block_size;
-+ guint64 num_blocks;
-+ unsigned char header [8];
-+
-+ g_return_val_if_fail (cdrom != NULL, -1);
-+
-+ retval = -1;
-+
-+ cmd = scsi_command_new_from_cdrom (cdrom);
-+ scsi_command_init (cmd, 0, 0x25);
-+ scsi_command_init (cmd, 9, 0);
-+ if (scsi_command_transport (cmd, READ, header, 8)) {
-+ /* READ CDROM CAPACITY failed */
-+ goto done;
-+ }
-+
-+ num_blocks = (header [0] << 24) | (header [1] << 16) | (header [2] << 8) | header [3];
-+ num_blocks++;
-+ block_size = header [4] << 24 | header [5] << 16 | header [6] << 8 | header [7];
-+
-+ if (size) {
-+ *size = num_blocks * block_size;
-+ }
-+ retval = 0;
-+
-+ done:
-+ scsi_command_free (cmd);
-+
-+ return retval;
-+}
-+
-+static int
-+get_disc_capacity_cdr (BRASEROCDROM *cdrom, guint64 *size)
-+{
-+ ScsiCommand *cmd;
-+ int retval;
-+ guint64 secs;
-+ unsigned char toc [8];
-+ unsigned char *atip;
-+ int len;
-+
-+ g_return_val_if_fail (cdrom != NULL, -1);
-+
-+ retval = -1;
-+
-+ cmd = scsi_command_new_from_cdrom (cdrom);
-+ /* READ_TOC */
-+ scsi_command_init (cmd, 0, 0x43);
-+ /* FMT_ATIP */
-+ scsi_command_init (cmd, 2, 4 & 0x0F);
-+ scsi_command_init (cmd, 6, 0);
-+ scsi_command_init (cmd, 8, 4);
-+ scsi_command_init (cmd, 9, 0);
-+
-+ if (scsi_command_transport (cmd, READ, toc, 4)) {
-+ /* READ TOC failed */
-+ goto done;
-+ }
-+
-+ len = 2 + (toc [0] << 8 | toc [1]);
-+
-+ atip = g_new (unsigned char, len);
-+
-+ scsi_command_init (cmd, 0, 0x43);
-+ scsi_command_init (cmd, 2, 4 & 0x0F);
-+ scsi_command_init (cmd, 6, 0);
-+ scsi_command_init (cmd, 7, len >> 8);
-+ scsi_command_init (cmd, 8, len);
-+ scsi_command_init (cmd, 9, 0);
-+
-+ if (scsi_command_transport (cmd, READ, atip, len)) {
-+ /* READ TOC failed */
-+ free (atip);
-+ goto done;
-+ }
-+
-+ secs = atip [12] * 60 + atip [13] + (atip [14] / 75 + 1);
-+
-+ if (size) {
-+ *size = (1 + secs * 7 / 48) * 1024 * 1024;
-+ }
-+ retval = 0;
-+
-+ free (atip);
-+ done:
-+ scsi_command_free (cmd);
-+
-+ return retval;
-+}
-+
-+static int
-+get_disc_capacity_dvdr_from_type (BRASEROCDROM *cdrom, int type, guint64 *size)
-+{
-+ ScsiCommand *cmd;
-+ unsigned char formats [260];
-+ unsigned char buf [32];
-+ guint64 blocks;
-+ guint64 nwa;
-+ int i;
-+ int len;
-+ int obligatory;
-+ int retval;
-+ int next_track;
-+
-+ g_return_val_if_fail (cdrom != NULL, -1);
-+
-+ retval = -1;
-+ blocks = 0;
-+ next_track = 1;
-+
-+ cmd = scsi_command_new_from_cdrom (cdrom);
-+
-+ retry:
-+ if (type == 0x1A || type == 0x14 || type == 0x13 || type == 0x12) {
-+
-+ /* READ FORMAT CAPACITIES */
-+ scsi_command_init (cmd, 0, 0x23);
-+ scsi_command_init (cmd, 8, 12);
-+ scsi_command_init (cmd, 9, 0);
-+ if (scsi_command_transport (cmd, READ, formats, 12)) {
-+ /* READ FORMAT CAPACITIES failed */
-+ goto done;
-+ }
-+
-+ len = formats [3];
-+ if (len & 7 || len < 16) {
-+ /* Length isn't sane */
-+ goto done;
-+ }
-+
-+ scsi_command_init (cmd, 0, 0x23);
-+ scsi_command_init (cmd, 7, (4 + len) >> 8);
-+ scsi_command_init (cmd, 8, (4 + len) & 0xFF);
-+ scsi_command_init (cmd, 9, 0);
-+ if (scsi_command_transport (cmd, READ, formats, 4 + len)) {
-+ /* READ FORMAT CAPACITIES failed */
-+ goto done;
-+ }
-+
-+ if (len != formats [3]) {
-+ /* Parameter length inconsistency */
-+ goto done;
-+ }
-+ }
-+
-+ obligatory = 0x00;
-+
-+ switch (type) {
-+ case 0x1A: /* DVD+RW */
-+ obligatory = 0x26;
-+ case 0x13: /* DVD-RW Restricted Overwrite */
-+ case 0x14: /* DVD-RW Sequential */
-+ for (i = 8, len = formats [3]; i < len; i += 8) {
-+ if ((formats [4 + i + 4] >> 2) == obligatory) {
-+ break;
-+ }
-+ }
-+
-+ if (i == len) {
-+ /* Can't find obligatory format descriptor */
-+ goto done;
-+ }
-+
-+ blocks = formats [4 + i + 0] << 24;
-+ blocks |= formats [4 + i + 1] << 16;
-+ blocks |= formats [4 + i + 2] << 8;
-+ blocks |= formats [4 + i + 3];
-+ nwa = formats [4 + 5] << 16 | formats [4 + 6] << 8 | formats [4 + 7];
-+ if (nwa > 2048) {
-+ blocks *= nwa / 2048;
-+ } else if (nwa < 2048) {
-+ blocks /= 2048 / nwa;
-+ }
-+
-+ retval = 0;
-+ break;
-+
-+ case 0x12: /* DVD-RAM */
-+
-+ blocks = formats [4 + 0] << 24;
-+ blocks |= formats [4 + 1] << 16;
-+ blocks |= formats [4 + 2] << 8;
-+ blocks |= formats [4 + 3];
-+ nwa = formats [4 + 5] << 16 | formats [4 + 6] << 8 | formats [4 + 7];
-+ if (nwa > 2048) {
-+ blocks *= nwa / 2048;
-+ } else if (nwa < 2048) {
-+ blocks /= 2048 / nwa;
-+ }
-+
-+ retval = 0;
-+ break;
-+
-+ case 0x11: /* DVD-R */
-+ case 0x1B: /* DVD+R */
-+ case 0x2B: /* DVD+R Double Layer */
-+ case 0x41: /* BD-R SRM */
-+
-+ /* READ TRACK INFORMATION */
-+ scsi_command_init (cmd, 0, 0x52);
-+ scsi_command_init (cmd, 1, 1);
-+ scsi_command_init (cmd, 4, next_track >> 8);
-+ scsi_command_init (cmd, 5, next_track & 0xFF);
-+ scsi_command_init (cmd, 8, sizeof (buf));
-+ scsi_command_init (cmd, 9, 0);
-+ if (scsi_command_transport (cmd, READ, buf, sizeof (buf))) {
-+ /* READ TRACK INFORMATION failed */
-+ if (next_track > 0) {
-+ goto done;
-+ } else {
-+ next_track = 1;
-+ goto retry;
-+ }
-+ }
-+
-+ blocks = buf [24] << 24;
-+ blocks |= buf [25] << 16;
-+ blocks |= buf [26] << 8;
-+ blocks |= buf [27];
-+
-+ retval = 0;
-+ break;
-+ case 0x43: /* DB-RE */
-+ /* Pull the formatted capacity */
-+ blocks = formats [4 + 0] << 24;
-+ blocks |= formats [4 + 1] << 16;
-+ blocks |= formats [4 + 2] << 8;
-+ blocks |= formats [4 + 3];
-+ break;
-+ default:
-+ blocks = 0;
-+ break;
-+ }
-+
-+ done:
-+ scsi_command_free (cmd);
-+
-+ if (size) {
-+ *size = blocks * 2048;
-+ }
-+
-+ return retval;
-+}
-+
-+int
-+brasero_cdrom_get_disc_capacity_for_type (BRASEROCDROM *cdrom, int type, guint64 *size)
-+{
-+ int retval;
-+
-+ g_return_val_if_fail (cdrom != NULL, -1);
-+
-+ retval = -1;
-+
-+ switch (type) {
-+ case 0x8:
-+ retval = get_disc_capacity_cd (cdrom, size);
-+ break;
-+ case 0x9:
-+ case 0xa:
-+ retval = get_disc_capacity_cdr (cdrom, size);
-+ break;
-+ case 0x10:
-+ retval = get_disc_capacity_cd (cdrom, size);
-+ break;
-+ case 0x11:
-+ case 0x13:
-+ case 0x14:
-+ case 0x1B:
-+ case 0x2B:
-+ case 0x1A:
-+ case 0x12:
-+ case 0x41:
-+ case 0x43:
-+ retval = get_disc_capacity_dvdr_from_type (cdrom, type, size);
-+ break;
-+ default:
-+ retval = -1;
-+ }
-+
-+ return retval;
-+}
-+
-+int
-+brasero_cdrom_get_disc_type (BRASEROCDROM *cdrom)
-+{
-+ ScsiCommand *cmd;
-+ int retval = -1;
-+ unsigned char header[8];
-+
-+ g_return_val_if_fail (cdrom != NULL, -1);
-+
-+ cmd = scsi_command_new_from_cdrom (cdrom);
-+
-+ scsi_command_init (cmd, 0, 0x46);
-+ scsi_command_init (cmd, 1, 1);
-+ scsi_command_init (cmd, 8, 8);
-+ scsi_command_init (cmd, 9, 0);
-+ if (scsi_command_transport (cmd, READ, header, 8)) {
-+ /* GET CONFIGURATION failed */
-+ scsi_command_free (cmd);
-+ return -1;
-+ }
-+
-+ retval = (header[6]<<8)|(header[7]);
-+
-+
-+ scsi_command_free (cmd);
-+ return retval;
-+}
-+
-+int
-+brasero_cdrom_get_configuration_feature (BRASEROCDROM *cdrom,
-+ int feature,
-+ unsigned char **buf)
-+{
-+ ScsiCommand *cmd;
-+ int retval = 0;
-+ int len;
-+ unsigned char header[8];
-+
-+ g_return_val_if_fail (cdrom != NULL, -1);
-+ g_return_val_if_fail (buf != NULL, -1);
-+
-+ cmd = scsi_command_new_from_cdrom (cdrom);
-+
-+ scsi_command_init (cmd, 0, 0x46);
-+ scsi_command_init (cmd, 1, 2);
-+ scsi_command_init (cmd, 2, feature >> 8);
-+ scsi_command_init (cmd, 3, feature);
-+ scsi_command_init (cmd, 8, 8);
-+ scsi_command_init (cmd, 9, 0);
-+ if (scsi_command_transport (cmd, READ, header, 8)) {
-+ scsi_command_free (cmd);
-+ return -1;
-+ }
-+
-+ len = 4 + (header[0] << 24 | header[1] << 16 | header[2] << 8 | header[3]);
-+ if (len > 264) {
-+ scsi_command_free (cmd);
-+ return -1;
-+ }
-+
-+ *buf = g_new (unsigned char, len);
-+
-+ scsi_command_init (cmd, 0, 0x46);
-+ scsi_command_init (cmd, 1, 2);
-+ scsi_command_init (cmd, 2, feature >> 8);
-+ scsi_command_init (cmd, 3, feature);
-+ scsi_command_init (cmd, 7, len >> 8);
-+ scsi_command_init (cmd, 8, len);
-+ scsi_command_init (cmd, 9, 0);
-+ if (scsi_command_transport (cmd, READ, *buf, len)) {
-+ g_free (*buf);
-+ *buf = NULL;
-+ retval = -1;
-+ }
-+
-+ scsi_command_free (cmd);
-+
-+ return retval;
-+}
-+
-+int
-+brasero_cdrom_read_disc_information_std (BRASEROCDROM *cdrom,
-+ unsigned char *buf)
-+{
-+ ScsiCommand *cmd;
-+ int retval = 0;
-+
-+ g_return_val_if_fail (cdrom != NULL, -1);
-+ g_return_val_if_fail (buf != NULL, -1);
-+
-+ cmd = scsi_command_new_from_cdrom (cdrom);
-+
-+ /* see section 5.19 of MMC-3 from http://www.t10.org/drafts.htm#mmc3 */
-+ scsi_command_init (cmd, 0, 0x51); /* READ_DISC_INFORMATION */
-+ scsi_command_init (cmd, 8, 32);
-+ scsi_command_init (cmd, 9, 0);
-+ if (scsi_command_transport (cmd, READ, buf, 32)) {
-+ retval = -1;
-+ }
-+
-+ scsi_command_free (cmd);
-+ return retval;
-+}
-+
-+int
-+brasero_cdrom_read_track_info (BRASEROCDROM *cdrom,
-+ int track_num,
-+ unsigned char *buf,
-+ int size)
-+{
-+ ScsiCommand *cmd;
-+ int retval = 0;
-+
-+ g_return_val_if_fail (cdrom != NULL, -1);
-+ g_return_val_if_fail (buf != NULL, -1);
-+
-+ cmd = scsi_command_new_from_cdrom (cdrom);
-+
-+ scsi_command_init (cmd, 0, 0x52);
-+ scsi_command_init (cmd, 1, 1);
-+ scsi_command_init (cmd, 4, track_num >> 8);
-+ scsi_command_init (cmd, 5, track_num & 0xFF);
-+ scsi_command_init (cmd, 8, size);
-+ scsi_command_init (cmd, 9, 0);
-+ if (scsi_command_transport (cmd, READ, buf, size)) {
-+ retval = -1;
-+ }
-+
-+ scsi_command_free (cmd);
-+ return retval;
-+}
-+
-+int
-+brasero_cdrom_read_toc_formatted (BRASEROCDROM *cdrom,
-+ int track_num,
-+ unsigned char **buf)
-+{
-+ ScsiCommand *cmd;
-+ int retval = 0;
-+ int len;
-+ unsigned char header[4];
-+
-+ g_return_val_if_fail (cdrom != NULL, -1);
-+ g_return_val_if_fail (buf != NULL, -1);
-+
-+ cmd = scsi_command_new_from_cdrom (cdrom);
-+
-+ scsi_command_init (cmd, 0, 0x43);
-+ scsi_command_init (cmd, 2, 0);
-+ scsi_command_init (cmd, 6, track_num);
-+ scsi_command_init (cmd, 8, 4);
-+ scsi_command_init (cmd, 9, 0);
-+ if (scsi_command_transport (cmd, READ, header, 4)) {
-+ scsi_command_free (cmd);
-+ *buf = NULL;
-+ return -1;
-+ }
-+
-+ len = (header[0] << 8 | header[1]) + 2;
-+
-+ *buf = g_malloc0 (len);
-+
-+ scsi_command_init (cmd, 8, len);
-+ scsi_command_init (cmd, 9, 0);
-+ if (scsi_command_transport (cmd, READ, *buf, len)) {
-+ g_free (*buf);
-+ *buf = NULL;
-+ retval = -1;
-+ }
-+
-+ scsi_command_free (cmd);
-+ return retval;
-+}
-+
-+int
-+brasero_cdrom_read_toc_raw (BRASEROCDROM *cdrom,
-+ int track_num,
-+ unsigned char **buf)
-+{
-+ ScsiCommand *cmd;
-+ int retval = 0;
-+ int len;
-+ unsigned char header[4];
-+
-+ g_return_val_if_fail (cdrom != NULL, -1);
-+ g_return_val_if_fail (buf != NULL, -1);
-+
-+ cmd = scsi_command_new_from_cdrom (cdrom);
-+
-+ scsi_command_init (cmd, 0, 0x43);
-+ scsi_command_init (cmd, 2, 2);
-+ scsi_command_init (cmd, 6, track_num);
-+ scsi_command_init (cmd, 8, 4);
-+ scsi_command_init (cmd, 9, 0);
-+ if (scsi_command_transport (cmd, READ, header, 4)) {
-+ scsi_command_free (cmd);
-+ *buf = NULL;
-+ return -1;
-+ }
-+
-+ len = (header[0] << 8 | header[1]) + 2;
-+
-+ *buf = g_malloc0 (len);
-+
-+ scsi_command_init (cmd, 8, len);
-+ scsi_command_init (cmd, 9, 0);
-+ if (scsi_command_transport (cmd, READ, *buf, len)) {
-+ g_free (*buf);
-+ *buf = NULL;
-+ retval = -1;
-+ }
-+
-+ scsi_command_free (cmd);
-+ return retval;
-+}
-+
-+int
-+brasero_cdrom_read_atip (BRASEROCDROM *cdrom,
-+ unsigned char **buf)
-+{
-+ ScsiCommand *cmd;
-+ int retval = 0;
-+ int len;
-+ unsigned char header[4];
-+
-+ g_return_val_if_fail (cdrom != NULL, -1);
-+ g_return_val_if_fail (buf != NULL, -1);
-+
-+ cmd = scsi_command_new_from_cdrom (cdrom);
-+
-+ scsi_command_init (cmd, 0, 0x43);
-+ scsi_command_init (cmd, 2, 4);
-+ scsi_command_init (cmd, 6, 0);
-+ scsi_command_init (cmd, 8, 4);
-+ scsi_command_init (cmd, 9, 0);
-+ if (scsi_command_transport (cmd, READ, header, 4)) {
-+ scsi_command_free (cmd);
-+ *buf = NULL;
-+ return -1;
-+ }
-+
-+ len = (header[0] << 8 | header[1]) + 2;
-+
-+ *buf = g_malloc0 (len);
-+
-+ scsi_command_init (cmd, 8, len);
-+ scsi_command_init (cmd, 9, 0);
-+ if (scsi_command_transport (cmd, READ, *buf, len)) {
-+ g_free (*buf);
-+ *buf = NULL;
-+ retval = -1;
-+ }
-+
-+ scsi_command_free (cmd);
-+ return retval;
-+}
-+
-+int
-+brasero_cdrom_read_format_capacities (BRASEROCDROM *cdrom,
-+ unsigned char **buf)
-+{
-+ ScsiCommand *cmd;
-+ int retval = 0;
-+ int len;
-+ unsigned char header[12];
-+
-+ g_return_val_if_fail (cdrom != NULL, -1);
-+ g_return_val_if_fail (buf != NULL, -1);
-+
-+ cmd = scsi_command_new_from_cdrom (cdrom);
-+
-+ scsi_command_init (cmd, 0, 0x23);
-+ scsi_command_init (cmd, 8, 12);
-+ scsi_command_init (cmd, 9, 0);
-+ if (scsi_command_transport (cmd, READ, header, 12)) {
-+ /* READ FORMAT CAPACITIES failed */
-+ return -1;
-+ }
-+
-+ len = header [3];
-+ if (len & 7 || len < 16) {
-+ /* Length isn't sane */
-+ return -1;
-+ }
-+
-+ *buf = g_new (unsigned char, len + 4);
-+
-+ scsi_command_init (cmd, 0, 0x23);
-+ scsi_command_init (cmd, 7, (4 + len) >> 8);
-+ scsi_command_init (cmd, 8, (4 + len) & 0xFF);
-+ scsi_command_init (cmd, 9, 0);
-+ if (scsi_command_transport (cmd, READ, *buf, 4 + len)) {
-+ /* READ FORMAT CAPACITIES failed */
-+ g_free (*buf);
-+ *buf = NULL;
-+ retval = -1;
-+ }
-+
-+ return retval;
-+}
-+
-+int
-+brasero_cdrom_get_performance_wrt_spd_desc (BRASEROCDROM *cdrom,
-+ unsigned char **buf)
-+{
-+ ScsiCommand *cmd;
-+ int retval = 0;
-+ int len;
-+ int desc_num;
-+ unsigned char header[8];
-+
-+ g_return_val_if_fail (cdrom != NULL, -1);
-+ g_return_val_if_fail (buf != NULL, -1);
-+
-+ cmd = scsi_command_new_from_cdrom (cdrom);
-+
-+ scsi_command_init (cmd, 0, 0xac);
-+ scsi_command_init (cmd, 8, 0);
-+ scsi_command_init (cmd, 9, 0);
-+ scsi_command_init (cmd, 10, 3);
-+ scsi_command_init (cmd, 11, 0);
-+ if (scsi_command_transport (cmd, READ, header, 8)) {
-+ scsi_command_free (cmd);
-+ *buf = NULL;
-+ return -1;
-+ }
-+
-+ len = (header[0] << 24 | header[1] << 16 | header[2] << 8 | header[3]) + 4;
-+ if (len > 2048) {
-+ len = 2048;
-+ }
-+
-+ desc_num = (len - 8) / 12;
-+
-+ *buf = g_malloc0 (len);
-+
-+ scsi_command_init (cmd, 8, desc_num >> 8);
-+ scsi_command_init (cmd, 9, desc_num);
-+ scsi_command_init (cmd, 11, 0);
-+ if (scsi_command_transport (cmd, READ, *buf, len)) {
-+ g_free (*buf);
-+ *buf = NULL;
-+ retval = -1;
-+ }
-+
-+ scsi_command_free (cmd);
-+ return retval;
-+}
-+
-+int
-+brasero_cdrom_disc_is_appendable (BRASEROCDROM *cdrom)
-+{
-+ ScsiCommand *cmd;
-+ int retval = -1;
-+ unsigned char header[32];
-+
-+ g_return_val_if_fail (cdrom != NULL, -1);
-+
-+ cmd = scsi_command_new_from_cdrom (cdrom);
-+
-+ /* see section 5.19 of MMC-3 from http://www.t10.org/drafts.htm#mmc3 */
-+ scsi_command_init (cmd, 0, 0x51); /* READ_DISC_INFORMATION */
-+ scsi_command_init (cmd, 8, 32);
-+ scsi_command_init (cmd, 9, 0);
-+ if (scsi_command_transport (cmd, READ, header, 32)) {
-+ /* READ_DISC_INFORMATION failed */
-+ scsi_command_free (cmd);
-+ return 0;
-+ }
-+
-+ retval = ((header[2]&0x03) == 0x01);
-+
-+ scsi_command_free (cmd);
-+ return retval;
-+}
-+
-+int
-+brasero_cdrom_disc_is_rewritable (BRASEROCDROM *cdrom)
-+{
-+ ScsiCommand *cmd;
-+ int retval = -1;
-+ unsigned char header[32];
-+
-+ g_return_val_if_fail (cdrom != NULL, -1);
-+
-+ cmd = scsi_command_new_from_cdrom (cdrom);
-+
-+ /* see section 5.19 of MMC-3 from http://www.t10.org/drafts.htm#mmc3 */
-+ scsi_command_init (cmd, 0, 0x51); /* READ_DISC_INFORMATION */
-+ scsi_command_init (cmd, 8, 32);
-+ scsi_command_init (cmd, 9, 0);
-+ if (scsi_command_transport (cmd, READ, header, 32)) {
-+ /* READ_DISC_INFORMATION failed */
-+ scsi_command_free (cmd);
-+ return 0;
-+ }
-+
-+ retval = ((header[2]&0x10) != 0);
-+
-+ scsi_command_free (cmd);
-+ return retval;
-+}
diff --git a/sysutils/brasero/files/patch-src_plugins_cdrtools_burn-cdrecord.c b/sysutils/brasero/files/patch-src_plugins_cdrtools_burn-cdrecord.c
deleted file mode 100644
index 583807240735..000000000000
--- a/sysutils/brasero/files/patch-src_plugins_cdrtools_burn-cdrecord.c
+++ /dev/null
@@ -1,11 +0,0 @@
---- src/plugins/cdrtools/burn-cdrecord.c.orig 2008-01-02 14:59:18.000000000 -0500
-+++ src/plugins/cdrtools/burn-cdrecord.c 2008-01-02 14:59:27.000000000 -0500
-@@ -899,7 +899,7 @@ brasero_cdrecord_set_argv (BraseroProces
- g_ptr_array_add (argv, g_strdup ("cdrecord"));
- g_ptr_array_add (argv, g_strdup ("-v"));
-
-- brasero_job_get_device (BRASERO_JOB (cdrecord), &device);
-+ brasero_job_get_cdrecord_device (BRASERO_JOB (cdrecord), &device);
- dev_str = g_strdup_printf ("dev=%s", device);
- g_ptr_array_add (argv, dev_str);
- g_free (device);
diff --git a/sysutils/brasero/pkg-plist b/sysutils/brasero/pkg-plist
index acbe2314bd1f..5def420562e4 100644
--- a/sysutils/brasero/pkg-plist
+++ b/sysutils/brasero/pkg-plist
@@ -1,8 +1,16 @@
bin/brasero
+lib/brasero/plugins/libbrasero-burn-uri.la
+lib/brasero/plugins/libbrasero-burn-uri.so
lib/brasero/plugins/libbrasero-cdrdao.la
lib/brasero/plugins/libbrasero-cdrdao.so
lib/brasero/plugins/libbrasero-cdrecord.la
lib/brasero/plugins/libbrasero-cdrecord.so
+lib/brasero/plugins/libbrasero-checksum-file.la
+lib/brasero/plugins/libbrasero-checksum-file.so
+lib/brasero/plugins/libbrasero-checksum.la
+lib/brasero/plugins/libbrasero-checksum.so
+lib/brasero/plugins/libbrasero-dvdauthor.la
+lib/brasero/plugins/libbrasero-dvdauthor.so
lib/brasero/plugins/libbrasero-dvdcss.la
lib/brasero/plugins/libbrasero-dvdcss.so
lib/brasero/plugins/libbrasero-dvdrwformat.la
@@ -13,12 +21,10 @@ lib/brasero/plugins/libbrasero-growisofs.la
lib/brasero/plugins/libbrasero-growisofs.so
lib/brasero/plugins/libbrasero-local-track.la
lib/brasero/plugins/libbrasero-local-track.so
-lib/brasero/plugins/libbrasero-md5sum-file.la
-lib/brasero/plugins/libbrasero-md5sum-file.so
-lib/brasero/plugins/libbrasero-md5sum.la
-lib/brasero/plugins/libbrasero-md5sum.so
lib/brasero/plugins/libbrasero-mkisofs.la
lib/brasero/plugins/libbrasero-mkisofs.so
+lib/brasero/plugins/libbrasero-normalize.la
+lib/brasero/plugins/libbrasero-normalize.so
lib/brasero/plugins/libbrasero-readcd.la
lib/brasero/plugins/libbrasero-readcd.so
lib/brasero/plugins/libbrasero-readom.la
@@ -27,9 +33,17 @@ lib/brasero/plugins/libbrasero-toc2cue.la
lib/brasero/plugins/libbrasero-toc2cue.so
lib/brasero/plugins/libbrasero-transcode.la
lib/brasero/plugins/libbrasero-transcode.so
+lib/brasero/plugins/libbrasero-vcdimager.la
+lib/brasero/plugins/libbrasero-vcdimager.so
+lib/brasero/plugins/libbrasero-vob.la
+lib/brasero/plugins/libbrasero-vob.so
lib/brasero/plugins/libbrasero-wodim.la
lib/brasero/plugins/libbrasero-wodim.so
share/applications/brasero.desktop
+share/applications/brasero-copy-medium.desktop
+share/applications/brasero-open-image.desktop
+share/applications/brasero-open-playlist.desktop
+share/applications/brasero-open-project.desktop
%%DATADIR%%/icons/hicolor/16x16/actions/insert-pause.png
%%DATADIR%%/icons/hicolor/16x16/actions/iso-image-burn.png
%%DATADIR%%/icons/hicolor/16x16/actions/iso-image-new.png
@@ -38,6 +52,7 @@ share/applications/brasero.desktop
%%DATADIR%%/icons/hicolor/16x16/actions/media-optical-burn.png
%%DATADIR%%/icons/hicolor/16x16/actions/media-optical-copy.png
%%DATADIR%%/icons/hicolor/16x16/actions/media-optical-data-new.png
+%%DATADIR%%/icons/hicolor/16x16/actions/media-optical-video-new.png
%%DATADIR%%/icons/hicolor/16x16/actions/transform-crop-and-resize.png
%%DATADIR%%/icons/hicolor/16x16/status/brasero-disc-00.png
%%DATADIR%%/icons/hicolor/16x16/status/brasero-disc-05.png
@@ -68,6 +83,7 @@ share/applications/brasero.desktop
%%DATADIR%%/icons/hicolor/22x22/actions/media-optical-burn.png
%%DATADIR%%/icons/hicolor/22x22/actions/media-optical-copy.png
%%DATADIR%%/icons/hicolor/22x22/actions/media-optical-data-new.png
+%%DATADIR%%/icons/hicolor/22x22/actions/media-optical-video-new.png
%%DATADIR%%/icons/hicolor/22x22/actions/transform-crop-and-resize.png
%%DATADIR%%/icons/hicolor/22x22/status/brasero-disc-00.png
%%DATADIR%%/icons/hicolor/22x22/status/brasero-disc-05.png
@@ -98,6 +114,7 @@ share/applications/brasero.desktop
%%DATADIR%%/icons/hicolor/24x24/actions/media-optical-burn.png
%%DATADIR%%/icons/hicolor/24x24/actions/media-optical-copy.png
%%DATADIR%%/icons/hicolor/24x24/actions/media-optical-data-new.png
+%%DATADIR%%/icons/hicolor/24x24/actions/media-optical-video-new.png
%%DATADIR%%/icons/hicolor/24x24/actions/transform-crop-and-resize.png
%%DATADIR%%/icons/hicolor/24x24/status/brasero-disc-00.png
%%DATADIR%%/icons/hicolor/24x24/status/brasero-disc-05.png
@@ -128,6 +145,7 @@ share/applications/brasero.desktop
%%DATADIR%%/icons/hicolor/32x32/actions/media-optical-burn.png
%%DATADIR%%/icons/hicolor/32x32/actions/media-optical-copy.png
%%DATADIR%%/icons/hicolor/32x32/actions/media-optical-data-new.png
+%%DATADIR%%/icons/hicolor/32x32/actions/media-optical-video-new.png
%%DATADIR%%/icons/hicolor/32x32/status/brasero-disc-00.png
%%DATADIR%%/icons/hicolor/32x32/status/brasero-disc-05.png
%%DATADIR%%/icons/hicolor/32x32/status/brasero-disc-10.png
@@ -149,6 +167,7 @@ share/applications/brasero.desktop
%%DATADIR%%/icons/hicolor/32x32/status/brasero-disc-85.png
%%DATADIR%%/icons/hicolor/32x32/status/brasero-disc-90.png
%%DATADIR%%/icons/hicolor/32x32/status/brasero-disc-95.png
+%%DATADIR%%/icons/hicolor/48x48/actions/media-optical-video-new.png
%%DATADIR%%/icons/hicolor/scalable/actions/insert-pause.svg
%%DATADIR%%/icons/hicolor/scalable/actions/iso-image-burn.svg
%%DATADIR%%/icons/hicolor/scalable/actions/iso-image-new.svg
@@ -180,6 +199,25 @@ share/applications/brasero.desktop
%%DATADIR%%/icons/hicolor/scalable/status/brasero-disc-90.svg
%%DATADIR%%/icons/hicolor/scalable/status/brasero-disc-95.svg
%%DATADIR%%/logo.png
+share/gnome/help/brasero/C/brasero.xml
+share/gnome/help/brasero/C/figures/brasero_main.png
+share/gnome/help/brasero/C/legal.xml
+share/gnome/help/brasero/de/brasero.xml
+share/gnome/help/brasero/de/figures/brasero_main.png
+share/gnome/help/brasero/el/brasero.xml
+share/gnome/help/brasero/el/figures/brasero_main.png
+share/gnome/help/brasero/es/brasero.xml
+share/gnome/help/brasero/es/figures/brasero_main.png
+share/gnome/help/brasero/fr/brasero.xml
+share/gnome/help/brasero/fr/figures/brasero_main.png
+share/gnome/help/brasero/it/brasero.xml
+share/gnome/help/brasero/it/figures/brasero_main.png
+share/gnome/help/brasero/pl/brasero.xml
+share/gnome/help/brasero/pl/figures/brasero_main.png
+share/gnome/help/brasero/ru/brasero.xml
+share/gnome/help/brasero/ru/figures/brasero_main.png
+share/gnome/help/brasero/sv/brasero.xml
+share/gnome/help/brasero/sv/figures/brasero_main.png
share/icons/hicolor/16x16/apps/brasero.png
share/icons/hicolor/22x22/apps/brasero.png
share/icons/hicolor/24x24/apps/brasero.png
@@ -189,10 +227,13 @@ share/icons/hicolor/scalable/apps/brasero.svg
share/locale/ar/LC_MESSAGES/brasero.mo
share/locale/ca/LC_MESSAGES/brasero.mo
share/locale/cs/LC_MESSAGES/brasero.mo
+share/locale/da/LC_MESSAGES/brasero.mo
share/locale/de/LC_MESSAGES/brasero.mo
share/locale/dz/LC_MESSAGES/brasero.mo
+share/locale/el/LC_MESSAGES/brasero.mo
share/locale/en_GB/LC_MESSAGES/brasero.mo
share/locale/es/LC_MESSAGES/brasero.mo
+share/locale/et/LC_MESSAGES/brasero.mo
share/locale/fi/LC_MESSAGES/brasero.mo
share/locale/fr/LC_MESSAGES/brasero.mo
share/locale/gl/LC_MESSAGES/brasero.mo
@@ -203,17 +244,52 @@ share/locale/ja/LC_MESSAGES/brasero.mo
share/locale/lt/LC_MESSAGES/brasero.mo
share/locale/mk/LC_MESSAGES/brasero.mo
share/locale/nb/LC_MESSAGES/brasero.mo
+share/locale/nl/LC_MESSAGES/brasero.mo
share/locale/oc/LC_MESSAGES/brasero.mo
share/locale/pa/LC_MESSAGES/brasero.mo
share/locale/pl/LC_MESSAGES/brasero.mo
share/locale/pt/LC_MESSAGES/brasero.mo
share/locale/pt_BR/LC_MESSAGES/brasero.mo
+share/locale/ro/LC_MESSAGES/brasero.mo
share/locale/ru/LC_MESSAGES/brasero.mo
share/locale/sl/LC_MESSAGES/brasero.mo
share/locale/sr/LC_MESSAGES/brasero.mo
-share/locale/sr@Latn/LC_MESSAGES/brasero.mo
+share/locale/sr@latin/LC_MESSAGES/brasero.mo
share/locale/sv/LC_MESSAGES/brasero.mo
+share/locale/th/LC_MESSAGES/brasero.mo
+share/locale/zh_CN/LC_MESSAGES/brasero.mo
+share/locale/zh_HK/LC_MESSAGES/brasero.mo
+share/locale/zh_TW/LC_MESSAGES/brasero.mo
share/mime/packages/brasero.xml
+share/omf/brasero/brasero-C.omf
+share/omf/brasero/brasero-de.omf
+share/omf/brasero/brasero-el.omf
+share/omf/brasero/brasero-es.omf
+share/omf/brasero/brasero-fr.omf
+share/omf/brasero/brasero-it.omf
+share/omf/brasero/brasero-pl.omf
+share/omf/brasero/brasero-ru.omf
+share/omf/brasero/brasero-sv.omf
+@dirrm share/omf/brasero
+@dirrm share/gnome/help/brasero/sv/figures
+@dirrm share/gnome/help/brasero/sv
+@dirrm share/gnome/help/brasero/ru/figures
+@dirrm share/gnome/help/brasero/ru
+@dirrm share/gnome/help/brasero/pl/figures
+@dirrm share/gnome/help/brasero/pl
+@dirrm share/gnome/help/brasero/it/figures
+@dirrm share/gnome/help/brasero/it
+@dirrm share/gnome/help/brasero/fr/figures
+@dirrm share/gnome/help/brasero/fr
+@dirrm share/gnome/help/brasero/es/figures
+@dirrm share/gnome/help/brasero/es
+@dirrm share/gnome/help/brasero/el/figures
+@dirrm share/gnome/help/brasero/el
+@dirrm share/gnome/help/brasero/de/figures
+@dirrm share/gnome/help/brasero/de
+@dirrm share/gnome/help/brasero/C/figures
+@dirrm share/gnome/help/brasero/C
+@dirrm share/gnome/help/brasero
@dirrm %%DATADIR%%/icons/hicolor/16x16/status
@dirrm %%DATADIR%%/icons/hicolor/16x16/actions
@dirrm %%DATADIR%%/icons/hicolor/16x16
@@ -226,6 +302,8 @@ share/mime/packages/brasero.xml
@dirrm %%DATADIR%%/icons/hicolor/32x32/status
@dirrm %%DATADIR%%/icons/hicolor/32x32/actions
@dirrm %%DATADIR%%/icons/hicolor/32x32
+@dirrm %%DATADIR%%/icons/hicolor/48x48/actions
+@dirrm %%DATADIR%%/icons/hicolor/48x48
@dirrm %%DATADIR%%/icons/hicolor/scalable/status
@dirrm %%DATADIR%%/icons/hicolor/scalable/actions
@dirrm %%DATADIR%%/icons/hicolor/scalable
@@ -239,6 +317,12 @@ share/mime/packages/brasero.xml
@unexec %%LOCALBASE%%/bin/update-mime-database %D/share/mime
@exec %%LOCALBASE%%/bin/update-desktop-database > /dev/null || /usr/bin/true
@unexec %%LOCALBASE%%/bin/update-desktop-database > /dev/null || /usr/bin/true
+@dirrmtry share/locale/zh_HK/LC_MESSAGES
+@dirrmtry share/locale/zh_HK
+@dirrmtry share/locale/ro/LC_MESSAGES
+@dirrmtry share/locale/ro
+@dirrmtry share/locale/sr@latin/LC_MESSAGES
+@dirrmtry share/locale/sr@latin
@dirrmtry share/locale/oc/LC_MESSAGES
@dirrmtry share/locale/oc
@dirrmtry share/locale/dz/LC_MESSAGES