| Index: remoting/host/client_session.cc
|
| diff --git a/remoting/host/client_session.cc b/remoting/host/client_session.cc
|
| index 58b49a56dc89d6fb172c4634271b6f0b278e7d94..897a47137e5fa8b9ff7ed79f2bdabcc71f276337 100644
|
| --- a/remoting/host/client_session.cc
|
| +++ b/remoting/host/client_session.cc
|
| @@ -96,6 +96,8 @@ ClientSession::~ClientSession() {
|
|
|
| void ClientSession::NotifyClientResolution(
|
| const protocol::ClientResolution& resolution) {
|
| + DCHECK(CalledOnValidThread());
|
| +
|
| if (!resolution.has_dips_width() || !resolution.has_dips_height())
|
| return;
|
|
|
| @@ -116,6 +118,8 @@ void ClientSession::NotifyClientResolution(
|
| }
|
|
|
| void ClientSession::ControlVideo(const protocol::VideoControl& video_control) {
|
| + DCHECK(CalledOnValidThread());
|
| +
|
| if (video_control.has_enable()) {
|
| VLOG(1) << "Received VideoControl (enable="
|
| << video_control.enable() << ")";
|
| @@ -125,6 +129,8 @@ void ClientSession::ControlVideo(const protocol::VideoControl& video_control) {
|
| }
|
|
|
| void ClientSession::ControlAudio(const protocol::AudioControl& audio_control) {
|
| + DCHECK(CalledOnValidThread());
|
| +
|
| if (audio_control.has_enable()) {
|
| VLOG(1) << "Received AudioControl (enable="
|
| << audio_control.enable() << ")";
|
| @@ -133,6 +139,31 @@ void ClientSession::ControlAudio(const protocol::AudioControl& audio_control) {
|
| }
|
| }
|
|
|
| +void ClientSession::SetCapabilities(
|
| + const protocol::Capabilities& capabilities) {
|
| + DCHECK(CalledOnValidThread());
|
| +
|
| + // Ignore all the messages but the 1st one.
|
| + if (client_capabilities_) {
|
| + LOG(WARNING) << "protocol::Capabilities has been received already.";
|
| + return;
|
| + }
|
| +
|
| + // Calculate the set of capabilities enabled by both client and host and pass
|
| + // it to the desktop environment.
|
| + client_capabilities_ = make_scoped_ptr(new Capabilities());
|
| + if (client_capabilities_->FromProtocolMessage(capabilities)) {
|
| + VLOG(1) << "Client capabilities: " << client_capabilities_->ToString();
|
| + } else {
|
| + LOG(ERROR) << "Invalid protocol::Capabilities received.";
|
| + }
|
| +
|
| + if (desktop_environment_) {
|
| + desktop_environment_->SetCapabilities(
|
| + client_capabilities_->Intersect(host_capabilities_));
|
| + }
|
| +}
|
| +
|
| void ClientSession::OnConnectionAuthenticated(
|
| protocol::ConnectionToClient* connection) {
|
| DCHECK(CalledOnValidThread());
|
| @@ -167,6 +198,27 @@ void ClientSession::OnConnectionChannelsConnected(
|
| desktop_environment_ =
|
| desktop_environment_factory_->Create(control_factory_.GetWeakPtr());
|
|
|
| + // Negotiate capabilities with the client.
|
| + if (connection_->session()->config().supports_capabilities()) {
|
| + host_capabilities_ = desktop_environment_->GetCapabilities();
|
| + VLOG(1) << "Host capabilities: " << host_capabilities_.ToString();
|
| +
|
| + connection_->client_stub()->SetCapabilities(
|
| + *host_capabilities_.ToProtocolMessage());
|
| +
|
| + // |client_capabilities_| could have been received before all channels were
|
| + // connected. Process them now.
|
| + if (client_capabilities_) {
|
| + desktop_environment_->SetCapabilities(
|
| + client_capabilities_->Intersect(host_capabilities_));
|
| + }
|
| + } else {
|
| + VLOG(1) << "The client does not support any capabilities.";
|
| +
|
| + client_capabilities_ = make_scoped_ptr(new Capabilities());
|
| + desktop_environment_->SetCapabilities(*client_capabilities_);
|
| + }
|
| +
|
| // Create the object that controls the screen resolution.
|
| screen_controls_ = desktop_environment_->CreateScreenControls();
|
|
|
|
|