source: trunk/qt/Torrent.h @ 14537

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

Use PascalCase? for Qt client filenames

Split FileTree?.{h,cc} and FilterBar?.{h,cc} files so that each class
is in its own file.

This breaks translations (some classes got renamed => context changed),
to be fixed by next commit (along with Tx sync).

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