Chromium Code Reviews| 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/client_session.h" | 5 #include "remoting/host/client_session.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/message_loop_proxy.h" | 9 #include "base/message_loop_proxy.h" |
| 10 #include "media/video/capture/screen/screen_capturer.h" | 10 #include "media/video/capture/screen/screen_capturer.h" |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 89 DCHECK(!desktop_environment_); | 89 DCHECK(!desktop_environment_); |
| 90 DCHECK(!input_injector_); | 90 DCHECK(!input_injector_); |
| 91 DCHECK(!screen_controls_); | 91 DCHECK(!screen_controls_); |
| 92 DCHECK(!video_scheduler_); | 92 DCHECK(!video_scheduler_); |
| 93 | 93 |
| 94 connection_.reset(); | 94 connection_.reset(); |
| 95 } | 95 } |
| 96 | 96 |
| 97 void ClientSession::NotifyClientResolution( | 97 void ClientSession::NotifyClientResolution( |
| 98 const protocol::ClientResolution& resolution) { | 98 const protocol::ClientResolution& resolution) { |
| 99 DCHECK(CalledOnValidThread()); | |
| 100 | |
| 99 if (!resolution.has_dips_width() || !resolution.has_dips_height()) | 101 if (!resolution.has_dips_width() || !resolution.has_dips_height()) |
| 100 return; | 102 return; |
| 101 | 103 |
| 102 VLOG(1) << "Received ClientResolution (dips_width=" | 104 VLOG(1) << "Received ClientResolution (dips_width=" |
| 103 << resolution.dips_width() << ", dips_height=" | 105 << resolution.dips_width() << ", dips_height=" |
| 104 << resolution.dips_height() << ")"; | 106 << resolution.dips_height() << ")"; |
| 105 | 107 |
| 106 if (!screen_controls_) | 108 if (!screen_controls_) |
| 107 return; | 109 return; |
| 108 | 110 |
| 109 ScreenResolution client_resolution( | 111 ScreenResolution client_resolution( |
| 110 SkISize::Make(resolution.dips_width(), resolution.dips_height()), | 112 SkISize::Make(resolution.dips_width(), resolution.dips_height()), |
| 111 SkIPoint::Make(kDefaultDPI, kDefaultDPI)); | 113 SkIPoint::Make(kDefaultDPI, kDefaultDPI)); |
| 112 | 114 |
| 113 // Try to match the client's resolution. | 115 // Try to match the client's resolution. |
| 114 if (client_resolution.IsValid()) | 116 if (client_resolution.IsValid()) |
| 115 screen_controls_->SetScreenResolution(client_resolution); | 117 screen_controls_->SetScreenResolution(client_resolution); |
| 116 } | 118 } |
| 117 | 119 |
| 118 void ClientSession::ControlVideo(const protocol::VideoControl& video_control) { | 120 void ClientSession::ControlVideo(const protocol::VideoControl& video_control) { |
| 121 DCHECK(CalledOnValidThread()); | |
| 122 | |
| 119 if (video_control.has_enable()) { | 123 if (video_control.has_enable()) { |
| 120 VLOG(1) << "Received VideoControl (enable=" | 124 VLOG(1) << "Received VideoControl (enable=" |
| 121 << video_control.enable() << ")"; | 125 << video_control.enable() << ")"; |
| 122 if (video_scheduler_) | 126 if (video_scheduler_) |
| 123 video_scheduler_->Pause(!video_control.enable()); | 127 video_scheduler_->Pause(!video_control.enable()); |
| 124 } | 128 } |
| 125 } | 129 } |
| 126 | 130 |
| 127 void ClientSession::ControlAudio(const protocol::AudioControl& audio_control) { | 131 void ClientSession::ControlAudio(const protocol::AudioControl& audio_control) { |
| 132 DCHECK(CalledOnValidThread()); | |
| 133 | |
| 128 if (audio_control.has_enable()) { | 134 if (audio_control.has_enable()) { |
| 129 VLOG(1) << "Received AudioControl (enable=" | 135 VLOG(1) << "Received AudioControl (enable=" |
| 130 << audio_control.enable() << ")"; | 136 << audio_control.enable() << ")"; |
| 131 if (audio_scheduler_) | 137 if (audio_scheduler_) |
| 132 audio_scheduler_->Pause(!audio_control.enable()); | 138 audio_scheduler_->Pause(!audio_control.enable()); |
| 133 } | 139 } |
| 134 } | 140 } |
| 135 | 141 |
| 142 void ClientSession::SetCapabilities( | |
| 143 const protocol::Capabilities& capabilities) { | |
| 144 DCHECK(CalledOnValidThread()); | |
| 145 | |
| 146 // Ignore all the messages but the 1st one. | |
| 147 if (client_capabilities_) { | |
| 148 LOG(WARNING) << "protocol::Capabilities has been received already."; | |
| 149 return; | |
| 150 } | |
| 151 | |
| 152 // Calculate the set of capabilities enabled by both client and host and pass | |
| 153 // it to the desktop environment. | |
| 154 client_capabilities_ = make_scoped_ptr(new Capabilities()); | |
| 155 if (client_capabilities_->FromProtocolMessage(capabilities)) { | |
| 156 VLOG(1) << "Client capabilities: " << client_capabilities_->ToString(); | |
|
Sergey Ulanov
2013/04/16 08:38:53
nit: this will convert the capabilities to string
alexeypa (please no reviews)
2013/04/16 22:06:11
It is actually useful. I used it when I tested var
| |
| 157 } else { | |
| 158 LOG(ERROR) << "Invalid protocol::Capabilities received."; | |
| 159 } | |
| 160 | |
| 161 if (desktop_environment_) { | |
|
Sergey Ulanov
2013/04/16 08:38:53
It sucks that we need to worry about the case when
alexeypa (please no reviews)
2013/04/16 22:06:11
Done.
Sergey Ulanov
2013/04/18 00:34:53
I don't see it in the last patchset.
alexeypa (please no reviews)
2013/04/18 18:56:36
It turned out that |event_handler_->OnSessionAuthe
| |
| 162 desktop_environment_->SetCapabilities( | |
| 163 client_capabilities_->Intersect(host_capabilities_)); | |
| 164 } | |
| 165 } | |
| 166 | |
| 136 void ClientSession::OnConnectionAuthenticated( | 167 void ClientSession::OnConnectionAuthenticated( |
| 137 protocol::ConnectionToClient* connection) { | 168 protocol::ConnectionToClient* connection) { |
| 138 DCHECK(CalledOnValidThread()); | 169 DCHECK(CalledOnValidThread()); |
| 139 DCHECK_EQ(connection_.get(), connection); | 170 DCHECK_EQ(connection_.get(), connection); |
| 140 | 171 |
| 141 auth_input_filter_.set_enabled(true); | 172 auth_input_filter_.set_enabled(true); |
| 142 auth_clipboard_filter_.set_enabled(true); | 173 auth_clipboard_filter_.set_enabled(true); |
| 143 | 174 |
| 144 clipboard_echo_filter_.set_client_stub(connection_->client_stub()); | 175 clipboard_echo_filter_.set_client_stub(connection_->client_stub()); |
| 145 mouse_clamping_filter_.set_video_stub(connection_->video_stub()); | 176 mouse_clamping_filter_.set_video_stub(connection_->video_stub()); |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 160 DCHECK_EQ(connection_.get(), connection); | 191 DCHECK_EQ(connection_.get(), connection); |
| 161 DCHECK(!audio_scheduler_); | 192 DCHECK(!audio_scheduler_); |
| 162 DCHECK(!desktop_environment_); | 193 DCHECK(!desktop_environment_); |
| 163 DCHECK(!input_injector_); | 194 DCHECK(!input_injector_); |
| 164 DCHECK(!screen_controls_); | 195 DCHECK(!screen_controls_); |
| 165 DCHECK(!video_scheduler_); | 196 DCHECK(!video_scheduler_); |
| 166 | 197 |
| 167 desktop_environment_ = | 198 desktop_environment_ = |
| 168 desktop_environment_factory_->Create(control_factory_.GetWeakPtr()); | 199 desktop_environment_factory_->Create(control_factory_.GetWeakPtr()); |
| 169 | 200 |
| 201 // Negotiate capabilities with the client. | |
| 202 if (connection_->session()->config().supports_capabilities()) { | |
| 203 host_capabilities_ = desktop_environment_->GetCapabilities(); | |
| 204 VLOG(1) << "Host capabilities: " << host_capabilities_.ToString(); | |
| 205 | |
| 206 connection_->client_stub()->SetCapabilities( | |
| 207 *host_capabilities_.ToProtocolMessage()); | |
| 208 | |
| 209 // |client_capabilities_| could have been received before all channels were | |
| 210 // connected. Process them now. | |
| 211 if (client_capabilities_) { | |
| 212 desktop_environment_->SetCapabilities( | |
| 213 client_capabilities_->Intersect(host_capabilities_)); | |
| 214 } | |
| 215 } else { | |
| 216 VLOG(1) << "The client does not support any capabilities."; | |
| 217 | |
| 218 client_capabilities_ = make_scoped_ptr(new Capabilities()); | |
| 219 desktop_environment_->SetCapabilities(*client_capabilities_); | |
| 220 } | |
| 221 | |
| 170 // Create the object that controls the screen resolution. | 222 // Create the object that controls the screen resolution. |
| 171 screen_controls_ = desktop_environment_->CreateScreenControls(); | 223 screen_controls_ = desktop_environment_->CreateScreenControls(); |
| 172 | 224 |
| 173 // Create and start the event executor. | 225 // Create and start the event executor. |
| 174 input_injector_ = desktop_environment_->CreateInputInjector(); | 226 input_injector_ = desktop_environment_->CreateInputInjector(); |
| 175 input_injector_->Start(CreateClipboardProxy()); | 227 input_injector_->Start(CreateClipboardProxy()); |
| 176 | 228 |
| 177 // Connect the host clipboard and input stubs. | 229 // Connect the host clipboard and input stubs. |
| 178 host_input_filter_.set_input_stub(input_injector_.get()); | 230 host_input_filter_.set_input_stub(input_injector_.get()); |
| 179 clipboard_echo_filter_.set_host_stub(input_injector_.get()); | 231 clipboard_echo_filter_.set_host_stub(input_injector_.get()); |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 339 return scoped_ptr<AudioEncoder>(new AudioEncoderSpeex()); | 391 return scoped_ptr<AudioEncoder>(new AudioEncoderSpeex()); |
| 340 } else if (audio_config.codec == protocol::ChannelConfig::CODEC_OPUS) { | 392 } else if (audio_config.codec == protocol::ChannelConfig::CODEC_OPUS) { |
| 341 return scoped_ptr<AudioEncoder>(new AudioEncoderOpus()); | 393 return scoped_ptr<AudioEncoder>(new AudioEncoderOpus()); |
| 342 } | 394 } |
| 343 | 395 |
| 344 NOTIMPLEMENTED(); | 396 NOTIMPLEMENTED(); |
| 345 return scoped_ptr<AudioEncoder>(NULL); | 397 return scoped_ptr<AudioEncoder>(NULL); |
| 346 } | 398 } |
| 347 | 399 |
| 348 } // namespace remoting | 400 } // namespace remoting |
| OLD | NEW |