fb2read.hpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. #ifndef FB2READ_H
  2. #define FB2READ_H
  3. #include "fb2xml.hpp"
  4. #include <QByteArray>
  5. #include <QMutex>
  6. #include <QThread>
  7. #include <QXmlDefaultHandler>
  8. class FbStore;
  9. class FbReadThread : public QThread
  10. {
  11. Q_OBJECT
  12. public:
  13. static void execute(QObject *parent, QString *source, QIODevice *device);
  14. virtual ~FbReadThread();
  15. signals:
  16. void binary(const QString &name, const QByteArray &data);
  17. void html(const QString &html, FbStore *store);
  18. void error();
  19. protected:
  20. void run();
  21. private:
  22. explicit FbReadThread(QObject *parent, QString *source, QIODevice *device);
  23. bool parse();
  24. private:
  25. QIODevice *m_device;
  26. QString *m_source;
  27. FbStore *m_store;
  28. QString m_html;
  29. };
  30. class FbReadHandler : public FbXmlHandler
  31. {
  32. Q_OBJECT
  33. public:
  34. static bool load(QObject *page, QString &source, QString &html);
  35. explicit FbReadHandler(QXmlStreamWriter &writer);
  36. virtual ~FbReadHandler();
  37. virtual bool comment(const QString& ch);
  38. QXmlStreamWriter & writer() { return m_writer; }
  39. private:
  40. class BaseHandler : public NodeHandler
  41. {
  42. public:
  43. explicit BaseHandler(FbReadHandler &owner, const QString &name)
  44. : NodeHandler(name), m_owner(owner) {}
  45. protected:
  46. QXmlStreamWriter & writer() { return m_owner.writer(); }
  47. protected:
  48. FbReadHandler &m_owner;
  49. };
  50. class RootHandler : public BaseHandler
  51. {
  52. FB2_BEGIN_KEYLIST
  53. Style,
  54. Descr,
  55. Body,
  56. Binary,
  57. FB2_END_KEYLIST
  58. public:
  59. explicit RootHandler(FbReadHandler &owner, const QString &name);
  60. protected:
  61. virtual NodeHandler * NewTag(const QString & name, const QXmlStreamAttributes &atts);
  62. virtual void EndTag(const QString &name);
  63. private:
  64. void writeScript(const QString &src);
  65. void writeHeader();
  66. private:
  67. QString m_style;
  68. bool m_head;
  69. };
  70. class StyleHandler : public BaseHandler
  71. {
  72. public:
  73. explicit StyleHandler(FbReadHandler &owner, const QString &name, QString &text);
  74. protected:
  75. virtual void TxtTag(const QString &text);
  76. private:
  77. QString &m_text;
  78. };
  79. class TextHandler : public BaseHandler
  80. {
  81. FB2_BEGIN_KEYLIST
  82. Origin,
  83. Anchor,
  84. Image,
  85. Parag,
  86. Style,
  87. Strong,
  88. Emphas,
  89. Strike,
  90. Sub,
  91. Sup,
  92. Code,
  93. FB2_END_KEYLIST
  94. public:
  95. explicit TextHandler(FbReadHandler &owner, const QString &name, const QXmlStreamAttributes &atts, const QString &tag);
  96. explicit TextHandler(TextHandler *parent, const QString &name, const QXmlStreamAttributes &atts, const QString &tag);
  97. protected:
  98. virtual NodeHandler * NewTag(const QString &name, const QXmlStreamAttributes &atts);
  99. virtual void TxtTag(const QString &text);
  100. virtual void EndTag(const QString &name);
  101. protected:
  102. void Init(const QString &name, const QXmlStreamAttributes &atts);
  103. bool isNotes() const;
  104. protected:
  105. TextHandler *m_parent;
  106. QString m_tag;
  107. QString m_style;
  108. bool m_empty;
  109. };
  110. class BinaryHandler : public BaseHandler
  111. {
  112. public:
  113. explicit BinaryHandler(FbReadHandler &owner, const QString &name, const QXmlStreamAttributes &atts);
  114. protected:
  115. virtual void TxtTag(const QString &text);
  116. virtual void EndTag(const QString &name);
  117. private:
  118. QString m_file;
  119. QString m_text;
  120. };
  121. signals:
  122. void binary(const QString &name, const QByteArray &data);
  123. protected:
  124. virtual NodeHandler * CreateRoot(const QString &name, const QXmlStreamAttributes &atts);
  125. private:
  126. void addFile(const QString &name, const QByteArray &data);
  127. private:
  128. typedef QHash<QString, QString> StringHash;
  129. QXmlStreamWriter &m_writer;
  130. StringHash m_hash;
  131. };
  132. #endif // FB2READ_H