in src/AmqpMessageReader.cs [218:273]
static bool TryReadSectionInfo(ByteBuffer buffer, out SectionInfo info, out Error error)
{
info = default(SectionInfo);
FormatCode formatCode = AmqpEncoding.ReadFormatCode(buffer);
if (formatCode != FormatCode.Described)
{
error = GetDecodeError(AmqpResources.GetString(Resources.AmqpInvalidFormatCode, formatCode, buffer.Offset - FixedWidth.FormatCode));
return false;
}
ulong code = ulong.MaxValue;
formatCode = AmqpEncoding.ReadFormatCode(buffer);
switch (formatCode)
{
case FormatCode.SmallULong:
code = AmqpBitConverter.ReadUByte(buffer);
break;
case FormatCode.ULong:
code = AmqpBitConverter.ReadULong(buffer);
break;
case FormatCode.Symbol32:
case FormatCode.Symbol8:
// symbol name should be seldom used so do not optimize for it
AmqpSymbol name = SymbolEncoding.Decode(buffer, formatCode);
for (int i = 0; i < MessageSections.Length; i++)
{
if (MessageSections[i].Name.Equals(name.Value))
{
code = MessageSections[i].Code;
break;
}
}
if (code == ulong.MaxValue)
{
error = GetDecodeError(AmqpResources.GetString(Resources.AmqpInvalidMessageSectionCode, name));
return false;
}
break;
default:
error = GetDecodeError(AmqpResources.GetString(Resources.AmqpInvalidFormatCode, formatCode, buffer.Offset - FixedWidth.FormatCode));
return false;
}
int index = (int)(code - MessageSections[0].Code);
if (index < 0 || index >= MessageSections.Length)
{
error = GetDecodeError(AmqpResources.GetString(Resources.AmqpInvalidMessageSectionCode, code));
return false;
}
info = MessageSections[index];
error = null;
return true;
}