Brings ~55 mod-exclusive files to the upstream-based mod/master-resync branch: Activities (migrated to new ActivityManager pattern): - Clock/Time: SetTimeActivity, SetTimezoneOffsetActivity, NtpSyncActivity - Dictionary: DictionaryDefinitionActivity, DictionarySuggestionsActivity, DictionaryWordSelectActivity, LookedUpWordsActivity - Bookmark: EpubReaderBookmarkSelectionActivity - Book management: BookManageMenuActivity, EndOfBookMenuActivity - OPDS: OpdsServerListActivity, OpdsSettingsActivity - Utility: DirectoryPickerActivity, NumericStepperActivity Utilities (unchanged): - BookManager, BookSettings, BookmarkStore, BootNtpSync - Dictionary, LookupHistory, TimeSync, OpdsServerStore Libraries: PlaceholderCover, TableData, ChapterXPathIndexer Scripts: inject_mod_version, generate_book_icon, preview_placeholder_cover Docs: KOReader sync XPath mapping Migration changes: - ActivityWithSubactivity -> Activity base class - Callback constructors -> finish()/setResult() pattern - enterNewActivity() -> startActivityForResult() - Activity::RenderLock&& -> RenderLock&& These files won't compile yet - they reference mod settings and I18n strings that will be added in subsequent phases. Made-with: Cursor
3.0 KiB
3.0 KiB
Port Upstream PRs #1207 and #1209
Task
Ported two upstream PRs from crosspoint-reader/crosspoint-reader to the fork:
- PR #1207:
fix: use HTTPClient::writeToStream for downloading files from OPDS - PR #1209:
feat: Support for multiple OPDS servers
Cherry-picking was not possible due to significant divergences (WiFiClient vs NetworkClient naming, i18n changes, binary vs JSON settings, missing JsonSettingsIO/ObfuscationUtils).
Changes Made
PR #1207 (2 files modified)
src/network/HttpDownloader.cpp— AddedFileWriteStreamclass, replaced manual chunked download loop withHTTPClient::writeToStream, improved Content-Length handling and post-download validationsrc/activities/browser/OpdsBookBrowserActivity.cpp— Truncated download status text to fit screen width
PR #1209 (6 files created, ~15 files modified, 2 files deleted)
New files:
src/OpdsServerStore.h/src/OpdsServerStore.cpp— Singleton store for up to 8 OPDS servers with MAC-based XOR+base64 password obfuscation and JSON persistence (self-contained — fork lacks JsonSettingsIO/ObfuscationUtils, so persistence was inlined)src/activities/settings/OpdsServerListActivity.h/.cpp— Dual-mode activity: settings list (add/edit/delete) and server pickersrc/activities/settings/OpdsSettingsActivity.h/.cpp— Individual server editor (name, URL, username, password, delete)
Modified files:
src/network/HttpDownloader.h/.cpp— Added per-call username/password parameters (default empty), removed global SETTINGS dependencysrc/activities/browser/OpdsBookBrowserActivity.h/.cpp— Constructor acceptsOpdsServer, uses server-specific credentials and URL, shows server name in headersrc/activities/home/HomeActivity.h/.cpp—hasOpdsUrl→hasOpdsServers, usesOPDS_STORE.hasServers()src/main.cpp— Added OPDS_STORE loading on boot, server picker when multiple servers configuredsrc/activities/settings/SettingsActivity.cpp— Replaced CalibreSettingsActivity with OpdsServerListActivitysrc/network/CrossPointWebServer.h/.cpp— Added REST endpoints: GET/POST /api/opds, POST /api/opds/deletesrc/network/html/SettingsPage.html— Added OPDS server management UI (CSS + JS)src/SettingsList.h— Removed legacy OPDS entries (opdsServerUrl, opdsUsername, opdsPassword)- 9 translation YAML files — Added STR_ADD_SERVER, STR_SERVER_NAME, STR_NO_SERVERS, STR_DELETE_SERVER, STR_DELETE_CONFIRM, STR_OPDS_SERVERS
Deleted files:
src/activities/settings/CalibreSettingsActivity.h/.cpp
Key Adaptation Decisions
- Kept
WiFiClient/WiFiClientSecurenaming (fork hasn't adoptedNetworkClientrename) - Inlined JSON persistence and MAC-based obfuscation directly into
OpdsServerStore.cpp(fork lacksJsonSettingsIOandObfuscationUtilslibraries) - Legacy single-server settings auto-migrate to new
opds.jsonon first boot
Build Status
Compilation verified: SUCCESS (RAM: 32.8%, Flash: 71.4%)