OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "remoting/protocol/libjingle_transport_factory.h" | 5 #include "remoting/protocol/libjingle_transport_factory.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/callback.h" | 9 #include "base/callback.h" |
10 #include "base/callback_helpers.h" | 10 #include "base/callback_helpers.h" |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
72 const std::string& password) override; | 72 const std::string& password) override; |
73 void AddRemoteCandidate(const cricket::Candidate& candidate) override; | 73 void AddRemoteCandidate(const cricket::Candidate& candidate) override; |
74 const std::string& name() const override; | 74 const std::string& name() const override; |
75 bool is_connected() const override; | 75 bool is_connected() const override; |
76 | 76 |
77 private: | 77 private: |
78 void DoStart(); | 78 void DoStart(); |
79 void NotifyConnected(); | 79 void NotifyConnected(); |
80 | 80 |
81 // Signal handlers for cricket::TransportChannel. | 81 // Signal handlers for cricket::TransportChannel. |
82 void OnRequestSignaling(cricket::TransportChannelImpl* channel); | 82 void OnCandidateGathered(cricket::TransportChannelImpl* channel, |
83 void OnCandidateReady(cricket::TransportChannelImpl* channel, | 83 const cricket::Candidate& candidate); |
84 const cricket::Candidate& candidate); | |
85 void OnRouteChange(cricket::TransportChannel* channel, | 84 void OnRouteChange(cricket::TransportChannel* channel, |
86 const cricket::Candidate& candidate); | 85 const cricket::Candidate& candidate); |
87 void OnWritableState(cricket::TransportChannel* channel); | 86 void OnWritableState(cricket::TransportChannel* channel); |
88 | 87 |
89 // Callback for TransportChannelSocketAdapter to notify when the socket is | 88 // Callback for TransportChannelSocketAdapter to notify when the socket is |
90 // destroyed. | 89 // destroyed. |
91 void OnChannelDestroyed(); | 90 void OnChannelDestroyed(); |
92 | 91 |
93 void NotifyRouteChanged(); | 92 void NotifyRouteChanged(); |
94 | 93 |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
154 if (!callback_.is_null()) | 153 if (!callback_.is_null()) |
155 DoStart(); | 154 DoStart(); |
156 | 155 |
157 // Pass pending ICE credentials and candidates to the channel. | 156 // Pass pending ICE credentials and candidates to the channel. |
158 if (!remote_ice_username_fragment_.empty()) { | 157 if (!remote_ice_username_fragment_.empty()) { |
159 channel_->SetRemoteIceCredentials(remote_ice_username_fragment_, | 158 channel_->SetRemoteIceCredentials(remote_ice_username_fragment_, |
160 remote_ice_password_); | 159 remote_ice_password_); |
161 } | 160 } |
162 | 161 |
163 while (!pending_candidates_.empty()) { | 162 while (!pending_candidates_.empty()) { |
164 channel_->OnCandidate(pending_candidates_.front()); | 163 channel_->AddRemoteCandidate(pending_candidates_.front()); |
165 pending_candidates_.pop_front(); | 164 pending_candidates_.pop_front(); |
166 } | 165 } |
167 } | 166 } |
168 | 167 |
169 void LibjingleTransport::Connect( | 168 void LibjingleTransport::Connect( |
170 const std::string& name, | 169 const std::string& name, |
171 Transport::EventHandler* event_handler, | 170 Transport::EventHandler* event_handler, |
172 const Transport::ConnectedCallback& callback) { | 171 const Transport::ConnectedCallback& callback) { |
173 DCHECK(CalledOnValidThread()); | 172 DCHECK(CalledOnValidThread()); |
174 DCHECK(!name.empty()); | 173 DCHECK(!name.empty()); |
(...skipping 17 matching lines...) Expand all Loading... |
192 channel_.reset(new cricket::P2PTransportChannel( | 191 channel_.reset(new cricket::P2PTransportChannel( |
193 std::string(), 0, nullptr, port_allocator_)); | 192 std::string(), 0, nullptr, port_allocator_)); |
194 std::string ice_password = rtc::CreateRandomString(cricket::ICE_PWD_LENGTH); | 193 std::string ice_password = rtc::CreateRandomString(cricket::ICE_PWD_LENGTH); |
195 channel_->SetIceProtocolType(cricket::ICEPROTO_RFC5245); | 194 channel_->SetIceProtocolType(cricket::ICEPROTO_RFC5245); |
196 channel_->SetIceRole((role_ == TransportRole::CLIENT) | 195 channel_->SetIceRole((role_ == TransportRole::CLIENT) |
197 ? cricket::ICEROLE_CONTROLLING | 196 ? cricket::ICEROLE_CONTROLLING |
198 : cricket::ICEROLE_CONTROLLED); | 197 : cricket::ICEROLE_CONTROLLED); |
199 event_handler_->OnTransportIceCredentials(this, ice_username_fragment_, | 198 event_handler_->OnTransportIceCredentials(this, ice_username_fragment_, |
200 ice_password); | 199 ice_password); |
201 channel_->SetIceCredentials(ice_username_fragment_, ice_password); | 200 channel_->SetIceCredentials(ice_username_fragment_, ice_password); |
202 channel_->SignalRequestSignaling.connect( | 201 channel_->SignalCandidateGathered.connect( |
203 this, &LibjingleTransport::OnRequestSignaling); | 202 this, &LibjingleTransport::OnCandidateGathered); |
204 channel_->SignalCandidateReady.connect( | |
205 this, &LibjingleTransport::OnCandidateReady); | |
206 channel_->SignalRouteChange.connect( | 203 channel_->SignalRouteChange.connect( |
207 this, &LibjingleTransport::OnRouteChange); | 204 this, &LibjingleTransport::OnRouteChange); |
208 channel_->SignalWritableState.connect( | 205 channel_->SignalWritableState.connect( |
209 this, &LibjingleTransport::OnWritableState); | 206 this, &LibjingleTransport::OnWritableState); |
210 channel_->set_incoming_only( | 207 channel_->set_incoming_only( |
211 !(network_settings_.flags & NetworkSettings::NAT_TRAVERSAL_OUTGOING)); | 208 !(network_settings_.flags & NetworkSettings::NAT_TRAVERSAL_OUTGOING)); |
212 | 209 |
213 channel_->Connect(); | 210 channel_->Connect(); |
| 211 channel_->MaybeStartGathering(); |
214 | 212 |
215 --connect_attempts_left_; | 213 --connect_attempts_left_; |
216 | 214 |
217 // Start reconnection timer. | 215 // Start reconnection timer. |
218 reconnect_timer_.Start( | 216 reconnect_timer_.Start( |
219 FROM_HERE, base::TimeDelta::FromSeconds(kReconnectDelaySeconds), | 217 FROM_HERE, base::TimeDelta::FromSeconds(kReconnectDelaySeconds), |
220 this, &LibjingleTransport::TryReconnect); | 218 this, &LibjingleTransport::TryReconnect); |
221 | 219 |
222 base::ThreadTaskRunnerHandle::Get()->PostTask( | 220 base::ThreadTaskRunnerHandle::Get()->PostTask( |
223 FROM_HERE, base::Bind(&LibjingleTransport::NotifyConnected, | 221 FROM_HERE, base::Bind(&LibjingleTransport::NotifyConnected, |
(...skipping 25 matching lines...) Expand all Loading... |
249 DCHECK(CalledOnValidThread()); | 247 DCHECK(CalledOnValidThread()); |
250 | 248 |
251 // To enforce the no-relay setting, it's not enough to not produce relay | 249 // To enforce the no-relay setting, it's not enough to not produce relay |
252 // candidates. It's also necessary to discard remote relay candidates. | 250 // candidates. It's also necessary to discard remote relay candidates. |
253 bool relay_allowed = (network_settings_.flags & | 251 bool relay_allowed = (network_settings_.flags & |
254 NetworkSettings::NAT_TRAVERSAL_RELAY) != 0; | 252 NetworkSettings::NAT_TRAVERSAL_RELAY) != 0; |
255 if (!relay_allowed && candidate.type() == cricket::RELAY_PORT_TYPE) | 253 if (!relay_allowed && candidate.type() == cricket::RELAY_PORT_TYPE) |
256 return; | 254 return; |
257 | 255 |
258 if (channel_) { | 256 if (channel_) { |
259 channel_->OnCandidate(candidate); | 257 channel_->AddRemoteCandidate(candidate); |
260 } else { | 258 } else { |
261 pending_candidates_.push_back(candidate); | 259 pending_candidates_.push_back(candidate); |
262 } | 260 } |
263 } | 261 } |
264 | 262 |
265 const std::string& LibjingleTransport::name() const { | 263 const std::string& LibjingleTransport::name() const { |
266 DCHECK(CalledOnValidThread()); | 264 DCHECK(CalledOnValidThread()); |
267 return name_; | 265 return name_; |
268 } | 266 } |
269 | 267 |
270 bool LibjingleTransport::is_connected() const { | 268 bool LibjingleTransport::is_connected() const { |
271 DCHECK(CalledOnValidThread()); | 269 DCHECK(CalledOnValidThread()); |
272 return callback_.is_null(); | 270 return callback_.is_null(); |
273 } | 271 } |
274 | 272 |
275 void LibjingleTransport::OnRequestSignaling( | 273 void LibjingleTransport::OnCandidateGathered( |
276 cricket::TransportChannelImpl* channel) { | |
277 DCHECK(CalledOnValidThread()); | |
278 channel_->OnSignalingReady(); | |
279 } | |
280 | |
281 void LibjingleTransport::OnCandidateReady( | |
282 cricket::TransportChannelImpl* channel, | 274 cricket::TransportChannelImpl* channel, |
283 const cricket::Candidate& candidate) { | 275 const cricket::Candidate& candidate) { |
284 DCHECK(CalledOnValidThread()); | 276 DCHECK(CalledOnValidThread()); |
285 event_handler_->OnTransportCandidate(this, candidate); | 277 event_handler_->OnTransportCandidate(this, candidate); |
286 } | 278 } |
287 | 279 |
288 void LibjingleTransport::OnRouteChange( | 280 void LibjingleTransport::OnRouteChange( |
289 cricket::TransportChannel* channel, | 281 cricket::TransportChannel* channel, |
290 const cricket::Candidate& candidate) { | 282 const cricket::Candidate& candidate) { |
291 // Ignore notifications if the channel is not writable. | 283 // Ignore notifications if the channel is not writable. |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
446 last_jingle_info_update_time_ = base::TimeTicks::Now(); | 438 last_jingle_info_update_time_ = base::TimeTicks::Now(); |
447 | 439 |
448 while (!on_jingle_info_callbacks_.empty()) { | 440 while (!on_jingle_info_callbacks_.empty()) { |
449 on_jingle_info_callbacks_.begin()->Run(); | 441 on_jingle_info_callbacks_.begin()->Run(); |
450 on_jingle_info_callbacks_.pop_front(); | 442 on_jingle_info_callbacks_.pop_front(); |
451 } | 443 } |
452 } | 444 } |
453 | 445 |
454 } // namespace protocol | 446 } // namespace protocol |
455 } // namespace remoting | 447 } // namespace remoting |
OLD | NEW |