From 50d0ebc6c898d3b1538f6e1d62868ac11f487a3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Kaan=20K=C3=B6se?= Date: Wed, 29 Jan 2025 16:12:10 +0100 Subject: [PATCH] Fixing remote highest mode seq checks for qresync and condstore synchronizers. --- .../ImapSync/CondstoreSynchronizer.cs | 23 +++++++++---------- .../ImapSynchronizationStrategyProvider.cs | 2 +- .../ImapSync/QResyncSynchronizer.cs | 4 +--- 3 files changed, 13 insertions(+), 16 deletions(-) diff --git a/Wino.Core/Synchronizers/ImapSync/CondstoreSynchronizer.cs b/Wino.Core/Synchronizers/ImapSync/CondstoreSynchronizer.cs index b0028851..3f80a568 100644 --- a/Wino.Core/Synchronizers/ImapSync/CondstoreSynchronizer.cs +++ b/Wino.Core/Synchronizers/ImapSync/CondstoreSynchronizer.cs @@ -45,21 +45,20 @@ namespace Wino.Core.Synchronizers.ImapSync await remoteFolder.OpenAsync(FolderAccess.ReadOnly, cancellationToken).ConfigureAwait(false); var localHighestModSeq = (ulong)folder.HighestModeSeq; - var remoteHighestModSeq = remoteFolder.HighestModSeq; bool isInitialSynchronization = localHighestModSeq == 0; // There are some changes on new messages or flag changes. // Deletions are tracked separately because some servers do not increase // the MODSEQ value for deleted messages. - if (remoteHighestModSeq > localHighestModSeq) + if (remoteFolder.HighestModSeq > localHighestModSeq) { var changedUids = await GetChangedUidsAsync(client, folder, remoteFolder, synchronizer, cancellationToken).ConfigureAwait(false); // Get locally exists mails for the returned UIDs. downloadedMessageIds = await HandleChangedUIdsAsync(folder, synchronizer, remoteFolder, changedUids, cancellationToken).ConfigureAwait(false); - folder.HighestModeSeq = (long)remoteHighestModSeq; + folder.HighestModeSeq = unchecked((long)remoteFolder.HighestModSeq); await FolderService.UpdateFolderAsync(folder).ConfigureAwait(false); } @@ -103,15 +102,15 @@ namespace Wino.Core.Synchronizers.ImapSync IList changedUids = null; - // TODO: Temporarily disabled. - //if (winoClient.Capabilities.HasFlag(ImapCapabilities.Sort)) - //{ - // changedUids = await remoteFolder.SortAsync(SearchQuery.ChangedSince(localHighestModSeq), [OrderBy.ReverseDate], cancellationToken).ConfigureAwait(false); - //} - //else - //{ - // changedUids = await remoteFolder.SearchAsync(SearchQuery.ChangedSince(localHighestModSeq), cancellationToken).ConfigureAwait(false); - //} + if (winoClient.Capabilities.HasFlag(ImapCapabilities.Sort)) + { + // Highest mod seq must be greater than 0 for SORT. + changedUids = await remoteFolder.SortAsync(SearchQuery.ChangedSince(Math.Max(localHighestModSeq, 1)), [OrderBy.ReverseDate], cancellationToken).ConfigureAwait(false); + } + else + { + changedUids = await remoteFolder.SearchAsync(SearchQuery.ChangedSince(localHighestModSeq), cancellationToken).ConfigureAwait(false); + } changedUids = await remoteFolder.SearchAsync(SearchQuery.ChangedSince(localHighestModSeq), cancellationToken).ConfigureAwait(false); diff --git a/Wino.Core/Synchronizers/ImapSync/ImapSynchronizationStrategyProvider.cs b/Wino.Core/Synchronizers/ImapSync/ImapSynchronizationStrategyProvider.cs index b6fef92c..5959b749 100644 --- a/Wino.Core/Synchronizers/ImapSync/ImapSynchronizationStrategyProvider.cs +++ b/Wino.Core/Synchronizers/ImapSync/ImapSynchronizationStrategyProvider.cs @@ -22,7 +22,7 @@ namespace Wino.Core.Synchronizers.ImapSync if (client is not WinoImapClient winoImapClient) throw new System.ArgumentException("Client must be of type WinoImapClient.", nameof(client)); - // if (client.Capabilities.HasFlag(ImapCapabilities.QuickResync) && winoImapClient.IsQResyncEnabled) return _qResyncSynchronizer; + if (client.Capabilities.HasFlag(ImapCapabilities.QuickResync) && winoImapClient.IsQResyncEnabled) return _qResyncSynchronizer; if (client.Capabilities.HasFlag(ImapCapabilities.CondStore)) return _condstoreSynchronizer; return _uidBasedSynchronizer; diff --git a/Wino.Core/Synchronizers/ImapSync/QResyncSynchronizer.cs b/Wino.Core/Synchronizers/ImapSync/QResyncSynchronizer.cs index 00b1daf0..25cd813d 100644 --- a/Wino.Core/Synchronizers/ImapSync/QResyncSynchronizer.cs +++ b/Wino.Core/Synchronizers/ImapSync/QResyncSynchronizer.cs @@ -58,8 +58,6 @@ namespace Wino.Core.Synchronizers.ImapSync } // Perform QRESYNC synchronization. - - var remoteHighestModSeq = remoteFolder.HighestModSeq; var localHighestModSeq = (ulong)folder.HighestModeSeq; remoteFolder.MessagesVanished += async (c, r) => await HandleMessageDeletedAsync(folder, r.UniqueIds).ConfigureAwait(false); @@ -75,7 +73,7 @@ namespace Wino.Core.Synchronizers.ImapSync downloadedMessageIds = await HandleChangedUIdsAsync(folder, synchronizer, remoteFolder, changedUids, cancellationToken).ConfigureAwait(false); // Update the local folder with the new highest mod-seq and validity. - folder.HighestModeSeq = (long)remoteHighestModSeq; + folder.HighestModeSeq = unchecked((long)remoteFolder.HighestModSeq); folder.UidValidity = remoteFolder.UidValidity; await ManageUUIdBasedDeletedMessagesAsync(folder, remoteFolder, cancellationToken).ConfigureAwait(false);