1
0

fb2xml.h 2.5 KB

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