/// <summary> /// http://social.msdn.microsoft.com/Forums/en-US/os_binaryfile/thread/a5f9c653-40f5-4638-85d3-00c54607d984/ /// Outlook 2003 MUST have a valid rgbFillLevel for write operations /// </summary> private void UpdateFillLevelMap() { int blocksToProcess = Math.Min(m_dataTree.DataBlockCount, 8); HeapOnNodeHeader header = this.HeapHeader; for (int blockIndex = 0; blockIndex < blocksToProcess; blockIndex++) { if (m_blocksToUpdate.Contains(blockIndex)) { HeapOnNodeBlockData blockData = GetBlockData(blockIndex); byte fillLevel = HeapOnNodeHelper.GetBlockFillLevel(blockData); header.rgbFillLevel[blockIndex] = fillLevel; } } UpdateHeapHeader(header); for (int blockIndex = 8; blockIndex < m_dataTree.DataBlockCount; blockIndex += 128) { int blocksLeft = m_dataTree.DataBlockCount - blockIndex; blocksToProcess = Math.Min(blocksLeft, 128); HeapOnNodeBitmapHeader bitmapHeader = GetBitmapHeader(blockIndex); for (int blockOffset = 0; blockOffset < blocksToProcess; blockOffset++) { if (m_blocksToUpdate.Contains(blockIndex + blockOffset)) { HeapOnNodeBlockData blockData = GetBlockData(blockIndex + blockOffset); byte fillLevel = HeapOnNodeHelper.GetBlockFillLevel(blockData); bitmapHeader.rgbFillLevel[blockOffset] = fillLevel; } } UpdateBitmapHeader(blockIndex, bitmapHeader); blocksLeft -= blocksToProcess; } }
public void WriteBytes(byte[] buffer, int offset) { LittleEndianWriter.WriteUInt16(buffer, offset + 0, ibHnpm); ByteWriter.WriteByte(buffer, offset + 2, bSig); ByteWriter.WriteByte(buffer, offset + 3, (byte)bClientSig); LittleEndianWriter.WriteUInt32(buffer, offset + 4, hidUserRoot.Value); HeapOnNodeHelper.WriteFillLevelMap(buffer, offset + 8, rgbFillLevel); }
public HeapOnNodeHeader(byte[] buffer, int offset) { ibHnpm = LittleEndianConverter.ToUInt16(buffer, offset + 0); bSig = ByteReader.ReadByte(buffer, offset + 2); bClientSig = (OnHeapTypeName)ByteReader.ReadByte(buffer, offset + 3); hidUserRoot = new HeapID(buffer, offset + 4); rgbFillLevel = HeapOnNodeHelper.ReadFillLevelMap(buffer, offset + 8, 8); }
public void WriteBytes(byte[] buffer, int offset) { LittleEndianWriter.WriteUInt16(buffer, offset + 0, ibHnpm); HeapOnNodeHelper.WriteFillLevelMap(buffer, offset + 2, rgbFillLevel); }
public HeapOnNodeBitmapHeader(byte[] buffer, int offset) { ibHnpm = LittleEndianConverter.ToUInt16(buffer, offset + 0); rgbFillLevel = HeapOnNodeHelper.ReadFillLevelMap(buffer, offset + 2, 128); }