Răsfoiți Sursa

Action "Insert image" now works

Kandrashin Denis 13 ani în urmă
părinte
comite
fad2fddb05
7 a modificat fișierele cu 83 adăugiri și 99 ștergeri
  1. 3 5
      source/fb2read.cpp
  2. 25 24
      source/fb2save.cpp
  3. 1 1
      source/fb2save.h
  4. 33 53
      source/fb2temp.cpp
  5. 14 12
      source/fb2temp.hpp
  6. 3 1
      source/fb2tree.cpp
  7. 4 3
      source/fb2view.cpp

+ 3 - 5
source/fb2read.cpp

@@ -321,10 +321,9 @@ Fb2ReadHandler::ImageHandler::ImageHandler(Fb2ReadHandler &owner, const QString
     : TextHandler(owner, name, atts, "img")
 {
     QString href = Value(atts, "href");
-    while (href.left(1) == "#") href.remove(0, 1);
-    QString path = m_owner.getFile(href);
-    writer().writeAttribute("src", path);
-    writer().writeAttribute("alt", href);
+    if (href.left(1) == "#") href.remove(0, 1);
+    href.prepend("fb2:");
+    writer().writeAttribute("src", href);
 }
 
 //---------------------------------------------------------------------------
@@ -349,7 +348,6 @@ void Fb2ReadHandler::BinaryHandler::EndTag(const QString &name)
     if (!m_file.isEmpty()) m_owner.addFile(m_file, QByteArray::fromBase64(in));
 }
 
-
 //---------------------------------------------------------------------------
 //  Fb2ReadHandler
 //---------------------------------------------------------------------------

+ 25 - 24
source/fb2save.cpp

@@ -70,12 +70,17 @@ void Fb2SaveWriter::writeLineEnd()
     m_line++;
 }
 
-QByteArray Fb2SaveWriter::downloadFile(const QString &src)
+QByteArray Fb2SaveWriter::downloadFile(const QUrl &url)
 {
-    QUrl url(src);
     QNetworkRequest request(url);
     QNetworkAccessManager * network = m_view.page()->networkAccessManager();
-    QNetworkReply * reply = network->get(request);
+    QScopedPointer<QNetworkReply> reply(network->get(request));
+    if (reply.isNull()) return QByteArray();
+
+    QEventLoop loop;
+    QObject::connect(reply.data(), SIGNAL(finished()), &loop, SLOT(quit()));
+    loop.exec();
+
     return reply->readAll();
 }
 
@@ -96,29 +101,25 @@ QString Fb2SaveWriter::newFileName(const QString &path)
 
 QString Fb2SaveWriter::getFileName(const QString &path)
 {
-    QString hash = m_view.files().hash(path);
-    if (hash.isEmpty()) {
-        QUrl url(path);
-        QNetworkRequest request(url);
-        QNetworkAccessManager * network = m_view.page()->networkAccessManager();
-        QScopedPointer<QNetworkReply> reply(network->get(request));
-        if (reply.isNull()) return QString();
-
-        QEventLoop loop;
-        QObject::connect(reply.data(), SIGNAL(finished()), &loop, SLOT(quit()));
-        loop.exec();
-
-        QByteArray data = reply->readAll();
-
-        hash = Fb2TemporaryFile::md5(data);
-        QString name = newFileName(url.path());
-        m_files.set(name, data, hash);
-        m_names.append(name);
-        return name;
+    QUrl url = path;
+    if (url.scheme() == "fb2") {
+        QString name = url.path();
+        if (m_view.files().exists(name)) {
+            m_names.append(name);
+            return name;
+        }
+        return QString();
     } else {
+        QByteArray data = downloadFile(url);
+        if (data.size() == 0) return QString();
+        QString hash = Fb2TemporaryFile::md5(data);
         QString name = m_view.files().name(hash);
-        if (name.isEmpty()) return QString();
-        if (m_names.indexOf(name) == -1) m_names.append(name);
+        if (name.isEmpty()) m_files.name(hash);
+        if (name.isEmpty()) {
+            name = newFileName(url.path());
+            m_files.set(name, data, hash);
+            m_names.append(name);
+        }
         return name;
     }
 }

+ 1 - 1
source/fb2save.h

@@ -28,7 +28,7 @@ public:
     void writeFiles();
 private:
     void Init();
-    QByteArray downloadFile(const QString &src);
+    QByteArray downloadFile(const QUrl &url);
     QString getFileData(const QString &name);
     QString newFileName(const QString &path);
 private:

+ 33 - 53
source/fb2temp.cpp

@@ -4,6 +4,8 @@
 #include <QUrl>
 #include <QtDebug>
 
+#include "fb2view.hpp"
+
 //---------------------------------------------------------------------------
 //  Fb2TemporaryFile
 //---------------------------------------------------------------------------
@@ -56,6 +58,21 @@ Fb2TemporaryFile & Fb2TemporaryList::get(const QString &name, const QString &has
     return *file;
 }
 
+QByteArray Fb2TemporaryList::fileData(const QString &name) const
+{
+    Fb2TemporaryIterator it(*this);
+    while (it.hasNext()) {
+        Fb2TemporaryFile *file = it.next();
+        if (file->name() == name) {
+            QByteArray data = file->readAll();
+            file->close();
+            file->open();
+            return data;
+        }
+    }
+    return QByteArray();
+}
+
 QString Fb2TemporaryList::set(const QString &name, const QByteArray &data, const QString &hash)
 {
     Fb2TemporaryFile & file = get(name, hash);
@@ -103,6 +120,8 @@ bool Fb2TemporaryList::exists(const QString &name) const
     return false;
 }
 
+#if 0
+
 //---------------------------------------------------------------------------
 //  Fb2NetworkDiskCache
 //---------------------------------------------------------------------------
@@ -119,7 +138,7 @@ QIODevice * Fb2NetworkDiskCache::data(const QUrl &url)
     return QNetworkDiskCache::data(url);
 }
 
-#if 0
+#endif
 
 //---------------------------------------------------------------------------
 //  Fb2ImageReply
@@ -130,49 +149,23 @@ Fb2ImageReply::Fb2ImageReply(QNetworkAccessManager::Operation op, const QNetwork
     , 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());
+    setOperation(op);
     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;
-    }
+    if (offset >= content.size()) return -1;
+    QMetaObject::invokeMethod(this, "readyRead", Qt::QueuedConnection);
+    qint64 number = qMin(maxSize, content.size() - offset);
+    memcpy(data, content.constData() + offset, number);
+    offset += number;
+    return number;
 }
 
 //---------------------------------------------------------------------------
@@ -181,8 +174,9 @@ qint64 Fb2ImageReply::readData(char *data, qint64 maxSize)
 //    http://doc.trolltech.com/qq/32/qq32-webkit-protocols.html
 //---------------------------------------------------------------------------
 
-Fb2NetworkAccessManager::Fb2NetworkAccessManager(QObject *parent)
-    : QNetworkAccessManager(parent)
+Fb2NetworkAccessManager::Fb2NetworkAccessManager(Fb2WebView &view)
+    : QNetworkAccessManager(&view)
+    , m_view(view)
 {
 }
 
@@ -194,21 +188,7 @@ QNetworkReply * Fb2NetworkAccessManager::createRequest(Operation op, const QNetw
 
 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);
+    QString name = request.url().path();
+    QByteArray data = m_view.files().fileData(name);
+    return new Fb2ImageReply(op, request, data);
 }
-
-#endif
-

+ 14 - 12
source/fb2temp.hpp

@@ -3,9 +3,12 @@
 
 #include <QByteArray>
 #include <QList>
+#include <QNetworkReply>
 #include <QString>
 #include <QTemporaryFile>
-#include <QNetworkDiskCache>
+#include <QNetworkAccessManager>
+
+class Fb2WebView;
 
 class Fb2TemporaryFile : public QTemporaryFile
 {
@@ -34,10 +37,14 @@ public:
     QString hash(const QString &path) const;
     QString name(const QString &hash) const;
     QString data(const QString &name) const;
+
+    QByteArray fileData(const QString &name) const;
 };
 
 typedef QListIterator<Fb2TemporaryFile*> Fb2TemporaryIterator;
 
+#if 0
+
 class Fb2NetworkDiskCache : public QNetworkDiskCache
 {
 public:
@@ -46,16 +53,16 @@ public:
     QIODevice *data(const QUrl &url);
 };
 
-#if 0
+#endif
 
 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;
+    qint64 bytesAvailable() const { return content.size(); }
+    bool isSequential() const { return true; }
+    void abort() { close(); }
 
 protected:
     qint64 readData(char *data, qint64 maxSize);
@@ -69,8 +76,7 @@ class Fb2NetworkAccessManager : public QNetworkAccessManager
 {
     Q_OBJECT
 public:
-    explicit Fb2NetworkAccessManager(QObject *parent = 0);
-    void insert(const QString &file, const QByteArray &data);
+    explicit Fb2NetworkAccessManager(Fb2WebView &view);
 
 protected:
     virtual QNetworkReply *createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData = 0);
@@ -79,11 +85,7 @@ private:
     QNetworkReply *imageRequest(Operation op, const QNetworkRequest &request);
 
 private:
-    typedef QMap<QString, QByteArray> ImageMap;
-    ImageMap m_images;
-
+    Fb2WebView & m_view;
 };
 
-#endif
-
 #endif // FB2TEMP_H

+ 3 - 1
source/fb2tree.cpp

@@ -5,6 +5,7 @@
 #include <QWebPage>
 #include <QWebView>
 #include <QTreeView>
+#include <QUrl>
 
 Fb2TreeItem::Fb2TreeItem(QWebElement &element, Fb2TreeItem *parent)
     : QObject(parent)
@@ -25,7 +26,8 @@ Fb2TreeItem::Fb2TreeItem(QWebElement &element, Fb2TreeItem *parent)
         }
         if (!style.isEmpty()) m_name = style;
     } else if (m_name == "img") {
-        m_text = element.attribute("alt");
+        QUrl url = element.attribute("src");
+        m_text = url.path();
     }
     addChildren(element);
 }

+ 4 - 3
source/fb2view.cpp

@@ -30,9 +30,9 @@ Fb2WebPage::Fb2WebPage(QObject *parent)
     s->setAttribute(QWebSettings::ZoomTextOnly, true);
     s->setUserStyleSheetUrl(QUrl::fromLocalFile(":style.css"));
 
-    Fb2NetworkDiskCache * cache = new Fb2NetworkDiskCache(this);
-    cache->setCacheDirectory("/home/user/tmp/");
-    networkAccessManager()->setCache(cache);
+//    Fb2NetworkDiskCache * cache = new Fb2NetworkDiskCache(this);
+//    cache->setCacheDirectory("/home/user/tmp/");
+//    networkAccessManager()->setCache(cache);
 }
 
 bool Fb2WebPage::acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest &request, NavigationType type)
@@ -55,6 +55,7 @@ Fb2WebView::Fb2WebView(QWidget *parent)
     , m_thread(0)
 {
     setPage(new Fb2WebPage(this));
+    page()->setNetworkAccessManager(new Fb2NetworkAccessManager(*this));
     connect(page(), SIGNAL(contentsChanged()), this, SLOT(fixContents()));
     connect(page(), SIGNAL(linkHovered(QString,QString,QString)), this, SLOT(linkHovered(QString,QString,QString)));
 }