From ba6d1c2d2645b0d54b4479a0762757978242ca9b Mon Sep 17 00:00:00 2001 From: "simonmorris@chromium.org" Date: Sat, 31 Mar 2012 01:28:38 +0000 Subject: [PATCH] [Chromoting] Add plumbing to carry clipboard events from the host to the client. BUG=117473 Review URL: http://codereview.chromium.org/9921034 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@130023 0039d316-1c4b-4281-b951-d872f2087c98 --- remoting/client/chromoting_client.cc | 8 +++++++- remoting/client/chromoting_client.h | 6 ++++++ .../protocol/client_control_dispatcher.cc | 9 ++++++++- remoting/protocol/client_control_dispatcher.h | 16 ++++++++++----- remoting/protocol/connection_to_host.cc | 5 +++++ remoting/protocol/connection_to_host.h | 3 +++ remoting/protocol/host_control_dispatcher.cc | 6 ++++++ remoting/protocol/host_control_dispatcher.h | 20 ++++++++++--------- 8 files changed, 57 insertions(+), 16 deletions(-) diff --git a/remoting/client/chromoting_client.cc b/remoting/client/chromoting_client.cc index 74f63138958243..f37a2cdf3cd1a4 100644 --- a/remoting/client/chromoting_client.cc +++ b/remoting/client/chromoting_client.cc @@ -61,7 +61,7 @@ void ChromotingClient::Start(scoped_refptr xmpp_proxy) { connection_->Connect(xmpp_proxy, config_.local_jid, config_.host_jid, config_.host_public_key, authenticator.Pass(), - this, this, this); + this, this, this, this); if (!view_->Initialize()) { ClientDone(); @@ -104,6 +104,12 @@ ChromotingStats* ChromotingClient::GetStats() { return &stats_; } +void ChromotingClient::InjectClipboardEvent( + const protocol::ClipboardEvent& event) { + // TODO(simonmorris): Pass the clipboard event to the webapp. + return; +} + void ChromotingClient::ProcessVideoPacket(scoped_ptr packet, const base::Closure& done) { DCHECK(message_loop()->BelongsToCurrentThread()); diff --git a/remoting/client/chromoting_client.h b/remoting/client/chromoting_client.h index c71475efc5fe87..7df081682e6d19 100644 --- a/remoting/client/chromoting_client.h +++ b/remoting/client/chromoting_client.h @@ -16,6 +16,7 @@ #include "remoting/client/chromoting_stats.h" #include "remoting/client/chromoting_view.h" #include "remoting/protocol/client_stub.h" +#include "remoting/protocol/clipboard_stub.h" #include "remoting/protocol/connection_to_host.h" #include "remoting/protocol/input_stub.h" #include "remoting/protocol/video_stub.h" @@ -31,6 +32,7 @@ class RectangleUpdateDecoder; // TODO(sergeyu): Move VideoStub implementation to RectangleUpdateDecoder. class ChromotingClient : public protocol::ConnectionToHost::HostEventCallback, public protocol::ClientStub, + public protocol::ClipboardStub, public protocol::VideoStub { public: // Objects passed in are not owned by this class. @@ -49,6 +51,10 @@ class ChromotingClient : public protocol::ConnectionToHost::HostEventCallback, // Return the stats recorded by this client. ChromotingStats* GetStats(); + // ClipboardStub implementation. + virtual void InjectClipboardEvent(const protocol::ClipboardEvent& event) + OVERRIDE; + // ConnectionToHost::HostEventCallback implementation. virtual void OnConnectionState( protocol::ConnectionToHost::State state, diff --git a/remoting/protocol/client_control_dispatcher.cc b/remoting/protocol/client_control_dispatcher.cc index b1aefc2f3da0c6..b6e8250d761319 100644 --- a/remoting/protocol/client_control_dispatcher.cc +++ b/remoting/protocol/client_control_dispatcher.cc @@ -21,6 +21,7 @@ namespace protocol { ClientControlDispatcher::ClientControlDispatcher() : ChannelDispatcherBase(kControlChannelName), client_stub_(NULL), + clipboard_stub_(NULL), writer_(new BufferedSocketWriter(base::MessageLoopProxy::current())) { } @@ -45,8 +46,14 @@ void ClientControlDispatcher::InjectClipboardEvent( void ClientControlDispatcher::OnMessageReceived( scoped_ptr message, const base::Closure& done_task) { DCHECK(client_stub_); + DCHECK(clipboard_stub_); base::ScopedClosureRunner done_runner(done_task); - LOG(WARNING) << "Unknown control message received."; + + if (message->has_clipboard_event()) { + clipboard_stub_->InjectClipboardEvent(message->clipboard_event()); + } else { + LOG(WARNING) << "Unknown control message received."; + } } } // namespace protocol diff --git a/remoting/protocol/client_control_dispatcher.h b/remoting/protocol/client_control_dispatcher.h index d7acac1f27a1bf..3f3c13421b5981 100644 --- a/remoting/protocol/client_control_dispatcher.h +++ b/remoting/protocol/client_control_dispatcher.h @@ -20,8 +20,8 @@ class BufferedSocketWriter; class Session; // ClientControlDispatcher dispatches incoming messages on the control -// channel to ClientStub, and also implements ClipboardStub and HostStub for -// outgoing messages. +// channel to ClientStub or ClipboardStub, and also implements ClipboardStub +// and HostStub for outgoing messages. class ClientControlDispatcher : public ChannelDispatcherBase, public ClipboardStub, public HostStub { @@ -32,11 +32,16 @@ class ClientControlDispatcher : public ChannelDispatcherBase, // ClipboardStub implementation. virtual void InjectClipboardEvent(const ClipboardEvent& event) OVERRIDE; - // Sets ClientStub that will be called for each incoming control - // message. Doesn't take ownership of |client_stub|. It must outlive - // this dispatcher. + // Sets the ClientStub that will be called for each incoming control + // message. |client_stub| must outlive this object. void set_client_stub(ClientStub* client_stub) { client_stub_ = client_stub; } + // Sets the ClipboardStub that will be called for each incoming clipboard + // message. |clipboard_stub| must outlive this object. + void set_clipboard_stub(ClipboardStub* clipboard_stub) { + clipboard_stub_ = clipboard_stub; + } + protected: // ChannelDispatcherBase overrides. virtual void OnInitialized() OVERRIDE; @@ -46,6 +51,7 @@ class ClientControlDispatcher : public ChannelDispatcherBase, const base::Closure& done_task); ClientStub* client_stub_; + ClipboardStub* clipboard_stub_; ProtobufMessageReader reader_; scoped_refptr writer_; diff --git a/remoting/protocol/connection_to_host.cc b/remoting/protocol/connection_to_host.cc index 457cf786c43e56..6fcdfa5520e809 100644 --- a/remoting/protocol/connection_to_host.cc +++ b/remoting/protocol/connection_to_host.cc @@ -16,6 +16,7 @@ #include "remoting/protocol/client_control_dispatcher.h" #include "remoting/protocol/client_event_dispatcher.h" #include "remoting/protocol/client_stub.h" +#include "remoting/protocol/clipboard_stub.h" #include "remoting/protocol/errors.h" #include "remoting/protocol/jingle_session_manager.h" #include "remoting/protocol/pepper_transport_factory.h" @@ -35,6 +36,7 @@ ConnectionToHost::ConnectionToHost( allow_nat_traversal_(allow_nat_traversal), event_callback_(NULL), client_stub_(NULL), + clipboard_stub_(NULL), video_stub_(NULL), state_(CONNECTING), error_(OK) { @@ -54,9 +56,11 @@ void ConnectionToHost::Connect(scoped_refptr xmpp_proxy, scoped_ptr authenticator, HostEventCallback* event_callback, ClientStub* client_stub, + ClipboardStub* clipboard_stub, VideoStub* video_stub) { event_callback_ = event_callback; client_stub_ = client_stub; + clipboard_stub_ = clipboard_stub; video_stub_ = video_stub; authenticator_ = authenticator.Pass(); @@ -165,6 +169,7 @@ void ConnectionToHost::OnSessionStateChange( control_dispatcher_->Init(session_.get(), base::Bind( &ConnectionToHost::OnChannelInitialized, base::Unretained(this))); control_dispatcher_->set_client_stub(client_stub_); + control_dispatcher_->set_clipboard_stub(clipboard_stub_); event_dispatcher_.reset(new ClientEventDispatcher()); event_dispatcher_->Init(session_.get(), base::Bind( diff --git a/remoting/protocol/connection_to_host.h b/remoting/protocol/connection_to_host.h index cc8b691fb160c6..9aae099c646132 100644 --- a/remoting/protocol/connection_to_host.h +++ b/remoting/protocol/connection_to_host.h @@ -37,6 +37,7 @@ class Authenticator; class ClientControlDispatcher; class ClientEventDispatcher; class ClientStub; +class ClipboardStub; class HostStub; class InputStub; class SessionConfig; @@ -73,6 +74,7 @@ class ConnectionToHost : public SignalStrategy::Listener, scoped_ptr authenticator, HostEventCallback* event_callback, ClientStub* client_stub, + ClipboardStub* clipboard_stub, VideoStub* video_stub); virtual void Disconnect(const base::Closure& shutdown_task); @@ -128,6 +130,7 @@ class ConnectionToHost : public SignalStrategy::Listener, // Stub for incoming messages. ClientStub* client_stub_; + ClipboardStub* clipboard_stub_; VideoStub* video_stub_; scoped_ptr signal_strategy_; diff --git a/remoting/protocol/host_control_dispatcher.cc b/remoting/protocol/host_control_dispatcher.cc index 2dc436426cdb24..4a78d0e21ecf24 100644 --- a/remoting/protocol/host_control_dispatcher.cc +++ b/remoting/protocol/host_control_dispatcher.cc @@ -34,6 +34,12 @@ void HostControlDispatcher::OnInitialized() { writer_->Init(channel(), BufferedSocketWriter::WriteFailedCallback()); } +void HostControlDispatcher::InjectClipboardEvent(const ClipboardEvent& event) { + ControlMessage message; + message.mutable_clipboard_event()->CopyFrom(event); + writer_->Write(SerializeAndFrameMessage(message), base::Closure()); +} + void HostControlDispatcher::OnMessageReceived( scoped_ptr message, const base::Closure& done_task) { DCHECK(clipboard_stub_); diff --git a/remoting/protocol/host_control_dispatcher.h b/remoting/protocol/host_control_dispatcher.h index f1e271c088b724..0e36ce415a184d 100644 --- a/remoting/protocol/host_control_dispatcher.h +++ b/remoting/protocol/host_control_dispatcher.h @@ -8,6 +8,7 @@ #include "base/memory/ref_counted.h" #include "remoting/protocol/channel_dispatcher_base.h" #include "remoting/protocol/client_stub.h" +#include "remoting/protocol/clipboard_stub.h" #include "remoting/protocol/message_reader.h" namespace net { @@ -18,29 +19,30 @@ namespace remoting { namespace protocol { class BufferedSocketWriter; -class ClipboardStub; class ControlMessage; class HostStub; class Session; // HostControlDispatcher dispatches incoming messages on the control -// channel to HostStub or ClipboardStub, and also implements ClientStub for -// outgoing messages. -class HostControlDispatcher : public ChannelDispatcherBase, public ClientStub { +// channel to HostStub or ClipboardStub, and also implements ClientStub and +// ClipboardStub for outgoing messages. +class HostControlDispatcher : public ChannelDispatcherBase, public ClientStub, + public ClipboardStub { public: HostControlDispatcher(); virtual ~HostControlDispatcher(); + // ClipboardStub implementation. + virtual void InjectClipboardEvent(const ClipboardEvent& event) OVERRIDE; + // Sets the ClipboardStub that will be called for each incoming clipboard - // message. Doesn't take ownership of |clipboard_stub|, which must outlive - // the dispatcher. + // message. |clipboard_stub| must outlive this object. void set_clipboard_stub(ClipboardStub* clipboard_stub) { clipboard_stub_ = clipboard_stub; } - // Sets HostStub that will be called for each incoming control - // message. Doesn't take ownership of |host_stub|. It must outlive - // this dispatcher. + // Sets the HostStub that will be called for each incoming control + // message. |host_stub| must outlive this object. void set_host_stub(HostStub* host_stub) { host_stub_ = host_stub; } protected: