source: branches/2.0x/qt/torrent.h @ 10873

Last change on this file since 10873 was 10873, checked in by Longinus00, 12 years ago

(2.0x qt) #3286:Use flagStr in the status field of the peer list

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