From 5c0d9b7eab8d27823bee068b71db1f69878034e4 Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Wed, 13 Feb 2019 22:41:38 +0800 Subject: [PATCH] Load torrent from data directly --- src/gui/addnewtorrentdialog.cpp | 74 +++++++++++++++++---------------- src/gui/addnewtorrentdialog.h | 6 +-- 2 files changed, 41 insertions(+), 39 deletions(-) diff --git a/src/gui/addnewtorrentdialog.cpp b/src/gui/addnewtorrentdialog.cpp index 5d126ab31..ee389dbdd 100644 --- a/src/gui/addnewtorrentdialog.cpp +++ b/src/gui/addnewtorrentdialog.cpp @@ -102,6 +102,10 @@ AddNewTorrentDialog::AddNewTorrentDialog(const BitTorrent::AddTorrentParams &inP m_ui->savePath->setDialogCaption(tr("Choose save path")); m_ui->savePath->setMaxVisibleItems(20); +#ifdef Q_OS_MAC + setModal(true); +#endif + auto session = BitTorrent::Session::instance(); if (m_torrentParams.addPaused == TriStateBool::True) @@ -233,10 +237,9 @@ void AddNewTorrentDialog::show(const QString &source, const BitTorrent::AddTorre if (Net::DownloadManager::hasSupportedScheme(source)) { // Launch downloader - // TODO: Don't save loaded torrent to file, just use downloaded data! Net::DownloadHandler *handler = Net::DownloadManager::instance()->download( - Net::DownloadRequest(source).limit(10485760 /* 10MB */).handleRedirectToMagnet(true).saveToFile(true)); - connect(handler, static_cast(&Net::DownloadHandler::downloadFinished) + Net::DownloadRequest(source).limit(10485760 /* 10MB */).handleRedirectToMagnet(true)); + connect(handler, static_cast(&Net::DownloadHandler::downloadFinished) , dlg, &AddNewTorrentDialog::handleDownloadFinished); connect(handler, &Net::DownloadHandler::downloadFailed, dlg, &AddNewTorrentDialog::handleDownloadFailed); connect(handler, &Net::DownloadHandler::redirectedToMagnet, dlg, &AddNewTorrentDialog::handleRedirectedToMagnet); @@ -246,18 +249,12 @@ void AddNewTorrentDialog::show(const QString &source, const BitTorrent::AddTorre const BitTorrent::MagnetUri magnetUri(source); const bool isLoaded = magnetUri.isValid() ? dlg->loadMagnet(magnetUri) - : dlg->loadTorrent(source); + : dlg->loadTorrentFile(source); - if (isLoaded) { -#ifdef Q_OS_MAC - dlg->exec(); -#else + if (isLoaded) dlg->open(); -#endif - } - else { + else delete dlg; - } } void AddNewTorrentDialog::show(const QString &source, QWidget *parent) @@ -265,34 +262,29 @@ void AddNewTorrentDialog::show(const QString &source, QWidget *parent) show(source, BitTorrent::AddTorrentParams(), parent); } -bool AddNewTorrentDialog::loadTorrent(const QString &torrentPath) +bool AddNewTorrentDialog::loadTorrentFile(const QString &torrentPath) { - if (torrentPath.startsWith("file://", Qt::CaseInsensitive)) - m_filePath = QUrl::fromEncoded(torrentPath.toLocal8Bit()).toLocalFile(); - else - m_filePath = torrentPath; + const QString decodedPath = torrentPath.startsWith("file://", Qt::CaseInsensitive) + ? QUrl::fromEncoded(torrentPath.toLocal8Bit()).toLocalFile() + : torrentPath; - if (!QFile::exists(m_filePath)) { - RaisedMessageBox::critical(this, tr("I/O Error"), tr("The torrent file '%1' does not exist.").arg(Utils::Fs::toNativePath(m_filePath))); - return false; - } - - QFileInfo fileinfo(m_filePath); - if (!fileinfo.isReadable()) { - RaisedMessageBox::critical(this, tr("I/O Error"), tr("The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions.").arg(Utils::Fs::toNativePath(m_filePath))); - return false; - } - - m_hasMetadata = true; QString error; - m_torrentInfo = BitTorrent::TorrentInfo::loadFromFile(m_filePath, &error); + m_torrentInfo = BitTorrent::TorrentInfo::loadFromFile(decodedPath, &error); if (!m_torrentInfo.isValid()) { - RaisedMessageBox::critical(this, tr("Invalid torrent"), tr("Failed to load the torrent: %1.\nError: %2", "Don't remove the '\n' characters. They insert a newline.") - .arg(Utils::Fs::toNativePath(m_filePath), error)); + RaisedMessageBox::critical(this, tr("Invalid torrent") + , tr("Failed to load the torrent: %1.\nError: %2", "Don't remove the '\n' characters. They insert a newline.") + .arg(Utils::Fs::toNativePath(decodedPath), error)); return false; } - m_torrentGuard.reset(new TorrentFileGuard(m_filePath)); + m_torrentGuard.reset(new TorrentFileGuard(decodedPath)); + + return loadTorrentImpl(); +} + +bool AddNewTorrentDialog::loadTorrentImpl() +{ + m_hasMetadata = true; m_hash = m_torrentInfo.hash(); // Prevent showing the dialog if download is already present @@ -779,16 +771,26 @@ void AddNewTorrentDialog::handleDownloadFailed(const QString &url, const QString void AddNewTorrentDialog::handleRedirectedToMagnet(const QString &url, const QString &magnetUri) { Q_UNUSED(url) + if (loadMagnet(BitTorrent::MagnetUri(magnetUri))) open(); else this->deleteLater(); } -void AddNewTorrentDialog::handleDownloadFinished(const QString &url, const QString &filePath) +void AddNewTorrentDialog::handleDownloadFinished(const QString &url, const QByteArray &data) { - Q_UNUSED(url) - if (loadTorrent(filePath)) + QString error; + m_torrentInfo = BitTorrent::TorrentInfo::load(data, &error); + if (!m_torrentInfo.isValid()) { + RaisedMessageBox::critical(this, tr("Invalid torrent"), tr("Failed to load from URL: %1.\nError: %2") + .arg(url, error)); + return; + } + + m_torrentGuard.reset(new TorrentFileGuard); + + if (loadTorrentImpl()) open(); else this->deleteLater(); diff --git a/src/gui/addnewtorrentdialog.h b/src/gui/addnewtorrentdialog.h index 6a9e80434..f6c4b8e06 100644 --- a/src/gui/addnewtorrentdialog.h +++ b/src/gui/addnewtorrentdialog.h @@ -80,7 +80,7 @@ private slots: void updateMetadata(const BitTorrent::TorrentInfo &info); void handleDownloadFailed(const QString &url, const QString &reason); void handleRedirectedToMagnet(const QString &url, const QString &magnetUri); - void handleDownloadFinished(const QString &url, const QString &filePath); + void handleDownloadFinished(const QString &url, const QByteArray &data); void TMMChanged(int index); void categoryChanged(int index); void doNotDeleteTorrentClicked(bool checked); @@ -90,7 +90,8 @@ private slots: private: explicit AddNewTorrentDialog(const BitTorrent::AddTorrentParams &inParams, QWidget *parent); - bool loadTorrent(const QString &torrentPath); + bool loadTorrentFile(const QString &torrentPath); + bool loadTorrentImpl(); bool loadMagnet(const BitTorrent::MagnetUri &magnetUri); void populateSavePathComboBox(); void saveSavePathHistory() const; @@ -108,7 +109,6 @@ private: TorrentContentFilterModel *m_contentModel; PropListDelegate *m_contentDelegate; bool m_hasMetadata; - QString m_filePath; BitTorrent::InfoHash m_hash; BitTorrent::TorrentInfo m_torrentInfo; QByteArray m_headerState;