private void write(byte[] srcData, int index, int size) { if (DataBlockPosition + size <= DataBlock.SizeOccupied) { //** overwrite data in Stream Position.. Array.Copy(srcData, index, DataBlock.Data, DataBlockPosition, size); DataBlockPosition += size; } else if (DataBlock.SizeAvailable > 0) { int BytesToCopy = size; if (BytesToCopy <= DataBlock.SizeAvailable) { Array.Copy(srcData, index, DataBlock.Data, DataBlockPosition, BytesToCopy); DataBlockPosition += BytesToCopy; DataBlock.SizeOccupied += BytesToCopy; } else { // Write Data spanning multiple blocks int BytesToWrite = DataBlock.SizeAvailable; Array.Copy(srcData, index, DataBlock.Data, DataBlockPosition, BytesToWrite); DataBlockPosition = DataBlock.Data.Length; DataBlock.SizeOccupied = DataBlock.Data.Length; write(srcData, index + BytesToWrite, BytesToCopy - BytesToWrite); } } else { _dataBlock = DataBlock.Extend(); DataBlockPosition = 0; _logicalPosition += OutStream.Position; OutStream.SetLength(0); OutStream.Seek(0, SeekOrigin.Begin); do { if (_dataBlock.Data.Length < size) { Array.Copy(srcData, index, _dataBlock.Data, 0, _dataBlock.Data.Length); index += _dataBlock.Data.Length; _dataBlock.SizeOccupied = _dataBlock.Data.Length; size -= _dataBlock.Data.Length; _dataBlock.Extend(); _dataBlock = _dataBlock.Next; } else { Array.Copy(srcData, index, _dataBlock.Data, 0, size); _dataBlock.SizeOccupied = size; DataBlockPosition = size; break; } } while (size > 0); } }