/** * Handler for remote opening of links that we initiated. */ static int AMQP_link_attach_handler(void* context, qd_link_t *link) { qdr_link_t *qlink = (qdr_link_t*) qd_link_get_context(link); qdr_link_second_attach(qlink, qdr_terminus(qd_link_remote_source(link)), qdr_terminus(qd_link_remote_target(link))); return 0; }
/** * New Outgoing Link Handler */ static int AMQP_outgoing_link_handler(void* context, qd_link_t *link) { qd_connection_t *conn = qd_link_connection(link); qdr_connection_t *qdr_conn = (qdr_connection_t*) qd_connection_get_context(conn); qdr_link_t *qdr_link = qdr_link_first_attach(qdr_conn, QD_OUTGOING, qdr_terminus(qd_link_remote_source(link)), qdr_terminus(qd_link_remote_target(link)), pn_link_name(qd_link_pn(link))); qdr_link_set_context(qdr_link, link); qd_link_set_context(link, qdr_link); return 0; }
static void qdr_auto_link_activate_CT(qdr_core_t *core, qdr_auto_link_t *al, qdr_connection_t *conn) { const char *key; qdr_route_log_CT(core, "Auto Link Activated", al->name, al->identity, conn); if (al->addr) { qdr_terminus_t *source = 0; qdr_terminus_t *target = 0; qdr_terminus_t *term = qdr_terminus(0); if (al->dir == QD_INCOMING) source = term; else target = term; key = (const char*) qd_hash_key_by_handle(al->addr->hash_handle); if (key || al->external_addr) { if (al->external_addr) qdr_terminus_set_address(term, al->external_addr); else qdr_terminus_set_address(term, &key[2]); // truncate the "Mp" annotation (where p = phase) al->link = qdr_create_link_CT(core, conn, QD_LINK_ENDPOINT, al->dir, source, target); al->link->auto_link = al; al->state = QDR_AUTO_LINK_STATE_ATTACHING; } } }