From fe34749cfe1b6e6779023bfb762eff56318352a5 Mon Sep 17 00:00:00 2001 From: Vladimir Golovnev Date: Thu, 1 Sep 2022 06:53:29 +0300 Subject: [PATCH] Proactively append extension to incomplete files PR #17631. --- src/base/bittorrent/filesearcher.cpp | 22 +++++++++++++++------- src/base/bittorrent/filesearcher.h | 2 +- src/base/bittorrent/sessionimpl.cpp | 9 ++++++--- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/base/bittorrent/filesearcher.cpp b/src/base/bittorrent/filesearcher.cpp index fbf7070b2..2fcd31f8f 100644 --- a/src/base/bittorrent/filesearcher.cpp +++ b/src/base/bittorrent/filesearcher.cpp @@ -31,9 +31,9 @@ #include "base/bittorrent/infohash.h" void FileSearcher::search(const BitTorrent::TorrentID &id, const PathList &originalFileNames - , const Path &savePath, const Path &downloadPath) + , const Path &savePath, const Path &downloadPath, const bool forceAppendExt) { - const auto findInDir = [](const Path &dirPath, PathList &fileNames) -> bool + const auto findInDir = [](const Path &dirPath, PathList &fileNames, const bool forceAppendExt) -> bool { bool found = false; for (Path &fileName : fileNames) @@ -42,10 +42,18 @@ void FileSearcher::search(const BitTorrent::TorrentID &id, const PathList &origi { found = true; } - else if ((dirPath / fileName + QB_EXT).exists()) + else { - found = true; - fileName = fileName + QB_EXT; + const Path incompleteFilename = fileName + QB_EXT; + if ((dirPath / incompleteFilename).exists()) + { + found = true; + fileName = incompleteFilename; + } + else if (forceAppendExt) + { + fileName = incompleteFilename; + } } } @@ -54,11 +62,11 @@ void FileSearcher::search(const BitTorrent::TorrentID &id, const PathList &origi Path usedPath = savePath; PathList adjustedFileNames = originalFileNames; - const bool found = findInDir(usedPath, adjustedFileNames); + const bool found = findInDir(usedPath, adjustedFileNames, (forceAppendExt && downloadPath.isEmpty())); if (!found && !downloadPath.isEmpty()) { usedPath = downloadPath; - findInDir(usedPath, adjustedFileNames); + findInDir(usedPath, adjustedFileNames, forceAppendExt); } emit searchFinished(id, usedPath, adjustedFileNames); diff --git a/src/base/bittorrent/filesearcher.h b/src/base/bittorrent/filesearcher.h index bcdc6bdfe..04495bd76 100644 --- a/src/base/bittorrent/filesearcher.h +++ b/src/base/bittorrent/filesearcher.h @@ -47,7 +47,7 @@ public: public slots: void search(const BitTorrent::TorrentID &id, const PathList &originalFileNames - , const Path &savePath, const Path &downloadPath); + , const Path &savePath, const Path &downloadPath, bool forceAppendExt); signals: void searchFinished(const BitTorrent::TorrentID &id, const Path &savePath, const PathList &fileNames); diff --git a/src/base/bittorrent/sessionimpl.cpp b/src/base/bittorrent/sessionimpl.cpp index 6005e8158..ec6ac9595 100644 --- a/src/base/bittorrent/sessionimpl.cpp +++ b/src/base/bittorrent/sessionimpl.cpp @@ -2606,8 +2606,11 @@ bool SessionImpl::addTorrent_impl(const std::variant &so } const auto nativeIndexes = torrentInfo.nativeIndexes(); - for (int index = 0; index < filePaths.size(); ++index) - p.renamed_files[nativeIndexes[index]] = filePaths.at(index).toString().toStdString(); + if (!isFindingIncompleteFiles) + { + for (int index = 0; index < filePaths.size(); ++index) + p.renamed_files[nativeIndexes[index]] = filePaths.at(index).toString().toStdString(); + } Q_ASSERT(p.file_priorities.empty()); Q_ASSERT(addTorrentParams.filePriorities.isEmpty() || (addTorrentParams.filePriorities.size() == nativeIndexes.size())); @@ -2715,7 +2718,7 @@ void SessionImpl::findIncompleteFiles(const TorrentInfo &torrentInfo, const Path const PathList originalFileNames = (filePaths.isEmpty() ? torrentInfo.filePaths() : filePaths); QMetaObject::invokeMethod(m_fileSearcher, [=]() { - m_fileSearcher->search(searchId, originalFileNames, savePath, downloadPath); + m_fileSearcher->search(searchId, originalFileNames, savePath, downloadPath, isAppendExtensionEnabled()); }); }