1
0

fb2xml.h 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #ifndef FB2XML_H
  2. #define FB2XML_H
  3. #include <QHash>
  4. #include <QXmlDefaultHandler>
  5. #include <QXmlStreamReader>
  6. #include <QXmlStreamWriter>
  7. #define FB2_BEGIN_KEYLIST private: enum Keyword {
  8. #define FB2_END_KEYLIST None }; \
  9. class KeywordHash : public QHash<QString, Keyword> { public: KeywordHash(); }; \
  10. static Keyword toKeyword(const QString &name); private:
  11. #define FB2_BEGIN_KEYHASH(x) \
  12. x::Keyword x::toKeyword(const QString &name) \
  13. { \
  14. static const KeywordHash map; \
  15. KeywordHash::const_iterator i = map.find(name); \
  16. return i == map.end() ? None : i.value(); \
  17. } \
  18. x::KeywordHash::KeywordHash() {
  19. #define FB2_END_KEYHASH }
  20. #define FB2_KEY(key,str) insert(str,key);
  21. class FbXmlHandler : public QXmlDefaultHandler
  22. {
  23. public:
  24. explicit FbXmlHandler();
  25. virtual ~FbXmlHandler();
  26. bool startElement(const QString &namespaceURI, const QString &localName, const QString &qName, const QXmlAttributes &attributes);
  27. bool endElement(const QString &namespaceURI, const QString &localName, const QString &qName);
  28. bool characters(const QString &str);
  29. bool error(const QXmlParseException& exception);
  30. bool warning(const QXmlParseException& exception);
  31. bool fatalError(const QXmlParseException &exception);
  32. QString errorString() const;
  33. protected:
  34. class NodeHandler
  35. {
  36. public:
  37. static QString Value(const QXmlAttributes &attributes, const QString &name);
  38. explicit NodeHandler(const QString &name)
  39. : m_name(name), m_handler(0), m_closed(false) {}
  40. virtual ~NodeHandler()
  41. { if (m_handler) delete m_handler; }
  42. bool doStart(const QString &name, const QXmlAttributes &attributes);
  43. bool doText(const QString &text);
  44. bool doEnd(const QString &name, bool & found);
  45. protected:
  46. virtual NodeHandler * NewTag(const QString &name, const QXmlAttributes &attributes)
  47. { Q_UNUSED(name); Q_UNUSED(attributes); return NULL; }
  48. virtual void TxtTag(const QString &text)
  49. { Q_UNUSED(text); }
  50. virtual void EndTag(const QString &name)
  51. { Q_UNUSED(name); }
  52. const QString & Name() const
  53. { return m_name; }
  54. private:
  55. const QString m_name;
  56. NodeHandler * m_handler;
  57. bool m_closed;
  58. };
  59. protected:
  60. virtual NodeHandler * CreateRoot(const QString &name, const QXmlAttributes &attributes) = 0;
  61. static bool isWhiteSpace(const QString &str);
  62. protected:
  63. NodeHandler * m_handler;
  64. QString m_error;
  65. };
  66. #endif // FB2XML_H