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)]; }
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); }
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()); } } } }
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; } }); } }
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()); } }