source: trunk/qt/Torrent.h @ 14539

Last change on this file since 14539 was 14539, checked in by mikedld, 6 years ago

Unify/prettify Qt client headers style

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