OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/connection_to_host.h" | 5 #include "remoting/protocol/connection_to_host.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/callback.h" | 8 #include "base/callback.h" |
9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
10 #include "remoting/base/constants.h" | 10 #include "remoting/base/constants.h" |
(...skipping 20 matching lines...) Expand all Loading... |
31 talk_base::PacketSocketFactory* socket_factory, | 31 talk_base::PacketSocketFactory* socket_factory, |
32 HostResolverFactory* host_resolver_factory, | 32 HostResolverFactory* host_resolver_factory, |
33 PortAllocatorSessionFactory* session_factory, | 33 PortAllocatorSessionFactory* session_factory, |
34 bool allow_nat_traversal) | 34 bool allow_nat_traversal) |
35 : message_loop_(message_loop), | 35 : message_loop_(message_loop), |
36 network_manager_(network_manager), | 36 network_manager_(network_manager), |
37 socket_factory_(socket_factory), | 37 socket_factory_(socket_factory), |
38 host_resolver_factory_(host_resolver_factory), | 38 host_resolver_factory_(host_resolver_factory), |
39 port_allocator_session_factory_(session_factory), | 39 port_allocator_session_factory_(session_factory), |
40 allow_nat_traversal_(allow_nat_traversal), | 40 allow_nat_traversal_(allow_nat_traversal), |
| 41 event_callback_(NULL), |
| 42 client_stub_(NULL), |
| 43 video_stub_(NULL), |
41 state_(STATE_EMPTY), | 44 state_(STATE_EMPTY), |
42 event_callback_(NULL), | 45 control_connected_(false), |
43 dispatcher_(new ClientMessageDispatcher()), | 46 input_connected_(false), |
44 client_stub_(NULL), | 47 video_connected_(false) { |
45 video_stub_(NULL) { | |
46 } | 48 } |
47 | 49 |
48 ConnectionToHost::~ConnectionToHost() { | 50 ConnectionToHost::~ConnectionToHost() { |
49 } | 51 } |
50 | 52 |
51 InputStub* ConnectionToHost::input_stub() { | 53 InputStub* ConnectionToHost::input_stub() { |
52 return input_sender_.get(); | 54 return input_sender_.get(); |
53 } | 55 } |
54 | 56 |
55 HostStub* ConnectionToHost::host_stub() { | 57 HostStub* ConnectionToHost::host_stub() { |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
169 } | 171 } |
170 | 172 |
171 void ConnectionToHost::OnSessionStateChange( | 173 void ConnectionToHost::OnSessionStateChange( |
172 Session::State state) { | 174 Session::State state) { |
173 DCHECK_EQ(message_loop_, MessageLoop::current()); | 175 DCHECK_EQ(message_loop_, MessageLoop::current()); |
174 DCHECK(event_callback_); | 176 DCHECK(event_callback_); |
175 | 177 |
176 switch (state) { | 178 switch (state) { |
177 case Session::FAILED: | 179 case Session::FAILED: |
178 state_ = STATE_FAILED; | 180 state_ = STATE_FAILED; |
179 CloseChannels(); | 181 CloseOnError(); |
180 event_callback_->OnConnectionFailed(this); | |
181 break; | 182 break; |
182 | 183 |
183 case Session::CLOSED: | 184 case Session::CLOSED: |
184 state_ = STATE_CLOSED; | 185 state_ = STATE_CLOSED; |
185 CloseChannels(); | 186 CloseChannels(); |
186 event_callback_->OnConnectionClosed(this); | 187 event_callback_->OnConnectionClosed(this); |
187 break; | 188 break; |
188 | 189 |
189 case Session::CONNECTED: | 190 case Session::CONNECTED: |
190 state_ = STATE_CONNECTED; | |
191 // Initialize reader and writer. | 191 // Initialize reader and writer. |
192 video_reader_.reset(VideoReader::Create(session_->config())); | 192 video_reader_.reset(VideoReader::Create(session_->config())); |
193 video_reader_->Init(session_.get(), video_stub_); | 193 video_reader_->Init( |
| 194 session_.get(), video_stub_, |
| 195 base::Bind(&ConnectionToHost::OnVideoChannelInitialized, |
| 196 base::Unretained(this))); |
| 197 break; |
| 198 |
| 199 case Session::CONNECTED_CHANNELS: |
| 200 state_ = STATE_CONNECTED; |
194 host_control_sender_.reset( | 201 host_control_sender_.reset( |
195 new HostControlSender(session_->control_channel())); | 202 new HostControlSender(session_->control_channel())); |
| 203 dispatcher_.reset(new ClientMessageDispatcher()); |
196 dispatcher_->Initialize(session_.get(), client_stub_); | 204 dispatcher_->Initialize(session_.get(), client_stub_); |
197 event_callback_->OnConnectionOpened(this); | 205 |
| 206 control_connected_ = true; |
| 207 input_connected_ = true; |
| 208 NotifyIfChannelsReady(); |
198 break; | 209 break; |
199 | 210 |
200 default: | 211 default: |
201 // Ignore the other states by default. | 212 // Ignore the other states by default. |
202 break; | 213 break; |
203 } | 214 } |
204 } | 215 } |
205 | 216 |
| 217 void ConnectionToHost::OnVideoChannelInitialized(bool successful) { |
| 218 if (!successful) { |
| 219 LOG(ERROR) << "Failed to connect video channel"; |
| 220 CloseOnError(); |
| 221 return; |
| 222 } |
| 223 |
| 224 video_connected_ = true; |
| 225 NotifyIfChannelsReady(); |
| 226 } |
| 227 |
| 228 void ConnectionToHost::NotifyIfChannelsReady() { |
| 229 if (control_connected_ && input_connected_ && video_connected_) |
| 230 event_callback_->OnConnectionOpened(this); |
| 231 } |
| 232 |
| 233 void ConnectionToHost::CloseOnError() { |
| 234 state_ = STATE_FAILED; |
| 235 CloseChannels(); |
| 236 event_callback_->OnConnectionFailed(this); |
| 237 } |
| 238 |
206 void ConnectionToHost::CloseChannels() { | 239 void ConnectionToHost::CloseChannels() { |
207 if (input_sender_.get()) | 240 if (input_sender_.get()) |
208 input_sender_->Close(); | 241 input_sender_->Close(); |
209 | 242 |
210 if (host_control_sender_.get()) | 243 if (host_control_sender_.get()) |
211 host_control_sender_->Close(); | 244 host_control_sender_->Close(); |
| 245 |
| 246 video_reader_.reset(); |
212 } | 247 } |
213 | 248 |
214 void ConnectionToHost::OnClientAuthenticated() { | 249 void ConnectionToHost::OnClientAuthenticated() { |
215 // TODO(hclam): Don't send anything except authentication request if it is | 250 // TODO(hclam): Don't send anything except authentication request if it is |
216 // not authenticated. | 251 // not authenticated. |
217 state_ = STATE_AUTHENTICATED; | 252 state_ = STATE_AUTHENTICATED; |
218 | 253 |
219 // Create and enable the input stub now that we're authenticated. | 254 // Create and enable the input stub now that we're authenticated. |
220 input_sender_.reset(new InputSender(session_->event_channel())); | 255 input_sender_.reset(new InputSender(session_->event_channel())); |
221 } | 256 } |
222 | 257 |
223 ConnectionToHost::State ConnectionToHost::state() const { | 258 ConnectionToHost::State ConnectionToHost::state() const { |
224 return state_; | 259 return state_; |
225 } | 260 } |
226 | 261 |
227 } // namespace protocol | 262 } // namespace protocol |
228 } // namespace remoting | 263 } // namespace remoting |
OLD | NEW |