int pn_message_data()

in c/src/core/message.c [921:1009]


int pn_message_data(pn_message_t *msg, pn_data_t *data)
{
  pn_data_clear(data);
  int err = pn_data_fill(data, "DL[?o?B?I?o?I]", HEADER,
                         msg->durable, msg->durable,
                         msg->priority!=HEADER_PRIORITY_DEFAULT, msg->priority,
                         (bool)msg->ttl, msg->ttl,
                         msg->first_acquirer, msg->first_acquirer,
                         (bool)msg->delivery_count, msg->delivery_count);
  if (err)
    return pn_error_format(msg->error, err, "data error: %s",
                           pn_error_text(pn_data_error(data)));

  if (pn_data_size(msg->instructions)) {
    pn_data_rewind(msg->instructions);
    err = pn_data_fill(data, "DLC", DELIVERY_ANNOTATIONS, msg->instructions);
    if (err)
      return pn_error_format(msg->error, err, "data error: %s",
                             pn_error_text(pn_data_error(data)));
  }

  if (pn_data_size(msg->annotations)) {
    pn_data_rewind(msg->annotations);
    err = pn_data_fill(data, "DLC", MESSAGE_ANNOTATIONS, msg->annotations);
    if (err)
      return pn_error_format(msg->error, err, "data error: %s",
                             pn_error_text(pn_data_error(data)));
  }

  pn_atom_t id = pn_message_get_id(msg);
  pn_atom_t correlation_id = pn_message_get_correlation_id(msg);
  err = pn_data_fill(data, "DL[azSSSass?t?tS?IS]", PROPERTIES,
                     &id,
                     pn_string_size(msg->user_id), pn_string_get(msg->user_id),
                     pn_string_get(msg->address),
                     pn_string_get(msg->subject),
                     pn_string_get(msg->reply_to),
                     &correlation_id,
                     pn_string_get(msg->content_type),
                     pn_string_get(msg->content_encoding),
                     (bool)msg->expiry_time, msg->expiry_time,
                     (bool)msg->creation_time, msg->creation_time,
                     pn_string_get(msg->group_id),
                     /*
                      * As a heuristic, null out group_sequence if there is no group_id and
                      * group_sequence is 0. In this case it is extremely unlikely we want
                      * group semantics
                      */
                     (bool)pn_string_get(msg->group_id) || (bool)msg->group_sequence , msg->group_sequence,
                     pn_string_get(msg->reply_to_group_id));
  if (err)
    return pn_error_format(msg->error, err, "data error: %s",
                           pn_error_text(pn_data_error(data)));

  if (pn_data_size(msg->properties)) {
    pn_data_rewind(msg->properties);
    err = pn_data_fill(data, "DLC", APPLICATION_PROPERTIES, msg->properties);
    if (err)
      return pn_error_format(msg->error, err, "data error: %s",
                             pn_error_text(pn_data_error(data)));
  }

  if (pn_data_size(msg->body)) {
    pn_data_rewind(msg->body);
    pn_data_next(msg->body);
    pn_type_t body_type = pn_data_type(msg->body);

    uint64_t descriptor = AMQP_VALUE;
    if (msg->inferred) {
      switch (body_type) {
        case PN_BINARY:
          descriptor = DATA;
          break;
        case PN_LIST:
          descriptor = AMQP_SEQUENCE;
          break;
        default:
          break;
      }
    }

    pn_data_rewind(msg->body);
    err = pn_data_fill(data, "DLC", descriptor, msg->body);
    if (err)
      return pn_error_format(msg->error, err, "data error: %s",
                             pn_error_text(pn_data_error(data)));
  }
  return 0;
}