From 4fa57725727e5ed14c5a355813fc2dc720fb587d Mon Sep 17 00:00:00 2001 From: Dave Allie Date: Tue, 30 Dec 2025 15:58:16 +1100 Subject: [PATCH] Use explicit uint32_t in BookMetadataCache and Section file handling --- lib/Epub/Epub/BookMetadataCache.cpp | 34 ++++++++++++++--------------- lib/Epub/Epub/BookMetadataCache.h | 4 ++-- lib/Epub/Epub/Section.cpp | 32 +++++++++++++-------------- lib/Epub/Epub/Section.h | 2 +- 4 files changed, 36 insertions(+), 36 deletions(-) diff --git a/lib/Epub/Epub/BookMetadataCache.cpp b/lib/Epub/Epub/BookMetadataCache.cpp index f42de94c..6272414e 100644 --- a/lib/Epub/Epub/BookMetadataCache.cpp +++ b/lib/Epub/Epub/BookMetadataCache.cpp @@ -85,12 +85,12 @@ bool BookMetadataCache::buildBookBin(const std::string& epubPath, const BookMeta return false; } - constexpr size_t headerASize = - sizeof(BOOK_CACHE_VERSION) + /* LUT Offset */ sizeof(size_t) + sizeof(spineCount) + sizeof(tocCount); - const size_t metadataSize = + constexpr uint32_t headerASize = + sizeof(BOOK_CACHE_VERSION) + /* LUT Offset */ sizeof(uint32_t) + sizeof(spineCount) + sizeof(tocCount); + const uint32_t metadataSize = metadata.title.size() + metadata.author.size() + metadata.coverItemHref.size() + sizeof(uint32_t) * 3; - const size_t lutSize = sizeof(size_t) * spineCount + sizeof(size_t) * tocCount; - const size_t lutOffset = headerASize + metadataSize; + const uint32_t lutSize = sizeof(uint32_t) * spineCount + sizeof(uint32_t) * tocCount; + const uint32_t lutOffset = headerASize + metadataSize; // Header A serialization::writePod(bookFile, BOOK_CACHE_VERSION); @@ -105,7 +105,7 @@ bool BookMetadataCache::buildBookBin(const std::string& epubPath, const BookMeta // Loop through spine entries, writing LUT positions spineFile.seek(0); for (int i = 0; i < spineCount; i++) { - auto pos = spineFile.position(); + uint32_t pos = spineFile.position(); auto spineEntry = readSpineEntry(spineFile); serialization::writePod(bookFile, pos + lutOffset + lutSize); } @@ -113,9 +113,9 @@ bool BookMetadataCache::buildBookBin(const std::string& epubPath, const BookMeta // Loop through toc entries, writing LUT positions tocFile.seek(0); for (int i = 0; i < tocCount; i++) { - auto pos = tocFile.position(); + uint32_t pos = tocFile.position(); auto tocEntry = readTocEntry(tocFile); - serialization::writePod(bookFile, pos + lutOffset + lutSize + spineFile.position()); + serialization::writePod(bookFile, pos + lutOffset + lutSize + static_cast(spineFile.position())); } // LUTs complete @@ -141,7 +141,7 @@ bool BookMetadataCache::buildBookBin(const std::string& epubPath, const BookMeta zip.close(); return false; } - size_t cumSize = 0; + uint32_t cumSize = 0; spineFile.seek(0); for (int i = 0; i < spineCount; i++) { auto spineEntry = readSpineEntry(spineFile); @@ -203,16 +203,16 @@ bool BookMetadataCache::cleanupTmpFiles() const { return true; } -size_t BookMetadataCache::writeSpineEntry(FsFile& file, const SpineEntry& entry) const { - const auto pos = file.position(); +uint32_t BookMetadataCache::writeSpineEntry(FsFile& file, const SpineEntry& entry) const { + const uint32_t pos = file.position(); serialization::writeString(file, entry.href); serialization::writePod(file, entry.cumulativeSize); serialization::writePod(file, entry.tocIndex); return pos; } -size_t BookMetadataCache::writeTocEntry(FsFile& file, const TocEntry& entry) const { - const auto pos = file.position(); +uint32_t BookMetadataCache::writeTocEntry(FsFile& file, const TocEntry& entry) const { + const uint32_t pos = file.position(); serialization::writeString(file, entry.title); serialization::writeString(file, entry.href); serialization::writeString(file, entry.anchor); @@ -303,8 +303,8 @@ BookMetadataCache::SpineEntry BookMetadataCache::getSpineEntry(const int index) } // Seek to spine LUT item, read from LUT and get out data - bookFile.seek(lutOffset + sizeof(size_t) * index); - size_t spineEntryPos; + bookFile.seek(lutOffset + sizeof(uint32_t) * index); + uint32_t spineEntryPos; serialization::readPod(bookFile, spineEntryPos); bookFile.seek(spineEntryPos); return readSpineEntry(bookFile); @@ -322,8 +322,8 @@ BookMetadataCache::TocEntry BookMetadataCache::getTocEntry(const int index) { } // Seek to TOC LUT item, read from LUT and get out data - bookFile.seek(lutOffset + sizeof(size_t) * spineCount + sizeof(size_t) * index); - size_t tocEntryPos; + bookFile.seek(lutOffset + sizeof(uint32_t) * spineCount + sizeof(uint32_t) * index); + uint32_t tocEntryPos; serialization::readPod(bookFile, tocEntryPos); bookFile.seek(tocEntryPos); return readTocEntry(bookFile); diff --git a/lib/Epub/Epub/BookMetadataCache.h b/lib/Epub/Epub/BookMetadataCache.h index 06597a21..a6cf945b 100644 --- a/lib/Epub/Epub/BookMetadataCache.h +++ b/lib/Epub/Epub/BookMetadataCache.h @@ -51,8 +51,8 @@ class BookMetadataCache { FsFile spineFile; FsFile tocFile; - size_t writeSpineEntry(FsFile& file, const SpineEntry& entry) const; - size_t writeTocEntry(FsFile& file, const TocEntry& entry) const; + uint32_t writeSpineEntry(FsFile& file, const SpineEntry& entry) const; + uint32_t writeTocEntry(FsFile& file, const TocEntry& entry) const; SpineEntry readSpineEntry(FsFile& file) const; TocEntry readTocEntry(FsFile& file) const; diff --git a/lib/Epub/Epub/Section.cpp b/lib/Epub/Epub/Section.cpp index e7a76378..45512c1b 100644 --- a/lib/Epub/Epub/Section.cpp +++ b/lib/Epub/Epub/Section.cpp @@ -8,17 +8,17 @@ namespace { constexpr uint8_t SECTION_FILE_VERSION = 7; -constexpr size_t HEADER_SIZE = sizeof(uint8_t) + sizeof(int) + sizeof(float) + sizeof(bool) + sizeof(int) + - sizeof(int) + sizeof(int) + sizeof(size_t); +constexpr uint32_t HEADER_SIZE = sizeof(uint8_t) + sizeof(int) + sizeof(float) + sizeof(bool) + sizeof(int) + + sizeof(int) + sizeof(int) + sizeof(uint32_t); } // namespace -size_t Section::onPageComplete(std::unique_ptr page) { +uint32_t Section::onPageComplete(std::unique_ptr page) { if (!file) { Serial.printf("[%lu] [SCT] File not open for writing page %d\n", millis(), pageCount); return 0; } - const auto position = file.position(); + const uint32_t position = file.position(); if (!page->serialize(file)) { Serial.printf("[%lu] [SCT] Failed to serialize page %d\n", millis(), pageCount); return 0; @@ -37,7 +37,7 @@ void Section::writeSectionFileHeader(const int fontId, const float lineCompressi } static_assert(HEADER_SIZE == sizeof(SECTION_FILE_VERSION) + sizeof(fontId) + sizeof(lineCompression) + sizeof(extraParagraphSpacing) + sizeof(viewportWidth) + sizeof(viewportHeight) + - sizeof(pageCount) + sizeof(size_t), + sizeof(pageCount) + sizeof(uint32_t), "Header size mismatch"); serialization::writePod(file, SECTION_FILE_VERSION); serialization::writePod(file, fontId); @@ -46,7 +46,7 @@ void Section::writeSectionFileHeader(const int fontId, const float lineCompressi serialization::writePod(file, viewportWidth); serialization::writePod(file, viewportHeight); serialization::writePod(file, pageCount); // Placeholder for page count (will be initially 0 when written) - serialization::writePod(file, static_cast(0)); // Placeholder for LUT offset + serialization::writePod(file, static_cast(0)); // Placeholder for LUT offset } bool Section::loadSectionFile(const int fontId, const float lineCompression, const bool extraParagraphSpacing, @@ -111,13 +111,13 @@ bool Section::createSectionFile(const int fontId, const float lineCompression, c const int viewportWidth, const int viewportHeight, const std::function& progressSetupFn, const std::function& progressFn) { - constexpr size_t MIN_SIZE_FOR_PROGRESS = 50 * 1024; // 50KB + constexpr uint32_t MIN_SIZE_FOR_PROGRESS = 50 * 1024; // 50KB const auto localPath = epub->getSpineItem(spineIndex).href; const auto tmpHtmlPath = epub->getCachePath() + "/.tmp_" + std::to_string(spineIndex) + ".html"; // Retry logic for SD card timing issues bool success = false; - size_t fileSize = 0; + uint32_t fileSize = 0; for (int attempt = 0; attempt < 3 && !success; attempt++) { if (attempt > 0) { Serial.printf("[%lu] [SCT] Retrying stream (attempt %d)...\n", millis(), attempt + 1); @@ -160,7 +160,7 @@ bool Section::createSectionFile(const int fontId, const float lineCompression, c return false; } writeSectionFileHeader(fontId, lineCompression, extraParagraphSpacing, viewportWidth, viewportHeight); - std::vector lut = {}; + std::vector lut = {}; ChapterHtmlSlimParser visitor( tmpHtmlPath, renderer, fontId, lineCompression, extraParagraphSpacing, viewportWidth, viewportHeight, @@ -176,10 +176,10 @@ bool Section::createSectionFile(const int fontId, const float lineCompression, c return false; } - const auto lutOffset = file.position(); + const uint32_t lutOffset = file.position(); bool hasFailedLutRecords = false; // Write LUT - for (const auto& pos : lut) { + for (const uint32_t& pos : lut) { if (pos == 0) { hasFailedLutRecords = true; break; @@ -195,7 +195,7 @@ bool Section::createSectionFile(const int fontId, const float lineCompression, c } // Go back and write LUT offset - file.seek(HEADER_SIZE - sizeof(size_t) - sizeof(pageCount)); + file.seek(HEADER_SIZE - sizeof(uint32_t) - sizeof(pageCount)); serialization::writePod(file, pageCount); serialization::writePod(file, lutOffset); file.close(); @@ -207,11 +207,11 @@ std::unique_ptr Section::loadPageFromSectionFile() { return nullptr; } - file.seek(HEADER_SIZE - sizeof(size_t)); - size_t lutOffset; + file.seek(HEADER_SIZE - sizeof(uint32_t)); + uint32_t lutOffset; serialization::readPod(file, lutOffset); - file.seek(lutOffset + sizeof(size_t) * currentPage); - size_t pagePos; + file.seek(lutOffset + sizeof(uint32_t) * currentPage); + uint32_t pagePos; serialization::readPod(file, pagePos); file.seek(pagePos); diff --git a/lib/Epub/Epub/Section.h b/lib/Epub/Epub/Section.h index f48fe753..bc2efabc 100644 --- a/lib/Epub/Epub/Section.h +++ b/lib/Epub/Epub/Section.h @@ -16,7 +16,7 @@ class Section { void writeSectionFileHeader(int fontId, float lineCompression, bool extraParagraphSpacing, int viewportWidth, int viewportHeight); - size_t onPageComplete(std::unique_ptr page); + uint32_t onPageComplete(std::unique_ptr page); public: int pageCount = 0;