From 5bf603a38e6b6272521b0ca10f176215a417b356 Mon Sep 17 00:00:00 2001 From: Dave Allie Date: Mon, 22 Dec 2025 23:44:39 +1100 Subject: [PATCH] WIP Use temp item file --- lib/Epub/Epub.cpp | 8 +++----- lib/Epub/Epub/parsers/ContentOpfParser.cpp | 24 +++++++++++++++++----- lib/Epub/Epub/parsers/ContentOpfParser.h | 4 +--- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/lib/Epub/Epub.cpp b/lib/Epub/Epub.cpp index 89e0040e..b5e8108f 100644 --- a/lib/Epub/Epub.cpp +++ b/lib/Epub/Epub.cpp @@ -5,8 +5,6 @@ #include #include -#include - #include "Epub/FsHelpers.h" #include "Epub/parsers/ContainerParser.h" #include "Epub/parsers/ContentOpfParser.h" @@ -75,9 +73,9 @@ bool Epub::parseContentOpf(bool useCache) { // Grab data from opfParser into epub title = opfParser.title; - if (!opfParser.coverItemId.empty() && opfParser.items.count(opfParser.coverItemId) > 0) { - coverImageItem = opfParser.items.at(opfParser.coverItemId); - } + // if (!opfParser.coverItemId.empty() && opfParser.items.count(opfParser.coverItemId) > 0) { + // coverImageItem = opfParser.items.at(opfParser.coverItemId); + // } if (!opfParser.tocNcxPath.empty()) { tocNcxItem = opfParser.tocNcxPath; diff --git a/lib/Epub/Epub/parsers/ContentOpfParser.cpp b/lib/Epub/Epub/parsers/ContentOpfParser.cpp index 3c9b7f92..a422c9f4 100644 --- a/lib/Epub/Epub/parsers/ContentOpfParser.cpp +++ b/lib/Epub/Epub/parsers/ContentOpfParser.cpp @@ -1,6 +1,7 @@ #include "ContentOpfParser.h" #include +#include #include namespace { @@ -94,11 +95,13 @@ void XMLCALL ContentOpfParser::startElement(void* userData, const XML_Char* name if (self->state == IN_PACKAGE && (strcmp(name, "manifest") == 0 || strcmp(name, "opf:manifest") == 0)) { self->state = IN_MANIFEST; + self->tempItemStore = SD.open("/.crosspoint/.tmp-items.bin", FILE_WRITE, true); return; } if (self->state == IN_PACKAGE && (strcmp(name, "spine") == 0 || strcmp(name, "opf:spine") == 0)) { self->state = IN_SPINE; + self->tempItemStore = SD.open("/.crosspoint/.tmp-items.bin", FILE_READ); return; } @@ -135,7 +138,10 @@ void XMLCALL ContentOpfParser::startElement(void* userData, const XML_Char* name } } - self->items[itemId] = href; + serialization::writeString(self->tempItemStore, itemId); + serialization::writeString(self->tempItemStore, href); + // // Write items down to SD card + // self->items[itemId] = href; if (mediaType == MEDIA_TYPE_NCX) { if (self->tocNcxPath.empty()) { @@ -156,11 +162,17 @@ void XMLCALL ContentOpfParser::startElement(void* userData, const XML_Char* name if (strcmp(atts[i], "idref") == 0) { const std::string idref = atts[i + 1]; // Resolve the idref to href using items map - if (self->items.count(idref) > 0) { - const std::string& href = self->items.at(idref); - self->cache->addSpineEntry(href); + self->tempItemStore.seek(0); + std::string itemId; + std::string href; + while (self->tempItemStore.available()) { + serialization::readString(self->tempItemStore, itemId); + serialization::readString(self->tempItemStore, href); + if (itemId == idref) { + self->cache->addSpineEntry(href); + break; + } } - break; } } return; @@ -183,11 +195,13 @@ void XMLCALL ContentOpfParser::endElement(void* userData, const XML_Char* name) if (self->state == IN_SPINE && (strcmp(name, "spine") == 0 || strcmp(name, "opf:spine") == 0)) { self->state = IN_PACKAGE; + self->tempItemStore.close(); return; } if (self->state == IN_MANIFEST && (strcmp(name, "manifest") == 0 || strcmp(name, "opf:manifest") == 0)) { self->state = IN_PACKAGE; + self->tempItemStore.close(); return; } diff --git a/lib/Epub/Epub/parsers/ContentOpfParser.h b/lib/Epub/Epub/parsers/ContentOpfParser.h index 90e2921e..78e13f9c 100644 --- a/lib/Epub/Epub/parsers/ContentOpfParser.h +++ b/lib/Epub/Epub/parsers/ContentOpfParser.h @@ -1,8 +1,6 @@ #pragma once #include -#include - #include "Epub.h" #include "Epub/SpineTocCache.h" #include "expat.h" @@ -22,6 +20,7 @@ class ContentOpfParser final : public Print { XML_Parser parser = nullptr; ParserState state = START; SpineTocCache* cache; + File tempItemStore; static void startElement(void* userData, const XML_Char* name, const XML_Char** atts); static void characterData(void* userData, const XML_Char* s, int len); @@ -31,7 +30,6 @@ class ContentOpfParser final : public Print { std::string title; std::string tocNcxPath; std::string coverItemId; - std::map items; explicit ContentOpfParser(const std::string& baseContentPath, const size_t xmlSize, SpineTocCache* cache) : baseContentPath(baseContentPath), remainingSize(xmlSize), cache(cache) {}