static int ReceiveFromBuffer(ByteBuffer byteBuffer, byte[] buffer, int offset, int count) { int len = byteBuffer.Length; if (len <= count) { Buffer.BlockCopy(byteBuffer.Buffer, byteBuffer.Offset, buffer, offset, len); byteBuffer.Reset(); return(len); } else { Buffer.BlockCopy(byteBuffer.Buffer, byteBuffer.Offset, buffer, offset, count); byteBuffer.Complete(count); return(count); } }
internal int SendCommand(ushort channel, Transfer transfer, bool first, ByteBuffer payload, int reservedBytes) { this.ThrowIfClosed("Send"); ByteBuffer buffer = this.AllocateBuffer(Frame.CmdBufferSize); Frame.Encode(buffer, FrameType.Amqp, channel, transfer); int payloadSize = payload.Length; int frameSize = buffer.Length + payloadSize; bool more = frameSize > this.remoteMaxFrameSize; if (more) { transfer.More = true; buffer.Reset(); Frame.Encode(buffer, FrameType.Amqp, channel, transfer); frameSize = (int)this.remoteMaxFrameSize; payloadSize = frameSize - buffer.Length; } AmqpBitConverter.WriteInt(buffer.Buffer, buffer.Offset, frameSize); ByteBuffer frameBuffer; if (first && !more && reservedBytes >= buffer.Length) { // optimize for most common case: single-transfer message frameBuffer = this.WrapBuffer(payload, payload.Offset - buffer.Length, frameSize); Array.Copy(buffer.Buffer, buffer.Offset, frameBuffer.Buffer, frameBuffer.Offset, buffer.Length); buffer.ReleaseReference(); } else { AmqpBitConverter.WriteBytes(buffer, payload.Buffer, payload.Offset, payloadSize); frameBuffer = buffer; } payload.Complete(payloadSize); this.writer.Send(frameBuffer); if (Trace.TraceLevel >= TraceLevel.Frame) { Trace.WriteLine(TraceLevel.Frame, "SEND (ch={0}) {1} payload {2}", channel, transfer, payloadSize); } return(payloadSize); }
static int ReceiveFromBuffer(ByteBuffer byteBuffer, byte[] buffer, int offset, int count) { int len = byteBuffer.Length; if (len <= count) { Buffer.BlockCopy(byteBuffer.Buffer, byteBuffer.Offset, buffer, offset, len); byteBuffer.Reset(); return len; } else { Buffer.BlockCopy(byteBuffer.Buffer, byteBuffer.Offset, buffer, offset, count); byteBuffer.Complete(count); return count; } }