mirror of
https://github.com/qbittorrent/qBittorrent.git
synced 2024-12-21 08:09:35 +08:00
parent
4539c679d9
commit
20206ec92a
@ -1728,18 +1728,9 @@ bool Session::cancelLoadMetadata(const InfoHash &hash)
|
||||
if (loadedMetadataIter == m_loadedMetadata.end()) return false;
|
||||
|
||||
m_loadedMetadata.erase(loadedMetadataIter);
|
||||
const lt::torrent_handle torrent = m_nativeSession->find_torrent(hash);
|
||||
if (!torrent.is_valid()) return false;
|
||||
|
||||
if (!torrent.status(lt::status_flags_t {0}).has_metadata) {
|
||||
// if hidden torrent is still loading metadata...
|
||||
--m_extraLimit;
|
||||
adjustLimits();
|
||||
}
|
||||
|
||||
// Remove it from session
|
||||
m_nativeSession->remove_torrent(torrent, lt::session::delete_files);
|
||||
qDebug("Preloaded torrent deleted.");
|
||||
--m_extraLimit;
|
||||
adjustLimits();
|
||||
m_nativeSession->remove_torrent(m_nativeSession->find_torrent(hash), lt::session::delete_files);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -1787,7 +1778,7 @@ void Session::decreaseTorrentsQueuePos(const QVector<InfoHash> &hashes)
|
||||
}
|
||||
|
||||
for (auto i = m_loadedMetadata.cbegin(); i != m_loadedMetadata.cend(); ++i)
|
||||
torrentQueuePositionBottom(m_nativeSession->find_torrent(i.key()));
|
||||
torrentQueuePositionBottom(m_nativeSession->find_torrent(*i));
|
||||
|
||||
saveTorrentsQueue();
|
||||
}
|
||||
@ -1836,7 +1827,7 @@ void Session::bottomTorrentsQueuePos(const QVector<InfoHash> &hashes)
|
||||
}
|
||||
|
||||
for (auto i = m_loadedMetadata.cbegin(); i != m_loadedMetadata.cend(); ++i)
|
||||
torrentQueuePositionBottom(m_nativeSession->find_torrent(i.key()));
|
||||
torrentQueuePositionBottom(m_nativeSession->find_torrent(*i));
|
||||
|
||||
saveTorrentsQueue();
|
||||
}
|
||||
@ -1891,42 +1882,14 @@ bool Session::addTorrent(const MagnetUri &magnetUri, const AddTorrentParams &par
|
||||
|
||||
const auto it = m_loadedMetadata.constFind(hash);
|
||||
if (it != m_loadedMetadata.constEnd()) {
|
||||
// Adding preloaded torrent...
|
||||
const TorrentInfo metadata = it->metadata;
|
||||
if (metadata.isValid()) {
|
||||
// Metadata is received and torrent_handle is being deleted
|
||||
// so we can't reuse it. Just add torrent using its metadata.
|
||||
return addTorrent(metadata, params);
|
||||
}
|
||||
|
||||
// Reuse existing torrent_handle
|
||||
lt::torrent_handle handle = m_nativeSession->find_torrent(hash);
|
||||
|
||||
// Preloaded torrent is in "Upload mode" so we need to disable it
|
||||
// otherwise the torrent never be downloaded (until application restart)
|
||||
handle.unset_flags(lt::torrent_flags::upload_mode);
|
||||
|
||||
LoadTorrentParams createTorrentParams = initLoadTorrentParams(params);
|
||||
createTorrentParams.ltAddTorrentParams = it->ltAddTorrentParams;
|
||||
|
||||
if (createTorrentParams.paused) {
|
||||
// Preloaded torrent isn't auto managed already
|
||||
handle.pause();
|
||||
}
|
||||
else if (!createTorrentParams.forced) {
|
||||
handle.set_flags(lt::torrent_flags::auto_managed);
|
||||
handle.pause();
|
||||
}
|
||||
|
||||
m_loadedMetadata.remove(hash);
|
||||
m_loadingTorrents.insert(hash, createTorrentParams);
|
||||
|
||||
// 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();
|
||||
|
||||
// use common last step of torrent loading
|
||||
createTorrentHandle(handle);
|
||||
return true;
|
||||
m_nativeSession->remove_torrent(m_nativeSession->find_torrent(hash), lt::session::delete_files);
|
||||
}
|
||||
|
||||
return addTorrent_impl(params, magnetUri);
|
||||
@ -2034,6 +1997,10 @@ bool Session::addTorrent_impl(const AddTorrentParams &addTorrentParams, const Ma
|
||||
}
|
||||
else {
|
||||
p = magnetUri.addTorrentParams();
|
||||
|
||||
if (loadTorrentParams.name.isEmpty() && !p.name.empty())
|
||||
loadTorrentParams.name = QString::fromStdString(p.name);
|
||||
|
||||
if (isTempPathEnabled())
|
||||
actualSavePath = tempPath();
|
||||
}
|
||||
@ -2164,7 +2131,7 @@ bool Session::loadMetadata(const MagnetUri &magnetUri)
|
||||
if (ec) return false;
|
||||
|
||||
// waiting for metadata...
|
||||
m_loadedMetadata.insert(h.info_hash(), {p, TorrentInfo {}});
|
||||
m_loadedMetadata.insert(h.info_hash());
|
||||
++m_extraLimit;
|
||||
adjustLimits();
|
||||
|
||||
@ -3953,6 +3920,10 @@ bool Session::loadTorrentResumeData(const QByteArray &data, const TorrentInfo &m
|
||||
const lt::bdecode_node addedTimeNode = root.dict_find("qBt-addedTime");
|
||||
if (addedTimeNode.type() == lt::bdecode_node::int_t)
|
||||
p.added_time = addedTimeNode.int_value();
|
||||
|
||||
if (torrentParams.name.isEmpty() && !p.name.empty())
|
||||
torrentParams.name = QString::fromStdString(p.name);
|
||||
|
||||
}
|
||||
// === END DEPRECATED CODE === //
|
||||
else {
|
||||
@ -4291,12 +4262,6 @@ void Session::handleTorrentRemovedAlert(const lt::torrent_removed_alert *p)
|
||||
{
|
||||
const InfoHash infoHash {p->info_hash};
|
||||
|
||||
const auto loadedMetadataIter = m_loadedMetadata.find(infoHash);
|
||||
if (loadedMetadataIter != m_loadedMetadata.end()) {
|
||||
emit metadataLoaded(loadedMetadataIter->metadata);
|
||||
m_loadedMetadata.erase(loadedMetadataIter);
|
||||
}
|
||||
|
||||
const auto removingTorrentDataIter = m_removingTorrents.find(infoHash);
|
||||
if (removingTorrentDataIter != m_removingTorrents.end()) {
|
||||
if (removingTorrentDataIter->deleteOption == Torrent) {
|
||||
@ -4348,10 +4313,14 @@ void Session::handleMetadataReceivedAlert(const lt::metadata_received_alert *p)
|
||||
const auto loadedMetadataIter = m_loadedMetadata.find(hash);
|
||||
|
||||
if (loadedMetadataIter != m_loadedMetadata.end()) {
|
||||
TorrentInfo metadata {p->handle.torrent_file()};
|
||||
|
||||
m_loadedMetadata.erase(loadedMetadataIter);
|
||||
--m_extraLimit;
|
||||
adjustLimits();
|
||||
loadedMetadataIter->metadata = TorrentInfo {p->handle.torrent_file()};
|
||||
m_nativeSession->remove_torrent(p->handle, lt::session::delete_files);
|
||||
|
||||
emit metadataLoaded(metadata);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -746,12 +746,7 @@ namespace BitTorrent
|
||||
QThread *m_ioThread = nullptr;
|
||||
ResumeDataSavingManager *m_resumeDataSavingManager = nullptr;
|
||||
|
||||
struct LoadedMetadataHandle
|
||||
{
|
||||
lt::add_torrent_params ltAddTorrentParams {};
|
||||
TorrentInfo metadata;
|
||||
};
|
||||
QHash<InfoHash, LoadedMetadataHandle> m_loadedMetadata;
|
||||
QSet<InfoHash> m_loadedMetadata;
|
||||
|
||||
QHash<InfoHash, TorrentHandleImpl *> m_torrents;
|
||||
QHash<InfoHash, LoadTorrentParams> m_loadingTorrents;
|
||||
|
@ -591,20 +591,20 @@ void AddNewTorrentDialog::reject()
|
||||
QDialog::reject();
|
||||
}
|
||||
|
||||
void AddNewTorrentDialog::updateMetadata(const BitTorrent::TorrentInfo &info)
|
||||
void AddNewTorrentDialog::updateMetadata(const BitTorrent::TorrentInfo &metadata)
|
||||
{
|
||||
if (info.hash() != m_hash) return;
|
||||
if (metadata.hash() != m_magnetURI.hash()) return;
|
||||
|
||||
disconnect(BitTorrent::Session::instance(), &BitTorrent::Session::metadataLoaded, this, &AddNewTorrentDialog::updateMetadata);
|
||||
|
||||
if (!info.isValid()) {
|
||||
if (!metadata.isValid()) {
|
||||
RaisedMessageBox::critical(this, tr("I/O Error"), ("Invalid metadata."));
|
||||
setMetadataProgressIndicator(false, tr("Invalid metadata"));
|
||||
return;
|
||||
}
|
||||
|
||||
// Good to go
|
||||
m_torrentInfo = info;
|
||||
m_torrentInfo = metadata;
|
||||
m_hasMetadata = true;
|
||||
setMetadataProgressIndicator(true, tr("Parsing metadata..."));
|
||||
|
||||
|
@ -82,7 +82,7 @@ private slots:
|
||||
void displayContentTreeMenu(const QPoint &);
|
||||
void updateDiskSpaceLabel();
|
||||
void onSavePathChanged(const QString &newPath);
|
||||
void updateMetadata(const BitTorrent::TorrentInfo &info);
|
||||
void updateMetadata(const BitTorrent::TorrentInfo &metadata);
|
||||
void handleDownloadFinished(const Net::DownloadResult &result);
|
||||
void TMMChanged(int index);
|
||||
void categoryChanged(int index);
|
||||
|
Loading…
Reference in New Issue
Block a user