in src/amqpvalue.c [4024:4099]
static int encode_map_value(AMQPVALUE_ENCODER_OUTPUT encoder_output, void* context, uint32_t count, uint32_t size, AMQP_MAP_KEY_VALUE_PAIR* pairs, bool use_smallest)
{
int result;
size_t i;
/* Codes_SRS_AMQPVALUE_01_124: [Map encodings MUST contain an even number of items (i.e. an equal number of keys and values).] */
uint32_t elements = count * 2;
if (use_smallest)
{
size++;
/* Codes_SRS_AMQPVALUE_01_306: [<encoding name="map8" code="0xc1" category="compound" width="1" label="up to 2^8 - 1 octets of encoded map data"/>] */
if ((output_byte(encoder_output, context, (size & 0xFF)) != 0) ||
(output_byte(encoder_output, context, (elements & 0xFF)) != 0))
{
/* Codes_SRS_AMQPVALUE_01_274: [When the encoder output function fails, amqpvalue_encode shall fail and return a non-zero value.] */
LogError("Could not encode small map header");
result = MU_FAILURE;
}
else
{
/* Codes_SRS_AMQPVALUE_01_266: [On success amqpvalue_encode shall return 0.] */
result = 0;
}
}
else
{
size += 4;
/* Codes_SRS_AMQPVALUE_01_307: [<encoding name="map32" code="0xd1" category="compound" width="4" label="up to 2^32 - 1 octets of encoded map data"/>] */
if ((output_byte(encoder_output, context, (size >> 24) & 0xFF) != 0) ||
(output_byte(encoder_output, context, (size >> 16) & 0xFF) != 0) ||
(output_byte(encoder_output, context, (size >> 8) & 0xFF) != 0) ||
(output_byte(encoder_output, context, size & 0xFF) != 0) ||
(output_byte(encoder_output, context, (elements >> 24) & 0xFF) != 0) ||
(output_byte(encoder_output, context, (elements >> 16) & 0xFF) != 0) ||
(output_byte(encoder_output, context, (elements >> 8) & 0xFF) != 0) ||
(output_byte(encoder_output, context, elements & 0xFF) != 0))
{
/* Codes_SRS_AMQPVALUE_01_274: [When the encoder output function fails, amqpvalue_encode shall fail and return a non-zero value.] */
LogError("Could not encode large map header");
result = MU_FAILURE;
}
else
{
/* Codes_SRS_AMQPVALUE_01_266: [On success amqpvalue_encode shall return 0.] */
result = 0;
}
}
if (result == 0)
{
/* Codes_SRS_AMQPVALUE_01_123: [A map is encoded as a compound value where the constituent elements form alternating key value pairs.] */
for (i = 0; i < count; i++)
{
if ((amqpvalue_encode(pairs[i].key, encoder_output, context) != 0) ||
(amqpvalue_encode(pairs[i].value, encoder_output, context) != 0))
{
LogError("Failed encoding map element %u", (unsigned int)i);
break;
}
}
if (i < count)
{
LogError("Could not encode map");
result = MU_FAILURE;
}
else
{
result = 0;
}
}
return result;
}