static T ReadMapSection <T>(AmqpMessageReader reader) where T : DescribedMap, new() { T section = new T(); FormatCode formatCode = reader.ReadFormatCode(); Fx.Assert(formatCode == FormatCode.Map8 || formatCode == FormatCode.Map32, "Invalid map format code"); bool smallEncoding = formatCode == FormatCode.Map8; int size = reader.ReadInt(smallEncoding); int count = reader.ReadInt(smallEncoding); if (count > 0) { ArraySegment <byte> bytes = reader.ReadBytes(size - (smallEncoding ? FixedWidth.UByte : FixedWidth.UInt)); section.DecodeValue(ByteBuffer.Wrap(bytes), size, count); } return(section); }
static T ReadListSection <T>(AmqpMessageReader reader, bool isBodySection = false) where T : DescribedList, new() { T section = new T(); long position = reader.stream.Position; FormatCode formatCode = reader.ReadFormatCode(); Fx.Assert(formatCode == FormatCode.List8 || formatCode == FormatCode.List0 || formatCode == FormatCode.List32, "Invalid list format code"); if (formatCode == FormatCode.List0) { return(section); } bool smallEncoding = formatCode == FormatCode.List8; int size = reader.ReadInt(smallEncoding); int count = reader.ReadInt(smallEncoding); if (count == 0) { return(section); } long position2 = reader.stream.Position; ArraySegment <byte> bytes = reader.ReadBytes(size - (smallEncoding ? FixedWidth.UByte : FixedWidth.UInt)); long position3 = reader.stream.Position; section.DecodeValue(ByteBuffer.Wrap(bytes), size, count); // Check if we are decoding the AMQP value body if (isBodySection) { reader.stream.Position = position; ArraySegment <byte> segment = reader.stream.ReadBytes((int)(position2 - position)); reader.stream.Position = position3; reader.AddBodyBuffer(segment); reader.AddBodyBuffer(bytes); } return(section); }
static void ReadDataSection(AmqpMessageReader reader, AmqpMessage message) { FormatCode formatCode = reader.ReadFormatCode(); Fx.Assert(formatCode == FormatCode.Binary8 || formatCode == FormatCode.Binary32, "Invalid binary format code"); bool smallEncoding = formatCode == FormatCode.Binary8; int count = reader.ReadInt(smallEncoding); ArraySegment <byte> buffer = reader.ReadBytes(count); AmqpMessage.EnsureInitialized <List <Data> >(ref reader.dataList); reader.dataList.Add(new Data() { Value = buffer }); reader.AddBodyBuffer(buffer); }