예제 #1
0
        FolderChangesManifest ISourceFolder.EnumerateChanges(EnumerateContentChangesFlags flags, int maxChanges)
        {
            if (!base.Folder.IsContentAvailable)
            {
                return(new FolderChangesManifest(base.FolderId));
            }
            SyncContentsManifestState syncState = ((MapiSourceMailbox)base.Mailbox).SyncState[base.FolderId];
            bool flag = maxChanges != 0;

            if (!flag || flags.HasFlag(EnumerateContentChangesFlags.FirstPage))
            {
                MapiStore mapiStore = base.Mailbox.MapiStore;
                int[]     array     = new int[4];
                array[0] = 8;
                if (mapiStore.IsVersionGreaterOrEqualThan(array))
                {
                    this.contentChangesFetcher = new ManifestContentChangesFetcher(this, base.Folder, base.Mailbox, flag);
                }
                else
                {
                    this.contentChangesFetcher = new TitaniumContentChangesFetcher(this, base.Folder, base.Mailbox);
                }
            }
            return(this.contentChangesFetcher.EnumerateContentChanges(syncState, flags, maxChanges));
        }
예제 #2
0
        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[]>();
            SyncContentsManifestState syncContentsManifestState = base.Mailbox.SyncState[base.FolderId];
            PopFolderState            lastSyncedState;

            if (syncContentsManifestState.Data != null)
            {
                lastSyncedState = PopFolderState.Deserialize(syncContentsManifestState.Data);
            }
            else
            {
                lastSyncedState = PopFolderState.CreateNew();
            }
            List <MessageRec> messages       = base.EnumerateMessagesOnPopConnection(maxChanges);
            PopFolderState    popFolderState = PopFolderState.Create(messages);

            this.EnumerateIncrementalChanges(popFolderState, lastSyncedState, folderChangesManifest, messages);
            syncContentsManifestState.Data = popFolderState.Serialize();
            return(folderChangesManifest);
        }
 internal static void ValidateEnumeration(IFolder sourceFolder, EnumerateContentChangesFlags flags, IContentChangesFetcher contentChangesFetcher, bool hasMoreChangesPrevPage, bool isPagedEnumeration)
 {
     flags.HasFlag(EnumerateContentChangesFlags.FirstPage);
     flags.HasFlag(EnumerateContentChangesFlags.Catchup);
     if (!isPagedEnumeration || flags.HasFlag(EnumerateContentChangesFlags.FirstPage) || flags.HasFlag(EnumerateContentChangesFlags.Catchup))
     {
         return;
     }
 }
예제 #4
0
        FolderChangesManifest ISourceFolder.EnumerateChanges(EnumerateContentChangesFlags flags, int maxChanges)
        {
            FolderChangesManifest result = null;

            base.CreateContext("ISourceFolder.EnumerateChanges", new DataContext[]
            {
                new SimpleValueDataContext("flags", flags),
                new SimpleValueDataContext("maxChanges", maxChanges)
            }).Execute(delegate
            {
                result = ((ISourceFolder)this.WrappedObject).EnumerateChanges(flags, maxChanges);
            }, true);
            return(result);
        }
예제 #5
0
        FolderChangesManifest ISourceFolder.EnumerateChanges(EnumerateContentChangesFlags flags, int maxChanges)
        {
            MrsTracer.Provider.Function("StorageSourceFolder.EnumerateChanges({0}, 0x{1:x}, {2})", new object[]
            {
                base.DisplayNameForTracing,
                (int)flags,
                maxChanges
            });
            SyncContentsManifestState syncState = ((StorageSourceMailbox)base.Mailbox).SyncState[base.FolderId];
            bool flag = maxChanges != 0;

            if (!flag || flags.HasFlag(EnumerateContentChangesFlags.FirstPage))
            {
                this.contentChangesFetcher = new ManifestContentChangesFetcher(this, this.MapiFolder, base.Mailbox, flag);
            }
            return(this.contentChangesFetcher.EnumerateContentChanges(syncState, flags, maxChanges));
        }
예제 #6
0
 FolderChangesManifest ISourceFolder.EnumerateChanges(EnumerateContentChangesFlags flags, int maxChanges)
 {
     MrsTracer.ProxyClient.Function("ISourceFolder.EnumerateChanges({0}, {1}): {2}", new object[]
     {
         flags,
         maxChanges,
         base.FolderName
     });
     if (((IMailbox)this.Mailbox).IsMailboxCapabilitySupported(MailboxCapabilities.PagedEnumerateChanges))
     {
         return(base.MrsProxy.ISourceFolder_EnumerateChanges2(base.Handle, (int)flags, maxChanges));
     }
     if (maxChanges != 0)
     {
         throw new UnsupportedRemoteServerVersionWithOperationPermanentException(base.MrsProxyClient.ServerName, base.ServerVersion.ToString(), "ISourceFolder_EnumerateChanges2");
     }
     return(base.MrsProxy.ISourceFolder_EnumerateChanges(base.Handle, flags.HasFlag(EnumerateContentChangesFlags.Catchup)));
 }
예제 #7
0
        FolderChangesManifest ISourceFolder.EnumerateChanges(EnumerateContentChangesFlags flags, int maxChanges)
        {
            FolderChangesManifest     folderChangesManifest     = base.CreateInitializedChangesManifest();
            SyncContentsManifestState syncContentsManifestState = base.Mailbox.SyncState[base.EntryId];
            EasFolderSyncState        persistedSyncState        = base.Mailbox.GetPersistedSyncState(syncContentsManifestState);
            string         syncKey = persistedSyncState.SyncKey;
            EasSyncOptions options = new EasSyncOptions
            {
                SyncKey            = syncKey,
                RecentOnly         = true,
                MaxNumberOfMessage = 512
            };
            EasSyncResult     easSyncResult = base.SyncMessages(base.Mailbox.EasConnectionWrapper, options);
            List <MessageRec> messageRecs   = easSyncResult.MessageRecs;

            this.EnumerateIncrementalChanges(folderChangesManifest, messageRecs);
            this.MergePendingDeletes(folderChangesManifest, persistedSyncState.CrawlerDeletions);
            persistedSyncState.SyncKey       = easSyncResult.NewSyncKey;
            persistedSyncState.ChangesSynced = new DateTime?(DateTime.UtcNow);
            persistedSyncState.CrawlerDeletions.Clear();
            syncContentsManifestState.Data = persistedSyncState.Serialize();
            return(folderChangesManifest);
        }
예제 #8
0
        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);
        }
        private void ConfigureMapiManifest(SyncContentsManifestState syncState, FolderChangesManifest changes, EnumerateContentChangesFlags flags, int maxChanges)
        {
            if (this.isPagedEnumeration && !flags.HasFlag(EnumerateContentChangesFlags.FirstPage))
            {
                this.callback.InitializeNextPage(changes, maxChanges);
                return;
            }
            this.callback = new ManifestContentsCallback(this.folder.GetFolderId(), this.isPagedEnumeration);
            this.callback.InitializeNextPage(changes, maxChanges);
            ManifestConfigFlags manifestConfigFlags = ManifestConfigFlags.Associated | ManifestConfigFlags.Normal | ManifestConfigFlags.OrderByDeliveryTime;

            if (flags.HasFlag(EnumerateContentChangesFlags.Catchup))
            {
                manifestConfigFlags |= ManifestConfigFlags.Catchup;
            }
            Restriction restriction = ((this.mailbox.Options & MailboxOptions.IgnoreExtendedRuleFAIs) != MailboxOptions.None) ? ContentChangesFetcherUtils.ExcludeAllRulesRestriction : ContentChangesFetcherUtils.ExcludeV40RulesRestriction;

            using (this.mailbox.RHTracker.Start())
            {
                this.mapiManifest = this.mapiFolder.CreateExportManifest();
            }
            using (MemoryStream memoryStream = (syncState.Data != null) ? new MemoryStream(syncState.Data) : null)
            {
                using (this.mailbox.RHTracker.Start())
                {
                    this.mapiManifest.Configure(manifestConfigFlags, restriction, memoryStream, this.callback, new PropTag[0]);
                }
            }
        }
        private FolderChangesManifest EnumerateChanges(SyncContentsManifestState syncState, EnumerateContentChangesFlags flags, int maxChanges)
        {
            FolderChangesManifest folderChangesManifest = new FolderChangesManifest(this.folder.GetFolderId());

            if (this.folder.GetFolderRec(null, GetFolderRecFlags.None).FolderType == FolderType.Search)
            {
                return(folderChangesManifest);
            }
            this.ConfigureMapiManifest(syncState, folderChangesManifest, flags, maxChanges);
            ManifestStatus manifestStatus;

            do
            {
                manifestStatus = this.mapiManifest.Synchronize();
            }while (manifestStatus != ManifestStatus.Done && manifestStatus != ManifestStatus.Yielded);
            using (MemoryStream memoryStream = new MemoryStream())
            {
                this.mapiManifest.GetState(memoryStream);
                syncState.Data = memoryStream.ToArray();
            }
            return(folderChangesManifest);
        }
        FolderChangesManifest IContentChangesFetcher.EnumerateContentChanges(SyncContentsManifestState syncState, EnumerateContentChangesFlags flags, int maxChanges)
        {
            FolderChangesManifest folderChangesManifest = this.EnumerateChanges(syncState, flags, maxChanges);

            if (MrsTracer.Provider.IsEnabled(TraceType.DebugTrace))
            {
                int num;
                int num2;
                int num3;
                folderChangesManifest.GetMessageCounts(out num, out num2, out num3);
                MrsTracer.Provider.Debug("Discovered {0} new, {1} changed, {2} deleted, {3} read, {4} unread.", new object[]
                {
                    num,
                    num2,
                    num3,
                    folderChangesManifest.ReadMessages.Count,
                    folderChangesManifest.UnreadMessages.Count
                });
            }
            return(folderChangesManifest);
        }
예제 #12
0
        FolderChangesManifest IContentChangesFetcher.EnumerateContentChanges(SyncContentsManifestState syncState, EnumerateContentChangesFlags enumerateFlags, int maxChanges)
        {
            FolderChangesManifest folderChangesManifest = new FolderChangesManifest(this.folder.GetFolderId());
            bool flag = enumerateFlags.HasFlag(EnumerateContentChangesFlags.Catchup);
            ManifestContentsCallback manifestContentsCallback = new ManifestContentsCallback(this.folder.GetFolderId(), false);

            manifestContentsCallback.InitializeNextPage(folderChangesManifest, maxChanges);
            SyncConfigFlags syncConfigFlags = SyncConfigFlags.ReadState | SyncConfigFlags.Associated | SyncConfigFlags.Normal | SyncConfigFlags.OnlySpecifiedProps;

            if (flag)
            {
                syncConfigFlags |= SyncConfigFlags.Catchup;
            }
            PropTag[] propsInclude = new PropTag[]
            {
                PropTag.EntryId,
                PropTag.MessageSize
            };
            MapiSynchronizer mapiSynchronizer;

            using (this.mailbox.RHTracker.Start())
            {
                mapiSynchronizer = this.mapiFolder.CreateContentsSynchronizer();
            }
            using (MapiManifestCollector mapiManifestCollector = new MapiManifestCollector(this.mapiFolder, manifestContentsCallback))
            {
                using (mapiSynchronizer)
                {
                    using (MemoryStream memoryStream = new MemoryStream())
                    {
                        if (syncState.Data != null)
                        {
                            memoryStream.Write(syncState.Data, 0, syncState.Data.Length);
                            memoryStream.Position = 0L;
                        }
                        Restriction restriction = ((this.mailbox.Options & MailboxOptions.IgnoreExtendedRuleFAIs) != MailboxOptions.None) ? ContentChangesFetcherUtils.ExcludeAllRulesRestriction : ContentChangesFetcherUtils.ExcludeV40RulesRestriction;
                        using (this.mailbox.RHTracker.Start())
                        {
                            mapiSynchronizer.Config(memoryStream, syncConfigFlags, mapiManifestCollector, restriction, propsInclude, null);
                            while (mapiSynchronizer.Synchronize() != 0)
                            {
                            }
                        }
                        syncState.Data = memoryStream.ToArray();
                    }
                }
            }
            if (!flag && MrsTracer.Provider.IsEnabled(TraceType.DebugTrace))
            {
                int num;
                int num2;
                int num3;
                folderChangesManifest.GetMessageCounts(out num, out num2, out num3);
                MrsTracer.Provider.Debug("Discovered {0} new, {1} changed, {2} deleted, {3} read, {4} unread.", new object[]
                {
                    num,
                    num2,
                    num3,
                    folderChangesManifest.ReadMessages.Count,
                    folderChangesManifest.UnreadMessages.Count
                });
            }
            return(folderChangesManifest);
        }
예제 #13
0
 FolderChangesManifest ISourceFolder.EnumerateChanges(EnumerateContentChangesFlags flags, int maxChanges)
 {
     return(base.CreateInitializedChangesManifest());
 }
예제 #14
0
 FolderChangesManifest ISourceFolder.EnumerateChanges(EnumerateContentChangesFlags flags, int maxChanges)
 {
     throw new NotImplementedException();
 }