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