From 25d998f1b5eee0d11484479563fd7e04e769a385 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Fri, 21 Aug 2009 14:05:03 +0000 Subject: [PATCH] - Added magnet URI support to Web UI --- src/bittorrent.cpp | 4 + src/bittorrent.h | 1 + src/httpconnection.cpp | 326 ++++++++++++++++++++-------------------- src/httpconnection.h | 1 + src/httpserver.cpp | 1 + src/webui/download.html | 4 +- src/webui/index.html | 2 +- 7 files changed, 175 insertions(+), 164 deletions(-) diff --git a/src/bittorrent.cpp b/src/bittorrent.cpp index f613f7d11..ff72b6999 100644 --- a/src/bittorrent.cpp +++ b/src/bittorrent.cpp @@ -1445,6 +1445,10 @@ void bittorrent::downloadFromUrl(QString url) { downloader->downloadUrl(url); } +void bittorrent::addMagnetSkipAddDlg(QString uri) { + addMagnetUri(uri, false); +} + void bittorrent::downloadUrlAndSkipDialog(QString url, QString save_path) { //emit aboutToDownloadFromUrl(url); if(!save_path.isEmpty()) diff --git a/src/bittorrent.h b/src/bittorrent.h index daedc3dd4..0fcc99248 100644 --- a/src/bittorrent.h +++ b/src/bittorrent.h @@ -167,6 +167,7 @@ class bittorrent : public QObject { void addPeerBanMessage(QString msg, bool from_ipfilter); void processDownloadedFile(QString, QString); void saveTrackerFile(QString hash); + void addMagnetSkipAddDlg(QString uri); protected slots: void scanDirectory(QString); diff --git a/src/httpconnection.cpp b/src/httpconnection.cpp index 9cc7eccca..2276c76f9 100644 --- a/src/httpconnection.cpp +++ b/src/httpconnection.cpp @@ -43,11 +43,11 @@ #include HttpConnection::HttpConnection(QTcpSocket *socket, HttpServer *parent) - : QObject(parent), socket(socket), parent(parent) + : QObject(parent), socket(socket), parent(parent) { - socket->setParent(this); - connect(socket, SIGNAL(readyRead()), this, SLOT(read())); - connect(socket, SIGNAL(disconnected()), this, SLOT(deleteLater())); + socket->setParent(this); + connect(socket, SIGNAL(readyRead()), this, SLOT(read())); + connect(socket, SIGNAL(disconnected()), this, SLOT(deleteLater())); } HttpConnection::~HttpConnection() @@ -57,7 +57,7 @@ HttpConnection::~HttpConnection() void HttpConnection::processDownloadedFile(QString url, QString file_path) { qDebug("URL %s successfully downloaded !", (const char*)url.toLocal8Bit()); - emit torrentReadyToBeDownloaded(file_path, false, url, false); + emit torrentReadyToBeDownloaded(file_path, false, url, false); } void HttpConnection::handleDownloadFailure(QString url, QString reason) { @@ -66,182 +66,186 @@ void HttpConnection::handleDownloadFailure(QString url, QString reason) { void HttpConnection::read() { - QByteArray input = socket->readAll(); - /*qDebug(" -------"); - qDebug("|REQUEST|"); - qDebug(" -------"); */ - //qDebug("%s", input.toAscii().constData()); - if(input.size() > 100000) { - qDebug("Request too big"); - generator.setStatusLine(400, "Bad Request"); - write(); - return; - } - parser.write(input); - if(parser.isError()) - { - generator.setStatusLine(400, "Bad Request"); - write(); - } - else - if (parser.isParsable()) - respond(); + QByteArray input = socket->readAll(); + /*qDebug(" -------"); + qDebug("|REQUEST|"); + qDebug(" -------"); */ + //qDebug("%s", input.toAscii().constData()); + if(input.size() > 100000) { + qDebug("Request too big"); + generator.setStatusLine(400, "Bad Request"); + write(); + return; + } + parser.write(input); + if(parser.isError()) + { + generator.setStatusLine(400, "Bad Request"); + write(); + } + else + if (parser.isParsable()) + respond(); } void HttpConnection::write() { - QByteArray output = generator.toByteArray(); - /*qDebug(" --------"); - qDebug("|RESPONSE|"); - qDebug(" --------"); - qDebug()<write(output); - socket->disconnectFromHost(); + QByteArray output = generator.toByteArray(); + /*qDebug(" --------"); + qDebug("|RESPONSE|"); + qDebug(" --------"); + qDebug()<write(output); + socket->disconnectFromHost(); } void HttpConnection::respond() { - //qDebug("Respond called"); - QStringList auth = parser.value("Authorization").split(" ", QString::SkipEmptyParts); + //qDebug("Respond called"); + QStringList auth = parser.value("Authorization").split(" ", QString::SkipEmptyParts); if (auth.size() != 2 || QString::compare(auth[0], "Basic", Qt::CaseInsensitive) != 0 || !parent->isAuthorized(auth[1].toLocal8Bit())) - { - generator.setStatusLine(401, "Unauthorized"); - generator.setValue("WWW-Authenticate", "Basic realm=\"you know what\""); - write(); - return; - } - QString url = parser.url(); - QStringList list = url.split('/', QString::SkipEmptyParts); - if (list.contains(".") || list.contains("..")) - { - respondNotFound(); - return; - } - if (list.size() == 0) - list.append("index.html"); - if (list.size() == 2) - { - if (list[0] == "json") - { - if (list[1] == "events") - { - respondJson(); - return; - } - } - if (list[0] == "command") - { - QString command = list[1]; - respondCommand(command); - generator.setStatusLine(200, "OK"); - write(); - return; - } - } - if (list[0] == "images") - list[0] = "Icons"; - else - list.prepend("webui"); - url = ":/" + list.join("/"); - QFile file(url); - if(!file.open(QIODevice::ReadOnly)) - { - respondNotFound(); - return; - } - QString ext = list.last(); - int index = ext.lastIndexOf('.') + 1; - if (index > 0) - ext.remove(0, index); - else - ext.clear(); - QByteArray data = file.readAll(); - generator.setStatusLine(200, "OK"); - generator.setContentTypeByExt(ext); - generator.setMessage(data); - write(); + { + generator.setStatusLine(401, "Unauthorized"); + generator.setValue("WWW-Authenticate", "Basic realm=\"you know what\""); + write(); + return; + } + QString url = parser.url(); + QStringList list = url.split('/', QString::SkipEmptyParts); + if (list.contains(".") || list.contains("..")) + { + respondNotFound(); + return; + } + if (list.size() == 0) + list.append("index.html"); + if (list.size() == 2) + { + if (list[0] == "json") + { + if (list[1] == "events") + { + respondJson(); + return; + } + } + if (list[0] == "command") + { + QString command = list[1]; + respondCommand(command); + generator.setStatusLine(200, "OK"); + write(); + return; + } + } + if (list[0] == "images") + list[0] = "Icons"; + else + list.prepend("webui"); + url = ":/" + list.join("/"); + QFile file(url); + if(!file.open(QIODevice::ReadOnly)) + { + respondNotFound(); + return; + } + QString ext = list.last(); + int index = ext.lastIndexOf('.') + 1; + if (index > 0) + ext.remove(0, index); + else + ext.clear(); + QByteArray data = file.readAll(); + generator.setStatusLine(200, "OK"); + generator.setContentTypeByExt(ext); + generator.setMessage(data); + write(); } void HttpConnection::respondNotFound() { - generator.setStatusLine(404, "File not found"); - write(); + generator.setStatusLine(404, "File not found"); + write(); } void HttpConnection::respondJson() { - EventManager* manager = parent->eventManager(); - QString string = json::toJson(manager->getEventList()); - generator.setStatusLine(200, "OK"); - generator.setContentTypeByExt("js"); - generator.setMessage(string); - write(); + EventManager* manager = parent->eventManager(); + QString string = json::toJson(manager->getEventList()); + generator.setStatusLine(200, "OK"); + generator.setContentTypeByExt("js"); + generator.setMessage(string); + write(); } void HttpConnection::respondCommand(QString command) { - if(command == "download") - { - QString urls = parser.post("urls"); - QStringList list = urls.split('\n'); - foreach(QString url, list){ - url = url.trimmed(); - if(!url.isEmpty()){ - qDebug("Downloading url: %s", (const char*)url.toLocal8Bit()); - emit UrlReadyToBeDownloaded(url); - } - } - return; - } - if(command == "upload") - { - QByteArray torrentfile = parser.torrent(); - // XXX: Trick to get a unique filename - QString filePath; - QTemporaryFile *tmpfile = new QTemporaryFile(); - if (tmpfile->open()) { - filePath = tmpfile->fileName(); - } - delete tmpfile; - // write it to HD - QFile torrent(filePath); - if(torrent.open(QIODevice::WriteOnly)) { - torrent.write(torrentfile); - torrent.close(); - } - emit torrentReadyToBeDownloaded(filePath, false, QString(), false); - return; - } - if(command == "resumeall") { - emit resumeAllTorrents(); - return; - } - if(command == "pauseall") { - emit pauseAllTorrents(); - return; - } - if(command == "resume") { - emit resumeTorrent(parser.post("hash")); - return; - } - if(command == "pause") { - emit pauseTorrent(parser.post("hash")); - return; - } - if(command == "delete") { - emit deleteTorrent(parser.post("hash"), false); - return; - } - if(command == "deletePerm") { - emit deleteTorrent(parser.post("hash"), true); - return; - } - if(command == "increasePrio") { - emit increasePrioTorrent(parser.post("hash")); - return; - } - if(command == "decreasePrio") { - emit decreasePrioTorrent(parser.post("hash")); - return; + if(command == "download") + { + QString urls = parser.post("urls"); + QStringList list = urls.split('\n'); + foreach(QString url, list){ + url = url.trimmed(); + if(!url.isEmpty()){ + if(url.startsWith("magnet:", Qt::CaseInsensitive)) { + emit MagnetReadyToBeDownloaded(url); + } else { + qDebug("Downloading url: %s", (const char*)url.toLocal8Bit()); + emit UrlReadyToBeDownloaded(url); } + } + } + return; + } + if(command == "upload") + { + QByteArray torrentfile = parser.torrent(); + // XXX: Trick to get a unique filename + QString filePath; + QTemporaryFile *tmpfile = new QTemporaryFile(); + if (tmpfile->open()) { + filePath = tmpfile->fileName(); + } + delete tmpfile; + // write it to HD + QFile torrent(filePath); + if(torrent.open(QIODevice::WriteOnly)) { + torrent.write(torrentfile); + torrent.close(); + } + emit torrentReadyToBeDownloaded(filePath, false, QString(), false); + return; + } + if(command == "resumeall") { + emit resumeAllTorrents(); + return; + } + if(command == "pauseall") { + emit pauseAllTorrents(); + return; + } + if(command == "resume") { + emit resumeTorrent(parser.post("hash")); + return; + } + if(command == "pause") { + emit pauseTorrent(parser.post("hash")); + return; + } + if(command == "delete") { + emit deleteTorrent(parser.post("hash"), false); + return; + } + if(command == "deletePerm") { + emit deleteTorrent(parser.post("hash"), true); + return; + } + if(command == "increasePrio") { + emit increasePrioTorrent(parser.post("hash")); + return; + } + if(command == "decreasePrio") { + emit decreasePrioTorrent(parser.post("hash")); + return; + } } diff --git a/src/httpconnection.h b/src/httpconnection.h index 08af644f2..848581f22 100644 --- a/src/httpconnection.h +++ b/src/httpconnection.h @@ -68,6 +68,7 @@ class HttpConnection : public QObject signals: void UrlReadyToBeDownloaded(QString url); + void MagnetReadyToBeDownloaded(QString uri); void torrentReadyToBeDownloaded(QString, bool, QString, bool); void deleteTorrent(QString hash, bool permanently); void resumeTorrent(QString hash); diff --git a/src/httpserver.cpp b/src/httpserver.cpp index 007abb45a..4470f3fa0 100644 --- a/src/httpserver.cpp +++ b/src/httpserver.cpp @@ -72,6 +72,7 @@ void HttpServer::newHttpConnection() HttpConnection *connection = new HttpConnection(socket, this); //connect connection to BTSession connect(connection, SIGNAL(UrlReadyToBeDownloaded(QString)), BTSession, SLOT(downloadUrlAndSkipDialog(QString))); + connect(connection, SIGNAL(MagnetReadyToBeDownloaded(QString)), BTSession, SLOT(addMagnetSkipAddDlg(QString))); connect(connection, SIGNAL(torrentReadyToBeDownloaded(QString, bool, QString, bool)), BTSession, SLOT(addTorrent(QString, bool, QString, bool))); connect(connection, SIGNAL(deleteTorrent(QString, bool)), BTSession, SLOT(deleteTorrent(QString, bool))); connect(connection, SIGNAL(pauseTorrent(QString)), BTSession, SLOT(pauseTorrent(QString))); diff --git a/src/webui/download.html b/src/webui/download.html index 72c1ef987..dfbbd4ca0 100644 --- a/src/webui/download.html +++ b/src/webui/download.html @@ -10,8 +10,8 @@
-

Download Torrents from URLs

-

Only One URL per Line

Download +

Download Torrents from their URL or Magnet link

+

Only one link per line

Download
diff --git a/src/webui/index.html b/src/webui/index.html index 672d35aba..dab60ae30 100644 --- a/src/webui/index.html +++ b/src/webui/index.html @@ -23,7 +23,7 @@
-

qBittorrent Web User Interface version 1.3.1

+

qBittorrent Web User Interface version 1.3.2