mirror of
https://github.com/qbittorrent/qBittorrent.git
synced 2024-11-27 03:39:39 +03:00
Clean up metadata downloading code
This commit is contained in:
parent
82716d8014
commit
0e8feed2f2
3 changed files with 33 additions and 42 deletions
|
@ -1892,12 +1892,12 @@ bool Session::deleteTorrent(const InfoHash &hash, const DeleteOption deleteOptio
|
|||
return true;
|
||||
}
|
||||
|
||||
bool Session::cancelLoadMetadata(const InfoHash &hash)
|
||||
bool Session::cancelDownloadMetadata(const InfoHash &hash)
|
||||
{
|
||||
const auto loadedMetadataIter = m_loadedMetadata.find(hash);
|
||||
if (loadedMetadataIter == m_loadedMetadata.end()) return false;
|
||||
const auto downloadedMetadataIter = m_downloadedMetadata.find(hash);
|
||||
if (downloadedMetadataIter == m_downloadedMetadata.end()) return false;
|
||||
|
||||
m_loadedMetadata.erase(loadedMetadataIter);
|
||||
m_downloadedMetadata.erase(downloadedMetadataIter);
|
||||
--m_extraLimit;
|
||||
adjustLimits();
|
||||
m_nativeSession->remove_torrent(m_nativeSession->find_torrent(hash), lt::session::delete_files);
|
||||
|
@ -1951,7 +1951,7 @@ void Session::decreaseTorrentsQueuePos(const QVector<InfoHash> &hashes)
|
|||
torrentQueue.pop();
|
||||
}
|
||||
|
||||
for (auto i = m_loadedMetadata.cbegin(); i != m_loadedMetadata.cend(); ++i)
|
||||
for (auto i = m_downloadedMetadata.cbegin(); i != m_downloadedMetadata.cend(); ++i)
|
||||
torrentQueuePositionBottom(m_nativeSession->find_torrent(*i));
|
||||
|
||||
saveTorrentsQueue();
|
||||
|
@ -2004,7 +2004,7 @@ void Session::bottomTorrentsQueuePos(const QVector<InfoHash> &hashes)
|
|||
torrentQueue.pop();
|
||||
}
|
||||
|
||||
for (auto i = m_loadedMetadata.cbegin(); i != m_loadedMetadata.cend(); ++i)
|
||||
for (auto i = m_downloadedMetadata.cbegin(); i != m_downloadedMetadata.cend(); ++i)
|
||||
torrentQueuePositionBottom(m_nativeSession->find_torrent(*i));
|
||||
|
||||
saveTorrentsQueue();
|
||||
|
@ -2058,21 +2058,6 @@ bool Session::addTorrent(const MagnetUri &magnetUri, const AddTorrentParams &par
|
|||
{
|
||||
if (!magnetUri.isValid()) return false;
|
||||
|
||||
const InfoHash hash = magnetUri.hash();
|
||||
|
||||
const auto it = m_loadedMetadata.constFind(hash);
|
||||
if (it != m_loadedMetadata.constEnd())
|
||||
{
|
||||
// It looks illogical that we don't just use an existing handle,
|
||||
// but as previous experience has shown, it actually creates unnecessary
|
||||
// problems and unwanted behavior due to the fact that it was originally
|
||||
// added with parameters other than those provided by the user.
|
||||
m_loadedMetadata.erase(it);
|
||||
--m_extraLimit;
|
||||
adjustLimits();
|
||||
m_nativeSession->remove_torrent(m_nativeSession->find_torrent(hash), lt::session::delete_files);
|
||||
}
|
||||
|
||||
return addTorrent_impl(params, magnetUri);
|
||||
}
|
||||
|
||||
|
@ -2113,7 +2098,7 @@ LoadTorrentParams Session::initLoadTorrentParams(const AddTorrentParams &addTorr
|
|||
|
||||
const QString category = addTorrentParams.category;
|
||||
if (!category.isEmpty() && !m_categories.contains(category) && !addCategory(category))
|
||||
loadTorrentParams.category = "";
|
||||
loadTorrentParams.category = "";
|
||||
else
|
||||
loadTorrentParams.category = addTorrentParams.category;
|
||||
|
||||
|
@ -2126,9 +2111,15 @@ bool Session::addTorrent_impl(const AddTorrentParams &addTorrentParams, const Ma
|
|||
const bool hasMetadata = metadata.isValid();
|
||||
const InfoHash hash = (hasMetadata ? metadata.hash() : magnetUri.hash());
|
||||
|
||||
// It looks illogical that we don't just use an existing handle,
|
||||
// but as previous experience has shown, it actually creates unnecessary
|
||||
// problems and unwanted behavior due to the fact that it was originally
|
||||
// added with parameters other than those provided by the user.
|
||||
cancelDownloadMetadata(hash);
|
||||
|
||||
// We should not add the torrent if it is already
|
||||
// processed or is pending to add to session
|
||||
if (m_loadingTorrents.contains(hash) || m_loadedMetadata.contains(hash))
|
||||
if (m_loadingTorrents.contains(hash))
|
||||
return false;
|
||||
|
||||
TorrentHandleImpl *const torrent = m_torrents.value(hash);
|
||||
|
@ -2276,9 +2267,9 @@ bool Session::findIncompleteFiles(TorrentInfo &torrentInfo, QString &savePath) c
|
|||
return found;
|
||||
}
|
||||
|
||||
// Add a torrent to the BitTorrent session in hidden mode
|
||||
// and force it to load its metadata
|
||||
bool Session::loadMetadata(const MagnetUri &magnetUri)
|
||||
// Add a torrent to libtorrent session in hidden mode
|
||||
// and force it to download its metadata
|
||||
bool Session::downloadMetadata(const MagnetUri &magnetUri)
|
||||
{
|
||||
if (!magnetUri.isValid()) return false;
|
||||
|
||||
|
@ -2289,7 +2280,7 @@ bool Session::loadMetadata(const MagnetUri &magnetUri)
|
|||
// processed or adding to session
|
||||
if (m_torrents.contains(hash)) return false;
|
||||
if (m_loadingTorrents.contains(hash)) return false;
|
||||
if (m_loadedMetadata.contains(hash)) return false;
|
||||
if (m_downloadedMetadata.contains(hash)) return false;
|
||||
|
||||
qDebug("Adding torrent to preload metadata...");
|
||||
qDebug(" -> Hash: %s", qUtf8Printable(hash));
|
||||
|
@ -2322,13 +2313,13 @@ bool Session::loadMetadata(const MagnetUri &magnetUri)
|
|||
p.storage = customStorageConstructor;
|
||||
#endif
|
||||
|
||||
// Adding torrent to BitTorrent session
|
||||
// Adding torrent to libtorrent session
|
||||
lt::error_code ec;
|
||||
lt::torrent_handle h = m_nativeSession->add_torrent(p, ec);
|
||||
if (ec) return false;
|
||||
|
||||
// waiting for metadata...
|
||||
m_loadedMetadata.insert(h.info_hash());
|
||||
m_downloadedMetadata.insert(h.info_hash());
|
||||
++m_extraLimit;
|
||||
adjustLimits();
|
||||
|
||||
|
@ -3775,7 +3766,7 @@ bool Session::isKnownTorrent(const InfoHash &hash) const
|
|||
{
|
||||
return (m_torrents.contains(hash)
|
||||
|| m_loadingTorrents.contains(hash)
|
||||
|| m_loadedMetadata.contains(hash));
|
||||
|| m_downloadedMetadata.contains(hash));
|
||||
}
|
||||
|
||||
void Session::updateSeedingLimitTimer()
|
||||
|
@ -4724,18 +4715,18 @@ void Session::handleTorrentDeleteFailedAlert(const lt::torrent_delete_failed_ale
|
|||
void Session::handleMetadataReceivedAlert(const lt::metadata_received_alert *p)
|
||||
{
|
||||
const InfoHash hash {p->handle.info_hash()};
|
||||
const auto loadedMetadataIter = m_loadedMetadata.find(hash);
|
||||
const auto downloadedMetadataIter = m_downloadedMetadata.find(hash);
|
||||
|
||||
if (loadedMetadataIter != m_loadedMetadata.end())
|
||||
if (downloadedMetadataIter != m_downloadedMetadata.end())
|
||||
{
|
||||
TorrentInfo metadata {p->handle.torrent_file()};
|
||||
|
||||
m_loadedMetadata.erase(loadedMetadataIter);
|
||||
m_downloadedMetadata.erase(downloadedMetadataIter);
|
||||
--m_extraLimit;
|
||||
adjustLimits();
|
||||
m_nativeSession->remove_torrent(p->handle, lt::session::delete_files);
|
||||
|
||||
emit metadataLoaded(metadata);
|
||||
emit metadataDownloaded(metadata);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -453,8 +453,8 @@ namespace BitTorrent
|
|||
bool addTorrent(const MagnetUri &magnetUri, const AddTorrentParams ¶ms = AddTorrentParams());
|
||||
bool addTorrent(const TorrentInfo &torrentInfo, const AddTorrentParams ¶ms = AddTorrentParams());
|
||||
bool deleteTorrent(const InfoHash &hash, DeleteOption deleteOption = Torrent);
|
||||
bool loadMetadata(const MagnetUri &magnetUri);
|
||||
bool cancelLoadMetadata(const InfoHash &hash);
|
||||
bool downloadMetadata(const MagnetUri &magnetUri);
|
||||
bool cancelDownloadMetadata(const InfoHash &hash);
|
||||
|
||||
void recursiveTorrentDownload(const InfoHash &hash);
|
||||
void increaseTorrentsQueuePos(const QVector<InfoHash> &hashes);
|
||||
|
@ -497,7 +497,7 @@ namespace BitTorrent
|
|||
void fullDiskError(TorrentHandle *torrent, const QString &msg);
|
||||
void IPFilterParsed(bool error, int ruleCount);
|
||||
void loadTorrentFailed(const QString &error);
|
||||
void metadataLoaded(const TorrentInfo &info);
|
||||
void metadataDownloaded(const TorrentInfo &info);
|
||||
void recursiveTorrentDownloadPossible(TorrentHandle *torrent);
|
||||
void speedLimitModeChanged(bool alternative);
|
||||
void statsUpdated();
|
||||
|
@ -764,7 +764,7 @@ namespace BitTorrent
|
|||
QThread *m_ioThread = nullptr;
|
||||
ResumeDataSavingManager *m_resumeDataSavingManager = nullptr;
|
||||
|
||||
QSet<InfoHash> m_loadedMetadata;
|
||||
QSet<InfoHash> m_downloadedMetadata;
|
||||
|
||||
QHash<InfoHash, TorrentHandleImpl *> m_torrents;
|
||||
QHash<InfoHash, LoadTorrentParams> m_loadingTorrents;
|
||||
|
|
|
@ -347,7 +347,7 @@ bool AddNewTorrentDialog::loadMagnet(const BitTorrent::MagnetUri &magnetUri)
|
|||
return false;
|
||||
}
|
||||
|
||||
connect(BitTorrent::Session::instance(), &BitTorrent::Session::metadataLoaded, this, &AddNewTorrentDialog::updateMetadata);
|
||||
connect(BitTorrent::Session::instance(), &BitTorrent::Session::metadataDownloaded, this, &AddNewTorrentDialog::updateMetadata);
|
||||
|
||||
// Set dialog title
|
||||
const QString torrentName = magnetUri.name();
|
||||
|
@ -356,7 +356,7 @@ bool AddNewTorrentDialog::loadMagnet(const BitTorrent::MagnetUri &magnetUri)
|
|||
setupTreeview();
|
||||
TMMChanged(m_ui->comboTTM->currentIndex());
|
||||
|
||||
BitTorrent::Session::instance()->loadMetadata(magnetUri);
|
||||
BitTorrent::Session::instance()->downloadMetadata(magnetUri);
|
||||
setMetadataProgressIndicator(true, tr("Retrieving metadata..."));
|
||||
m_ui->labelHashData->setText(infoHash);
|
||||
|
||||
|
@ -613,7 +613,7 @@ void AddNewTorrentDialog::reject()
|
|||
if (!m_hasMetadata)
|
||||
{
|
||||
setMetadataProgressIndicator(false);
|
||||
BitTorrent::Session::instance()->cancelLoadMetadata(m_magnetURI.hash());
|
||||
BitTorrent::Session::instance()->cancelDownloadMetadata(m_magnetURI.hash());
|
||||
}
|
||||
|
||||
QDialog::reject();
|
||||
|
@ -623,7 +623,7 @@ void AddNewTorrentDialog::updateMetadata(const BitTorrent::TorrentInfo &metadata
|
|||
{
|
||||
if (metadata.hash() != m_magnetURI.hash()) return;
|
||||
|
||||
disconnect(BitTorrent::Session::instance(), &BitTorrent::Session::metadataLoaded, this, &AddNewTorrentDialog::updateMetadata);
|
||||
disconnect(BitTorrent::Session::instance(), &BitTorrent::Session::metadataDownloaded, this, &AddNewTorrentDialog::updateMetadata);
|
||||
|
||||
if (!metadata.isValid())
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue