diff --git a/src/base/bittorrent/session.cpp b/src/base/bittorrent/session.cpp index 6ccbab306..000a8ce9c 100644 --- a/src/base/bittorrent/session.cpp +++ b/src/base/bittorrent/session.cpp @@ -4253,21 +4253,21 @@ bool Session::loadTorrentResumeData(const QByteArray &data, const TorrentInfo &m if (metadata.isValid()) p.ti = metadata.nativeInfo(); - torrentParams.paused = (p.flags & lt::torrent_flags::paused) && !(p.flags & lt::torrent_flags::auto_managed); - if (!torrentParams.paused) + if (p.flags & lt::torrent_flags::stop_when_ready) { // If torrent has "stop_when_ready" flag set then it is actually "stopped" - // but temporarily "resumed" to perform some service jobs (e.g. checking) - torrentParams.paused = !!(p.flags & lt::torrent_flags::stop_when_ready); + torrentParams.paused = true; + torrentParams.forced = false; + // ...but temporarily "resumed" to perform some service jobs (e.g. checking) + p.flags &= ~lt::torrent_flags::paused; + p.flags |= lt::torrent_flags::auto_managed; } else { - // Fix inconsistent state when "paused" torrent has "stop_when_ready" flag set - p.flags &= ~lt::torrent_flags::stop_when_ready; + torrentParams.paused = (p.flags & lt::torrent_flags::paused) && !(p.flags & lt::torrent_flags::auto_managed); + torrentParams.forced = !(p.flags & lt::torrent_flags::paused) && !(p.flags & lt::torrent_flags::auto_managed); } - torrentParams.forced = !(p.flags & lt::torrent_flags::paused) && !(p.flags & lt::torrent_flags::auto_managed); - const bool hasMetadata = (p.ti && p.ti->is_valid()); if (!hasMetadata && !root.dict_find("info-hash")) { diff --git a/src/base/bittorrent/torrenthandleimpl.cpp b/src/base/bittorrent/torrenthandleimpl.cpp index 83ca01d82..3cc6f783c 100644 --- a/src/base/bittorrent/torrenthandleimpl.cpp +++ b/src/base/bittorrent/torrenthandleimpl.cpp @@ -1325,6 +1325,7 @@ void TorrentHandleImpl::endReceivedMetadataHandling(const QString &savePath, con m_nativeHandle = m_nativeSession->add_torrent(p); m_nativeHandle.queue_position_set(queuePos); + m_torrentInfo = TorrentInfo {m_nativeHandle.torrent_file()}; // If first/last piece priority was specified when adding this torrent, // we should apply it now that we have metadata: if (m_hasFirstLastPiecePriority) @@ -1337,7 +1338,6 @@ void TorrentHandleImpl::endReceivedMetadataHandling(const QString &savePath, con m_nativeHandle.resume(); } - m_torrentInfo = TorrentInfo {m_nativeHandle.torrent_file()}; m_maintenanceJob = MaintenanceJob::None; updateStatus(); @@ -1485,11 +1485,10 @@ void TorrentHandleImpl::handleTorrentCheckedAlert(const lt::torrent_checked_aler return; } + saveResumeData(); + if (m_fastresumeDataRejected && !m_hasMissingFiles) - { - saveResumeData(); m_fastresumeDataRejected = false; - } updateStatus(); @@ -1554,7 +1553,12 @@ void TorrentHandleImpl::handleSaveResumeDataAlert(const lt::save_resume_data_ale m_ltAddTorrentParams = p->params; } - if (!m_isStopped) + if (m_isStopped) + { + m_ltAddTorrentParams.flags |= lt::torrent_flags::paused; + m_ltAddTorrentParams.flags &= ~lt::torrent_flags::auto_managed; + } + else { // Torrent can be actually "running" but temporarily "paused" to perform some // service jobs behind the scenes so we need to restore it as "running" @@ -1984,7 +1988,7 @@ void TorrentHandleImpl::prioritizeFiles(const QVector &priorit if ((oldPriorities[i] == DownloadPriority::Ignored) && (priorities[i] > DownloadPriority::Ignored) && (progress[i] < 1.0)) - { + { m_hasSeedStatus = false; break; }