Kandrashin Denis 12 anni fa
parent
commit
11d95f9c0e
9 ha cambiato i file con 86 aggiunte e 104 eliminazioni
  1. 4 10
      source/fb2page.cpp
  2. 3 2
      source/fb2page.hpp
  3. 5 5
      source/fb2read.cpp
  4. 3 3
      source/fb2read.hpp
  5. 9 3
      source/fb2save.cpp
  6. 29 32
      source/fb2temp.cpp
  7. 29 45
      source/fb2temp.hpp
  8. 3 3
      source/fb2text.cpp
  9. 1 1
      source/fb2text.hpp

+ 4 - 10
source/fb2page.cpp

@@ -48,7 +48,7 @@ FbTextPage::FbTextPage(QObject *parent)
     connect(this, SIGNAL(selectionChanged()), SLOT(showStatus()));
 }
 
-FbNetworkAccessManager *FbTextPage::temp()
+FbNetworkAccessManager *FbTextPage::manager()
 {
     return qobject_cast<FbNetworkAccessManager*>(networkAccessManager());
 }
@@ -67,17 +67,11 @@ bool FbTextPage::read(QIODevice *device)
     return true;
 }
 
-void FbTextPage::html(QObject *temp, const QString &html)
+void FbTextPage::html(const QString &html, FbStore *store)
 {
-    FbNetworkAccessManager *manager = qobject_cast<FbNetworkAccessManager*>(temp);
-    if (!manager) { temp->deleteLater(); return; }
-
-    QUrl url = FbTextPage::createUrl();
-    setNetworkAccessManager(manager);
-    manager->setPath(url.path());
-    manager->setParent(this);
-
     QWebSettings::clearMemoryCaches();
+    QUrl url = FbTextPage::createUrl();
+    manager()->setStore(url, store);
     mainFrame()->setHtml(html, url);
 
 }

+ 3 - 2
source/fb2page.hpp

@@ -5,6 +5,7 @@
 #include <QUndoCommand>
 #include <QWebPage>
 
+class FbStore;
 class FbTextElement;
 class FbNetworkAccessManager;
 
@@ -28,7 +29,7 @@ class FbTextPage : public QWebPage
 
 public:
     explicit FbTextPage(QObject *parent = 0);
-    FbNetworkAccessManager *temp();
+    FbNetworkAccessManager *manager();
     bool read(const QString &html);
     bool read(QIODevice *device);
     void push(QUndoCommand * command, const QString &text = QString());
@@ -48,7 +49,7 @@ signals:
     void status(const QString &text);
 
 public slots:
-    void html(QObject *temp, const QString &html);
+    void html(const QString &html, FbStore *store);
     void insertBody();
     void insertTitle();
     void insertAnnot();

+ 5 - 5
source/fb2read.cpp

@@ -12,7 +12,7 @@
 void FbReadThread::execute(QObject *parent, QXmlInputSource *source, QIODevice *device)
 {
     FbReadThread *thread = new FbReadThread(parent, source, device);
-    connect(thread, SIGNAL(html(QObject*,QString)), parent, SLOT(html(QObject*,QString)));
+    connect(thread, SIGNAL(html(QString, FbStore*)), parent, SLOT(html(QString, FbStore*)));
     thread->start();
 }
 
@@ -21,7 +21,7 @@ FbReadThread::FbReadThread(QObject *parent, QXmlInputSource *source, QIODevice *
     , m_device(device)
     , m_source(source)
 {
-    m_temp = new FbNetworkAccessManager(this);
+    m_store = new FbStore(this);
 }
 
 FbReadThread::~FbReadThread()
@@ -33,9 +33,9 @@ FbReadThread::~FbReadThread()
 void FbReadThread::run()
 {
     if (parse()) {
-        emit html(m_temp, m_html);
+        emit html(m_html, m_store);
     } else {
-        delete m_temp;
+        delete m_store;
     }
     deleteLater();
 }
@@ -45,7 +45,7 @@ bool FbReadThread::parse()
     QXmlStreamWriter writer(&m_html);
     FbReadHandler handler(writer);
 
-    connect(&handler, SIGNAL(binary(QString,QByteArray)), m_temp, SLOT(binary(QString,QByteArray)));
+    connect(&handler, SIGNAL(binary(QString,QByteArray)), m_store, SLOT(binary(QString,QByteArray)));
 
 #ifdef FB2_USE_LIBXML2
     XML2::XmlReader reader;

+ 3 - 3
source/fb2read.hpp

@@ -8,7 +8,7 @@
 #include <QThread>
 #include <QXmlDefaultHandler>
 
-class FbNetworkAccessManager;
+class FbStore;
 
 class FbReadThread : public QThread
 {
@@ -20,7 +20,7 @@ public:
 
 signals:
     void binary(const QString &name, const QByteArray &data);
-    void html(QObject *temp, const QString &html);
+    void html(const QString &html, FbStore *store);
 
 protected:
     void run();
@@ -32,7 +32,7 @@ private:
 private:
     QIODevice *m_device;
     QXmlInputSource *m_source;
-    FbNetworkAccessManager *m_temp;
+    FbStore *m_store;
     QString m_html;
 };
 

+ 9 - 3
source/fb2save.cpp

@@ -199,9 +199,12 @@ QByteArray FbSaveWriter::downloadFile(const QUrl &url)
 
 QString FbSaveWriter::filename(const QString &path)
 {
+    FbStore *store = m_view.store();
+    if (!store) return QString();
+
     if (path.left(1) == "#") {
         QString name = path.mid(1);
-        if (m_view.files()->exists(name)) {
+        if (store->exists(name)) {
             m_names.append(name);
             return name;
         }
@@ -210,7 +213,7 @@ QString FbSaveWriter::filename(const QString &path)
         QUrl url = path;
         QByteArray data = downloadFile(url);
         if (data.size() == 0) return QString();
-        QString name = m_view.files()->add(url.path(), data);
+        QString name = store->add(url.path(), data);
         m_names.append(name);
         return name;
     }
@@ -237,11 +240,14 @@ void FbSaveWriter::writeStyle()
 
 void FbSaveWriter::writeFiles()
 {
+    FbStore *store = m_view.store();
+    if (!store) return;
+
     QStringListIterator it(m_names);
     while (it.hasNext()) {
         QString name = it.next();
         if (name.isEmpty()) continue;
-        FbBinary * file = m_view.files()->get(name);
+        FbBinary * file = store->get(name);
         if (!file) continue;
         writeStartElement("binary", 2);
         writeAttribute("id", name);

+ 29 - 32
source/fb2temp.cpp

@@ -53,7 +53,8 @@ QByteArray FbBinary::data()
 //  FbStore
 //---------------------------------------------------------------------------
 
-FbStore::FbStore()
+FbStore::FbStore(QObject *parent)
+    : QObject(parent)
 {
 }
 
@@ -63,6 +64,11 @@ FbStore::~FbStore()
     while (it.hasNext()) delete it.next();
 }
 
+void FbStore::binary(const QString &name, const QByteArray &data)
+{
+    set(name, data);
+}
+
 QString FbStore::add(const QString &path, QByteArray &data)
 {
     QString hash = FbBinary::md5(data);
@@ -197,47 +203,52 @@ qint64 FbImageReply::readData(char *data, qint64 maxSize)
 
 FbNetworkAccessManager::FbNetworkAccessManager(QObject *parent)
     : QNetworkAccessManager(parent)
+    , m_store(new FbStore(this))
 {
-//    QWebSettings::clearMemoryCaches();
 }
 
-void FbNetworkAccessManager::binary(const QString &name, const QByteArray &data)
+void FbNetworkAccessManager::setStore(const QUrl url, FbStore *store)
 {
-    m_files.set(name, data);
+    m_path = url.path();
+    if (m_store) delete m_store;
+    if (!store) store = new FbStore(this);
+    store->setParent(this);
+    m_store = store;
 }
 
 QNetworkReply * FbNetworkAccessManager::createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData)
 {
-    const QUrl &url = request.url();
-    const QString path = url.path();
-    if (url.scheme() == "fb2" && path == m_path) return imageRequest(op, request);
+    if (m_store) {
+        const QUrl &url = request.url();
+        const QString path = url.path();
+        if (url.scheme() == "fb2" && path == m_path) {
+            QString name = request.url().fragment();
+            QByteArray data = m_store->data(name);
+            return new FbImageReply(op, request, data);
+        }
+    }
     return QNetworkAccessManager::createRequest(op, request, outgoingData);
 }
 
-QNetworkReply * FbNetworkAccessManager::imageRequest(Operation op, const QNetworkRequest &request)
-{
-    QString name = request.url().fragment();
-    QByteArray data = m_files.data(name);
-    return new FbImageReply(op, request, data);
-}
-
 QVariant FbNetworkAccessManager::info(int row, int col) const
 {
+    if (!m_store) return QVariant();
     if (0 <= row && row < count()) {
-        FbBinary *file = m_files[row];
+        FbBinary *file = m_store->at(row);
         switch (col) {
             case 2: return file->type();
             case 3: return file->size();
         }
-        return m_files[row]->name();
+        return m_store->at(row)->name();
     }
     return QVariant();
 }
 
 QByteArray FbNetworkAccessManager::data(int index) const
 {
+    if (!m_store) return QByteArray();
     if (0 <= index && index < count()) {
-        return m_files[index]->data();
+        return m_store->at(index)->data();
     }
     return QByteArray();
 }
@@ -330,18 +341,6 @@ FbListModel * FbListView::model() const
     return qobject_cast<FbListModel*>(QTreeView::model());
 }
 
-//---------------------------------------------------------------------------
-//  FbListWidget::FbProxy
-//---------------------------------------------------------------------------
-
-QNetworkReply *FbListWidget::FbProxy::createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData)
-{
-    if (FbNetworkAccessManager * m = qobject_cast<FbNetworkAccessManager*>(m_page->networkAccessManager())) {
-        return m->createRequest(op, request, outgoingData);
-    }
-    return QNetworkAccessManager::createRequest(op, request, outgoingData);
-}
-
 //---------------------------------------------------------------------------
 //  FbListWidget
 //---------------------------------------------------------------------------
@@ -362,10 +361,8 @@ FbListWidget::FbListWidget(FbTextEdit *text, QWidget* parent)
     FbTextFrame *frame = new FbTextFrame(splitter);
     splitter->addWidget(frame);
 
-    FbProxy *proxy = new FbProxy(text->page(), this);
-
     m_view = new FbTextBase(frame);
-    m_view->page()->setNetworkAccessManager(proxy);
+    m_view->page()->setNetworkAccessManager(text->page()->networkAccessManager());
     frame->layout()->addWidget(m_view);
 
     splitter->setSizes(QList<int>() << 100 << 100);

+ 29 - 45
source/fb2temp.hpp

@@ -42,7 +42,7 @@ class FbStore : public QObject, private FbBinatyList
 {
     Q_OBJECT
 public:
-    explicit FbStore();
+    explicit FbStore(QObject *parent);
     virtual ~FbStore();
     QString add(const QString &path, QByteArray &data);
     bool exists(const QString &name) const;
@@ -50,8 +50,10 @@ public:
     const QString & set(const QString &name, QByteArray data, const QString &hash = QString());
     QString name(const QString &hash) const;
     QByteArray data(const QString &name) const;
+public slots:
+    void binary(const QString &name, const QByteArray &data);
 public:
-    inline FbBinary * operator[](int i) const { return FbBinatyList::operator[](i); }
+    inline FbBinary * at(int i) const { return FbBinatyList::at(i); }
     inline int count() const { return FbBinatyList::count(); }
 private:
     QString newName(const QString &path);
@@ -71,6 +73,31 @@ public:
 
 #endif
 
+class FbNetworkAccessManager : public QNetworkAccessManager
+{
+    Q_OBJECT
+
+public:
+    explicit FbNetworkAccessManager(QObject *parent = 0);
+    void setStore(const QUrl url, FbStore *store);
+    FbStore *store() const { return m_store; }
+
+public:
+    QString add(const QString &path, QByteArray &data) { return m_store->add(path, data); }
+    bool exists(const QString &name) const { return m_store->exists(name); }
+    FbBinary * get(const QString &name) const { return m_store->get(name); }
+    int count() const { return m_store->count(); }
+    QByteArray data(int index) const;
+    QVariant info(int row, int col) const;
+
+protected:
+    virtual QNetworkReply *createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData = 0);
+
+private:
+    FbStore *m_store;
+    QString m_path;
+};
+
 class FbImageReply : public QNetworkReply
 {
     Q_OBJECT
@@ -127,17 +154,6 @@ class FbListWidget : public QWidget
 {
     Q_OBJECT
 
-public:
-    class FbProxy : public QNetworkAccessManager
-    {
-    public:
-        FbProxy(QWebPage *page, QObject *parent): QNetworkAccessManager(parent), m_page(page) {}
-    protected:
-        virtual QNetworkReply *createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData = 0);
-    private:
-        QWebPage *m_page;
-    };
-
 public:
     explicit FbListWidget(FbTextEdit *text, QWidget* parent = 0);
 
@@ -155,36 +171,4 @@ private:
     QWebView *m_view;
 };
 
-class FbNetworkAccessManager : public QNetworkAccessManager
-{
-    Q_OBJECT
-
-public:
-    explicit FbNetworkAccessManager(QObject *parent = 0);
-    FbStore & files() { return m_files; }
-    void setPath(const QString &path) { m_path = path; }
-
-public slots:
-    void binary(const QString &name, const QByteArray &data);
-
-public:
-    QString add(const QString &path, QByteArray &data) { return m_files.add(path, data); }
-    bool exists(const QString &name) const { return m_files.exists(name); }
-    FbBinary * get(const QString &name) const { return m_files.get(name); }
-    int count() const { return m_files.count(); }
-    QByteArray data(int index) const;
-    QVariant info(int row, int col) const;
-
-protected:
-    virtual QNetworkReply *createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData = 0);
-
-private:
-    QNetworkReply *imageRequest(Operation op, const QNetworkRequest &request);
-
-private:
-    FbStore m_files;
-    QString m_path;
-    friend class FbListWidget::FbProxy;
-};
-
 #endif // FB2TEMP_H

+ 3 - 3
source/fb2text.cpp

@@ -232,9 +232,9 @@ FbTextPage *FbTextEdit::page()
     return qobject_cast<FbTextPage*>(FbTextBase::page());
 }
 
-FbNetworkAccessManager *FbTextEdit::files()
+FbStore *FbTextEdit::store()
 {
-    return page()->temp();
+    return page()->manager()->store();
 }
 
 QAction * FbTextEdit::act(Fb::Actions index) const
@@ -599,7 +599,7 @@ void FbTextEdit::insertImage()
     if (!file.open(QIODevice::ReadOnly)) return;
 
     QByteArray data = file.readAll();
-    QString name = files()->add(path, data);
+    QString name = store()->add(path, data);
     execCommand("insertImage", name.prepend("#"));
 }
 

+ 1 - 1
source/fb2text.hpp

@@ -75,7 +75,7 @@ public:
     virtual ~FbTextEdit();
 
     FbTextPage *page();
-    FbNetworkAccessManager *files();
+    FbStore *store();
     bool save(QIODevice *device, const QString &codec = QString());
     bool save(QByteArray *array);
     bool save(QString *string);