static void pni_connection_finalize(pn_selectable_t *sel) { pn_reactor_t *reactor = (pn_reactor_t *) pni_selectable_get_context(sel); pn_transport_t *transport = pni_transport(sel); pn_record_t *record = pn_transport_attachments(transport); pn_record_set(record, PN_TRANCTX, NULL); pn_socket_t fd = pn_selectable_get_fd(sel); pn_close(pni_reactor_io(reactor), fd); }
pn_selectable_t *pn_reactor_selectable_transport(pn_reactor_t *reactor, pn_socket_t sock, pn_transport_t *transport) { pn_selectable_t *sel = pn_reactor_selectable(reactor); pn_selectable_set_fd(sel, sock); pn_selectable_on_readable(sel, pni_connection_readable); pn_selectable_on_writable(sel, pni_connection_writable); pn_selectable_on_error(sel, pni_connection_error); pn_selectable_on_expired(sel, pni_connection_expired); pn_selectable_on_finalize(sel, pni_connection_finalize); pn_record_t *record = pn_selectable_attachments(sel); pn_record_def(record, PN_TRANCTX, PN_OBJECT); pn_record_set(record, PN_TRANCTX, transport); pn_record_t *tr = pn_transport_attachments(transport); pn_record_def(tr, PN_TRANCTX, PN_WEAKREF); pn_record_set(tr, PN_TRANCTX, sel); pni_connection_update(sel); pn_reactor_update(reactor, sel); return sel; }
// If the context is not present, create it with value x. template <class T> static T& ref(id id_) { T* ctx = context::ptr<T>(id_); if (!ctx) { ctx = create<T>(); pn_record_def(id_.first, id_.second, pn_class()); pn_record_set(id_.first, id_.second, ctx); pn_decref(ctx); } return *ctx; }
void pni_reactor_set_connection_peer_address(pn_connection_t *connection, const char *host, const char *port) { pn_url_t *url = pn_url(); pn_url_set_host(url, host); pn_url_set_port(url, port); pn_record_t *record = pn_connection_attachments(connection); if (!pn_record_has(record, PNI_CONN_PEER_ADDRESS)) { pn_record_def(record, PNI_CONN_PEER_ADDRESS, PN_OBJECT); } pn_record_set(record, PNI_CONN_PEER_ADDRESS, url); pn_decref(url); }
void pn_reactor_set_connection_host(pn_reactor_t *reactor, pn_connection_t *connection, const char *host, const char *port) { (void)reactor; // ignored pn_url_t *url = pn_url(); pn_url_set_host(url, host); pn_url_set_port(url, port); pn_record_t *record = pn_connection_attachments(connection); if (!pn_record_has(record, PNI_CONN_URL)) { pn_record_def(record, PNI_CONN_URL, PN_OBJECT); } pn_record_set(record, PNI_CONN_URL, url); pn_decref(url); }