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;
}