diff options
author | David Tardon <dtardon@redhat.com> | 2018-01-22 14:58:51 +0100 |
---|---|---|
committer | David Tardon <dtardon@redhat.com> | 2018-01-22 14:58:51 +0100 |
commit | 9deed7ef402d924a24eb7e2442cc23cb3301eb0a (patch) | |
tree | 0b1eefbeaa8ee32f6b1356cbc3c04d86f4716826 | |
parent | 30a0e048c4bc7cb81b308e00f823ad5513adb3a9 (diff) |
ofz#4681 propagate read error up
Change-Id: I8e271410d717bc1d53323d624a3a46cf3812fca9
-rw-r--r-- | src/lib/ABWParser.cpp | 36 | ||||
-rw-r--r-- | src/lib/ABWParser.h | 10 |
2 files changed, 28 insertions, 18 deletions
diff --git a/src/lib/ABWParser.cpp b/src/lib/ABWParser.cpp index 60ca7d7..1cf9fc4 100644 --- a/src/lib/ABWParser.cpp +++ b/src/lib/ABWParser.cpp @@ -173,8 +173,9 @@ bool libabw::ABWParser::processXmlDocument(librevenge::RVNGInputStream *input) int ret = xmlTextReaderRead(reader.get()); while (1 == ret && !watcher.isStuck()) { - processXmlNode(reader.get()); - ret = xmlTextReaderRead(reader.get()); + ret = processXmlNode(reader.get()); + if (ret == 1) + ret = xmlTextReaderRead(reader.get()); } if (m_collector) @@ -182,10 +183,10 @@ bool libabw::ABWParser::processXmlDocument(librevenge::RVNGInputStream *input) return ret == 0 && !watcher.isStuck(); } -void libabw::ABWParser::processXmlNode(xmlTextReaderPtr reader) +int libabw::ABWParser::processXmlNode(xmlTextReaderPtr reader) { if (!reader) - return; + return -1; int tokenId = getElementToken(reader); int tokenType = xmlTextReaderNodeType(reader); int emptyToken = xmlTextReaderIsEmptyElement(reader); @@ -194,7 +195,7 @@ void libabw::ABWParser::processXmlNode(xmlTextReaderPtr reader) const auto *text = (const char *)xmlTextReaderConstValue(reader); if (!m_state->m_inMetadata && text && text[0]==' ' && text[1]==0) m_collector->insertText(text); - return; + return 1; } else if (XML_READER_TYPE_TEXT == tokenType) { @@ -217,6 +218,9 @@ void libabw::ABWParser::processXmlNode(xmlTextReaderPtr reader) m_collector->insertText(text); } } + + int ret = 1; + switch (tokenId) { case XML_ABIWORD: @@ -235,15 +239,15 @@ void libabw::ABWParser::processXmlNode(xmlTextReaderPtr reader) break; case XML_HISTORY: if (XML_READER_TYPE_ELEMENT == tokenType) - readHistory(reader); + ret = readHistory(reader); break; case XML_REVISIONS: if (XML_READER_TYPE_ELEMENT == tokenType) - readRevisions(reader); + ret = readRevisions(reader); break; case XML_IGNOREDWORDS: if (XML_READER_TYPE_ELEMENT == tokenType) - readIgnoredWords(reader); + ret = readIgnoredWords(reader); break; case XML_S: if (XML_READER_TYPE_ELEMENT == tokenType) @@ -266,7 +270,7 @@ void libabw::ABWParser::processXmlNode(xmlTextReaderPtr reader) break; case XML_D: if (XML_READER_TYPE_ELEMENT == tokenType) - readD(reader); + ret = readD(reader); break; case XML_P: if (XML_READER_TYPE_ELEMENT == tokenType) @@ -367,6 +371,8 @@ void libabw::ABWParser::processXmlNode(xmlTextReaderPtr reader) ABW_DEBUG_MSG((" %s\n", value)); } #endif + + return ret; } int libabw::ABWParser::getElementToken(xmlTextReaderPtr reader) @@ -388,7 +394,7 @@ void libabw::ABWParser::readM(xmlTextReaderPtr reader) m_state->m_currentMetadataKey = static_cast<const char *>(key); } -void libabw::ABWParser::readHistory(xmlTextReaderPtr reader) +int libabw::ABWParser::readHistory(xmlTextReaderPtr reader) { int ret = 1; int tokenId = XML_TOKEN_INVALID; @@ -409,9 +415,10 @@ void libabw::ABWParser::readHistory(xmlTextReaderPtr reader) } } while ((XML_HISTORY != tokenId || XML_READER_TYPE_END_ELEMENT != tokenType) && 1 == ret); + return ret; } -void libabw::ABWParser::readRevisions(xmlTextReaderPtr reader) +int libabw::ABWParser::readRevisions(xmlTextReaderPtr reader) { int ret = 1; int tokenId = XML_TOKEN_INVALID; @@ -433,9 +440,10 @@ void libabw::ABWParser::readRevisions(xmlTextReaderPtr reader) } } while ((XML_REVISIONS != tokenId || XML_READER_TYPE_END_ELEMENT != tokenType) && 1 == ret); + return ret; } -void libabw::ABWParser::readIgnoredWords(xmlTextReaderPtr reader) +int libabw::ABWParser::readIgnoredWords(xmlTextReaderPtr reader) { int ret = 1; int tokenId = XML_TOKEN_INVALID; @@ -456,6 +464,7 @@ void libabw::ABWParser::readIgnoredWords(xmlTextReaderPtr reader) } } while ((XML_IGNOREDWORDS != tokenId || XML_READER_TYPE_END_ELEMENT != tokenType) && 1 == ret); + return ret; } void libabw::ABWParser::readPageSize(xmlTextReaderPtr reader) @@ -498,7 +507,7 @@ void libabw::ABWParser::readSection(xmlTextReaderPtr reader) } } -void libabw::ABWParser::readD(xmlTextReaderPtr reader) +int libabw::ABWParser::readD(xmlTextReaderPtr reader) { ABWXMLString name = xmlTextReaderGetAttribute(reader, call_BAD_CAST_OnConst("name")); ABWXMLString mimeType = xmlTextReaderGetAttribute(reader, call_BAD_CAST_OnConst("mime-type")); @@ -545,6 +554,7 @@ void libabw::ABWParser::readD(xmlTextReaderPtr reader) } } while ((XML_D != tokenId || XML_READER_TYPE_END_ELEMENT != tokenType) && 1 == ret); + return ret; } void libabw::ABWParser::readS(xmlTextReaderPtr reader) diff --git a/src/lib/ABWParser.h b/src/lib/ABWParser.h index 6b9907d..b473dd7 100644 --- a/src/lib/ABWParser.h +++ b/src/lib/ABWParser.h @@ -40,18 +40,18 @@ private: // Functions to read the AWML document structure bool processXmlDocument(librevenge::RVNGInputStream *input); - void processXmlNode(xmlTextReaderPtr reader); + int processXmlNode(xmlTextReaderPtr reader); void readAbiword(xmlTextReaderPtr reader); void readM(xmlTextReaderPtr reader); - void readHistory(xmlTextReaderPtr reader); - void readRevisions(xmlTextReaderPtr reader); - void readIgnoredWords(xmlTextReaderPtr reader); + int readHistory(xmlTextReaderPtr reader); + int readRevisions(xmlTextReaderPtr reader); + int readIgnoredWords(xmlTextReaderPtr reader); void readPageSize(xmlTextReaderPtr reader); void readSection(xmlTextReaderPtr reader); void readA(xmlTextReaderPtr reader); void readC(xmlTextReaderPtr reader); - void readD(xmlTextReaderPtr reader); + int readD(xmlTextReaderPtr reader); void readL(xmlTextReaderPtr reader); void readP(xmlTextReaderPtr reader); void readS(xmlTextReaderPtr reader); |