OSDN Git Service

kget: implement trackers settings via mirrors capability
authorIvailo Monev <xakepa10@gmail.com>
Fri, 13 Aug 2021 00:58:11 +0000 (03:58 +0300)
committerIvailo Monev <xakepa10@gmail.com>
Fri, 13 Aug 2021 00:58:11 +0000 (03:58 +0300)
Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
kget/transfer-plugins/torrent/transferTorrent.cpp
kget/transfer-plugins/torrent/transferTorrent.h

index fb1a483..f2fc2bb 100644 (file)
@@ -26,6 +26,7 @@
 #include <libtorrent/add_torrent_params.hpp>
 #include <libtorrent/alert_types.hpp>
 #include <libtorrent/torrent_info.hpp>
+#include <libtorrent/announce_entry.hpp>
 #include <libtorrent/magnet_uri.hpp>
 
 // NOTE: error_code comparison is bogus and breaks translatelterror() too,
@@ -380,7 +381,7 @@ TransferTorrent::TransferTorrent(TransferGroup* parent, TransferFactory* factory
     : Transfer(parent, factory, scheduler, source, dest, e),
     m_timerid(0), m_ltsession(nullptr), m_filemodel(nullptr)
 {
-    setCapabilities(Transfer::Cap_SpeedLimit | Transfer::Cap_Resuming);
+    setCapabilities(Transfer::Cap_SpeedLimit | Transfer::Cap_Resuming | Transfer::Cap_MultipleMirrors);
 
     lt::settings_pack ltsettings;
     ltsettings.set_int(lt::settings_pack::alert_mask,
@@ -412,6 +413,36 @@ void TransferTorrent::setSpeedLimits(int uploadLimit, int downloadLimit)
     m_lthandle.set_download_limit(downloadLimit * 1024);
 }
 
+QHash<KUrl, QPair<bool, int> > TransferTorrent::availableMirrors(const KUrl &file) const
+{
+    Q_UNUSED(file);
+
+    QHash<KUrl, QPair<bool, int> > result;
+
+    const std::vector<lt::announce_entry> lttrackers = m_lthandle.trackers();
+    foreach (const lt::announce_entry &lttracker, lttrackers) {
+        result.insert(KUrl(lttracker.url.c_str()), QPair<bool,int>(true, 1));
+    }
+
+    return result;
+}
+
+void TransferTorrent::setAvailableMirrors(const KUrl &file, const QHash<KUrl, QPair<bool, int> > &mirrors)
+{
+    Q_UNUSED(file);
+
+    std::vector<lt::announce_entry> lttrackers;
+    foreach (const KUrl &fileurl, mirrors.keys()) {
+        const QPair<bool, int> mirrorpair = mirrors.value(fileurl);
+        if (mirrorpair.first == true) {
+            const QByteArray filestring = fileurl.prettyUrl().toLocal8Bit();
+            lttrackers.push_back(lt::announce_entry(filestring.constData()));
+        }
+    }
+
+    m_lthandle.replace_trackers(lttrackers);
+}
+
 void TransferTorrent::start()
 {
     if (status() == Job::Running) {
index aa42e73..e4e2a66 100644 (file)
@@ -47,6 +47,8 @@ public:
     FileModel* fileModel() final;
     void save(const QDomElement &element) final;
     void load(const QDomElement *element) final;
+    QHash<KUrl, QPair<bool, int> > availableMirrors(const KUrl &file) const final;
+    void setAvailableMirrors(const KUrl &file, const QHash<KUrl, QPair<bool, int> > &mirrors) final;
 
     // Job reimplementations
     void start() final;