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_DAEMON_PROCESS_H_
      6 #define REMOTING_HOST_DAEMON_PROCESS_H_
      7 
      8 #include <list>
      9 #include <string>
     10 
     11 #include "base/basictypes.h"
     12 #include "base/compiler_specific.h"
     13 #include "base/memory/ref_counted.h"
     14 #include "base/memory/scoped_ptr.h"
     15 #include "base/memory/weak_ptr.h"
     16 #include "base/observer_list.h"
     17 #include "base/process/process.h"
     18 #include "ipc/ipc_channel.h"
     19 #include "ipc/ipc_channel_proxy.h"
     20 #include "ipc/ipc_platform_file.h"
     21 #include "remoting/host/config_watcher.h"
     22 #include "remoting/host/host_status_monitor.h"
     23 #include "remoting/host/worker_process_ipc_delegate.h"
     24 
     25 struct SerializedTransportRoute;
     26 
     27 namespace tracked_objects {
     28 class Location;
     29 }  // namespace tracked_objects
     30 
     31 namespace remoting {
     32 
     33 class AutoThreadTaskRunner;
     34 class DesktopSession;
     35 class HostEventLogger;
     36 class HostStatusObserver;
     37 class ScreenResolution;
     38 
     39 // This class implements core of the daemon process. It manages the networking
     40 // process running at lower privileges and maintains the list of desktop
     41 // sessions.
     42 class DaemonProcess
     43     : public ConfigWatcher::Delegate,
     44       public HostStatusMonitor,
     45       public WorkerProcessIpcDelegate {
     46  public:
     47   typedef std::list<DesktopSession*> DesktopSessionList;
     48 
     49   virtual ~DaemonProcess();
     50 
     51   // Creates a platform-specific implementation of the daemon process object
     52   // passing relevant task runners. Public methods of this class must be called
     53   // on the |caller_task_runner| thread. |io_task_runner| is used to handle IPC
     54   // and background I/O tasks.
     55   static scoped_ptr<DaemonProcess> Create(
     56       scoped_refptr<AutoThreadTaskRunner> caller_task_runner,
     57       scoped_refptr<AutoThreadTaskRunner> io_task_runner,
     58       const base::Closure& stopped_callback);
     59 
     60   // ConfigWatcher::Delegate
     61   virtual void OnConfigUpdated(const std::string& serialized_config) OVERRIDE;
     62   virtual void OnConfigWatcherError() OVERRIDE;
     63 
     64   // HostStatusMonitor interface.
     65   virtual void AddStatusObserver(HostStatusObserver* observer) OVERRIDE;
     66   virtual void RemoveStatusObserver(HostStatusObserver* observer) OVERRIDE;
     67 
     68   // WorkerProcessIpcDelegate implementation.
     69   virtual void OnChannelConnected(int32 peer_pid) OVERRIDE;
     70   virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
     71   virtual void OnPermanentError(int exit_code) OVERRIDE;
     72 
     73   // Sends an IPC message to the network process. The message will be dropped
     74   // unless the network process is connected over the IPC channel.
     75   virtual void SendToNetwork(IPC::Message* message) = 0;
     76 
     77   // Called when a desktop integration process attaches to |terminal_id|.
     78   // |desktop_process| is a handle of the desktop integration process.
     79   // |desktop_pipe| specifies the client end of the desktop pipe. Returns true
     80   // on success, false otherwise.
     81   virtual bool OnDesktopSessionAgentAttached(
     82       int terminal_id,
     83       base::ProcessHandle desktop_process,
     84       IPC::PlatformFileForTransit desktop_pipe) = 0;
     85 
     86   // Closes the desktop session identified by |terminal_id|.
     87   void CloseDesktopSession(int terminal_id);
     88 
     89  protected:
     90   DaemonProcess(scoped_refptr<AutoThreadTaskRunner> caller_task_runner,
     91                 scoped_refptr<AutoThreadTaskRunner> io_task_runner,
     92                 const base::Closure& stopped_callback);
     93 
     94   // Creates a desktop session and assigns a unique ID to it.
     95   void CreateDesktopSession(int terminal_id,
     96                             const ScreenResolution& resolution,
     97                             bool virtual_terminal);
     98 
     99   // Changes the screen resolution of the desktop session identified by
    100   // |terminal_id|.
    101   void SetScreenResolution(int terminal_id, const ScreenResolution& resolution);
    102 
    103   // Requests the network process to crash.
    104   void CrashNetworkProcess(const tracked_objects::Location& location);
    105 
    106   // Reads the host configuration and launches the network process.
    107   void Initialize();
    108 
    109   // Invokes |stopped_callback_| to ask the owner to delete |this|.
    110   void Stop();
    111 
    112   // Returns true if |terminal_id| is in the range of allocated IDs. I.e. it is
    113   // less or equal to the highest ID we have seen so far.
    114   bool WasTerminalIdAllocated(int terminal_id);
    115 
    116   // Handlers for the host status notifications received from the network
    117   // process.
    118   void OnAccessDenied(const std::string& jid);
    119   void OnClientAuthenticated(const std::string& jid);
    120   void OnClientConnected(const std::string& jid);
    121   void OnClientDisconnected(const std::string& jid);
    122   void OnClientRouteChange(const std::string& jid,
    123                            const std::string& channel_name,
    124                            const SerializedTransportRoute& route);
    125   void OnHostStarted(const std::string& xmpp_login);
    126   void OnHostShutdown();
    127 
    128   // Creates a platform-specific desktop session and assigns a unique ID to it.
    129   // An implementation should validate |params| as they are received via IPC.
    130   virtual scoped_ptr<DesktopSession> DoCreateDesktopSession(
    131       int terminal_id,
    132       const ScreenResolution& resolution,
    133       bool virtual_terminal) = 0;
    134 
    135   // Requests the network process to crash.
    136   virtual void DoCrashNetworkProcess(
    137       const tracked_objects::Location& location) = 0;
    138 
    139   // Launches the network process and establishes an IPC channel with it.
    140   virtual void LaunchNetworkProcess() = 0;
    141 
    142   scoped_refptr<AutoThreadTaskRunner> caller_task_runner() {
    143     return caller_task_runner_;
    144   }
    145 
    146   scoped_refptr<AutoThreadTaskRunner> io_task_runner() {
    147     return io_task_runner_;
    148   }
    149 
    150   // Let the test code analyze the list of desktop sessions.
    151   friend class DaemonProcessTest;
    152   const DesktopSessionList& desktop_sessions() const {
    153     return desktop_sessions_;
    154   }
    155 
    156  private:
    157   // Deletes all desktop sessions.
    158   void DeleteAllDesktopSessions();
    159 
    160   // Task runner on which public methods of this class must be called.
    161   scoped_refptr<AutoThreadTaskRunner> caller_task_runner_;
    162 
    163   // Handles IPC and background I/O tasks.
    164   scoped_refptr<AutoThreadTaskRunner> io_task_runner_;
    165 
    166   scoped_ptr<ConfigWatcher> config_watcher_;
    167 
    168   // The configuration file contents.
    169   std::string serialized_config_;
    170 
    171   // The list of active desktop sessions.
    172   DesktopSessionList desktop_sessions_;
    173 
    174   // The highest desktop session ID that has been seen so far.
    175   int next_terminal_id_;
    176 
    177   // Keeps track of observers receiving host status notifications.
    178   ObserverList<HostStatusObserver> status_observers_;
    179 
    180   // Invoked to ask the owner to delete |this|.
    181   base::Closure stopped_callback_;
    182 
    183   // Writes host status updates to the system event log.
    184   scoped_ptr<HostEventLogger> host_event_logger_;
    185 
    186   base::WeakPtrFactory<DaemonProcess> weak_factory_;
    187 
    188   DISALLOW_COPY_AND_ASSIGN(DaemonProcess);
    189 };
    190 
    191 }  // namespace remoting
    192 
    193 #endif  // REMOTING_HOST_DAEMON_PROCESS_H_
    194