A fork of https://github.com/crosspoint-reader/crosspoint-reader
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix: Auto calculate the settings size on serialization (#832)

## Summary

* The constant SETTINGS_CONST was hardcoded and needed to be updated
whenever an additional setting was added
* This is no longer necessary as the settings size will be determined
automatically on settings persistence

## Additional Context

* New settings need to be added (as previously) in saveToFile - that's
it

---

### AI Usage

While CrossPoint doesn't have restrictions on AI tools in contributing,
please be transparent about their usage as it
helps set the right context for reviewers.

Did you use AI tools to help write this code? YES

---------

Co-authored-by: Xuan Son Nguyen <son@huggingface.co>

authored by

jpirnay
Xuan Son Nguyen
and committed by
GitHub
50e6ef9b a616f42c

+78 -34
+72 -34
src/CrossPointSettings.cpp
··· 5 5 #include <Serialization.h> 6 6 7 7 #include <cstring> 8 + #include <string> 8 9 9 10 #include "fontIds.h" 10 11 ··· 21 22 22 23 namespace { 23 24 constexpr uint8_t SETTINGS_FILE_VERSION = 1; 24 - // Increment this when adding new persisted settings fields 25 - constexpr uint8_t SETTINGS_COUNT = 30; 25 + // SETTINGS_COUNT is now calculated automatically in saveToFile 26 26 constexpr char SETTINGS_FILE[] = "/.crosspoint/settings.bin"; 27 27 28 28 // Validate front button mapping to ensure each hardware button is unique. ··· 77 77 } 78 78 } // namespace 79 79 80 + class SettingsWriter { 81 + public: 82 + bool is_counting = false; 83 + uint8_t item_count = 0; 84 + template <typename T> 85 + 86 + void writeItem(FsFile& file, const T& value) { 87 + if (is_counting) { 88 + item_count++; 89 + } else { 90 + serialization::writePod(file, value); 91 + } 92 + } 93 + 94 + void writeItemString(FsFile& file, const char* value) { 95 + if (is_counting) { 96 + item_count++; 97 + } else { 98 + serialization::writeString(file, std::string(value)); 99 + } 100 + } 101 + }; 102 + 103 + uint8_t CrossPointSettings::writeSettings(FsFile& file, bool count_only) const { 104 + SettingsWriter writer; 105 + writer.is_counting = count_only; 106 + 107 + writer.writeItem(file, sleepScreen); 108 + writer.writeItem(file, extraParagraphSpacing); 109 + writer.writeItem(file, shortPwrBtn); 110 + writer.writeItem(file, statusBar); 111 + writer.writeItem(file, orientation); 112 + writer.writeItem(file, frontButtonLayout); // legacy 113 + writer.writeItem(file, sideButtonLayout); 114 + writer.writeItem(file, fontFamily); 115 + writer.writeItem(file, fontSize); 116 + writer.writeItem(file, lineSpacing); 117 + writer.writeItem(file, paragraphAlignment); 118 + writer.writeItem(file, sleepTimeout); 119 + writer.writeItem(file, refreshFrequency); 120 + writer.writeItem(file, screenMargin); 121 + writer.writeItem(file, sleepScreenCoverMode); 122 + writer.writeItemString(file, opdsServerUrl); 123 + writer.writeItem(file, textAntiAliasing); 124 + writer.writeItem(file, hideBatteryPercentage); 125 + writer.writeItem(file, longPressChapterSkip); 126 + writer.writeItem(file, hyphenationEnabled); 127 + writer.writeItemString(file, opdsUsername); 128 + writer.writeItemString(file, opdsPassword); 129 + writer.writeItem(file, sleepScreenCoverFilter); 130 + writer.writeItem(file, uiTheme); 131 + writer.writeItem(file, frontButtonBack); 132 + writer.writeItem(file, frontButtonConfirm); 133 + writer.writeItem(file, frontButtonLeft); 134 + writer.writeItem(file, frontButtonRight); 135 + writer.writeItem(file, fadingFix); 136 + writer.writeItem(file, embeddedStyle); 137 + // New fields need to be added at end for backward compatibility 138 + 139 + return writer.item_count; 140 + } 141 + 80 142 bool CrossPointSettings::saveToFile() const { 81 143 // Make sure the directory exists 82 144 Storage.mkdir("/.crosspoint"); ··· 86 148 return false; 87 149 } 88 150 151 + // First pass: count the items 152 + uint8_t item_count = writeSettings(outputFile, true); // This will just count, not write 153 + 154 + // Write header 89 155 serialization::writePod(outputFile, SETTINGS_FILE_VERSION); 90 - serialization::writePod(outputFile, SETTINGS_COUNT); 91 - serialization::writePod(outputFile, sleepScreen); 92 - serialization::writePod(outputFile, extraParagraphSpacing); 93 - serialization::writePod(outputFile, shortPwrBtn); 94 - serialization::writePod(outputFile, statusBar); 95 - serialization::writePod(outputFile, orientation); 96 - serialization::writePod(outputFile, frontButtonLayout); // legacy 97 - serialization::writePod(outputFile, sideButtonLayout); 98 - serialization::writePod(outputFile, fontFamily); 99 - serialization::writePod(outputFile, fontSize); 100 - serialization::writePod(outputFile, lineSpacing); 101 - serialization::writePod(outputFile, paragraphAlignment); 102 - serialization::writePod(outputFile, sleepTimeout); 103 - serialization::writePod(outputFile, refreshFrequency); 104 - serialization::writePod(outputFile, screenMargin); 105 - serialization::writePod(outputFile, sleepScreenCoverMode); 106 - serialization::writeString(outputFile, std::string(opdsServerUrl)); 107 - serialization::writePod(outputFile, textAntiAliasing); 108 - serialization::writePod(outputFile, hideBatteryPercentage); 109 - serialization::writePod(outputFile, longPressChapterSkip); 110 - serialization::writePod(outputFile, hyphenationEnabled); 111 - serialization::writeString(outputFile, std::string(opdsUsername)); 112 - serialization::writeString(outputFile, std::string(opdsPassword)); 113 - serialization::writePod(outputFile, sleepScreenCoverFilter); 114 - serialization::writePod(outputFile, uiTheme); 115 - serialization::writePod(outputFile, frontButtonBack); 116 - serialization::writePod(outputFile, frontButtonConfirm); 117 - serialization::writePod(outputFile, frontButtonLeft); 118 - serialization::writePod(outputFile, frontButtonRight); 119 - serialization::writePod(outputFile, fadingFix); 120 - serialization::writePod(outputFile, embeddedStyle); 121 - // New fields added at end for backward compatibility 156 + serialization::writePod(outputFile, static_cast<uint8_t>(item_count)); 157 + // Second pass: actually write the settings 158 + writeSettings(outputFile); // This will write the actual data 159 + 122 160 outputFile.close(); 123 161 124 162 LOG_DBG("CPS", "Settings saved to file");
+6
src/CrossPointSettings.h
··· 2 2 #include <cstdint> 3 3 #include <iosfwd> 4 4 5 + // Forward declarations 6 + class FsFile; 7 + 5 8 class CrossPointSettings { 6 9 private: 7 10 // Private constructor for singleton ··· 181 184 return (shortPwrBtn == CrossPointSettings::SHORT_PWRBTN::SLEEP) ? 10 : 400; 182 185 } 183 186 int getReaderFontId() const; 187 + 188 + // If count_only is true, returns the number of settings items that would be written. 189 + uint8_t writeSettings(FsFile& file, bool count_only = false) const; 184 190 185 191 bool saveToFile() const; 186 192 bool loadFromFile();