15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/protocol/host_control_dispatcher.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/callback_helpers.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/stream_socket.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/base/constants.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/proto/control.pb.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/proto/internal.pb.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/protocol/clipboard_stub.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/protocol/host_stub.h"
15c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "remoting/protocol/message_serialization.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace protocol {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HostControlDispatcher::HostControlDispatcher()
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : ChannelDispatcherBase(kControlChannelName),
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      clipboard_stub_(NULL),
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host_stub_(NULL) {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HostControlDispatcher::~HostControlDispatcher() {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer_.Close();
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostControlDispatcher::OnInitialized() {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reader_.Init(channel(), base::Bind(
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &HostControlDispatcher::OnMessageReceived, base::Unretained(this)));
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer_.Init(channel(), BufferedSocketWriter::WriteFailedCallback());
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void HostControlDispatcher::SetCapabilities(
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const Capabilities& capabilities) {
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ControlMessage message;
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  message.mutable_capabilities()->CopyFrom(capabilities);
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  writer_.Write(SerializeAndFrameMessage(message), base::Closure());
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
43b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void HostControlDispatcher::SetPairingResponse(
44b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    const PairingResponse& pairing_response) {
45b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ControlMessage message;
46b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  message.mutable_pairing_response()->CopyFrom(pairing_response);
47b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  writer_.Write(SerializeAndFrameMessage(message), base::Closure());
48b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
49b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
50c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdochvoid HostControlDispatcher::DeliverHostMessage(
51c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    const ExtensionMessage& message) {
52c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  ControlMessage control_message;
53c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  control_message.mutable_extension_message()->CopyFrom(message);
54c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  writer_.Write(SerializeAndFrameMessage(control_message), base::Closure());
55c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch}
56c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostControlDispatcher::InjectClipboardEvent(const ClipboardEvent& event) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ControlMessage message;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message.mutable_clipboard_event()->CopyFrom(event);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer_.Write(SerializeAndFrameMessage(message), base::Closure());
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostControlDispatcher::SetCursorShape(
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const CursorShapeInfo& cursor_shape) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ControlMessage message;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message.mutable_cursor_shape()->CopyFrom(cursor_shape);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer_.Write(SerializeAndFrameMessage(message), base::Closure());
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostControlDispatcher::OnMessageReceived(
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<ControlMessage> message, const base::Closure& done_task) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(clipboard_stub_);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(host_stub_);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ScopedClosureRunner done_runner(done_task);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (message->has_clipboard_event()) {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    clipboard_stub_->InjectClipboardEvent(message->clipboard_event());
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (message->has_client_resolution()) {
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    host_stub_->NotifyClientResolution(message->client_resolution());
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (message->has_video_control()) {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_stub_->ControlVideo(message->video_control());
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (message->has_audio_control()) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_stub_->ControlAudio(message->audio_control());
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else if (message->has_capabilities()) {
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    host_stub_->SetCapabilities(message->capabilities());
87b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  } else if (message->has_pairing_request()) {
88b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    host_stub_->RequestPairing(message->pairing_request());
89c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  } else if (message->has_extension_message()) {
90c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    host_stub_->DeliverClientMessage(message->extension_message());
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(WARNING) << "Unknown control message received.";
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace protocol
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace remoting
98