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