protected static void TranslateFlag(ManifestConfigFlags sourceFlag, SyncConfigFlags destinationFlag, ManifestConfigFlags sourceFlags, ref SyncConfigFlags destinationFlags)
 {
     if ((sourceFlags & sourceFlag) == sourceFlag)
     {
         destinationFlags |= destinationFlag;
         return;
     }
     destinationFlags &= ~destinationFlag;
 }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 6
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);
        }