Index: remoting/client/chromoting_client.cc |
diff --git a/remoting/client/chromoting_client.cc b/remoting/client/chromoting_client.cc |
index 28d5154b2bcad8c4e6b766a2f53e6743ff3b1cee..c9208ff1a87f2aa4695853946284c21cfb454558 100644 |
--- a/remoting/client/chromoting_client.cc |
+++ b/remoting/client/chromoting_client.cc |
@@ -5,6 +5,7 @@ |
#include "remoting/client/chromoting_client.h" |
#include "base/bind.h" |
+#include "remoting/base/capabilities.h" |
#include "remoting/client/audio_decode_scheduler.h" |
#include "remoting/client/audio_player.h" |
#include "remoting/client/client_context.h" |
@@ -14,6 +15,7 @@ |
#include "remoting/proto/video.pb.h" |
#include "remoting/protocol/authentication_method.h" |
#include "remoting/protocol/connection_to_host.h" |
+#include "remoting/protocol/host_stub.h" |
#include "remoting/protocol/negotiating_client_authenticator.h" |
#include "remoting/protocol/session_config.h" |
#include "remoting/protocol/transport.h" |
@@ -33,6 +35,7 @@ ChromotingClient::ChromotingClient( |
task_runner_(client_context->main_task_runner()), |
connection_(connection), |
user_interface_(user_interface), |
+ host_capabilities_received_(false), |
weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { |
rectangle_decoder_ = |
new RectangleUpdateDecoder(client_context->main_task_runner(), |
@@ -88,14 +91,39 @@ ChromotingStats* ChromotingClient::GetStats() { |
return rectangle_decoder_->GetStats(); |
} |
+void ChromotingClient::SetCapabilities( |
+ const protocol::Capabilities& capabilities) { |
+ DCHECK(task_runner_->BelongsToCurrentThread()); |
+ |
+ // Only accept the first |protocol::Capabilities| message. |
+ if (host_capabilities_received_) { |
+ LOG(WARNING) << "protocol::Capabilities has been received already."; |
+ return; |
+ } |
+ |
+ host_capabilities_received_ = true; |
+ if (capabilities.has_capabilities()) |
+ host_capabilities_ = capabilities.capabilities(); |
+ |
+ VLOG(1) << "Host capabilities: " << host_capabilities_; |
+ |
+ // Calculate the set of capabilities enabled by both client and host and pass |
+ // it to the webapp. |
+ user_interface_->SetCapabilities( |
+ IntersectCapabilities(config_.capabilities, host_capabilities_)); |
+} |
+ |
void ChromotingClient::InjectClipboardEvent( |
const protocol::ClipboardEvent& event) { |
DCHECK(task_runner_->BelongsToCurrentThread()); |
+ |
user_interface_->GetClipboardStub()->InjectClipboardEvent(event); |
} |
void ChromotingClient::SetCursorShape( |
const protocol::CursorShapeInfo& cursor_shape) { |
+ DCHECK(task_runner_->BelongsToCurrentThread()); |
+ |
user_interface_->GetCursorShapeStub()->SetCursorShape(cursor_shape); |
} |
@@ -121,6 +149,20 @@ void ChromotingClient::Initialize() { |
rectangle_decoder_->Initialize(connection_->config()); |
if (connection_->config().is_audio_enabled()) |
audio_decode_scheduler_->Initialize(connection_->config()); |
+ |
+ // Negotiate capabilities with the host. |
+ if (connection_->config().SupportsCapabilities()) { |
+ VLOG(1) << "Client capabilities: " << config_.capabilities; |
+ |
+ protocol::Capabilities capabilities; |
+ capabilities.set_capabilities(config_.capabilities); |
+ connection_->host_stub()->SetCapabilities(capabilities); |
+ } else { |
+ VLOG(1) << "The host does not support any capabilities."; |
+ |
+ host_capabilities_received_ = true; |
+ user_interface_->SetCapabilities(host_capabilities_); |
+ } |
} |
} // namespace remoting |