public void Validate(bool write, int dataSize)
{
bool valid = false;
if (write)
{
if (this.Size < dataSize && this.autoGrow)
{
if (this.references != 1)
{
throw new InvalidOperationException("Cannot grow the current buffer because it has more than one references");
}
int newSize = Math.Max(this.Capacity * 2, this.Capacity + dataSize);
ManagedBuffer newBuffer;
if (this.bufferManager != null)
{
newBuffer = ByteBuffer.AllocateBuffer(newSize, this.bufferManager);
}
else
{
newBuffer = new ManagedBuffer(new byte[newSize], null);
}
System.Buffer.BlockCopy(this.buffer, this.start, newBuffer.Buffer, 0, this.Capacity);
int consumed = this.read - this.start;
int written = this.write - this.start;
this.start = 0;
this.read = consumed;
this.write = written;
this.end = newSize;
if (this.bufferManager != null)
{
this.bufferManager.ReturnBuffer(this.buffer);
}
this.buffer = newBuffer.Buffer;
this.bufferManager = newBuffer.BufferManager;
}
valid = this.Size >= dataSize;
}
else
{
valid = this.Length >= dataSize;
}
if (!valid)
{
throw new AmqpException(AmqpErrorCode.DecodeError, AmqpResources.GetString(AmqpResources.AmqpInsufficientBufferSize, dataSize, write ? this.Size : this.Length));
}
}