| Index: webrtc/p2p/base/transportcontroller.cc
|
| diff --git a/webrtc/p2p/base/transportcontroller.cc b/webrtc/p2p/base/transportcontroller.cc
|
| index 053388eeb8130d30fec9a6fb5a21e94ec54a8b0a..128d2fc656406d75b7b094baf1e8a57cd32513e1 100644
|
| --- a/webrtc/p2p/base/transportcontroller.cc
|
| +++ b/webrtc/p2p/base/transportcontroller.cc
|
| @@ -127,6 +127,12 @@ bool TransportController::AddRemoteCandidates(const std::string& transport_name,
|
| transport_name, candidates, err));
|
| }
|
|
|
| +bool TransportController::RemoveRemoteCandidates(const Candidates& candidates,
|
| + std::string* err) {
|
| + return worker_thread_->Invoke<bool>(rtc::Bind(
|
| + &TransportController::RemoveRemoteCandidates_w, this, candidates, err));
|
| +}
|
| +
|
| bool TransportController::ReadyForRemoteCandidates(
|
| const std::string& transport_name) {
|
| return worker_thread_->Invoke<bool>(rtc::Bind(
|
| @@ -162,6 +168,8 @@ TransportChannel* TransportController::CreateTransportChannel_w(
|
| this, &TransportController::OnChannelGatheringState_w);
|
| channel->SignalCandidateGathered.connect(
|
| this, &TransportController::OnChannelCandidateGathered_w);
|
| + channel->SignalCandidatesRemoved.connect(
|
| + this, &TransportController::OnChannelCandidatesRemoved_w);
|
| channel->SignalRoleConflict.connect(
|
| this, &TransportController::OnChannelRoleConflict_w);
|
| channel->SignalConnectionRemoved.connect(
|
| @@ -460,6 +468,28 @@ bool TransportController::AddRemoteCandidates_w(
|
| return transport->AddRemoteCandidates(candidates, err);
|
| }
|
|
|
| +bool TransportController::RemoveRemoteCandidates_w(const Candidates& candidates,
|
| + std::string* err) {
|
| + RTC_DCHECK(worker_thread()->IsCurrent());
|
| + std::map<std::string, Candidates> candidates_by_transport_name;
|
| + for (const Candidate& cand : candidates) {
|
| + RTC_DCHECK(!cand.transport_name().empty());
|
| + candidates_by_transport_name[cand.transport_name()].push_back(cand);
|
| + }
|
| +
|
| + bool result = true;
|
| + for (auto kv : candidates_by_transport_name) {
|
| + Transport* transport = GetTransport_w(kv.first);
|
| + if (!transport) {
|
| + // If we didn't find a transport, that's not an error;
|
| + // it could have been deleted as a result of bundling.
|
| + continue;
|
| + }
|
| + result &= transport->RemoveRemoteCandidates(kv.second, err);
|
| + }
|
| + return result;
|
| +}
|
| +
|
| bool TransportController::ReadyForRemoteCandidates_w(
|
| const std::string& transport_name) {
|
| RTC_DCHECK(worker_thread()->IsCurrent());
|
| @@ -518,6 +548,21 @@ void TransportController::OnChannelCandidateGathered_w(
|
| signaling_thread_->Post(this, MSG_CANDIDATESGATHERED, data);
|
| }
|
|
|
| +void TransportController::OnChannelCandidatesRemoved_w(
|
| + TransportChannelImpl* channel,
|
| + const Candidates& candidates) {
|
| + invoker_.AsyncInvoke<void>(
|
| + signaling_thread_,
|
| + rtc::Bind(&TransportController::OnChannelCandidatesRemoved, this,
|
| + candidates));
|
| +}
|
| +
|
| +void TransportController::OnChannelCandidatesRemoved(
|
| + const Candidates& candidates) {
|
| + RTC_DCHECK(signaling_thread_->IsCurrent());
|
| + SignalCandidatesRemoved(candidates);
|
| +}
|
| +
|
| void TransportController::OnChannelRoleConflict_w(
|
| TransportChannelImpl* channel) {
|
| RTC_DCHECK(worker_thread_->IsCurrent());
|
|
|