in c/src/core/transport.c [1549:1632]
static void pni_amqp_decode_disposition (uint64_t type, pn_bytes_t disp_data, pn_disposition_t *disp) {
if (disp->type != PN_DISP_EMPTY) {
pn_disposition_clear(disp);
}
switch (type) {
case AMQP_DESC_RECEIVED: {
bool qnumber;
uint32_t number;
bool qoffset;
uint64_t offset;
pn_amqp_decode_EQIQLe(disp_data, &qnumber, &number, &qoffset, &offset);
disp->type = PN_DISP_RECEIVED;
if (qnumber) {
disp->u.s_received.section_number = number;
}
if (qoffset) {
disp->u.s_received.section_offset = offset;
}
break;
}
case AMQP_DESC_ACCEPTED:
disp->type = PN_DISP_ACCEPTED;
break;
case AMQP_DESC_REJECTED: {
pn_bytes_t cond;
pn_bytes_t desc;
pn_bytes_t info;
pn_amqp_decode_EDqEsSRee(disp_data, &cond, &desc, &info);
disp->type = PN_DISP_REJECTED;
pn_condition_set(&disp->u.s_rejected.condition, cond, desc, info);
break;
}
case AMQP_DESC_RELEASED:
disp->type = PN_DISP_RELEASED;
break;
case AMQP_DESC_MODIFIED: {
bool qfailed;
bool failed;
bool qundeliverable;
bool undeliverable;
pn_bytes_t annotations_raw = (pn_bytes_t){0, NULL};
pn_amqp_decode_EQoQoRe(disp_data, &qfailed, &failed, &qundeliverable, &undeliverable, &annotations_raw);
disp->type = PN_DISP_MODIFIED;
pn_bytes_free(disp->u.s_modified.annotations_raw);
disp->u.s_modified.annotations_raw = pn_bytes_dup(annotations_raw);
if (qfailed) {
disp->u.s_modified.failed = failed;
}
if (qundeliverable) {
disp->u.s_modified.undeliverable = undeliverable;
}
break;
}
case AMQP_DESC_TRANSACTIONAL_STATE: {
pn_bytes_t id;
bool qoutcome;
pn_bytes_t outcome_raw;
pn_amqp_decode_EzQRe(disp_data, &id, &qoutcome, &outcome_raw);
disp->type = PN_DISP_TRANSACTIONAL;
pn_bytes_free(disp->u.s_transactional.id);
disp->u.s_transactional.id = pn_bytes_dup(id);
disp->u.s_transactional.outcome_raw = (pn_bytes_t){0, NULL};
if (qoutcome) {
disp->u.s_transactional.outcome_raw = pn_bytes_dup(outcome_raw);
}
break;
}
default: {
pn_bytes_t data_raw = (pn_bytes_t){0, NULL};
pn_amqp_decode_R(disp_data, &data_raw);
disp->type = PN_DISP_CUSTOM;
disp->u.s_custom.type = type;
pn_bytes_free(disp->u.s_custom.data_raw);
disp->u.s_custom.data_raw = pn_bytes_dup(data_raw);
break;
}
}
}