public void Update(IB regionOffset, Func <TType, TType> processRegion) { var originalPosition = stream.Position; try { stream.Position = regionOffset; var rawRegion = new byte[typeSize]; stream.Read(rawRegion, 0, typeSize); var type = typeDecoder.Decode(BinaryData.OfValue(rawRegion)); var updatedType = processRegion(type); stream.Position = regionOffset; var encodedType = typeEncoder.Encode(updatedType); stream.Write(encodedType.Value, 0, encodedType.Value.Length); } finally { stream.Position = originalPosition; } }
private BinaryData Process(BinaryData blockData, BID blockId) { var stream = new MemoryStream(); var dwKey = (int)(blockId.Value & 0x0000FFFF); var w = (short)(dwKey ^ (dwKey >> 16)); for (var i = 0; i < blockData.Length; i++) { var b = (byte)(blockData.Value[i] + (byte)w); b = Constants.mpbbCrypt[b]; b = (byte)(b + (byte)(w >> 8)); b = Constants.mpbbCrypt[b + 256]; b = (byte)(b - (byte)(w >> 8)); b = Constants.mpbbCrypt[b + 512]; b = (byte)(b - (byte)w); stream.WriteByte(b); w++; } return(BinaryData.OfValue(stream.ToArray())); }
public IB Reserve(AllocationInfo allocationInfo) { amapRegionUpdater.Update( allocationInfo.MapOffset, map => { var bits = map.Data.Value.ToBits(); for (var i = allocationInfo.BitStartIndex; i <= allocationInfo.BitEndIndex; i++) { bits[i] = 1; } var bytes = bits.ToBytes(); return (new AMap( BinaryData.OfValue(bytes), new PageTrailer( Constants.ptypeAMap, Constants.ptypeAMap, 0x0000, Crc32.ComputeCrc32(bytes), BID.OfValue(allocationInfo.MapOffset)))); }); var allocateSize = (allocationInfo.BitEndIndex - allocationInfo.BitStartIndex + 1) * 64; headerUsageProvider.Use(header => header.SetRoot(header.Root.SetFreeSpaceInAllAMaps(header.Root.AMapFree - allocateSize))); return(IB.OfValue(allocationInfo.MapOffset + allocationInfo.BitStartIndex * 64)); }
public BinaryData Read(long offset, int count) { var buffer = new byte[count]; stream.Seek(offset, SeekOrigin.Begin); stream.Read(buffer, 0, count); return(BinaryData.OfValue(buffer)); }
private BinaryData Process(BinaryData data, bool encrypt) { var decodedData = new byte[data.Length]; var baseIndex = encrypt ? 0 : 512; for (var i = 0; i < data.Length; i++) { decodedData[i] = Constants.mpbbCrypt[baseIndex + data.Value[i]]; } return(BinaryData.OfValue(decodedData)); }
private BinaryData GetFillLevels( ExternalDataBlockForHeapOnNode[] blocks, int startIndex, int endIndex) { var stream = new MemoryStream(); for (var i = startIndex; i < endIndex; i += 2) { var value = blocks[i].FillLevel & blocks[i + 1].FillLevel << 4; stream.WriteByte((byte)value); } return(BinaryData.OfValue(stream.ToArray())); }
public BinaryData Encode(string value) { var header = headerReader.GetHeader(); if (header.Version == 14 || header.Version == 15) { return(BinaryData.OfValue(Encoding.Unicode.GetBytes(value))); } if (header.Version == 23) { return(BinaryData.OfValue(Encoding.ASCII.GetBytes(value))); } throw new Exception($"Unsupported PST file encoding {header.Version}"); }
private AMap CreateAMap(long mapOffset, params byte[] defaultAllocations) { var data = new byte[496]; for (var i = 0; i < defaultAllocations.Length; i++) { data[i] = defaultAllocations[i]; } return (new AMap( BinaryData.OfValue(data), new PageTrailer( Constants.ptypeAMap, Constants.ptypeAMap, 0x0000, (int)Crc32.ComputeCrc32(data), BID.OfValue(mapOffset)))); }
public Folder NewFolder(string displayName) { var childFolderNodePath = objectPath.Add(nodeIdAllocator.Allocate(Constants.NID_TYPE_NORMAL_FOLDER)); objectTracker.TrackObject( childFolderNodePath, ObjectTypes.Folder, ObjectStates.New); objectTracker.SetProperty( childFolderNodePath, MAPIProperties.PidTagDisplayName, new PropertyValue(stringEncoder.Encode(displayName))); objectTracker.SetProperty( childFolderNodePath, MAPIProperties.PidTagContentCount, new PropertyValue(BinaryData.OfValue(0))); objectTracker.SetProperty( childFolderNodePath, MAPIProperties.PidTagContentUnreadCount, new PropertyValue(BinaryData.OfValue(0))); objectTracker.SetProperty( childFolderNodePath, MAPIProperties.PidTagSubfolders, new PropertyValue(BinaryData.OfValue(false))); return (new Folder( childFolderNodePath, objectTracker, recipientTracker, stringEncoder, propertyNameToIdMap, propertyContextBasedPropertyReader, nodeEntryFinder, rowIndexReader, tableContextBasedPropertyReader, nodeIdAllocator)); }
public BinaryData Encode(IB value) { return(BinaryData.OfValue(BitConverter.GetBytes(value.Value))); }