public static void FRM(Stream stream, ulong code, byte type, ushort channel, params object[] value) { List list = new List(); if (value != null) list.AddRange(value); ByteBuffer buffer = new ByteBuffer(256, true); buffer.Append(4); AmqpBitConverter.WriteUByte(buffer, 2); AmqpBitConverter.WriteUByte(buffer, type); AmqpBitConverter.WriteUShort(buffer, channel); Encoder.WriteObject(buffer, new DescribedValue(code, list)); AmqpBitConverter.WriteInt(buffer.Buffer, 0, buffer.Length); stream.Write(buffer.Buffer, buffer.Offset, buffer.Length); }
public async Task PumpAsync(uint maxFrameSize, Func <ProtocolHeader, bool> onHeader, Func <ByteBuffer, bool> onBuffer) { byte[] header = new byte[FixedWidth.ULong]; if (onHeader != null) { // header await this.ReceiveBufferAsync(header, 0, FixedWidth.ULong).ConfigureAwait(false); Trace.WriteBuffer("RECV {0}", header, 0, header.Length); if (!onHeader(ProtocolHeader.Create(header, 0))) { return; } } // frames while (true) { await this.ReceiveBufferAsync(header, 0, FixedWidth.UInt).ConfigureAwait(false); int frameSize = AmqpBitConverter.ReadInt(header, 0); if ((uint)frameSize > maxFrameSize) { throw new AmqpException(ErrorCode.InvalidField, Fx.Format(SRAmqp.InvalidFrameSize, frameSize, maxFrameSize)); } ByteBuffer buffer = this.bufferManager.GetByteBuffer(frameSize); try { Buffer.BlockCopy(header, 0, buffer.Buffer, buffer.Offset, FixedWidth.UInt); await this.ReceiveBufferAsync(buffer.Buffer, buffer.Offset + FixedWidth.UInt, frameSize - FixedWidth.UInt).ConfigureAwait(false); buffer.Append(frameSize); Trace.WriteBuffer("RECV {0}", buffer.Buffer, buffer.Offset, buffer.Length); if (!onBuffer(buffer)) { break; } } finally { buffer.ReleaseReference(); } } }
public async Task PumpAsync(Func <ProtocolHeader, bool> onHeader, Func <ByteBuffer, bool> onBuffer) { byte[] header = new byte[FixedWidth.ULong]; if (onHeader != null) { // header await this.ReceiveBufferAsync(header, 0, FixedWidth.ULong); if (!onHeader(ProtocolHeader.Create(header, 0))) { return; } } // frames while (true) { await this.ReceiveBufferAsync(header, 0, FixedWidth.UInt); int frameSize = AmqpBitConverter.ReadInt(header, 0); ByteBuffer buffer = this.bufferManager.GetByteBuffer(frameSize); try { Buffer.BlockCopy(header, 0, buffer.Buffer, buffer.Offset, FixedWidth.UInt); await this.ReceiveBufferAsync(buffer.Buffer, buffer.Offset + FixedWidth.UInt, frameSize - FixedWidth.UInt); buffer.Append(frameSize); if (!onBuffer(buffer)) { break; } } finally { buffer.ReleaseReference(); } } }
public static void WriteBytes(ByteBuffer buffer, byte[] data, int offset, int count) { buffer.Validate(true, count); Array.Copy(data, offset, buffer.Buffer, buffer.WritePos, count); buffer.Append(count); }
public static void WriteInt(ByteBuffer buffer, int data) { buffer.Validate(true, FixedWidth.Int); WriteInt(buffer.Buffer, buffer.WritePos, data); buffer.Append(FixedWidth.Int); }
public static void WriteByte(ByteBuffer buffer, sbyte data) { buffer.Validate(true, FixedWidth.Byte); buffer.Buffer[buffer.WritePos] = (byte)data; buffer.Append(FixedWidth.Byte); }
void WriteFrame(byte frameType, ushort channel, ulong code, List fields) { ByteBuffer buffer = new ByteBuffer(64, true); // frame header buffer.Append(FixedWidth.UInt); AmqpBitConverter.WriteUByte(buffer, 2); AmqpBitConverter.WriteUByte(buffer, (byte)frameType); AmqpBitConverter.WriteUShort(buffer, channel); // command AmqpBitConverter.WriteUByte(buffer, FormatCode.Described); Encoder.WriteULong(buffer, code, true); AmqpBitConverter.WriteUByte(buffer, FormatCode.List32); int sizeOffset = buffer.WritePos; buffer.Append(8); AmqpBitConverter.WriteInt(buffer.Buffer, sizeOffset + 4, fields.Count); for (int i = 0; i < fields.Count; i++) { Encoder.WriteObject(buffer, fields[i]); } AmqpBitConverter.WriteInt(buffer.Buffer, sizeOffset, buffer.Length - sizeOffset); AmqpBitConverter.WriteInt(buffer.Buffer, 0, buffer.Length); // frame size this.transport.Write(buffer.Buffer, buffer.Offset, buffer.Length); this.sendActive = true; }
/// <summary> /// Writes a uuid (16-bytes) into the buffer and advance the buffer write cursor. /// </summary> /// <param name="buffer">The buffer to write.</param> /// <param name="data">The data to write.</param> public static void WriteUuid(ByteBuffer buffer, Guid data) { buffer.Validate(true, FixedWidth.Uuid); byte[] p = data.ToByteArray(); int pos = buffer.WritePos; if (AmqpBitConverter.IsLittleEndian) { buffer.Buffer[pos++] = p[3]; buffer.Buffer[pos++] = p[2]; buffer.Buffer[pos++] = p[1]; buffer.Buffer[pos++] = p[0]; buffer.Buffer[pos++] = p[5]; buffer.Buffer[pos++] = p[4]; buffer.Buffer[pos++] = p[7]; buffer.Buffer[pos++] = p[6]; Array.Copy(p, 8, buffer.Buffer, pos, 8); } else { Array.Copy(p, buffer.Buffer, FixedWidth.Uuid); } buffer.Append(FixedWidth.Uuid); }
/// <summary> /// Writes a 16-bit signed integer into the buffer and advance the buffer write cursor. /// </summary> /// <param name="buffer">The buffer to write.</param> /// <param name="data">The data to write.</param> public static void WriteShort(ByteBuffer buffer, short data) { buffer.Validate(true, FixedWidth.Short); buffer.Buffer[buffer.WritePos] = (byte)(data >> 8); buffer.Buffer[buffer.WritePos + 1] = (byte)data; buffer.Append(FixedWidth.Short); }
/// <summary> /// Writes a 32-bit signed integer into the buffer and advance the buffer write cursor. /// </summary> /// <param name="buffer">The buffer to write.</param> /// <param name="data">The data to write.</param> public static void WriteInt(ByteBuffer buffer, int data) { buffer.Validate(true, FixedWidth.Int); WriteInt(buffer.Buffer, buffer.WritePos, data); buffer.Append(FixedWidth.Int); }
/// <summary> /// Writes bytes from one buffer into another. /// </summary> /// <param name="buffer">The destination buffer.</param> /// <param name="data">The source buffer</param> /// <param name="offset">The position in source buffer to start.</param> /// <param name="count">The number of bytes to write.</param> public static void WriteBytes(ByteBuffer buffer, byte[] data, int offset, int count) { buffer.Validate(true, count); Array.Copy(data, offset, buffer.Buffer, buffer.WritePos, count); buffer.Append(count); }
/// <summary> /// Writes a signed byte into the buffer and advance the buffer write cursor. /// </summary> /// <param name="buffer">The buffer to write.</param> /// <param name="data">The data to write.</param> public static void WriteByte(ByteBuffer buffer, sbyte data) { buffer.Validate(true, FixedWidth.Byte); buffer.Buffer[buffer.WritePos] = (byte)data; buffer.Append(FixedWidth.Byte); }