Преглед на файлове

Use QMetaObject::invokeMethod() in read thread for image files

Kandrashin Denis преди 13 години
родител
ревизия
021dc4fcb8
променени са 4 файла, в които са добавени 37 реда и са изтрити 34 реда
  1. 6 22
      source/fb2read.cpp
  2. 1 3
      source/fb2read.h
  3. 22 5
      source/fb2view.cpp
  4. 8 4
      source/fb2view.h

+ 6 - 22
source/fb2read.cpp

@@ -12,6 +12,7 @@ Fb2ReadThread::Fb2ReadThread(QObject *parent, const QString &filename)
     , m_filename(filename)
     , m_abort(false)
 {
+    connect(this, SIGNAL(html(QString, QString)), parent, SLOT(html(QString, QString)));
 }
 
 Fb2ReadThread::~Fb2ReadThread()
@@ -32,11 +33,6 @@ void Fb2ReadThread::run()
     if (parse()) emit html(m_filename, m_html);
 }
 
-void Fb2ReadThread::onFile(const QString &name, const QString &path)
-{
-    emit file(name, path);
-}
-
 bool Fb2ReadThread::parse()
 {
     QFile file(m_filename);
@@ -65,28 +61,16 @@ Fb2ReadWriter::Fb2ReadWriter(Fb2ReadThread &thread)
     setAutoFormattingIndent(2);
 }
 
-QString Fb2ReadWriter::addFile(const QString &name, const QByteArray &data)
+QString Fb2ReadWriter::getFile(const QString &name)
 {
-    QString path = getFile(name);
-    QFile file(path);
-    if (file.open(QIODevice::WriteOnly)) {
-        file.write(data);
-        m_thread.onFile(name, path);
-    }
+    QString path;
+    QMetaObject::invokeMethod(m_thread.parent(), "temp", Qt::DirectConnection, Q_RETURN_ARG(QString, path), Q_ARG(QString, name));
     return path;
 }
 
-QString Fb2ReadWriter::getFile(const QString &name)
+void Fb2ReadWriter::addFile(const QString &name, const QByteArray &data)
 {
-    StringHash::const_iterator i = m_hash.find(name);
-    if (i == m_hash.end()) {
-        QTemporaryFile file;
-        file.setAutoRemove(false);
-        file.open();
-        return m_hash.insert(name, file.fileName()).value();
-    } else {
-        return i.value();
-    }
+    QMetaObject::invokeMethod(m_thread.parent(), "data", Qt::QueuedConnection, Q_ARG(QString, name), Q_ARG(QByteArray, data));
 }
 
 QString Fb2ReadWriter::newId()

+ 1 - 3
source/fb2read.h

@@ -16,11 +16,9 @@ class Fb2ReadThread : public QThread
 public:
     Fb2ReadThread(QObject *parent, const QString &filename);
     ~Fb2ReadThread();
-    void onFile(const QString &name, const QString &path);
     QString * data() { return &m_html; }
 
 signals:
-    void file(QString name, QString path);
     void html(QString name, QString html);
 
 public slots:
@@ -43,7 +41,7 @@ class Fb2ReadWriter : public QXmlStreamWriter
 {
 public:
     explicit Fb2ReadWriter(Fb2ReadThread &thread);
-    QString addFile(const QString &name, const QByteArray &data);
+    void addFile(const QString &name, const QByteArray &data);
     QString getFile(const QString &name);
     QString newId();
 private:

+ 22 - 5
source/fb2view.cpp

@@ -54,7 +54,7 @@ Fb2WebView::Fb2WebView(QWidget *parent)
 
 Fb2WebView::~Fb2WebView()
 {
-    foreach (QString value, m_files) QFile::remove(value);
+    foreach (QTemporaryFile *file, m_files) delete file;
 }
 
 QWebElement Fb2WebView::doc()
@@ -94,14 +94,30 @@ void Fb2WebView::load(const QString &filename)
 {
     if (m_thread) return;
     m_thread = new Fb2ReadThread(this, filename);
-    connect(m_thread, SIGNAL(file(QString, QString)), SLOT(file(QString, QString)));
-    connect(m_thread, SIGNAL(html(QString, QString)), SLOT(html(QString, QString)));
     m_thread->start();
 }
 
-void Fb2WebView::file(QString name, QString path)
+QTemporaryFile * Fb2WebView::file(const QString &name)
 {
-    m_files.insert(name, path);
+    TemporaryHash::const_iterator it = m_files.find(name);
+    if (it == m_files.end()) {
+        it = m_files.insert(name, new QTemporaryFile());
+        it.value()->open();
+    }
+    return it.value();
+}
+
+QString Fb2WebView::temp(QString name)
+{
+    return file(name)->fileName();
+}
+
+void Fb2WebView::data(QString name, QByteArray data)
+{
+    QTemporaryFile * temp = file(name);
+    temp->write(data);
+    temp->close();
+    temp->open();
 }
 
 void Fb2WebView::html(QString name, QString html)
@@ -172,3 +188,4 @@ bool Fb2WebView::SupChecked()
 {
     return pageAction(QWebPage::ToggleSuperscript)->isChecked();
 }
+

+ 8 - 4
source/fb2view.h

@@ -1,8 +1,10 @@
 #ifndef FB2VIEW_H
 #define FB2VIEW_H
 
+#include <QByteArray>
 #include <QHash>
 #include <QResizeEvent>
+#include <QTemporaryFile>
 #include <QTimer>
 #include <QThread>
 #include <QWebElement>
@@ -73,9 +75,10 @@ public:
 signals:
     
 public slots:
-    void linkHovered(const QString &link, const QString &title, const QString &textContent);
-    void file(QString name, QString path);
+    QString temp(QString name);
+    void data(QString name, QByteArray data);
     void html(QString name, QString html);
+    void linkHovered(const QString &link, const QString &title, const QString &textContent);
     void zoomIn();
     void zoomOut();
     void zoomOrig();
@@ -84,11 +87,12 @@ private slots:
     void fixContents();
 
 private:
+    QTemporaryFile * file(const QString &name);
     QWebElement doc();
 
 private:
-    typedef QHash<QString, QString> StringHash;
-    StringHash m_files;
+    typedef QHash<QString, QTemporaryFile*> TemporaryHash;
+    TemporaryHash m_files;
     QThread *m_thread;
 };