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 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
97 } | 97 } |
98 | 98 |
99 signal_strategy_.reset( | 99 signal_strategy_.reset( |
100 new XmppSignalStrategy(context_->jingle_thread(), xmpp_login, | 100 new XmppSignalStrategy(context_->jingle_thread(), xmpp_login, |
101 xmpp_auth_token, | 101 xmpp_auth_token, |
102 xmpp_auth_service)); | 102 xmpp_auth_service)); |
103 signal_strategy_->Init(this); | 103 signal_strategy_->Init(this); |
104 } | 104 } |
105 | 105 |
106 // This method is called when we need to destroy the host process. | 106 // This method is called when we need to destroy the host process. |
107 void ChromotingHost::Shutdown(Task* shutdown_task) { | 107 void ChromotingHost::Shutdown(const base::Closure& shutdown_task) { |
108 if (MessageLoop::current() != context_->main_message_loop()) { | 108 if (MessageLoop::current() != context_->main_message_loop()) { |
109 context_->main_message_loop()->PostTask( | 109 context_->main_message_loop()->PostTask( |
110 FROM_HERE, | 110 FROM_HERE, |
111 base::Bind(&ChromotingHost::Shutdown, this, shutdown_task)); | 111 base::Bind(&ChromotingHost::Shutdown, this, shutdown_task)); |
112 return; | 112 return; |
113 } | 113 } |
114 | 114 |
115 // No-op if this object is not started yet. | 115 // No-op if this object is not started yet. |
116 { | 116 { |
117 base::AutoLock auto_lock(lock_); | 117 base::AutoLock auto_lock(lock_); |
118 if (state_ == kInitial || state_ == kStopped) { | 118 if (state_ == kInitial || state_ == kStopped) { |
119 // Nothing to do if we are not started. | 119 // Nothing to do if we are not started. |
120 state_ = kStopped; | 120 state_ = kStopped; |
121 context_->main_message_loop()->PostTask(FROM_HERE, shutdown_task); | 121 context_->main_message_loop()->PostTask(FROM_HERE, shutdown_task); |
122 return; | 122 return; |
123 } | 123 } |
124 if (shutdown_task) | 124 if (!shutdown_task.is_null()) |
125 shutdown_tasks_.push_back(shutdown_task); | 125 shutdown_tasks_.push_back(shutdown_task); |
126 if (state_ == kStopping) | 126 if (state_ == kStopping) |
127 return; | 127 return; |
128 state_ = kStopping; | 128 state_ = kStopping; |
129 } | 129 } |
130 | 130 |
131 // Disconnect all of the clients, implicitly stopping the ScreenRecorder. | 131 // Disconnect all of the clients, implicitly stopping the ScreenRecorder. |
132 while (!clients_.empty()) { | 132 while (!clients_.empty()) { |
133 OnClientDisconnected(clients_.front()->connection()); | 133 OnClientDisconnected(clients_.front()->connection()); |
134 } | 134 } |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
256 } | 256 } |
257 return; | 257 return; |
258 } | 258 } |
259 | 259 |
260 // If we are running Me2Mom and already have an authenticated client then | 260 // If we are running Me2Mom and already have an authenticated client then |
261 // one of the connections may be an attacker, so both are suspect. | 261 // one of the connections may be an attacker, so both are suspect. |
262 if (is_it2me_ && AuthenticatedClientsCount() > 0) { | 262 if (is_it2me_ && AuthenticatedClientsCount() > 0) { |
263 *response = protocol::SessionManager::DECLINE; | 263 *response = protocol::SessionManager::DECLINE; |
264 | 264 |
265 // Close existing sessions and shutdown the host. | 265 // Close existing sessions and shutdown the host. |
266 Shutdown(NULL); | 266 Shutdown(base::Closure()); |
267 return; | 267 return; |
268 } | 268 } |
269 | 269 |
270 // TODO(simonmorris): The resolution is set in the video stream now, | 270 // TODO(simonmorris): The resolution is set in the video stream now, |
271 // so it doesn't need to be set here. | 271 // so it doesn't need to be set here. |
272 *protocol_config_->mutable_initial_resolution() = | 272 *protocol_config_->mutable_initial_resolution() = |
273 protocol::ScreenResolution(2048, 2048); | 273 protocol::ScreenResolution(2048, 2048); |
274 // TODO(sergeyu): Respect resolution requested by the client if supported. | 274 // TODO(sergeyu): Respect resolution requested by the client if supported. |
275 protocol::SessionConfig config; | 275 protocol::SessionConfig config; |
276 if (!protocol_config_->Select(session->candidate_config(), | 276 if (!protocol_config_->Select(session->candidate_config(), |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
324 } | 324 } |
325 ClientList::iterator client; | 325 ClientList::iterator client; |
326 for (client = clients_.begin(); client != clients_.end(); ++client) { | 326 for (client = clients_.begin(); client != clients_.end(); ++client) { |
327 client->get()->LocalMouseMoved(new_pos); | 327 client->get()->LocalMouseMoved(new_pos); |
328 } | 328 } |
329 } | 329 } |
330 | 330 |
331 void ChromotingHost::PauseSession(bool pause) { | 331 void ChromotingHost::PauseSession(bool pause) { |
332 if (context_->main_message_loop() != MessageLoop::current()) { | 332 if (context_->main_message_loop() != MessageLoop::current()) { |
333 context_->main_message_loop()->PostTask( | 333 context_->main_message_loop()->PostTask( |
334 FROM_HERE, | 334 FROM_HERE, base::Bind(&ChromotingHost::PauseSession, this, pause)); |
335 NewRunnableMethod(this, | |
336 &ChromotingHost::PauseSession, | |
337 pause)); | |
338 return; | 335 return; |
339 } | 336 } |
340 ClientList::iterator client; | 337 ClientList::iterator client; |
341 for (client = clients_.begin(); client != clients_.end(); ++client) { | 338 for (client = clients_.begin(); client != clients_.end(); ++client) { |
342 client->get()->set_awaiting_continue_approval(pause); | 339 client->get()->set_awaiting_continue_approval(pause); |
343 } | 340 } |
344 desktop_environment_->OnPause(pause); | 341 desktop_environment_->OnPause(pause); |
345 } | 342 } |
346 | 343 |
347 void ChromotingHost::SetUiStrings(const UiStrings& ui_strings) { | 344 void ChromotingHost::SetUiStrings(const UiStrings& ui_strings) { |
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
603 // Keep reference to |this|, so that we don't get destroyed while | 600 // Keep reference to |this|, so that we don't get destroyed while |
604 // sending notifications. | 601 // sending notifications. |
605 scoped_refptr<ChromotingHost> self(this); | 602 scoped_refptr<ChromotingHost> self(this); |
606 | 603 |
607 // Notify observers. | 604 // Notify observers. |
608 for (StatusObserverList::iterator it = status_observers_.begin(); | 605 for (StatusObserverList::iterator it = status_observers_.begin(); |
609 it != status_observers_.end(); ++it) { | 606 it != status_observers_.end(); ++it) { |
610 (*it)->OnShutdown(); | 607 (*it)->OnShutdown(); |
611 } | 608 } |
612 | 609 |
613 for (std::vector<Task*>::iterator it = shutdown_tasks_.begin(); | 610 for (std::vector<base::Closure>::iterator it = shutdown_tasks_.begin(); |
614 it != shutdown_tasks_.end(); ++it) { | 611 it != shutdown_tasks_.end(); ++it) { |
615 (*it)->Run(); | 612 it->Run(); |
616 delete *it; | |
617 } | 613 } |
618 shutdown_tasks_.clear(); | 614 shutdown_tasks_.clear(); |
619 } | 615 } |
620 | 616 |
621 } // namespace remoting | 617 } // namespace remoting |
OLD | NEW |