summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/ABWParser.cpp7
-rw-r--r--src/lib/ABWXMLHelper.cpp26
-rw-r--r--src/lib/ABWXMLHelper.h17
3 files changed, 42 insertions, 8 deletions
diff --git a/src/lib/ABWParser.cpp b/src/lib/ABWParser.cpp
index 3f77770..bdbb83d 100644
--- a/src/lib/ABWParser.cpp
+++ b/src/lib/ABWParser.cpp
@@ -187,11 +187,12 @@ bool libabw::ABWParser::processXmlDocument(librevenge::RVNGInputStream *input)
if (!input)
return false;
- std::shared_ptr<xmlTextReader> reader(xmlReaderForStream(input), xmlFreeTextReader);
+ ABWXMLErrorWatcher watcher;
+ std::shared_ptr<xmlTextReader> reader(xmlReaderForStream(input, &watcher), xmlFreeTextReader);
if (!reader)
return false;
int ret = xmlTextReaderRead(reader.get());
- while (1 == ret)
+ while (1 == ret && !watcher.isError())
{
processXmlNode(reader.get());
ret = xmlTextReaderRead(reader.get());
@@ -199,7 +200,7 @@ bool libabw::ABWParser::processXmlDocument(librevenge::RVNGInputStream *input)
if (m_collector)
m_collector->endDocument();
- return true;
+ return !watcher.isError();
}
void libabw::ABWParser::processXmlNode(xmlTextReaderPtr reader)
diff --git a/src/lib/ABWXMLHelper.cpp b/src/lib/ABWXMLHelper.cpp
index 553155e..5ce5185 100644
--- a/src/lib/ABWXMLHelper.cpp
+++ b/src/lib/ABWXMLHelper.cpp
@@ -46,11 +46,12 @@ extern "C" {
}
#ifdef DEBUG
- static void abwxmlReaderErrorFunc(void *, const char *message, xmlParserSeverities severity, xmlTextReaderLocatorPtr)
+ static void abwxmlReaderErrorFunc(void *arg, const char *message, xmlParserSeverities severity, xmlTextReaderLocatorPtr)
#else
- static void abwxmlReaderErrorFunc(void *, const char *, xmlParserSeverities severity, xmlTextReaderLocatorPtr)
+ static void abwxmlReaderErrorFunc(void *arg, const char *, xmlParserSeverities severity, xmlTextReaderLocatorPtr)
#endif
{
+ const auto watcher = reinterpret_cast<ABWXMLErrorWatcher *>(arg);
switch (severity)
{
case XML_PARSER_SEVERITY_VALIDITY_WARNING:
@@ -64,6 +65,8 @@ extern "C" {
break;
case XML_PARSER_SEVERITY_ERROR:
ABW_DEBUG_MSG(("Found xml parser severity error %s\n", message));
+ if (watcher)
+ watcher->setError();
break;
default:
break;
@@ -89,13 +92,28 @@ ABWXMLString::operator const char *() const
return reinterpret_cast<const char *>(m_xml.get());
}
+ABWXMLErrorWatcher::ABWXMLErrorWatcher()
+ : m_error(false)
+{
+}
+
+bool ABWXMLErrorWatcher::isError() const
+{
+ return m_error;
+}
+
+void ABWXMLErrorWatcher::setError()
+{
+ m_error = true;
+}
+
// xmlTextReader helper function
-xmlTextReaderPtr xmlReaderForStream(librevenge::RVNGInputStream *input)
+xmlTextReaderPtr xmlReaderForStream(librevenge::RVNGInputStream *input, ABWXMLErrorWatcher *watcher)
{
xmlTextReaderPtr reader = xmlReaderForIO(abwxmlInputReadFunc, abwxmlInputCloseFunc, (void *)input, 0, 0,
XML_PARSE_NOBLANKS|XML_PARSE_NOENT|XML_PARSE_NONET|XML_PARSE_RECOVER);
- xmlTextReaderSetErrorHandler(reader, abwxmlReaderErrorFunc, 0);
+ xmlTextReaderSetErrorHandler(reader, abwxmlReaderErrorFunc, watcher);
return reader;
}
diff --git a/src/lib/ABWXMLHelper.h b/src/lib/ABWXMLHelper.h
index 6008cad..d2b4aea 100644
--- a/src/lib/ABWXMLHelper.h
+++ b/src/lib/ABWXMLHelper.h
@@ -34,10 +34,25 @@ private:
std::shared_ptr<xmlChar> m_xml;
};
+class ABWXMLErrorWatcher
+{
+ ABWXMLErrorWatcher(const ABWXMLErrorWatcher &) = delete;
+ ABWXMLErrorWatcher &operator=(const ABWXMLErrorWatcher &) = delete;
+
+public:
+ ABWXMLErrorWatcher();
+
+ bool isError() const;
+ void setError();
+
+private:
+ bool m_error;
+};
+
// create an xmlTextReader pointer from a librevenge::RVNGInputStream pointer
// needs to be freed using xmlTextReaderFree function.
-xmlTextReaderPtr xmlReaderForStream(librevenge::RVNGInputStream *input);
+xmlTextReaderPtr xmlReaderForStream(librevenge::RVNGInputStream *input, ABWXMLErrorWatcher *watcher = 0);
} // namespace libabw