File indexing completed on 2024-05-19 04:52:15

0001 /*
0002     SPDX-FileCopyrightText: 1998-2007 Sebastian Trueg <trueg@k3b.org>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 #include "k3bmixeddoc.h"
0007 #include "k3bmixedjob.h"
0008 #include "k3bdatadoc.h"
0009 #include "k3baudiodoc.h"
0010 #include "k3bglobals.h"
0011 #include "k3bmsf.h"
0012 #include "k3b_i18n.h"
0013 
0014 #include <KConfig>
0015 #include <KMessageBox>
0016 
0017 #include <QFileInfo>
0018 #include <QDomElement>
0019 
0020 
0021 
0022 K3b::MixedDoc::MixedDoc( QObject* parent )
0023     : K3b::Doc( parent )
0024 {
0025     m_dataDoc = new K3b::DataDoc( this );
0026     m_audioDoc = new K3b::AudioDoc( this );
0027 
0028     connect( m_dataDoc, SIGNAL(changed()),
0029              this, SIGNAL(changed()) );
0030     connect( m_audioDoc, SIGNAL(changed()),
0031              this, SIGNAL(changed()) );
0032 }
0033 
0034 
0035 K3b::MixedDoc::~MixedDoc()
0036 {
0037 }
0038 
0039 
0040 bool K3b::MixedDoc::newDocument()
0041 {
0042     m_dataDoc->newDocument();
0043     m_audioDoc->newDocument();
0044 
0045     return K3b::Doc::newDocument();
0046 }
0047 
0048 
0049 void K3b::MixedDoc::clear()
0050 {
0051     m_dataDoc->clear();
0052     m_audioDoc->clear();
0053 }
0054 
0055 
0056 QString K3b::MixedDoc::name() const
0057 {
0058     return m_dataDoc->name();
0059 }
0060 
0061 
0062 void K3b::MixedDoc::setURL( const QUrl& url )
0063 {
0064     K3b::Doc::setURL( url );
0065     m_audioDoc->setURL( url );
0066     m_dataDoc->setURL( url );
0067 }
0068 
0069 
0070 void K3b::MixedDoc::setModified( bool m )
0071 {
0072     m_audioDoc->setModified( m );
0073     m_dataDoc->setModified( m );
0074 }
0075 
0076 
0077 bool K3b::MixedDoc::isModified() const
0078 {
0079     return ( m_audioDoc->isModified() || m_dataDoc->isModified() );
0080 }
0081 
0082 
0083 KIO::filesize_t K3b::MixedDoc::size() const
0084 {
0085     return m_dataDoc->size() + m_audioDoc->size();
0086 }
0087 
0088 K3b::Msf K3b::MixedDoc::length() const
0089 {
0090     return m_dataDoc->length() + m_audioDoc->length();
0091 }
0092 
0093 
0094 int K3b::MixedDoc::numOfTracks() const
0095 {
0096     return m_audioDoc->numOfTracks() + 1;
0097 }
0098 
0099 
0100 K3b::BurnJob* K3b::MixedDoc::newBurnJob( K3b::JobHandler* hdl, QObject* parent )
0101 {
0102     return new K3b::MixedJob( this, hdl, parent  );
0103 }
0104 
0105 
0106 void K3b::MixedDoc::addUrls( const QList<QUrl>& urls )
0107 {
0108     dataDoc()->addUrls( urls );
0109 }
0110 
0111 
0112 bool K3b::MixedDoc::loadDocumentData( QDomElement* rootElem )
0113 {
0114     QDomNodeList nodes = rootElem->childNodes();
0115 
0116     if( nodes.length() < 4 )
0117         return false;
0118 
0119     if( nodes.item(0).nodeName() != "general" )
0120         return false;
0121     if( !readGeneralDocumentData( nodes.item(0).toElement() ) )
0122         return false;
0123 
0124     if( nodes.item(1).nodeName() != "audio" )
0125         return false;
0126     QDomElement audioElem = nodes.item(1).toElement();
0127     if( !m_audioDoc->loadDocumentData( &audioElem ) )
0128         return false;
0129 
0130     if( nodes.item(2).nodeName() != "data" )
0131         return false;
0132     QDomElement dataElem = nodes.item(2).toElement();
0133     if( !m_dataDoc->loadDocumentData( &dataElem ) )
0134         return false;
0135 
0136     if( nodes.item(3).nodeName() != "mixed" )
0137         return false;
0138 
0139     QDomNodeList optionList = nodes.item(3).childNodes();
0140     for( int i = 0; i < optionList.count(); i++ ) {
0141 
0142         QDomElement e = optionList.item(i).toElement();
0143         if( e.isNull() )
0144             return false;
0145 
0146         if( e.nodeName() == "remove_buffer_files" )
0147             setRemoveImages( e.toElement().text() == "yes" );
0148         else if( e.nodeName() == "image_path" )
0149             setTempDir( e.toElement().text() );
0150         else if( e.nodeName() == "mixed_type" ) {
0151             QString mt = e.toElement().text();
0152             if( mt == "last_track" )
0153                 setMixedType( DATA_LAST_TRACK );
0154             else if( mt == "second_session" )
0155                 setMixedType( DATA_SECOND_SESSION );
0156             else
0157                 setMixedType( DATA_FIRST_TRACK );
0158         }
0159     }
0160 
0161     return true;
0162 }
0163 
0164 
0165 bool K3b::MixedDoc::saveDocumentData( QDomElement* docElem )
0166 {
0167     QDomDocument doc = docElem->ownerDocument();
0168     saveGeneralDocumentData( docElem );
0169 
0170     QDomElement audioElem = doc.createElement( "audio" );
0171     m_audioDoc->saveDocumentData( &audioElem );
0172     docElem->appendChild( audioElem );
0173 
0174     QDomElement dataElem = doc.createElement( "data" );
0175     m_dataDoc->saveDocumentData( &dataElem );
0176     docElem->appendChild( dataElem );
0177 
0178     QDomElement mixedElem = doc.createElement( "mixed" );
0179     docElem->appendChild( mixedElem );
0180 
0181     QDomElement bufferFilesElem = doc.createElement( "remove_buffer_files" );
0182     bufferFilesElem.appendChild( doc.createTextNode( removeImages() ? "yes" : "no" ) );
0183     mixedElem.appendChild( bufferFilesElem );
0184 
0185     QDomElement imagePathElem = doc.createElement( "image_path" );
0186     imagePathElem.appendChild( doc.createTextNode( tempDir() ) );
0187     mixedElem.appendChild( imagePathElem );
0188 
0189     QDomElement mixedTypeElem = doc.createElement( "mixed_type" );
0190     switch( mixedType() ) {
0191     case DATA_FIRST_TRACK:
0192         mixedTypeElem.appendChild( doc.createTextNode( "first_track" ) );
0193         break;
0194     case DATA_LAST_TRACK:
0195         mixedTypeElem.appendChild( doc.createTextNode( "last_track" ) );
0196         break;
0197     case DATA_SECOND_SESSION:
0198         mixedTypeElem.appendChild( doc.createTextNode( "second_session" ) );
0199         break;
0200     }
0201     mixedElem.appendChild( mixedTypeElem );
0202 
0203     setModified( false );
0204 
0205     return true;
0206 }
0207 
0208 
0209 K3b::Device::Toc K3b::MixedDoc::toToc( K3b::Device::Track::DataMode dataMode, const K3b::Msf& dataTrackLength ) const
0210 {
0211     // !inaccurate datatrack size!
0212     K3b::Device::Track dataTrack( 0, dataTrackLength > 0 ? dataTrackLength-1 : m_dataDoc->length()-1,
0213                                   K3b::Device::Track::TYPE_DATA, dataMode );
0214     K3b::Device::Toc toc = audioDoc()->toToc();
0215     if( mixedType() == DATA_FIRST_TRACK ) {
0216         // fix the audio tracks' sectors
0217         for( K3b::Device::Toc::iterator it = toc.begin(); it != toc.end(); ++it ) {
0218             (*it).setLastSector( (*it).lastSector() + dataTrack.length() );
0219             (*it).setFirstSector( (*it).firstSector() + dataTrack.length() );
0220         }
0221         toc.insert( toc.begin(), dataTrack );
0222     }
0223     else {
0224         // fix the datatrack's sectors
0225         dataTrack.setLastSector( dataTrack.lastSector() + toc.back().lastSector()+1 );
0226         dataTrack.setFirstSector( toc.back().lastSector()+1 );
0227         toc.append( dataTrack );
0228 
0229         if( mixedType() == DATA_SECOND_SESSION ) {
0230             // fix the session numbers
0231             for( K3b::Device::Toc::iterator it = toc.begin(); it != toc.end(); ++it ) {
0232                 if( (*it).type() == K3b::Device::Track::TYPE_DATA )
0233                     (*it).setSession( 2 );
0234                 else
0235                     (*it).setSession( 1 );
0236             }
0237         }
0238     }
0239 
0240     return toc;
0241 }
0242 
0243 
0244 K3b::Device::MediaTypes K3b::MixedDoc::supportedMediaTypes() const
0245 {
0246     return K3b::Device::MEDIA_WRITABLE_CD;
0247 }
0248 
0249 #include "moc_k3bmixeddoc.cpp"