// 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; }
static void qd_core_agent_create_handler(qdr_core_t *core, qd_message_t *msg, qd_router_entity_type_t entity_type, qd_router_operation_type_t operation_type, qd_field_iterator_t *name_iter) { // // Add the Body // qd_composed_field_t *out_body = qd_compose(QD_PERFORMATIVE_BODY_AMQP_VALUE, 0); // Set the callback function. qdr_manage_handler(core, qd_manage_response_handler); // Call local function that creates and returns a qd_management_context_t containing the values passed in. qd_management_context_t *ctx = qd_management_context(qd_message(), msg, out_body, 0, core, operation_type, 0); qd_field_iterator_t *body_iter = qd_message_field_iterator(msg, QD_FIELD_BODY); qd_parsed_field_t *in_body = qd_parse(body_iter); qdr_manage_create(core, ctx, entity_type, name_iter, in_body, out_body); qd_field_iterator_free(body_iter); }
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 qd_error_t compose_python_message(qd_composed_field_t **field, PyObject *message, qd_dispatch_t* qd) { *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_py_attr_to_composed(message, "address", *field); QD_ERROR_RET(); // to qd_compose_insert_null(*field); // subject qd_compose_insert_null(*field); // reply-to qd_py_attr_to_composed(message, "correlation_id", *field); QD_ERROR_RET(); // correlation-id qd_compose_end_list(*field); *field = qd_compose(QD_PERFORMATIVE_APPLICATION_PROPERTIES, *field); QD_ERROR_RET(); qd_py_attr_to_composed(message, "properties", *field); QD_ERROR_RET(); *field = qd_compose(QD_PERFORMATIVE_BODY_AMQP_VALUE, *field); QD_ERROR_RET(); qd_py_attr_to_composed(message, "body", *field); QD_ERROR_RET(); return qd_error_code(); }
/** * Sets the error status on a new composed field. */ static void qd_set_response_status(const qd_amqp_error_t *error, qd_composed_field_t **field) { // // Insert appropriate success or error // *field = qd_compose(QD_PERFORMATIVE_APPLICATION_PROPERTIES, *field); qd_compose_start_map(*field); qd_compose_insert_string(*field, status_description); qd_compose_insert_string(*field, error->description); qd_compose_insert_string(*field, status_code); qd_compose_insert_uint(*field, error->status); qd_compose_end_map(*field); }
static void qd_core_agent_query_handler(qdr_core_t *core, qd_router_entity_type_t entity_type, qd_router_operation_type_t operation_type, qd_message_t *msg, int *count, int *offset) { // // Add the Body. // qd_composed_field_t *field = qd_compose(QD_PERFORMATIVE_BODY_AMQP_VALUE, 0); // Start a map in the body. Look for the end map in the callback function, qd_manage_response_handler. qd_compose_start_map(field); //add a "attributeNames" key qd_compose_insert_string(field, ATTRIBUTE_NAMES); // Call local function that creates and returns a local qd_management_context_t object containing the values passed in. qd_management_context_t *ctx = qd_management_context(qd_message(), msg, field, 0, core, operation_type, (*count)); // Grab the attribute names from the incoming message body. The attribute names will be used later on in the response. qd_parsed_field_t *attribute_names_parsed_field = 0; qd_field_iterator_t *body_iter = qd_message_field_iterator(msg, QD_FIELD_BODY); qd_parsed_field_t *body = qd_parse(body_iter); if (body != 0 && qd_parse_is_map(body)) { attribute_names_parsed_field = qd_parse_value_by_key(body, ATTRIBUTE_NAMES); } // Set the callback function. qdr_manage_handler(core, qd_manage_response_handler); ctx->query = qdr_manage_query(core, ctx, entity_type, attribute_names_parsed_field, field); //Add the attribute names qdr_query_add_attribute_names(ctx->query); //this adds a list of attribute names like ["attribute1", "attribute2", "attribute3", "attribute4",] qd_compose_insert_string(field, results); //add a "results" key qd_compose_start_list(field); //start the list for results qdr_query_get_first(ctx->query, (*offset)); qd_field_iterator_free(body_iter); qd_parse_free(body); }
static void qd_set_properties(qd_message_t *msg, qd_field_iterator_t **reply_to, qd_composed_field_t **fld) { qd_field_iterator_t *correlation_id = qd_message_field_iterator_typed(msg, QD_FIELD_CORRELATION_ID); // Grab the reply_to field from the incoming message. This is the address we will send the response to. *reply_to = qd_message_field_iterator(msg, QD_FIELD_REPLY_TO); *fld = qd_compose(QD_PERFORMATIVE_PROPERTIES, 0); qd_compose_start_list(*fld); qd_compose_insert_null(*fld); // message-id qd_compose_insert_null(*fld); // user-id qd_compose_insert_string_iterator(*fld, *reply_to); // to qd_compose_insert_null(*fld); // subject qd_compose_insert_null(*fld); qd_compose_insert_typed_iterator(*fld, correlation_id); qd_compose_end_list(*fld); qd_field_iterator_free(correlation_id); }
static void qd_core_agent_update_handler(qdr_core_t *core, qd_message_t *msg, qd_router_entity_type_t entity_type, qd_router_operation_type_t operation_type, qd_field_iterator_t *identity_iter, qd_field_iterator_t *name_iter) { qd_composed_field_t *out_body = qd_compose(QD_PERFORMATIVE_BODY_AMQP_VALUE, 0); // Set the callback function. qdr_manage_handler(core, qd_manage_response_handler); qd_management_context_t *ctx = qd_management_context(qd_message(), msg, out_body, 0, core, operation_type, 0); qd_field_iterator_t *iter = qd_message_field_iterator(msg, QD_FIELD_BODY); qd_parsed_field_t *in_body= qd_parse(iter); qd_field_iterator_free(iter); qdr_manage_update(core, ctx, entity_type, name_iter, identity_iter, in_body, out_body); }