// 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);
     }
 }
Пример #2
0
        /// <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);
            }
        }