protected static void TranslateFlag(ManifestConfigFlags sourceFlag, SyncConfigFlags destinationFlag, ManifestConfigFlags sourceFlags, ref SyncConfigFlags destinationFlags) { if ((sourceFlags & sourceFlag) == sourceFlag) { destinationFlags |= destinationFlag; return; } destinationFlags &= ~destinationFlag; }
private static SyncConfigFlags ConvertManifestConfigFlags(ManifestConfigFlags syncFlag) { EnumValidator.ThrowIfInvalid <ManifestConfigFlags>(syncFlag, HierarchyManifestProvider.validConvertOptions); SyncConfigFlags result = SyncConfigFlags.None; ManifestProviderBase <MapiHierarchyManifestEx, HierarchySyncPhase> .TranslateFlag(ManifestConfigFlags.NoDeletions, SyncConfigFlags.NoDeletions, syncFlag, ref result); ManifestProviderBase <MapiHierarchyManifestEx, HierarchySyncPhase> .TranslateFlag(ManifestConfigFlags.Catchup, SyncConfigFlags.Catchup, syncFlag, ref result); ManifestProviderBase <MapiHierarchyManifestEx, HierarchySyncPhase> .TranslateFlag(ManifestConfigFlags.NoChanges, SyncConfigFlags.NoChanges, syncFlag, ref result); return(result); }
public static FolderHierarchyChangeDetector.MailboxChangesManifest RunICSManifestSync(bool catchup, FolderHierarchyChangeDetector.SyncHierarchyManifestState hierState, MailboxSession mailboxSession, ISyncLogger syncLogger = null) { if (syncLogger == null) { syncLogger = TracingLogger.Singleton; } syncLogger.TraceDebug <SmtpAddress, bool>(ExTraceGlobals.SyncProcessTracer, 0L, "[FolderHierarchyChangeDetector.RunICSManifestSync] Checking for folder hierarhcy changes for Mailbox: {0}. Catchup? {1}", mailboxSession.MailboxOwner.MailboxInfo.PrimarySmtpAddress, catchup); MapiStore _ContainedMapiStore = mailboxSession.__ContainedMapiStore; FolderHierarchyChangeDetector.MailboxChangesManifest mailboxChangesManifest = new FolderHierarchyChangeDetector.MailboxChangesManifest(); FolderHierarchyChangeDetector.ManifestHierarchyCallback iMapiManifestCallback = new FolderHierarchyChangeDetector.ManifestHierarchyCallback(catchup, mailboxChangesManifest); try { using (MapiFolder ipmSubtreeFolder = _ContainedMapiStore.GetIpmSubtreeFolder()) { SyncConfigFlags syncConfigFlags = SyncConfigFlags.ManifestHierReturnDeletedEntryIds; int serverVersion = mailboxSession.MailboxOwner.MailboxInfo.Location.ServerVersion; if ((serverVersion >= Server.E14MinVersion && serverVersion < Server.E15MinVersion) || (long)serverVersion >= FolderHierarchyChangeDetector.E15MinVersionSupportsOnlySpecifiedPropsForHierarchy) { syncConfigFlags |= SyncConfigFlags.OnlySpecifiedProps; } using (MapiHierarchyManifestEx mapiHierarchyManifestEx = ipmSubtreeFolder.CreateExportHierarchyManifestEx(syncConfigFlags, hierState.IdsetGiven, hierState.CnsetSeen, iMapiManifestCallback, FolderHierarchyChangeDetector.PropsToFetch, null)) { while (mapiHierarchyManifestEx.Synchronize() != ManifestStatus.Done) { } byte[] idSetGiven; byte[] cnetSeen; mapiHierarchyManifestEx.GetState(out idSetGiven, out cnetSeen); syncLogger.TraceDebug <SmtpAddress, int, int>(ExTraceGlobals.SyncProcessTracer, 0L, "[FolderHierarchyChangeDetector.RunICSManifestSync] Updating ICS state for mailbox: '{0}'. Change Count: {1}, Delete Count: {2}", mailboxSession.MailboxOwner.MailboxInfo.PrimarySmtpAddress, mailboxChangesManifest.ChangedFolders.Count, mailboxChangesManifest.DeletedFolders.Count); hierState.Update(idSetGiven, cnetSeen); } } } catch (MapiPermanentException arg) { syncLogger.TraceDebug <SmtpAddress, MapiPermanentException>(ExTraceGlobals.SyncProcessTracer, 0L, "[FolderHierarchyChangeDetector.RunICSManifestSync] Caught MapiPermanentException when determining folder ICS changes for mailbox: {0}. Exception: {1}", mailboxSession.MailboxOwner.MailboxInfo.PrimarySmtpAddress, arg); return(null); } catch (MapiRetryableException arg2) { syncLogger.TraceDebug <SmtpAddress, MapiRetryableException>(ExTraceGlobals.SyncProcessTracer, 0L, "[FolderHierarchyChangeDetector.RunICSManifestSync] Caught MapiRetryableException when determining folder ICS changes for mailbox: {0}. Exception: {1}", mailboxSession.MailboxOwner.MailboxInfo.PrimarySmtpAddress, arg2); return(null); } return(mailboxChangesManifest); }
private void ConfigureMapiManifest(SyncHierarchyManifestState syncState, MailboxChangesManifest changes, EnumerateHierarchyChangesFlags flags, int maxChanges) { if (this.isPagedEnumeration && !flags.HasFlag(EnumerateHierarchyChangesFlags.FirstPage)) { this.callback.InitializeNextPage(changes, maxChanges); return; } this.callback = new ManifestHierarchyCallback(this.isPagedEnumeration); this.callback.InitializeNextPage(changes, maxChanges); SyncConfigFlags syncConfigFlags = SyncConfigFlags.ManifestHierReturnDeletedEntryIds; if (((this.mailbox.ServerVersion >= Server.E14MinVersion && this.mailbox.ServerVersion < Server.E15MinVersion) || (long)this.mailbox.ServerVersion >= ManifestHierarchyChangesFetcher.E15MinVersionSupportsOnlySpecifiedPropsForHierarchy) && !this.mailbox.IsPureMAPI) { syncConfigFlags |= SyncConfigFlags.OnlySpecifiedProps; } using (this.mailbox.RHTracker.Start()) { this.mapiManifest = this.mapiFolder.CreateExportHierarchyManifestEx(syncConfigFlags, syncState.IdsetGiven, syncState.CnsetSeen, this.callback, new PropTag[] { PropTag.EntryId }, null); } }
private static SyncConfigFlags ConvertManifestConfigFlags(ManifestConfigFlags syncFlag) { SyncConfigFlags result = SyncConfigFlags.None; EnumValidator.ThrowIfInvalid <ManifestConfigFlags>(syncFlag); ManifestProviderBase <MapiManifestEx, ContentSyncPhase> .TranslateFlag(ManifestConfigFlags.NoDeletions, SyncConfigFlags.NoDeletions, syncFlag, ref result); ManifestProviderBase <MapiManifestEx, ContentSyncPhase> .TranslateFlag(ManifestConfigFlags.NoSoftDeletions, SyncConfigFlags.NoSoftDeletions, syncFlag, ref result); ManifestProviderBase <MapiManifestEx, ContentSyncPhase> .TranslateFlag(ManifestConfigFlags.ReadState, SyncConfigFlags.ReadState, syncFlag, ref result); ManifestProviderBase <MapiManifestEx, ContentSyncPhase> .TranslateFlag(ManifestConfigFlags.Associated, SyncConfigFlags.Associated, syncFlag, ref result); ManifestProviderBase <MapiManifestEx, ContentSyncPhase> .TranslateFlag(ManifestConfigFlags.Normal, SyncConfigFlags.Normal, syncFlag, ref result); ManifestProviderBase <MapiManifestEx, ContentSyncPhase> .TranslateFlag(ManifestConfigFlags.Catchup, SyncConfigFlags.Catchup, syncFlag, ref result); ManifestProviderBase <MapiManifestEx, ContentSyncPhase> .TranslateFlag(ManifestConfigFlags.NoChanges, SyncConfigFlags.NoChanges, syncFlag, ref result); ManifestProviderBase <MapiManifestEx, ContentSyncPhase> .TranslateFlag(ManifestConfigFlags.OrderByDeliveryTime, SyncConfigFlags.OrderByDeliveryTime, syncFlag, ref result); return(result); }
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); }