in src/proton_utils.c [155:300]
int qdpn_data_insert(pn_data_t *dest, pn_data_t *src)
{
assert(dest && src);
switch (pn_data_type(src)) {
// simple scalar types
case PN_NULL:
pn_data_put_null(dest);
break;
case PN_BOOL:
pn_data_put_bool(dest, pn_data_get_bool(src));
break;
case PN_UBYTE:
pn_data_put_ubyte(dest, pn_data_get_ubyte(src));
break;
case PN_BYTE:
pn_data_put_byte(dest, pn_data_get_byte(src));
break;
case PN_USHORT:
pn_data_put_ushort(dest, pn_data_get_ushort(src));
break;
case PN_SHORT:
pn_data_put_short(dest, pn_data_get_short(src));
break;
case PN_UINT:
pn_data_put_uint(dest, pn_data_get_uint(src));
break;
case PN_INT:
pn_data_put_int(dest, pn_data_get_int(src));
break;
case PN_CHAR:
pn_data_put_char(dest, pn_data_get_char(src));
break;
case PN_ULONG:
pn_data_put_ulong(dest, pn_data_get_ulong(src));
break;
case PN_LONG:
pn_data_put_long(dest, pn_data_get_long(src));
break;
case PN_TIMESTAMP:
pn_data_put_timestamp(dest, pn_data_get_timestamp(src));
break;
case PN_FLOAT:
pn_data_put_float(dest, pn_data_get_float(src));
break;
case PN_DOUBLE:
pn_data_put_double(dest, pn_data_get_double(src));
break;
case PN_DECIMAL32:
pn_data_put_decimal32(dest, pn_data_get_decimal32(src));
break;
case PN_DECIMAL64:
pn_data_put_decimal64(dest, pn_data_get_decimal64(src));
break;
case PN_DECIMAL128:
pn_data_put_decimal128(dest, pn_data_get_decimal128(src));
break;
case PN_UUID:
pn_data_put_uuid(dest, pn_data_get_uuid(src));
break;
case PN_BINARY:
pn_data_put_binary(dest, pn_data_get_binary(src));
break;
case PN_STRING:
pn_data_put_string(dest, pn_data_get_string(src));
break;
case PN_SYMBOL:
pn_data_put_symbol(dest, pn_data_get_symbol(src));
break;
// complex types
case PN_DESCRIBED:
// two children: descriptor and value:
pn_data_put_described(dest);
pn_data_enter(dest);
pn_data_enter(src);
pn_data_next(src);
qdpn_data_insert(dest, src);
pn_data_next(src);
qdpn_data_insert(dest, src);
pn_data_exit(src);
pn_data_exit(dest);
break;
case PN_ARRAY: {
const size_t count = pn_data_get_array(src);
const bool described = pn_data_is_array_described(src);
const pn_type_t atype = pn_data_get_array_type(src);
pn_data_put_array(dest, described, atype);
pn_data_enter(dest);
pn_data_enter(src);
if (described) {
pn_data_next(src);
qdpn_data_insert(dest, src);
}
for (size_t i = 0; i < count; ++i) {
pn_data_next(src);
qdpn_data_insert(dest, src);
}
pn_data_exit(src);
pn_data_exit(dest);
} break;
case PN_LIST: {
const size_t count = pn_data_get_list(src);
pn_data_put_list(dest);
pn_data_enter(dest);
pn_data_enter(src);
for (size_t i = 0; i < count; ++i) {
pn_data_next(src);
qdpn_data_insert(dest, src);
}
pn_data_exit(src);
pn_data_exit(dest);
} break;
case PN_MAP: {
const size_t count = pn_data_get_map(src);
pn_data_put_map(dest);
pn_data_enter(dest);
pn_data_enter(src);
for (size_t i = 0; i < count / 2; ++i) {
// key
pn_data_next(src);
qdpn_data_insert(dest, src);
// value
pn_data_next(src);
qdpn_data_insert(dest, src);
}
pn_data_exit(src);
pn_data_exit(dest);
} break;
default:
break;
}
return 0;
}