]> git.sven.stormbind.net Git - sven/vym.git/blobdiff - src/download-agent.cpp
New upstream version 2.9.22
[sven/vym.git] / src / download-agent.cpp
diff --git a/src/download-agent.cpp b/src/download-agent.cpp
new file mode 100644 (file)
index 0000000..214725d
--- /dev/null
@@ -0,0 +1,206 @@
+#include <QCoreApplication>
+#include <QDebug>
+#include <QFile>
+#include <QFileInfo>
+#include <QList>
+#include <QMessageBox>
+#include <QNetworkAccessManager>
+#include <QNetworkReply>
+#include <QNetworkRequest>
+#include <QSslError>
+#include <QStringList>
+#include <QTimer>
+#include <QUrl>
+
+#include <stdio.h>
+
+QT_BEGIN_NAMESPACE
+class QSslError;
+QT_END_NAMESPACE
+
+QT_USE_NAMESPACE
+
+#include "download-agent.h"
+#include "mainwindow.h"
+#include "settings.h"
+#include "vymmodel.h"
+
+extern Main *mainWindow;
+extern QString vymVersion;
+extern QString vymPlatform;
+extern QDir tmpVymDir;
+extern Settings settings;
+extern bool debug;
+
+DownloadAgent::DownloadAgent(const QUrl &u)
+{
+    // qDebug() << "Constr. DownloadAgent: " << u.toString();
+    tmpFilePath = "";
+
+    finishedScriptModelID = 0;
+    url = u;
+    connect(&agent, SIGNAL(finished(QNetworkReply *)),
+            SLOT(requestFinished(QNetworkReply *)));
+
+    userAgent =
+        QString("vym %1 ( %2)").arg(vymVersion).arg(vymPlatform).toUtf8();
+}
+
+DownloadAgent::~DownloadAgent()
+{
+    // qDebug() << "Destr. DownloadAgent";
+    // qDebug() << getFinishedScript();
+}
+
+QString DownloadAgent::getDestination() { return tmpFilePath; }
+
+bool DownloadAgent::isSuccess() { return success; }
+
+QString DownloadAgent::getResultMessage() { return resultMessage; }
+
+void DownloadAgent::setFinishedAction(VymModel *m, const QString &script)
+{
+    finishedScriptModelID = m->getModelID();
+    finishedScript = script;
+}
+
+uint DownloadAgent::getFinishedScriptModelID() { return finishedScriptModelID; }
+
+QString DownloadAgent::getFinishedScript() { return finishedScript; }
+
+void DownloadAgent::setUserAgent(const QString &s)
+{
+    userAgent = s.toLocal8Bit();
+}
+
+void DownloadAgent::doDownload(const QUrl &url)
+{
+    QNetworkRequest request(url);
+    if (!userAgent.isEmpty())
+        request.setRawHeader("User-Agent", userAgent);
+
+    // Only send cookies if talking to my own domain
+    bool useCookies = false;
+    if (url.host().contains("insilmaril.de"))
+        useCookies = true;
+
+    if (useCookies) {
+        if (debug)
+            qDebug() << "DownloadAgent::doDownload  Using cookies to download "
+                     << url.toString();
+        QByteArray idCookieValue =
+            settings.value("/downloads/cookies/vymID/value", QByteArray())
+                .toByteArray();
+        // idCookieValue = QVariant("2000000002601").toByteArray(); //TESTING!!!
+        // qDebug()<<"idCookie="<<idCookieValue;
+        if (idCookieValue.size() != 0) {
+            QNetworkCookie idCookie;
+            QDate expDate(2099, 1, 1);
+
+            idCookie.setPath("/");
+            idCookie.setDomain("www.insilmaril.de");
+            idCookie.setName("vymID");
+            idCookie.setValue(idCookieValue);
+            idCookie.setExpirationDate( expDate.startOfDay() );
+            agent.cookieJar()->insertCookie(idCookie);
+
+            QNetworkCookie platformCookie;
+            platformCookie.setPath("/");
+            platformCookie.setDomain("www.insilmaril.de");
+            platformCookie.setName("vymPlatform");
+            platformCookie.setValue(QVariant(vymPlatform).toByteArray());
+            platformCookie.setExpirationDate( expDate.startOfDay());
+            agent.cookieJar()->insertCookie(platformCookie);
+        }
+    }
+
+    QNetworkReply *reply = agent.get(request);
+    connect(reply, SIGNAL(sslErrors(QList<QSslError>)),
+            SLOT(sslErrors(QList<QSslError>)));
+
+    currentDownloads.append(reply);
+}
+
+bool DownloadAgent::saveToDisk(const QString &filename, const QByteArray &data)
+{
+    QFile file(filename);
+    if (!file.open(QIODevice::WriteOnly)) {
+        fprintf(stderr, "Could not open %s for writing: %s\n",
+                qPrintable(filename), qPrintable(file.errorString()));
+        return false;
+    }
+
+    file.write(data);
+    file.close();
+
+    return true;
+}
+
+void DownloadAgent::execute() { doDownload(url); }
+
+void DownloadAgent::sslErrors(const QList<QSslError> &sslErrors)
+{
+#ifndef QT_NO_OPENSSL
+    foreach (const QSslError &error, sslErrors)
+        fprintf(stderr, "SSL error: %s\n", qPrintable(error.errorString()));
+#endif
+}
+
+void DownloadAgent::requestFinished(QNetworkReply *reply)
+{
+    QUrl url = reply->url();
+    if (reply->error()) {
+        success = false;
+        resultMessage = reply->errorString();
+        emit(downloadFinished());
+    }
+    else {
+        success = true;
+
+        if (debug)
+            qDebug() << "\n* DownloadAgent::reqFinished: ";
+        QList<QNetworkCookie> cookies =
+            reply->manager()->cookieJar()->cookiesForUrl(url);
+        foreach (QNetworkCookie c, cookies) {
+            if (debug) {
+                qDebug() << "           url: " << url.toString();
+                qDebug() << "   cookie name: " << c.name();
+                qDebug() << "   cookie path: " << c.path();
+                qDebug() << "  cookie value: " << c.value();
+                qDebug() << " cookie domain: " << c.domain();
+                qDebug() << " cookie exdate: "
+                         << c.expirationDate().toLocalTime().toString();
+            }
+
+            if (c.name() == "vymID") {
+                settings.setValue("/downloads/cookies/vymID/value", c.value());
+                // settings.setValue( "/downloads/cookies/vymID/expires",
+                // c.expirationDate());
+            }
+        }
+
+        QByteArray data = reply->readAll();
+        QTemporaryFile tmpFile(tmpVymDir.path() + "/download-XXXXXX");
+        tmpFile.setAutoRemove(
+            false); // tmpFile is within tmpDir, removed automatically later
+
+        if (!tmpFile.open())
+            QMessageBox::warning(0, tr("Warning"),
+                                 "Couldn't open tmpFile " + tmpFile.fileName());
+        else {
+            if (!saveToDisk(tmpFile.fileName(), data))
+                QMessageBox::warning(0, tr("Warning"),
+                                     "Couldn't write to " + tmpFile.fileName());
+            else {
+                tmpFilePath = tmpFile.fileName();
+                resultMessage = QString("saved to %1").arg(tmpFile.fileName());
+            }
+        }
+        if (debug)
+            qDebug() << "DownloadAgent:  resultMessage  = " << resultMessage;
+        emit(downloadFinished());
+    }
+
+    currentDownloads.removeAll(reply);
+    reply->deleteLater();
+}