FolderChangesManifest ISourceFolder.EnumerateChanges(EnumerateContentChangesFlags flags, int maxChanges)
        {
            FolderChangesManifest folderChangesManifest = new FolderChangesManifest(base.FolderId);

            folderChangesManifest.ChangedMessages = new List <MessageRec>();
            folderChangesManifest.ReadMessages    = new List <byte[]>();
            folderChangesManifest.UnreadMessages  = new List <byte[]>();
            if (!base.Folder.IsSelectable)
            {
                return(folderChangesManifest);
            }
            SyncContentsManifestState syncContentsManifestState = base.Mailbox.SyncState[base.FolderId];
            ImapFolderState           imapFolderState;

            if (syncContentsManifestState.Data != null)
            {
                imapFolderState = ImapFolderState.Deserialize(syncContentsManifestState.Data);
                if (imapFolderState.UidValidity != base.Folder.UidValidity)
                {
                    syncContentsManifestState.Data           = ImapFolderState.CreateNew(base.Folder).Serialize();
                    this.nextSeqNumCrawl                     = null;
                    folderChangesManifest.FolderRecoverySync = true;
                    return(folderChangesManifest);
                }
            }
            else
            {
                imapFolderState = ImapFolderState.CreateNew(base.Folder);
            }
            List <MessageRec> messages         = base.EnumerateMessages(FetchMessagesFlags.None, null, null);
            ImapFolderState   imapFolderState2 = ImapFolderState.Create(messages, imapFolderState.SeqNumCrawl, base.Folder.UidNext, base.Folder.UidValidity);

            this.EnumerateIncrementalChanges(imapFolderState2, imapFolderState, folderChangesManifest, messages);
            syncContentsManifestState.Data = imapFolderState2.Serialize();
            return(folderChangesManifest);
        }
        List <MessageRec> ISourceFolder.EnumerateMessagesPaged(int maxPageSize)
        {
            if (!base.Folder.IsSelectable)
            {
                return(null);
            }
            SyncContentsManifestState syncContentsManifestState = base.Mailbox.SyncState[base.FolderId];
            ImapFolderState           imapFolderState           = (syncContentsManifestState.Data != null) ? ImapFolderState.Deserialize(syncContentsManifestState.Data) : ImapFolderState.CreateNew(base.Folder);

            if (this.nextSeqNumCrawl == null)
            {
                this.nextSeqNumCrawl = new int?((imapFolderState.SeqNumCrawl == int.MaxValue) ? (base.Folder.NumberOfMessages ?? 0) : imapFolderState.SeqNumCrawl);
            }
            else
            {
                imapFolderState.SeqNumCrawl    = this.nextSeqNumCrawl.Value;
                syncContentsManifestState.Data = imapFolderState.Serialize();
            }
            if (this.nextSeqNumCrawl == 0)
            {
                return(null);
            }
            int num = Math.Max(1, (this.nextSeqNumCrawl - maxPageSize + 1).Value);
            List <MessageRec> result = base.EnumerateMessages(FetchMessagesFlags.IncludeExtendedData, new int?(this.nextSeqNumCrawl.Value), new int?(num));

            this.nextSeqNumCrawl = new int?(Math.Max(0, num - 1));
            return(result);
        }