Bläddra i källkod

Detect binary content type

Kandrashin Denis 13 år sedan
förälder
incheckning
4dace6581d
8 ändrade filer med 46 tillägg och 41 borttagningar
  1. 22 21
      source/fb2read.cpp
  2. 2 2
      source/fb2read.hpp
  3. 15 4
      source/fb2save.cpp
  4. 1 0
      source/fb2save.hpp
  5. 2 7
      source/fb2temp.cpp
  6. 1 4
      source/fb2temp.hpp
  7. 2 2
      source/fb2view.cpp
  8. 1 1
      source/fb2view.hpp

+ 22 - 21
source/fb2read.cpp

@@ -85,6 +85,21 @@ bool Fb2ReadThread::parse()
 
 
 #endif
 #endif
 
 
+//---------------------------------------------------------------------------
+//  Fb2ReadHandler::BaseHandler
+//---------------------------------------------------------------------------
+
+void Fb2ReadHandler::BaseHandler::writeAttributes(const QXmlAttributes &atts)
+{
+    int count = atts.count();
+    for (int i = 0; i < count; i++) {
+        if (atts.localName(i) == "href") continue;
+        QString name = atts.qName(i);
+        if (name != "id") name.prepend("fb2.");
+        writer().writeAttribute(name, atts.value(i));
+    }
+}
+
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 //  Fb2ReadHandler::RootHandler
 //  Fb2ReadHandler::RootHandler
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
@@ -129,10 +144,7 @@ Fb2ReadHandler::StyleHandler::StyleHandler(Fb2ReadHandler &owner, const QString
 {
 {
     writer().writeStartElement("div");
     writer().writeStartElement("div");
     writer().writeAttribute("class", name);
     writer().writeAttribute("class", name);
-    int count = atts.count();
-    for (int i = 0; i < count; i++) {
-        writer().writeAttribute("fb2:" + atts.qName(i), atts.value(i));
-    }
+    writeAttributes(atts);
 }
 }
 
 
 void Fb2ReadHandler::StyleHandler::TxtTag(const QString &text)
 void Fb2ReadHandler::StyleHandler::TxtTag(const QString &text)
@@ -162,10 +174,7 @@ Fb2ReadHandler::HeadHandler::HeadHandler(Fb2ReadHandler &owner, const QString &n
 {
 {
     writer().writeStartElement("div");
     writer().writeStartElement("div");
     writer().writeAttribute("class", name);
     writer().writeAttribute("class", name);
-    int count = atts.count();
-    for (int i = 0; i < count; i++) {
-        writer().writeAttribute("fb2:" + atts.qName(i), atts.value(i));
-    }
+    writeAttributes(atts);
 }
 }
 
 
 Fb2XmlHandler::NodeHandler * Fb2ReadHandler::HeadHandler::NewTag(const QString &name, const QXmlAttributes &atts)
 Fb2XmlHandler::NodeHandler * Fb2ReadHandler::HeadHandler::NewTag(const QString &name, const QXmlAttributes &atts)
@@ -285,18 +294,14 @@ void Fb2ReadHandler::TextHandler::Init(const QXmlAttributes &atts)
     QString id = Value(atts, "id");
     QString id = Value(atts, "id");
     if (!m_style.isEmpty()) {
     if (!m_style.isEmpty()) {
         writer().writeAttribute("class", m_style);
         writer().writeAttribute("class", m_style);
-        if (m_style == "body" && Value(atts, "name").toLower() == "notes") {
-            writer().writeAttribute("name", "notes");
-        }
     }
     }
-    if (!id.isEmpty()) writer().writeAttribute("id", id);
+    writeAttributes(atts);
 }
 }
 
 
 Fb2XmlHandler::NodeHandler * Fb2ReadHandler::TextHandler::NewTag(const QString &name, const QXmlAttributes &atts)
 Fb2XmlHandler::NodeHandler * Fb2ReadHandler::TextHandler::NewTag(const QString &name, const QXmlAttributes &atts)
 {
 {
     QString tag, style;
     QString tag, style;
     switch (toKeyword(name)) {
     switch (toKeyword(name)) {
-        case Style     : return new SpanHandler(this, name, atts);
         case Anchor    : return new AnchorHandler(this, name, atts);
         case Anchor    : return new AnchorHandler(this, name, atts);
         case Image     : return new ImageHandler(m_owner, name, atts);
         case Image     : return new ImageHandler(m_owner, name, atts);
         case Section   : tag = "div"; style = name; break;
         case Section   : tag = "div"; style = name; break;
@@ -307,6 +312,7 @@ Fb2XmlHandler::NodeHandler * Fb2ReadHandler::TextHandler::NewTag(const QString &
         case Code      : tag = "tt";  break;
         case Code      : tag = "tt";  break;
         case Sub       : tag = "sub"; break;
         case Sub       : tag = "sub"; break;
         case Sup       : tag = "sup"; break;
         case Sup       : tag = "sup"; break;
+        case Style     : tag = "span"; break;
         default: ;
         default: ;
     }
     }
     return new TextHandler(this, name, atts, tag, style);
     return new TextHandler(this, name, atts, tag, style);
@@ -338,10 +344,6 @@ bool Fb2ReadHandler::TextHandler::isNotes() const
 Fb2ReadHandler::SpanHandler::SpanHandler(TextHandler *parent, const QString &name, const QXmlAttributes &atts)
 Fb2ReadHandler::SpanHandler::SpanHandler(TextHandler *parent, const QString &name, const QXmlAttributes &atts)
     : TextHandler(parent, name, atts, "span")
     : TextHandler(parent, name, atts, "span")
 {
 {
-    int count = atts.count();
-    for (int i = 0; i < count; i++) {
-        writer().writeAttribute("fb2:" + atts.qName(i), atts.value(i));
-    }
 }
 }
 
 
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
@@ -375,7 +377,6 @@ Fb2ReadHandler::ImageHandler::ImageHandler(Fb2ReadHandler &owner, const QString
 Fb2ReadHandler::BinaryHandler::BinaryHandler(Fb2ReadHandler &owner, const QString &name, const QXmlAttributes &atts)
 Fb2ReadHandler::BinaryHandler::BinaryHandler(Fb2ReadHandler &owner, const QString &name, const QXmlAttributes &atts)
     : BaseHandler(owner, name)
     : BaseHandler(owner, name)
     , m_file(Value(atts, "id"))
     , m_file(Value(atts, "id"))
-    , m_type(Value(atts, "content-type"))
 {
 {
 }
 }
 
 
@@ -388,7 +389,7 @@ void Fb2ReadHandler::BinaryHandler::EndTag(const QString &name)
 {
 {
     Q_UNUSED(name);
     Q_UNUSED(name);
     QByteArray in; in.append(m_text);
     QByteArray in; in.append(m_text);
-    if (!m_file.isEmpty()) m_owner.addFile(m_file, m_type, QByteArray::fromBase64(in));
+    if (!m_file.isEmpty()) m_owner.addFile(m_file, QByteArray::fromBase64(in));
 }
 }
 
 
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
@@ -439,7 +440,7 @@ QString Fb2ReadHandler::getFile(const QString &name)
     return path;
     return path;
 }
 }
 
 
-void Fb2ReadHandler::addFile(const QString &name, const QString &type, const QByteArray &data)
+void Fb2ReadHandler::addFile(const QString &name, const QByteArray &data)
 {
 {
-    QMetaObject::invokeMethod(m_thread.parent(), "data", Qt::QueuedConnection, Q_ARG(QString, name), Q_ARG(QString, type), Q_ARG(QByteArray, data));
+    QMetaObject::invokeMethod(m_thread.parent(), "data", Qt::QueuedConnection, Q_ARG(QString, name), Q_ARG(QByteArray, data));
 }
 }

+ 2 - 2
source/fb2read.hpp

@@ -53,6 +53,7 @@ private:
             : NodeHandler(name), m_owner(owner) {}
             : NodeHandler(name), m_owner(owner) {}
     protected:
     protected:
         QXmlStreamWriter & writer() { return m_owner.writer(); }
         QXmlStreamWriter & writer() { return m_owner.writer(); }
+        void writeAttributes(const QXmlAttributes &atts);
     protected:
     protected:
         Fb2ReadHandler &m_owner;
         Fb2ReadHandler &m_owner;
     };
     };
@@ -181,7 +182,6 @@ private:
         virtual void EndTag(const QString &name);
         virtual void EndTag(const QString &name);
     private:
     private:
         QString m_file;
         QString m_file;
-        QString m_type;
         QString m_text;
         QString m_text;
     };
     };
 
 
@@ -189,7 +189,7 @@ protected:
     virtual NodeHandler * CreateRoot(const QString &name, const QXmlAttributes &atts);
     virtual NodeHandler * CreateRoot(const QString &name, const QXmlAttributes &atts);
 
 
 private:
 private:
-    void addFile(const QString &name, const QString &type, const QByteArray &data);
+    void addFile(const QString &name, const QByteArray &data);
     QString getFile(const QString &name);
     QString getFile(const QString &name);
 
 
 private:
 private:

+ 15 - 4
source/fb2save.cpp

@@ -6,6 +6,7 @@
 #include "fb2utils.h"
 #include "fb2utils.h"
 
 
 #include <QAbstractNetworkCache>
 #include <QAbstractNetworkCache>
+#include <QBuffer>
 #include <QComboBox>
 #include <QComboBox>
 #include <QFileDialog>
 #include <QFileDialog>
 #include <QGridLayout>
 #include <QGridLayout>
@@ -216,11 +217,11 @@ void Fb2SaveWriter::writeFiles()
         if (name.isEmpty()) continue;
         if (name.isEmpty()) continue;
         Fb2TemporaryFile * file = m_view.files().get(name);
         Fb2TemporaryFile * file = m_view.files().get(name);
         if (!file) continue;
         if (!file) continue;
-        QString type = file->type();
-        QString data = file->data().toBase64();
         writeStartElement("binary", 2);
         writeStartElement("binary", 2);
         writeAttribute("id", name);
         writeAttribute("id", name);
-        if (!type.isEmpty()) writeAttribute("content-type", type);
+        QByteArray &array = file->data();
+        QString data = array.toBase64();
+        writeContentType(array);
         writeLineEnd();
         writeLineEnd();
         int pos = 0;
         int pos = 0;
         while (true) {
         while (true) {
@@ -235,6 +236,16 @@ void Fb2SaveWriter::writeFiles()
     }
     }
 }
 }
 
 
+void Fb2SaveWriter::writeContentType(QByteArray &data)
+{
+    QBuffer buffer(&data);
+    buffer.open(QIODevice::ReadOnly);
+    QString type = QImageReader::imageFormat(&buffer);
+    if (type.isEmpty()) return;
+    type.prepend("image/");
+    writeAttribute("content-type", type);
+}
+
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 //  Fb2SaveHandler::TextHandler
 //  Fb2SaveHandler::TextHandler
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
@@ -285,7 +296,7 @@ void Fb2SaveHandler::TextHandler::Init(const QXmlAttributes &atts)
             m_writer.writeAttribute(name, atts.value(i));
             m_writer.writeAttribute(name, atts.value(i));
         } else if (name == "name") {
         } else if (name == "name") {
             m_writer.writeAttribute(name, atts.value(i));
             m_writer.writeAttribute(name, atts.value(i));
-        } else if (name.left(4) == "fb2:") {
+        } else if (name.left(4) == "fb2.") {
             m_writer.writeAttribute(name.mid(4), atts.value(i));
             m_writer.writeAttribute(name.mid(4), atts.value(i));
         }
         }
     }
     }

+ 1 - 0
source/fb2save.hpp

@@ -78,6 +78,7 @@ public:
     void writeFiles();
     void writeFiles();
 private:
 private:
     QByteArray downloadFile(const QUrl &url);
     QByteArray downloadFile(const QUrl &url);
+    void writeContentType(QByteArray &data);
 private:
 private:
     Fb2WebView &m_view;
     Fb2WebView &m_view;
     QStringList m_names;
     QStringList m_names;

+ 2 - 7
source/fb2temp.cpp

@@ -24,6 +24,7 @@ qint64 Fb2TemporaryFile::write(const QByteArray &data)
     if (m_hash.isEmpty()) m_hash = md5(data);
     if (m_hash.isEmpty()) m_hash = md5(data);
     qint64 size = QTemporaryFile::write(data);
     qint64 size = QTemporaryFile::write(data);
     close();
     close();
+
     return size;
     return size;
 }
 }
 
 
@@ -63,11 +64,6 @@ QString Fb2TemporaryList::add(const QString &path, const QByteArray &data)
         Fb2TemporaryFile * temp = new Fb2TemporaryFile(name);
         Fb2TemporaryFile * temp = new Fb2TemporaryFile(name);
         temp->setHash(hash);
         temp->setHash(hash);
         temp->write(data);
         temp->write(data);
-        temp->open();
-        QString type = QImageReader::imageFormat(temp);
-        if (!type.isEmpty()) type.prepend("image/");
-        temp->setType(type);
-        temp->close();
         append(temp);
         append(temp);
     }
     }
     return name;
     return name;
@@ -107,11 +103,10 @@ QByteArray Fb2TemporaryList::data(const QString &name) const
     return QByteArray();
     return QByteArray();
 }
 }
 
 
-const QString & Fb2TemporaryList::set(const QString &name, const QString &type, const QByteArray &data, const QString &hash)
+const QString & Fb2TemporaryList::set(const QString &name, const QByteArray &data, const QString &hash)
 {
 {
     Fb2TemporaryFile * file = get(name);
     Fb2TemporaryFile * file = get(name);
     if (!file) append(file = new Fb2TemporaryFile(name));
     if (!file) append(file = new Fb2TemporaryFile(name));
-    file->setType(type);
     file->setHash(hash);
     file->setHash(hash);
     file->write(data);
     file->write(data);
     return file->hash();
     return file->hash();

+ 1 - 4
source/fb2temp.hpp

@@ -19,14 +19,11 @@ public:
     explicit Fb2TemporaryFile(const QString &name);
     explicit Fb2TemporaryFile(const QString &name);
     inline qint64 write(const QByteArray &data);
     inline qint64 write(const QByteArray &data);
     void setHash(const QString &hash) { m_hash = hash; }
     void setHash(const QString &hash) { m_hash = hash; }
-    void setType(const QString &type) { m_type = type; }
     const QString & hash() const { return m_hash; }
     const QString & hash() const { return m_hash; }
     const QString & name() const { return m_name; }
     const QString & name() const { return m_name; }
-    const QString & type() const { return m_type; }
     QByteArray data();
     QByteArray data();
 private:
 private:
     const QString m_name;
     const QString m_name;
-    QString m_type;
     QString m_hash;
     QString m_hash;
 };
 };
 
 
@@ -39,7 +36,7 @@ public:
     QString add(const QString &path, const QByteArray &data);
     QString add(const QString &path, const QByteArray &data);
     bool exists(const QString &name) const;
     bool exists(const QString &name) const;
     Fb2TemporaryFile * get(const QString &name) const;
     Fb2TemporaryFile * get(const QString &name) const;
-    const QString & set(const QString &name, const QString &type, const QByteArray &data, const QString &hash = QString());
+    const QString & set(const QString &name, const QByteArray &data, const QString &hash = QString());
     QString name(const QString &hash) const;
     QString name(const QString &hash) const;
     QByteArray data(const QString &name) const;
     QByteArray data(const QString &name) const;
 private:
 private:

+ 2 - 2
source/fb2view.cpp

@@ -198,9 +198,9 @@ bool Fb2WebView::save(QString *string)
     return ok;
     return ok;
 }
 }
 
 
-void Fb2WebView::data(QString name, QString type, QByteArray data)
+void Fb2WebView::data(QString name, QByteArray data)
 {
 {
-    m_files.set(name, type, data);
+    m_files.set(name, data);
 }
 }
 
 
 void Fb2WebView::html(QString name, QString html)
 void Fb2WebView::html(QString name, QString html)

+ 1 - 1
source/fb2view.hpp

@@ -88,7 +88,7 @@ protected:
 signals:
 signals:
     
     
 public slots:
 public slots:
-    void data(QString name, QString type, QByteArray data);
+    void data(QString name, QByteArray data);
     void html(QString name, QString html);
     void html(QString name, QString html);
     void linkHovered(const QString &link, const QString &title, const QString &textContent);
     void linkHovered(const QString &link, const QString &title, const QString &textContent);
     void showInspector();
     void showInspector();