• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
caller_task_runner()142   scoped_refptr<AutoThreadTaskRunner> caller_task_runner() {
143     return caller_task_runner_;
144   }
145 
io_task_runner()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;
desktop_sessions()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