From d05731ca82f75539471e9885b687337d3fd88b3b Mon Sep 17 00:00:00 2001 From: jpirnay Date: Thu, 9 Apr 2026 13:24:18 +0200 Subject: [PATCH 1/2] Show remote progress again --- .../reader/KOReaderSyncActivity.cpp | 32 ++++++++++++------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/activities/reader/KOReaderSyncActivity.cpp b/src/activities/reader/KOReaderSyncActivity.cpp index b63582c4..c3dfcbf4 100644 --- a/src/activities/reader/KOReaderSyncActivity.cpp +++ b/src/activities/reader/KOReaderSyncActivity.cpp @@ -226,9 +226,7 @@ void KOReaderSyncActivity::performSync() { return; } - // Defer remote EPUB mapping until user chooses Apply. Upload only needs the - // precomputed local XPath, so this avoids post-fetch inflate churn and keeps - // the GET session reusable for PUT. + // Prepare remote mapping state for the next step. hasRemoteProgress = false; remotePositionMapped = false; remotePosition.spineIndex = -1; @@ -266,6 +264,18 @@ void KOReaderSyncActivity::performSync() { // Compare intent keeps the legacy chooser flow (apply vs upload), which is // still useful for manual conflict decisions. + // Pre-map remote progress now so compare UI always shows concrete chapter/ + // page data. The mapped result is cached and reused if Apply is chosen. + if (!ensureRemotePositionMapped()) { + { + RenderLock lock(*this); + state = SYNC_FAILED; + statusMessage = tr(STR_SYNC_FAILED_MSG); + } + requestUpdate(true); + return; + } + // Local progress was precomputed before network; keep using the cached value. releaseEpubForMapping(); @@ -442,15 +452,13 @@ void KOReaderSyncActivity::render(RenderLock&&) { // Remote progress - chapter and page renderer.drawText(UI_10_FONT_ID, contentRect.x + 20, 160, tr(STR_REMOTE_LABEL), true); - if (hasRemoteProgress) { - char remoteChapterStr[128]; - snprintf(remoteChapterStr, sizeof(remoteChapterStr), " %s", remoteChapter.c_str()); - renderer.drawText(UI_10_FONT_ID, contentRect.x + 20, 185, remoteChapterStr); - char remotePageStr[64]; - snprintf(remotePageStr, sizeof(remotePageStr), tr(STR_PAGE_OVERALL_FORMAT), remotePosition.pageNumber + 1, - remoteProgress.percentage * 100); - renderer.drawText(UI_10_FONT_ID, contentRect.x + 20, 210, remotePageStr); - } + char remoteChapterStr[128]; + snprintf(remoteChapterStr, sizeof(remoteChapterStr), " %s", remoteChapter.c_str()); + renderer.drawText(UI_10_FONT_ID, contentRect.x + 20, 185, remoteChapterStr); + char remotePageStr[64]; + snprintf(remotePageStr, sizeof(remotePageStr), tr(STR_PAGE_OVERALL_FORMAT), remotePosition.pageNumber + 1, + remoteProgress.percentage * 100); + renderer.drawText(UI_10_FONT_ID, contentRect.x + 20, 210, remotePageStr); if (!remoteProgress.device.empty()) { char deviceStr[64]; From 65eb8570d3d6f6492dc44ca38e4361e71c52123d Mon Sep 17 00:00:00 2001 From: jpirnay Date: Thu, 9 Apr 2026 13:35:31 +0200 Subject: [PATCH 2/2] Keep prewarmed session --- src/activities/reader/KOReaderSyncActivity.cpp | 13 ++++++++----- src/activities/reader/KOReaderSyncActivity.h | 2 +- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/activities/reader/KOReaderSyncActivity.cpp b/src/activities/reader/KOReaderSyncActivity.cpp index c3dfcbf4..754c5d9a 100644 --- a/src/activities/reader/KOReaderSyncActivity.cpp +++ b/src/activities/reader/KOReaderSyncActivity.cpp @@ -266,7 +266,7 @@ void KOReaderSyncActivity::performSync() { // still useful for manual conflict decisions. // Pre-map remote progress now so compare UI always shows concrete chapter/ // page data. The mapped result is cached and reused if Apply is chosen. - if (!ensureRemotePositionMapped()) { + if (!ensureRemotePositionMapped(false)) { { RenderLock lock(*this); state = SYNC_FAILED; @@ -555,14 +555,17 @@ bool KOReaderSyncActivity::ensureEpubLoadedForMapping() { return true; } -bool KOReaderSyncActivity::ensureRemotePositionMapped() { +bool KOReaderSyncActivity::ensureRemotePositionMapped(const bool closeSessionBeforeMapping) { if (remotePositionMapped) { return true; } - // Apply needs remote->local mapping, which triggers EPUB inflate work. - // Release HTTP/TLS session first so mapping has maximum heap headroom. - KOReaderSyncClient::endPersistentSession(); + // Mapping remote->local can trigger EPUB inflate work. For apply/pull paths, + // release HTTP/TLS first to maximize heap headroom. Compare pre-map keeps + // the warmed session alive so Upload can reuse it without a fresh handshake. + if (closeSessionBeforeMapping) { + KOReaderSyncClient::endPersistentSession(); + } { RenderLock lock(*this); diff --git a/src/activities/reader/KOReaderSyncActivity.h b/src/activities/reader/KOReaderSyncActivity.h index 0389276a..da7eb124 100644 --- a/src/activities/reader/KOReaderSyncActivity.h +++ b/src/activities/reader/KOReaderSyncActivity.h @@ -115,5 +115,5 @@ class KOReaderSyncActivity final : public Activity { void releaseEpubForMapping(); bool computeLocalProgressAndChapter(); void computeRemoteChapter(); - bool ensureRemotePositionMapped(); + bool ensureRemotePositionMapped(bool closeSessionBeforeMapping = true); };