/** * * Handler for the management agent. * */ void qdr_management_agent_on_message(void *context, qd_message_t *msg, int unused_link_id, int unused_cost) { qdr_core_t *core = (qdr_core_t*) context; qd_field_iterator_t *app_properties_iter = qd_message_field_iterator(msg, QD_FIELD_APPLICATION_PROPERTIES); qd_router_entity_type_t entity_type = 0; qd_router_operation_type_t operation_type = 0; qd_field_iterator_t *identity_iter = 0; qd_field_iterator_t *name_iter = 0; int32_t count = 0; int32_t offset = 0; qd_parsed_field_t *properties_fld = qd_parse(app_properties_iter); if (qd_can_handle_request(properties_fld, &entity_type, &operation_type, &identity_iter, &name_iter, &count, &offset)) { switch (operation_type) { case QD_ROUTER_OPERATION_QUERY: qd_core_agent_query_handler(core, entity_type, operation_type, msg, &count, &offset); break; case QD_ROUTER_OPERATION_CREATE: qd_core_agent_create_handler(core, msg, entity_type, operation_type, name_iter); break; case QD_ROUTER_OPERATION_READ: qd_core_agent_read_handler(core, msg, entity_type, operation_type, identity_iter, name_iter); break; case QD_ROUTER_OPERATION_UPDATE: qd_core_agent_update_handler(core, msg, entity_type, operation_type, identity_iter, name_iter); break; case QD_ROUTER_OPERATION_DELETE: qd_core_agent_delete_handler(core, msg, entity_type, operation_type, identity_iter, name_iter); break; } } else { // // The C management agent is not going to handle this request. Forward it off to Python. // qdr_send_to2(core, msg, MANAGEMENT_INTERNAL, false, false); } qd_field_iterator_free(app_properties_iter); qd_parse_free(properties_fld); }
static PyObject *qd_python_send(PyObject *self, PyObject *args) { qd_error_clear(); IoAdapter *ioa = (IoAdapter*) self; qd_composed_field_t *field = 0; PyObject *message = 0; int no_echo = 1; int control = 0; if (!PyArg_ParseTuple(args, "O|ii", &message, &no_echo, &control)) return 0; if (compose_python_message(&field, message, ioa->qd) == QD_ERROR_NONE) { qd_message_t *msg = qd_message(); qd_message_compose_2(msg, field); qd_composed_field_t *ingress = qd_compose_subfield(0); qd_compose_insert_string(ingress, qd_router_id(ioa->qd)); qd_composed_field_t *trace = qd_compose_subfield(0); qd_compose_start_list(trace); qd_compose_insert_string(trace, qd_router_id(ioa->qd)); qd_compose_end_list(trace); qd_message_set_ingress_annotation(msg, ingress); qd_message_set_trace_annotation(msg, trace); PyObject *address = PyObject_GetAttrString(message, "address"); if (address) { qdr_send_to2(ioa->core, msg, PyString_AsString(address), (bool) no_echo, (bool) control); Py_DECREF(address); } qd_compose_free(field); qd_message_free(msg); Py_RETURN_NONE; } if (!PyErr_Occurred()) PyErr_SetString(PyExc_RuntimeError, qd_error_message()); return 0; }