Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / remoting / protocol / host_control_dispatcher.cc
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // 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
7 #include "base/callback_helpers.h"
8 #include "base/message_loop/message_loop_proxy.h"
9 #include "net/socket/stream_socket.h"
10 #include "remoting/base/constants.h"
11 #include "remoting/proto/control.pb.h"
12 #include "remoting/proto/internal.pb.h"
13 #include "remoting/protocol/clipboard_stub.h"
14 #include "remoting/protocol/host_stub.h"
15 #include "remoting/protocol/message_serialization.h"
16
17 namespace remoting {
18 namespace protocol {
19
20 HostControlDispatcher::HostControlDispatcher()
21     : ChannelDispatcherBase(kControlChannelName),
22       clipboard_stub_(NULL),
23       host_stub_(NULL) {
24 }
25
26 HostControlDispatcher::~HostControlDispatcher() {
27   writer_.Close();
28 }
29
30 void HostControlDispatcher::OnInitialized() {
31   reader_.Init(channel(), base::Bind(
32       &HostControlDispatcher::OnMessageReceived, base::Unretained(this)));
33   writer_.Init(channel(), BufferedSocketWriter::WriteFailedCallback());
34 }
35
36 void HostControlDispatcher::SetCapabilities(
37     const Capabilities& capabilities) {
38   ControlMessage message;
39   message.mutable_capabilities()->CopyFrom(capabilities);
40   writer_.Write(SerializeAndFrameMessage(message), base::Closure());
41 }
42
43 void 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
50 void 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
57 void HostControlDispatcher::InjectClipboardEvent(const ClipboardEvent& event) {
58   ControlMessage message;
59   message.mutable_clipboard_event()->CopyFrom(event);
60   writer_.Write(SerializeAndFrameMessage(message), base::Closure());
61 }
62
63 void 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
70 void HostControlDispatcher::OnMessageReceived(
71     scoped_ptr<ControlMessage> message, const base::Closure& done_task) {
72   DCHECK(clipboard_stub_);
73   DCHECK(host_stub_);
74
75   base::ScopedClosureRunner done_runner(done_task);
76
77   if (message->has_clipboard_event()) {
78     clipboard_stub_->InjectClipboardEvent(message->clipboard_event());
79   } else if (message->has_client_resolution()) {
80     host_stub_->NotifyClientResolution(message->client_resolution());
81   } else if (message->has_video_control()) {
82     host_stub_->ControlVideo(message->video_control());
83   } else if (message->has_audio_control()) {
84     host_stub_->ControlAudio(message->audio_control());
85   } else if (message->has_capabilities()) {
86     host_stub_->SetCapabilities(message->capabilities());
87   } else if (message->has_pairing_request()) {
88     host_stub_->RequestPairing(message->pairing_request());
89   } else if (message->has_extension_message()) {
90     host_stub_->DeliverClientMessage(message->extension_message());
91   } else {
92     LOG(WARNING) << "Unknown control message received.";
93   }
94 }
95
96 }  // namespace protocol
97 }  // namespace remoting