diff --git a/lib/Epub/Epub/parsers/ChapterHtmlSlimParser.cpp b/lib/Epub/Epub/parsers/ChapterHtmlSlimParser.cpp
index 718f4d7..a629707 100644
--- a/lib/Epub/Epub/parsers/ChapterHtmlSlimParser.cpp
+++ b/lib/Epub/Epub/parsers/ChapterHtmlSlimParser.cpp
@@ -214,10 +214,6 @@ bool ChapterHtmlSlimParser::parseAndBuildPages() {
return false;
}
- XML_SetUserData(parser, this);
- XML_SetElementHandler(parser, startElement, endElement);
- XML_SetCharacterDataHandler(parser, characterData);
-
FILE* file = fopen(filepath, "r");
if (!file) {
Serial.printf("[%lu] [EHP] Couldn't open file %s\n", millis(), filepath);
@@ -225,10 +221,17 @@ bool ChapterHtmlSlimParser::parseAndBuildPages() {
return false;
}
+ XML_SetUserData(parser, this);
+ XML_SetElementHandler(parser, startElement, endElement);
+ XML_SetCharacterDataHandler(parser, characterData);
+
do {
void* const buf = XML_GetBuffer(parser, 1024);
if (!buf) {
Serial.printf("[%lu] [EHP] Couldn't allocate memory for buffer\n", millis());
+ XML_StopParser(parser, XML_FALSE); // Stop any pending processing
+ XML_SetElementHandler(parser, nullptr, nullptr); // Clear callbacks
+ XML_SetCharacterDataHandler(parser, nullptr);
XML_ParserFree(parser);
fclose(file);
return false;
@@ -238,6 +241,9 @@ bool ChapterHtmlSlimParser::parseAndBuildPages() {
if (ferror(file)) {
Serial.printf("[%lu] [EHP] File read error\n", millis());
+ XML_StopParser(parser, XML_FALSE); // Stop any pending processing
+ XML_SetElementHandler(parser, nullptr, nullptr); // Clear callbacks
+ XML_SetCharacterDataHandler(parser, nullptr);
XML_ParserFree(parser);
fclose(file);
return false;
@@ -248,12 +254,18 @@ bool ChapterHtmlSlimParser::parseAndBuildPages() {
if (XML_ParseBuffer(parser, static_cast(len), done) == XML_STATUS_ERROR) {
Serial.printf("[%lu] [EHP] Parse error at line %lu:\n%s\n", millis(), XML_GetCurrentLineNumber(parser),
XML_ErrorString(XML_GetErrorCode(parser)));
+ XML_StopParser(parser, XML_FALSE); // Stop any pending processing
+ XML_SetElementHandler(parser, nullptr, nullptr); // Clear callbacks
+ XML_SetCharacterDataHandler(parser, nullptr);
XML_ParserFree(parser);
fclose(file);
return false;
}
} while (!done);
+ XML_StopParser(parser, XML_FALSE); // Stop any pending processing
+ XML_SetElementHandler(parser, nullptr, nullptr); // Clear callbacks
+ XML_SetCharacterDataHandler(parser, nullptr);
XML_ParserFree(parser);
fclose(file);
diff --git a/lib/Epub/Epub/parsers/ContainerParser.cpp b/lib/Epub/Epub/parsers/ContainerParser.cpp
index db126f2..da3a7b1 100644
--- a/lib/Epub/Epub/parsers/ContainerParser.cpp
+++ b/lib/Epub/Epub/parsers/ContainerParser.cpp
@@ -16,6 +16,8 @@ bool ContainerParser::setup() {
ContainerParser::~ContainerParser() {
if (parser) {
+ XML_StopParser(parser, XML_FALSE); // Stop any pending processing
+ XML_SetElementHandler(parser, nullptr, nullptr); // Clear callbacks
XML_ParserFree(parser);
parser = nullptr;
}
diff --git a/lib/Epub/Epub/parsers/ContentOpfParser.cpp b/lib/Epub/Epub/parsers/ContentOpfParser.cpp
index 5aa7303..4d3d776 100644
--- a/lib/Epub/Epub/parsers/ContentOpfParser.cpp
+++ b/lib/Epub/Epub/parsers/ContentOpfParser.cpp
@@ -22,6 +22,9 @@ bool ContentOpfParser::setup() {
ContentOpfParser::~ContentOpfParser() {
if (parser) {
+ XML_StopParser(parser, XML_FALSE); // Stop any pending processing
+ XML_SetElementHandler(parser, nullptr, nullptr); // Clear callbacks
+ XML_SetCharacterDataHandler(parser, nullptr);
XML_ParserFree(parser);
parser = nullptr;
}
@@ -40,6 +43,9 @@ size_t ContentOpfParser::write(const uint8_t* buffer, const size_t size) {
if (!buf) {
Serial.printf("[%lu] [COF] Couldn't allocate memory for buffer\n", millis());
+ XML_StopParser(parser, XML_FALSE); // Stop any pending processing
+ XML_SetElementHandler(parser, nullptr, nullptr); // Clear callbacks
+ XML_SetCharacterDataHandler(parser, nullptr);
XML_ParserFree(parser);
parser = nullptr;
return 0;
@@ -51,6 +57,9 @@ size_t ContentOpfParser::write(const uint8_t* buffer, const size_t size) {
if (XML_ParseBuffer(parser, static_cast(toRead), remainingSize == toRead) == XML_STATUS_ERROR) {
Serial.printf("[%lu] [COF] Parse error at line %lu: %s\n", millis(), XML_GetCurrentLineNumber(parser),
XML_ErrorString(XML_GetErrorCode(parser)));
+ XML_StopParser(parser, XML_FALSE); // Stop any pending processing
+ XML_SetElementHandler(parser, nullptr, nullptr); // Clear callbacks
+ XML_SetCharacterDataHandler(parser, nullptr);
XML_ParserFree(parser);
parser = nullptr;
return 0;
diff --git a/lib/Epub/Epub/parsers/TocNcxParser.cpp b/lib/Epub/Epub/parsers/TocNcxParser.cpp
index 0a613f3..f470055 100644
--- a/lib/Epub/Epub/parsers/TocNcxParser.cpp
+++ b/lib/Epub/Epub/parsers/TocNcxParser.cpp
@@ -18,6 +18,9 @@ bool TocNcxParser::setup() {
TocNcxParser::~TocNcxParser() {
if (parser) {
+ XML_StopParser(parser, XML_FALSE); // Stop any pending processing
+ XML_SetElementHandler(parser, nullptr, nullptr); // Clear callbacks
+ XML_SetCharacterDataHandler(parser, nullptr);
XML_ParserFree(parser);
parser = nullptr;
}
@@ -35,6 +38,11 @@ size_t TocNcxParser::write(const uint8_t* buffer, const size_t size) {
void* const buf = XML_GetBuffer(parser, 1024);
if (!buf) {
Serial.printf("[%lu] [TOC] Couldn't allocate memory for buffer\n", millis());
+ XML_StopParser(parser, XML_FALSE); // Stop any pending processing
+ XML_SetElementHandler(parser, nullptr, nullptr); // Clear callbacks
+ XML_SetCharacterDataHandler(parser, nullptr);
+ XML_ParserFree(parser);
+ parser = nullptr;
return 0;
}
@@ -44,6 +52,11 @@ size_t TocNcxParser::write(const uint8_t* buffer, const size_t size) {
if (XML_ParseBuffer(parser, static_cast(toRead), remainingSize == toRead) == XML_STATUS_ERROR) {
Serial.printf("[%lu] [TOC] Parse error at line %lu: %s\n", millis(), XML_GetCurrentLineNumber(parser),
XML_ErrorString(XML_GetErrorCode(parser)));
+ XML_StopParser(parser, XML_FALSE); // Stop any pending processing
+ XML_SetElementHandler(parser, nullptr, nullptr); // Clear callbacks
+ XML_SetCharacterDataHandler(parser, nullptr);
+ XML_ParserFree(parser);
+ parser = nullptr;
return 0;
}