private static void SkipBinaryBuffer(ByteBuffer buffer) { var binaryFormatCode = AmqpCodec.DecodeFormatCode(buffer); int size = 0; if (binaryFormatCode == FormatCode.Binary8) { size = AmqpBitConverter.ReadUByte(buffer); } else if (binaryFormatCode == FormatCode.Binary32) { size = (int)AmqpBitConverter.ReadUInt(buffer); } buffer.CompleteRead(size); }
private static void SkipDescribedList(ByteBuffer buffer) { // read the list length and move forward var listFormatCode = AmqpCodec.DecodeFormatCode(buffer); int size = 0; if (listFormatCode == FormatCode.List0) { size = 0; } else if (listFormatCode == FormatCode.List8) { size = AmqpBitConverter.ReadUByte(buffer); } else if (listFormatCode == FormatCode.List32) { size = (int)AmqpBitConverter.ReadUInt(buffer); } buffer.CompleteRead(size); }
protected override void DecodeValue(ByteBuffer buffer) { map = Encoder.ReadMap(buffer, AmqpCodec.DecodeFormatCode(buffer)); }
public static BrokeredMessage Decode(ByteBuffer buffer) { var message = new BrokeredMessage(); while (buffer.LengthAvailableToRead > 0) { int offOfDescribedList = buffer.ReadOffset; // peak at the type of the described list var formatCode = AmqpCodec.DecodeFormatCode(buffer); if (formatCode != FormatCode.Described) { throw new AmqpException(ErrorCode.FramingError, $"Expected Format Code = {FormatCode.Described.ToHex()} but was {formatCode.ToHex()}"); } var descriptor = AmqpCodec.DecodeDescriptor(buffer); if (descriptor == DescribedTypeCodec.Header) { message.Header = (Header)AmqpCodec.DecodeKnownDescribedType(buffer, descriptor); continue; } if (descriptor == DescribedTypeCodec.DeliveryAnnotations) { message.DeliveryAnnotations = (DeliveryAnnotations)AmqpCodec.DecodeKnownDescribedType(buffer, descriptor); continue; } if (descriptor == DescribedTypeCodec.MessageAnnotations) { message.MessageAnnotations = (MessageAnnotations)AmqpCodec.DecodeKnownDescribedType(buffer, descriptor); continue; } if (descriptor == DescribedTypeCodec.Footer) { message.Footer = (Footer)AmqpCodec.DecodeKnownDescribedType(buffer, descriptor); continue; } if (descriptor == DescribedTypeCodec.Properties) { message.Properties = (Properties)AmqpCodec.DecodeKnownDescribedType(buffer, descriptor); continue; } if (descriptor == DescribedTypeCodec.ApplicationProperties) { message.ApplicationProperties = (ApplicationProperties)AmqpCodec.DecodeKnownDescribedType(buffer, descriptor); continue; } if (descriptor == DescribedTypeCodec.Data) { throw new NotImplementedException("TODO: Decode Described amqp:data:binary"); // continue; } if (descriptor == DescribedTypeCodec.AmqpValue) { throw new NotImplementedException("TODO: Decode Described amqp:amqp-value:*"); // continue; } if (descriptor == DescribedTypeCodec.AmqpSequence) { throw new NotImplementedException("TODO: Decode Described amqp:amqp-sequence:list"); //continue; } } return(message); }
public static AnnotatedMessage Decode(ByteBuffer buffer) { var message = new AnnotatedMessage(); int bareMessageStartOffset = -1; int bareMessageEndOffset = -1; while (buffer.LengthAvailableToRead > 0) { int offOfDescribedList = buffer.ReadOffset; // peak at the type of the described list var formatCode = AmqpCodec.DecodeFormatCode(buffer); if (formatCode != FormatCode.Described) { throw new AmqpException(ErrorCode.FramingError, $"Expected Format Code = {FormatCode.Described.ToHex()} but was {formatCode.ToHex()}"); } var descriptor = AmqpCodec.DecodeDescriptor(buffer); if (descriptor == DescribedTypeCodec.Header) { message.Header = (Header)AmqpCodec.DecodeKnownDescribedType(buffer, descriptor); continue; } if (descriptor == DescribedTypeCodec.DeliveryAnnotations) { message.DeliveryAnnotations = (DeliveryAnnotations)AmqpCodec.DecodeKnownDescribedType(buffer, descriptor); continue; } if (descriptor == DescribedTypeCodec.MessageAnnotations) { message.MessageAnnotations = (MessageAnnotations)AmqpCodec.DecodeKnownDescribedType(buffer, descriptor); continue; } if (descriptor == DescribedTypeCodec.Footer) { message.Footer = (Footer)AmqpCodec.DecodeKnownDescribedType(buffer, descriptor); continue; } if (descriptor == DescribedTypeCodec.Properties) { if (bareMessageStartOffset < 0) { bareMessageStartOffset = offOfDescribedList; // the first described list in the bare message } SkipDescribedList(buffer); bareMessageEndOffset = buffer.ReadOffset; continue; } if (descriptor == DescribedTypeCodec.ApplicationProperties) { if (bareMessageStartOffset < 0) { bareMessageStartOffset = offOfDescribedList; // the first described list in the bare message } SkipDescribedList(buffer); bareMessageEndOffset = buffer.ReadOffset; continue; } if (descriptor == DescribedTypeCodec.Data) { if (bareMessageStartOffset < 0) { bareMessageStartOffset = offOfDescribedList; // the first described list in the bare message } SkipBinaryBuffer(buffer); bareMessageEndOffset = buffer.ReadOffset; continue; } if (descriptor == DescribedTypeCodec.AmqpValue) { if (bareMessageStartOffset < 0) { bareMessageStartOffset = offOfDescribedList; // the first described list in the bare message } throw new NotImplementedException(); //continue; } if (descriptor == DescribedTypeCodec.AmqpSequence) { if (bareMessageStartOffset < 0) { bareMessageStartOffset = offOfDescribedList; // the first described list in the bare message } throw new NotImplementedException(); //continue; } } if (bareMessageStartOffset > -1) { message.BareMessage = new byte[bareMessageEndOffset - bareMessageStartOffset]; Array.Copy(buffer.Buffer, bareMessageStartOffset, message.BareMessage, 0, message.BareMessage.Length); } return(message); }