nsresult PeerConnectionMedia::Init(const std::vector<NrIceStunServer>& stun_servers, const std::vector<NrIceTurnServer>& turn_servers, NrIceCtx::Policy policy) { nsresult rv = InitProxy(); NS_ENSURE_SUCCESS(rv, rv); #if !defined(MOZILLA_EXTERNAL_LINKAGE) bool ice_tcp = Preferences::GetBool("media.peerconnection.ice.tcp", false); #else bool ice_tcp = false; #endif bool default_address_only = GetPrefDefaultAddressOnly(); // TODO([email protected]): need some way to set not offerer later // Looks like a bug in the NrIceCtx API. mIceCtxHdlr = NrIceCtxHandler::Create("PC:" + mParentName, true, // Offerer mParent->GetAllowIceLoopback(), ice_tcp, mParent->GetAllowIceLinkLocal(), default_address_only, policy); if(!mIceCtxHdlr) { CSFLogError(logTag, "%s: Failed to create Ice Context", __FUNCTION__); return NS_ERROR_FAILURE; } if (NS_FAILED(rv = mIceCtxHdlr->ctx()->SetStunServers(stun_servers))) { CSFLogError(logTag, "%s: Failed to set stun servers", __FUNCTION__); return rv; } // Give us a way to globally turn off TURN support #if !defined(MOZILLA_EXTERNAL_LINKAGE) bool disabled = Preferences::GetBool("media.peerconnection.turn.disable", false); #else bool disabled = false; #endif if (!disabled) { if (NS_FAILED(rv = mIceCtxHdlr->ctx()->SetTurnServers(turn_servers))) { CSFLogError(logTag, "%s: Failed to set turn servers", __FUNCTION__); return rv; } } else if (turn_servers.size() != 0) { CSFLogError(logTag, "%s: Setting turn servers disabled", __FUNCTION__); } if (NS_FAILED(rv = mDNSResolver->Init())) { CSFLogError(logTag, "%s: Failed to initialize dns resolver", __FUNCTION__); return rv; } if (NS_FAILED(rv = mIceCtxHdlr->ctx()->SetResolver(mDNSResolver->AllocateResolver()))) { CSFLogError(logTag, "%s: Failed to get dns resolver", __FUNCTION__); return rv; } ConnectSignals(mIceCtxHdlr->ctx().get()); return NS_OK; }
void PeerConnectionMedia::GatherIfReady() { ASSERT_ON_THREAD(mMainThread); nsCOMPtr<nsIRunnable> runnable(WrapRunnable( RefPtr<PeerConnectionMedia>(this), &PeerConnectionMedia::EnsureIceGathering_s, GetPrefDefaultAddressOnly(), GetPrefProxyOnly())); PerformOrEnqueueIceCtxOperation(runnable); }
void PeerConnectionMedia::BeginIceRestart(const std::string& ufrag, const std::string& pwd) { ASSERT_ON_THREAD(mMainThread); if (IsIceRestarting()) { return; } bool default_address_only = GetPrefDefaultAddressOnly(); RefPtr<NrIceCtx> new_ctx = mIceCtxHdlr->CreateCtx(ufrag, pwd, default_address_only); RUN_ON_THREAD(GetSTSThread(), WrapRunnable( RefPtr<PeerConnectionMedia>(this), &PeerConnectionMedia::BeginIceRestart_s, new_ctx), NS_DISPATCH_NORMAL); mIceRestartState = ICE_RESTART_PROVISIONAL; }