From 3d70ebfc464b6219e8cb074a6e44b55939767b3c Mon Sep 17 00:00:00 2001 From: "Vladimir Golovnev (Glassez)" Date: Mon, 22 Jul 2019 14:29:14 +0300 Subject: [PATCH] Save updated resume data for completed torrents If fastresume data was rejected we need to save updated resume data after torrent finishes rechecking. --- src/base/bittorrent/session.cpp | 2 +- src/base/bittorrent/session.h | 2 +- src/base/bittorrent/torrenthandle.cpp | 7 ++++++- src/base/bittorrent/torrenthandle.h | 1 + 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/base/bittorrent/session.cpp b/src/base/bittorrent/session.cpp index ca6e696ef..48d92200d 100644 --- a/src/base/bittorrent/session.cpp +++ b/src/base/bittorrent/session.cpp @@ -1796,7 +1796,7 @@ void Session::bottomTorrentsQueuePos(const QStringList &hashes) saveTorrentsQueue(); } -void Session::handleTorrentSaveResumeDataRequested(TorrentHandle *const torrent) +void Session::handleTorrentSaveResumeDataRequested(const TorrentHandle *torrent) { qDebug("Saving resume data is requested for torrent '%s'...", qUtf8Printable(torrent->name())); ++m_numResumeData; diff --git a/src/base/bittorrent/session.h b/src/base/bittorrent/session.h index a8eee8b71..07cfb2b25 100644 --- a/src/base/bittorrent/session.h +++ b/src/base/bittorrent/session.h @@ -427,7 +427,7 @@ namespace BitTorrent void bottomTorrentsQueuePos(const QStringList &hashes); // TorrentHandle interface - void handleTorrentSaveResumeDataRequested(TorrentHandle *const torrent); + void handleTorrentSaveResumeDataRequested(const TorrentHandle *torrent); void handleTorrentShareLimitChanged(TorrentHandle *const torrent); void handleTorrentNameChanged(TorrentHandle *const torrent); void handleTorrentSavePathChanged(TorrentHandle *const torrent); diff --git a/src/base/bittorrent/torrenthandle.cpp b/src/base/bittorrent/torrenthandle.cpp index e8db78a87..fc1164aa0 100644 --- a/src/base/bittorrent/torrenthandle.cpp +++ b/src/base/bittorrent/torrenthandle.cpp @@ -187,6 +187,7 @@ TorrentHandle::TorrentHandle(Session *session, const lt::torrent_handle &nativeH , m_ratioLimit(params.ratioLimit) , m_seedingTimeLimit(params.seedingTimeLimit) , m_tempPathDisabled(params.disableTempPath) + , m_fastresumeDataRejected(false) , m_hasMissingFiles(false) , m_hasRootFolder(params.hasRootFolder) , m_needsToSetFirstLastPiecePriority(false) @@ -1652,6 +1653,8 @@ void TorrentHandle::handleTorrentCheckedAlert(const lt::torrent_checked_alert *p else { m_startupState = Started; m_pauseWhenReady = false; + if (m_fastresumeDataRejected && !m_hasMissingFiles) + saveResumeData(); } } @@ -1788,6 +1791,8 @@ void TorrentHandle::handleSaveResumeDataFailedAlert(const lt::save_resume_data_f void TorrentHandle::handleFastResumeRejectedAlert(const lt::fastresume_rejected_alert *p) { + m_fastresumeDataRejected = true; + if (p->error.value() == lt::errors::mismatching_file_size) { // Mismatching file size (files were probably moved) m_hasMissingFiles = true; @@ -1795,7 +1800,7 @@ void TorrentHandle::handleFastResumeRejectedAlert(const lt::fastresume_rejected_ } else { LogMsg(tr("Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again...") - .arg(name(), QString::fromStdString(p->message())), Log::CRITICAL); + .arg(name(), QString::fromStdString(p->message())), Log::WARNING); } } diff --git a/src/base/bittorrent/torrenthandle.h b/src/base/bittorrent/torrenthandle.h index b64ea14be..ef47b597c 100644 --- a/src/base/bittorrent/torrenthandle.h +++ b/src/base/bittorrent/torrenthandle.h @@ -438,6 +438,7 @@ namespace BitTorrent qreal m_ratioLimit; int m_seedingTimeLimit; bool m_tempPathDisabled; + bool m_fastresumeDataRejected; bool m_hasMissingFiles; bool m_hasRootFolder; bool m_needsToSetFirstLastPiecePriority;