2 * Bittorrent Client using Qt and libtorrent.
3 * Copyright (C) 2014 Vladimir Golovnev <glassez@yandex.ru>
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 * In addition, as a special exception, the copyright holders give permission to
20 * link this program with the OpenSSL project's "OpenSSL" library (or with
21 * modified versions of it that use the same license as the "OpenSSL" library),
22 * and distribute the linked executables. You must obey the GNU General Public
23 * License in all respects for all of the code used other than "OpenSSL". If you
24 * modify file(s), you may extend this exception to your version of the file(s),
25 * but you are not obligated to do so. If you do not wish to do so, delete this
26 * exception statement from your version.
29 #include "torrentfilter.h"
31 #include "bittorrent/infohash.h"
32 #include "bittorrent/torrent.h"
34 const std::optional
<QString
> TorrentFilter::AnyCategory
;
35 const std::optional
<TorrentIDSet
> TorrentFilter::AnyID
;
36 const std::optional
<Tag
> TorrentFilter::AnyTag
;
38 const TorrentFilter
TorrentFilter::DownloadingTorrent(TorrentFilter::Downloading
);
39 const TorrentFilter
TorrentFilter::SeedingTorrent(TorrentFilter::Seeding
);
40 const TorrentFilter
TorrentFilter::CompletedTorrent(TorrentFilter::Completed
);
41 const TorrentFilter
TorrentFilter::StoppedTorrent(TorrentFilter::Stopped
);
42 const TorrentFilter
TorrentFilter::RunningTorrent(TorrentFilter::Running
);
43 const TorrentFilter
TorrentFilter::ActiveTorrent(TorrentFilter::Active
);
44 const TorrentFilter
TorrentFilter::InactiveTorrent(TorrentFilter::Inactive
);
45 const TorrentFilter
TorrentFilter::StalledTorrent(TorrentFilter::Stalled
);
46 const TorrentFilter
TorrentFilter::StalledUploadingTorrent(TorrentFilter::StalledUploading
);
47 const TorrentFilter
TorrentFilter::StalledDownloadingTorrent(TorrentFilter::StalledDownloading
);
48 const TorrentFilter
TorrentFilter::CheckingTorrent(TorrentFilter::Checking
);
49 const TorrentFilter
TorrentFilter::MovingTorrent(TorrentFilter::Moving
);
50 const TorrentFilter
TorrentFilter::ErroredTorrent(TorrentFilter::Errored
);
52 using BitTorrent::Torrent
;
54 TorrentFilter::TorrentFilter(const Type type
, const std::optional
<TorrentIDSet
> &idSet
55 , const std::optional
<QString
> &category
, const std::optional
<Tag
> &tag
, const std::optional
<bool> isPrivate
)
57 , m_category
{category
}
60 , m_private
{isPrivate
}
64 TorrentFilter::TorrentFilter(const QString
&filter
, const std::optional
<TorrentIDSet
> &idSet
65 , const std::optional
<QString
> &category
, const std::optional
<Tag
> &tag
, const std::optional
<bool> isPrivate
)
66 : m_category
{category
}
69 , m_private
{isPrivate
}
71 setTypeByName(filter
);
74 bool TorrentFilter::setType(Type type
)
85 bool TorrentFilter::setTypeByName(const QString
&filter
)
89 if (filter
== u
"downloading")
91 else if (filter
== u
"seeding")
93 else if (filter
== u
"completed")
95 else if (filter
== u
"stopped")
97 else if (filter
== u
"running")
99 else if (filter
== u
"active")
101 else if (filter
== u
"inactive")
103 else if (filter
== u
"stalled")
105 else if (filter
== u
"stalled_uploading")
106 type
= StalledUploading
;
107 else if (filter
== u
"stalled_downloading")
108 type
= StalledDownloading
;
109 else if (filter
== u
"checking")
111 else if (filter
== u
"moving")
113 else if (filter
== u
"errored")
116 return setType(type
);
119 bool TorrentFilter::setTorrentIDSet(const std::optional
<TorrentIDSet
> &idSet
)
121 if (m_idSet
!= idSet
)
130 bool TorrentFilter::setCategory(const std::optional
<QString
> &category
)
132 if (m_category
!= category
)
134 m_category
= category
;
141 bool TorrentFilter::setTag(const std::optional
<Tag
> &tag
)
152 bool TorrentFilter::setPrivate(const std::optional
<bool> isPrivate
)
154 if (m_private
!= isPrivate
)
156 m_private
= isPrivate
;
163 bool TorrentFilter::match(const Torrent
*const torrent
) const
165 if (!torrent
) return false;
167 return (matchState(torrent
) && matchHash(torrent
) && matchCategory(torrent
) && matchTag(torrent
) && matchPrivate(torrent
));
170 bool TorrentFilter::matchState(const BitTorrent::Torrent
*const torrent
) const
172 const BitTorrent::TorrentState state
= torrent
->state();
179 return torrent
->isDownloading();
181 return torrent
->isUploading();
183 return torrent
->isCompleted();
185 return torrent
->isStopped();
187 return torrent
->isRunning();
189 return torrent
->isActive();
191 return torrent
->isInactive();
193 return (state
== BitTorrent::TorrentState::StalledUploading
)
194 || (state
== BitTorrent::TorrentState::StalledDownloading
);
195 case StalledUploading
:
196 return state
== BitTorrent::TorrentState::StalledUploading
;
197 case StalledDownloading
:
198 return state
== BitTorrent::TorrentState::StalledDownloading
;
200 return (state
== BitTorrent::TorrentState::CheckingUploading
)
201 || (state
== BitTorrent::TorrentState::CheckingDownloading
)
202 || (state
== BitTorrent::TorrentState::CheckingResumeData
);
204 return torrent
->isMoving();
206 return torrent
->isErrored();
213 bool TorrentFilter::matchHash(const BitTorrent::Torrent
*const torrent
) const
218 return m_idSet
->contains(torrent
->id());
221 bool TorrentFilter::matchCategory(const BitTorrent::Torrent
*const torrent
) const
226 return (torrent
->belongsToCategory(*m_category
));
229 bool TorrentFilter::matchTag(const BitTorrent::Torrent
*const torrent
) const
234 // Empty tag is a special value to indicate we're filtering for untagged torrents.
235 if (m_tag
->isEmpty())
236 return torrent
->tags().isEmpty();
238 return torrent
->hasTag(*m_tag
);
241 bool TorrentFilter::matchPrivate(const BitTorrent::Torrent
*const torrent
) const
246 return m_private
== torrent
->isPrivate();