Home | History | Annotate | Download | only in host
      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_HOST_CLIENT_SESSION_H_
      6 #define REMOTING_HOST_CLIENT_SESSION_H_
      7 
      8 #include <string>
      9 
     10 #include "base/memory/ref_counted.h"
     11 #include "base/memory/scoped_vector.h"
     12 #include "base/memory/weak_ptr.h"
     13 #include "base/sequenced_task_runner_helpers.h"
     14 #include "base/threading/non_thread_safe.h"
     15 #include "base/time/time.h"
     16 #include "base/timer/timer.h"
     17 #include "remoting/host/client_session_control.h"
     18 #include "remoting/host/gnubby_auth_handler.h"
     19 #include "remoting/host/host_extension.h"
     20 #include "remoting/host/host_extension_session.h"
     21 #include "remoting/host/mouse_clamping_filter.h"
     22 #include "remoting/host/remote_input_filter.h"
     23 #include "remoting/protocol/clipboard_echo_filter.h"
     24 #include "remoting/protocol/clipboard_filter.h"
     25 #include "remoting/protocol/clipboard_stub.h"
     26 #include "remoting/protocol/connection_to_client.h"
     27 #include "remoting/protocol/host_stub.h"
     28 #include "remoting/protocol/input_event_tracker.h"
     29 #include "remoting/protocol/input_filter.h"
     30 #include "remoting/protocol/input_stub.h"
     31 #include "remoting/protocol/pairing_registry.h"
     32 #include "third_party/webrtc/modules/desktop_capture/desktop_geometry.h"
     33 
     34 namespace base {
     35 class SingleThreadTaskRunner;
     36 }  // namespace base
     37 
     38 namespace remoting {
     39 
     40 class AudioEncoder;
     41 class AudioScheduler;
     42 class DesktopEnvironment;
     43 class DesktopEnvironmentFactory;
     44 class InputInjector;
     45 class ScreenControls;
     46 class VideoEncoder;
     47 class VideoScheduler;
     48 
     49 // A ClientSession keeps a reference to a connection to a client, and maintains
     50 // per-client state.
     51 class ClientSession
     52     : public base::NonThreadSafe,
     53       public protocol::HostStub,
     54       public protocol::ConnectionToClient::EventHandler,
     55       public ClientSessionControl {
     56  public:
     57   // Callback interface for passing events to the ChromotingHost.
     58   class EventHandler {
     59    public:
     60     // Called after authentication has started.
     61     virtual void OnSessionAuthenticating(ClientSession* client) = 0;
     62 
     63     // Called after authentication has finished successfully. Returns true if
     64     // the connection is allowed, or false otherwise.
     65     virtual bool OnSessionAuthenticated(ClientSession* client) = 0;
     66 
     67     // Called after we've finished connecting all channels.
     68     virtual void OnSessionChannelsConnected(ClientSession* client) = 0;
     69 
     70     // Called after client has reported capabilities.
     71     virtual void OnSessionClientCapabilities(ClientSession* client) = 0;
     72 
     73     // Called after authentication has failed. Must not tear down this
     74     // object. OnSessionClosed() is notified after this handler
     75     // returns.
     76     virtual void OnSessionAuthenticationFailed(ClientSession* client) = 0;
     77 
     78     // Called after connection has failed or after the client closed it.
     79     virtual void OnSessionClosed(ClientSession* client) = 0;
     80 
     81     // Called to notify of each message's sequence number. The
     82     // callback must not tear down this object.
     83     virtual void OnSessionSequenceNumber(ClientSession* client,
     84                                          int64 sequence_number) = 0;
     85 
     86     // Called on notification of a route change event, when a channel is
     87     // connected.
     88     virtual void OnSessionRouteChange(
     89         ClientSession* client,
     90         const std::string& channel_name,
     91         const protocol::TransportRoute& route) = 0;
     92 
     93    protected:
     94     virtual ~EventHandler() {}
     95   };
     96 
     97   // |event_handler| and |desktop_environment_factory| must outlive |this|.
     98   ClientSession(
     99       EventHandler* event_handler,
    100       scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner,
    101       scoped_refptr<base::SingleThreadTaskRunner> input_task_runner,
    102       scoped_refptr<base::SingleThreadTaskRunner> video_capture_task_runner,
    103       scoped_refptr<base::SingleThreadTaskRunner> video_encode_task_runner,
    104       scoped_refptr<base::SingleThreadTaskRunner> network_task_runner,
    105       scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner,
    106       scoped_ptr<protocol::ConnectionToClient> connection,
    107       DesktopEnvironmentFactory* desktop_environment_factory,
    108       const base::TimeDelta& max_duration,
    109       scoped_refptr<protocol::PairingRegistry> pairing_registry);
    110   virtual ~ClientSession();
    111 
    112   // Adds an extension to client to handle extension messages.
    113   void AddExtensionSession(scoped_ptr<HostExtensionSession> extension_session);
    114 
    115   // Adds extended capabilities to advertise to the client, e.g. those
    116   // implemented by |DesktopEnvironment| or |HostExtension|s.
    117   void AddHostCapabilities(const std::string& capability);
    118 
    119   // protocol::HostStub interface.
    120   virtual void NotifyClientResolution(
    121       const protocol::ClientResolution& resolution) OVERRIDE;
    122   virtual void ControlVideo(
    123       const protocol::VideoControl& video_control) OVERRIDE;
    124   virtual void ControlAudio(
    125       const protocol::AudioControl& audio_control) OVERRIDE;
    126   virtual void SetCapabilities(
    127       const protocol::Capabilities& capabilities) OVERRIDE;
    128   virtual void RequestPairing(
    129       const remoting::protocol::PairingRequest& pairing_request) OVERRIDE;
    130   virtual void DeliverClientMessage(
    131       const protocol::ExtensionMessage& message) OVERRIDE;
    132 
    133   // protocol::ConnectionToClient::EventHandler interface.
    134   virtual void OnConnectionAuthenticating(
    135       protocol::ConnectionToClient* connection) OVERRIDE;
    136   virtual void OnConnectionAuthenticated(
    137       protocol::ConnectionToClient* connection) OVERRIDE;
    138   virtual void OnConnectionChannelsConnected(
    139       protocol::ConnectionToClient* connection) OVERRIDE;
    140   virtual void OnConnectionClosed(protocol::ConnectionToClient* connection,
    141                                   protocol::ErrorCode error) OVERRIDE;
    142   virtual void OnSequenceNumberUpdated(
    143       protocol::ConnectionToClient* connection, int64 sequence_number) OVERRIDE;
    144   virtual void OnRouteChange(
    145       protocol::ConnectionToClient* connection,
    146       const std::string& channel_name,
    147       const protocol::TransportRoute& route) OVERRIDE;
    148 
    149   // ClientSessionControl interface.
    150   virtual const std::string& client_jid() const OVERRIDE;
    151   virtual void DisconnectSession() OVERRIDE;
    152   virtual void OnLocalMouseMoved(
    153       const webrtc::DesktopVector& position) OVERRIDE;
    154   virtual void SetDisableInputs(bool disable_inputs) OVERRIDE;
    155 
    156   void SetGnubbyAuthHandlerForTesting(GnubbyAuthHandler* gnubby_auth_handler);
    157 
    158   protocol::ConnectionToClient* connection() const {
    159     return connection_.get();
    160   }
    161 
    162   bool is_authenticated() { return auth_input_filter_.enabled();  }
    163 
    164   const std::string* client_capabilities() const {
    165     return client_capabilities_.get();
    166   }
    167 
    168  private:
    169   typedef ScopedVector<HostExtensionSession> HostExtensionSessionList;
    170 
    171   // Creates a proxy for sending clipboard events to the client.
    172   scoped_ptr<protocol::ClipboardStub> CreateClipboardProxy();
    173 
    174   // Creates an audio encoder for the specified configuration.
    175   static scoped_ptr<AudioEncoder> CreateAudioEncoder(
    176       const protocol::SessionConfig& config);
    177 
    178   // Creates a video encoder for the specified configuration.
    179   static scoped_ptr<VideoEncoder> CreateVideoEncoder(
    180       const protocol::SessionConfig& config);
    181 
    182   EventHandler* event_handler_;
    183 
    184   // The connection to the client.
    185   scoped_ptr<protocol::ConnectionToClient> connection_;
    186 
    187   std::string client_jid_;
    188 
    189   // Used to disable callbacks to |this| once DisconnectSession() has been
    190   // called.
    191   base::WeakPtrFactory<ClientSessionControl> control_factory_;
    192 
    193   // Used to create a DesktopEnvironment instance for this session.
    194   DesktopEnvironmentFactory* desktop_environment_factory_;
    195 
    196   // The DesktopEnvironment instance for this session.
    197   scoped_ptr<DesktopEnvironment> desktop_environment_;
    198 
    199   // Filter used as the final element in the input pipeline.
    200   protocol::InputFilter host_input_filter_;
    201 
    202   // Tracker used to release pressed keys and buttons when disconnecting.
    203   protocol::InputEventTracker input_tracker_;
    204 
    205   // Filter used to disable remote inputs during local input activity.
    206   RemoteInputFilter remote_input_filter_;
    207 
    208   // Filter used to clamp mouse events to the current display dimensions.
    209   MouseClampingFilter mouse_clamping_filter_;
    210 
    211   // Filter to used to stop clipboard items sent from the client being echoed
    212   // back to it.  It is the final element in the clipboard (client -> host)
    213   // pipeline.
    214   protocol::ClipboardEchoFilter clipboard_echo_filter_;
    215 
    216   // Filters used to manage enabling & disabling of input & clipboard.
    217   protocol::InputFilter disable_input_filter_;
    218   protocol::ClipboardFilter disable_clipboard_filter_;
    219 
    220   // Filters used to disable input & clipboard when we're not authenticated.
    221   protocol::InputFilter auth_input_filter_;
    222   protocol::ClipboardFilter auth_clipboard_filter_;
    223 
    224   // Factory for weak pointers to the client clipboard stub.
    225   // This must appear after |clipboard_echo_filter_|, so that it won't outlive
    226   // it.
    227   base::WeakPtrFactory<protocol::ClipboardStub> client_clipboard_factory_;
    228 
    229   // The maximum duration of this session.
    230   // There is no maximum if this value is <= 0.
    231   base::TimeDelta max_duration_;
    232 
    233   // A timer that triggers a disconnect when the maximum session duration
    234   // is reached.
    235   base::OneShotTimer<ClientSession> max_duration_timer_;
    236 
    237   scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner_;
    238   scoped_refptr<base::SingleThreadTaskRunner> input_task_runner_;
    239   scoped_refptr<base::SingleThreadTaskRunner> video_capture_task_runner_;
    240   scoped_refptr<base::SingleThreadTaskRunner> video_encode_task_runner_;
    241   scoped_refptr<base::SingleThreadTaskRunner> network_task_runner_;
    242   scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_;
    243 
    244   // Schedulers for audio and video capture.
    245   scoped_refptr<AudioScheduler> audio_scheduler_;
    246   scoped_refptr<VideoScheduler> video_scheduler_;
    247 
    248   // The set of all capabilities supported by the client.
    249   scoped_ptr<std::string> client_capabilities_;
    250 
    251   // The set of all capabilities supported by the host.
    252   std::string host_capabilities_;
    253 
    254   // Used to inject mouse and keyboard input and handle clipboard events.
    255   scoped_ptr<InputInjector> input_injector_;
    256 
    257   // Used to apply client-requested changes in screen resolution.
    258   scoped_ptr<ScreenControls> screen_controls_;
    259 
    260   // The pairing registry for PIN-less authentication.
    261   scoped_refptr<protocol::PairingRegistry> pairing_registry_;
    262 
    263   // Used to proxy gnubby auth traffic.
    264   scoped_ptr<GnubbyAuthHandler> gnubby_auth_handler_;
    265 
    266   // Host extension sessions, used to handle extension messages.
    267   HostExtensionSessionList extension_sessions_;
    268 
    269   DISALLOW_COPY_AND_ASSIGN(ClientSession);
    270 };
    271 
    272 }  // namespace remoting
    273 
    274 #endif  // REMOTING_HOST_CLIENT_SESSION_H_
    275