diff options
author | vng <viktor.govako@gmail.com> | 2012-10-19 03:36:44 +0400 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-23 01:45:50 +0300 |
commit | 87238a010b55a0529fb3fe7b4c426afd43d9ea38 (patch) | |
tree | e483bf0a51f9447f6ea5abce3a12b27c1295de20 /coding | |
parent | f493f4ee90d04c530c00cb93a86452880b97bcd2 (diff) |
Fix bug in loading character data from XML.
Diffstat (limited to 'coding')
-rw-r--r-- | coding/internal/xmlparser.h | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/coding/internal/xmlparser.h b/coding/internal/xmlparser.h index 324272e7b2..89368c6019 100644 --- a/coding/internal/xmlparser.h +++ b/coding/internal/xmlparser.h @@ -7,9 +7,9 @@ template <typename DispatcherT> class XmlParser : public CExpatImpl< XmlParser<DispatcherT> > { -public: typedef CExpatImpl< XmlParser<DispatcherT> > BaseT; +public: XmlParser(DispatcherT& dispatcher, bool enableCharHandler = false) : m_depth(0), m_restrictDepth(static_cast<size_t>(-1)), m_dispatcher(dispatcher), m_enableCharHandler(enableCharHandler) @@ -28,42 +28,58 @@ public: // Start element handler void OnStartElement(XML_Char const * pszName, XML_Char const ** papszAttrs) { + CheckCharData(); + ++m_depth; if (m_depth >= m_restrictDepth) return; - if (!m_dispatcher.Push(pszName)) { + if (!m_dispatcher.Push(pszName)) + { m_restrictDepth = m_depth; return; } - for (size_t i = 0; papszAttrs[2 * i]; ++i) { + for (size_t i = 0; papszAttrs[2 * i]; ++i) m_dispatcher.AddAttr(papszAttrs[2 * i], papszAttrs[2 * i + 1]); - } } // End element handler void OnEndElement(XML_Char const * pszName) { + CheckCharData(); + --m_depth; if (m_depth >= m_restrictDepth) return; - if (m_restrictDepth != size_t(-1)) { + if (m_restrictDepth != size_t(-1)) m_restrictDepth = static_cast<size_t>(-1); - } else { + else m_dispatcher.Pop(string(pszName)); - } } - void OnCharacterData (const XML_Char *pszData, int nLength) + void OnCharacterData(const XML_Char *pszData, int nLength) { - m_dispatcher.CharData(string(pszData, nLength)); + // Accumulate character data - it can be passed by parts + // (when reading from fixed length buffer). + m_charData.append(pszData, nLength); } private: size_t m_depth; size_t m_restrictDepth; DispatcherT & m_dispatcher; + + string m_charData; bool m_enableCharHandler; + + void CheckCharData() + { + if (m_enableCharHandler && !m_charData.empty()) + { + m_dispatcher.CharData(m_charData); + m_charData.clear(); + } + } }; |