Forráskód Böngészése

Try to show fb2 images

Kandrashin Denis 13 éve
szülő
commit
9afb1aca4d
2 módosított fájl, 93 hozzáadás és 2 törlés
  1. 70 1
      source/fb2view.cpp
  2. 23 1
      source/fb2view.h

+ 70 - 1
source/fb2view.cpp

@@ -4,6 +4,61 @@
 #include <QtDebug>
 #include <QNetworkReply>
 #include <QNetworkRequest>
+#include <QWebSecurityOrigin>
+
+//---------------------------------------------------------------------------
+//  Fb2ImageReply
+//---------------------------------------------------------------------------
+
+Fb2ImageReply::Fb2ImageReply(QNetworkAccessManager::Operation op, const QNetworkRequest &request, const QByteArray &data)
+    : QNetworkReply()
+    , content(data)
+    , offset(0)
+{
+/*
+    QString path = "/home/user/tmp" + request.url().path();
+    qCritical() << path;
+    QFile file(path);
+    file.open(QFile::WriteOnly);
+    file.write(content);
+    file.close();
+*/
+    qCritical() << tr("Image: %1 - %2").arg(request.url().toString()).arg(content.size());
+    setRequest(request);
+    setUrl(request.url());
+    setOperation(op);
+    open(ReadOnly | Unbuffered);
+    setHeader(QNetworkRequest::ContentLengthHeader, QVariant(content.size()));
+    QMetaObject::invokeMethod(this, "readyRead", Qt::QueuedConnection);
+    QMetaObject::invokeMethod(this, "finished", Qt::QueuedConnection);
+}
+
+void Fb2ImageReply::abort()
+{
+    close();
+}
+
+qint64 Fb2ImageReply::bytesAvailable() const
+{
+    return content.size() - offset;
+}
+
+bool Fb2ImageReply::isSequential() const
+{
+    return true;
+}
+
+qint64 Fb2ImageReply::readData(char *data, qint64 maxSize)
+{
+    if (offset < content.size()) {
+        qint64 number = qMin(maxSize, content.size() - offset);
+        memcpy(data, content.constData() + offset, number);
+        offset += number;
+        return number;
+    } else {
+        return -1;
+    }
+}
 
 //---------------------------------------------------------------------------
 //  Fb2NetworkAccessManager
@@ -18,10 +73,23 @@ Fb2NetworkAccessManager::Fb2NetworkAccessManager(QObject *parent)
 
 QNetworkReply * Fb2NetworkAccessManager::createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData)
 {
-    qCritical() << request.url().toString();
+    if (request.url().scheme() == "fb2") return imageRequest(op, request);
     return QNetworkAccessManager::createRequest(op, request, outgoingData);
 }
 
+QNetworkReply * Fb2NetworkAccessManager::imageRequest(Operation op, const QNetworkRequest &request)
+{
+    QString file = request.url().path();
+    while (file.left(1) == "/") file.remove(0, 1);
+    ImageMap::const_iterator i = m_images.find(file);
+    if (i == m_images.end()) {
+        qCritical() << "Not found: " << file;
+        return 0;
+    } else {
+        return new Fb2ImageReply(op, request, i.value());
+    }
+}
+
 void Fb2NetworkAccessManager::insert(const QString &file, const QByteArray &data)
 {
     m_images.insert(file, data);
@@ -37,6 +105,7 @@ Fb2WebView::Fb2WebView(QWidget *parent)
 {
     page()->setContentEditable(true);
     QWebSettings *settings = page()->settings();
+    settings->setAttribute(QWebSettings::AutoLoadImages, true);
     settings->setAttribute(QWebSettings::JavaEnabled, false);
     settings->setAttribute(QWebSettings::JavascriptEnabled, true);
     settings->setAttribute(QWebSettings::PrivateBrowsingEnabled, true);

+ 23 - 1
source/fb2view.h

@@ -3,11 +3,29 @@
 
 #include <QMap>
 #include <QNetworkAccessManager>
+#include <QNetworkReply>
 #include <QResizeEvent>
 #include <QTimer>
 #include <QThread>
 #include <QWebView>
 
+class Fb2ImageReply : public QNetworkReply
+{
+    Q_OBJECT
+public:
+    explicit Fb2ImageReply(QNetworkAccessManager::Operation op, const QNetworkRequest &request, const QByteArray &data);
+    void abort();
+    qint64 bytesAvailable() const;
+    bool isSequential() const;
+
+protected:
+    qint64 readData(char *data, qint64 maxSize);
+
+private:
+    QByteArray content;
+    qint64 offset;
+};
+
 class Fb2NetworkAccessManager : public QNetworkAccessManager
 {
     Q_OBJECT
@@ -19,7 +37,11 @@ protected:
     virtual QNetworkReply *createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData = 0);
 
 private:
-    QMap<QString, QByteArray> m_images;
+    QNetworkReply *imageRequest(Operation op, const QNetworkRequest &request);
+
+private:
+    typedef QMap<QString, QByteArray> ImageMap;
+    ImageMap m_images;
 
 };