aboutsummaryrefslogtreecommitdiff
path: root/sysutils/k3b-kde4/files/patch-src-core-device-k3bdevice.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sysutils/k3b-kde4/files/patch-src-core-device-k3bdevice.cpp')
-rw-r--r--sysutils/k3b-kde4/files/patch-src-core-device-k3bdevice.cpp912
1 files changed, 0 insertions, 912 deletions
diff --git a/sysutils/k3b-kde4/files/patch-src-core-device-k3bdevice.cpp b/sysutils/k3b-kde4/files/patch-src-core-device-k3bdevice.cpp
deleted file mode 100644
index 449a87e89484..000000000000
--- a/sysutils/k3b-kde4/files/patch-src-core-device-k3bdevice.cpp
+++ /dev/null
@@ -1,912 +0,0 @@
---- src/core/device/k3bdevice.cpp.orig Thu Oct 30 11:53:35 2003
-+++ src/core/device/k3bdevice.cpp Sat Nov 8 12:15:01 2003
-@@ -32,7 +32,9 @@
- #include <sys/ioctl.h>
-
- #include <fstab.h>
-+#ifndef __FreeBSD__
- #include <mntent.h>
-+#endif
- #include <stdio.h>
- #include <stdlib.h>
- #include <fcntl.h>
-@@ -40,6 +42,7 @@
- #include <errno.h>
- #include <sys/stat.h>
-
-+#ifndef __FreeBSD__
- #include <linux/version.h>
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,70)
- typedef unsigned char u8;
-@@ -48,6 +51,18 @@
- #include <linux/cdrom.h>
- #define __STRICT_ANSI__
- #include <linux/major.h>
-+#else
-+#include <sys/cdio.h>
-+#include <sys/dvdio.h>
-+#include <ktempfile.h>
-+#define __BYTE_ORDER BYTE_ORDER
-+#define __BIG_ENDIAN BIG_ENDIAN
-+//#define CDROMEJECT CDIOCEJECT
-+//#define CDROMCLOSETRAY CDIOCCLOSE
-+#define CD_FRAMESIZE_RAW 2352
-+#include <cam/scsi/scsi_message.h>
-+int bsd_open_close_device(int bus, int target, int lun, bool eject);
-+#endif
-
-
-
-@@ -167,6 +182,7 @@
- {
- kdDebug() << "(K3bCdDevice) " << blockDeviceName() << ": init()" << endl;
-
-+#ifndef __FreeBSD__
- if(open() < 0)
- return false;
-
-@@ -175,10 +191,18 @@
- // we also query the mode page 2A and use the cdrom.h stuff to get as much information as possible
- //
-
-+ // On BSD the device capabilities are already set by the devicemanager. So this code may
-+ // find more capabilities -- if it works
- d->deviceType = 0;
-+#endif
- d->supportedProfiles = 0;
-
-+#ifndef __FreeBSD__
- ScsiCommand cmd( open() );
-+#else
-+ ScsiCommand cmd(m_passDevice);
-+ d->deviceType |= CDROM;
-+#endif
- unsigned char header[8];
- ::memset( header, 0, 8 );
- cmd[0] = 0x46; // GET CONFIGURATION
-@@ -580,8 +604,16 @@
- int mm_cap_len = 0;
- if( modeSense( &mm_cap_buffer, mm_cap_len, 0x2A ) ) {
- mm_cap_page_2A* mm_p = (mm_cap_page_2A*)(mm_cap_buffer+8);
-- if( mm_p->BUF ) d->burnfree = true;
-- if( mm_p->cd_rw_write ) d->deviceType |= CDRW;
-+ if( mm_p->BUF )
-+ {
-+ kdDebug() << "(K3bCdDevice) ModeSense: burnfree." << endl;
-+ d->burnfree = true;
-+ }
-+ if( mm_p->cd_rw_write )
-+ {
-+ kdDebug() << "(K3bCdDevice) ModeSense: CDRW." << endl;
-+ d->deviceType |= CDRW;
-+ }
- m_maxWriteSpeed = (int)( from2Byte(mm_p->max_write_speed) * 1024.0 / ( 2352.0 * 75.0 ) );
- m_maxReadSpeed = (int)( from2Byte(mm_p->max_read_speed) * 1024.0 / ( 2352.0 * 75.0 ) );
-
-@@ -592,6 +624,7 @@
- }
-
-
-+#ifndef __FreeBSD__
-
- //
- // This is the backup if the drive does not support the GET CONFIGURATION command
-@@ -619,6 +652,7 @@
- if (drivetype & CDC_DVD)
- d->deviceType |= DVD;
-
-+#endif
-
- if( writesCd() )
- checkWriteModes();
-@@ -642,10 +676,11 @@
- m_version = QString::fromLocal8Bit( (char*)(inq+32), 4 ).stripWhiteSpace();
- }
-
-+#ifndef __FreeBSD__
- close();
-+#endif
-
- d->interfaceType = interfaceType();
--
- return furtherInit();
- }
-
-@@ -649,6 +684,23 @@
- return furtherInit();
- }
-
-+void K3bCdDevice::CdDevice::guessProfiles()
-+{
-+ if (!d->supportedProfiles)
-+ {
-+ kdDebug() << "(K3bCdDevice): no profiles found; setting them from device type = " << d->deviceType << endl;
-+ if (d->deviceType & CDROM) d->supportedProfiles |= MEDIA_CD_ROM;
-+ if (d->deviceType & CDR) d->supportedProfiles |= MEDIA_CD_R;
-+ if (d->deviceType & CDRW) d->supportedProfiles |= MEDIA_CD_RW;
-+ if (d->deviceType & DVDR) d->supportedProfiles |= MEDIA_DVD_R_SEQ;
-+ if (d->deviceType & DVDRAM) d->supportedProfiles |= MEDIA_DVD_RAM;
-+ if (d->deviceType & DVD) d->supportedProfiles |= MEDIA_DVD_ROM;
-+ if (d->deviceType & DVDRW) d->supportedProfiles |= MEDIA_DVD_RW_OVWR | MEDIA_DVD_RW_SEQ;// ???
-+ if (d->deviceType & DVDPR) d->supportedProfiles |= MEDIA_DVD_PLUS_R;
-+ if (d->deviceType & DVDPRW) d->supportedProfiles |= MEDIA_DVD_PLUS_RW;
-+ }
-+// case 0x11: d->supportedProfiles |= MEDIA_DVD_R_SEQ;
-+}
-
- bool K3bCdDevice::CdDevice::furtherInit()
- {
-@@ -658,6 +710,7 @@
-
- K3bCdDevice::CdDevice::interface K3bCdDevice::CdDevice::interfaceType()
- {
-+#ifndef __FreeBSD__
- if (d->interfaceType == OTHER)
- {
- // if the device is already opened we do not close it
-@@ -680,6 +733,9 @@
- if( needToClose )
- close();
- }
-+#else
-+ d->interfaceType = SCSI;
-+#endif
- return d->interfaceType;
- }
-
-@@ -826,7 +882,11 @@
-
- unsigned char dvdheader[20];
- ::memset( dvdheader, 0, 20 );
-+#ifndef __FreeBSD__
- ScsiCommand cmd( open() );
-+#else
-+ ScsiCommand cmd(m_passDevice);
-+#endif
- cmd[0] = 0xad; // GPCMD_READ_DVD_STRUCTURE;
- cmd[9] = 20;
- if( cmd.transport( TR_DIR_READ, dvdheader, 20 ) ) {
-@@ -846,6 +906,7 @@
-
- int K3bCdDevice::CdDevice::isReady() const
- {
-+#ifndef __FreeBSD__
- // if the device is already opened we do not close it
- // to allow fast multible method calls in a row
- bool needToClose = !isOpen();
-@@ -905,6 +966,10 @@
- }
- else
- return 2;
-+#else
-+ ((CdDevice *)this)->refreshDeviceData();
-+ return m_driveReady;
-+#endif
- }
-
-
-@@ -941,6 +1006,7 @@
- delete [] data;
- }
- else {
-+#ifndef __FreeBSD__
- kdDebug() << "(K3bCdDevice::CdDevice) " << blockDeviceName()
- << ": READ DISC INFORMATION failed. falling back to cdrom.h" << endl;
- int drive_status = ::ioctl(d->deviceFd,CDROM_DRIVE_STATUS);
-@@ -953,6 +1019,10 @@
- kdDebug() << "(K3bCdDevice::CdDevice) " << blockDeviceName() << ": No disk in drive" << endl;
- ret = NO_DISK;
- }
-+#else
-+ ((CdDevice *)this)->refreshDeviceData();
-+ ret = m_deviceStatus;
-+#endif
- }
-
- if( needToClose )
-@@ -1013,7 +1083,11 @@
- unsigned char header[2];
- ::memset( header, 0, 2 );
-
-+#ifndef __FreeBSD__
- ScsiCommand cmd( open() );
-+#else
-+ ScsiCommand cmd(m_passDevice);
-+#endif
- cmd[0] = 0x51; // READ DISC INFORMATION
- cmd[8] = 2;
-
-@@ -1199,6 +1273,7 @@
- bool readSuccess = true;
-
- if( !readSectorsRaw( data, lba, 1 ) ) {
-+#ifndef __FreeBSD__
- kdDebug() << "(K3bCdDevice::CdDevice) " << blockDeviceName()
- << ": MMC RAW READ failed. falling back to cdrom.h." << endl;
-
-@@ -1209,8 +1284,11 @@
- if( ::ioctl(d->deviceFd,CDROMREADRAW,data) == -1 ) {
- kdDebug() << "(K3bCdDevice::CdDevice) " << blockDeviceName()
- << ": could not get track header, (lba " << lba << ") ! " << strerror(errno) << endl;
-+#endif
- readSuccess = false;
-+#ifndef __FreeBSD__
- }
-+#endif
- }
-
- if( readSuccess ) {
-@@ -1556,7 +1634,7 @@
- bool success = true;
-
- toc.clear();
--
-+#ifndef __FreeBSD__
- struct cdrom_tochdr tochdr;
- struct cdrom_tocentry tocentry;
-
-@@ -1642,6 +1720,10 @@
- else
- success = false;
-
-+#else
-+ ((CdDevice *)this)->refreshDeviceData();
-+ toc = m_toc;
-+#endif
- return success;
- }
-
-@@ -1653,7 +1735,7 @@
- bool needToClose = !isOpen();
-
- bool success = false;
--
-+#ifndef __FreeBSD__
- if( open() != -1 ) {
- //
- // we probaly need to fixup the toc for multisession mixed-mode cds
-@@ -1681,7 +1763,7 @@
- kdDebug() << "(K3bCdDevice::CdDevice) CDROMMULTISESSION failed." << endl;
- }
- }
--
-+#endif
- if( needToClose )
- close();
-
-@@ -1692,17 +1774,25 @@
- bool K3bCdDevice::CdDevice::block( bool b ) const
- {
- if( open() != -1 ) {
-+#ifndef __FreeBSD__
- ScsiCommand cmd( open() );
-+#else
-+ ScsiCommand cmd(m_passDevice);
-+#endif
- cmd[0] = 0x1E; // ALLOW MEDIA REMOVAL
- cmd[4] = b ? 0x1 : 0x0;
- int r = cmd.transport();
- if( r ) {
- kdDebug() << "(K3bCdDevice::CdDevice) MMC ALLOW MEDIA REMOVAL failed. Falling back to cdrom.h." << endl;
-+#ifndef __FreeBSD__
- r = ::ioctl(d->deviceFd,CDROM_LOCKDOOR, b ? 1 : 0 );
-+#else
-+ r = ::ioctl(d->deviceFd,b ? CDIOCPREVENT : CDIOCALLOW);
-+#endif
- }
-
- if( r )
-- kdDebug() << "(K3bCdDevice) Cannot block/unblock device " << devicename() << endl;
-+ kdDebug() << "(K3bCdDevice) Cannot block/unblock device " << devicename() << ", errno: " << errno << endl;
-
- close();
- return ( r == 0 );
-@@ -1724,22 +1814,36 @@
-
- return e;
- }
-+#ifndef __FreeBSD__
- else
- return false;
-+#else
-+ ((CdDevice *)this)->refreshDeviceData();
-+ return m_rewritableCd;
-+#endif
- }
-
- bool K3bCdDevice::CdDevice::eject() const
- {
- block(false);
-
-+#ifndef __FreeBSD__
- if( open() != -1 ) {
- ScsiCommand cmd( open() );
-+#else
-+ if( true ) {
-+ ScsiCommand cmd(m_passDevice);
-+#endif
- cmd[0] = 0x1B; // START/STOP UNIT
- cmd[4] = 0x2; // LoEj = 1, Start = 0
- int r = cmd.transport();
- if( r ) {
- kdDebug() << "(K3bCdDevice::CdDevice) MMC START/STOP UNIT failed. Falling back to cdrom.h." << endl;
-+#ifndef __FreeBSD__
- r = ::ioctl( d->deviceFd, CDROMEJECT );
-+#else
-+ r = bsd_open_close_device(m_bus, m_target, m_lun, true);
-+#endif
- }
-
- close();
-@@ -1752,14 +1856,23 @@
-
- bool K3bCdDevice::CdDevice::load() const
- {
-+#ifndef __FreeBSD__
- if( open() != -1 ) {
- ScsiCommand cmd( open() );
-+#else
-+ if( true ) {
-+ ScsiCommand cmd(m_passDevice);
-+#endif
- cmd[0] = 0x1B; // START/STOP UNIT
- cmd[4] = 0x3; // LoEj = 1, Start = 1
- int r = cmd.transport();
- if( r ) {
- kdDebug() << "(K3bCdDevice::CdDevice) MMC START/STOP UNIT failed. Falling back to cdrom.h." << endl;
-+#ifndef __FreeBSD__
- r = ::ioctl( d->deviceFd, CDROMCLOSETRAY );
-+#else
-+ r = bsd_open_close_device(m_bus, m_target, m_lun, false);
-+#endif
- }
- close();
- return (r == 0);
-@@ -1793,7 +1906,7 @@
- d->deviceFd = openDevice( QFile::encodeName(devicename()) );
- if (d->deviceFd < 0)
- {
-- kdDebug() << "(K3bCdDevice) Error: could not open device." << endl;
-+ kdDebug() << "(K3bCdDevice) Error: could not open device: " << QFile::encodeName(devicename()) << endl;
- d->deviceFd = -1;
- }
-
-@@ -1915,7 +2028,11 @@
- unsigned char profileBuf[8];
- ::memset( profileBuf, 0, 8 );
-
-+#ifndef __FreeBSD__
- ScsiCommand cmd( open() );
-+#else
-+ ScsiCommand cmd(m_passDevice);
-+#endif
- cmd[0] = 0x46; // GET CONFIGURATION
- cmd[1] = 1;
- cmd[8] = 8;
-@@ -1974,7 +2091,11 @@
- }
- inf.m_currentProfile = profile;
-
-+#ifndef __FreeBSD__
- ScsiCommand cmd( open() );
-+#else
-+ ScsiCommand cmd(m_passDevice);
-+#endif
-
- if( inf.diskState() != STATE_NO_MEDIA ) {
-
-@@ -2037,6 +2158,33 @@
-
- delete [] data;
- }
-+#ifdef __FreeBSD__
-+ else
-+ {
-+ ((CdDevice *)this)->refreshDeviceData();
-+ inf.m_rewritable = m_rewritableCd;
-+ inf.m_numSessions = m_toc.size();
-+ inf.m_capacity = m_discSize;
-+ inf.m_remaining = m_remainingSize;
-+ inf.m_diskState = STATE_UNKNOWN;
-+ inf.m_lastSessionState = STATE_UNKNOWN;
-+ if (m_deviceStatus == EMPTY)
-+ {
-+ inf.m_diskState = STATE_EMPTY;
-+ inf.m_lastSessionState = STATE_EMPTY;
-+ }
-+ else if (m_deviceStatus == APPENDABLE)
-+ {
-+ inf.m_diskState = STATE_INCOMPLETE;
-+ inf.m_lastSessionState = STATE_INCOMPLETE;
-+ }
-+ else if (m_deviceStatus == COMPLETE)
-+ {
-+ inf.m_diskState = STATE_COMPLETE;
-+ inf.m_lastSessionState = STATE_COMPLETE;
-+ }
-+ }
-+#endif
-
- //
- // Now we determine the size:
-@@ -2085,7 +2233,7 @@
- if( cmd.transport( TR_DIR_READ, trackHeader, 32 ) ) {
- kdDebug() << "(K3bCdDevice) READ_TRACK_INFORMATION failed." << endl;
- kdDebug() << "(K3bCdDevice) getting disk size via toc." << endl;
--
-+#ifndef __FreeBSD__
- // TODO: use readToc!
-
- struct cdrom_tocentry tocentry;
-@@ -2097,6 +2245,11 @@
- inf.m_capacity = tocentry.cdte_addr.lba;
- inf.m_capacity -= 1; // we need the last sector of the last track, not the first from the lead-out
- }
-+#else
-+ ((CdDevice *)this)->refreshDeviceData();
-+ inf.m_capacity = m_discSize;
-+ inf.m_capacity -= 1;
-+#endif
- }
- else {
- // not sure about this....
-@@ -2160,7 +2313,11 @@
-
- unsigned char dvdheader[20];
- ::memset( dvdheader, 0, 20 );
-+#ifndef __FreeBSD__
- ScsiCommand cmd( open() );
-+#else
-+ ScsiCommand cmd(m_passDevice);
-+#endif
- cmd[0] = 0xad; // GPCMD_READ_DVD_STRUCTURE;
- cmd[9] = 20;
- if( cmd.transport( TR_DIR_READ, dvdheader, 20 ) ) {
-@@ -2199,7 +2356,11 @@
-
- bool success = true;
-
-+#ifndef __FreeBSD__
- ScsiCommand cmd( open() );
-+#else
-+ ScsiCommand cmd(m_passDevice);
-+#endif
- cmd[0] = 0x25; // READ CAPACITY
- unsigned char buf[8];
- ::memset( buf, 0, 8 );
-@@ -2236,7 +2397,11 @@
- unsigned char header[4]; // for reading the size of the returned data
- ::memset( header, 0, 4 );
-
-+#ifndef __FreeBSD__
- ScsiCommand cmd( open() );
-+#else
-+ ScsiCommand cmd(m_passDevice);
-+#endif
- cmd[0] = 0x23; // GPCMD_READ_FORMAT_CAPACITIES;
- cmd[8] = 4;
- if( cmd.transport( TR_DIR_READ, header, 4 ) == 0 ) {
-@@ -2324,7 +2489,11 @@
- unsigned char header[8];
- ::memset( header, 0, 8 );
-
-+#ifndef __FreeBSD__
- ScsiCommand cmd( open() );
-+#else
-+ ScsiCommand cmd(m_passDevice);
-+#endif
- cmd[0] = 0x5A; // MODE SENSE
- cmd[1] = 0x08; // Disable Block Descriptors
- cmd[2] = page;
-@@ -2362,7 +2531,11 @@
-
- bool ret = false;
-
-+#ifndef __FreeBSD__
- ScsiCommand cmd( open() );
-+#else
-+ ScsiCommand cmd(m_passDevice);
-+#endif
- cmd[0] = 0x55; // MODE SELECT
- cmd[1] = ( sp ? 1 : 0 ) | ( pf ? 0x10 : 0 );
- cmd[7] = pageLen>>8;
-@@ -2486,7 +2659,11 @@
- unsigned char header[2];
- ::memset( header, 0, 2 );
-
-+#ifndef __FreeBSD__
- ScsiCommand cmd( open() );
-+#else
-+ ScsiCommand cmd(m_passDevice);
-+#endif
- cmd[0] = 0x43; // READ TOC/PMA/ATIP
- cmd[1] = ( time ? 0x2 : 0x0 );
- cmd[2] = format & 0x0F;
-@@ -2536,7 +2713,11 @@
- unsigned char header[8];
- ::memset( header, 0, 8 );
-
-+#ifndef __FreeBSD__
- ScsiCommand cmd( open() );
-+#else
-+ ScsiCommand cmd(m_passDevice);
-+#endif
- cmd[0] = 0xbd; // MECHANISM STATUS
- cmd[8] = 8; // first we read the header
- if( cmd.transport( TR_DIR_READ, header, 8 ) == 0 ) {
-@@ -2640,7 +2821,11 @@
-
- ::memset( data, 0, dataLen );
-
-+#ifndef __FreeBSD__
- ScsiCommand cmd( open() );
-+#else
-+ ScsiCommand cmd(m_passDevice);
-+#endif
- cmd[0] = 0xbe; // READ CD
- cmd[1] = (sectorType<<2 & 0x1c) | ( dap ? 0x2 : 0x0 );
- cmd[2] = startAdress>>24;
-@@ -2668,3 +2853,363 @@
-
- return ret;
- }
-+#ifdef __FreeBSD__
-+void K3bDevice::CdDevice::refreshDeviceData()
-+{
-+ // was it called within the last 3 seconds?
-+ QDateTime now = QDateTime::currentDateTime();
-+ if (m_lastRefresh.isValid() && m_lastRefresh.secsTo(now) < 3)
-+ return; // yes: use previous values
-+
-+ m_driveReady = 0;
-+ m_rewritableCd = 0;
-+ m_discSize = 0;
-+ m_remainingSize = 0;
-+ m_deviceStatus = NO_INFO;
-+ m_toc.clear();
-+
-+ KTempFile tmpfile;
-+ tmpfile.setAutoDelete(true);
-+
-+ // call cdrecord -toc to get the toc and to detect empty disks
-+ QString call = "/bin/sh -c \"cdrecord -toc " + QString("dev=%1").arg( busTargetLun() ) + " > " + tmpfile.name() + " 2>&1 \"";
-+ kdDebug() << "(K3bCdDevice) Reading Toc : " << call << endl;
-+ system(call.latin1());
-+
-+ // read tmp file line by line
-+ K3bTrack lastTrack;
-+ bool firstEntry = true;
-+ QFile tmp (tmpfile.name());
-+ if ( tmp.open( IO_ReadOnly ) )
-+ {
-+ QTextStream stream( &tmp );
-+ bool done = false;
-+ while ( !stream.eof() )
-+ {
-+ QString str = stream.readLine();
-+ kdDebug() << "(K3bCdDevice): " << str << endl;
-+ if (done)
-+ continue;
-+ // no disk inserted?
-+ if ( str.startsWith( "cdrecord: No disk" ) )
-+ {
-+ m_driveReady = NO_DISK;
-+ kdDebug() << "(K3bCdDevice) No Toc Data!" << endl;
-+ // close and delete tmp file
-+ tmp.close();
-+ done = true;
-+ continue;
-+ }
-+ // emoty disk inserted?
-+ else if (str.startsWith("cdrecord: Cannot read TOC header"))
-+ {
-+ kdDebug() << "(K3bCdDevice) cd is empty" << endl;
-+ m_driveReady = EMPTY;
-+ }
-+ // track data available?
-+ if( str.startsWith("track:") )
-+ {
-+ // cdrecord produces the following outout:
-+ // <tracknumber> lba: <startSector> (<...>) <startTime> adr: 1 control: <trackType> mode: <trackMode>
-+ // the last tracknumber will always be "lout", the leadout of the cd which we only use to determine the
-+ // length of the last track
-+
-+ // we just want the startSector, the trackType, and the trackMode
-+ int start = 6; // skip the "track:"
-+ start = str.find(":", start )+1;
-+ int end = str.find( "(", start );
-+
-+ bool ok;
-+ int startSec = str.mid( start, end-start ).toInt(&ok);
-+ if( ok )
-+ {
-+ start = str.find( "control:", start )+8; // skip the "control:"
-+ end = str.find("mode:", start );
-+ int control = str.mid( start, end-start ).toInt(&ok);
-+ if( ok )
-+ {
-+ start = end + 6;
-+ int mode = str.mid( start ).toInt(&ok);
-+ if( ok )
-+ {
-+ // all values have been determined
-+ // since we need the start of the next track to determine the length we save the values
-+ // in lastTrack and append the current lastTrack to the toc
-+
-+ if( !firstEntry )
-+ {
-+ m_toc.append( K3bTrack( lastTrack.firstSector(), startSec-1, lastTrack.type(), lastTrack.mode() ) );
-+ kdDebug() << "(K3bCDDevice) Found track: first sector: " << lastTrack.firstSector().toString()
-+ << ", last sector: " << startSec-1 << ", type: " << lastTrack.type()
-+ << ", mode: " << lastTrack.mode() << endl;
-+ if (m_deviceStatus == EMPTY)
-+ m_deviceStatus = APPENDABLE;
-+ if( lastTrack.mode() == K3bTrack::MODE1 )
-+ m_deviceStatus = COMPLETE;
-+ }
-+ // now this is the meaning of control and mode:
-+ // control (combination of the following)
-+ // 0x01 - Audio with preemp
-+ // 0x02 - Audio copy permitted
-+ // 0x04 - Data track
-+ // 0x08 - 4 channel audio
-+
-+ // mode (only for data tracks)
-+ // 1 - Mode 1
-+ // 2 - Mode 2
-+
-+ int trackType = 0;
-+ int trackMode = K3bTrack::UNKNOWN;
-+ if( control & 0x04 )
-+ {
-+ trackType = K3bTrack::DATA;
-+ if( mode == 1 )
-+ trackMode = K3bTrack::MODE1;
-+ else if( mode == 2 )
-+ trackMode = K3bTrack::MODE2;
-+ }
-+ else
-+ trackType = K3bTrack::AUDIO;
-+
-+ lastTrack = K3bTrack( startSec, startSec, trackType, trackMode );
-+ firstEntry = false;
-+ }
-+ else
-+ {
-+ kdDebug() << "(K3bCdDevice) Could not parse mode of track: " << str.mid( start ) << endl;
-+ }
-+ }
-+ else
-+ {
-+ kdDebug() << "(K3bCdDevice) Could not parse control of track: " << str.mid( start, end-start ) << endl;
-+ }
-+ }
-+ else
-+ {
-+ kdDebug() << "(K3bCdDevice) Could not parse start sector of track: " << str.mid( start, end-start) << endl;
-+ }
-+ }
-+
-+ }
-+ // close and delete tmp file
-+ tmp.close();
-+
-+ }
-+ // skip further tests if there is no disk
-+ if (m_driveReady != NO_DISK && m_driveReady != NO_INFO)
-+ {
-+
-+ KTempFile tmpfile2;
-+ tmpfile2.setAutoDelete(true);
-+
-+ // call cdrdao disk-info to get disk capacities, device status, and dsik type
-+ call = "/bin/sh -c \"cdrdao disk-info --device " + QString("%1").arg( busTargetLun() ) + " --driver " + cdrdaoDriver() + " > " + tmpfile2.name() + " 2>&1 \"";
-+ kdDebug() << "(K3bCdDevice) Reading remaining disk size : " << call << endl;
-+ system(call.latin1());
-+
-+ // read tmp file line by line
-+ QFile tmp2(tmpfile2.name());
-+ if ( tmp2.open( IO_ReadOnly ) )
-+ {
-+ QTextStream stream( &tmp2 );
-+ while ( !stream.eof() )
-+ {
-+ QString str = stream.readLine();
-+ kdDebug() << "(K3bCdDevice): " << str << endl;
-+
-+ // remaining capacity available?
-+ if ( str.contains( "Remaining Capacity :" ) )
-+ {
-+ // cdrdao produces the following outout:
-+ // <remaining time> ( <remaining blocks> blocks, <remaining size> MB)
-+
-+ int start = str.find("(" )+1;
-+ int end = str.find( " ", start );
-+
-+ bool ok;
-+ int remaining = str.mid( start, end-start ).toInt(&ok);
-+ if( ok )
-+ {
-+ m_remainingSize = remaining-1;
-+ }
-+ else
-+ kdDebug() << "(K3bCdDevice) Could not parse remaining time: " << str.mid( start, end-start) << endl;
-+ }
-+
-+ // total capacity available?
-+ else if ( str.contains( "Total Capacity :" ) )
-+ {
-+ // cdrdao produces the following outout:
-+ // <time> ( <blocks> blocks, <size> MB)
-+
-+ int start = str.find("(" )+1;
-+ int end = str.find( " ", start );
-+
-+ bool ok;
-+ int total = str.mid( start, end-start ).toInt(&ok);
-+ if( ok )
-+ {
-+ m_discSize = total-1;
-+ }
-+ else
-+ kdDebug() << "(K3bCdDevice) Could not parse total time: " << str.mid( start, end-start) << endl;
-+ }
-+
-+ // is it an empty CD?
-+ else if (str.startsWith("CD-R empty : yes"))
-+ {
-+ m_deviceStatus = EMPTY;
-+ kdDebug() << "(K3bCdDevice) device status: empty" << endl;
-+ }
-+
-+ // is the last session closed?
-+ else if (str.startsWith("Appendable : no"))
-+ {
-+ m_deviceStatus = COMPLETE;
-+ kdDebug() << "(K3bCdDevice) device status: complete" << endl;
-+ }
-+
-+ // is the last session open?
-+ else if (str.startsWith("Appendable : yes"))
-+ {
-+ m_deviceStatus = APPENDABLE;
-+ kdDebug() << "(K3bCdDevice) device status: appendable" << endl;
-+ }
-+
-+ // is it a cd-rw?
-+ else if (str.startsWith("CD-RW : yes"))
-+ {
-+ kdDebug() << "(K3bCdDevice) cd is erasable" << endl;
-+ m_rewritableCd = 1;
-+ }
-+
-+ }
-+ // close and delete tmp2 file
-+ tmp2.close();
-+ }
-+
-+ if (m_discSize.toString() == "00:00:00") // cdrdao failed somehow
-+ {
-+
-+ KTempFile tmpfile3;
-+ tmpfile3.setAutoDelete(true);
-+
-+ //create call
-+ QString call = "/bin/sh -c \"cdrecord -atip " + QString("dev=%1").arg( busTargetLun() ) + " > " + tmpfile3.name() + " 2>&1 \"";
-+ kdDebug() << "(K3bCdDevice) Reading disk size : " << call << endl;
-+ system(call.latin1());
-+
-+ // read tmp file line by line
-+ K3bTrack lastTrack;
-+ QFile tmp3(tmpfile3.name());
-+ if ( tmp3.open( IO_ReadOnly ) )
-+ {
-+ QTextStream stream( &tmp3 );
-+ while ( !stream.eof() )
-+ {
-+ QString str = stream.readLine();
-+ if (str.startsWith(" Is erasable"))
-+ {
-+ m_rewritableCd = 1;
-+ }
-+ else if( str.startsWith(" ATIP start of lead out:") )
-+ {
-+ // cdrecord produces the following outout:
-+ // <tracknumber> lba: <startSector> (<...>) <startTime> adr: 1 control: <trackType> mode: <trackMode>
-+ // the last tracknumber will always be "lout", the leadout of the cd which we only use to determine the
-+ // length of the last track
-+
-+ // we just want the startSector, the trackType, and the trackMode
-+ int start = 6; // skip the "track:"
-+ start = str.find(":", start )+1;
-+ int end = str.find( "(", start )-1;
-+
-+ bool ok;
-+ int leadOut = str.mid( start, end-start ).toInt(&ok);
-+ if( ok )
-+ m_discSize = leadOut;
-+ else
-+ kdDebug() << "(K3bCdDevice) Could not parse lead out: " << str.mid( start, end-start) << endl;
-+ }
-+
-+ }
-+ // close and delete tmp3 file
-+ tmp3.close();
-+ }
-+ }
-+
-+ }
-+
-+ // print out cd data
-+ kdDebug() << "(K3bCdDevice) disk size: " << m_discSize.toString() << endl;
-+ kdDebug() << "(K3bCdDevice) remaining size: " << m_remainingSize.toString() << endl;
-+ kdDebug() << "(K3bCdDevice) total size: " << m_discSize.toString() << endl;
-+ kdDebug() << "(K3bCdDevice) drive ready: " << m_driveReady << endl;
-+
-+ if (m_deviceStatus == EMPTY)
-+ kdDebug() << "(K3bCdDevice) device status: empty" << endl;
-+ else if (m_deviceStatus == APPENDABLE)
-+ kdDebug() << "(K3bCdDevice) device status: appendable" << endl;
-+ else if (m_deviceStatus == COMPLETE)
-+ kdDebug() << "(K3bCdDevice) device status: complete" << endl;
-+ else if (m_deviceStatus == NO_DISK)
-+ kdDebug() << "(K3bCdDevice) device status: no disk" << endl;
-+ else if (m_deviceStatus == NO_INFO)
-+ kdDebug() << "(K3bCdDevice) device status: no info" << endl;
-+ if (m_rewritableCd)
-+ kdDebug() << "(K3bCdDevice) cd is erasable" << endl;
-+ else
-+ kdDebug() << "(K3bCdDevice) cd is not erasable" << endl;
-+
-+ // reset timer
-+ m_lastRefresh = QDateTime::currentDateTime();
-+}
-+
-+void K3bDevice::CdDevice::addDeviceType(DeviceType type)
-+{
-+ d->deviceType |= type;
-+}
-+
-+int bsd_open_close_device(int bus, int target, int lun, bool eject)
-+{
-+ union ccb *ccb;
-+ int error = 0;
-+ struct cam_device *cam_dev = cam_open_btl(bus, target, lun, O_RDWR, NULL);
-+ ccb = cam_getccb(cam_dev);
-+ bool startstop = false;
-+ scsi_start_stop(&ccb->csio, 1, NULL, startstop ? MSG_SIMPLE_Q_TAG :MSG_ORDERED_Q_TAG, startstop,
-+ eject, 0, SSD_FULL_SIZE, 120000);
-+ ccb->ccb_h.flags |= CAM_DEV_QFRZDIS;
-+ if (cam_send_ccb(cam_dev, ccb) < 0) {
-+ perror("error sending start unit");
-+
-+ cam_freeccb(ccb);
-+ return(1);
-+ }
-+
-+ if ((ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP)
-+ if (startstop)
-+ {
-+ kdDebug() << "(K3bCdDevice) bsd_open_close_device: Unit started successfully" << endl;
-+ if (eject)
-+ kdDebug() << "(K3bCdDevice) bsd_open_close_device: Media loaded" << endl;
-+ }
-+ else
-+ {
-+ kdDebug() << "(K3bCdDevice) bsd_open_close_device: Unit stopped successfully" << endl;
-+ if (eject)
-+ kdDebug() << "(K3bCdDevice) bsd_open_close_device: Media ejected" << endl;
-+ }
-+ else
-+ {
-+ error = 1;
-+ if (startstop)
-+ kdDebug() << "(K3bCdDevice) bsd_open_close_device: Error received from start unit command" << endl;
-+ else
-+ kdDebug() << "(K3bCdDevice) bsd_open_close_device: Error received from stop unit command" << endl;
-+ }
-+ cam_freeccb(ccb);
-+ return error;
-+}
-+
-+#endif