// create a buffer chain holding the outgoing message annotations section static bool compose_message_annotations(qd_message_pvt_t *msg, qd_buffer_list_t *out) { if (!DEQ_IS_EMPTY(msg->ma_to_override) || !DEQ_IS_EMPTY(msg->ma_trace) || !DEQ_IS_EMPTY(msg->ma_ingress)) { qd_composed_field_t *out_ma = qd_compose(QD_PERFORMATIVE_MESSAGE_ANNOTATIONS, 0); qd_compose_start_map(out_ma); if (!DEQ_IS_EMPTY(msg->ma_to_override)) { qd_compose_insert_symbol(out_ma, QD_MA_TO); qd_compose_insert_buffers(out_ma, &msg->ma_to_override); } if (!DEQ_IS_EMPTY(msg->ma_trace)) { qd_compose_insert_symbol(out_ma, QD_MA_TRACE); qd_compose_insert_buffers(out_ma, &msg->ma_trace); } if (!DEQ_IS_EMPTY(msg->ma_ingress)) { qd_compose_insert_symbol(out_ma, QD_MA_INGRESS); qd_compose_insert_buffers(out_ma, &msg->ma_ingress); } qd_compose_end_map(out_ma); qd_compose_take_buffers(out_ma, out); qd_compose_free(out_ma); return true; } return false; }
void qd_message_set_to_override_annotation(qd_message_t *in_msg, qd_composed_field_t *to_field) { qd_message_pvt_t *msg = (qd_message_pvt_t*) in_msg; qd_buffer_list_free_buffers(&msg->ma_to_override); qd_compose_take_buffers(to_field, &msg->ma_to_override); qd_compose_free(to_field); }
void qd_message_set_ingress_annotation(qd_message_t *in_msg, qd_composed_field_t *ingress_field) { qd_message_pvt_t *msg = (qd_message_pvt_t*) in_msg; qd_buffer_list_free_buffers(&msg->ma_ingress); qd_compose_take_buffers(ingress_field, &msg->ma_ingress); qd_compose_free(ingress_field); }
void qd_message_compose_1(qd_message_t *msg, const char *to, qd_buffer_list_t *buffers) { qd_composed_field_t *field = qd_compose(QD_PERFORMATIVE_HEADER, 0); qd_message_content_t *content = MSG_CONTENT(msg); qd_compose_start_list(field); qd_compose_insert_bool(field, 0); // durable //qd_compose_insert_null(field); // priority //qd_compose_insert_null(field); // ttl //qd_compose_insert_boolean(field, 0); // first-acquirer //qd_compose_insert_uint(field, 0); // delivery-count qd_compose_end_list(field); qd_buffer_list_t out_ma; if (compose_message_annotations((qd_message_pvt_t*)msg, &out_ma)) { qd_compose_insert_buffers(field, &out_ma); } field = qd_compose(QD_PERFORMATIVE_PROPERTIES, field); qd_compose_start_list(field); qd_compose_insert_null(field); // message-id qd_compose_insert_null(field); // user-id qd_compose_insert_string(field, to); // to //qd_compose_insert_null(field); // subject //qd_compose_insert_null(field); // reply-to //qd_compose_insert_null(field); // correlation-id //qd_compose_insert_null(field); // content-type //qd_compose_insert_null(field); // content-encoding //qd_compose_insert_timestamp(field, 0); // absolute-expiry-time //qd_compose_insert_timestamp(field, 0); // creation-time //qd_compose_insert_null(field); // group-id //qd_compose_insert_uint(field, 0); // group-sequence //qd_compose_insert_null(field); // reply-to-group-id qd_compose_end_list(field); if (buffers) { field = qd_compose(QD_PERFORMATIVE_BODY_DATA, field); qd_compose_insert_binary_buffers(field, buffers); } qd_compose_take_buffers(field, &content->buffers); qd_compose_free(field); }
static char *test_tracemask(void *context) { qd_bitmask_t *bm = NULL; qd_tracemask_t *tm = qd_tracemask(); qd_buffer_list_t list; static char error[1024]; error[0] = 0; qd_iterator_set_address(false, "0", "ROUTER"); qd_tracemask_add_router(tm, "amqp:/_topo/0/Router.A", 0); qd_tracemask_add_router(tm, "amqp:/_topo/0/Router.B", 1); qd_tracemask_add_router(tm, "amqp:/_topo/0/Router.C", 2); qd_tracemask_add_router(tm, "amqp:/_topo/0/Router.D", 3); qd_tracemask_add_router(tm, "amqp:/_topo/0/Router.E", 4); qd_tracemask_add_router(tm, "amqp:/_topo/0/Router.F", 5); qd_tracemask_set_link(tm, 0, 4); qd_tracemask_set_link(tm, 3, 10); qd_tracemask_set_link(tm, 4, 3); qd_tracemask_set_link(tm, 5, 2); qd_composed_field_t *comp = qd_compose_subfield(0); qd_compose_start_list(comp); qd_compose_insert_string(comp, "0/Router.A"); qd_compose_insert_string(comp, "0/Router.D"); qd_compose_insert_string(comp, "0/Router.E"); qd_compose_end_list(comp); DEQ_INIT(list); qd_compose_take_buffers(comp, &list); qd_compose_free(comp); int length = 0; qd_buffer_t *buf = DEQ_HEAD(list); while (buf) { length += qd_buffer_size(buf); buf = DEQ_NEXT(buf); } qd_iterator_t *iter = qd_iterator_buffer(DEQ_HEAD(list), 0, length, ITER_VIEW_ALL); qd_parsed_field_t *pf = qd_parse(iter); qd_iterator_free(iter); int ingress = -1; bm = qd_tracemask_create(tm, pf, &ingress); if (qd_bitmask_cardinality(bm) != 3) { sprintf(error, "Expected cardinality of 3, got %d", qd_bitmask_cardinality(bm)); goto cleanup; } if (ingress != 0) { sprintf(error, "(A) Expected ingress index of 0, got %d", ingress); goto cleanup; } int total = 0; int bit, c; for (QD_BITMASK_EACH(bm, bit, c)) { total += bit; } if (total != 17) { sprintf(error, "Expected total bit value of 17, got %d", total); goto cleanup; } qd_bitmask_free(bm); bm = 0; qd_tracemask_del_router(tm, 3); qd_tracemask_remove_link(tm, 0); ingress = -1; bm = qd_tracemask_create(tm, pf, &ingress); qd_parse_free(pf); pf = 0; if (qd_bitmask_cardinality(bm) != 1) { sprintf(error, "Expected cardinality of 1, got %d", qd_bitmask_cardinality(bm)); goto cleanup; } if (ingress != 0) { sprintf(error, "(B) Expected ingress index of 0, got %d", ingress); goto cleanup; } total = 0; for (QD_BITMASK_EACH(bm, bit, c)) { total += bit; } if (total != 3) { sprintf(error, "Expected total bit value of 3, got %d", total); // fallthrough } cleanup: qd_parse_free(pf); qd_tracemask_free(tm); qd_bitmask_free(bm); for (qd_buffer_t *buf = DEQ_HEAD(list); buf; buf = DEQ_HEAD(list)) { DEQ_REMOVE_HEAD(list); qd_buffer_free(buf); } return *error ? error : 0; }