int amqpvalue_encode()

in src/amqpvalue.c [4384:4510]


int amqpvalue_encode(AMQP_VALUE value, AMQPVALUE_ENCODER_OUTPUT encoder_output, void* context)
{
    int result;

    /* Codes_SRS_AMQPVALUE_01_269: [If value or encoder_output are NULL, amqpvalue_encode shall fail and return a non-zero value.] */
    if ((value == NULL) ||
        (encoder_output == NULL))
    {
        LogError("Bad arguments: value = %p, encoder_output = %p",
            value, encoder_output);
        result = MU_FAILURE;
    }
    else
    {
        AMQP_VALUE_DATA* value_data = (AMQP_VALUE_DATA*)value;

        switch (value_data->type)
        {
        default:
            /* Codes_SRS_AMQPVALUE_01_271: [If encoding fails due to any error not specifically mentioned here, it shall return a non-zero value.] */
            LogError("Invalid type: %d", (int)value_data->type);
            result = MU_FAILURE;
            break;

        case AMQP_TYPE_NULL:
            /* Codes_SRS_AMQPVALUE_01_266: [On success amqpvalue_encode shall return 0.] */
            result = encode_null(encoder_output, context);
            break;

        case AMQP_TYPE_BOOL:
            result = encode_boolean(encoder_output, context, value_data->value.bool_value);
            break;

        case AMQP_TYPE_UBYTE:
            result = encode_ubyte(encoder_output, context, value_data->value.ubyte_value);
            break;

        case AMQP_TYPE_USHORT:
            result = encode_ushort(encoder_output, context, value_data->value.ushort_value);
            break;

        case AMQP_TYPE_UINT:
            result = encode_uint(encoder_output, context, value_data->value.uint_value);
            break;

        case AMQP_TYPE_ULONG:
            result = encode_ulong(encoder_output, context, value_data->value.ulong_value);
            break;

        case AMQP_TYPE_BYTE:
            result = encode_byte(encoder_output, context, value_data->value.byte_value);
            break;

        case AMQP_TYPE_SHORT:
            result = encode_short(encoder_output, context, value_data->value.short_value);
            break;

        case AMQP_TYPE_INT:
            result = encode_int(encoder_output, context, value_data->value.int_value);
            break;

        case AMQP_TYPE_LONG:
            result = encode_long(encoder_output, context, value_data->value.long_value);
            break;

        case AMQP_TYPE_FLOAT:
            result = encode_float(encoder_output, context, value_data->value.float_value);
            break;

        case AMQP_TYPE_DOUBLE:
            result = encode_double(encoder_output, context, value_data->value.double_value);
            break;

        case AMQP_TYPE_TIMESTAMP:
            result = encode_timestamp(encoder_output, context, value_data->value.timestamp_value);
            break;

        case AMQP_TYPE_UUID:
            result = encode_uuid(encoder_output, context, value_data->value.uuid_value);
            break;

        case AMQP_TYPE_BINARY:
            result = encode_binary(encoder_output, context, (const unsigned char*)value_data->value.binary_value.bytes, value_data->value.binary_value.length);
            break;

        case AMQP_TYPE_STRING:
            result = encode_string(encoder_output, context, value_data->value.string_value.chars);
            break;

        case AMQP_TYPE_SYMBOL:
            result = encode_symbol(encoder_output, context, value_data->value.symbol_value.chars);
            break;

        case AMQP_TYPE_LIST:
            result = encode_list(encoder_output, context, value_data->value.list_value.count, value_data->value.list_value.items);
            break;

        case AMQP_TYPE_ARRAY:
            result = encode_array(encoder_output, context, value_data->value.array_value.count, value_data->value.array_value.items);
            break;

        case AMQP_TYPE_MAP:
            result = encode_map(encoder_output, context, value_data->value.map_value.pair_count, value_data->value.map_value.pairs);
            break;

        case AMQP_TYPE_COMPOSITE:
        case AMQP_TYPE_DESCRIBED:
        {
            if ((encode_descriptor_header(encoder_output, context) != 0) ||
                (amqpvalue_encode(value_data->value.described_value.descriptor, encoder_output, context) != 0) ||
                (amqpvalue_encode(value_data->value.described_value.value, encoder_output, context) != 0))
            {
                LogError("Failed encoding described or composite type");
                result = MU_FAILURE;
            }
            else
            {
                result = 0;
            }

            break;
        }
        }
    }

    return result;
}