// Token: 0x0600036A RID: 874 RVA: 0x00012454 File Offset: 0x00010654 public void InsertBytes(long index, byte[] bs) { try { long num; DataBlock dataBlock = this.GetDataBlock(index, out num); MemoryDataBlock memoryDataBlock = dataBlock as MemoryDataBlock; if (memoryDataBlock != null) { memoryDataBlock.InsertBytes(index - num, bs); } else { FileDataBlock fileDataBlock = (FileDataBlock)dataBlock; if (num == index && dataBlock.PreviousBlock != null) { MemoryDataBlock memoryDataBlock2 = dataBlock.PreviousBlock as MemoryDataBlock; if (memoryDataBlock2 != null) { memoryDataBlock2.InsertBytes(memoryDataBlock2.Length, bs); return; } } FileDataBlock fileDataBlock2 = null; if (index > num) { fileDataBlock2 = new FileDataBlock(fileDataBlock.FileOffset, index - num); } FileDataBlock fileDataBlock3 = null; if (index < num + fileDataBlock.Length) { fileDataBlock3 = new FileDataBlock(fileDataBlock.FileOffset + index - num, fileDataBlock.Length - (index - num)); } dataBlock = this._dataMap.Replace(dataBlock, new MemoryDataBlock(bs)); if (fileDataBlock2 != null) { this._dataMap.AddBefore(dataBlock, fileDataBlock2); } if (fileDataBlock3 != null) { this._dataMap.AddAfter(dataBlock, fileDataBlock3); } } } finally { this._totalLength += (long)bs.Length; this.OnLengthChanged(EventArgs.Empty); this.OnChanged(EventArgs.Empty); } }
/// <summary> /// See <see cref="IByteProvider.InsertBytes" /> for more information. /// </summary> public void InsertBytes(long index, byte[] bs) { try { // Find the block affected. long blockOffset; DataBlock block = GetDataBlock(index, out blockOffset); // If the insertion point is in a memory block, just insert it. MemoryDataBlock memoryBlock = block as MemoryDataBlock; if (memoryBlock != null) { memoryBlock.InsertBytes(index - blockOffset, bs); return; } FileDataBlock fileBlock = (FileDataBlock)block; // If the insertion point is at the start of a file block, and the previous block is a memory block, append it to that block. if (blockOffset == index && block.PreviousBlock != null) { MemoryDataBlock previousMemoryBlock = block.PreviousBlock as MemoryDataBlock; if (previousMemoryBlock != null) { previousMemoryBlock.InsertBytes(previousMemoryBlock.Length, bs); return; } } // Split the block into a prefix and a suffix and place a memory block in-between. FileDataBlock prefixBlock = null; if (index > blockOffset) { prefixBlock = new FileDataBlock(fileBlock.FileOffset, index - blockOffset); } FileDataBlock suffixBlock = null; if (index < blockOffset + fileBlock.Length) { suffixBlock = new FileDataBlock( fileBlock.FileOffset + index - blockOffset, fileBlock.Length - (index - blockOffset)); } block = _dataMap.Replace(block, new MemoryDataBlock(bs)); if (prefixBlock != null) { _dataMap.AddBefore(block, prefixBlock); } if (suffixBlock != null) { _dataMap.AddAfter(block, suffixBlock); } } finally { _totalLength += bs.Length; OnLengthChanged(EventArgs.Empty); OnChanged(EventArgs.Empty); } }