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)];
		}
Ejemplo n.º 2
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);
        }
Ejemplo n.º 3
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());
                    }
                }
            }
        }
Ejemplo n.º 4
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;
                    }
                });
            }
        }
Ejemplo n.º 5
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());
            }
        }