blob: dfb7d181ec0f7f22b4836d91dfc53fd28bbae303 [file] [log] [blame]
[email protected]e265ad72012-03-16 17:28:031// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]a07ef3d2011-11-18 01:31:432// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "remoting/protocol/host_control_dispatcher.h"
6
[email protected]1c232c22013-08-30 02:04:047#include "base/callback_helpers.h"
[email protected]7ccb7072013-06-10 20:56:288#include "base/message_loop/message_loop_proxy.h"
[email protected]2e8b52c2011-11-22 00:07:139#include "net/socket/stream_socket.h"
10#include "remoting/base/constants.h"
[email protected]a07ef3d2011-11-18 01:31:4311#include "remoting/proto/control.pb.h"
12#include "remoting/proto/internal.pb.h"
[email protected]e265ad72012-03-16 17:28:0313#include "remoting/protocol/clipboard_stub.h"
[email protected]a07ef3d2011-11-18 01:31:4314#include "remoting/protocol/host_stub.h"
[email protected]b76a2742014-04-10 05:38:2615#include "remoting/protocol/message_serialization.h"
[email protected]a07ef3d2011-11-18 01:31:4316
17namespace remoting {
18namespace protocol {
19
20HostControlDispatcher::HostControlDispatcher()
[email protected]2e8b52c2011-11-22 00:07:1321 : ChannelDispatcherBase(kControlChannelName),
[email protected]e265ad72012-03-16 17:28:0322 clipboard_stub_(NULL),
[email protected]a3464dca2012-05-24 01:27:0923 host_stub_(NULL) {
[email protected]a07ef3d2011-11-18 01:31:4324}
25
26HostControlDispatcher::~HostControlDispatcher() {
[email protected]a3464dca2012-05-24 01:27:0927 writer_.Close();
[email protected]a07ef3d2011-11-18 01:31:4328}
29
[email protected]2e8b52c2011-11-22 00:07:1330void HostControlDispatcher::OnInitialized() {
31 reader_.Init(channel(), base::Bind(
[email protected]a07ef3d2011-11-18 01:31:4332 &HostControlDispatcher::OnMessageReceived, base::Unretained(this)));
[email protected]a3464dca2012-05-24 01:27:0933 writer_.Init(channel(), BufferedSocketWriter::WriteFailedCallback());
[email protected]a07ef3d2011-11-18 01:31:4334}
35
[email protected]a5d181f2013-04-19 14:55:3736void HostControlDispatcher::SetCapabilities(
37 const Capabilities& capabilities) {
38 ControlMessage message;
39 message.mutable_capabilities()->CopyFrom(capabilities);
40 writer_.Write(SerializeAndFrameMessage(message), base::Closure());
41}
42
[email protected]9ffa78a22013-05-10 04:35:1043void HostControlDispatcher::SetPairingResponse(
44 const PairingResponse& pairing_response) {
45 ControlMessage message;
46 message.mutable_pairing_response()->CopyFrom(pairing_response);
47 writer_.Write(SerializeAndFrameMessage(message), base::Closure());
48}
49
[email protected]09eabd65c2013-08-13 00:13:4850void HostControlDispatcher::DeliverHostMessage(
51 const ExtensionMessage& message) {
52 ControlMessage control_message;
53 control_message.mutable_extension_message()->CopyFrom(message);
54 writer_.Write(SerializeAndFrameMessage(control_message), base::Closure());
55}
56
[email protected]ba6d1c2d2012-03-31 01:28:3857void HostControlDispatcher::InjectClipboardEvent(const ClipboardEvent& event) {
58 ControlMessage message;
59 message.mutable_clipboard_event()->CopyFrom(event);
[email protected]a3464dca2012-05-24 01:27:0960 writer_.Write(SerializeAndFrameMessage(message), base::Closure());
[email protected]ba6d1c2d2012-03-31 01:28:3861}
62
[email protected]d65e15bd2012-06-02 22:16:4163void HostControlDispatcher::SetCursorShape(
64 const CursorShapeInfo& cursor_shape) {
65 ControlMessage message;
66 message.mutable_cursor_shape()->CopyFrom(cursor_shape);
67 writer_.Write(SerializeAndFrameMessage(message), base::Closure());
68}
69
[email protected]a07ef3d2011-11-18 01:31:4370void HostControlDispatcher::OnMessageReceived(
[email protected]9302fce2012-03-28 03:57:5771 scoped_ptr<ControlMessage> message, const base::Closure& done_task) {
[email protected]e265ad72012-03-16 17:28:0372 DCHECK(clipboard_stub_);
[email protected]a07ef3d2011-11-18 01:31:4373 DCHECK(host_stub_);
[email protected]e265ad72012-03-16 17:28:0374
75 base::ScopedClosureRunner done_runner(done_task);
76
77 if (message->has_clipboard_event()) {
78 clipboard_stub_->InjectClipboardEvent(message->clipboard_event());
[email protected]48a8ca32013-02-13 04:31:0179 } else if (message->has_client_resolution()) {
80 host_stub_->NotifyClientResolution(message->client_resolution());
[email protected]50d71c72012-05-03 01:28:5581 } else if (message->has_video_control()) {
82 host_stub_->ControlVideo(message->video_control());
[email protected]f458bed2012-10-18 03:27:5983 } else if (message->has_audio_control()) {
84 host_stub_->ControlAudio(message->audio_control());
[email protected]a5d181f2013-04-19 14:55:3785 } else if (message->has_capabilities()) {
86 host_stub_->SetCapabilities(message->capabilities());
[email protected]9ffa78a22013-05-10 04:35:1087 } else if (message->has_pairing_request()) {
88 host_stub_->RequestPairing(message->pairing_request());
[email protected]09eabd65c2013-08-13 00:13:4889 } else if (message->has_extension_message()) {
90 host_stub_->DeliverClientMessage(message->extension_message());
[email protected]e265ad72012-03-16 17:28:0391 } else {
92 LOG(WARNING) << "Unknown control message received.";
93 }
[email protected]a07ef3d2011-11-18 01:31:4394}
95
96} // namespace protocol
97} // namespace remoting