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/host/chromoting_host.h" | 5 #include "remoting/host/chromoting_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/logging.h" | 9 #include "base/logging.h" |
10 #include "base/message_loop_proxy.h" | 10 #include "base/message_loop_proxy.h" |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
53 false, | 53 false, |
54 }; | 54 }; |
55 | 55 |
56 } // namespace | 56 } // namespace |
57 | 57 |
58 ChromotingHost::ChromotingHost( | 58 ChromotingHost::ChromotingHost( |
59 SignalStrategy* signal_strategy, | 59 SignalStrategy* signal_strategy, |
60 DesktopEnvironmentFactory* desktop_environment_factory, | 60 DesktopEnvironmentFactory* desktop_environment_factory, |
61 scoped_ptr<protocol::SessionManager> session_manager, | 61 scoped_ptr<protocol::SessionManager> session_manager, |
62 scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner, | 62 scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner, |
| 63 scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, |
63 scoped_refptr<base::SingleThreadTaskRunner> video_capture_task_runner, | 64 scoped_refptr<base::SingleThreadTaskRunner> video_capture_task_runner, |
64 scoped_refptr<base::SingleThreadTaskRunner> video_encode_task_runner, | 65 scoped_refptr<base::SingleThreadTaskRunner> video_encode_task_runner, |
65 scoped_refptr<base::SingleThreadTaskRunner> network_task_runner) | 66 scoped_refptr<base::SingleThreadTaskRunner> network_task_runner, |
| 67 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) |
66 : desktop_environment_factory_(desktop_environment_factory), | 68 : desktop_environment_factory_(desktop_environment_factory), |
67 session_manager_(session_manager.Pass()), | 69 session_manager_(session_manager.Pass()), |
68 audio_task_runner_(audio_task_runner), | 70 audio_task_runner_(audio_task_runner), |
| 71 input_task_runner_(input_task_runner), |
69 video_capture_task_runner_(video_capture_task_runner), | 72 video_capture_task_runner_(video_capture_task_runner), |
70 video_encode_task_runner_(video_encode_task_runner), | 73 video_encode_task_runner_(video_encode_task_runner), |
71 network_task_runner_(network_task_runner), | 74 network_task_runner_(network_task_runner), |
| 75 ui_task_runner_(ui_task_runner), |
72 signal_strategy_(signal_strategy), | 76 signal_strategy_(signal_strategy), |
73 clients_count_(0), | 77 clients_count_(0), |
74 state_(kInitial), | 78 state_(kInitial), |
75 protocol_config_(protocol::CandidateSessionConfig::CreateDefault()), | 79 protocol_config_(protocol::CandidateSessionConfig::CreateDefault()), |
76 login_backoff_(&kDefaultBackoffPolicy), | 80 login_backoff_(&kDefaultBackoffPolicy), |
77 authenticating_client_(false), | 81 authenticating_client_(false), |
78 reject_authenticating_client_(false) { | 82 reject_authenticating_client_(false) { |
79 DCHECK(signal_strategy); | 83 DCHECK(signal_strategy); |
80 DCHECK(network_task_runner_->BelongsToCurrentThread()); | 84 DCHECK(network_task_runner_->BelongsToCurrentThread()); |
81 | 85 |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
234 break; | 238 break; |
235 } | 239 } |
236 } | 240 } |
237 CHECK(it != clients_.end()); | 241 CHECK(it != clients_.end()); |
238 | 242 |
239 if (client->is_authenticated()) { | 243 if (client->is_authenticated()) { |
240 FOR_EACH_OBSERVER(HostStatusObserver, status_observers_, | 244 FOR_EACH_OBSERVER(HostStatusObserver, status_observers_, |
241 OnClientDisconnected(client->client_jid())); | 245 OnClientDisconnected(client->client_jid())); |
242 } | 246 } |
243 | 247 |
244 client->Stop(base::Bind(&ChromotingHost::OnClientStopped, this)); | 248 client->Stop(); |
245 clients_.erase(it); | 249 clients_.erase(it); |
| 250 |
| 251 --clients_count_; |
| 252 if (state_ == kStopping && !clients_count_) |
| 253 ShutdownFinish(); |
246 } | 254 } |
247 | 255 |
248 void ChromotingHost::OnSessionSequenceNumber(ClientSession* session, | 256 void ChromotingHost::OnSessionSequenceNumber(ClientSession* session, |
249 int64 sequence_number) { | 257 int64 sequence_number) { |
250 DCHECK(network_task_runner_->BelongsToCurrentThread()); | 258 DCHECK(network_task_runner_->BelongsToCurrentThread()); |
251 } | 259 } |
252 | 260 |
253 void ChromotingHost::OnSessionRouteChange( | 261 void ChromotingHost::OnSessionRouteChange( |
254 ClientSession* session, | 262 ClientSession* session, |
255 const std::string& channel_name, | 263 const std::string& channel_name, |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
307 *response = protocol::SessionManager::ACCEPT; | 315 *response = protocol::SessionManager::ACCEPT; |
308 | 316 |
309 LOG(INFO) << "Client connected: " << session->jid(); | 317 LOG(INFO) << "Client connected: " << session->jid(); |
310 | 318 |
311 // Create a client object. | 319 // Create a client object. |
312 scoped_ptr<protocol::ConnectionToClient> connection( | 320 scoped_ptr<protocol::ConnectionToClient> connection( |
313 new protocol::ConnectionToClient(session)); | 321 new protocol::ConnectionToClient(session)); |
314 scoped_refptr<ClientSession> client = new ClientSession( | 322 scoped_refptr<ClientSession> client = new ClientSession( |
315 this, | 323 this, |
316 audio_task_runner_, | 324 audio_task_runner_, |
| 325 input_task_runner_, |
317 video_capture_task_runner_, | 326 video_capture_task_runner_, |
318 video_encode_task_runner_, | 327 video_encode_task_runner_, |
319 network_task_runner_, | 328 network_task_runner_, |
| 329 ui_task_runner_, |
320 connection.Pass(), | 330 connection.Pass(), |
321 desktop_environment_factory_, | 331 desktop_environment_factory_, |
322 max_session_duration_); | 332 max_session_duration_); |
323 clients_.push_back(client); | 333 clients_.push_back(client); |
324 clients_count_++; | 334 clients_count_++; |
325 } | 335 } |
326 | 336 |
327 void ChromotingHost::set_protocol_config( | 337 void ChromotingHost::set_protocol_config( |
328 scoped_ptr<protocol::CandidateSessionConfig> config) { | 338 scoped_ptr<protocol::CandidateSessionConfig> config) { |
329 DCHECK(network_task_runner_->BelongsToCurrentThread()); | 339 DCHECK(network_task_runner_->BelongsToCurrentThread()); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
373 } | 383 } |
374 } | 384 } |
375 | 385 |
376 void ChromotingHost::SetUiStrings(const UiStrings& ui_strings) { | 386 void ChromotingHost::SetUiStrings(const UiStrings& ui_strings) { |
377 DCHECK(network_task_runner_->BelongsToCurrentThread()); | 387 DCHECK(network_task_runner_->BelongsToCurrentThread()); |
378 DCHECK_EQ(state_, kInitial); | 388 DCHECK_EQ(state_, kInitial); |
379 | 389 |
380 ui_strings_ = ui_strings; | 390 ui_strings_ = ui_strings; |
381 } | 391 } |
382 | 392 |
383 void ChromotingHost::OnClientStopped() { | |
384 DCHECK(network_task_runner_->BelongsToCurrentThread()); | |
385 | |
386 --clients_count_; | |
387 if (state_ == kStopping && !clients_count_) | |
388 ShutdownFinish(); | |
389 } | |
390 | |
391 void ChromotingHost::ShutdownFinish() { | 393 void ChromotingHost::ShutdownFinish() { |
392 DCHECK(network_task_runner_->BelongsToCurrentThread()); | 394 DCHECK(network_task_runner_->BelongsToCurrentThread()); |
393 DCHECK_EQ(state_, kStopping); | 395 DCHECK_EQ(state_, kStopping); |
394 | 396 |
395 state_ = kStopped; | 397 state_ = kStopped; |
396 | 398 |
397 // Destroy session manager. | 399 // Destroy session manager. |
398 session_manager_.reset(); | 400 session_manager_.reset(); |
399 | 401 |
400 // Clear |desktop_environment_factory_| and |signal_strategy_| to | 402 // Clear |desktop_environment_factory_| and |signal_strategy_| to |
(...skipping 10 matching lines...) Expand all Loading... |
411 OnShutdown()); | 413 OnShutdown()); |
412 | 414 |
413 for (std::vector<base::Closure>::iterator it = shutdown_tasks_.begin(); | 415 for (std::vector<base::Closure>::iterator it = shutdown_tasks_.begin(); |
414 it != shutdown_tasks_.end(); ++it) { | 416 it != shutdown_tasks_.end(); ++it) { |
415 it->Run(); | 417 it->Run(); |
416 } | 418 } |
417 shutdown_tasks_.clear(); | 419 shutdown_tasks_.clear(); |
418 } | 420 } |
419 | 421 |
420 } // namespace remoting | 422 } // namespace remoting |
OLD | NEW |