diff --git a/daemon/src/call.cpp b/daemon/src/call.cpp index 0873fe8ef46853862b21edb5a811f3d9099e7ee5..b326657875139583f1af224cecdc35686cc8d650 100644 --- a/daemon/src/call.cpp +++ b/daemon/src/call.cpp @@ -265,12 +265,13 @@ Call::getNullDetails() }; } -void +bool Call::initIceTransport(bool master, unsigned channel_num) { auto& iceTransportFactory = Manager::instance().getIceTransportFactory(); iceTransport_ = iceTransportFactory.createTransport(getCallId().c_str(), channel_num, master, account_.getUPnPActive()); + return static_cast<bool>(iceTransport_); } int diff --git a/daemon/src/call.h b/daemon/src/call.h index 1ad4c207dfaa89e7e10815dcf21d11256a0a3f0e..d148a40e362f73cef4fb4691fba24309265b8c83 100644 --- a/daemon/src/call.h +++ b/daemon/src/call.h @@ -303,7 +303,7 @@ class Call : public Recordable, public std::enable_shared_from_this<Call> { void removeCall(); - void initIceTransport(bool master, unsigned channel_num=4); + bool initIceTransport(bool master, unsigned channel_num=4); int waitForIceInitialization(unsigned timeout); diff --git a/daemon/src/ice_transport.cpp b/daemon/src/ice_transport.cpp index afa7e6a6dfda87c754a90d533640e623add0407d..d0e9afbd7f6de3752e1358b757c0d884e67de178 100644 --- a/daemon/src/ice_transport.cpp +++ b/daemon/src/ice_transport.cpp @@ -835,9 +835,14 @@ IceTransportFactory::createTransport(const char* name, IceTransportCompleteCb&& on_initdone_cb, IceTransportCompleteCb&& on_negodone_cb) { - return std::make_shared<IceTransport>(name, component_count, master, upnp_enabled, - std::forward<IceTransportCompleteCb>(on_initdone_cb), - std::forward<IceTransportCompleteCb>(on_negodone_cb)); + try { + return std::make_shared<IceTransport>(name, component_count, master, upnp_enabled, + std::forward<IceTransportCompleteCb>(on_initdone_cb), + std::forward<IceTransportCompleteCb>(on_negodone_cb)); + } catch(const std::exception& e) { + RING_ERR("%s",e.what()); + return nullptr; + } } void diff --git a/daemon/src/sip/sipaccount.cpp b/daemon/src/sip/sipaccount.cpp index 018e1d9b897067877f98b55aefdbd820a58337d9..d7703763a46867d7c1ac1a864372ca46e0a680d4 100644 --- a/daemon/src/sip/sipaccount.cpp +++ b/daemon/src/sip/sipaccount.cpp @@ -330,7 +330,7 @@ SIPAccount::newOutgoingCall(const std::string& toUrl) bool SIPAccount::SIPStartCall(std::shared_ptr<SIPCall>& call) { - // Add Ice headers to local SDP + // Add Ice headers to local SDP if ice transport exist call->setupLocalSDPFromIce(); std::string toUri(call->getPeerNumber()); // expecting a fully well formed sip uri diff --git a/daemon/src/sip/sipcall.cpp b/daemon/src/sip/sipcall.cpp index af66eeb21e74a2852c544f58cbf5a52075e2163f..c7d17c0539b779b9b3b9345bac07650b6bbfa042 100644 --- a/daemon/src/sip/sipcall.cpp +++ b/daemon/src/sip/sipcall.cpp @@ -230,8 +230,9 @@ SIPCall::SIPSessionReinvite() acc.getActiveAccountCodecInfoList(acc.isVideoEnabled() ? MEDIA_VIDEO : MEDIA_NONE), acc.getSrtpKeyExchange(), getState() == Call::HOLD); - initIceTransport(true); - setupLocalSDPFromIce(); + if (initIceTransport(true)) + setupLocalSDPFromIce(); + pjmedia_sdp_session *local_sdp = sdp_->getLocalSdpSession(); pjsip_tx_data *tdata; @@ -701,6 +702,11 @@ SIPCall::onAnswered() void SIPCall::setupLocalSDPFromIce() { + if (not iceTransport_) { + RING_WARN("null icetransport: no attributes added to SDP"); + return; + } + if (waitForIceInitialization(DEFAULT_ICE_INIT_TIMEOUT) <= 0) { RING_ERR("ICE init failed, ICE will not be used for medias"); return; @@ -879,8 +885,8 @@ SIPCall::onReceiveOffer(const pjmedia_sdp_session* offer) ); auto ice_attrs = Sdp::getIceAttributes(offer); if (not ice_attrs.ufrag.empty() and not ice_attrs.pwd.empty()) { - initIceTransport(false); - setupLocalSDPFromIce(); + if (initIceTransport(false)) + setupLocalSDPFromIce(); } sdp_->startNegotiation(); pjsip_inv_set_sdp_answer(inv.get(), sdp_->getLocalSdpSession());