static int encode_array_value()

in src/amqpvalue.c [4242:4315]


static int encode_array_value(AMQPVALUE_ENCODER_OUTPUT encoder_output, void* context, uint32_t count, uint32_t size, AMQP_VALUE* items, bool use_smallest)
{
    int result;
    size_t i;

    if (use_smallest)
    {
        size++;

        /* Codes_SRS_AMQPVALUE_01_306: [<encoding name="map8" code="0xE0" 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, (count & 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 array 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="0xF0" 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, (count >> 24) & 0xFF) != 0) ||
            (output_byte(encoder_output, context, (count >> 16) & 0xFF) != 0) ||
            (output_byte(encoder_output, context, (count >> 8) & 0xFF) != 0) ||
            (output_byte(encoder_output, context, count & 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 array header");
            result = MU_FAILURE;
        }
        else
        {
            /* Codes_SRS_AMQPVALUE_01_266: [On success amqpvalue_encode shall return 0.] */
            result = 0;
        }
    }

    if (result == 0)
    {
        bool first_element = true;

        for (i = 0; i < count; i++)
        {
            if (amqpvalue_encode_array_item(items[i], first_element, encoder_output, context) != 0)
            {
                LogError("Failed encoding element %u of the array", (unsigned int)i);
                break;
            }
            first_element = false;
        }

        if (i < count)
        {
            LogError("Could not encode array");
            result = MU_FAILURE;
        }
        else
        {
            result = 0;
        }
    }
    return result;
}