QTfrontend/pagedata.cpp
changeset 5906 ed9676dc8cb4
parent 5769 09aca6e1317a
child 5999 dad168522e3b
child 6009 14f6fc9869f2
--- a/QTfrontend/pagedata.cpp	Wed Sep 14 22:27:22 2011 +0200
+++ b/QTfrontend/pagedata.cpp	Wed Sep 14 22:39:39 2011 +0200
@@ -20,10 +20,19 @@
 #include <QPushButton>
 #include <QNetworkAccessManager>
 #include <QNetworkRequest>
+#include <QNetworkReply>
 #include <QFileInfo>
 #include <QFileDialog>
+#include <QDebug>
+#include <QProgressBar>
+#include <QBuffer>
 
 #include "pagedata.h"
+#include "databrowser.h"
+#include "hwconsts.h"
+
+#include "quazip.h"
+#include "quazipfile.h"
 
 PageDataDownload::PageDataDownload(QWidget* parent) : AbstractPage(parent)
 {
@@ -32,25 +41,181 @@
     pageLayout->setColumnStretch(1, 1);
     pageLayout->setColumnStretch(2, 1);
 
-    BtnBack = addButton(":/res/Exit.png", pageLayout, 1, 0, true);
+    BtnBack = addButton(":/res/Exit.png", pageLayout, 2, 0, true);
+
+    web = new DataBrowser(this);
+    connect(web, SIGNAL(anchorClicked(QUrl)), this, SLOT(request(const QUrl&)));
+    web->setOpenLinks(false);
+    pageLayout->addWidget(web, 0, 0, 1, 3);
+
+    progressBarsLayout = new QVBoxLayout();
+    pageLayout->addLayout(progressBarsLayout, 1, 0, 1, 3);
+
+    fetchList();
+}
+
+void PageDataDownload::request(const QUrl &url)
+{
+    QUrl finalUrl;
+    if(url.host().isEmpty())
+        finalUrl = QUrl("http://www.hedgewars.org" + url.path());
+    else
+        finalUrl = url;
+
+    if(url.path().endsWith(".zip"))
+    {
+        qWarning() << "Download Request" << url.toString();
+        QString fileName = QFileInfo(url.toString()).fileName();
+
+        QNetworkRequest newRequest(finalUrl);
+        newRequest.setAttribute(QNetworkRequest::User, fileName);
+
+        QNetworkAccessManager *manager = new QNetworkAccessManager(this);
+        QNetworkReply *reply = manager->get(newRequest);
+        connect(reply, SIGNAL(finished()), this, SLOT(fileDownloaded()));
+        connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(downloadProgress(qint64, qint64)));
+
+        QProgressBar *progressBar = new QProgressBar(this);
+        progressBarsLayout->addWidget(progressBar);
+        progressBars.insert(reply, progressBar);
+    } else
+    {
+        qWarning() << "Page Request" << url.toString();
+
+        QNetworkRequest newRequest(finalUrl);
 
-    web = new QWebView(this);
-    connect(web, SIGNAL(linkClicked(const QUrl&)), this, SLOT(install(const QUrl&)));
-    web->load(QUrl("http://m8y.org/hw/downloads/"));
-    web->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
-    pageLayout->addWidget(web, 0, 0, 1, 3);
+        QNetworkAccessManager *manager = new QNetworkAccessManager(this);
+        QNetworkReply *reply = manager->get(newRequest);
+        connect(reply, SIGNAL(finished()), this, SLOT(pageDownloaded()));
+    }
+}
+
+
+void PageDataDownload::pageDownloaded()
+{
+    QNetworkReply * reply = qobject_cast<QNetworkReply *>(sender());
+
+    if(reply)
+    {
+        QString html = QString::fromUtf8(reply->readAll());
+        int begin = html.indexOf("<!-- BEGIN -->");
+        int end = html.indexOf("<!-- END -->");
+        if(begin != -1 && begin < end)
+        {
+            html.truncate(end);
+            html.remove(0, begin);
+        }
+        web->setHtml(html);
+    }
+}
+
+void PageDataDownload::fileDownloaded()
+{
+    QNetworkReply * reply = qobject_cast<QNetworkReply *>(sender());
+
+    if(reply)
+    {
+        QByteArray fileContents = reply->readAll();
+        QProgressBar *progressBar = progressBars.value(reply, 0);
+
+        if(progressBar)
+        {
+            progressBars.remove(reply);
+            progressBar->deleteLater();
+        }
+
+        extractDataPack(&fileContents);
+    }
 }
 
-void PageDataDownload::install(const QUrl &url)
+void PageDataDownload::downloadProgress(qint64 bytesRecieved, qint64 bytesTotal)
+{
+    QNetworkReply * reply = qobject_cast<QNetworkReply *>(sender());
+
+    if(reply)
+    {
+        QProgressBar *progressBar = progressBars.value(reply, 0);
+
+        if(progressBar)
+        {
+            progressBar->setValue(bytesRecieved);
+            progressBar->setMaximum(bytesTotal);
+        }
+    }
+}
+
+void PageDataDownload::fetchList()
 {
-qWarning("Download Request");
-QString fileName = QFileInfo(url.toString()).fileName();
+    request(QUrl("http://hedgewars.org/content.html"));
+}
+
+bool PageDataDownload::extractDataPack(QByteArray * buf)
+{
+    QBuffer buffer;
+    buffer.setBuffer(buf);
+
+    QuaZip zip;
+    zip.setIoDevice(&buffer);
+    if(!zip.open(QuaZip::mdUnzip))
+    {
+      qWarning("testRead(): zip.open(): %d", zip.getZipError());
+      return false;
+    }
+
+    QuaZipFile file(&zip);
+
+    QDir extractDir(*cfgdir);
+    extractDir.cd("Data");
 
-QNetworkRequest newRequest(url);
-newRequest.setAttribute(QNetworkRequest::User, fileName);
+    for(bool more = zip.goToFirstFile(); more; more = zip.goToNextFile())
+    {
+        if(!file.open(QIODevice::ReadOnly))
+        {
+            qWarning("file.open(): %d", file.getZipError());
+            return false;
+        }
+
+
+        QString fileName = file.getActualFileName();
+        QString filePath = extractDir.filePath(fileName);
+        if (fileName.endsWith("/"))
+        {
+            QFileInfo fi(filePath);
+            QDir().mkpath(fi.filePath());
+        } else
+        {
+            qDebug() << "Extracting" << filePath;
+            QFile out(filePath);
+            if(!out.open(QFile::WriteOnly))
+            {
+                qWarning() << "out.open():" << out.errorString();
+                return false;
+            }
 
-QNetworkAccessManager *manager = new QNetworkAccessManager(this);
-QNetworkReply *reply = manager->get(newRequest);
-//connect( reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(downloadProgress(qint64, qint64)) );
-//connect( reply, SIGNAL(finished()), this, SLOT(downloadIssueFinished()));
+            out.write(file.readAll());
+
+            out.close();
+
+            if(file.getZipError() != UNZ_OK) {
+                qWarning("file.getFileName(): %d", file.getZipError());
+                return false;
+            }
+
+            if(!file.atEnd()) {
+                qWarning("read all but not EOF");
+                return false;
+            }
+        }
+
+        file.close();
+
+        if(file.getZipError()!=UNZ_OK) {
+            qWarning("file.close(): %d", file.getZipError());
+            return false;
+        }
+    }
+
+    zip.close();
+
+    return true;
 }