1 /*
2     SPDX-FileCopyrightText: 2005-2009 Sebastian Trueg <trueg@k3b.org>
3     SPDX-FileCopyrightText: 1998-2009 Sebastian Trueg <trueg@k3b.org>
4 
5     SPDX-License-Identifier: GPL-2.0-or-later
6 */
7 
8 #include "k3baudiocdtrackdrag.h"
9 
10 #include "k3bdevice.h"
11 #include "k3bdevicemanager.h"
12 #include "k3btoc.h"
13 #include "k3btrack.h"
14 #include "k3bcore.h"
15 
16 #include <QDataStream>
17 #include <QMimeData>
18 
19 
20 // FIXME: multiple tracks
AudioCdTrackDrag()21 K3b::AudioCdTrackDrag::AudioCdTrackDrag()
22     : m_device( 0 )
23 {
24 }
25 
26 
AudioCdTrackDrag(const K3b::Device::Toc & toc,const QList<int> & trackNumbers,const KCDDB::CDInfo & cddb,K3b::Device::Device * lastDev)27 K3b::AudioCdTrackDrag::AudioCdTrackDrag( const K3b::Device::Toc& toc,
28                                          const QList<int>& trackNumbers,
29                                          const KCDDB::CDInfo& cddb,
30                                          K3b::Device::Device* lastDev )
31     : m_toc(toc),
32       m_trackNumbers(trackNumbers),
33       m_cddb(cddb),
34       m_device(lastDev)
35 {
36 }
37 
38 
populateMimeData(QMimeData * mime)39 void K3b::AudioCdTrackDrag::populateMimeData( QMimeData* mime )
40 {
41     QByteArray data;
42     QDataStream s( &data, QIODevice::WriteOnly );
43 
44     // encode TOC
45     s << m_toc.count();
46     for( K3b::Device::Toc::const_iterator it = m_toc.constBegin(); it != m_toc.constEnd(); ++it ) {
47         const K3b::Device::Track& track = *it;
48         s << track.firstSector().lba() << track.lastSector().lba();
49     }
50 
51     // encode CDDB
52     s << m_cddb.get( KCDDB::Artist ).toString()
53       << m_cddb.get( KCDDB::Title ).toString();
54     for( int i = 0; i < m_toc.count(); ++i ) {
55         s << m_cddb.track( i ).get( KCDDB::Artist ).toString()
56           << m_cddb.track( i ).get( KCDDB::Title ).toString();
57     }
58 
59     // encode dragged track numbers
60     s << m_trackNumbers.count();
61     foreach( int trackNumber, m_trackNumbers )
62         s << trackNumber;
63 
64     // encode last used device
65     if( m_device )
66         s << m_device->blockDeviceName();
67     else
68         s << QString();
69 
70     // TODO: the rest
71     mime->setData( mimeDataTypes().first(), data );
72 }
73 
74 
fromMimeData(const QMimeData * mime)75 K3b::AudioCdTrackDrag K3b::AudioCdTrackDrag::fromMimeData( const QMimeData* mime )
76 {
77     AudioCdTrackDrag drag;
78 
79     QByteArray data = mime->data( mimeDataTypes().first() );
80 
81     QDataStream s( data );
82 
83     // decode TOC
84     int trackCnt;
85     s >> trackCnt;
86     for( int i = 0; i < trackCnt; ++i ) {
87         int fs, ls;
88         s >> fs;
89         s >> ls;
90         drag.m_toc.append( K3b::Device::Track( fs, ls, K3b::Device::Track::TYPE_AUDIO ) );
91         qDebug() << "decoded track:" << drag.m_toc.last();
92     }
93 
94     // decode cddb
95     drag.m_cddb.clear();
96     QString str;
97     s >> str;
98     drag.m_cddb.set( KCDDB::Artist, str );
99     s >> str;
100     drag.m_cddb.set( KCDDB::Title, str );
101     for( int i = 0; i < trackCnt; ++i ) {
102         s >> str;
103         qDebug() << "Decoded artist for track" << ( i+1 ) << str;
104         drag.m_cddb.track( i ).set( KCDDB::Artist, str );
105         s >> str;
106         qDebug() << "Decoded title for track" << ( i+1 ) << str;
107         drag.m_cddb.track( i ).set( KCDDB::Title, str );
108     }
109 
110     // decode track numbers
111     s >> trackCnt;
112     drag.m_trackNumbers.clear();
113     for( int i = 0; i < trackCnt; ++i ) {
114         int track = 0;
115         s >> track;
116         drag.m_trackNumbers.append( track );
117     }
118 
119     // decoce last used device
120     s >> str;
121     if( !str.isEmpty() )
122         drag.m_device = k3bcore->deviceManager()->findDevice( str );
123 
124     return drag;
125 }
126 
127 
mimeDataTypes()128 QStringList K3b::AudioCdTrackDrag::mimeDataTypes()
129 {
130     return QStringList() << QLatin1String( "k3b/audio_track_list" );
131 }
132 
133 
canDecode(const QMimeData * s)134 bool K3b::AudioCdTrackDrag::canDecode( const QMimeData* s )
135 {
136     return s->hasFormat( mimeDataTypes().first() );
137 }
138