diff --git a/daemon/src/sip/siptransport.cpp b/daemon/src/sip/siptransport.cpp index 2c661ff0dbfce876a3ed2edf9835eea6178a09b9..fe2019e091ddf29406379a67041f3c48a48abc56 100644 --- a/daemon/src/sip/siptransport.cpp +++ b/daemon/src/sip/siptransport.cpp @@ -167,13 +167,6 @@ SipTransportBroker::SipTransportBroker(pjsip_endpoint *endpt, pj_caching_pool& cp, pj_pool_t& pool) : cp_(cp), pool_(pool), endpt_(endpt) { - auto status = pjsip_tpmgr_set_state_cb(pjsip_endpt_get_tpmgr(endpt_), - SipTransportBroker::tp_state_callback); - if (status != PJ_SUCCESS) { - RING_ERR("Can't set transport callback"); - sip_utils::sip_strerror(status); - } - #if HAVE_DHT pjsip_transport_register_type(PJSIP_TRANSPORT_DATAGRAM, "ICE", pjsip_transport_get_default_port_for_type(PJSIP_TRANSPORT_UDP), @@ -186,7 +179,6 @@ SipTransportBroker::~SipTransportBroker() RING_DBG("~SipTransportBroker@%p", this); shutdown(); - pjsip_tpmgr_set_state_cb(pjsip_endpt_get_tpmgr(endpt_), nullptr); udpTransports_.clear(); transports_.clear(); @@ -202,23 +194,6 @@ SipTransportBroker::~SipTransportBroker() RING_DBG("destroying SipTransportBroker@%p", this); } -/** static method (so C callable) used by PJSIP making interface to C++ */ -void -SipTransportBroker::tp_state_callback(pjsip_transport* tp, - pjsip_transport_state state, - const pjsip_transport_state_info* info) -{ - // There is no way (at writing) to link a user data to a PJSIP transport. - // So we obtain it from the global SIPVoIPLink instance that owns it. - // Be sure the broker's owner is not deleted during proccess - if (auto sipLink = getSIPVoIPLink()) { - if (auto& broker = sipLink->sipTransportBroker) - broker->transportStateChanged(tp, state, info); - else - RING_ERR("SIPVoIPLink with invalid SipTransportBroker"); - } -} - void SipTransportBroker::transportStateChanged(pjsip_transport* tp, pjsip_transport_state state, diff --git a/daemon/src/sip/siptransport.h b/daemon/src/sip/siptransport.h index 646117f34b15f17a891489849b166b2bbeeddbda..a5e36538f7160195528a506fcdd60e76d02fc06d 100644 --- a/daemon/src/sip/siptransport.h +++ b/daemon/src/sip/siptransport.h @@ -172,6 +172,8 @@ public: */ void shutdown(); + void transportStateChanged(pjsip_transport*, pjsip_transport_state, const pjsip_transport_state_info*); + private: NON_COPYABLE(SipTransportBroker); @@ -183,10 +185,6 @@ private: */ std::shared_ptr<SipTransport> createUdpTransport(const SipTransportDescr&); - static void tp_state_callback(pjsip_transport*, pjsip_transport_state, const pjsip_transport_state_info*); - - void transportStateChanged(pjsip_transport*, pjsip_transport_state, const pjsip_transport_state_info*); - /** * List of transports so we can bubble the events up. */ diff --git a/daemon/src/sip/sipvoiplink.cpp b/daemon/src/sip/sipvoiplink.cpp index ebf0954dbc56064a5879e698ec3b51fdcb45ed83..3b00037b414b8675a0cb3fdb5f0786c58472b1f7 100644 --- a/daemon/src/sip/sipvoiplink.cpp +++ b/daemon/src/sip/sipvoiplink.cpp @@ -463,6 +463,22 @@ transaction_request_cb(pjsip_rx_data *rdata) return PJ_FALSE; } +static void +tp_state_callback(pjsip_transport* tp, pjsip_transport_state state, + const pjsip_transport_state_info* info) +{ + // There is no way (at writing) to link a user data to a PJSIP transport. + // So we obtain it from the global SIPVoIPLink instance that owns it. + // Be sure the broker's owner is not deleted during proccess + if (auto sipLink = getSIPVoIPLink()) { + if (auto& broker = sipLink->sipTransportBroker) + broker->transportStateChanged(tp, state, info); + else + RING_ERR("SIPVoIPLink with invalid SipTransportBroker"); + } else + RING_ERR("no more VoIP link"); +} + /*************************************************************************************************/ pjsip_endpoint * SIPVoIPLink::getEndpoint() @@ -513,6 +529,13 @@ SIPVoIPLink::SIPVoIPLink() sipTransportBroker.reset(new SipTransportBroker(endpt_, *cp_, *pool_)); + auto status = pjsip_tpmgr_set_state_cb(pjsip_endpt_get_tpmgr(endpt_), + tp_state_callback); + if (status != PJ_SUCCESS) { + RING_ERR("Can't set transport callback"); + sip_utils::sip_strerror(status); + } + if (!ip_utils::getLocalAddr()) throw VoipLinkException("UserAgent: Unable to determine network capabilities"); @@ -594,6 +617,8 @@ SIPVoIPLink::~SIPVoIPLink() RING_ERR("%d SIP calls remains!", Manager::instance().callFactory.callCount<SIPCall>()); + pjsip_tpmgr_set_state_cb(pjsip_endpt_get_tpmgr(endpt_), nullptr); + // destroy SIP transport before endpoint sipTransportBroker.reset();