fb2xml2.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. #include "fb2xml2.h"
  2. #include <cstring>
  3. #include <QtDebug>
  4. namespace XML2 {
  5. //---------------------------------------------------------------------------
  6. // XML2::XmlReader
  7. //---------------------------------------------------------------------------
  8. class XmlReaderPrivate {
  9. public:
  10. ~XmlReaderPrivate(void) {}
  11. private:
  12. XmlReaderPrivate(XmlReader* reader);
  13. bool parse(const QString *input);
  14. bool parse(QIODevice *input);
  15. bool process(QXmlStreamReader& reader);
  16. Q_DECLARE_PUBLIC(XmlReader)
  17. XmlReader* q_ptr;
  18. FbXmlHandler* contenthandler;
  19. FbXmlHandler* errorhandler;
  20. FbXmlHandler* lexicalhandler;
  21. };
  22. XmlReaderPrivate::XmlReaderPrivate(XmlReader* reader)
  23. : q_ptr(reader)
  24. , contenthandler(nullptr)
  25. , errorhandler(nullptr)
  26. , lexicalhandler(nullptr)
  27. {
  28. }
  29. bool XmlReaderPrivate::process(QXmlStreamReader &reader)
  30. {
  31. while (!reader.atEnd()) {
  32. reader.readNext();
  33. if (reader.hasError()) {
  34. return errorhandler->error(reader.errorString(), reader.lineNumber(), reader.columnNumber());
  35. }
  36. switch (reader.tokenType()) {
  37. case QXmlStreamReader::StartElement:
  38. if (!contenthandler->startElement(reader.namespaceUri().toString(), reader.name().toString(),
  39. reader.qualifiedName().toString(), reader.attributes())) {
  40. return false;
  41. }
  42. break;
  43. case QXmlStreamReader::EndElement:
  44. if (!contenthandler->endElement(reader.namespaceUri().toString(), reader.name().toString(),
  45. reader.qualifiedName().toString())) {
  46. return false;
  47. }
  48. case QXmlStreamReader::Characters:
  49. if (!contenthandler->characters(reader.text().toString())) {
  50. return false;
  51. }
  52. break;
  53. case QXmlStreamReader::Comment:
  54. if (lexicalhandler && !lexicalhandler->comment(reader.text().toString())) {
  55. return false;
  56. }
  57. break;
  58. default:
  59. break;
  60. }
  61. }
  62. return !reader.isEndDocument();
  63. }
  64. bool XmlReaderPrivate::parse(const QString *input)
  65. {
  66. QXmlStreamReader reader(*input);
  67. return process(reader);
  68. }
  69. bool XmlReaderPrivate::parse(QIODevice *input)
  70. {
  71. QXmlStreamReader reader(input);
  72. return process(reader);
  73. }
  74. XmlReader::XmlReader(void)
  75. : d_ptr(new XmlReaderPrivate(this))
  76. {
  77. }
  78. XmlReader::~XmlReader(void)
  79. {
  80. }
  81. bool XmlReader::feature(const QString&, bool* ok) const
  82. {
  83. if (ok) *ok = false;
  84. return false;
  85. }
  86. void XmlReader::setFeature(const QString&, bool)
  87. {
  88. }
  89. bool XmlReader::hasFeature(const QString&) const
  90. {
  91. return false;
  92. }
  93. void* XmlReader::property(const QString&, bool* ok) const
  94. {
  95. if (ok) *ok = false;
  96. return 0;
  97. }
  98. void XmlReader::setProperty(const QString&, void*)
  99. {
  100. }
  101. bool XmlReader::hasProperty(const QString&) const
  102. {
  103. return false;
  104. }
  105. void XmlReader::setContentHandler(FbXmlHandler* handler)
  106. {
  107. Q_D(XmlReader);
  108. d->contenthandler = handler;
  109. }
  110. FbXmlHandler* XmlReader::contentHandler(void) const
  111. {
  112. const XmlReaderPrivate* d = this->d_func();
  113. return d->contenthandler;
  114. }
  115. void XmlReader::setErrorHandler(FbXmlHandler* handler)
  116. {
  117. Q_D(XmlReader);
  118. d->errorhandler = handler;
  119. }
  120. FbXmlHandler* XmlReader::errorHandler(void) const
  121. {
  122. const XmlReaderPrivate* d = this->d_func();
  123. return d->errorhandler;
  124. }
  125. void XmlReader::setLexicalHandler(FbXmlHandler* handler)
  126. {
  127. Q_D(XmlReader);
  128. d->lexicalhandler = handler;
  129. }
  130. FbXmlHandler* XmlReader::lexicalHandler(void) const
  131. {
  132. const XmlReaderPrivate* d = this->d_func();
  133. return d->lexicalhandler;
  134. }
  135. bool XmlReader::parse(const QString& input)
  136. {
  137. return this->parse(&input);
  138. }
  139. bool XmlReader::parse(const QString* input)
  140. {
  141. Q_D(XmlReader);
  142. d->parse(input);
  143. return true;
  144. }
  145. bool XmlReader::parse(QIODevice *input)
  146. {
  147. Q_D(XmlReader);
  148. d->parse(input);
  149. return true;
  150. }
  151. } // namespace XML2