/// <summary> /// Reads a signed byte and advance the buffer read cursor. /// </summary> /// <param name="buffer">The buffer to read from.</param> /// <returns></returns> public static sbyte ReadByte(ByteBuffer buffer) { buffer.Validate(false, FixedWidth.UByte); sbyte data = (sbyte)buffer.Buffer[buffer.Offset]; buffer.Complete(FixedWidth.UByte); return data; }
public static Guid ReadUuid(ByteBuffer buffer) { buffer.Validate(false, FixedWidth.Uuid); byte[] d = new byte[FixedWidth.Uuid]; if (AmqpBitConverter.IsLittleEndian) { int pos = buffer.Offset; d[3] = buffer.Buffer[pos++]; d[2] = buffer.Buffer[pos++]; d[1] = buffer.Buffer[pos++]; d[0] = buffer.Buffer[pos++]; d[5] = buffer.Buffer[pos++]; d[4] = buffer.Buffer[pos++]; d[7] = buffer.Buffer[pos++]; d[6] = buffer.Buffer[pos++]; Array.Copy(buffer.Buffer, pos, d, 8, 8); } else { Array.Copy(buffer.Buffer, buffer.Offset, d, 0, FixedWidth.Uuid); } buffer.Complete(FixedWidth.Uuid); return(new Guid(d)); }
public static short ReadShort(ByteBuffer buffer) { buffer.Validate(false, FixedWidth.Short); short data = (short)((buffer.Buffer[buffer.Offset] << 8) | buffer.Buffer[buffer.Offset + 1]); buffer.Complete(FixedWidth.Short); return(data); }
public static int ReadInt(ByteBuffer buffer) { buffer.Validate(false, FixedWidth.Int); int data = ReadInt(buffer.Buffer, buffer.Offset); buffer.Complete(FixedWidth.Int); return(data); }
public static sbyte ReadByte(ByteBuffer buffer) { buffer.Validate(false, FixedWidth.UByte); sbyte data = (sbyte)buffer.Buffer[buffer.Offset]; buffer.Complete(FixedWidth.UByte); return(data); }
public static long ReadLong(ByteBuffer buffer) { buffer.Validate(false, FixedWidth.Long); long high = ReadInt(buffer.Buffer, buffer.Offset); long low = (uint)ReadInt(buffer.Buffer, buffer.Offset + 4); long data = (high << 32) | low; buffer.Complete(FixedWidth.Long); return(data); }
int WriteTransferFrame(uint handle, uint deliveryId, bool settled, ByteBuffer buffer, int maxFrameSize) { // payload should have bytes reserved for frame header and transfer int frameSize = Math.Min(buffer.Length + TransferFramePrefixSize, maxFrameSize); int payloadSize = frameSize - TransferFramePrefixSize; int offset = buffer.Offset - TransferFramePrefixSize; int pos = offset; // frame size buffer.Buffer[pos++] = (byte)(frameSize >> 24); buffer.Buffer[pos++] = (byte)(frameSize >> 16); buffer.Buffer[pos++] = (byte)(frameSize >> 8); buffer.Buffer[pos++] = (byte)frameSize; // DOF, type and channel buffer.Buffer[pos++] = 0x02; buffer.Buffer[pos++] = 0x00; buffer.Buffer[pos++] = 0x00; buffer.Buffer[pos++] = 0x00; // transfer(list8-size,count) buffer.Buffer[pos++] = 0x00; buffer.Buffer[pos++] = 0x53; buffer.Buffer[pos++] = 0x14; buffer.Buffer[pos++] = 0xc0; buffer.Buffer[pos++] = 0x10; buffer.Buffer[pos++] = 0x06; buffer.Buffer[pos++] = 0x52; // handle buffer.Buffer[pos++] = (byte)handle; buffer.Buffer[pos++] = 0x70; // delivery id: uint buffer.Buffer[pos++] = (byte)(deliveryId >> 24); buffer.Buffer[pos++] = (byte)(deliveryId >> 16); buffer.Buffer[pos++] = (byte)(deliveryId >> 8); buffer.Buffer[pos++] = (byte)deliveryId; buffer.Buffer[pos++] = 0xa0; // delivery tag: bin8 buffer.Buffer[pos++] = 0x04; buffer.Buffer[pos++] = (byte)(deliveryId >> 24); buffer.Buffer[pos++] = (byte)(deliveryId >> 16); buffer.Buffer[pos++] = (byte)(deliveryId >> 8); buffer.Buffer[pos++] = (byte)deliveryId; buffer.Buffer[pos++] = 0x43; // message-format buffer.Buffer[pos++] = settled ? (byte)0x41 : (byte)0x42; // settled buffer.Buffer[pos++] = buffer.Length > payloadSize ? (byte)0x41 : (byte)0x42; // more this.transport.Write(buffer.Buffer, offset, frameSize); this.sendActive = true; buffer.Complete(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); } }
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); }
public static void ReadBytes(ByteBuffer buffer, byte[] data, int offset, int count) { buffer.Validate(false, count); Array.Copy(buffer.Buffer, buffer.Offset, data, offset, count); buffer.Complete(count); }
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; } }
/// <summary> /// Reads a uuid (16-bytes) from the buffer and advance the buffer read cursor. /// </summary> /// <param name="buffer">The buffer to read from.</param> /// <returns></returns> public static Guid ReadUuid(ByteBuffer buffer) { buffer.Validate(false, FixedWidth.Uuid); byte[] d = new byte[FixedWidth.Uuid]; if (AmqpBitConverter.IsLittleEndian) { int pos = buffer.Offset; d[3] = buffer.Buffer[pos++]; d[2] = buffer.Buffer[pos++]; d[1] = buffer.Buffer[pos++]; d[0] = buffer.Buffer[pos++]; d[5] = buffer.Buffer[pos++]; d[4] = buffer.Buffer[pos++]; d[7] = buffer.Buffer[pos++]; d[6] = buffer.Buffer[pos++]; Array.Copy(buffer.Buffer, pos, d, 8, 8); } else { Array.Copy(buffer.Buffer, buffer.Offset, d, 0, FixedWidth.Uuid); } buffer.Complete(FixedWidth.Uuid); return new Guid(d); }
/// <summary> /// Reads bytes from one buffer into another. /// </summary> /// <param name="buffer">Source buffer.</param> /// <param name="data">Destination buffer</param> /// <param name="offset">The start position to write.</param> /// <param name="count">The number of bytes to read.</param> public static void ReadBytes(ByteBuffer buffer, byte[] data, int offset, int count) { buffer.Validate(false, count); Array.Copy(buffer.Buffer, buffer.Offset, data, offset, count); buffer.Complete(count); }
/// <summary> /// Reads a 32-bit signed integer and advance the buffer read cursor. /// </summary> /// <param name="buffer">The buffer to read from.</param> /// <returns></returns> public static int ReadInt(ByteBuffer buffer) { buffer.Validate(false, FixedWidth.Int); int data = ReadInt(buffer.Buffer, buffer.Offset); buffer.Complete(FixedWidth.Int); return data; }
int WriteTransferFrame(uint handle, uint deliveryId, bool settled, ByteBuffer buffer, int maxFrameSize) { // payload should have bytes reserved for frame header and transfer int frameSize = Math.Min(buffer.Length + TransferFramePrefixSize, maxFrameSize); int payloadSize = frameSize - TransferFramePrefixSize; int offset = buffer.Offset - TransferFramePrefixSize; int pos = offset; // frame size buffer.Buffer[pos++] = (byte)(frameSize >> 24); buffer.Buffer[pos++] = (byte)(frameSize >> 16); buffer.Buffer[pos++] = (byte)(frameSize >> 8); buffer.Buffer[pos++] = (byte)frameSize; // DOF, type and channel buffer.Buffer[pos++] = 0x02; buffer.Buffer[pos++] = 0x00; buffer.Buffer[pos++] = 0x00; buffer.Buffer[pos++] = 0x00; // transfer(list8-size,count) buffer.Buffer[pos++] = 0x00; buffer.Buffer[pos++] = 0x53; buffer.Buffer[pos++] = 0x14; buffer.Buffer[pos++] = 0xc0; buffer.Buffer[pos++] = 0x10; buffer.Buffer[pos++] = 0x06; buffer.Buffer[pos++] = 0x52; // handle buffer.Buffer[pos++] = (byte)handle; buffer.Buffer[pos++] = 0x70; // delivery id: uint buffer.Buffer[pos++] = (byte)(deliveryId >> 24); buffer.Buffer[pos++] = (byte)(deliveryId >> 16); buffer.Buffer[pos++] = (byte)(deliveryId >> 8); buffer.Buffer[pos++] = (byte)deliveryId; buffer.Buffer[pos++] = 0xa0; // delivery tag: bin8 buffer.Buffer[pos++] = 0x04; buffer.Buffer[pos++] = (byte)(deliveryId >> 24); buffer.Buffer[pos++] = (byte)(deliveryId >> 16); buffer.Buffer[pos++] = (byte)(deliveryId >> 8); buffer.Buffer[pos++] = (byte)deliveryId; buffer.Buffer[pos++] = 0x43; // message-format buffer.Buffer[pos++] = settled ? (byte)0x41 : (byte)0x42; // settled buffer.Buffer[pos++] = buffer.Length > payloadSize ? (byte)0x41 : (byte)0x42; // more this.transport.Write(buffer.Buffer, offset, frameSize); this.sendActive = true; buffer.Complete(payloadSize); return payloadSize; }
bool OnFrame(Stream stream, ByteBuffer buffer) { buffer.Complete(1); byte type = AmqpBitConverter.ReadUByte(buffer); ushort channel = AmqpBitConverter.ReadUShort(buffer); buffer.Complete(1); ulong code = Encoder.ReadULong(buffer, Encoder.ReadFormatCode(buffer)); List fields = Encoder.ReadList(buffer, Encoder.ReadFormatCode(buffer)); switch (code) { case 0x41ul: // sasl-init if (this.HandleTestPoint(TestPoint.SaslInit, stream, channel, fields) == TestOutcome.Continue) { FRM(stream, 0x44ul, 1, 0, (byte)0); } return false; case 0x10ul: // open if (this.HandleTestPoint(TestPoint.Open, stream, channel, fields) == TestOutcome.Continue) { FRM(stream, 0x10UL, 0, 0, "TestListener"); } break; case 0x11ul: // begin if (this.HandleTestPoint(TestPoint.Begin, stream, channel, fields) == TestOutcome.Continue) { FRM(stream, 0x11UL, 0, channel, channel, 0u, 100u, 100u, 8u); } break; case 0x12ul: // attach if (this.HandleTestPoint(TestPoint.Attach, stream, channel, fields) == TestOutcome.Continue) { bool role = !(bool)fields[2]; FRM(stream, 0x12UL, 0, channel, fields[0], fields[1], role, fields[3], fields[4], new Source(), new Target()); if (role) { FRM(stream, 0x13UL, 0, channel, 0u, 100u, 0u, 100u, fields[1], 0u, 1000u); } } break; case 0x13ul: // flow if (this.HandleTestPoint(TestPoint.Flow, stream, channel, fields) == TestOutcome.Continue) { } break; case 0x14ul: // transfer if (this.HandleTestPoint(TestPoint.Transfer, stream, channel, fields) == TestOutcome.Continue) { FRM(stream, 0x15UL, 0, channel, true, fields[1], null, true, new Accepted()); } break; case 0x15ul: // disposition if (this.HandleTestPoint(TestPoint.Disposition, stream, channel, fields) == TestOutcome.Continue) { } break; case 0x16ul: // dettach if (this.HandleTestPoint(TestPoint.Detach, stream, channel, fields) == TestOutcome.Continue) { FRM(stream, 0x16UL, 0, channel, fields[0], true); } break; case 0x17ul: // end if (this.HandleTestPoint(TestPoint.End, stream, channel, fields) == TestOutcome.Continue) { FRM(stream, 0x17UL, 0, channel); } break; case 0x18ul: // close if (this.HandleTestPoint(TestPoint.Close, stream, channel, fields) == TestOutcome.Continue) { FRM(stream, 0x18UL, 0, channel); } return false; default: break; } return true; }
/// <summary> /// Reads a 16-bit signed integer and advance the buffer read cursor. /// </summary> /// <param name="buffer">The buffer to read from.</param> /// <returns></returns> public static short ReadShort(ByteBuffer buffer) { buffer.Validate(false, FixedWidth.Short); short data = (short)((buffer.Buffer[buffer.Offset] << 8) | buffer.Buffer[buffer.Offset + 1]); buffer.Complete(FixedWidth.Short); return data; }
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.maxFrameSize; if (more) { transfer.More = true; buffer.Reset(); Frame.Encode(buffer, FrameType.Amqp, channel, transfer); frameSize = (int)this.maxFrameSize; 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.transport.Send(frameBuffer); Trace.WriteLine(TraceLevel.Frame, "SEND (ch={0}) {1} payload {2}", channel, transfer, payloadSize); return payloadSize; }
/// <summary> /// Reads a 64-bit signed integer from the buffer and advance the buffer read cursor. /// </summary> /// <param name="buffer">The buffer to read from.</param> /// <returns></returns> public static long ReadLong(ByteBuffer buffer) { buffer.Validate(false, FixedWidth.Long); long high = ReadInt(buffer.Buffer, buffer.Offset); long low = (uint)ReadInt(buffer.Buffer, buffer.Offset + 4); long data = (high << 32) | low; buffer.Complete(FixedWidth.Long); return data; }