diff --git a/coding/coding.pro b/coding/coding.pro index 7852a26118..38757a51ca 100644 --- a/coding/coding.pro +++ b/coding/coding.pro @@ -37,7 +37,7 @@ SOURCES += \ file_name_utils.cpp \ HEADERS += \ - internal/xmlparser.h \ + internal/xmlparser.hpp \ internal/expat_impl.h \ internal/file_data.hpp \ internal/file64_api.hpp \ diff --git a/coding/internal/xmlparser.h b/coding/internal/xmlparser.hpp similarity index 81% rename from coding/internal/xmlparser.h rename to coding/internal/xmlparser.hpp index 89368c6019..e435a2795d 100644 --- a/coding/internal/xmlparser.h +++ b/coding/internal/xmlparser.hpp @@ -4,13 +4,16 @@ #include "expat_impl.h" +#include "../../base/logging.hpp" + + template class XmlParser : public CExpatImpl< XmlParser > { typedef CExpatImpl< XmlParser > BaseT; public: - XmlParser(DispatcherT& dispatcher, bool enableCharHandler = false) + XmlParser(DispatcherT & dispatcher, bool enableCharHandler = false) : m_depth(0), m_restrictDepth(static_cast(-1)), m_dispatcher(dispatcher), m_enableCharHandler(enableCharHandler) { @@ -59,13 +62,21 @@ public: m_dispatcher.Pop(string(pszName)); } - void OnCharacterData(const XML_Char *pszData, int nLength) + void OnCharacterData(XML_Char const * pszData, int nLength) { // Accumulate character data - it can be passed by parts // (when reading from fixed length buffer). m_charData.append(pszData, nLength); } + void PrintError() + { + if (BaseT::GetErrorCode() != XML_ERROR_NONE) + LOG(LWARNING, ("XML parse error at line", + BaseT::GetCurrentLineNumber(), + "and byte", BaseT::GetCurrentByteIndex())); + } + private: size_t m_depth; size_t m_restrictDepth; diff --git a/coding/parse_xml.hpp b/coding/parse_xml.hpp index 9896155bc2..5d9f84deb8 100644 --- a/coding/parse_xml.hpp +++ b/coding/parse_xml.hpp @@ -1,6 +1,6 @@ #pragma once -#include "internal/xmlparser.h" +#include "internal/xmlparser.hpp" #include "../base/assert.hpp" @@ -23,9 +23,15 @@ uint64_t ParseXMLSequence(SequenceT & source, XMLDispatcherT & dispatcher, bool ASSERT(buffer, ()); readed = source.Read(buffer, BUFFER_SIZE); - if (readed == 0 || !parser.ParseBuffer(readed, false)) + if (readed == 0) return res; + if (!parser.ParseBuffer(readed, false)) + { + parser.PrintError(); + return res; + } + res += readed; } while (readed == BUFFER_SIZE);