Revert 264226 "Reduce dependency of TiclInvalidationService on P..."
[chromium-blink-merge.git] / remoting / host / chromoting_host.h
bloba6642d4becad02bf1f748b8575f8893421d2b79a
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_
8 #include <list>
9 #include <string>
11 #include "base/memory/scoped_ptr.h"
12 #include "base/memory/ref_counted.h"
13 #include "base/memory/weak_ptr.h"
14 #include "base/observer_list.h"
15 #include "base/threading/non_thread_safe.h"
16 #include "base/threading/thread.h"
17 #include "net/base/backoff_entry.h"
18 #include "remoting/host/client_session.h"
19 #include "remoting/host/host_status_monitor.h"
20 #include "remoting/host/host_status_observer.h"
21 #include "remoting/protocol/authenticator.h"
22 #include "remoting/protocol/connection_to_client.h"
23 #include "remoting/protocol/pairing_registry.h"
24 #include "remoting/protocol/session_manager.h"
26 namespace base {
27 class SingleThreadTaskRunner;
28 } // namespace base
30 namespace remoting {
32 namespace protocol {
33 class InputStub;
34 class SessionConfig;
35 class CandidateSessionConfig;
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 VideoScheduler is created with an Encoder and a webrtc::ScreenCapturer.
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
54 // client.
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 {
67 public:
68 // Both |signal_strategy| and |desktop_environment_factory| should outlive
69 // this object.
70 ChromotingHost(
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 virtual ~ChromotingHost();
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 virtual void AddStatusObserver(HostStatusObserver* observer) OVERRIDE;
92 virtual void RemoveStatusObserver(HostStatusObserver* observer) OVERRIDE;
94 // This method may be called only from
95 // HostStatusObserver::OnClientAuthenticated() to reject the new
96 // client.
97 void RejectAuthenticatingClient();
99 // Sets the authenticator factory to use for incoming
100 // connections. Incoming connections are rejected until
101 // authenticator factory is set. Must be called on the network
102 // thread after the host is started. Must not be called more than
103 // once per host instance because it may not be safe to delete
104 // factory before all authenticators it created are deleted.
105 void SetAuthenticatorFactory(
106 scoped_ptr<protocol::AuthenticatorFactory> authenticator_factory);
108 // Enables/disables curtaining when one or more clients are connected.
109 // Takes immediate effect if clients are already connected.
110 void SetEnableCurtaining(bool enable);
112 // Sets the maximum duration of any session. By default, a session has no
113 // maximum duration.
114 void SetMaximumSessionDuration(const base::TimeDelta& max_session_duration);
116 ////////////////////////////////////////////////////////////////////////////
117 // ClientSession::EventHandler implementation.
118 virtual void OnSessionAuthenticating(ClientSession* client) OVERRIDE;
119 virtual bool OnSessionAuthenticated(ClientSession* client) OVERRIDE;
120 virtual void OnSessionChannelsConnected(ClientSession* client) OVERRIDE;
121 virtual void OnSessionAuthenticationFailed(ClientSession* client) OVERRIDE;
122 virtual void OnSessionClosed(ClientSession* session) OVERRIDE;
123 virtual void OnSessionSequenceNumber(ClientSession* session,
124 int64 sequence_number) OVERRIDE;
125 virtual void OnSessionRouteChange(
126 ClientSession* session,
127 const std::string& channel_name,
128 const protocol::TransportRoute& route) OVERRIDE;
130 // SessionManager::Listener implementation.
131 virtual void OnSessionManagerReady() OVERRIDE;
132 virtual void OnIncomingSession(
133 protocol::Session* session,
134 protocol::SessionManager::IncomingSessionResponse* response) OVERRIDE;
136 // Sets desired configuration for the protocol. Must be called before Start().
137 void set_protocol_config(scoped_ptr<protocol::CandidateSessionConfig> config);
139 base::WeakPtr<ChromotingHost> AsWeakPtr() {
140 return weak_factory_.GetWeakPtr();
143 // The host uses a pairing registry to generate and store pairing information
144 // for clients for PIN-less authentication.
145 scoped_refptr<protocol::PairingRegistry> pairing_registry() const {
146 return pairing_registry_;
148 void set_pairing_registry(
149 scoped_refptr<protocol::PairingRegistry> pairing_registry) {
150 pairing_registry_ = pairing_registry;
153 private:
154 friend class ChromotingHostTest;
156 typedef std::list<ClientSession*> ClientList;
158 // Immediately disconnects all active clients. Host-internal components may
159 // shutdown asynchronously, but the caller is guaranteed not to receive
160 // callbacks for disconnected clients after this call returns.
161 void DisconnectAllClients();
163 // Unless specified otherwise all members of this class must be
164 // used on the network thread only.
166 // Parameters specified when the host was created.
167 DesktopEnvironmentFactory* desktop_environment_factory_;
168 scoped_ptr<protocol::SessionManager> session_manager_;
169 scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner_;
170 scoped_refptr<base::SingleThreadTaskRunner> input_task_runner_;
171 scoped_refptr<base::SingleThreadTaskRunner> video_capture_task_runner_;
172 scoped_refptr<base::SingleThreadTaskRunner> video_encode_task_runner_;
173 scoped_refptr<base::SingleThreadTaskRunner> network_task_runner_;
174 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_;
176 // Connection objects.
177 SignalStrategy* signal_strategy_;
179 // Must be used on the network thread only.
180 ObserverList<HostStatusObserver> status_observers_;
182 // The connections to remote clients.
183 ClientList clients_;
185 // True if the host has been started.
186 bool started_;
188 // Configuration of the protocol.
189 scoped_ptr<protocol::CandidateSessionConfig> protocol_config_;
191 // Login backoff state.
192 net::BackoffEntry login_backoff_;
194 // Flags used for RejectAuthenticatingClient().
195 bool authenticating_client_;
196 bool reject_authenticating_client_;
198 // True if the curtain mode is enabled.
199 bool enable_curtaining_;
201 // The maximum duration of any session.
202 base::TimeDelta max_session_duration_;
204 // The pairing registry for PIN-less authentication.
205 scoped_refptr<protocol::PairingRegistry> pairing_registry_;
207 base::WeakPtrFactory<ChromotingHost> weak_factory_;
209 DISALLOW_COPY_AND_ASSIGN(ChromotingHost);
212 } // namespace remoting
214 #endif // REMOTING_HOST_CHROMOTING_HOST_H_