File indexing completed on 2024-05-12 04:50:59

0001 /*
0002     SPDX-FileCopyrightText: 2005-2009 Sebastian Trueg <trueg@k3b.org>
0003     SPDX-FileCopyrightText: 1998-2009 Sebastian Trueg <trueg@k3b.org>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #include "k3baudiocdtrackdrag.h"
0009 
0010 #include "k3bdevice.h"
0011 #include "k3bdevicemanager.h"
0012 #include "k3btoc.h"
0013 #include "k3btrack.h"
0014 #include "k3bcore.h"
0015 
0016 #include <QDataStream>
0017 #include <QMimeData>
0018 
0019 
0020 // FIXME: multiple tracks
0021 K3b::AudioCdTrackDrag::AudioCdTrackDrag()
0022     : m_device( 0 )
0023 {
0024 }
0025 
0026 
0027 K3b::AudioCdTrackDrag::AudioCdTrackDrag( const K3b::Device::Toc& toc,
0028                                          const QList<int>& trackNumbers,
0029                                          const KCDDB::CDInfo& cddb,
0030                                          K3b::Device::Device* lastDev )
0031     : m_toc(toc),
0032       m_trackNumbers(trackNumbers),
0033       m_cddb(cddb),
0034       m_device(lastDev)
0035 {
0036 }
0037 
0038 
0039 void K3b::AudioCdTrackDrag::populateMimeData( QMimeData* mime )
0040 {
0041     QByteArray data;
0042     QDataStream s( &data, QIODevice::WriteOnly );
0043 
0044     // encode TOC
0045     s << m_toc.count();
0046     for( K3b::Device::Toc::const_iterator it = m_toc.constBegin(); it != m_toc.constEnd(); ++it ) {
0047         const K3b::Device::Track& track = *it;
0048         s << track.firstSector().lba() << track.lastSector().lba();
0049     }
0050 
0051     // encode CDDB
0052     s << m_cddb.get( KCDDB::Artist ).toString()
0053       << m_cddb.get( KCDDB::Title ).toString();
0054     for( int i = 0; i < m_toc.count(); ++i ) {
0055         s << m_cddb.track( i ).get( KCDDB::Artist ).toString()
0056           << m_cddb.track( i ).get( KCDDB::Title ).toString();
0057     }
0058 
0059     // encode dragged track numbers
0060     s << m_trackNumbers.count();
0061     foreach( int trackNumber, m_trackNumbers )
0062         s << trackNumber;
0063 
0064     // encode last used device
0065     if( m_device )
0066         s << m_device->blockDeviceName();
0067     else
0068         s << QString();
0069 
0070     // TODO: the rest
0071     mime->setData( mimeDataTypes().first(), data );
0072 }
0073 
0074 
0075 K3b::AudioCdTrackDrag K3b::AudioCdTrackDrag::fromMimeData( const QMimeData* mime )
0076 {
0077     AudioCdTrackDrag drag;
0078 
0079     QByteArray data = mime->data( mimeDataTypes().first() );
0080 
0081     QDataStream s( data );
0082 
0083     // decode TOC
0084     int trackCnt;
0085     s >> trackCnt;
0086     for( int i = 0; i < trackCnt; ++i ) {
0087         int fs, ls;
0088         s >> fs;
0089         s >> ls;
0090         drag.m_toc.append( K3b::Device::Track( fs, ls, K3b::Device::Track::TYPE_AUDIO ) );
0091         qDebug() << "decoded track:" << drag.m_toc.last();
0092     }
0093 
0094     // decode cddb
0095     drag.m_cddb.clear();
0096     QString str;
0097     s >> str;
0098     drag.m_cddb.set( KCDDB::Artist, str );
0099     s >> str;
0100     drag.m_cddb.set( KCDDB::Title, str );
0101     for( int i = 0; i < trackCnt; ++i ) {
0102         s >> str;
0103         qDebug() << "Decoded artist for track" << ( i+1 ) << str;
0104         drag.m_cddb.track( i ).set( KCDDB::Artist, str );
0105         s >> str;
0106         qDebug() << "Decoded title for track" << ( i+1 ) << str;
0107         drag.m_cddb.track( i ).set( KCDDB::Title, str );
0108     }
0109 
0110     // decode track numbers
0111     s >> trackCnt;
0112     drag.m_trackNumbers.clear();
0113     for( int i = 0; i < trackCnt; ++i ) {
0114         int track = 0;
0115         s >> track;
0116         drag.m_trackNumbers.append( track );
0117     }
0118 
0119     // decoce last used device
0120     s >> str;
0121     if( !str.isEmpty() )
0122         drag.m_device = k3bcore->deviceManager()->findDevice( str );
0123 
0124     return drag;
0125 }
0126 
0127 
0128 QStringList K3b::AudioCdTrackDrag::mimeDataTypes()
0129 {
0130     return QStringList() << QLatin1String( "k3b/audio_track_list" );
0131 }
0132 
0133 
0134 bool K3b::AudioCdTrackDrag::canDecode( const QMimeData* s )
0135 {
0136     return s->hasFormat( mimeDataTypes().first() );
0137 }