summaryrefslogtreecommitdiffstats
path: root/libk3b/projects/mixedcd/k3bmixeddoc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libk3b/projects/mixedcd/k3bmixeddoc.cpp')
-rw-r--r--libk3b/projects/mixedcd/k3bmixeddoc.cpp249
1 files changed, 249 insertions, 0 deletions
diff --git a/libk3b/projects/mixedcd/k3bmixeddoc.cpp b/libk3b/projects/mixedcd/k3bmixeddoc.cpp
new file mode 100644
index 0000000..a2c76b0
--- /dev/null
+++ b/libk3b/projects/mixedcd/k3bmixeddoc.cpp
@@ -0,0 +1,249 @@
+/*
+ *
+ * $Id: k3bmixeddoc.cpp 619556 2007-01-03 17:38:12Z trueg $
+ * Copyright (C) 2003 Sebastian Trueg <trueg@k3b.org>
+ *
+ * This file is part of the K3b project.
+ * Copyright (C) 1998-2007 Sebastian Trueg <trueg@k3b.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.
+ * See the file "COPYING" for the exact licensing terms.
+ */
+
+#include "k3bmixeddoc.h"
+#include "k3bmixedjob.h"
+
+#include <k3bdatadoc.h>
+#include <k3baudiodoc.h>
+#include <k3bglobals.h>
+#include <k3bmsf.h>
+
+#include <qfileinfo.h>
+#include <qdom.h>
+
+#include <klocale.h>
+#include <kconfig.h>
+#include <kapplication.h>
+#include <kmessagebox.h>
+
+
+
+K3bMixedDoc::K3bMixedDoc( QObject* parent )
+ : K3bDoc( parent )
+{
+ m_dataDoc = new K3bDataDoc( this );
+ m_audioDoc = new K3bAudioDoc( this );
+
+ connect( m_dataDoc, SIGNAL(changed()),
+ this, SIGNAL(changed()) );
+ connect( m_audioDoc, SIGNAL(changed()),
+ this, SIGNAL(changed()) );
+}
+
+
+K3bMixedDoc::~K3bMixedDoc()
+{
+}
+
+
+bool K3bMixedDoc::newDocument()
+{
+ m_dataDoc->newDocument();
+ m_audioDoc->newDocument();
+
+ return K3bDoc::newDocument();
+}
+
+
+QString K3bMixedDoc::name() const
+{
+ return m_dataDoc->name();
+}
+
+
+void K3bMixedDoc::setURL( const KURL& url )
+{
+ K3bDoc::setURL( url );
+ m_audioDoc->setURL( url );
+ m_dataDoc->setURL( url );
+}
+
+
+void K3bMixedDoc::setModified( bool m )
+{
+ m_audioDoc->setModified( m );
+ m_dataDoc->setModified( m );
+}
+
+
+bool K3bMixedDoc::isModified() const
+{
+ return ( m_audioDoc->isModified() || m_dataDoc->isModified() );
+}
+
+
+KIO::filesize_t K3bMixedDoc::size() const
+{
+ return m_dataDoc->size() + m_audioDoc->size();
+}
+
+K3b::Msf K3bMixedDoc::length() const
+{
+ return m_dataDoc->length() + m_audioDoc->length();
+}
+
+
+int K3bMixedDoc::numOfTracks() const
+{
+ return m_audioDoc->numOfTracks() + 1;
+}
+
+
+K3bBurnJob* K3bMixedDoc::newBurnJob( K3bJobHandler* hdl, QObject* parent )
+{
+ return new K3bMixedJob( this, hdl, parent );
+}
+
+
+void K3bMixedDoc::addUrls( const KURL::List& urls )
+{
+ dataDoc()->addUrls( urls );
+}
+
+
+bool K3bMixedDoc::loadDocumentData( QDomElement* rootElem )
+{
+ QDomNodeList nodes = rootElem->childNodes();
+
+ if( nodes.length() < 4 )
+ return false;
+
+ if( nodes.item(0).nodeName() != "general" )
+ return false;
+ if( !readGeneralDocumentData( nodes.item(0).toElement() ) )
+ return false;
+
+ if( nodes.item(1).nodeName() != "audio" )
+ return false;
+ QDomElement audioElem = nodes.item(1).toElement();
+ if( !m_audioDoc->loadDocumentData( &audioElem ) )
+ return false;
+
+ if( nodes.item(2).nodeName() != "data" )
+ return false;
+ QDomElement dataElem = nodes.item(2).toElement();
+ if( !m_dataDoc->loadDocumentData( &dataElem ) )
+ return false;
+
+ if( nodes.item(3).nodeName() != "mixed" )
+ return false;
+
+ QDomNodeList optionList = nodes.item(3).childNodes();
+ for( uint i = 0; i < optionList.count(); i++ ) {
+
+ QDomElement e = optionList.item(i).toElement();
+ if( e.isNull() )
+ return false;
+
+ if( e.nodeName() == "remove_buffer_files" )
+ setRemoveImages( e.toElement().text() == "yes" );
+ else if( e.nodeName() == "image_path" )
+ setTempDir( e.toElement().text() );
+ else if( e.nodeName() == "mixed_type" ) {
+ QString mt = e.toElement().text();
+ if( mt == "last_track" )
+ setMixedType( DATA_LAST_TRACK );
+ else if( mt == "second_session" )
+ setMixedType( DATA_SECOND_SESSION );
+ else
+ setMixedType( DATA_FIRST_TRACK );
+ }
+ }
+
+ return true;
+}
+
+
+bool K3bMixedDoc::saveDocumentData( QDomElement* docElem )
+{
+ QDomDocument doc = docElem->ownerDocument();
+ saveGeneralDocumentData( docElem );
+
+ QDomElement audioElem = doc.createElement( "audio" );
+ m_audioDoc->saveDocumentData( &audioElem );
+ docElem->appendChild( audioElem );
+
+ QDomElement dataElem = doc.createElement( "data" );
+ m_dataDoc->saveDocumentData( &dataElem );
+ docElem->appendChild( dataElem );
+
+ QDomElement mixedElem = doc.createElement( "mixed" );
+ docElem->appendChild( mixedElem );
+
+ QDomElement bufferFilesElem = doc.createElement( "remove_buffer_files" );
+ bufferFilesElem.appendChild( doc.createTextNode( removeImages() ? "yes" : "no" ) );
+ mixedElem.appendChild( bufferFilesElem );
+
+ QDomElement imagePathElem = doc.createElement( "image_path" );
+ imagePathElem.appendChild( doc.createTextNode( tempDir() ) );
+ mixedElem.appendChild( imagePathElem );
+
+ QDomElement mixedTypeElem = doc.createElement( "mixed_type" );
+ switch( mixedType() ) {
+ case DATA_FIRST_TRACK:
+ mixedTypeElem.appendChild( doc.createTextNode( "first_track" ) );
+ break;
+ case DATA_LAST_TRACK:
+ mixedTypeElem.appendChild( doc.createTextNode( "last_track" ) );
+ break;
+ case DATA_SECOND_SESSION:
+ mixedTypeElem.appendChild( doc.createTextNode( "second_session" ) );
+ break;
+ }
+ mixedElem.appendChild( mixedTypeElem );
+
+ setModified( false );
+
+ return true;
+}
+
+
+K3bDevice::Toc K3bMixedDoc::toToc( int dataMode, const K3b::Msf& dataTrackLength ) const
+{
+ // !inaccurate datatrack size!
+ K3bDevice::Track dataTrack( 0, dataTrackLength > 0 ? dataTrackLength-1 : m_dataDoc->length()-1,
+ K3bDevice::Track::DATA, dataMode );
+ K3bDevice::Toc toc = audioDoc()->toToc();
+ if( mixedType() == DATA_FIRST_TRACK ) {
+ // fix the audio tracks' sectors
+ for( K3bDevice::Toc::iterator it = toc.begin(); it != toc.end(); ++it ) {
+ (*it).setLastSector( (*it).lastSector() + dataTrack.length() );
+ (*it).setFirstSector( (*it).firstSector() + dataTrack.length() );
+ }
+ toc.insert( toc.begin(), dataTrack );
+ }
+ else {
+ // fix the datatrack's sectors
+ dataTrack.setLastSector( dataTrack.lastSector() + toc.back().lastSector()+1 );
+ dataTrack.setFirstSector( toc.back().lastSector()+1 );
+ toc.append( dataTrack );
+
+ if( mixedType() == DATA_SECOND_SESSION ) {
+ // fix the session numbers
+ for( K3bDevice::Toc::iterator it = toc.begin(); it != toc.end(); ++it ) {
+ if( (*it).type() == K3bDevice::Track::DATA )
+ (*it).setSession( 2 );
+ else
+ (*it).setSession( 1 );
+ }
+ }
+ }
+
+ return toc;
+}
+
+#include "k3bmixeddoc.moc"
+