From c740d105c97415abfb2c2d6e929ef67454fe9f2d Mon Sep 17 00:00:00 2001 From: "Vladimir Golovnev (Glassez)" Date: Fri, 22 Apr 2022 12:40:31 +0300 Subject: [PATCH] Don't force update torrent status --- src/base/bittorrent/session.cpp | 15 ++++++++------- src/base/bittorrent/session.h | 2 +- src/base/bittorrent/torrentimpl.cpp | 18 ++++++++---------- src/base/bittorrent/torrentimpl.h | 3 +-- 4 files changed, 18 insertions(+), 20 deletions(-) diff --git a/src/base/bittorrent/session.cpp b/src/base/bittorrent/session.cpp index c1e8dcc98..402fdace5 100644 --- a/src/base/bittorrent/session.cpp +++ b/src/base/bittorrent/session.cpp @@ -4256,7 +4256,7 @@ bool Session::addMoveTorrentStorageJob(TorrentImpl *torrent, const Path &newPath }); const bool torrentHasOutstandingJob = (iter != m_moveStorageQueue.end()); - torrent->handleMoveStorageJobFinished(torrentHasOutstandingJob); + torrent->handleMoveStorageJobFinished(currentLocation, torrentHasOutstandingJob); } } @@ -4307,7 +4307,7 @@ void Session::moveTorrentStorage(const MoveStorageJob &job) const ? lt::move_flags_t::always_replace_files : lt::move_flags_t::dont_replace)); } -void Session::handleMoveTorrentStorageJobFinished() +void Session::handleMoveTorrentStorageJobFinished(const Path &newPath) { const MoveStorageJob finishedJob = m_moveStorageQueue.takeFirst(); if (!m_moveStorageQueue.isEmpty()) @@ -4324,7 +4324,7 @@ void Session::handleMoveTorrentStorageJobFinished() TorrentImpl *torrent = m_torrents.value(finishedJob.torrentHandle.info_hash()); if (torrent) { - torrent->handleMoveStorageJobFinished(torrentHasOutstandingJob); + torrent->handleMoveStorageJobFinished(newPath, torrentHasOutstandingJob); } else if (!torrentHasOutstandingJob) { @@ -5295,7 +5295,7 @@ void Session::handleStorageMovedAlert(const lt::storage_moved_alert *p) const QString torrentName = (torrent ? torrent->name() : id.toString()); LogMsg(tr("Moved torrent successfully. Torrent: \"%1\". Destination: \"%2\"").arg(torrentName, newPath.toString())); - handleMoveTorrentStorageJobFinished(); + handleMoveTorrentStorageJobFinished(newPath); } void Session::handleStorageMovedFailedAlert(const lt::storage_moved_failed_alert *p) @@ -5313,12 +5313,13 @@ void Session::handleStorageMovedFailedAlert(const lt::storage_moved_failed_alert TorrentImpl *torrent = m_torrents.value(id); const QString torrentName = (torrent ? torrent->name() : id.toString()); - const QString currentLocation = QString::fromStdString(p->handle.status(lt::torrent_handle::query_save_path).save_path); + const Path currentLocation = (torrent ? torrent->actualStorageLocation() + : Path(p->handle.status(lt::torrent_handle::query_save_path).save_path)); const QString errorMessage = QString::fromStdString(p->message()); LogMsg(tr("Failed to move torrent. Torrent: \"%1\". Source: \"%2\". Destination: \"%3\". Reason: \"%4\"") - .arg(torrentName, currentLocation, currentJob.path.toString(), errorMessage), Log::WARNING); + .arg(torrentName, currentLocation.toString(), currentJob.path.toString(), errorMessage), Log::WARNING); - handleMoveTorrentStorageJobFinished(); + handleMoveTorrentStorageJobFinished(currentLocation); } void Session::handleStateUpdateAlert(const lt::state_update_alert *p) diff --git a/src/base/bittorrent/session.h b/src/base/bittorrent/session.h index 7f8a99033..fe8f8b4ec 100644 --- a/src/base/bittorrent/session.h +++ b/src/base/bittorrent/session.h @@ -661,7 +661,7 @@ namespace BitTorrent std::vector getPendingAlerts(lt::time_duration time = lt::time_duration::zero()) const; void moveTorrentStorage(const MoveStorageJob &job) const; - void handleMoveTorrentStorageJobFinished(); + void handleMoveTorrentStorageJobFinished(const Path &newPath); void loadCategories(); void storeCategories() const; diff --git a/src/base/bittorrent/torrentimpl.cpp b/src/base/bittorrent/torrentimpl.cpp index de2b7d0d8..2dba2e98e 100644 --- a/src/base/bittorrent/torrentimpl.cpp +++ b/src/base/bittorrent/torrentimpl.cpp @@ -1654,7 +1654,7 @@ void TorrentImpl::moveStorage(const Path &newPath, const MoveStorageMode mode) if (m_session->addMoveTorrentStorageJob(this, newPath, mode)) { m_storageIsMoving = true; - updateStatus(); + updateState(); } } @@ -1670,13 +1670,16 @@ void TorrentImpl::handleStateUpdate(const lt::torrent_status &nativeStatus) updateStatus(nativeStatus); } -void TorrentImpl::handleMoveStorageJobFinished(const bool hasOutstandingJob) +void TorrentImpl::handleMoveStorageJobFinished(const Path &path, const bool hasOutstandingJob) { m_session->handleTorrentNeedSaveResumeData(this); m_storageIsMoving = hasOutstandingJob; - updateStatus(); - m_session->handleTorrentSavePathChanged(this); + if (actualStorageLocation() != path) + { + m_nativeStatus.save_path = path.toString().toStdString(); + m_session->handleTorrentSavePathChanged(this); + } if (!m_storageIsMoving) { @@ -1690,7 +1693,7 @@ void TorrentImpl::handleMoveStorageJobFinished(const bool hasOutstandingJob) } while ((m_renameCount == 0) && !m_moveFinishedTriggers.isEmpty()) - m_moveFinishedTriggers.takeFirst()(); + std::invoke(m_moveFinishedTriggers.dequeue()); } } @@ -2106,11 +2109,6 @@ bool TorrentImpl::isMoveInProgress() const return m_storageIsMoving; } -void TorrentImpl::updateStatus() -{ - updateStatus(m_nativeHandle.status()); -} - void TorrentImpl::updateStatus(const lt::torrent_status &nativeStatus) { m_pieces.clear(); diff --git a/src/base/bittorrent/torrentimpl.h b/src/base/bittorrent/torrentimpl.h index 6f9c904c4..38da742d4 100644 --- a/src/base/bittorrent/torrentimpl.h +++ b/src/base/bittorrent/torrentimpl.h @@ -239,14 +239,13 @@ namespace BitTorrent void handleCategoryOptionsChanged(); void handleAppendExtensionToggled(); void saveResumeData(); - void handleMoveStorageJobFinished(bool hasOutstandingJob); + void handleMoveStorageJobFinished(const Path &path, bool hasOutstandingJob); void fileSearchFinished(const Path &savePath, const PathList &fileNames); void updatePeerCount(const QString &trackerUrl, const lt::tcp::endpoint &endpoint, int count); private: using EventTrigger = std::function; - void updateStatus(); void updateStatus(const lt::torrent_status &nativeStatus); void updateState();