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.
5 #ifndef REMOTING_HOST_CHROMOTING_HOST_H_
6 #define REMOTING_HOST_CHROMOTING_HOST_H_
11 #include "base/memory/ref_counted.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "base/memory/scoped_vector.h"
14 #include "base/memory/weak_ptr.h"
15 #include "base/observer_list.h"
16 #include "base/threading/non_thread_safe.h"
17 #include "base/threading/thread.h"
18 #include "net/base/backoff_entry.h"
19 #include "remoting/host/client_session.h"
20 #include "remoting/host/host_extension.h"
21 #include "remoting/host/host_status_monitor.h"
22 #include "remoting/host/host_status_observer.h"
23 #include "remoting/protocol/authenticator.h"
24 #include "remoting/protocol/connection_to_client.h"
25 #include "remoting/protocol/pairing_registry.h"
26 #include "remoting/protocol/session_manager.h"
29 class SingleThreadTaskRunner
;
36 } // namespace protocol
38 class DesktopEnvironmentFactory
;
40 // A class to implement the functionality of a host process.
42 // Here's the work flow of this class:
43 // 1. We should load the saved GAIA ID token or if this is the first
44 // time the host process runs we should prompt user for the
45 // credential. We will use this token or credentials to authenicate
46 // and register the host.
48 // 2. We listen for incoming connection using libjingle. We will create
49 // a ConnectionToClient object that wraps around linjingle for transport.
50 // A VideoFramePump is created with an Encoder and a webrtc::DesktopCapturer.
51 // A ConnectionToClient is added to the ScreenRecorder for transporting
52 // the screen captures. An InputStub is created and registered with the
53 // ConnectionToClient to receive mouse / keyboard events from the remote
55 // After we have done all the initialization we'll start the ScreenRecorder.
56 // We'll then enter the running state of the host process.
58 // 3. When the user is disconnected, we will pause the ScreenRecorder
59 // and try to terminate the threads we have created. This will allow
60 // all pending tasks to complete. After all of that completed we
61 // return to the idle state. We then go to step (2) if there a new
62 // incoming connection.
63 class ChromotingHost
: public base::NonThreadSafe
,
64 public ClientSession::EventHandler
,
65 public protocol::SessionManager::Listener
,
66 public HostStatusMonitor
{
68 // Both |signal_strategy| and |desktop_environment_factory| should outlive
71 SignalStrategy
* signal_strategy
,
72 DesktopEnvironmentFactory
* desktop_environment_factory
,
73 scoped_ptr
<protocol::SessionManager
> session_manager
,
74 scoped_refptr
<base::SingleThreadTaskRunner
> audio_task_runner
,
75 scoped_refptr
<base::SingleThreadTaskRunner
> input_task_runner
,
76 scoped_refptr
<base::SingleThreadTaskRunner
> video_capture_task_runner
,
77 scoped_refptr
<base::SingleThreadTaskRunner
> video_encode_task_runner
,
78 scoped_refptr
<base::SingleThreadTaskRunner
> network_task_runner
,
79 scoped_refptr
<base::SingleThreadTaskRunner
> ui_task_runner
);
80 ~ChromotingHost() override
;
82 // Asynchronously starts the host.
84 // After this is invoked, the host process will connect to the talk
85 // network and start listening for incoming connections.
87 // This method can only be called once during the lifetime of this object.
88 void Start(const std::string
& host_owner
);
90 // HostStatusMonitor interface.
91 void AddStatusObserver(HostStatusObserver
* observer
) override
;
92 void RemoveStatusObserver(HostStatusObserver
* observer
) override
;
94 // Registers a host extension.
95 void AddExtension(scoped_ptr
<HostExtension
> extension
);
97 // This method may be called only from
98 // HostStatusObserver::OnClientAuthenticated() to reject the new
100 void RejectAuthenticatingClient();
102 // Sets the authenticator factory to use for incoming
103 // connections. Incoming connections are rejected until
104 // authenticator factory is set. Must be called on the network
105 // thread after the host is started. Must not be called more than
106 // once per host instance because it may not be safe to delete
107 // factory before all authenticators it created are deleted.
108 void SetAuthenticatorFactory(
109 scoped_ptr
<protocol::AuthenticatorFactory
> authenticator_factory
);
111 // Enables/disables curtaining when one or more clients are connected.
112 // Takes immediate effect if clients are already connected.
113 void SetEnableCurtaining(bool enable
);
115 // Sets the maximum duration of any session. By default, a session has no
117 void SetMaximumSessionDuration(const base::TimeDelta
& max_session_duration
);
119 ////////////////////////////////////////////////////////////////////////////
120 // ClientSession::EventHandler implementation.
121 void OnSessionAuthenticating(ClientSession
* client
) override
;
122 bool OnSessionAuthenticated(ClientSession
* client
) override
;
123 void OnSessionChannelsConnected(ClientSession
* client
) override
;
124 void OnSessionAuthenticationFailed(ClientSession
* client
) override
;
125 void OnSessionClosed(ClientSession
* session
) override
;
126 void OnSessionRouteChange(ClientSession
* session
,
127 const std::string
& channel_name
,
128 const protocol::TransportRoute
& route
) override
;
130 // SessionManager::Listener implementation.
131 void OnSessionManagerReady() override
;
132 void OnIncomingSession(
133 protocol::Session
* session
,
134 protocol::SessionManager::IncomingSessionResponse
* response
) override
;
136 // The host uses a pairing registry to generate and store pairing information
137 // for clients for PIN-less authentication.
138 scoped_refptr
<protocol::PairingRegistry
> pairing_registry() const {
139 return pairing_registry_
;
141 void set_pairing_registry(
142 scoped_refptr
<protocol::PairingRegistry
> pairing_registry
) {
143 pairing_registry_
= pairing_registry
;
146 base::WeakPtr
<ChromotingHost
> AsWeakPtr() {
147 return weak_factory_
.GetWeakPtr();
151 friend class ChromotingHostTest
;
153 typedef std::list
<ClientSession
*> ClientList
;
154 typedef ScopedVector
<HostExtension
> HostExtensionList
;
156 // Immediately disconnects all active clients. Host-internal components may
157 // shutdown asynchronously, but the caller is guaranteed not to receive
158 // callbacks for disconnected clients after this call returns.
159 void DisconnectAllClients();
161 // Unless specified otherwise all members of this class must be
162 // used on the network thread only.
164 // Parameters specified when the host was created.
165 DesktopEnvironmentFactory
* desktop_environment_factory_
;
166 scoped_ptr
<protocol::SessionManager
> session_manager_
;
167 scoped_refptr
<base::SingleThreadTaskRunner
> audio_task_runner_
;
168 scoped_refptr
<base::SingleThreadTaskRunner
> input_task_runner_
;
169 scoped_refptr
<base::SingleThreadTaskRunner
> video_capture_task_runner_
;
170 scoped_refptr
<base::SingleThreadTaskRunner
> video_encode_task_runner_
;
171 scoped_refptr
<base::SingleThreadTaskRunner
> network_task_runner_
;
172 scoped_refptr
<base::SingleThreadTaskRunner
> ui_task_runner_
;
174 // Connection objects.
175 SignalStrategy
* signal_strategy_
;
177 // Must be used on the network thread only.
178 base::ObserverList
<HostStatusObserver
> status_observers_
;
180 // The connections to remote clients.
183 // True if the host has been started.
186 // Login backoff state.
187 net::BackoffEntry login_backoff_
;
189 // Flags used for RejectAuthenticatingClient().
190 bool authenticating_client_
;
191 bool reject_authenticating_client_
;
193 // True if the curtain mode is enabled.
194 bool enable_curtaining_
;
196 // The maximum duration of any session.
197 base::TimeDelta max_session_duration_
;
199 // The pairing registry for PIN-less authentication.
200 scoped_refptr
<protocol::PairingRegistry
> pairing_registry_
;
202 // List of host extensions.
203 HostExtensionList extensions_
;
205 base::WeakPtrFactory
<ChromotingHost
> weak_factory_
;
207 DISALLOW_COPY_AND_ASSIGN(ChromotingHost
);
210 } // namespace remoting
212 #endif // REMOTING_HOST_CHROMOTING_HOST_H_