15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef REMOTING_HOST_CHROMOTING_HOST_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define REMOTING_HOST_CHROMOTING_HOST_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <list>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/memory/scoped_vector.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/weak_ptr.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/observer_list.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/threading/non_thread_safe.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/backoff_entry.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/host/client_session.h"
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "remoting/host/host_extension.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "remoting/host/host_status_monitor.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/host/host_status_observer.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/protocol/authenticator.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/protocol/connection_to_client.h"
25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "remoting/protocol/pairing_registry.h"
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "remoting/protocol/session_manager.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SingleThreadTaskRunner;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace protocol {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InputStub;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SessionConfig;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CandidateSessionConfig;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace protocol
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DesktopEnvironmentFactory;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A class to implement the functionality of a host process.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Here's the work flow of this class:
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1. We should load the saved GAIA ID token or if this is the first
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    time the host process runs we should prompt user for the
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    credential. We will use this token or credentials to authenicate
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    and register the host.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2. We listen for incoming connection using libjingle. We will create
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    a ConnectionToClient object that wraps around linjingle for transport.
526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)//    A VideoScheduler is created with an Encoder and a webrtc::DesktopCapturer.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    A ConnectionToClient is added to the ScreenRecorder for transporting
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    the screen captures. An InputStub is created and registered with the
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    ConnectionToClient to receive mouse / keyboard events from the remote
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    client.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    After we have done all the initialization we'll start the ScreenRecorder.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    We'll then enter the running state of the host process.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3. When the user is disconnected, we will pause the ScreenRecorder
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    and try to terminate the threads we have created. This will allow
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    all pending tasks to complete. After all of that completed we
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    return to the idle state. We then go to step (2) if there a new
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    incoming connection.
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ChromotingHost : public base::NonThreadSafe,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       public ClientSession::EventHandler,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       public protocol::SessionManager::Listener,
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       public HostStatusMonitor {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Both |signal_strategy| and |desktop_environment_factory| should outlive
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // this object.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChromotingHost(
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SignalStrategy* signal_strategy,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DesktopEnvironmentFactory* desktop_environment_factory,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<protocol::SessionManager> session_manager,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner,
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_refptr<base::SingleThreadTaskRunner> input_task_runner,
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_refptr<base::SingleThreadTaskRunner> video_capture_task_runner,
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_refptr<base::SingleThreadTaskRunner> video_encode_task_runner,
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_refptr<base::SingleThreadTaskRunner> network_task_runner,
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner);
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~ChromotingHost();
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Asynchronously starts the host.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // After this is invoked, the host process will connect to the talk
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // network and start listening for incoming connections.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This method can only be called once during the lifetime of this object.
903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void Start(const std::string& host_owner);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // HostStatusMonitor interface.
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AddStatusObserver(HostStatusObserver* observer) OVERRIDE;
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void RemoveStatusObserver(HostStatusObserver* observer) OVERRIDE;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Registers a host extension.
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void AddExtension(scoped_ptr<HostExtension> extension);
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This method may be called only from
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HostStatusObserver::OnClientAuthenticated() to reject the new
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // client.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RejectAuthenticatingClient();
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the authenticator factory to use for incoming
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // connections. Incoming connections are rejected until
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // authenticator factory is set. Must be called on the network
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // thread after the host is started. Must not be called more than
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // once per host instance because it may not be safe to delete
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // factory before all authenticators it created are deleted.
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetAuthenticatorFactory(
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<protocol::AuthenticatorFactory> authenticator_factory);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
113b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Enables/disables curtaining when one or more clients are connected.
114b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Takes immediate effect if clients are already connected.
115b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  void SetEnableCurtaining(bool enable);
116b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the maximum duration of any session. By default, a session has no
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // maximum duration.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetMaximumSessionDuration(const base::TimeDelta& max_session_duration);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ////////////////////////////////////////////////////////////////////////////
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ClientSession::EventHandler implementation.
123c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void OnSessionAuthenticating(ClientSession* client) OVERRIDE;
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool OnSessionAuthenticated(ClientSession* client) OVERRIDE;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnSessionChannelsConnected(ClientSession* client) OVERRIDE;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnSessionAuthenticationFailed(ClientSession* client) OVERRIDE;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnSessionClosed(ClientSession* session) OVERRIDE;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnSessionRouteChange(
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ClientSession* session,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& channel_name,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const protocol::TransportRoute& route) OVERRIDE;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SessionManager::Listener implementation.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnSessionManagerReady() OVERRIDE;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnIncomingSession(
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      protocol::Session* session,
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      protocol::SessionManager::IncomingSessionResponse* response) OVERRIDE;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Gets the candidate configuration for the protocol.
140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const protocol::CandidateSessionConfig* protocol_config() const {
141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return protocol_config_.get();
142f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets desired configuration for the protocol. Must be called before Start().
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_protocol_config(scoped_ptr<protocol::CandidateSessionConfig> config);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // The host uses a pairing registry to generate and store pairing information
148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // for clients for PIN-less authentication.
149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_refptr<protocol::PairingRegistry> pairing_registry() const {
150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return pairing_registry_;
151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void set_pairing_registry(
153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      scoped_refptr<protocol::PairingRegistry> pairing_registry) {
154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    pairing_registry_ = pairing_registry;
155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
157f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::WeakPtr<ChromotingHost> AsWeakPtr() {
158f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return weak_factory_.GetWeakPtr();
159f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
160f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class ChromotingHostTest;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef std::list<ClientSession*> ClientList;
165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  typedef ScopedVector<HostExtension> HostExtensionList;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
167b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Immediately disconnects all active clients. Host-internal components may
168b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // shutdown asynchronously, but the caller is guaranteed not to receive
169b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // callbacks for disconnected clients after this call returns.
170b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  void DisconnectAllClients();
171b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unless specified otherwise all members of this class must be
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // used on the network thread only.
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Parameters specified when the host was created.
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DesktopEnvironmentFactory* desktop_environment_factory_;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<protocol::SessionManager> session_manager_;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner_;
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::SingleThreadTaskRunner> input_task_runner_;
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::SingleThreadTaskRunner> video_capture_task_runner_;
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::SingleThreadTaskRunner> video_encode_task_runner_;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<base::SingleThreadTaskRunner> network_task_runner_;
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Connection objects.
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SignalStrategy* signal_strategy_;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Must be used on the network thread only.
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ObserverList<HostStatusObserver> status_observers_;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The connections to remote clients.
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClientList clients_;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // True if the host has been started.
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool started_;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Configuration of the protocol.
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<protocol::CandidateSessionConfig> protocol_config_;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Login backoff state.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::BackoffEntry login_backoff_;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Flags used for RejectAuthenticatingClient().
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool authenticating_client_;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool reject_authenticating_client_;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
207b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // True if the curtain mode is enabled.
208b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  bool enable_curtaining_;
209b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The maximum duration of any session.
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta max_session_duration_;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // The pairing registry for PIN-less authentication.
214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_refptr<protocol::PairingRegistry> pairing_registry_;
215868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // List of host extensions.
217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  HostExtensionList extensions_;
218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::WeakPtrFactory<ChromotingHost> weak_factory_;
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ChromotingHost);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace remoting
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // REMOTING_HOST_CHROMOTING_HOST_H_
227