示例#1
0
        public static int GetEstimatedMessageSize(AnnotatedMessage message)
        {
            var size = 0;

            if (message.Header != null)
            {
                size += 64;
            }
            if (message.DeliveryAnnotations != null)
            {
                size += 64;
            }
            if (message.MessageAnnotations != null)
            {
                size += 64;
            }
            if (message.BareMessage != null)
            {
                size += message.BareMessage.Length;
            }
            if (message.Footer != null)
            {
                size += 64;
            }
            return(size);
        }
示例#2
0
 public static void Encode(AnnotatedMessage message, ByteBuffer buffer)
 {
     if (message.Header != null)
     {
         message.Header.Encode(buffer);
     }
     if (message.DeliveryAnnotations != null)
     {
         message.DeliveryAnnotations.Encode(buffer);
     }
     if (message.MessageAnnotations != null)
     {
         message.MessageAnnotations.Encode(buffer);
     }
     if (message.BareMessage != null && message.BareMessage.Length > 0)
     {
         AmqpBitConverter.WriteBytes(buffer, message.BareMessage, 0, message.BareMessage.Length);
     }
     if (message.Footer != null)
     {
         message.Footer.Encode(buffer);
     }
 }
示例#3
0
        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;
        }
示例#4
0
 public static int GetEstimatedMessageSize(AnnotatedMessage message)
 {
     var size = 0;
     if (message.Header != null)
         size += 64;
     if (message.DeliveryAnnotations != null)
         size += 64;
     if (message.MessageAnnotations != null)
         size += 64;
     if (message.BareMessage != null)
         size += message.BareMessage.Length;
     if (message.Footer != null)
         size += 64;
     return size;
 }
示例#5
0
 public static void Encode(AnnotatedMessage message, ByteBuffer buffer)
 {
     if (message.Header != null)
         message.Header.Encode(buffer);
     if (message.DeliveryAnnotations != null)
         message.DeliveryAnnotations.Encode(buffer);
     if (message.MessageAnnotations != null)
         message.MessageAnnotations.Encode(buffer);
     if (message.BareMessage != null && message.BareMessage.Length > 0)
         AmqpBitConverter.WriteBytes(buffer, message.BareMessage, 0, message.BareMessage.Length);
     if (message.Footer != null)
         message.Footer.Encode(buffer);
 }
示例#6
0
        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);
        }