From 9f0edde12bd69790b1c675aedf61e0b304e5f5d6 Mon Sep 17 00:00:00 2001 From: "Vladimir Golovnev (Glassez)" Date: Mon, 26 Oct 2020 11:08:22 +0300 Subject: [PATCH 1/2] Don't resume "paused" torrents when checking by libtorrent --- src/base/bittorrent/nativetorrentextension.cpp | 11 ----------- src/base/bittorrent/nativetorrentextension.h | 1 - src/base/bittorrent/torrenthandleimpl.cpp | 17 ++++++----------- 3 files changed, 6 insertions(+), 23 deletions(-) diff --git a/src/base/bittorrent/nativetorrentextension.cpp b/src/base/bittorrent/nativetorrentextension.cpp index 8a9d12245..6b0f8d54c 100644 --- a/src/base/bittorrent/nativetorrentextension.cpp +++ b/src/base/bittorrent/nativetorrentextension.cpp @@ -49,17 +49,6 @@ NativeTorrentExtension::NativeTorrentExtension(const lt::torrent_handle &torrent { } -// This method is called when state of torrent is changed -void NativeTorrentExtension::on_state(const lt::torrent_status::state_t state) -{ - // When a torrent enters "checking files" state while paused, we temporarily resume it - // (really we just allow libtorrent to resume it by enabling auto management for it). - if (state == lt::torrent_status::checking_files) { - if (isPaused(m_torrentHandle.status({}))) - m_torrentHandle.set_flags(lt::torrent_flags::stop_when_ready | lt::torrent_flags::auto_managed); - } -} - bool NativeTorrentExtension::on_pause() { if (!isAutoManaged(m_torrentHandle.status({}))) diff --git a/src/base/bittorrent/nativetorrentextension.h b/src/base/bittorrent/nativetorrentextension.h index 66986831e..a62bee787 100644 --- a/src/base/bittorrent/nativetorrentextension.h +++ b/src/base/bittorrent/nativetorrentextension.h @@ -37,7 +37,6 @@ public: explicit NativeTorrentExtension(const lt::torrent_handle &torrentHandle); private: - void on_state(lt::torrent_status::state_t state) override; bool on_pause() override; lt::torrent_handle m_torrentHandle; diff --git a/src/base/bittorrent/torrenthandleimpl.cpp b/src/base/bittorrent/torrenthandleimpl.cpp index 5ffa9815d..f6985de39 100644 --- a/src/base/bittorrent/torrenthandleimpl.cpp +++ b/src/base/bittorrent/torrenthandleimpl.cpp @@ -1194,6 +1194,12 @@ void TorrentHandleImpl::forceRecheck() m_nativeHandle.force_recheck(); m_unchecked = false; + + if (isPaused()) { + // When "force recheck" is applied on paused torrent, we temporarily resume it + // (really we just allow libtorrent to resume it by enabling auto management for it). + m_nativeHandle.set_flags(lt::torrent_flags::stop_when_ready | lt::torrent_flags::auto_managed); + } } void TorrentHandleImpl::setSequentialDownload(const bool enable) @@ -1449,17 +1455,6 @@ void TorrentHandleImpl::handleSaveResumeDataAlert(const lt::save_resume_data_ale m_ltAddTorrentParams.added_time = addedTime().toSecsSinceEpoch(); m_ltAddTorrentParams.save_path = Profile::instance()->toPortablePath( QString::fromStdString(m_ltAddTorrentParams.save_path)).toStdString(); - if (!m_hasMissingFiles) { - m_ltAddTorrentParams.flags = m_nativeStatus.flags; - if (m_nativeStatus.flags & lt::torrent_flags::stop_when_ready) { - // We need to redefine these values when torrent starting/rechecking - // in "paused" state since native values can be logically wrong - // (torrent can be not paused and auto_managed when it is checking). - m_ltAddTorrentParams.flags |= lt::torrent_flags::paused; - m_ltAddTorrentParams.flags &= ~lt::torrent_flags::auto_managed; - m_ltAddTorrentParams.flags &= ~lt::torrent_flags::stop_when_ready; - } - } auto resumeDataPtr = std::make_shared(lt::write_resume_data(m_ltAddTorrentParams)); lt::entry &resumeData = *resumeDataPtr; From 80ca7796cae60b6146f7a659f83f515d04768ccf Mon Sep 17 00:00:00 2001 From: "Vladimir Golovnev (Glassez)" Date: Mon, 26 Oct 2020 13:23:10 +0300 Subject: [PATCH 2/2] Fix torrent state calculation --- src/base/bittorrent/torrenthandleimpl.cpp | 91 +++++++++++++---------- 1 file changed, 52 insertions(+), 39 deletions(-) diff --git a/src/base/bittorrent/torrenthandleimpl.cpp b/src/base/bittorrent/torrenthandleimpl.cpp index f6985de39..751f71155 100644 --- a/src/base/bittorrent/torrenthandleimpl.cpp +++ b/src/base/bittorrent/torrenthandleimpl.cpp @@ -743,48 +743,61 @@ void TorrentHandleImpl::updateState() if (m_nativeStatus.state == lt::torrent_status::checking_resume_data) { m_state = TorrentState::CheckingResumeData; } - else if (m_nativeStatus.state == lt::torrent_status::checking_files) { - m_state = m_hasSeedStatus ? TorrentState::CheckingUploading : TorrentState::CheckingDownloading; - } - else if (m_nativeStatus.state == lt::torrent_status::allocating) { - m_state = TorrentState::Allocating; - } - else if (isMoveInProgress()) { - m_state = TorrentState::Moving; - } - else if (hasError()) { - m_state = TorrentState::Error; - } - else if (hasMissingFiles()) { - m_state = TorrentState::MissingFiles; - } else if (isPaused()) { - m_state = isSeed() ? TorrentState::PausedUploading : TorrentState::PausedDownloading; - } - else if (m_session->isQueueingSystemEnabled() && isQueued() && !isChecking()) { - m_state = isSeed() ? TorrentState::QueuedUploading : TorrentState::QueuedDownloading; + if (isMoveInProgress()) { + m_state = TorrentState::Moving; + } + else if (hasMissingFiles()) { + m_state = TorrentState::MissingFiles; + } + else if (hasError()) { + m_state = TorrentState::Error; + } + else { + m_state = isSeed() ? TorrentState::PausedUploading : TorrentState::PausedDownloading; + } } else { - switch (m_nativeStatus.state) { - case lt::torrent_status::finished: - case lt::torrent_status::seeding: - if (isForced()) - m_state = TorrentState::ForcedUploading; - else - m_state = m_nativeStatus.upload_payload_rate > 0 ? TorrentState::Uploading : TorrentState::StalledUploading; - break; - case lt::torrent_status::downloading_metadata: - m_state = TorrentState::DownloadingMetadata; - break; - case lt::torrent_status::downloading: - if (isForced()) - m_state = TorrentState::ForcedDownloading; - else - m_state = m_nativeStatus.download_payload_rate > 0 ? TorrentState::Downloading : TorrentState::StalledDownloading; - break; - default: - qWarning("Unrecognized torrent status, should not happen!!! status was %d", m_nativeStatus.state); - m_state = TorrentState::Unknown; + if (m_nativeStatus.state == lt::torrent_status::checking_files) { + m_state = m_hasSeedStatus ? TorrentState::CheckingUploading : TorrentState::CheckingDownloading; + } + else if (m_nativeStatus.state == lt::torrent_status::allocating) { + m_state = TorrentState::Allocating; + } + else if (isMoveInProgress()) { + m_state = TorrentState::Moving; + } + else if (hasMissingFiles()) { + m_state = TorrentState::MissingFiles; + } + else if (hasError()) { + m_state = TorrentState::Error; + } + else if (m_session->isQueueingSystemEnabled() && isQueued() && !isChecking()) { + m_state = isSeed() ? TorrentState::QueuedUploading : TorrentState::QueuedDownloading; + } + else { + switch (m_nativeStatus.state) { + case lt::torrent_status::finished: + case lt::torrent_status::seeding: + if (isForced()) + m_state = TorrentState::ForcedUploading; + else + m_state = m_nativeStatus.upload_payload_rate > 0 ? TorrentState::Uploading : TorrentState::StalledUploading; + break; + case lt::torrent_status::downloading_metadata: + m_state = TorrentState::DownloadingMetadata; + break; + case lt::torrent_status::downloading: + if (isForced()) + m_state = TorrentState::ForcedDownloading; + else + m_state = m_nativeStatus.download_payload_rate > 0 ? TorrentState::Downloading : TorrentState::StalledDownloading; + break; + default: + qWarning("Unrecognized torrent status, should not happen!!! status was %d", m_nativeStatus.state); + m_state = TorrentState::Unknown; + } } } }