| 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/stl_util-inl.h" | 8 #include "base/stl_util-inl.h" |
| 8 #include "base/task.h" | 9 #include "base/task.h" |
| 9 #include "build/build_config.h" | 10 #include "build/build_config.h" |
| 10 #include "remoting/base/constants.h" | 11 #include "remoting/base/constants.h" |
| 11 #include "remoting/base/encoder.h" | 12 #include "remoting/base/encoder.h" |
| 12 #include "remoting/base/encoder_row_based.h" | 13 #include "remoting/base/encoder_row_based.h" |
| 13 #include "remoting/base/encoder_vp8.h" | 14 #include "remoting/base/encoder_vp8.h" |
| 14 #include "remoting/host/capturer.h" | 15 #include "remoting/host/capturer.h" |
| 15 #include "remoting/host/chromoting_host_context.h" | 16 #include "remoting/host/chromoting_host_context.h" |
| 16 #include "remoting/host/desktop_environment.h" | 17 #include "remoting/host/desktop_environment.h" |
| 17 #include "remoting/host/event_executor.h" | 18 #include "remoting/host/event_executor.h" |
| 18 #include "remoting/host/host_config.h" | 19 #include "remoting/host/host_config.h" |
| 19 #include "remoting/host/host_key_pair.h" | 20 #include "remoting/host/host_key_pair.h" |
| 20 #include "remoting/host/screen_recorder.h" | 21 #include "remoting/host/screen_recorder.h" |
| 22 #include "remoting/host/user_authenticator.h" |
| 21 #include "remoting/proto/auth.pb.h" | 23 #include "remoting/proto/auth.pb.h" |
| 22 #include "remoting/protocol/connection_to_client.h" | 24 #include "remoting/protocol/connection_to_client.h" |
| 23 #include "remoting/protocol/client_stub.h" | 25 #include "remoting/protocol/client_stub.h" |
| 24 #include "remoting/protocol/host_stub.h" | 26 #include "remoting/protocol/host_stub.h" |
| 25 #include "remoting/protocol/input_stub.h" | 27 #include "remoting/protocol/input_stub.h" |
| 26 #include "remoting/protocol/jingle_session_manager.h" | 28 #include "remoting/protocol/jingle_session_manager.h" |
| 27 #include "remoting/protocol/session_config.h" | 29 #include "remoting/protocol/session_config.h" |
| 28 | 30 |
| 29 using remoting::protocol::ConnectionToClient; | 31 using remoting::protocol::ConnectionToClient; |
| 30 using remoting::protocol::InputStub; | 32 using remoting::protocol::InputStub; |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 170 } | 172 } |
| 171 | 173 |
| 172 // This method is called when a client connects. | 174 // This method is called when a client connects. |
| 173 void ChromotingHost::OnClientConnected(ConnectionToClient* connection) { | 175 void ChromotingHost::OnClientConnected(ConnectionToClient* connection) { |
| 174 DCHECK_EQ(context_->main_message_loop(), MessageLoop::current()); | 176 DCHECK_EQ(context_->main_message_loop(), MessageLoop::current()); |
| 175 } | 177 } |
| 176 | 178 |
| 177 void ChromotingHost::OnClientDisconnected(ConnectionToClient* connection) { | 179 void ChromotingHost::OnClientDisconnected(ConnectionToClient* connection) { |
| 178 DCHECK_EQ(context_->main_message_loop(), MessageLoop::current()); | 180 DCHECK_EQ(context_->main_message_loop(), MessageLoop::current()); |
| 179 | 181 |
| 182 // Find the client session corresponding to the given connection. |
| 183 std::vector<scoped_refptr<ClientSession> >::iterator client; |
| 184 for (client = clients_.begin(); client != clients_.end(); ++client) { |
| 185 if (client->get()->connection() == connection) |
| 186 break; |
| 187 } |
| 188 if (client == clients_.end()) |
| 189 return; |
| 190 |
| 180 // Remove the connection from the session manager and stop the session. | 191 // Remove the connection from the session manager and stop the session. |
| 181 // TODO(hclam): Stop only if the last connection disconnected. | 192 // TODO(hclam): Stop only if the last connection disconnected. |
| 182 if (recorder_.get()) { | 193 if (recorder_.get()) { |
| 183 recorder_->RemoveConnection(connection); | 194 recorder_->RemoveConnection(connection); |
| 184 // The recorder only exists to serve the unique authenticated client. | 195 // The recorder only exists to serve the unique authenticated client. |
| 185 // If that client has disconnected, then we can kill the recorder. | 196 // If that client has disconnected, then we can kill the recorder. |
| 186 if (connection->client_authenticated()) { | 197 if (client->get()->authenticated()) { |
| 187 recorder_->Stop(NULL); | 198 recorder_->Stop(NULL); |
| 188 recorder_ = NULL; | 199 recorder_ = NULL; |
| 189 } | 200 } |
| 190 } | 201 } |
| 191 | 202 |
| 192 // Close the connection to connection just to be safe. | 203 // Close the connection to connection just to be safe. |
| 193 connection->Disconnect(); | 204 connection->Disconnect(); |
| 194 | 205 |
| 195 // Also remove reference to ConnectionToClient from this object. | 206 // Also remove reference to ConnectionToClient from this object. |
| 196 std::vector<scoped_refptr<ClientSession> >::iterator it; | 207 clients_.erase(client); |
| 197 for (it = clients_.begin(); it != clients_.end(); ++it) { | |
| 198 if (it->get()->connection() == connection) { | |
| 199 clients_.erase(it); | |
| 200 break; | |
| 201 } | |
| 202 } | |
| 203 } | 208 } |
| 204 | 209 |
| 205 //////////////////////////////////////////////////////////////////////////// | 210 //////////////////////////////////////////////////////////////////////////// |
| 206 // protocol::ConnectionToClient::EventHandler implementations | 211 // protocol::ConnectionToClient::EventHandler implementations |
| 207 void ChromotingHost::OnConnectionOpened(ConnectionToClient* connection) { | 212 void ChromotingHost::OnConnectionOpened(ConnectionToClient* connection) { |
| 208 DCHECK_EQ(context_->network_message_loop(), MessageLoop::current()); | 213 DCHECK_EQ(context_->network_message_loop(), MessageLoop::current()); |
| 209 | 214 |
| 210 // Completes the connection to the client. | 215 // Completes the connection to the client. |
| 211 VLOG(1) << "Connection to client established."; | 216 VLOG(1) << "Connection to client established."; |
| 212 context_->main_message_loop()->PostTask( | 217 context_->main_message_loop()->PostTask( |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 309 session->set_config(config); | 314 session->set_config(config); |
| 310 session->set_receiver_token( | 315 session->set_receiver_token( |
| 311 GenerateHostAuthToken(session->initiator_token())); | 316 GenerateHostAuthToken(session->initiator_token())); |
| 312 | 317 |
| 313 *response = protocol::SessionManager::ACCEPT; | 318 *response = protocol::SessionManager::ACCEPT; |
| 314 | 319 |
| 315 VLOG(1) << "Client connected: " << session->jid(); | 320 VLOG(1) << "Client connected: " << session->jid(); |
| 316 | 321 |
| 317 // We accept the connection, so create a connection object. | 322 // We accept the connection, so create a connection object. |
| 318 ConnectionToClient* connection = new ConnectionToClient( | 323 ConnectionToClient* connection = new ConnectionToClient( |
| 319 context_->network_message_loop(), | 324 context_->network_message_loop(), this); |
| 320 this, | |
| 321 desktop_environment_->input_stub()); | |
| 322 | 325 |
| 323 // Create a client object. | 326 // Create a client object. |
| 324 ClientSession* client = new ClientSession(this, connection); | 327 ClientSession* client = new ClientSession( |
| 328 this, |
| 329 base::Bind(UserAuthenticator::Create), |
| 330 connection, |
| 331 desktop_environment_->input_stub()); |
| 325 connection->set_host_stub(client); | 332 connection->set_host_stub(client); |
| 333 connection->set_input_stub(client); |
| 326 | 334 |
| 327 connection->Init(session); | 335 connection->Init(session); |
| 328 | 336 |
| 329 clients_.push_back(client); | 337 clients_.push_back(client); |
| 330 } | 338 } |
| 331 | 339 |
| 332 void ChromotingHost::set_protocol_config( | 340 void ChromotingHost::set_protocol_config( |
| 333 protocol::CandidateSessionConfig* config) { | 341 protocol::CandidateSessionConfig* config) { |
| 334 DCHECK(config_.get()); | 342 DCHECK(config_.get()); |
| 335 DCHECK_EQ(state_, kInitial); | 343 DCHECK_EQ(state_, kInitial); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 378 &ChromotingHost::LocalLoginSucceeded, | 386 &ChromotingHost::LocalLoginSucceeded, |
| 379 connection)); | 387 connection)); |
| 380 return; | 388 return; |
| 381 } | 389 } |
| 382 | 390 |
| 383 protocol::LocalLoginStatus* status = new protocol::LocalLoginStatus(); | 391 protocol::LocalLoginStatus* status = new protocol::LocalLoginStatus(); |
| 384 status->set_success(true); | 392 status->set_success(true); |
| 385 connection->client_stub()->BeginSessionResponse( | 393 connection->client_stub()->BeginSessionResponse( |
| 386 status, new DeleteTask<protocol::LocalLoginStatus>(status)); | 394 status, new DeleteTask<protocol::LocalLoginStatus>(status)); |
| 387 | 395 |
| 388 connection->OnClientAuthenticated(); | |
| 389 | |
| 390 // Disconnect all other clients. | 396 // Disconnect all other clients. |
| 391 // Iterate over a copy of the list of clients, to avoid mutating the list | 397 // Iterate over a copy of the list of clients, to avoid mutating the list |
| 392 // while iterating over it. | 398 // while iterating over it. |
| 393 std::vector<scoped_refptr<ClientSession> > clients_copy(clients_); | 399 std::vector<scoped_refptr<ClientSession> > clients_copy(clients_); |
| 394 std::vector<scoped_refptr<ClientSession> >::const_iterator client; | 400 std::vector<scoped_refptr<ClientSession> >::const_iterator client; |
| 395 for (client = clients_copy.begin(); client != clients_copy.end(); client++) { | 401 for (client = clients_copy.begin(); client != clients_copy.end(); client++) { |
| 396 ConnectionToClient* connection_other = client->get()->connection(); | 402 ConnectionToClient* connection_other = client->get()->connection(); |
| 397 if (connection_other != connection) { | 403 if (connection_other != connection) { |
| 398 OnClientDisconnected(connection_other); | 404 OnClientDisconnected(connection_other); |
| 399 } | 405 } |
| (...skipping 28 matching lines...) Expand all Loading... |
| 428 return; | 434 return; |
| 429 } | 435 } |
| 430 | 436 |
| 431 protocol::LocalLoginStatus* status = new protocol::LocalLoginStatus(); | 437 protocol::LocalLoginStatus* status = new protocol::LocalLoginStatus(); |
| 432 status->set_success(false); | 438 status->set_success(false); |
| 433 connection->client_stub()->BeginSessionResponse( | 439 connection->client_stub()->BeginSessionResponse( |
| 434 status, new DeleteTask<protocol::LocalLoginStatus>(status)); | 440 status, new DeleteTask<protocol::LocalLoginStatus>(status)); |
| 435 } | 441 } |
| 436 | 442 |
| 437 } // namespace remoting | 443 } // namespace remoting |
| OLD | NEW |