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 "base/callback.h" | 7 #include "base/callback.h" |
8 #include "base/single_thread_task_runner.h" | 8 #include "base/single_thread_task_runner.h" |
9 #include "base/thread_task_runner_handle.h" | 9 #include "base/thread_task_runner_handle.h" |
10 #include "base/timer/timer.h" | 10 #include "base/timer/timer.h" |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 virtual void Connect( | 48 virtual void Connect( |
49 const std::string& name, | 49 const std::string& name, |
50 Transport::EventHandler* event_handler, | 50 Transport::EventHandler* event_handler, |
51 const Transport::ConnectedCallback& callback) OVERRIDE; | 51 const Transport::ConnectedCallback& callback) OVERRIDE; |
52 virtual void AddRemoteCandidate(const cricket::Candidate& candidate) OVERRIDE; | 52 virtual void AddRemoteCandidate(const cricket::Candidate& candidate) OVERRIDE; |
53 virtual const std::string& name() const OVERRIDE; | 53 virtual const std::string& name() const OVERRIDE; |
54 virtual bool is_connected() const OVERRIDE; | 54 virtual bool is_connected() const OVERRIDE; |
55 | 55 |
56 private: | 56 private: |
57 void DoStart(); | 57 void DoStart(); |
| 58 void NotifyConnected(); |
58 | 59 |
59 // Signal handlers for cricket::TransportChannel. | 60 // Signal handlers for cricket::TransportChannel. |
60 void OnRequestSignaling(cricket::TransportChannelImpl* channel); | 61 void OnRequestSignaling(cricket::TransportChannelImpl* channel); |
61 void OnCandidateReady(cricket::TransportChannelImpl* channel, | 62 void OnCandidateReady(cricket::TransportChannelImpl* channel, |
62 const cricket::Candidate& candidate); | 63 const cricket::Candidate& candidate); |
63 void OnRouteChange(cricket::TransportChannel* channel, | 64 void OnRouteChange(cricket::TransportChannel* channel, |
64 const cricket::Candidate& candidate); | 65 const cricket::Candidate& candidate); |
65 void OnWritableState(cricket::TransportChannel* channel); | 66 void OnWritableState(cricket::TransportChannel* channel); |
66 | 67 |
67 // Callback for jingle_glue::TransportChannelSocketAdapter to notify when the | 68 // Callback for jingle_glue::TransportChannelSocketAdapter to notify when the |
(...skipping 13 matching lines...) Expand all Loading... |
81 std::string ice_password_; | 82 std::string ice_password_; |
82 | 83 |
83 bool can_start_; | 84 bool can_start_; |
84 | 85 |
85 std::list<cricket::Candidate> pending_candidates_; | 86 std::list<cricket::Candidate> pending_candidates_; |
86 scoped_ptr<cricket::P2PTransportChannel> channel_; | 87 scoped_ptr<cricket::P2PTransportChannel> channel_; |
87 bool channel_was_writable_; | 88 bool channel_was_writable_; |
88 int connect_attempts_left_; | 89 int connect_attempts_left_; |
89 base::RepeatingTimer<LibjingleTransport> reconnect_timer_; | 90 base::RepeatingTimer<LibjingleTransport> reconnect_timer_; |
90 | 91 |
| 92 base::WeakPtrFactory<LibjingleTransport> weak_factory_; |
| 93 |
91 DISALLOW_COPY_AND_ASSIGN(LibjingleTransport); | 94 DISALLOW_COPY_AND_ASSIGN(LibjingleTransport); |
92 }; | 95 }; |
93 | 96 |
94 LibjingleTransport::LibjingleTransport( | 97 LibjingleTransport::LibjingleTransport(cricket::PortAllocator* port_allocator, |
95 cricket::PortAllocator* port_allocator, | 98 const NetworkSettings& network_settings) |
96 const NetworkSettings& network_settings) | |
97 : port_allocator_(port_allocator), | 99 : port_allocator_(port_allocator), |
98 network_settings_(network_settings), | 100 network_settings_(network_settings), |
99 event_handler_(NULL), | 101 event_handler_(NULL), |
100 ice_username_fragment_( | 102 ice_username_fragment_( |
101 rtc::CreateRandomString(cricket::ICE_UFRAG_LENGTH)), | 103 rtc::CreateRandomString(cricket::ICE_UFRAG_LENGTH)), |
102 ice_password_(rtc::CreateRandomString(cricket::ICE_PWD_LENGTH)), | 104 ice_password_(rtc::CreateRandomString(cricket::ICE_PWD_LENGTH)), |
103 can_start_(false), | 105 can_start_(false), |
104 channel_was_writable_(false), | 106 channel_was_writable_(false), |
105 connect_attempts_left_(kMaxReconnectAttempts) { | 107 connect_attempts_left_(kMaxReconnectAttempts), |
| 108 weak_factory_(this) { |
106 DCHECK(!ice_username_fragment_.empty()); | 109 DCHECK(!ice_username_fragment_.empty()); |
107 DCHECK(!ice_password_.empty()); | 110 DCHECK(!ice_password_.empty()); |
108 } | 111 } |
109 | 112 |
110 LibjingleTransport::~LibjingleTransport() { | 113 LibjingleTransport::~LibjingleTransport() { |
111 DCHECK(event_handler_); | 114 DCHECK(event_handler_); |
112 | 115 |
113 event_handler_->OnTransportDeleted(this); | 116 event_handler_->OnTransportDeleted(this); |
114 | 117 |
115 if (channel_.get()) { | 118 if (channel_.get()) { |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
173 !(network_settings_.flags & NetworkSettings::NAT_TRAVERSAL_OUTGOING)); | 176 !(network_settings_.flags & NetworkSettings::NAT_TRAVERSAL_OUTGOING)); |
174 | 177 |
175 channel_->Connect(); | 178 channel_->Connect(); |
176 | 179 |
177 --connect_attempts_left_; | 180 --connect_attempts_left_; |
178 | 181 |
179 // Start reconnection timer. | 182 // Start reconnection timer. |
180 reconnect_timer_.Start( | 183 reconnect_timer_.Start( |
181 FROM_HERE, base::TimeDelta::FromSeconds(kReconnectDelaySeconds), | 184 FROM_HERE, base::TimeDelta::FromSeconds(kReconnectDelaySeconds), |
182 this, &LibjingleTransport::TryReconnect); | 185 this, &LibjingleTransport::TryReconnect); |
| 186 } |
183 | 187 |
| 188 void LibjingleTransport::NotifyConnected() { |
184 // Create net::Socket adapter for the P2PTransportChannel. | 189 // Create net::Socket adapter for the P2PTransportChannel. |
185 scoped_ptr<jingle_glue::TransportChannelSocketAdapter> socket( | 190 scoped_ptr<jingle_glue::TransportChannelSocketAdapter> socket( |
186 new jingle_glue::TransportChannelSocketAdapter(channel_.get())); | 191 new jingle_glue::TransportChannelSocketAdapter(channel_.get())); |
187 socket->SetOnDestroyedCallback(base::Bind( | 192 socket->SetOnDestroyedCallback(base::Bind( |
188 &LibjingleTransport::OnChannelDestroyed, base::Unretained(this))); | 193 &LibjingleTransport::OnChannelDestroyed, base::Unretained(this))); |
189 | 194 |
190 Transport::ConnectedCallback callback = callback_; | 195 Transport::ConnectedCallback callback = callback_; |
191 callback_.Reset(); | 196 callback_.Reset(); |
192 callback.Run(socket.PassAs<net::Socket>()); | 197 callback.Run(socket.PassAs<net::Socket>()); |
193 } | 198 } |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
262 } | 267 } |
263 | 268 |
264 event_handler_->OnTransportRouteChange(this, route); | 269 event_handler_->OnTransportRouteChange(this, route); |
265 } | 270 } |
266 | 271 |
267 void LibjingleTransport::OnWritableState( | 272 void LibjingleTransport::OnWritableState( |
268 cricket::TransportChannel* channel) { | 273 cricket::TransportChannel* channel) { |
269 DCHECK_EQ(channel, channel_.get()); | 274 DCHECK_EQ(channel, channel_.get()); |
270 | 275 |
271 if (channel->writable()) { | 276 if (channel->writable()) { |
272 channel_was_writable_ = true; | 277 if (!channel_was_writable_) { |
| 278 channel_was_writable_ = true; |
| 279 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 280 FROM_HERE, |
| 281 base::Bind(&LibjingleTransport::NotifyConnected, |
| 282 weak_factory_.GetWeakPtr())); |
| 283 } |
273 connect_attempts_left_ = kMaxReconnectAttempts; | 284 connect_attempts_left_ = kMaxReconnectAttempts; |
274 reconnect_timer_.Stop(); | 285 reconnect_timer_.Stop(); |
275 } else if (!channel->writable() && channel_was_writable_) { | 286 } else if (!channel->writable() && channel_was_writable_) { |
276 reconnect_timer_.Reset(); | 287 reconnect_timer_.Reset(); |
277 TryReconnect(); | 288 TryReconnect(); |
278 } | 289 } |
279 } | 290 } |
280 | 291 |
281 void LibjingleTransport::OnChannelDestroyed() { | 292 void LibjingleTransport::OnChannelDestroyed() { |
282 if (is_connected()) { | 293 if (is_connected()) { |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
378 last_jingle_info_update_time_ = base::TimeTicks::Now(); | 389 last_jingle_info_update_time_ = base::TimeTicks::Now(); |
379 | 390 |
380 while (!on_jingle_info_callbacks_.empty()) { | 391 while (!on_jingle_info_callbacks_.empty()) { |
381 on_jingle_info_callbacks_.begin()->Run(); | 392 on_jingle_info_callbacks_.begin()->Run(); |
382 on_jingle_info_callbacks_.pop_front(); | 393 on_jingle_info_callbacks_.pop_front(); |
383 } | 394 } |
384 } | 395 } |
385 | 396 |
386 } // namespace protocol | 397 } // namespace protocol |
387 } // namespace remoting | 398 } // namespace remoting |
OLD | NEW |