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#ifndef REMOTING_PROTOCOL_CLIENT_CONTROL_DISPATCHER_H_
6#define REMOTING_PROTOCOL_CLIENT_CONTROL_DISPATCHER_H_
7
8#include "base/memory/ref_counted.h"
9#include "remoting/protocol/buffered_socket_writer.h"
10#include "remoting/protocol/channel_dispatcher_base.h"
11#include "remoting/protocol/clipboard_stub.h"
12#include "remoting/protocol/cursor_shape_stub.h"
13#include "remoting/protocol/host_stub.h"
14#include "remoting/protocol/message_reader.h"
15
16namespace remoting {
17namespace protocol {
18
19class ClientStub;
20class ControlMessage;
21class Session;
22
23// ClientControlDispatcher dispatches incoming messages on the control
24// channel to ClientStub, ClipboardStub or CursorShapeStub.
25// It also implements ClipboardStub and HostStub for outgoing messages.
26class ClientControlDispatcher : public ChannelDispatcherBase,
27                                public ClipboardStub,
28                                public HostStub {
29 public:
30  ClientControlDispatcher();
31  virtual ~ClientControlDispatcher();
32
33  // ClipboardStub implementation.
34  virtual void InjectClipboardEvent(const ClipboardEvent& event) OVERRIDE;
35
36  // HostStub implementation.
37  virtual void NotifyClientResolution(
38      const ClientResolution& resolution) OVERRIDE;
39  virtual void ControlVideo(const VideoControl& video_control) OVERRIDE;
40  virtual void ControlAudio(const AudioControl& audio_control) OVERRIDE;
41  virtual void SetCapabilities(const Capabilities& capabilities) OVERRIDE;
42  virtual void RequestPairing(const PairingRequest& pairing_request) OVERRIDE;
43  virtual void DeliverClientMessage(const ExtensionMessage& message) OVERRIDE;
44
45  // Sets the ClientStub that will be called for each incoming control
46  // message. |client_stub| must outlive this object.
47  void set_client_stub(ClientStub* client_stub) { client_stub_ = client_stub; }
48
49  // Sets the ClipboardStub that will be called for each incoming clipboard
50  // message. |clipboard_stub| must outlive this object.
51  void set_clipboard_stub(ClipboardStub* clipboard_stub) {
52    clipboard_stub_ = clipboard_stub;
53  }
54
55 protected:
56  // ChannelDispatcherBase overrides.
57  virtual void OnInitialized() OVERRIDE;
58
59 private:
60  void OnMessageReceived(scoped_ptr<ControlMessage> message,
61                         const base::Closure& done_task);
62
63  ClientStub* client_stub_;
64  ClipboardStub* clipboard_stub_;
65
66  ProtobufMessageReader<ControlMessage> reader_;
67  BufferedSocketWriter writer_;
68
69  DISALLOW_COPY_AND_ASSIGN(ClientControlDispatcher);
70};
71
72}  // namespace protocol
73}  // namespace remoting
74
75#endif  // REMOTING_PROTOCOL_CLIENT_CONTROL_DISPATCHER_H_
76