blob: 1c9dc5dd496742834aa4c492d1b01c3be3655b17 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/modules/peerconnection/adapters/ice_transport_proxy.h"
#include "third_party/blink/renderer/core/frame/local_frame.h"
#include "third_party/blink/renderer/modules/peerconnection/adapters/ice_transport_host.h"
#include "third_party/blink/renderer/modules/peerconnection/adapters/web_rtc_cross_thread_copier.h"
#include "third_party/blink/renderer/platform/cross_thread_functional.h"
#include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
namespace blink {
IceTransportProxy::IceTransportProxy(
LocalFrame& frame,
scoped_refptr<base::SingleThreadTaskRunner> proxy_thread,
scoped_refptr<base::SingleThreadTaskRunner> host_thread,
Delegate* delegate,
std::unique_ptr<IceTransportAdapterCrossThreadFactory> adapter_factory)
: proxy_thread_(std::move(proxy_thread)),
host_thread_(std::move(host_thread)),
host_(nullptr, base::OnTaskRunnerDeleter(host_thread_)),
delegate_(delegate),
connection_handle_for_scheduler_(
frame.GetFrameScheduler()->OnActiveConnectionCreated()),
weak_ptr_factory_(this) {
DCHECK(host_thread_);
DCHECK(delegate_);
DCHECK(adapter_factory);
DCHECK(proxy_thread_->BelongsToCurrentThread());
adapter_factory->InitializeOnMainThread(frame);
// Wait to initialize the host until the weak_ptr_factory_ is initialized.
// The IceTransportHost is constructed on the proxy thread but should only be
// interacted with via PostTask to the host thread. The OnTaskRunnerDeleter
// (configured above) will ensure it gets deleted on the host thread.
host_.reset(new IceTransportHost(proxy_thread_, host_thread_,
weak_ptr_factory_.GetWeakPtr()));
PostCrossThreadTask(*host_thread_, FROM_HERE,
CrossThreadBind(&IceTransportHost::Initialize,
CrossThreadUnretained(host_.get()),
WTF::Passed(std::move(adapter_factory))));
}
IceTransportProxy::~IceTransportProxy() {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
DCHECK(!HasConsumer());
// Note: The IceTransportHost will be deleted on the host thread.
}
scoped_refptr<base::SingleThreadTaskRunner> IceTransportProxy::proxy_thread()
const {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
return proxy_thread_;
}
scoped_refptr<base::SingleThreadTaskRunner> IceTransportProxy::host_thread()
const {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
return host_thread_;
}
void IceTransportProxy::StartGathering(
const cricket::IceParameters& local_parameters,
const cricket::ServerAddresses& stun_servers,
const std::vector<cricket::RelayServerConfig>& turn_servers,
IceTransportPolicy policy) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
PostCrossThreadTask(
*host_thread_, FROM_HERE,
CrossThreadBind(&IceTransportHost::StartGathering,
CrossThreadUnretained(host_.get()), local_parameters,
stun_servers, turn_servers, policy));
}
void IceTransportProxy::Start(
const cricket::IceParameters& remote_parameters,
cricket::IceRole role,
const std::vector<cricket::Candidate>& initial_remote_candidates) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
PostCrossThreadTask(
*host_thread_, FROM_HERE,
CrossThreadBind(&IceTransportHost::Start,
CrossThreadUnretained(host_.get()), remote_parameters,
role, initial_remote_candidates));
}
void IceTransportProxy::HandleRemoteRestart(
const cricket::IceParameters& new_remote_parameters) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
PostCrossThreadTask(*host_thread_, FROM_HERE,
CrossThreadBind(&IceTransportHost::HandleRemoteRestart,
CrossThreadUnretained(host_.get()),
new_remote_parameters));
}
void IceTransportProxy::AddRemoteCandidate(
const cricket::Candidate& candidate) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
PostCrossThreadTask(
*host_thread_, FROM_HERE,
CrossThreadBind(&IceTransportHost::AddRemoteCandidate,
CrossThreadUnretained(host_.get()), candidate));
}
bool IceTransportProxy::HasConsumer() const {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
return consumer_proxy_;
}
IceTransportHost* IceTransportProxy::ConnectConsumer(
QuicTransportProxy* consumer_proxy) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
DCHECK(consumer_proxy);
DCHECK(!consumer_proxy_);
consumer_proxy_ = consumer_proxy;
return host_.get();
}
void IceTransportProxy::DisconnectConsumer(QuicTransportProxy* consumer_proxy) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
DCHECK(consumer_proxy);
DCHECK_EQ(consumer_proxy, consumer_proxy_);
consumer_proxy_ = nullptr;
}
void IceTransportProxy::OnGatheringStateChanged(
cricket::IceGatheringState new_state) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
delegate_->OnGatheringStateChanged(new_state);
}
void IceTransportProxy::OnCandidateGathered(
const cricket::Candidate& candidate) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
delegate_->OnCandidateGathered(candidate);
}
void IceTransportProxy::OnStateChanged(cricket::IceTransportState new_state) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
delegate_->OnStateChanged(new_state);
}
void IceTransportProxy::OnSelectedCandidatePairChanged(
const std::pair<cricket::Candidate, cricket::Candidate>&
selected_candidate_pair) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
delegate_->OnSelectedCandidatePairChanged(selected_candidate_pair);
}
} // namespace blink