Browse Source

Use class: QNetworkDiskCache

Kandrashin Denis 13 years ago
parent
commit
9fe2602a75
3 changed files with 165 additions and 0 deletions
  1. 112 0
      source/fb2temp.cpp
  2. 49 0
      source/fb2temp.hpp
  3. 4 0
      source/fb2view.cpp

+ 112 - 0
source/fb2temp.cpp

@@ -1,6 +1,8 @@
 #include "fb2temp.hpp"
 #include "fb2temp.hpp"
 
 
 #include <QCryptographicHash>
 #include <QCryptographicHash>
+#include <QUrl>
+#include <QtDebug>
 
 
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 //  Fb2TemporaryFile
 //  Fb2TemporaryFile
@@ -100,3 +102,113 @@ bool Fb2TemporaryList::exists(const QString &name) const
     }
     }
     return false;
     return false;
 }
 }
+
+//---------------------------------------------------------------------------
+//  Fb2NetworkDiskCache
+//---------------------------------------------------------------------------
+
+QNetworkCacheMetaData Fb2NetworkDiskCache::metaData(const QUrl &url)
+{
+    qCritical() << url.toString();
+    return QNetworkDiskCache::metaData(url);
+}
+
+QIODevice * Fb2NetworkDiskCache::data(const QUrl &url)
+{
+    qCritical() << url.toString();
+    return QNetworkDiskCache::data(url);
+}
+
+#if 0
+
+//---------------------------------------------------------------------------
+//  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
+//
+//    http://doc.trolltech.com/qq/32/qq32-webkit-protocols.html
+//---------------------------------------------------------------------------
+
+Fb2NetworkAccessManager::Fb2NetworkAccessManager(QObject *parent)
+    : QNetworkAccessManager(parent)
+{
+}
+
+QNetworkReply * Fb2NetworkAccessManager::createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData)
+{
+    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);
+}
+
+#endif
+

+ 49 - 0
source/fb2temp.hpp

@@ -5,6 +5,7 @@
 #include <QList>
 #include <QList>
 #include <QString>
 #include <QString>
 #include <QTemporaryFile>
 #include <QTemporaryFile>
+#include <QNetworkDiskCache>
 
 
 class Fb2TemporaryFile : public QTemporaryFile
 class Fb2TemporaryFile : public QTemporaryFile
 {
 {
@@ -37,4 +38,52 @@ public:
 
 
 typedef QListIterator<Fb2TemporaryFile*> Fb2TemporaryIterator;
 typedef QListIterator<Fb2TemporaryFile*> Fb2TemporaryIterator;
 
 
+class Fb2NetworkDiskCache : public QNetworkDiskCache
+{
+public:
+    explicit Fb2NetworkDiskCache(QObject *parent = 0) : QNetworkDiskCache(parent) {}
+    QNetworkCacheMetaData metaData(const QUrl &url);
+    QIODevice *data(const QUrl &url);
+};
+
+#if 0
+
+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
+public:
+    explicit Fb2NetworkAccessManager(QObject *parent = 0);
+    void insert(const QString &file, const QByteArray &data);
+
+protected:
+    virtual QNetworkReply *createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData = 0);
+
+private:
+    QNetworkReply *imageRequest(Operation op, const QNetworkRequest &request);
+
+private:
+    typedef QMap<QString, QByteArray> ImageMap;
+    ImageMap m_images;
+
+};
+
+#endif
+
 #endif // FB2TEMP_H
 #endif // FB2TEMP_H

+ 4 - 0
source/fb2view.cpp

@@ -29,6 +29,10 @@ Fb2WebPage::Fb2WebPage(QObject *parent)
     s->setAttribute(QWebSettings::PluginsEnabled, false);
     s->setAttribute(QWebSettings::PluginsEnabled, false);
     s->setAttribute(QWebSettings::ZoomTextOnly, true);
     s->setAttribute(QWebSettings::ZoomTextOnly, true);
     s->setUserStyleSheetUrl(QUrl::fromLocalFile(":style.css"));
     s->setUserStyleSheetUrl(QUrl::fromLocalFile(":style.css"));
+
+    Fb2NetworkDiskCache * cache = new Fb2NetworkDiskCache(this);
+    cache->setCacheDirectory("/home/user/tmp/");
+    networkAccessManager()->setCache(cache);
 }
 }
 
 
 bool Fb2WebPage::acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest &request, NavigationType type)
 bool Fb2WebPage::acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest &request, NavigationType type)