protected override List <BuilderExtent> FixExtents(out long totalLength) { const int FooterSize = 512; const int DynHeaderSize = 1024; List <BuilderExtent> extents = new List <BuilderExtent>(); _footer.DataOffset = FooterSize; DynamicHeader dynHeader = new DynamicHeader(-1, FooterSize + DynHeaderSize, _blockSize, _footer.CurrentSize); BlockAllocationTableExtent batExtent = new BlockAllocationTableExtent(FooterSize + DynHeaderSize, dynHeader.MaxTableEntries); long streamPos = batExtent.Start + batExtent.Length; foreach (Range <long, long> blockRange in StreamExtent.Blocks(_content.Extents, _blockSize)) { for (int i = 0; i < blockRange.Count; ++i) { long block = blockRange.Offset + i; long blockStart = block * _blockSize; DataBlockExtent dataExtent = new DataBlockExtent(streamPos, new SubStream(_content, blockStart, Math.Min(_blockSize, _content.Length - blockStart))); extents.Add(dataExtent); batExtent.SetEntry((int)block, (uint)(streamPos / Sizes.Sector)); streamPos += dataExtent.Length; } } _footer.UpdateChecksum(); dynHeader.UpdateChecksum(); byte[] footerBuffer = new byte[FooterSize]; _footer.ToBytes(footerBuffer, 0); byte[] dynHeaderBuffer = new byte[DynHeaderSize]; dynHeader.ToBytes(dynHeaderBuffer, 0); // Add footer (to end) extents.Add(new BuilderBufferExtent(streamPos, footerBuffer)); totalLength = streamPos + FooterSize; extents.Insert(0, batExtent); extents.Insert(0, new BuilderBufferExtent(FooterSize, dynHeaderBuffer)); extents.Insert(0, new BuilderBufferExtent(0, footerBuffer)); return(extents); }
internal override List<BuilderExtent> FixExtents(out long totalLength) { const int FooterSize = 512; const int DynHeaderSize = 1024; List<BuilderExtent> extents = new List<BuilderExtent>(); _footer.DataOffset = FooterSize; DynamicHeader dynHeader = new DynamicHeader(-1, FooterSize + DynHeaderSize, _blockSize, _footer.CurrentSize); BlockAllocationTableExtent batExtent = new BlockAllocationTableExtent(FooterSize + DynHeaderSize, dynHeader.MaxTableEntries); long streamPos = batExtent.Start + batExtent.Length; foreach (var blockRange in StreamExtent.Blocks(_content.Extents, _blockSize)) { for (int i = 0; i < blockRange.Count; ++i) { long block = blockRange.Offset + i; long blockStart = block * _blockSize; DataBlockExtent dataExtent = new DataBlockExtent(streamPos, new SubStream(_content, blockStart, Math.Min(_blockSize, _content.Length - blockStart))); extents.Add(dataExtent); batExtent.SetEntry((int)block, (uint)(streamPos / Sizes.Sector)); streamPos += dataExtent.Length; } } _footer.UpdateChecksum(); dynHeader.UpdateChecksum(); byte[] footerBuffer = new byte[FooterSize]; _footer.ToBytes(footerBuffer, 0); byte[] dynHeaderBuffer = new byte[DynHeaderSize]; dynHeader.ToBytes(dynHeaderBuffer, 0); // Add footer (to end) extents.Add(new BuilderBufferExtent(streamPos, footerBuffer)); totalLength = streamPos + FooterSize; extents.Insert(0, batExtent); extents.Insert(0, new BuilderBufferExtent(FooterSize, dynHeaderBuffer)); extents.Insert(0, new BuilderBufferExtent(0, footerBuffer)); return extents; }