From d0d4dc5c1885a790da0fc28d0027cac458a358fa Mon Sep 17 00:00:00 2001 From: jpirnay Date: Wed, 4 Mar 2026 12:27:33 +0100 Subject: [PATCH] Review changes --- src/activities/reader/EpubReaderActivity.cpp | 5 ++++- src/activities/reader/TxtReaderActivity.cpp | 18 +++++++++++++----- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/activities/reader/EpubReaderActivity.cpp b/src/activities/reader/EpubReaderActivity.cpp index 5cebce5f..a1dc66ad 100644 --- a/src/activities/reader/EpubReaderActivity.cpp +++ b/src/activities/reader/EpubReaderActivity.cpp @@ -8,6 +8,8 @@ #include #include +#include + #include "CrossPointSettings.h" #include "CrossPointState.h" #include "EpubReaderChapterSelectionActivity.h" @@ -22,6 +24,7 @@ #include "fontIds.h" #include "util/ScreenshotUtil.h" + namespace { // pagesPerRefresh now comes from SETTINGS.getRefreshFrequency() constexpr unsigned long skipChapterMs = 700; @@ -870,7 +873,7 @@ bool EpubReaderActivity::drawCurrentPageToBuffer(const std::string& filePath, Gf // Load or rebuild the section cache. Rebuilding is needed when the cache is missing or stale // (e.g. after a firmware update). A no-op popup callback avoids any UI during sleep preparation. - auto section = std::unique_ptr
(new Section(epub, spineIndex, renderer)); + auto section = std::make_unique
(epub, spineIndex, renderer); if (!section->loadSectionFile(SETTINGS.getReaderFontId(), SETTINGS.getReaderLineCompression(), SETTINGS.extraParagraphSpacing, SETTINGS.paragraphAlignment, viewportWidth, viewportHeight, SETTINGS.hyphenationEnabled, SETTINGS.embeddedStyle)) { diff --git a/src/activities/reader/TxtReaderActivity.cpp b/src/activities/reader/TxtReaderActivity.cpp index fc091dcf..7d7180e5 100644 --- a/src/activities/reader/TxtReaderActivity.cpp +++ b/src/activities/reader/TxtReaderActivity.cpp @@ -56,7 +56,10 @@ size_t parseAndWrapLines(const uint8_t* buffer, size_t chunkSize, size_t fileOff while (breakPos > 0 && (line[breakPos] & 0xC0) == 0x80) breakPos--; } } - if (breakPos == 0) breakPos = 1; + if (breakPos == 0) { + breakPos = 1; + while (breakPos < line.length() && (line[breakPos] & 0xC0) == 0x80) breakPos++; + } outLines.push_back(line.substr(0, breakPos)); size_t skipChars = breakPos; if (breakPos < line.length() && line[breakPos] == ' ') skipChars++; @@ -526,8 +529,9 @@ bool TxtReaderActivity::loadPageIndexCache() { uint32_t numPages; serialization::readPod(f, numPages); if (numPages > MAX_CACHE_PAGES) { - LOG_ERR("TRS", "Cache numPages %u exceeds cap %u, truncating", numPages, MAX_CACHE_PAGES); - numPages = MAX_CACHE_PAGES; + LOG_ERR("TRS", "Cache numPages %u exceeds cap %u, cache invalid", numPages, MAX_CACHE_PAGES); + f.close(); + return false; } // Read page offsets @@ -672,8 +676,12 @@ bool TxtReaderActivity::drawCurrentPageToBuffer(const std::string& filePath, Gfx uint32_t off; serialization::readPod(cacheFile, off); if (static_cast(i) == savedPage) { - savedOffset = off; - offsetKnown = true; + if (off < txt.getFileSize()) { + savedOffset = off; + offsetKnown = true; + } else { + LOG_DBG("SLP", "TXT: index.bin offset %u out of range (fileSize=%u), ignoring", off, txt.getFileSize()); + } } } } else {