From 79b4d63ee271ea27b15d0f0f091d04bfd34e2d2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Sypia=C5=84ski?= Date: Fri, 3 Jul 2026 17:58:24 +0200 Subject: [PATCH] fix: settings persist on font clear, reserve() before push_back, minor (#2519) --- lib/OpdsParser/OpdsParser.cpp | 9 +++++---- lib/Txt/Txt.cpp | 2 +- src/JsonSettingsIO.cpp | 6 ++---- src/SdCardFontSystem.cpp | 5 +++++ src/WifiCredentialStore.cpp | 3 +++ src/activities/home/FileBrowserActivity.cpp | 2 +- 6 files changed, 17 insertions(+), 10 deletions(-) diff --git a/lib/OpdsParser/OpdsParser.cpp b/lib/OpdsParser/OpdsParser.cpp index 26cdaed8..d00d02ed 100644 --- a/lib/OpdsParser/OpdsParser.cpp +++ b/lib/OpdsParser/OpdsParser.cpp @@ -10,7 +10,11 @@ OpdsParser::OpdsParser() { if (!parser) { errorOccured = true; LOG_DBG("OPDS", "Couldn't allocate memory for parser"); + return; } + XML_SetUserData(parser, this); + XML_SetElementHandler(parser, startElement, endElement); + XML_SetCharacterDataHandler(parser, characterData); } OpdsParser::~OpdsParser() { destroyXmlParser(parser); } @@ -20,10 +24,6 @@ size_t OpdsParser::write(uint8_t c) { return write(&c, 1); } size_t OpdsParser::write(const uint8_t* xmlData, const size_t length) { if (errorOccured) return length; - XML_SetUserData(parser, this); - XML_SetElementHandler(parser, startElement, endElement); - XML_SetCharacterDataHandler(parser, characterData); - const char* currentPos = reinterpret_cast(xmlData); size_t remaining = length; constexpr size_t chunkSize = 1024; @@ -54,6 +54,7 @@ size_t OpdsParser::write(const uint8_t* xmlData, const size_t length) { } void OpdsParser::flush() { + if (errorOccured || !parser) return; if (XML_Parse(parser, nullptr, 0, XML_TRUE) != XML_STATUS_OK) { errorOccured = true; destroyXmlParser(parser); diff --git a/lib/Txt/Txt.cpp b/lib/Txt/Txt.cpp index 581c8c62..ef9ee175 100644 --- a/lib/Txt/Txt.cpp +++ b/lib/Txt/Txt.cpp @@ -42,7 +42,7 @@ std::string Txt::getTitle() const { // Remove .txt extension if (FsHelpers::hasTxtExtension(filename)) { - filename = filename.substr(0, filename.length() - 4); + filename.resize(filename.length() - 4); } return filename; diff --git a/src/JsonSettingsIO.cpp b/src/JsonSettingsIO.cpp index 6f0a51d2..92139b69 100644 --- a/src/JsonSettingsIO.cpp +++ b/src/JsonSettingsIO.cpp @@ -5,6 +5,7 @@ #include #include +#include #include #include @@ -153,10 +154,6 @@ bool JsonSettingsIO::saveSettings(const CrossPointSettings& s, const char* path) // Stored as ISO code string ("EN", "DE", ...) for stability across enum reorders. doc["language"] = (s.language < getLanguageCount()) ? LANGUAGE_CODES[s.language] : "EN"; - // Language -- managed by LanguageSelectActivity, not in SettingsList. - // Stored as ISO code string ("EN", "DE", ...) for stability across enum reorders. - doc["language"] = (s.language < getLanguageCount()) ? LANGUAGE_CODES[s.language] : "EN"; - String json; serializeJson(doc, json); return Storage.writeFile(path, json); @@ -345,6 +342,7 @@ bool JsonSettingsIO::loadRecentBooks(RecentBooksStore& store, const char* json) store.recentBooks.clear(); JsonArray arr = doc["books"].as(); + store.recentBooks.reserve(std::min(arr.size(), (size_t)10)); for (JsonObject obj : arr) { if (store.getCount() >= 10) break; RecentBook book; diff --git a/src/SdCardFontSystem.cpp b/src/SdCardFontSystem.cpp index 79aa1226..d0b311bb 100644 --- a/src/SdCardFontSystem.cpp +++ b/src/SdCardFontSystem.cpp @@ -34,10 +34,12 @@ void SdCardFontSystem::begin(GfxRenderer& renderer) { } else { LOG_ERR("SDFS", "Failed to load SD font family: %s (clearing)", SETTINGS.sdFontFamilyName); SETTINGS.sdFontFamilyName[0] = '\0'; + SETTINGS.saveToFile(); } } else { LOG_DBG("SDFS", "SD font family not found on card: %s (clearing)", SETTINGS.sdFontFamilyName); SETTINGS.sdFontFamilyName[0] = '\0'; + SETTINGS.saveToFile(); } } @@ -76,6 +78,7 @@ void SdCardFontSystem::ensureLoaded(GfxRenderer& renderer) { LOG_DBG("SDFS", "SD font family disappeared: %s (clearing)", wantedFamily); manager_.unloadAll(renderer); SETTINGS.sdFontFamilyName[0] = '\0'; + SETTINGS.saveToFile(); return; } const auto* selected = family->findClosestReaderSize(sizeEnum); @@ -96,10 +99,12 @@ void SdCardFontSystem::ensureLoaded(GfxRenderer& renderer) { } else { LOG_ERR("SDFS", "Failed to load SD font family: %s (clearing)", wantedFamily); SETTINGS.sdFontFamilyName[0] = '\0'; + SETTINGS.saveToFile(); } } else { LOG_DBG("SDFS", "SD font family not found: %s (clearing)", wantedFamily); SETTINGS.sdFontFamilyName[0] = '\0'; + SETTINGS.saveToFile(); } } diff --git a/src/WifiCredentialStore.cpp b/src/WifiCredentialStore.cpp index 47760237..6827ad5c 100644 --- a/src/WifiCredentialStore.cpp +++ b/src/WifiCredentialStore.cpp @@ -6,6 +6,8 @@ #include #include +#include + // Initialize the static instance WifiCredentialStore WifiCredentialStore::instance; @@ -89,6 +91,7 @@ bool WifiCredentialStore::loadFromBinaryFile() { serialization::readPod(file, count); credentials.clear(); + credentials.reserve(std::min(count, MAX_NETWORKS)); for (uint8_t i = 0; i < count && i < MAX_NETWORKS; i++) { WifiCredential cred; serialization::readString(file, cred.ssid); diff --git a/src/activities/home/FileBrowserActivity.cpp b/src/activities/home/FileBrowserActivity.cpp index 256a6755..18577923 100644 --- a/src/activities/home/FileBrowserActivity.cpp +++ b/src/activities/home/FileBrowserActivity.cpp @@ -336,7 +336,7 @@ std::string getFileName(std::string filename) { return filename.substr(0, pos); } -std::string getFileExtension(std::string filename) { +std::string getFileExtension(const std::string& filename) { if (filename.back() == '/') { return ""; }