Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/coding
diff options
context:
space:
mode:
authorvng <viktor.govako@gmail.com>2012-10-19 03:36:44 +0400
committerAlex Zolotarev <alex@maps.me>2015-09-23 01:45:50 +0300
commit87238a010b55a0529fb3fe7b4c426afd43d9ea38 (patch)
treee483bf0a51f9447f6ea5abce3a12b27c1295de20 /coding
parentf493f4ee90d04c530c00cb93a86452880b97bcd2 (diff)
Fix bug in loading character data from XML.
Diffstat (limited to 'coding')
-rw-r--r--coding/internal/xmlparser.h34
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();
+ }
+ }
};