/** * Link Detached Handler */ static int AMQP_link_detach_handler(void* context, qd_link_t *link, qd_detach_type_t dt) { qdr_link_t *rlink = (qdr_link_t*) qd_link_get_context(link); pn_condition_t *cond = qd_link_pn(link) ? pn_link_remote_condition(qd_link_pn(link)) : 0; if (rlink) { qdr_error_t *error = qdr_error_from_pn(cond); qdr_link_detach(rlink, dt, error); // // This is the last event for this link that we will send into the core. Remove the // core linkage. Note that the core->qd linkage is still in place. // qd_link_set_context(link, 0); // // If the link was lost (due to connection drop), or the linkage from the core // object is already gone, finish disconnecting the linkage and free the qd_link // because the core will silently free its own resources. // if (dt == QD_LOST || qdr_link_get_context(rlink) == 0) { qdr_link_set_context(rlink, 0); qd_link_free(link); } } return 0; }
void messaging_adapter::on_link_remote_close(proton_event &pe) { pn_event_t *cevent = pe.pn_event(); pn_link_t *lnk = pn_event_link(cevent); if (pn_link_is_receiver(lnk)) { receiver r(make_wrapper<receiver>(lnk)); if (pn_condition_is_set(pn_link_remote_condition(lnk))) { delegate_.on_receiver_error(r); } delegate_.on_receiver_close(r); } else { sender s(make_wrapper<sender>(lnk)); if (pn_condition_is_set(pn_link_remote_condition(lnk))) { delegate_.on_sender_error(s); } delegate_.on_sender_close(s); } pn_link_close(lnk); }
void messaging_adapter::on_link_remote_close(event &e) { proton_event *pe = dynamic_cast<proton_event*>(&e); if (pe) { pn_event_t *cevent = pe->pn_event(); pn_link_t *lnk = pn_event_link(cevent); if (pn_condition_is_set(pn_link_remote_condition(lnk))) { messaging_event mevent(messaging_event::LINK_ERROR, *pe); on_link_error(mevent); } else { messaging_event mevent(messaging_event::LINK_CLOSE, *pe); on_link_close(mevent); } pn_link_close(lnk); } }
error_condition link::error() const { return make_wrapper(pn_link_remote_condition(pn_object())); }
condition link::remote_condition() const { return condition(pn_link_remote_condition(pn_object())); }