blob: e15793ad1f009b143ef63432306bfa7b48d4a0fd [file] [log] [blame]
[email protected]91e4b7f62012-01-25 23:23:021// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]44f60762011-03-23 12:13:352// 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_HOST_CLIENT_SESSION_H_
6#define REMOTING_HOST_CLIENT_SESSION_H_
7
[email protected]c78669c92011-06-13 22:42:388#include <list>
9
[email protected]60fc96002011-08-12 23:07:0510#include "base/time.h"
[email protected]ec6411872011-11-11 03:28:5511#include "base/threading/non_thread_safe.h"
[email protected]86cbe6b2012-04-03 00:56:1812#include "remoting/host/remote_input_filter.h"
[email protected]ff3761a12012-05-22 22:29:2413#include "remoting/protocol/clipboard_echo_filter.h"
[email protected]e265ad72012-03-16 17:28:0314#include "remoting/protocol/clipboard_stub.h"
[email protected]44f60762011-03-23 12:13:3515#include "remoting/protocol/connection_to_client.h"
[email protected]e265ad72012-03-16 17:28:0316#include "remoting/protocol/host_event_stub.h"
[email protected]44f60762011-03-23 12:13:3517#include "remoting/protocol/host_stub.h"
[email protected]86cbe6b2012-04-03 00:56:1818#include "remoting/protocol/input_event_tracker.h"
19#include "remoting/protocol/input_filter.h"
20#include "remoting/protocol/input_stub.h"
[email protected]f5d62e362012-04-30 20:54:3721#include "remoting/protocol/mouse_input_filter.h"
[email protected]bcad2682011-09-30 20:35:2622#include "third_party/skia/include/core/SkPoint.h"
[email protected]44f60762011-03-23 12:13:3523
24namespace remoting {
25
[email protected]995c2c6d2011-09-15 05:08:2526class Capturer;
[email protected]4ea2c7c2011-03-31 14:20:0627
[email protected]44f60762011-03-23 12:13:3528// A ClientSession keeps a reference to a connection to a client, and maintains
29// per-client state.
[email protected]e265ad72012-03-16 17:28:0330class ClientSession : public protocol::HostEventStub,
31 public protocol::HostStub,
[email protected]ee910fd2011-11-10 18:23:3132 public protocol::ConnectionToClient::EventHandler,
[email protected]ec6411872011-11-11 03:28:5533 public base::NonThreadSafe {
[email protected]44f60762011-03-23 12:13:3534 public:
35 // Callback interface for passing events to the ChromotingHost.
36 class EventHandler {
37 public:
38 virtual ~EventHandler() {}
39
[email protected]1f249e22011-11-29 20:19:5940 // Called after authentication has finished successfully.
[email protected]ee910fd2011-11-10 18:23:3141 virtual void OnSessionAuthenticated(ClientSession* client) = 0;
[email protected]1f249e22011-11-29 20:19:5942
[email protected]cba6f812012-03-27 01:01:5043 // Called after we've finished connecting all channels.
44 virtual void OnSessionChannelsConnected(ClientSession* client) = 0;
45
[email protected]1f249e22011-11-29 20:19:5946 // Called after authentication has failed. Must not tear down this
47 // object. OnSessionClosed() is notified after this handler
48 // returns.
49 virtual void OnSessionAuthenticationFailed(ClientSession* client) = 0;
50
51 // Called after connection has failed or after the client closed it.
[email protected]ee910fd2011-11-10 18:23:3152 virtual void OnSessionClosed(ClientSession* client) = 0;
[email protected]1f249e22011-11-29 20:19:5953
54 // Called to notify of each message's sequence number. The
55 // callback must not tear down this object.
[email protected]ee910fd2011-11-10 18:23:3156 virtual void OnSessionSequenceNumber(ClientSession* client,
57 int64 sequence_number) = 0;
[email protected]91e4b7f62012-01-25 23:23:0258
59 // Called on notification of a route change event, when a channel is
60 // connected.
[email protected]17af2ab2012-02-02 04:07:5261 virtual void OnSessionRouteChange(
62 ClientSession* client,
63 const std::string& channel_name,
[email protected]be451c82012-03-20 22:24:4764 const protocol::TransportRoute& route) = 0;
[email protected]44f60762011-03-23 12:13:3565 };
66
67 ClientSession(EventHandler* event_handler,
[email protected]3361e1f2012-03-20 20:31:4468 scoped_ptr<protocol::ConnectionToClient> connection,
[email protected]e265ad72012-03-16 17:28:0369 protocol::HostEventStub* host_event_stub,
[email protected]995c2c6d2011-09-15 05:08:2570 Capturer* capturer);
[email protected]ec6411872011-11-11 03:28:5571 virtual ~ClientSession();
[email protected]44f60762011-03-23 12:13:3572
[email protected]e265ad72012-03-16 17:28:0373 // protocol::ClipboardStub interface.
74 virtual void InjectClipboardEvent(
75 const protocol::ClipboardEvent& event) OVERRIDE;
76
[email protected]4ea2c7c2011-03-31 14:20:0677 // protocol::InputStub interface.
[email protected]6a6fe8062011-11-19 00:06:0278 virtual void InjectKeyEvent(const protocol::KeyEvent& event) OVERRIDE;
79 virtual void InjectMouseEvent(const protocol::MouseEvent& event) OVERRIDE;
[email protected]4ea2c7c2011-03-31 14:20:0680
[email protected]f2b9cf32012-04-27 00:13:4381 // protocol::HostStub interface.
82 virtual void NotifyClientDimensions(
83 const protocol::ClientDimensions& dimensions) OVERRIDE;
[email protected]50d71c72012-05-03 01:28:5584 virtual void ControlVideo(
85 const protocol::VideoControl& video_control) OVERRIDE;
[email protected]f2b9cf32012-04-27 00:13:4386
[email protected]ee910fd2011-11-10 18:23:3187 // protocol::ConnectionToClient::EventHandler interface.
[email protected]cba6f812012-03-27 01:01:5088 virtual void OnConnectionAuthenticated(
[email protected]ee910fd2011-11-10 18:23:3189 protocol::ConnectionToClient* connection) OVERRIDE;
[email protected]cba6f812012-03-27 01:01:5090 virtual void OnConnectionChannelsConnected(
[email protected]ee910fd2011-11-10 18:23:3191 protocol::ConnectionToClient* connection) OVERRIDE;
[email protected]cba6f812012-03-27 01:01:5092 virtual void OnConnectionClosed(protocol::ConnectionToClient* connection,
[email protected]204a9e32012-03-02 05:42:5893 protocol::ErrorCode error) OVERRIDE;
[email protected]ee910fd2011-11-10 18:23:3194 virtual void OnSequenceNumberUpdated(
95 protocol::ConnectionToClient* connection, int64 sequence_number) OVERRIDE;
[email protected]17af2ab2012-02-02 04:07:5296 virtual void OnRouteChange(
97 protocol::ConnectionToClient* connection,
98 const std::string& channel_name,
[email protected]be451c82012-03-20 22:24:4799 const protocol::TransportRoute& route) OVERRIDE;
[email protected]44f60762011-03-23 12:13:35100
[email protected]ee910fd2011-11-10 18:23:31101 // Disconnects the session and destroys the transport. Event handler
102 // is guaranteed not to be called after this method is called. Can
103 // be called multiple times. The object should not be used after
104 // this method returns.
105 void Disconnect();
[email protected]1ce457a2011-05-19 19:59:48106
[email protected]4ea2c7c2011-03-31 14:20:06107 protocol::ConnectionToClient* connection() const {
108 return connection_.get();
109 }
[email protected]44f60762011-03-23 12:13:35110
[email protected]f19d9bd2011-09-13 05:21:11111 const std::string& client_jid() { return client_jid_; }
112
[email protected]dda4da3b2012-05-22 00:51:26113 bool is_authenticated() { return is_authenticated_; }
114
[email protected]c78669c92011-06-13 22:42:38115 // Indicate that local mouse activity has been detected. This causes remote
116 // inputs to be ignored for a short time so that the local user will always
117 // have the upper hand in 'pointer wars'.
[email protected]bcad2682011-09-30 20:35:26118 void LocalMouseMoved(const SkIPoint& new_pos);
[email protected]c78669c92011-06-13 22:42:38119
[email protected]86cbe6b2012-04-03 00:56:18120 // Disable handling of input events from this client. If the client has any
121 // keys or mouse buttons pressed then these will be released.
122 void SetDisableInputs(bool disable_inputs);
[email protected]c78669c92011-06-13 22:42:38123
[email protected]7f44ba42012-05-31 20:26:29124 // Creates a proxy for sending clipboard events to the client.
125 scoped_ptr<protocol::ClipboardStub> CreateClipboardProxy();
126
[email protected]44f60762011-03-23 12:13:35127 private:
128 EventHandler* event_handler_;
[email protected]4ea2c7c2011-03-31 14:20:06129
[email protected]4ea2c7c2011-03-31 14:20:06130 // The connection to the client.
[email protected]ec6411872011-11-11 03:28:55131 scoped_ptr<protocol::ConnectionToClient> connection_;
[email protected]44f60762011-03-23 12:13:35132
[email protected]f19d9bd2011-09-13 05:21:11133 std::string client_jid_;
[email protected]dda4da3b2012-05-22 00:51:26134 bool is_authenticated_;
[email protected]f19d9bd2011-09-13 05:21:11135
[email protected]f5d62e362012-04-30 20:54:37136 // The host event stub to which this object delegates. This is the final
137 // element in the input pipeline, whose components appear in order below.
[email protected]e265ad72012-03-16 17:28:03138 protocol::HostEventStub* host_event_stub_;
[email protected]4ea2c7c2011-03-31 14:20:06139
[email protected]86cbe6b2012-04-03 00:56:18140 // Tracker used to release pressed keys and buttons when disconnecting.
141 protocol::InputEventTracker input_tracker_;
142
143 // Filter used to disable remote inputs during local input activity.
144 RemoteInputFilter remote_input_filter_;
145
[email protected]f5d62e362012-04-30 20:54:37146 // Filter used to clamp mouse events to the current display dimensions.
147 protocol::MouseInputFilter mouse_input_filter_;
148
[email protected]86cbe6b2012-04-03 00:56:18149 // Filter used to manage enabling & disabling of client input events.
150 protocol::InputFilter disable_input_filter_;
151
152 // Filter used to disable inputs when we're not authenticated.
153 protocol::InputFilter auth_input_filter_;
154
[email protected]ff3761a12012-05-22 22:29:24155 // Filter to used to stop clipboard items sent from the client being echoed
156 // back to it.
157 protocol::ClipboardEchoFilter clipboard_echo_filter_;
158
[email protected]7f44ba42012-05-31 20:26:29159 // Factory for weak pointers to the client clipboard stub.
160 // This must appear after |clipboard_echo_filter_|, so that it won't outlive
161 // it.
162 base::WeakPtrFactory<ClipboardStub> client_clipboard_factory_;
163
[email protected]995c2c6d2011-09-15 05:08:25164 // Capturer, used to determine current screen size for ensuring injected
165 // mouse events fall within the screen area.
166 // TODO(lambroslambrou): Move floor-control logic, and clamping to screen
167 // area, out of this class (crbug.com/96508).
168 Capturer* capturer_;
169
[email protected]44f60762011-03-23 12:13:35170 DISALLOW_COPY_AND_ASSIGN(ClientSession);
171};
172
173} // namespace remoting
174
175#endif // REMOTING_HOST_CLIENT_SESSION_H_