Chromium Code Reviews| 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/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 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 42 } | 42 } |
| 43 | 43 |
| 44 ChromotingHost::ChromotingHost(ChromotingHostContext* context, | 44 ChromotingHost::ChromotingHost(ChromotingHostContext* context, |
| 45 MutableHostConfig* config, | 45 MutableHostConfig* config, |
| 46 DesktopEnvironment* environment, | 46 DesktopEnvironment* environment, |
| 47 bool allow_nat_traversal) | 47 bool allow_nat_traversal) |
| 48 : context_(context), | 48 : context_(context), |
| 49 desktop_environment_(environment), | 49 desktop_environment_(environment), |
| 50 config_(config), | 50 config_(config), |
| 51 allow_nat_traversal_(allow_nat_traversal), | 51 allow_nat_traversal_(allow_nat_traversal), |
| 52 have_shared_secret_(false), | |
| 52 stopping_recorders_(0), | 53 stopping_recorders_(0), |
| 53 state_(kInitial), | 54 state_(kInitial), |
| 54 protocol_config_(protocol::CandidateSessionConfig::CreateDefault()), | 55 protocol_config_(protocol::CandidateSessionConfig::CreateDefault()), |
| 55 is_curtained_(false), | 56 is_curtained_(false), |
| 56 is_it2me_(false) { | 57 is_it2me_(false) { |
| 57 DCHECK(desktop_environment_); | 58 DCHECK(desktop_environment_); |
| 58 desktop_environment_->set_host(this); | 59 desktop_environment_->set_host(this); |
| 59 } | 60 } |
| 60 | 61 |
| 61 ChromotingHost::~ChromotingHost() { | 62 ChromotingHost::~ChromotingHost() { |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 129 | 130 |
| 130 // Stop session manager. | 131 // Stop session manager. |
| 131 if (session_manager_.get()) { | 132 if (session_manager_.get()) { |
| 132 session_manager_->Close(); | 133 session_manager_->Close(); |
| 133 // It may not be safe to delete |session_manager_| here becase | 134 // It may not be safe to delete |session_manager_| here becase |
| 134 // this method may be invoked in response to a libjingle event and | 135 // this method may be invoked in response to a libjingle event and |
| 135 // libjingle's sigslot doesn't handle it properly, so postpone the | 136 // libjingle's sigslot doesn't handle it properly, so postpone the |
| 136 // deletion. | 137 // deletion. |
| 137 context_->network_message_loop()->DeleteSoon( | 138 context_->network_message_loop()->DeleteSoon( |
| 138 FROM_HERE, session_manager_.release()); | 139 FROM_HERE, session_manager_.release()); |
| 140 have_shared_secret_ = false; | |
| 139 } | 141 } |
| 140 | 142 |
| 141 // Stop XMPP connection synchronously. | 143 // Stop XMPP connection synchronously. |
| 142 if (signal_strategy_.get()) { | 144 if (signal_strategy_.get()) { |
| 143 signal_strategy_->Close(); | 145 signal_strategy_->Close(); |
| 144 signal_strategy_.reset(); | 146 signal_strategy_.reset(); |
| 145 | 147 |
| 146 for (StatusObserverList::iterator it = status_observers_.begin(); | 148 for (StatusObserverList::iterator it = status_observers_.begin(); |
| 147 it != status_observers_.end(); ++it) { | 149 it != status_observers_.end(); ++it) { |
| 148 (*it)->OnSignallingDisconnected(); | 150 (*it)->OnSignallingDisconnected(); |
| 149 } | 151 } |
| 150 } | 152 } |
| 151 | 153 |
| 152 if (recorder_.get()) { | 154 if (recorder_.get()) { |
| 153 StopScreenRecorder(); | 155 StopScreenRecorder(); |
| 154 } else { | 156 } else { |
| 155 ShutdownFinish(); | 157 ShutdownFinish(); |
| 156 } | 158 } |
| 157 } | 159 } |
| 158 | 160 |
| 159 void ChromotingHost::AddStatusObserver(HostStatusObserver* observer) { | 161 void ChromotingHost::AddStatusObserver(HostStatusObserver* observer) { |
| 160 DCHECK_EQ(state_, kInitial); | 162 DCHECK_EQ(state_, kInitial); |
| 161 status_observers_.push_back(observer); | 163 status_observers_.push_back(observer); |
| 162 } | 164 } |
| 163 | 165 |
| 164 void ChromotingHost::SetSharedSecret(const std::string& shared_secret) { | 166 void ChromotingHost::SetSharedSecret(const std::string& shared_secret) { |
| 165 DCHECK(context_->network_message_loop()->BelongsToCurrentThread()); | 167 DCHECK(context_->network_message_loop()->BelongsToCurrentThread()); |
| 166 session_manager_->set_authenticator_factory( | 168 shared_secret_ = shared_secret; |
| 167 new protocol::V1HostAuthenticatorFactory( | 169 have_shared_secret_ = true; |
| 168 key_pair_.GenerateCertificate(), key_pair_.private_key(), | 170 if (session_manager_.get()) { |
| 169 shared_secret)); | 171 session_manager_->set_authenticator_factory( |
| 172 new protocol::V1HostAuthenticatorFactory( | |
| 173 key_pair_.GenerateCertificate(), key_pair_.private_key(), | |
| 174 shared_secret_)); | |
| 175 } | |
| 170 } | 176 } |
| 171 | 177 |
| 172 //////////////////////////////////////////////////////////////////////////// | 178 //////////////////////////////////////////////////////////////////////////// |
| 173 // protocol::ClientSession::EventHandler implementation. | 179 // protocol::ClientSession::EventHandler implementation. |
| 174 void ChromotingHost::OnSessionAuthenticated(ClientSession* client) { | 180 void ChromotingHost::OnSessionAuthenticated(ClientSession* client) { |
| 175 DCHECK(context_->network_message_loop()->BelongsToCurrentThread()); | 181 DCHECK(context_->network_message_loop()->BelongsToCurrentThread()); |
| 176 | 182 |
| 177 // Disconnect all other clients. | 183 // Disconnect all other clients. |
| 178 // Iterate over a copy of the list of clients, to avoid mutating the list | 184 // Iterate over a copy of the list of clients, to avoid mutating the list |
| 179 // while iterating over it. | 185 // while iterating over it. |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 271 LOG(INFO) << "Host connected as " << local_jid_; | 277 LOG(INFO) << "Host connected as " << local_jid_; |
| 272 | 278 |
| 273 // Create and start session manager. | 279 // Create and start session manager. |
| 274 protocol::JingleSessionManager* server = | 280 protocol::JingleSessionManager* server = |
| 275 new protocol::JingleSessionManager(context_->network_message_loop()); | 281 new protocol::JingleSessionManager(context_->network_message_loop()); |
| 276 | 282 |
| 277 server->Init(local_jid_, signal_strategy_.get(), | 283 server->Init(local_jid_, signal_strategy_.get(), |
| 278 this, allow_nat_traversal_); | 284 this, allow_nat_traversal_); |
| 279 | 285 |
| 280 session_manager_.reset(server); | 286 session_manager_.reset(server); |
| 287 if (have_shared_secret_) { | |
|
Sergey Ulanov
2011/12/01 21:10:13
nit: I don't think we need this flag. !shared_secr
Lambros
2011/12/01 21:29:21
!shared_secret_.empty() wouldn't work. remoting_m
| |
| 288 session_manager_->set_authenticator_factory( | |
| 289 new protocol::V1HostAuthenticatorFactory( | |
| 290 key_pair_.GenerateCertificate(), key_pair_.private_key(), | |
| 291 shared_secret_)); | |
| 292 } | |
| 281 | 293 |
| 282 for (StatusObserverList::iterator it = status_observers_.begin(); | 294 for (StatusObserverList::iterator it = status_observers_.begin(); |
| 283 it != status_observers_.end(); ++it) { | 295 it != status_observers_.end(); ++it) { |
| 284 (*it)->OnSignallingConnected(signal_strategy_.get(), local_jid_); | 296 (*it)->OnSignallingConnected(signal_strategy_.get(), local_jid_); |
| 285 } | 297 } |
| 286 } else if (state == SignalStrategy::StatusObserver::CLOSED) { | 298 } else if (state == SignalStrategy::StatusObserver::CLOSED) { |
| 287 LOG(INFO) << "Host disconnected from talk network."; | 299 LOG(INFO) << "Host disconnected from talk network."; |
| 288 for (StatusObserverList::iterator it = status_observers_.begin(); | 300 for (StatusObserverList::iterator it = status_observers_.begin(); |
| 289 it != status_observers_.end(); ++it) { | 301 it != status_observers_.end(); ++it) { |
| 290 (*it)->OnSignallingDisconnected(); | 302 (*it)->OnSignallingDisconnected(); |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 470 } | 482 } |
| 471 | 483 |
| 472 for (std::vector<base::Closure>::iterator it = shutdown_tasks_.begin(); | 484 for (std::vector<base::Closure>::iterator it = shutdown_tasks_.begin(); |
| 473 it != shutdown_tasks_.end(); ++it) { | 485 it != shutdown_tasks_.end(); ++it) { |
| 474 it->Run(); | 486 it->Run(); |
| 475 } | 487 } |
| 476 shutdown_tasks_.clear(); | 488 shutdown_tasks_.clear(); |
| 477 } | 489 } |
| 478 | 490 |
| 479 } // namespace remoting | 491 } // namespace remoting |
| OLD | NEW |