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"