Esempio n. 1
0
 public override void PreProcessHierarchy()
 {
     base.DestMailboxWrapper.LoadFolderMap(GetFolderMapFlags.None, delegate
     {
         FolderHierarchy folderHierarchy = new FolderHierarchy(FolderHierarchyFlags.PublicFolderMailbox, base.DestMailboxWrapper);
         folderHierarchy.LoadHierarchy(EnumerateFolderHierarchyFlags.WellKnownPublicFoldersOnly, null, false, null);
         return(folderHierarchy);
     });
 }
Esempio n. 2
0
 public override FolderMap GetSourceFolderMap(GetFolderMapFlags flags)
 {
     base.SourceMailboxWrapper.LoadFolderMap(flags, delegate
     {
         FolderHierarchy folderHierarchy = new FolderHierarchy(FolderHierarchyFlags.None, base.SourceMailboxWrapper);
         folderHierarchy.LoadHierarchy(EnumerateFolderHierarchyFlags.None, null, false, this.GetAdditionalFolderPtags());
         return(folderHierarchy);
     });
     return(base.SourceMailboxWrapper.FolderMap);
 }
		public override FolderRecWrapper GetTargetFolderBySourceId(byte[] sourceId)
		{
			FolderMap sourceFolderMap = base.SourceFolderMap;
			FolderMapping folderMapping = base.SourceFolderMap[sourceId] as FolderMapping;
			if (folderMapping != null && folderMapping.IsSystemPublicFolder)
			{
				FolderHierarchy folderHierarchy = base.TargetFolderMap as FolderHierarchy;
				return folderHierarchy.GetWellKnownFolder(folderMapping.WKFType);
			}
			return base.TargetFolderMap[this.destinationMailbox.GetSessionSpecificEntryId(sourceId)];
		}
Esempio n. 4
0
 public override FolderMap GetDestinationFolderMap(GetFolderMapFlags flags)
 {
     base.DestMailboxWrapper.LoadFolderMap(flags, delegate
     {
         FolderHierarchy folderHierarchy = new FolderHierarchy(FolderHierarchyFlags.PublicFolderMailbox, base.DestMailboxWrapper);
         folderHierarchy.LoadHierarchy(EnumerateFolderHierarchyFlags.None, null, false, new PropTag[]
         {
             PropTag.ReplicaList,
             PropTag.LTID,
             PropTag.TimeInServer
         });
         return(folderHierarchy);
     });
     return(base.DestMailboxWrapper.FolderMap);
 }
Esempio n. 5
0
        private static byte[] GetImapSyncPropertiesHash(MessageRec message, FolderHierarchy hierarchy)
        {
            string text  = message[hierarchy.SourceSyncMessageIdPtag] as string;
            string text2 = message[hierarchy.SourceSyncAccountNamePtag] as string;

            byte[] array = message[hierarchy.SourceSyncFolderIdPtag] as byte[];
            if (text != null && text2 != null && array != null)
            {
                byte[] sha1Hash = CommonUtils.GetSHA1Hash(text2.ToLowerInvariant() + text.ToLowerInvariant());
                byte[] array2   = new byte[array.Length + sha1Hash.Length];
                Array.Copy(array, 0, array2, 0, array.Length);
                Array.Copy(sha1Hash, 0, array2, array.Length, sha1Hash.Length);
                return(array2);
            }
            return(null);
        }
Esempio n. 6
0
        private byte[] CreateAssociatedDumpsterFolder(string sourceFolderName, byte[] replicaListValue, byte[] destinationFolderEntryId)
        {
            FolderHierarchy folderHierarchy = base.DestMailboxWrapper.FolderMap as FolderHierarchy;
            FolderRec       folderRec       = new FolderRec();

            folderRec.ParentId   = folderHierarchy.GetWellKnownFolder(WellKnownFolderType.PublicFolderDumpsterRoot).EntryId;
            folderRec.FolderName = PublicFolderCOWSession.GenerateUniqueFolderName(sourceFolderName);
            folderRec.FolderType = FolderType.Generic;
            byte[] array;
            base.DestMailbox.CreateFolder(folderRec, CreateFolderFlags.FailIfExists, out array);
            using (IDestinationFolder folder = base.DestMailbox.GetFolder(array))
            {
                folder.SetProps(new PropValueData[]
                {
                    new PropValueData(PropTag.ReplicaList, replicaListValue),
                    new PropValueData(PropTag.IpmWasteBasketEntryId, destinationFolderEntryId),
                    new PropValueData(PropTag.TimeInServer, 64)
                });
            }
            return(array);
        }
Esempio n. 7
0
        private void CreateDumpsterFoldersForWellKnownFolders()
        {
            FolderHierarchy folderHierarchy = base.DestMailboxWrapper.FolderMap as FolderHierarchy;

            foreach (FolderMapping folderMapping in new List <FolderMapping>(8)
            {
                folderHierarchy.GetWellKnownFolder(WellKnownFolderType.Root),
                folderHierarchy.GetWellKnownFolder(WellKnownFolderType.IpmSubtree),
                folderHierarchy.GetWellKnownFolder(WellKnownFolderType.NonIpmSubtree),
                folderHierarchy.GetWellKnownFolder(WellKnownFolderType.EFormsRegistry),
                folderHierarchy.GetWellKnownFolder(WellKnownFolderType.PublicFolderDumpsterRoot),
                folderHierarchy.GetWellKnownFolder(WellKnownFolderType.PublicFolderTombstonesRoot),
                folderHierarchy.GetWellKnownFolder(WellKnownFolderType.PublicFolderAsyncDeleteState),
                folderHierarchy.GetWellKnownFolder(WellKnownFolderType.PublicFolderInternalSubmission)
            })
            {
                List <PropValueData> list = new List <PropValueData>(2);
                using (IDestinationFolder folder = base.DestMailbox.GetFolder(folderMapping.EntryId))
                {
                    if (folder == null)
                    {
                        MrsTracer.Service.Error("Something deleted destination folder from under us", new object[0]);
                        throw new UnexpectedErrorPermanentException(-2147221238);
                    }
                    if (!this.AssociatedDumpsterExists(folder))
                    {
                        byte[] value = this.CreateAssociatedDumpsterFolder(folderMapping.FolderName, ReplicaListProperty.GetBytesFromStringArray(new string[]
                        {
                            base.TargetMailboxGuid.ToString()
                        }), folderMapping.EntryId);
                        list.Add(new PropValueData(PropTag.IpmWasteBasketEntryId, value));
                        folder.SetProps(list.ToArray());
                    }
                }
            }
        }
Esempio n. 8
0
        public void ComputeFolderMapping(FolderHierarchy targetHierarchy, bool createMissingFolderRecs)
        {
            if (!this.folderFilterApplied)
            {
                this.SetFolderFilter(null, false, null, string.Empty, false, Guid.Empty);
            }
            EntryIdMap <FolderMapping> targetBySourceEntryID = new EntryIdMap <FolderMapping>();

            targetHierarchy.EnumerateSubtree(EnumHierarchyFlags.AllFolders, targetHierarchy.RootFolder, delegate(FolderRecWrapper fRec, FolderMap.EnumFolderContext ctx)
            {
                FolderMapping folderMapping = (FolderMapping)fRec;
                byte[] array = folderMapping.FolderRec[targetHierarchy.SourceEntryIDPtag] as byte[];
                if (array != null && !targetBySourceEntryID.ContainsKey(array))
                {
                    targetBySourceEntryID.Add(array, folderMapping);
                }
            });
            base.EnumerateFolderHierarchy(EnumHierarchyFlags.AllFolders, delegate(FolderRecWrapper fRec, FolderMap.EnumFolderContext ctx)
            {
                FolderMapping folderMapping = (FolderMapping)fRec;
                FolderMapping wellKnownFolder;
                if (folderMapping.WKFType != WellKnownFolderType.None)
                {
                    wellKnownFolder = targetHierarchy.GetWellKnownFolder(folderMapping.WKFType);
                    if (wellKnownFolder != null)
                    {
                        folderMapping.TargetFolder   = wellKnownFolder;
                        wellKnownFolder.SourceFolder = folderMapping;
                        this.MapPublicFolderDumpster(folderMapping, wellKnownFolder);
                        return;
                    }
                }
                if (targetBySourceEntryID.TryGetValue(folderMapping.EntryId, out wellKnownFolder))
                {
                    folderMapping.TargetFolder   = wellKnownFolder;
                    wellKnownFolder.SourceFolder = folderMapping;
                    this.MapPublicFolderDumpster(folderMapping, wellKnownFolder);
                }
            });
            base.EnumerateFolderHierarchy(EnumHierarchyFlags.AllFolders, delegate(FolderRecWrapper fRec, FolderMap.EnumFolderContext ctx)
            {
                FolderMapping folderMapping = (FolderMapping)fRec;
                if (folderMapping.TargetFolder != null)
                {
                    this.MapSubtreeByName(folderMapping, createMissingFolderRecs);
                    ctx.Result = EnumHierarchyResult.SkipSubtree;
                }
            });
            FolderMapping ipmSubtree = this.GetWellKnownFolder(WellKnownFolderType.IpmSubtree);

            if (ipmSubtree != null)
            {
                base.EnumerateFolderHierarchy(EnumHierarchyFlags.AllFolders, delegate(FolderRecWrapper fRec, FolderMap.EnumFolderContext ctx)
                {
                    FolderMapping folderMapping = (FolderMapping)fRec;
                    if (folderMapping.IsIncluded && folderMapping.TargetFolder == null)
                    {
                        this.MapFolderByName(folderMapping, ipmSubtree.TargetFolder, createMissingFolderRecs);
                        if (folderMapping.TargetFolder != null)
                        {
                            this.MapSubtreeByName(folderMapping, createMissingFolderRecs);
                        }
                        ctx.Result = EnumHierarchyResult.SkipSubtree;
                    }
                });
            }
        }
Esempio n. 9
0
 public FolderIdTranslator(FolderHierarchy sourceHierarchy, FolderHierarchy targetHierarchy)
 {
     this.sourceHierarchy = sourceHierarchy;
     this.targetHierarchy = targetHierarchy;
 }
Esempio n. 10
0
        public override void CreateFolder(FolderMap.EnumFolderContext context, FolderRecWrapper sourceFolderRecWrapper, CreateFolderFlags createFolderFlags, out byte[] newFolderEntryId)
        {
            if (sourceFolderRecWrapper.IsInternalAccess)
            {
                throw new InternalAccessFolderCreationIsNotSupportedException();
            }
            newFolderEntryId = null;
            FolderMapping   folderMapping   = sourceFolderRecWrapper as FolderMapping;
            FolderHierarchy folderHierarchy = base.DestMailboxWrapper.FolderMap as FolderHierarchy;

            byte[]        sessionSpecificEntryId = base.DestMailbox.GetSessionSpecificEntryId(folderMapping.EntryId);
            FolderMapping folderMapping2         = folderMapping.Parent as FolderMapping;
            bool          isRoot = base.IsRoot;

            byte[] parentId;
            switch (folderMapping2.WKFType)
            {
            case WellKnownFolderType.Root:
            case WellKnownFolderType.NonIpmSubtree:
            case WellKnownFolderType.IpmSubtree:
            case WellKnownFolderType.EFormsRegistry:
                parentId = folderHierarchy.GetWellKnownFolder(folderMapping2.WKFType).EntryId;
                break;

            default:
                if (isRoot || this.ShouldCreateUnderParentInSecondary())
                {
                    parentId = base.DestMailbox.GetSessionSpecificEntryId(folderMapping.ParentId);
                }
                else
                {
                    parentId = folderHierarchy.GetWellKnownFolder(WellKnownFolderType.IpmSubtree).EntryId;
                }
                break;
            }
            byte[] entryId   = folderMapping.FolderRec.EntryId;
            byte[] parentId2 = folderMapping.FolderRec.ParentId;
            folderMapping.FolderRec.EntryId  = sessionSpecificEntryId;
            folderMapping.FolderRec.ParentId = parentId;
            base.DestMailbox.CreateFolder(folderMapping.FolderRec, createFolderFlags, out newFolderEntryId);
            folderMapping.FolderRec.EntryId  = entryId;
            folderMapping.FolderRec.ParentId = parentId2;
            List <PropValueData> list           = new List <PropValueData>(2);
            Guid contentMailboxGuid             = this.GetContentMailboxGuid(sourceFolderRecWrapper);
            StorePropertyDefinition replicaList = CoreFolderSchema.ReplicaList;

            byte[] bytesFromStringArray = ReplicaListProperty.GetBytesFromStringArray(new string[]
            {
                contentMailboxGuid.ToString()
            });
            list.Add(new PropValueData(PropTag.ReplicaList, bytesFromStringArray));
            using (IDestinationFolder folder = base.DestMailbox.GetFolder(sessionSpecificEntryId))
            {
                if (folder == null)
                {
                    MrsTracer.Service.Error("Something deleted destination folder from under us", new object[0]);
                    throw new UnexpectedErrorPermanentException(-2147221238);
                }
                if (isRoot && !this.AssociatedDumpsterExists(folder))
                {
                    byte[] value = this.CreateAssociatedDumpsterFolder(folderMapping.FolderName, bytesFromStringArray, sessionSpecificEntryId);
                    list.Add(new PropValueData(PropTag.IpmWasteBasketEntryId, value));
                }
                folder.SetProps(list.ToArray());
            }
        }
 protected FolderContentsMapper(FolderMapping folderMapping, ISourceFolder srcFolder, FolderHierarchy sourceHierarchy, IDestinationFolder destFolder, FolderHierarchy destHierarchy, ConflictResolutionOption conflictResolutionOption, FAICopyOption faiCopyOption, FolderContentsMapperFlags mapperFlags)
 {
     this.folderMapping            = folderMapping;
     this.srcFolder                = srcFolder;
     this.destFolder               = destFolder;
     this.destHierarchy            = destHierarchy;
     this.sourceHierarchy          = sourceHierarchy;
     this.conflictResolutionOption = conflictResolutionOption;
     this.faiCopyOption            = faiCopyOption;
     this.sourceMapping            = new EntryIdMap <MessageRec>();
     this.targetMapping            = new EntryIdMap <MessageRec>();
     this.mapperFlags              = mapperFlags;
 }
 public static FolderContentsMapper Create(FolderMapping folderMapping, ISourceFolder srcFolder, FolderHierarchy sourceHierarchy, IDestinationFolder destFolder, FolderHierarchy destHierarchy, ConflictResolutionOption conflictResolutionOption, FAICopyOption faiCopyOption, FolderContentsMapperFlags mapperFlags)
 {
     if (!mapperFlags.HasFlag(FolderContentsMapperFlags.ImapSync))
     {
         return(new FolderContentsMapper(folderMapping, srcFolder, sourceHierarchy, destFolder, destHierarchy, conflictResolutionOption, faiCopyOption, mapperFlags));
     }
     return(new ImapFolderContentsMapper(folderMapping, srcFolder, sourceHierarchy, destFolder, destHierarchy, conflictResolutionOption, faiCopyOption, mapperFlags));
 }
Esempio n. 13
0
 public ImapFolderContentsMapper(FolderMapping folderMapping, ISourceFolder srcFolder, FolderHierarchy sourceHierarchy, IDestinationFolder destFolder, FolderHierarchy destHierarchy, ConflictResolutionOption conflictResolutionOption, FAICopyOption faiCopyOption, FolderContentsMapperFlags mapperFlags) : base(folderMapping, srcFolder, sourceHierarchy, destFolder, destHierarchy, conflictResolutionOption, faiCopyOption, mapperFlags)
 {
 }
Esempio n. 14
0
        private static byte[] GetCloudIdHash(MessageRec message, MessageRecType messageRecType, FolderHierarchy hierarchy)
        {
            if (message[hierarchy.SharingInstanceGuidPtag] == null || Guid.Empty.Equals((Guid)message[hierarchy.SharingInstanceGuidPtag]))
            {
                return(null);
            }
            string text = message[hierarchy.CloudIdPtag] as string;

            if (!string.IsNullOrEmpty(text))
            {
                string[] array = text.Split(new char[]
                {
                    ' '
                });
                if (array.Length == 2)
                {
                    return(CommonUtils.GetSHA1Hash(array[1].ToLowerInvariant()));
                }
            }
            return(null);
        }
Esempio n. 15
0
        private static byte[] GetSyncMessageIdHash(MessageRec message, MessageRecType messageRecType, FolderHierarchy hierarchy)
        {
            string text = message[hierarchy.SourceSyncMessageIdPtag] as string;

            if (!string.IsNullOrEmpty(text))
            {
                return(CommonUtils.GetSHA1Hash(text.ToLowerInvariant()));
            }
            return(null);
        }