From 76ca967d70ea8d001504caf64f597a077f2a4346 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Tue, 4 Oct 2011 22:18:59 +0300 Subject: [PATCH] Fix torrent loading problem from Web UI on Windows. --- src/downloadthread.cpp | 5 ++--- src/qtlibtorrent/qbtsession.cpp | 3 ++- src/webui/httpconnection.cpp | 14 ++++++++------ 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/downloadthread.cpp b/src/downloadthread.cpp index c052ce3b3..bab1baa7d 100644 --- a/src/downloadthread.cpp +++ b/src/downloadthread.cpp @@ -86,9 +86,8 @@ void DownloadThread::processDlFinished(QNetworkReply* reply) { // TODO: Support GZIP compression tmpfile->write(reply->readAll()); tmpfile->close(); - // XXX: For some reason, tmpfile has to be destroyed before - // the signal is sent or the file stays locked on Windows - // for some reason. + // XXX: tmpfile needs to be deleted on Windows before using the file + // or it will complain that the file is used by another process. delete tmpfile; // Send finished signal emit downloadFinished(url, filePath); diff --git a/src/qtlibtorrent/qbtsession.cpp b/src/qtlibtorrent/qbtsession.cpp index eb2abb138..67db2fc1c 100644 --- a/src/qtlibtorrent/qbtsession.cpp +++ b/src/qtlibtorrent/qbtsession.cpp @@ -989,9 +989,10 @@ QTorrentHandle QBtSession::addTorrent(QString path, bool fromScanDir, QString fr t = new torrent_info(path.toUtf8().constData()); if(!t->is_valid()) throw std::exception(); - } catch(std::exception&) { + } catch(std::exception& e) { if(!from_url.isNull()) { addConsoleMessage(tr("Unable to decode torrent file: '%1'", "e.g: Unable to decode torrent file: '/home/y/xxx.torrent'").arg(from_url), QString::fromUtf8("red")); + addConsoleMessage(QString::fromLocal8Bit(e.what()), "red"); //emit invalidTorrent(from_url); misc::safeRemove(path); }else{ diff --git a/src/webui/httpconnection.cpp b/src/webui/httpconnection.cpp index e7a16ef92..0eeb1363d 100644 --- a/src/webui/httpconnection.cpp +++ b/src/webui/httpconnection.cpp @@ -430,16 +430,18 @@ void HttpConnection::respondCommand(const QString& command) { if(command == "upload") { qDebug() << Q_FUNC_INFO << "upload"; // Get a unique filename - // XXX: We need to use a QTemporaryFile pointer here - // and it fails on Windows. - // The file also needs to end with .torrent otherwise - // it fails to load on Windows. QTemporaryFile *tmpfile = new QTemporaryFile (QDir::temp().absoluteFilePath("qBT-XXXXXX.torrent")); + tmpfile->setAutoRemove(false); if (tmpfile->open()) { + QString filePath = tmpfile->fileName(); tmpfile->write(m_parser.torrent()); tmpfile->close(); - emit torrentReadyToBeDownloaded(tmpfile->fileName(), false, QString(), false); - tmpfile->deleteLater(); + // XXX: tmpfile needs to be deleted on Windows before using the file + // or it will complain that the file is used by another process. + delete tmpfile; + emit torrentReadyToBeDownloaded(filePath, false, QString(), false); + // Clean up + QFile::remove(filePath); } else { std::cerr << "I/O Error: Could not create temporary file" << std::endl; delete tmpfile;