From 27caa1d11851646fe845afbc5177d18f0e368ad7 Mon Sep 17 00:00:00 2001 From: Akira Ohgaki <akiraohgaki@gmail.com> Date: Fri, 7 Oct 2016 22:30:55 +0900 Subject: [PATCH] Slot for downloaded --- src/handlers/xdgurl.cpp | 54 ++++++++++++++++++++++++++++++++++++++--- src/handlers/xdgurl.h | 6 +++-- 2 files changed, 54 insertions(+), 6 deletions(-) diff --git a/src/handlers/xdgurl.cpp b/src/handlers/xdgurl.cpp index 82b7cae..4921132 100644 --- a/src/handlers/xdgurl.cpp +++ b/src/handlers/xdgurl.cpp @@ -1,6 +1,7 @@ #include <QDebug> #include <QUrl> #include <QUrlQuery> +#include <QTemporaryFile> #include <QMimeDatabase> #include <QProcess> #include <QNetworkReply> @@ -189,16 +190,61 @@ bool XdgUrl::_uncompressArchive(const QString &path, const QString &targetDir) return false; } +void XdgUrl::_saveDownloadedFile(const QTemporaryFile &temporaryFile) +{ +} + +void XdgUrl::_installDownloadedFile(const QTemporaryFile &temporaryFile) +{ +} + /** * Private slots */ -void XdgUrl::_saveDownloadedFile(QNetworkReply *reply) +void XdgUrl::_downloaded(QNetworkReply *reply) { -} + QJsonObject result; -void XdgUrl::_installDownloadedFile(QNetworkReply *reply) -{ + if (reply->error() != QNetworkReply::NoError) { + result["error"] = QString("network_error"); + emit finished(Utility::Json::convertObjToStr(result)); + return; + } + + // If the network reply has a refresh header, retry download + if (reply->hasRawHeader("Refresh")) { + QString refreshUrl = QString(reply->rawHeader("Refresh")).split("url=").last(); + if (refreshUrl.startsWith("/")) { + QUrl url = reply->url(); + refreshUrl = url.scheme() + "://" + url.host() + refreshUrl; + } + _asyncNetwork->get(QUrl(refreshUrl)); + return; + } + + QTemporaryFile temporaryFile; + if (!temporaryFile.open()) { + result["error"] = QString("save_error"); + emit finished(Utility::Json::convertObjToStr(result)); + return; + } + temporaryFile.write(reply->readAll()); + + QMimeDatabase mimeDb; + QString mimeType = mimeDb.mimeTypeForFile(temporaryFile.fileName()).name(); + if (mimeType == "text/html" || mimeType == "application/xhtml+xml") { + result["error"] = QString("filetype_error"); + emit finished(Utility::Json::convertObjToStr(result)); + return; + } + + if (_metadata["command"].toString() == "download") { + _saveDownloadedFile(temporaryFile); + } + else if (_metadata["command"].toString() == "install") { + _installDownloadedFile(temporaryFile); + } } /** diff --git a/src/handlers/xdgurl.h b/src/handlers/xdgurl.h index 789d54f..fe6b64c 100644 --- a/src/handlers/xdgurl.h +++ b/src/handlers/xdgurl.h @@ -4,6 +4,7 @@ #include <QObject> #include <QJsonObject> +class QTemporaryFile; class QNetworkReply; namespace Core { @@ -37,10 +38,11 @@ private: QJsonObject _loadArchiveTypes(); bool _installPlasmapkg(const QString &path, const QString &type = "plasmoid"); bool _uncompressArchive(const QString &path, const QString &targetDir); + void _saveDownloadedFile(const QTemporaryFile &temporaryFile); + void _installDownloadedFile(const QTemporaryFile &temporaryFile); private slots: - void _saveDownloadedFile(QNetworkReply *reply); - void _installDownloadedFile(QNetworkReply *reply); + void _downloaded(QNetworkReply *reply); public slots: QString getXdgUrl(); -- GitLab