Exemplo n.º 1
0
        /// <summary>
        /// Decodes an AMQP object from the buffer and advances the buffer's position.
        /// </summary>
        /// <param name="buffer">The buffer to read.</param>
        /// <returns>An AMQP object.</returns>
        public static object DecodeObject(ByteBuffer buffer)
        {
            FormatCode formatCode = AmqpEncoding.ReadFormatCode(buffer);

            if (formatCode == FormatCode.Null)
            {
                return(null);
            }
            else if (formatCode == FormatCode.Described)
            {
                object descriptor = AmqpCodec.DecodeObject(buffer);
                Func <AmqpDescribed> knownTypeCtor = null;
                if (descriptor is AmqpSymbol)
                {
                    knownTypesByName.TryGetValue(((AmqpSymbol)descriptor).Value, out knownTypeCtor);
                }
                else if (descriptor is ulong)
                {
                    knownTypesByCode.TryGetValue((ulong)descriptor, out knownTypeCtor);
                }

                if (knownTypeCtor != null)
                {
                    AmqpDescribed amqpDescribed = knownTypeCtor();
                    amqpDescribed.DecodeValue(buffer);
                    return(amqpDescribed);
                }
                else
                {
                    object value = AmqpCodec.DecodeObject(buffer);
                    return(new DescribedType(descriptor, value));
                }
            }
            else
            {
                return(AmqpEncoding.DecodeObject(buffer, formatCode));
            }
        }