static void AMQP_opened_handler(qd_router_t *router, qd_connection_t *conn, bool inbound) { qdr_connection_role_t role = 0; int cost = 1; int remote_cost = 1; bool strip_annotations_in = false; bool strip_annotations_out = false; int link_capacity = 1; const char *name = 0; uint64_t connection_id = qd_connection_connection_id(conn); pn_connection_t *pn_conn = qd_connection_pn(conn); qd_router_connection_get_config(conn, &role, &cost, &name, &strip_annotations_in, &strip_annotations_out, &link_capacity); if (role == QDR_ROLE_INTER_ROUTER) { // // Check the remote properties for an inter-router cost value. // pn_data_t *props = pn_conn ? pn_connection_remote_properties(pn_conn) : 0; if (props) { pn_data_rewind(props); pn_data_next(props); if (props && pn_data_type(props) == PN_MAP) { pn_data_enter(props); while (pn_data_next(props)) { if (pn_data_type(props) == PN_SYMBOL) { pn_bytes_t sym = pn_data_get_symbol(props); if (sym.size == strlen(QD_CONNECTION_PROPERTY_COST_KEY) && strcmp(sym.start, QD_CONNECTION_PROPERTY_COST_KEY) == 0) { pn_data_next(props); if (pn_data_type(props) == PN_INT) remote_cost = pn_data_get_int(props); break; } } } } } // // Use the larger of the local and remote costs for this connection // if (remote_cost > cost) cost = remote_cost; } qdr_connection_t *qdrc = qdr_connection_opened(router->router_core, inbound, role, cost, connection_id, name, pn_connection_remote_container(pn_conn), strip_annotations_in, strip_annotations_out, link_capacity); qd_connection_set_context(conn, qdrc); qdr_connection_set_context(qdrc, conn); }
pn_connection_t *pn_messenger_domain(pn_messenger_t *messenger, const char *domain) { char buf[domain ? strlen(domain) + 1 : 1]; if (domain) { strcpy(buf, domain); } else { buf[0] = '\0'; } char *user = NULL; char *pass = NULL; char *host = "0.0.0.0"; char *port = "5672"; parse_url(buf, &user, &pass, &host, &port); for (int i = 0; i < messenger->size; i++) { pn_connection_t *connection = pn_connector_connection(messenger->connectors[i]); const char *container = pn_connection_remote_container(connection); const char *hostname = pn_connection_hostname(connection); if (pn_streq(container, domain) || pn_streq(hostname, domain)) return connection; } pn_connector_t *connector = pn_connector(messenger->driver, host, port, NULL); if (!connector) return NULL; messenger->connectors[messenger->size++] = connector; pn_sasl_t *sasl = pn_connector_sasl(connector); if (user) { pn_sasl_plain(sasl, user, pass); } else { pn_sasl_mechanisms(sasl, "ANONYMOUS"); pn_sasl_client(sasl); } pn_connection_t *connection = pn_connection(); pn_connection_set_container(connection, messenger->name); pn_connection_set_hostname(connection, domain); pn_connection_open(connection); pn_connector_set_connection(connector, connection); return connection; }
std::string connection::container_id() const { return str(pn_connection_remote_container(pn_object())); }