diff --git a/src/base/bittorrent/sessionimpl.cpp b/src/base/bittorrent/sessionimpl.cpp index af55a76fc..700fa7588 100644 --- a/src/base/bittorrent/sessionimpl.cpp +++ b/src/base/bittorrent/sessionimpl.cpp @@ -4549,32 +4549,19 @@ void SessionImpl::handleTorrentFinished(TorrentImpl *const torrent) LogMsg(tr("Torrent download finished. Torrent: \"%1\"").arg(torrent->name())); emit torrentFinished(torrent); - qDebug("Checking if the torrent contains torrent files to download"); - // Check if there are torrent files inside + if (const Path exportPath = finishedTorrentExportDirectory(); !exportPath.isEmpty()) + exportTorrentFile(torrent, exportPath); + + // Check whether it contains .torrent files for (const Path &torrentRelpath : asConst(torrent->filePaths())) { if (torrentRelpath.hasExtension(u".torrent"_qs)) { - qDebug("Found possible recursive torrent download."); - const Path torrentFullpath = torrent->actualStorageLocation() / torrentRelpath; - qDebug("Full subtorrent path is %s", qUtf8Printable(torrentFullpath.toString())); - if (TorrentInfo::loadFromFile(torrentFullpath)) - { - qDebug("emitting recursiveTorrentDownloadPossible()"); - emit recursiveTorrentDownloadPossible(torrent); - break; - } - else - { - qDebug("Caught error loading torrent"); - LogMsg(tr("Unable to load torrent. File: \"%1\"").arg(torrentFullpath.toString()), Log::CRITICAL); - } + emit recursiveTorrentDownloadPossible(torrent); + break; } } - if (!finishedTorrentExportDirectory().isEmpty()) - exportTorrentFile(torrent, finishedTorrentExportDirectory()); - if (!hasUnfinishedTorrents()) emit allTorrentsFinished(); } @@ -4859,25 +4846,32 @@ void SessionImpl::disableIPFilter() void SessionImpl::recursiveTorrentDownload(const TorrentID &id) { - TorrentImpl *const torrent = m_torrents.value(id); - if (!torrent) return; + const TorrentImpl *torrent = m_torrents.value(id); + if (!torrent) + return; for (const Path &torrentRelpath : asConst(torrent->filePaths())) { if (torrentRelpath.hasExtension(u".torrent"_qs)) { - LogMsg(tr("Recursive download .torrent file within torrent. Source torrent: \"%1\". File: \"%2\"") - .arg(torrent->name(), torrentRelpath.toString())); const Path torrentFullpath = torrent->savePath() / torrentRelpath; + LogMsg(tr("Recursive download .torrent file within torrent. Source torrent: \"%1\". File: \"%2\"") + .arg(torrent->name(), torrentFullpath.toString())); + AddTorrentParams params; // Passing the save path along to the sub torrent file params.savePath = torrent->savePath(); const nonstd::expected loadResult = TorrentInfo::loadFromFile(torrentFullpath); if (loadResult) + { addTorrent(loadResult.value(), params); + } else - LogMsg(tr("Failed to load torrent. Error: \"%1\"").arg(loadResult.error()), Log::WARNING); + { + LogMsg(tr("Failed to load .torrent file within torrent. Source torrent: \"%1\". File: \"%2\". Error: \"%3\"") + .arg(torrent->name(), torrentFullpath.toString(), loadResult.error()), Log::WARNING); + } } } } diff --git a/src/base/bittorrent/torrentimpl.cpp b/src/base/bittorrent/torrentimpl.cpp index 8b31b3d6c..9231af8b3 100644 --- a/src/base/bittorrent/torrentimpl.cpp +++ b/src/base/bittorrent/torrentimpl.cpp @@ -1772,10 +1772,10 @@ void TorrentImpl::handleTorrentCheckedAlert(const lt::torrent_checked_alert *p) void TorrentImpl::handleTorrentFinishedAlert(const lt::torrent_finished_alert *p) { Q_UNUSED(p); - qDebug("Got a torrent finished alert for \"%s\"", qUtf8Printable(name())); - qDebug("Torrent has seed status: %s", m_hasSeedStatus ? "yes" : "no"); + m_hasMissingFiles = false; - if (m_hasSeedStatus) return; + if (m_hasSeedStatus) + return; m_statusUpdatedTriggers.enqueue([this]() { diff --git a/src/base/preferences.cpp b/src/base/preferences.cpp index b76198e93..59a601118 100644 --- a/src/base/preferences.cpp +++ b/src/base/preferences.cpp @@ -996,14 +996,14 @@ void Preferences::resolvePeerHostNames(const bool resolve) setValue(u"Preferences/Connection/ResolvePeerHostNames"_qs, resolve); } -bool Preferences::recursiveDownloadDisabled() const +bool Preferences::isRecursiveDownloadEnabled() const { - return value(u"Preferences/Advanced/DisableRecursiveDownload"_qs, false); + return !value(u"Preferences/Advanced/DisableRecursiveDownload"_qs, false); } -void Preferences::disableRecursiveDownload(const bool disable) +void Preferences::setRecursiveDownloadEnabled(const bool enable) { - setValue(u"Preferences/Advanced/DisableRecursiveDownload"_qs, disable); + setValue(u"Preferences/Advanced/DisableRecursiveDownload"_qs, !enable); } #ifdef Q_OS_WIN diff --git a/src/base/preferences.h b/src/base/preferences.h index 0915cf5d1..534755b77 100644 --- a/src/base/preferences.h +++ b/src/base/preferences.h @@ -281,8 +281,8 @@ public: void resolvePeerCountries(bool resolve); bool resolvePeerHostNames() const; void resolvePeerHostNames(bool resolve); - bool recursiveDownloadDisabled() const; - void disableRecursiveDownload(bool disable = true); + bool isRecursiveDownloadEnabled() const; + void setRecursiveDownloadEnabled(bool enable); #ifdef Q_OS_WIN bool neverCheckFileAssoc() const; void setNeverCheckFileAssoc(bool check = true); diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp index 3651cea15..002c6dff3 100644 --- a/src/gui/mainwindow.cpp +++ b/src/gui/mainwindow.cpp @@ -885,27 +885,33 @@ void MainWindow::displayExecutionLogTab() // End of keyboard shortcuts slots -void MainWindow::askRecursiveTorrentDownloadConfirmation(BitTorrent::Torrent *const torrent) +void MainWindow::askRecursiveTorrentDownloadConfirmation(const BitTorrent::Torrent *torrent) { - Preferences *const pref = Preferences::instance(); - if (pref->recursiveDownloadDisabled()) return; + if (!Preferences::instance()->isRecursiveDownloadEnabled()) + return; const auto torrentID = torrent->id(); QMessageBox *confirmBox = new QMessageBox(QMessageBox::Question, tr("Recursive download confirmation") - , tr("The torrent '%1' contains torrent files, do you want to proceed with their download?").arg(torrent->name()) - , QMessageBox::NoButton, this); + , tr("The torrent '%1' contains .torrent files, do you want to proceed with their downloads?").arg(torrent->name()) + , (QMessageBox::Yes | QMessageBox::No | QMessageBox::NoToAll), this); confirmBox->setAttribute(Qt::WA_DeleteOnClose); - const QPushButton *yes = confirmBox->addButton(tr("Yes"), QMessageBox::YesRole); - /*QPushButton *no = */ confirmBox->addButton(tr("No"), QMessageBox::NoRole); - const QPushButton *never = confirmBox->addButton(tr("Never"), QMessageBox::NoRole); - connect(confirmBox, &QMessageBox::buttonClicked, this, [torrentID, yes, never](const QAbstractButton *button) + const QAbstractButton *yesButton = confirmBox->button(QMessageBox::Yes); + QAbstractButton *neverButton = confirmBox->button(QMessageBox::NoToAll); + neverButton->setText(tr("Never")); + + connect(confirmBox, &QMessageBox::buttonClicked, this + , [torrentID, yesButton, neverButton](const QAbstractButton *button) { - if (button == yes) + if (button == yesButton) + { BitTorrent::Session::instance()->recursiveTorrentDownload(torrentID); - if (button == never) - Preferences::instance()->disableRecursiveDownload(); + } + else if (button == neverButton) + { + Preferences::instance()->setRecursiveDownloadEnabled(false); + } }); confirmBox->open(); } diff --git a/src/gui/mainwindow.h b/src/gui/mainwindow.h index 838395ad5..678c5637f 100644 --- a/src/gui/mainwindow.h +++ b/src/gui/mainwindow.h @@ -130,7 +130,7 @@ private slots: void reloadSessionStats(); void reloadTorrentStats(const QVector &torrents); void loadPreferences(); - void askRecursiveTorrentDownloadConfirmation(BitTorrent::Torrent *const torrent); + void askRecursiveTorrentDownloadConfirmation(const BitTorrent::Torrent *torrent); void optionsSaved(); void toggleAlternativeSpeeds(); diff --git a/src/gui/optionsdialog.cpp b/src/gui/optionsdialog.cpp index b6dbfd8bb..e86c81b89 100644 --- a/src/gui/optionsdialog.cpp +++ b/src/gui/optionsdialog.cpp @@ -546,7 +546,7 @@ void OptionsDialog::loadDownloadsTabOptions() m_ui->checkPreallocateAll->setChecked(session->isPreallocationEnabled()); m_ui->checkAppendqB->setChecked(session->isAppendExtensionEnabled()); - m_ui->checkRecursiveDownload->setChecked(!pref->recursiveDownloadDisabled()); + m_ui->checkRecursiveDownload->setChecked(pref->isRecursiveDownloadEnabled()); m_ui->comboSavingMode->setCurrentIndex(!session->isAutoTMMDisabledByDefault()); m_ui->comboTorrentCategoryChanged->setCurrentIndex(session->isDisableAutoTMMWhenCategoryChanged()); @@ -698,7 +698,7 @@ void OptionsDialog::saveDownloadsTabOptions() const session->setPreallocationEnabled(preAllocateAllFiles()); session->setAppendExtensionEnabled(m_ui->checkAppendqB->isChecked()); - pref->disableRecursiveDownload(!m_ui->checkRecursiveDownload->isChecked()); + pref->setRecursiveDownloadEnabled(m_ui->checkRecursiveDownload->isChecked()); session->setAutoTMMDisabledByDefault(m_ui->comboSavingMode->currentIndex() == 0); session->setDisableAutoTMMWhenCategoryChanged(m_ui->comboTorrentCategoryChanged->currentIndex() == 1);