source: trunk/qt/torrent-filter.cc @ 14525

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

Fix some issues revealed by coverity

  • Property svn:keywords set to Date Rev Author Id
File size: 6.6 KB
Line 
1/*
2 * This file Copyright (C) 2009-2014 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-filter.cc 14525 2015-05-09 08:37:55Z mikedld $
8 */
9
10#include <algorithm>
11#include <iostream>
12
13#include "filters.h"
14#include "hig.h"
15#include "prefs.h"
16#include "torrent.h"
17#include "torrent-filter.h"
18#include "torrent-model.h"
19#include "utils.h"
20
21TorrentFilter::TorrentFilter (const Prefs& prefs):
22  myPrefs (prefs)
23{
24  // listen for changes to the preferences to know when to refilter / resort
25  connect (&myPrefs, SIGNAL(changed(int)), this, SLOT(refreshPref(int)));
26
27  setDynamicSortFilter (true);
28
29  // initialize our state from the current prefs
30  QList<int> initKeys;
31  initKeys << Prefs::SORT_MODE
32           << Prefs::FILTER_MODE
33           << Prefs::FILTER_TRACKERS
34           << Prefs::FILTER_TEXT;
35  for (const int key: initKeys)
36    refreshPref (key);
37}
38
39TorrentFilter::~TorrentFilter ()
40{
41}
42
43void
44TorrentFilter::refreshPref (int key)
45{
46  switch (key)
47    {
48      case Prefs::FILTER_TEXT:
49      case Prefs::FILTER_MODE:
50      case Prefs::FILTER_TRACKERS:
51        invalidateFilter ();
52        /* force a re-sort */
53        sort (0, !myPrefs.getBool(Prefs::SORT_REVERSED) ? Qt::AscendingOrder : Qt::DescendingOrder);
54
55      case Prefs::SORT_MODE:
56      case Prefs::SORT_REVERSED:
57        sort (0, myPrefs.getBool(Prefs::SORT_REVERSED) ? Qt::AscendingOrder : Qt::DescendingOrder);
58        invalidate ();
59        break;
60    }
61}
62
63/***
64****
65***/
66
67namespace
68{
69  template <typename T> int compare (const T a, const T b)
70    {
71      if (a < b)
72        return -1;
73
74      if (b < a)
75        return 1;
76
77      return 0;
78    }
79}
80
81bool
82TorrentFilter::lessThan (const QModelIndex& left, const QModelIndex& right) const
83{
84  int val = 0;
85  const Torrent * a = sourceModel()->data (left, TorrentModel::TorrentRole).value<const Torrent*>();
86  const Torrent * b = sourceModel()->data (right, TorrentModel::TorrentRole).value<const Torrent*>();
87
88  switch (myPrefs.get<SortMode>(Prefs::SORT_MODE).mode())
89    {
90      case SortMode::SORT_BY_QUEUE:
91        if (!val)
92          val = -compare (a->queuePosition(), b->queuePosition());
93        break;
94
95      case SortMode::SORT_BY_SIZE:
96        if (!val)
97          val = compare (a->sizeWhenDone(), b->sizeWhenDone());
98        break;
99
100      case SortMode::SORT_BY_AGE:
101        val = compare (a->dateAdded().toTime_t(), b->dateAdded().toTime_t());
102        break;
103
104      case SortMode::SORT_BY_ID:
105        if (!val)
106          val = compare (a->id(), b->id());
107        break;
108
109      case SortMode::SORT_BY_ACTIVITY:
110        if (!val)
111          val = compare (a->downloadSpeed() + a->uploadSpeed(), b->downloadSpeed() + b->uploadSpeed());
112        if (!val)
113          val = compare (a->peersWeAreUploadingTo() + a->webseedsWeAreDownloadingFrom(),
114                         b->peersWeAreUploadingTo() + b->webseedsWeAreDownloadingFrom());
115        // fall through
116
117      case SortMode::SORT_BY_STATE:
118        if (!val)
119          val = -compare (a->isPaused(), b->isPaused());
120        if (!val)
121          val = compare (a->getActivity(), b->getActivity());
122        if (!val)
123          val = -compare (a->queuePosition(), b->queuePosition());
124        if (!val)
125          val = compare (a->hasError(), b->hasError());
126        // fall through
127
128      case SortMode::SORT_BY_PROGRESS:
129        if (!val)
130          val = compare (a->percentComplete(), b->percentComplete());
131        if (!val)
132          val = a->compareSeedRatio (*b);
133        if (!val)
134          val = -compare (a->queuePosition(), b->queuePosition());
135        // fall through
136
137      case SortMode::SORT_BY_RATIO:
138        if (!val)
139          val = a->compareRatio (*b);
140        break;
141
142      case SortMode::SORT_BY_ETA:
143        if (!val)
144          val = a->compareETA (*b);
145        break;
146
147      default:
148        break;
149    }
150
151  if (val == 0)
152    val = -a->name().compare (b->name(), Qt::CaseInsensitive);
153
154  if (val == 0)
155    val = compare (a->hashString(), b->hashString());
156
157  return val < 0;
158}
159
160
161/***
162****
163***/
164
165bool
166TorrentFilter::trackerFilterAcceptsTorrent (const Torrent * tor, const QString& tracker) const
167{
168  return tracker.isEmpty() || tor->hasTrackerSubstring (tracker);
169}
170
171bool
172TorrentFilter::activityFilterAcceptsTorrent (const Torrent * tor, const FilterMode& m) const
173{
174  bool accepts;
175
176  switch (m.mode ())
177    {
178      case FilterMode::SHOW_ACTIVE:
179        accepts = tor->peersWeAreUploadingTo () > 0 || tor->peersWeAreDownloadingFrom () > 0 || tor->isVerifying ();
180        break;
181
182      case FilterMode::SHOW_DOWNLOADING:
183        accepts = tor->isDownloading () || tor->isWaitingToDownload ();
184        break;
185
186      case FilterMode::SHOW_SEEDING:
187        accepts = tor->isSeeding () || tor->isWaitingToSeed ();
188        break;
189
190      case FilterMode::SHOW_PAUSED:
191        accepts = tor->isPaused ();
192        break;
193
194      case FilterMode::SHOW_FINISHED:
195        accepts = tor->isFinished ();
196        break;
197
198      case FilterMode::SHOW_VERIFYING:
199        accepts = tor->isVerifying () || tor->isWaitingToVerify ();
200        break;
201
202      case FilterMode::SHOW_ERROR:
203        accepts = tor->hasError ();
204        break;
205
206      default: // FilterMode::SHOW_ALL
207        accepts = true;
208        break;
209    }
210
211  return accepts;
212}
213
214bool
215TorrentFilter::filterAcceptsRow (int sourceRow, const QModelIndex& sourceParent) const
216{
217  QModelIndex childIndex = sourceModel()->index (sourceRow, 0, sourceParent);
218  const Torrent * tor = childIndex.model()->data (childIndex, TorrentModel::TorrentRole).value<const Torrent*>();
219  bool accepts = true;
220
221  if (accepts)
222    {
223      const FilterMode m = myPrefs.get<FilterMode>(Prefs::FILTER_MODE);
224      accepts = activityFilterAcceptsTorrent (tor, m);
225    }
226
227  if (accepts)
228    {
229      const QString trackers = myPrefs.getString(Prefs::FILTER_TRACKERS);
230      accepts = trackerFilterAcceptsTorrent (tor, trackers);
231    }
232
233  if (accepts)
234    {
235      const QString text = myPrefs.getString (Prefs::FILTER_TEXT);
236      if (!text.isEmpty ())
237        accepts = tor->name().contains (text, Qt::CaseInsensitive);
238    }
239
240  return accepts;
241}
242
243int
244TorrentFilter::hiddenRowCount () const
245{
246  return sourceModel()->rowCount () - rowCount ();
247}
248
249void
250TorrentFilter::countTorrentsPerMode (int * setmeCounts) const
251{
252  std::fill_n (setmeCounts, static_cast<std::size_t>(FilterMode::NUM_MODES), 0);
253
254  for (int row(0); ; ++row)
255    {
256      QModelIndex index (sourceModel()->index(row, 0));
257      if (!index.isValid())
258        break;
259
260      const Torrent * tor (index.data (TorrentModel::TorrentRole).value<const Torrent*>());
261      for (int mode(0); mode<FilterMode::NUM_MODES; ++mode)
262        if (activityFilterAcceptsTorrent (tor, mode))
263          ++setmeCounts[mode];
264    }
265}
266
Note: See TracBrowser for help on using the repository browser.