| Index: remoting/host/client_session.cc
|
| diff --git a/remoting/host/client_session.cc b/remoting/host/client_session.cc
|
| index ab1ab5136cdfe1040c6251cb63f3fea33cb38985..280a3c3b71cbe1207934e377868a6dfa2eb3684c 100644
|
| --- a/remoting/host/client_session.cc
|
| +++ b/remoting/host/client_session.cc
|
| @@ -124,8 +124,7 @@ void ClientSession::ControlVideo(const protocol::VideoControl& video_control) {
|
| if (video_control.has_enable()) {
|
| VLOG(1) << "Received VideoControl (enable="
|
| << video_control.enable() << ")";
|
| - if (video_scheduler_)
|
| - video_scheduler_->Pause(!video_control.enable());
|
| + video_scheduler_->Pause(!video_control.enable());
|
| }
|
| }
|
|
|
| @@ -165,17 +164,19 @@ void ClientSession::SetCapabilities(
|
|
|
| // Calculate the set of capabilities enabled by both client and host and
|
| // pass it to the desktop environment if it is available.
|
| - if (desktop_environment_) {
|
| - desktop_environment_->SetCapabilities(
|
| - IntersectCapabilities(*client_capabilities_, host_capabilities_));
|
| - }
|
| + desktop_environment_->SetCapabilities(
|
| + IntersectCapabilities(*client_capabilities_, host_capabilities_));
|
| }
|
|
|
| void ClientSession::OnConnectionAuthenticated(
|
| protocol::ConnectionToClient* connection) {
|
| DCHECK(CalledOnValidThread());
|
| DCHECK_EQ(connection_.get(), connection);
|
| + DCHECK(!audio_scheduler_);
|
| DCHECK(!desktop_environment_);
|
| + DCHECK(!input_injector_);
|
| + DCHECK(!screen_controls_);
|
| + DCHECK(!video_scheduler_);
|
|
|
| auth_input_filter_.set_enabled(true);
|
| auth_clipboard_filter_.set_enabled(true);
|
| @@ -190,40 +191,20 @@ void ClientSession::OnConnectionAuthenticated(
|
| this, &ClientSession::DisconnectSession);
|
| }
|
|
|
| - // The session may be destroyed as the result result of this call, so it must
|
| - // be the last in this method.
|
| - event_handler_->OnSessionAuthenticated(this);
|
| -}
|
| -
|
| -void ClientSession::OnConnectionChannelsConnected(
|
| - protocol::ConnectionToClient* connection) {
|
| - DCHECK(CalledOnValidThread());
|
| - DCHECK_EQ(connection_.get(), connection);
|
| - DCHECK(!audio_scheduler_);
|
| - DCHECK(!input_injector_);
|
| - DCHECK(!screen_controls_);
|
| - DCHECK(!video_scheduler_);
|
| + // Disconnect the session if the connection was rejected by the host.
|
| + if (!event_handler_->OnSessionAuthenticated(this)) {
|
| + DisconnectSession();
|
| + return;
|
| + }
|
|
|
| // Create the desktop environment.
|
| desktop_environment_ =
|
| desktop_environment_factory_->Create(control_factory_.GetWeakPtr());
|
| host_capabilities_ = desktop_environment_->GetCapabilities();
|
|
|
| - // Negotiate capabilities with the client.
|
| - if (connection_->session()->config().SupportsCapabilities()) {
|
| - VLOG(1) << "Host capabilities: " << host_capabilities_;
|
| -
|
| - protocol::Capabilities capabilities;
|
| - capabilities.set_capabilities(host_capabilities_);
|
| - connection_->client_stub()->SetCapabilities(capabilities);
|
| -
|
| - // |client_capabilities_| could have been received before all channels were
|
| - // connected. Process them now.
|
| - if (client_capabilities_) {
|
| - desktop_environment_->SetCapabilities(
|
| - IntersectCapabilities(*client_capabilities_, host_capabilities_));
|
| - }
|
| - } else {
|
| + // Ignore protocol::Capabilities messages from the client if it does not
|
| + // support any capabilities.
|
| + if (!connection_->session()->config().SupportsCapabilities()) {
|
| VLOG(1) << "The client does not support any capabilities.";
|
|
|
| client_capabilities_ = make_scoped_ptr(new std::string());
|
| @@ -233,22 +214,19 @@ void ClientSession::OnConnectionChannelsConnected(
|
| // Create the object that controls the screen resolution.
|
| screen_controls_ = desktop_environment_->CreateScreenControls();
|
|
|
| - // Create and start the event executor.
|
| + // Create the event executor.
|
| input_injector_ = desktop_environment_->CreateInputInjector();
|
| - input_injector_->Start(CreateClipboardProxy());
|
|
|
| // Connect the host clipboard and input stubs.
|
| host_input_filter_.set_input_stub(input_injector_.get());
|
| clipboard_echo_filter_.set_host_stub(input_injector_.get());
|
|
|
| - SetDisableInputs(false);
|
| -
|
| // Create a VideoEncoder based on the session's video channel configuration.
|
| scoped_ptr<VideoEncoder> video_encoder =
|
| CreateVideoEncoder(connection_->session()->config());
|
|
|
| // Create a VideoScheduler to pump frames from the capturer to the client.
|
| - video_scheduler_ = VideoScheduler::Create(
|
| + video_scheduler_ = new VideoScheduler(
|
| video_capture_task_runner_,
|
| video_encode_task_runner_,
|
| network_task_runner_,
|
| @@ -261,13 +239,39 @@ void ClientSession::OnConnectionChannelsConnected(
|
| if (connection_->session()->config().is_audio_enabled()) {
|
| scoped_ptr<AudioEncoder> audio_encoder =
|
| CreateAudioEncoder(connection_->session()->config());
|
| - audio_scheduler_ = AudioScheduler::Create(
|
| + audio_scheduler_ = new AudioScheduler(
|
| audio_task_runner_,
|
| network_task_runner_,
|
| desktop_environment_->CreateAudioCapturer(),
|
| audio_encoder.Pass(),
|
| connection_->audio_stub());
|
| }
|
| +}
|
| +
|
| +void ClientSession::OnConnectionChannelsConnected(
|
| + protocol::ConnectionToClient* connection) {
|
| + DCHECK(CalledOnValidThread());
|
| + DCHECK_EQ(connection_.get(), connection);
|
| +
|
| + // Negotiate capabilities with the client.
|
| + if (connection_->session()->config().SupportsCapabilities()) {
|
| + VLOG(1) << "Host capabilities: " << host_capabilities_;
|
| +
|
| + protocol::Capabilities capabilities;
|
| + capabilities.set_capabilities(host_capabilities_);
|
| + connection_->client_stub()->SetCapabilities(capabilities);
|
| + }
|
| +
|
| + // Start the event executor.
|
| + input_injector_->Start(CreateClipboardProxy());
|
| + SetDisableInputs(false);
|
| +
|
| + // Start capturing the screen.
|
| + video_scheduler_->Start();
|
| +
|
| + // Start recording audio.
|
| + if (connection_->session()->config().is_audio_enabled())
|
| + audio_scheduler_->Start();
|
|
|
| // Notify the event handler that all our channels are now connected.
|
| event_handler_->OnSessionChannelsConnected(this);
|
|
|