static void pni_amqp_decode_disposition()

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