[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [k3b/multisession] libk3b/projects: Fix multisession implementation as Thomas suggested
From:       Leslie Zhai <xiangzhai83 () gmail ! com>
Date:       2016-09-23 2:40:27
Message-ID: E1bnGPb-00020L-Fn () code ! kde ! org
[Download RAW message or body]

Git commit 076340502f14a5ecd928551500392e5f38dd2c41 by Leslie Zhai.
Committed on 23/09/2016 at 02:35.
Pushed by lesliezhai into branch 'multisession'.

Fix multisession implementation as Thomas suggested

Summary:
- Use device driver's path instead of stdin
- Stay module DataMultiSessionParameterJob so CdrskinIsoImager can use
that
- Throw error info message to user

CCBUG: 367639

M  +1    -0    libk3b/projects/datacd/k3bdatajob.cpp
M  +30   -0    libk3b/projects/datacd/k3bdatamultisessionparameterjob.cpp
M  +0    -41   libk3b/projects/datacd/k3bisoimager.cpp
M  +8    -2    libk3b/projects/k3bgrowisofswriter.cpp

http://commits.kde.org/k3b/076340502f14a5ecd928551500392e5f38dd2c41

diff --git a/libk3b/projects/datacd/k3bdatajob.cpp \
b/libk3b/projects/datacd/k3bdatajob.cpp index b3b4ebd..d06407c 100644
--- a/libk3b/projects/datacd/k3bdatajob.cpp
+++ b/libk3b/projects/datacd/k3bdatajob.cpp
@@ -176,6 +176,7 @@ void K3b::DataJob::prepareWriting()
     if( !d->doc->onlyCreateImages() &&
         ( d->multiSessionParameterJob->usedMultiSessionMode() == \
                K3b::DataDoc::CONTINUE ||
           d->multiSessionParameterJob->usedMultiSessionMode() == \
K3b::DataDoc::FINISH ) ) { +        // TODO: KDEBUG-367639
         unsigned int nextSessionStart = \
                d->multiSessionParameterJob->nextSessionStart();
         // for some reason cdrdao needs 150 additional sectors in the ms info
         if( writingApp() == K3b::WritingAppCdrdao ) {
diff --git a/libk3b/projects/datacd/k3bdatamultisessionparameterjob.cpp \
b/libk3b/projects/datacd/k3bdatamultisessionparameterjob.cpp index 45c4529..000b528 \
                100644
--- a/libk3b/projects/datacd/k3bdatamultisessionparameterjob.cpp
+++ b/libk3b/projects/datacd/k3bdatamultisessionparameterjob.cpp
@@ -280,6 +280,36 @@ bool \
K3b::DataMultiSessionParameterJob::setupMultiSessionParameters()  }
 
     d->previousSessionStart = lastSessionStart;
+    // TODO: KDEBUG-367639
+    if (nextSessionStart == 0) {
+        int imgfd = -1;
+        // Validate file descriptor
+        imgfd = open(d->doc->burner(), O_RDONLY);
+        if (imgfd != -1) {
+            char buf[6] = { '\0' };
+            if (lseek(imgfd, 32 * 1024, SEEK_SET) != -1) {
+                if (read(imgfd, buf, sizeof(buf)) == sizeof(buf)) {
+                    // Check for the ISO 9660 magic number
+                    if (buf[0] == 0x01 && buf[1] == 'C' && buf[2] == 'D' &&
+                        buf[3] == '0'  && buf[4] == '0' && buf[5] == '1') {
+                        if (lseek(imgfd, 32 * 1024 + 80, SEEK_SET) != -1) {
+                            uint8_t buf[4] = { '\0' };
+                            if (read(imgfd, buf, sizeof(buf)) == sizeof(buf)) {
+                                // Interpret the read bytes as little-endian number
+                                nextSessionStart = buf[0] | (buf[1] << 8) | (buf[2] \
<< 16) | (buf[3] << 24); +                                // Round up to full \
multipes of 16 +                                nextSessionStart += 15;
+                                nextSessionStart /= 16;
+                                nextSessionStart *= 16;
+                            }
+                        }
+                    }
+                }
+            }
+            close(imgfd);
+            imgfd = -1;
+        }
+    }
     d->nextSessionStart = nextSessionStart;
 
     return true;
diff --git a/libk3b/projects/datacd/k3bisoimager.cpp \
b/libk3b/projects/datacd/k3bisoimager.cpp index 74c956b..28fcae5 100644
--- a/libk3b/projects/datacd/k3bisoimager.cpp
+++ b/libk3b/projects/datacd/k3bisoimager.cpp
@@ -473,46 +473,6 @@ void K3b::IsoImager::setMultiSessionInfo( const QString& info, \
K3b::Device::Devi  {
     m_multiSessionInfo = info;
     m_device = dev;
-    if (m_multiSessionInfo.isEmpty())
-        return;
-    QStringList ms = m_multiSessionInfo.split(',');
-    if (ms.size() != 2)
-        return;
-    if (ms[0] != "0" && ms[1] != "0")
-        return;
-    int imgfd = -1;
-    char* in_image = "/dev/fd/0";
-    // Validate file descriptor
-    if (sscanf(in_image, "/dev/fd/%u", &imgfd) == 1)
-        imgfd = dup(imgfd);
-    else
-        imgfd = open(in_image, O_RDONLY);
-    if (imgfd == -1)
-        return;
-    char buf[6] = { '\0' };
-    if (lseek(imgfd, 32 * 1024, SEEK_SET) != -1) {
-        if (read(imgfd, buf, sizeof(buf)) == sizeof(buf)) {
-            // Check for the ISO 9660 magic number
-            if (buf[0] == 0x01 && buf[1] == 'C' && buf[2] == 'D' &&
-                buf[3] == '0'  && buf[4] == '0' && buf[5] == '1') {
-                if (lseek(imgfd, 32 * 1024 + 80, SEEK_SET) != -1) {
-                    uint32_t c2;
-                    uint8_t buf[4] = { '\0' };
-                    if (read(imgfd, buf, sizeof(buf)) == sizeof(buf)) {
-                        // Interpret the read bytes as little-endian number
-                        c2 = buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << \
                24);
-                        // Round up to full multipes of 16
-                        c2 += 15;
-                        c2 /= 16;
-                        c2 *= 16;
-                        m_multiSessionInfo = ms[0] + "," + QString::number(c2);
-                    }
-                }
-            }
-        }
-    }
-    close(imgfd);
-    imgfd = -1;
 }
 
 
@@ -541,7 +501,6 @@ static void truncateTheHardWay( QString& s, int max )
 
 bool K3b::IsoImager::addMkisofsParameters( bool printSize )
 {
-    // TODO: KDEBUG-367639
     // add multisession info
     if( !m_multiSessionInfo.isEmpty() ) {
         *m_process << "-cdrecord-params" << m_multiSessionInfo;
diff --git a/libk3b/projects/k3bgrowisofswriter.cpp \
b/libk3b/projects/k3bgrowisofswriter.cpp index d3d4d85..2c685ac 100644
--- a/libk3b/projects/k3bgrowisofswriter.cpp
+++ b/libk3b/projects/k3bgrowisofswriter.cpp
@@ -197,8 +197,14 @@ bool K3b::GrowisofsWriter::prepareProcess()
     else
         s += d->image;
 
-    if (d->multiSession && !d->multiSessionInfo.isEmpty())
-        d->process << "-C" << d->multiSessionInfo;
+    if (d->multiSession && !d->multiSessionInfo.isEmpty()) {
+        QStringList ms = d->multiSessionInfo.split(',');
+        if (ms.size() == 2 && ms[1] != 0) {
+            d->process << "-C" << d->multiSessionInfo;
+        } else {
+            emit infoMessage(i18n("Medium is not of multi-session type and does not \
contain ISO 9660. Cannot emulate multi-session on it."), MessageError); +        }
+    }
 
     if( d->multiSession )
         d->process << "-M";


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic