summaryrefslogtreecommitdiffstats
path: root/amarok/src/mediadevice/mtp/mtpmediadevice.h
blob: 53431f07770f714f4fed558f0a9e6945bcb0fffe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
/***************************************************************************
 * copyright            : (C) 2006 Andy Kelk <andy@mopoke.co.uk>           *
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/

 /**
  *  Based on njb mediadevice with some code hints from the libmtp
  *  example tools
  */

 /**
  *  MTP media device
  *  @author Andy Kelk <andy@mopoke.co.uk>
  *  @see http://libmtp.sourceforge.net/
  */

#ifndef AMAROK_MTPMEDIADEVICE_H
#define AMAROK_MTPMEDIADEVICE_H

#include "mediabrowser.h"

#include <tqptrlist.h>
#include <tqmutex.h>

#include <libmtp.h>

class MtpMediaDevice;
class MtpMediaItem;

class MtpTrack {
    friend class MediaItem;
    public:
        MtpTrack( LIBMTP_track_t* track );
        ~MtpTrack() {};
        bool                    operator==( const MtpTrack& second ) const { return m_id == second.m_id; }

    public:
        u_int32_t               id() const { return m_id; }
        MetaBundle              *bundle() { return new MetaBundle( m_bundle ); }
        uint32_t                folderId() const { return m_folder_id; }
        void                    setBundle( MetaBundle &bundle );
        void                    setId( int id ) { m_id = id; }
        void                    setFolderId( const uint32_t folder_id ) { m_folder_id = folder_id; }
        void                    readMetaData( LIBMTP_track_t *track );

    private:
        u_int32_t               m_id;
        MetaBundle              m_bundle;
        uint32_t                m_folder_id;
};

class MtpPlaylist {
    friend class MediaItem;
    public:
        bool                    operator==( const MtpPlaylist& second ) const { return m_id == second.m_id; }

    public:
        u_int32_t               id() const { return m_id; }
        void                    setId( int id ) { m_id = id; }

    private:
        u_int32_t               m_id;
};


class MtpAlbum {
    friend class MediaItem;
    public:
        MtpAlbum( LIBMTP_album_t* album );
        ~MtpAlbum();
        bool                    operator==( const MtpAlbum& second ) const { return m_id == second.m_id; }

    public:
        u_int32_t               id() const { return m_id; }
        void                    setId( int id ) { m_id = id; }
        TQString                 album() const { return m_album; }

    private:
        u_int32_t               m_id;
        TQString                 m_album;
};

class MtpMediaItem : public MediaItem
{
    public:
        MtpMediaItem( TQListView *parent, TQListViewItem *after = 0 )
            : MediaItem( parent, after ) {}
        MtpMediaItem( TQListViewItem *parent, TQListViewItem *after = 0 )
            : MediaItem( parent, after ) {}
        MtpMediaItem( TQListView *parent, MediaDevice *dev )
            : MediaItem( parent ) { init( dev ); }
        MtpMediaItem( TQListViewItem *parent, MediaDevice *dev )
            : MediaItem( parent ) { init( dev ); }

        void init( MediaDevice *dev )
        {
            m_track  = 0;
            m_playlist = 0;
            m_device = dev;
        }

        ~MtpMediaItem()
        {
            //m_track->removeItem(this);
        }
        void                setTrack( MtpTrack *track ) { m_track = track; }
        MtpTrack            *track() { return m_track; }
        void                setPlaylist( MtpPlaylist *playlist ) { m_playlist = playlist; }
        MtpPlaylist         *playlist() { return m_playlist; }
        TQString             filename() { return m_track->bundle()->url().path(); }

    private:
        MtpTrack            *m_track;
        MtpPlaylist         *m_playlist;
};

class MtpMediaDevice : public MediaDevice
{
    Q_OBJECT
  

    public:
        MtpMediaDevice();
        virtual bool            autoConnect()          { return false; }
        virtual bool            asynchronousTransfer() { return false; }
        bool                    isConnected();
        LIBMTP_mtpdevice_t      *current_device();
        void                    setDisconnected();
        virtual void            rmbPressed( TQListViewItem *qitem, const TQPoint &point, int arg1 );
        virtual void            init( MediaBrowser* parent );
        virtual TQStringList     supportedFiletypes();
        void                    setFolders( LIBMTP_folder_t *folders );
        void                    cancelTransfer();
        void                    customClicked();
        virtual void            addConfigElements( TQWidget *parent );
        virtual void            removeConfigElements( TQWidget *parent );
        virtual void            applyConfig();
        virtual void            loadConfig();
        static int              progressCallback( uint64_t const sent, uint64_t const total, void const * const data );

    protected:
        MediaItem*              trackExists( const MetaBundle &bundle );

        bool                    openDevice( bool silent );
        bool                    closeDevice();
        bool                    lockDevice( bool tryLock=false ) { if( tryLock ) { return m_mutex.tryLock(); } else { m_mutex.lock(); return true; } }
        void                    unlockDevice() { m_mutex.unlock(); }

        MediaItem               *copyTrackToDevice( const MetaBundle &bundle );
        int                     downloadSelectedItemsToCollection();

        void                    synchronizeDevice();
        int                     deleteItemFromDevice( MediaItem *mediaitem, int flags=DeleteTrack );
        void                    addToPlaylist( MediaItem *list, MediaItem *after, TQPtrList<MediaItem> items );
        MtpMediaItem            *newPlaylist( const TQString &name, MediaItem *list, TQPtrList<MediaItem> items );
        bool                    getCapacity( KIO::filesize_t *total, KIO::filesize_t *available );
        virtual void            updateRootItems() {};

    private slots:
        void                    playlistRenamed( TQListViewItem *item, const TQString &, int );

    private:
        MtpMediaItem            *addTrackToView(MtpTrack *track, MtpMediaItem *item=0 );
        int                     readMtpMusic( void );
        void                    clearItems();
        int                     deleteObject( MtpMediaItem *deleteItem );
        uint32_t                checkFolderStructure( const MetaBundle &bundle, bool create = true );
        uint32_t                createFolder( const char *name, uint32_t parent_id );
        uint32_t                getDefaultParentId( void );
        uint32_t                folderNameToID( char *name, LIBMTP_folder_t *folderlist );
        uint32_t                subfolderNameToID( const char *name, LIBMTP_folder_t *folderlist, uint32_t parent_id );
        void                    updateFolders( void );
        void                    initView( void );
        void                    readPlaylists( void );
        void                    readAlbums( void );
        void                    playlistFromItem( MtpMediaItem *item);
        TQByteArray              *getSupportedImage( TQString path );
        void                    sendAlbumArt( TQPtrList<MediaItem> *items );
        void                    updateAlbumArt( TQPtrList<MediaItem> *items );
        LIBMTP_album_t          *getOrCreateAlbum( TQPtrList<MediaItem> *items );
        LIBMTP_mtpdevice_t      *m_device;
        TQMutex                  m_mutex;
        TQMutex                  m_critical_mutex;
        LIBMTP_folder_t         *m_folders;
        uint32_t		        m_default_parent_folder;
        TQString                 m_folderStructure;
        TQLineEdit               *m_folderStructureBox;
        TQLabel                  *m_folderLabel;
        TQStringList             m_supportedFiles;
        TQPtrList<MediaItem>     *m_newTracks;
        TQMap<int,TQString>       mtpFileTypes;
        TQMap<uint32_t,MtpTrack*> m_idToTrack;
        TQMap<TQString,MtpMediaItem*> m_fileNameToItem;
        TQMap<uint32_t,MtpAlbum*> m_idToAlbum;
        TQString                 m_format;
};

#endif