source: trunk/qt/torrent.h @ 13810

Last change on this file since 13810 was 13810, checked in by jordan, 8 years ago

(trunk) #1220 'change top folder names' -- add file-renaming to the Qt client

  • Property svn:keywords set to Date Rev Author Id
File size: 12.2 KB
Line 
1/*
2 * This file Copyright (C) Mnemosyne LLC
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2
6 * as published by the Free Software Foundation.
7 *
8 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
9 *
10 * $Id: torrent.h 13810 2013-01-20 01:31:58Z jordan $
11 */
12
13#ifndef QTR_TORRENT_H
14#define QTR_TORRENT_H
15
16#include <QObject>
17#include <QIcon>
18#include <QMetaType>
19#include <QDateTime>
20#include <QString>
21#include <QStringList>
22#include <QList>
23#include <QTemporaryFile>
24#include <QVariant>
25
26#include <libtransmission/transmission.h>
27#include <libtransmission/quark.h>
28
29#include "speed.h"
30#include "types.h"
31
32extern "C"
33{
34    struct tr_variant;
35}
36
37class Prefs;
38class QPixmap;
39class QStyle;
40
41struct Peer
42{
43  bool clientIsChoked;
44  bool clientIsInterested;
45  bool isDownloadingFrom;
46  bool isEncrypted;
47  bool isIncoming;
48  bool isUploadingTo;
49  bool peerIsChoked;
50  bool peerIsInterested;
51  QString address;
52  QString clientName;
53  QString flagStr;
54  int port;
55  Speed rateToClient;
56  Speed rateToPeer;
57  double progress;
58};
59
60typedef QList<Peer> PeerList;
61Q_DECLARE_METATYPE(Peer)
62Q_DECLARE_METATYPE(PeerList)
63
64struct TrackerStat
65{
66  bool hasAnnounced;
67  bool hasScraped;
68  bool isBackup;
69  bool lastAnnounceSucceeded;
70  bool lastAnnounceTimedOut;
71  bool lastScrapeSucceeded;
72  bool lastScrapeTimedOut;
73  int announceState;
74  int downloadCount;
75  int id;
76  int lastAnnouncePeerCount;
77  int lastAnnounceStartTime;
78  int lastAnnounceTime;
79  int lastScrapeStartTime;
80  int lastScrapeTime;
81  int leecherCount;
82  int nextAnnounceTime;
83  int nextScrapeTime;
84  int scrapeState;
85  int seederCount;
86  int tier;
87  QString announce;
88  QString host;
89  QString lastAnnounceResult;
90  QString lastScrapeResult;
91  QPixmap getFavicon( ) const;
92};
93
94typedef QList<TrackerStat> TrackerStatsList;
95Q_DECLARE_METATYPE(TrackerStat)
96Q_DECLARE_METATYPE(TrackerStatsList)
97
98struct TrFile
99{
100  TrFile(): wanted(true), index(-1), priority(0), size(0), have(0) { }
101
102  bool wanted;
103  int index;
104  int priority;
105  QString filename;
106  uint64_t size;
107  uint64_t have;
108};
109
110typedef QList<TrFile> FileList;
111Q_DECLARE_METATYPE(TrFile)
112Q_DECLARE_METATYPE(FileList)
113
114
115class Torrent: public QObject
116{
117        Q_OBJECT;
118
119    public:
120
121        enum
122        {
123            ID,
124            UPLOAD_SPEED,
125            DOWNLOAD_SPEED,
126            DOWNLOAD_DIR,
127            ACTIVITY,
128            NAME,
129            ERROR,
130            ERROR_STRING,
131            SIZE_WHEN_DONE,
132            LEFT_UNTIL_DONE,
133            HAVE_UNCHECKED,
134            HAVE_VERIFIED,
135            DESIRED_AVAILABLE,
136            TOTAL_SIZE,
137            PIECE_SIZE,
138            PIECE_COUNT,
139            PEERS_GETTING_FROM_US,
140            PEERS_SENDING_TO_US,
141            WEBSEEDS_SENDING_TO_US,
142            PERCENT_DONE,
143            METADATA_PERCENT_DONE,
144            PERCENT_VERIFIED,
145            DATE_ACTIVITY,
146            DATE_ADDED,
147            DATE_STARTED,
148            DATE_CREATED,
149            PEERS_CONNECTED,
150            ETA,
151            RATIO,
152            DOWNLOADED_EVER,
153            UPLOADED_EVER,
154            FAILED_EVER,
155            TRACKERS,
156            HOSTS,
157            TRACKERSTATS,
158            MIME_ICON,
159            SEED_RATIO_LIMIT,
160            SEED_RATIO_MODE,
161            SEED_IDLE_LIMIT,
162            SEED_IDLE_MODE,
163            DOWN_LIMIT,
164            DOWN_LIMITED,
165            UP_LIMIT,
166            UP_LIMITED,
167            HONORS_SESSION_LIMITS,
168            PEER_LIMIT,
169            HASH_STRING,
170            IS_FINISHED,
171            IS_PRIVATE,
172            IS_STALLED,
173            COMMENT,
174            CREATOR,
175            MANUAL_ANNOUNCE_TIME,
176            PEERS,
177            TORRENT_FILE,
178            BANDWIDTH_PRIORITY,
179            QUEUE_POSITION,
180
181            PROPERTY_COUNT
182        };
183
184    public:
185        Torrent( Prefs&, int id );
186        virtual ~Torrent( );
187
188    signals:
189        void torrentChanged( int id );
190        void torrentCompleted( int id );
191        void torrentFileListRebuilt( int id );
192
193    private:
194
195        enum Group
196        {
197            INFO, // info fields that only need to be loaded once
198            STAT, // commonly-used stats that should be refreshed often
199            STAT_EXTRA,  // rarely used; only refresh if details dialog is open
200            DERIVED // doesn't come from RPC
201        };
202
203        struct Property
204        {
205            int id;
206            tr_quark key;
207            int type;
208            int group;
209        };
210
211        static Property myProperties[];
212
213        bool magnetTorrent;
214
215    public:
216        typedef QList<tr_quark> KeyList;
217        static const KeyList& getInfoKeys( );
218        static const KeyList& getStatKeys( );
219        static const KeyList& getExtraStatKeys( );
220
221    private:
222        static KeyList buildKeyList( Group group );
223
224    private:
225        QVariant myValues[PROPERTY_COUNT];
226
227        int getInt            ( int key ) const;
228        bool getBool          ( int key ) const;
229        QTime getTime         ( int key ) const;
230        QIcon getIcon         ( int key ) const;
231        double getDouble      ( int key ) const;
232        qulonglong getSize    ( int key ) const;
233        QString getString     ( int key ) const;
234        QDateTime getDateTime ( int key ) const;
235
236        bool setInt        ( int key, int value );
237        bool setBool       ( int key, bool value );
238        bool setIcon       ( int key, const QIcon& );
239        bool setDouble     ( int key, double );
240        bool setString     ( int key, const char * );
241        bool setSize       ( int key, qulonglong );
242        bool setDateTime   ( int key, const QDateTime& );
243
244    public:
245        int getBandwidthPriority( ) const { return getInt( BANDWIDTH_PRIORITY ); }
246        int id( ) const { return getInt( ID ); }
247        QString name( ) const { return getString( NAME ); }
248        QString creator( ) const { return getString( CREATOR ); }
249        QString comment( ) const { return getString( COMMENT ); }
250        QString getPath( ) const { return getString( DOWNLOAD_DIR ); }
251        QString getError( ) const;
252        QString hashString( ) const { return getString( HASH_STRING ); }
253        QString torrentFile( ) const { return getString( TORRENT_FILE ); }
254        bool hasError( ) const { return !getError( ).isEmpty( ); }
255        bool isDone( ) const { return getSize( LEFT_UNTIL_DONE ) == 0; }
256        bool isSeed( ) const { return haveVerified() >= totalSize(); }
257        bool isPrivate( ) const { return getBool( IS_PRIVATE ); }
258        bool getSeedRatio( double& setme ) const;
259        uint64_t haveVerified( ) const { return getSize( HAVE_VERIFIED ); }
260        uint64_t haveUnverified( ) const { return getSize( HAVE_UNCHECKED ); }
261        uint64_t desiredAvailable( ) const { return getSize( DESIRED_AVAILABLE ); }
262        uint64_t haveTotal( ) const { return haveVerified( ) + haveUnverified(); }
263        uint64_t totalSize( ) const { return getSize( TOTAL_SIZE ); }
264        uint64_t sizeWhenDone( ) const { return getSize( SIZE_WHEN_DONE ); }
265        uint64_t leftUntilDone( ) const { return getSize( LEFT_UNTIL_DONE ); }
266        uint64_t pieceSize( ) const { return getSize( PIECE_SIZE ); }
267        bool hasMetadata( ) const { return getDouble( METADATA_PERCENT_DONE ) >= 1.0; }
268        bool isMagnet( ) const { return magnetTorrent; }
269        int  pieceCount( ) const { return getInt( PIECE_COUNT ); }
270        double ratio( ) const { return getDouble( RATIO ); }
271        double percentComplete( ) const { return haveTotal() / (double)totalSize(); }
272        double percentDone( ) const { return getDouble( PERCENT_DONE ); }
273        double metadataPercentDone( ) const { return getDouble( METADATA_PERCENT_DONE ); }
274        uint64_t downloadedEver( ) const { return getSize( DOWNLOADED_EVER ); }
275        uint64_t uploadedEver( ) const { return getSize( UPLOADED_EVER ); }
276        uint64_t failedEver( ) const { return getSize( FAILED_EVER ); }
277        int compareTracker( const Torrent& ) const;
278        int compareSeedRatio( const Torrent& ) const;
279        int compareRatio( const Torrent& ) const;
280        int compareETA( const Torrent& ) const;
281        bool hasETA( ) const { return getETA( ) >= 0; }
282        int getETA( ) const { return getInt( ETA ); }
283        QDateTime lastActivity( ) const { return getDateTime( DATE_ACTIVITY ); }
284        QDateTime lastStarted( ) const { return getDateTime( DATE_STARTED ); }
285        QDateTime dateAdded( ) const { return getDateTime( DATE_ADDED ); }
286        QDateTime dateCreated( ) const { return getDateTime( DATE_CREATED ); }
287        QDateTime manualAnnounceTime( ) const { return getDateTime( MANUAL_ANNOUNCE_TIME ); }
288        bool canManualAnnounce( ) const { return isReadyToTransfer() && (manualAnnounceTime()<=QDateTime::currentDateTime()); }
289        int peersWeAreDownloadingFrom( ) const { return getInt( PEERS_SENDING_TO_US ); }
290        int webseedsWeAreDownloadingFrom( ) const { return getInt( WEBSEEDS_SENDING_TO_US ); }
291        int peersWeAreUploadingTo( ) const { return getInt( PEERS_GETTING_FROM_US ); }
292        bool isUploading( ) const { return peersWeAreUploadingTo( ) > 0; }
293        int connectedPeers( ) const { return getInt( PEERS_CONNECTED ); }
294        int connectedPeersAndWebseeds( ) const { return connectedPeers( ) + getInt( WEBSEEDS_SENDING_TO_US ); }
295        Speed downloadSpeed( ) const { return Speed::fromBps( getSize( DOWNLOAD_SPEED ) ); }
296        Speed uploadSpeed( ) const { return Speed::fromBps( getSize( UPLOAD_SPEED ) ); }
297        double getVerifyProgress( ) const { return getDouble( PERCENT_VERIFIED ); }
298        bool hasFileSubstring( const QString& substr ) const;
299        bool hasTrackerSubstring( const QString& substr ) const;
300        Speed uploadLimit( ) const { return Speed::fromKBps( getInt( UP_LIMIT ) ); }
301        Speed downloadLimit( ) const { return Speed::fromKBps( getInt( DOWN_LIMIT ) ); }
302        bool uploadIsLimited( ) const { return getBool( UP_LIMITED ); }
303        bool downloadIsLimited( ) const { return getBool( DOWN_LIMITED ); }
304        bool honorsSessionLimits( ) const { return getBool( HONORS_SESSION_LIMITS ); }
305        int peerLimit( ) const { return getInt( PEER_LIMIT ); }
306        double seedRatioLimit( ) const { return getDouble( SEED_RATIO_LIMIT ); }
307        tr_ratiolimit seedRatioMode( ) const { return (tr_ratiolimit) getInt( SEED_RATIO_MODE ); }
308        int seedIdleLimit( ) const { return getInt( SEED_IDLE_LIMIT ); }
309        tr_idlelimit seedIdleMode( ) const { return (tr_idlelimit) getInt( SEED_IDLE_MODE ); }
310        TrackerStatsList trackerStats( ) const{ return myValues[TRACKERSTATS].value<TrackerStatsList>(); }
311        QStringList trackers() const { return myValues[TRACKERS].value<QStringList>(); }
312        QStringList hosts() const { return myValues[HOSTS].value<QStringList>(); }
313        PeerList peers( ) const{ return myValues[PEERS].value<PeerList>(); }
314        const FileList& files( ) const { return myFiles; }
315        int queuePosition( ) const { return getInt( QUEUE_POSITION ); }
316        bool isStalled( ) const { return getBool( IS_STALLED ); }
317
318    public:
319        QString activityString( ) const;
320        tr_torrent_activity getActivity( ) const { return (tr_torrent_activity) getInt( ACTIVITY ); }
321        bool isFinished( ) const { return getBool( IS_FINISHED ); }
322        bool isPaused( ) const { return getActivity( ) == TR_STATUS_STOPPED; }
323        bool isWaitingToVerify( ) const { return getActivity( ) == TR_STATUS_CHECK_WAIT; }
324        bool isVerifying( ) const { return getActivity( ) == TR_STATUS_CHECK; }
325        bool isDownloading( ) const { return getActivity( ) == TR_STATUS_DOWNLOAD; }
326        bool isWaitingToDownload( ) const { return getActivity( ) == TR_STATUS_DOWNLOAD_WAIT; }
327        bool isSeeding( ) const { return getActivity( ) == TR_STATUS_SEED; }
328        bool isWaitingToSeed( ) const { return getActivity( ) == TR_STATUS_SEED_WAIT; }
329        bool isReadyToTransfer( ) const { return getActivity()==TR_STATUS_DOWNLOAD || getActivity()==TR_STATUS_SEED; }
330        bool isQueued( ) const { return isWaitingToDownload() || isWaitingToSeed(); }
331        void notifyComplete( ) const;
332
333    public:
334        void update( tr_variant * dict );
335        void setMagnet( bool magnet ) { magnetTorrent = magnet; }
336
337    private:
338        const char * getMimeTypeString( ) const;
339        void updateMimeIcon( );
340
341    public:
342        QIcon getMimeTypeIcon( ) const { return getIcon( MIME_ICON ); }
343
344    private:
345        Prefs& myPrefs;
346        FileList myFiles;
347};
348
349Q_DECLARE_METATYPE(const Torrent*)
350
351#endif
352
Note: See TracBrowser for help on using the repository browser.