summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Tardon <dtardon@redhat.com>2018-01-22 14:58:51 +0100
committerDavid Tardon <dtardon@redhat.com>2018-01-22 14:58:51 +0100
commit9deed7ef402d924a24eb7e2442cc23cb3301eb0a (patch)
tree0b1eefbeaa8ee32f6b1356cbc3c04d86f4716826
parent30a0e048c4bc7cb81b308e00f823ad5513adb3a9 (diff)
ofz#4681 propagate read error up
Change-Id: I8e271410d717bc1d53323d624a3a46cf3812fca9
-rw-r--r--src/lib/ABWParser.cpp36
-rw-r--r--src/lib/ABWParser.h10
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);