• 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_DESKTOP_SESSION_WIN_H_
6 #define REMOTING_HOST_DESKTOP_SESSION_WIN_H_
7 
8 #include "base/memory/ref_counted.h"
9 #include "base/memory/scoped_ptr.h"
10 #include "base/time/time.h"
11 #include "base/timer/timer.h"
12 #include "base/win/scoped_handle.h"
13 #include "ipc/ipc_platform_file.h"
14 #include "remoting/host/desktop_session.h"
15 #include "remoting/host/win/wts_terminal_observer.h"
16 #include "remoting/host/worker_process_ipc_delegate.h"
17 
18 namespace tracked_objects {
19 class Location;
20 }  // namespace tracked_objects
21 
22 namespace remoting {
23 
24 class AutoThreadTaskRunner;
25 class DaemonProcess;
26 class DesktopSession;
27 class ScreenResolution;
28 class WorkerProcessLauncher;
29 class WtsTerminalMonitor;
30 
31 // DesktopSession implementation which attaches to either physical or virtual
32 // (RDP) console. Receives IPC messages from the desktop process, running in
33 // the target session, via |WorkerProcessIpcDelegate|, and monitors session
34 // attach/detach events via |WtsTerminalObserer|.
35 class DesktopSessionWin
36     : public DesktopSession,
37       public WorkerProcessIpcDelegate,
38       public WtsTerminalObserver {
39  public:
40   // Creates a desktop session instance that attaches to the physical console.
41   static scoped_ptr<DesktopSession> CreateForConsole(
42       scoped_refptr<AutoThreadTaskRunner> caller_task_runner,
43       scoped_refptr<AutoThreadTaskRunner> io_task_runner,
44       DaemonProcess* daemon_process,
45       int id,
46       const ScreenResolution& resolution);
47 
48   // Creates a desktop session instance that attaches to a virtual console.
49   static scoped_ptr<DesktopSession> CreateForVirtualTerminal(
50       scoped_refptr<AutoThreadTaskRunner> caller_task_runner,
51       scoped_refptr<AutoThreadTaskRunner> io_task_runner,
52       DaemonProcess* daemon_process,
53       int id,
54       const ScreenResolution& resolution);
55 
56  protected:
57   // Passes the owning |daemon_process|, a unique identifier of the desktop
58   // session |id| and the interface for monitoring session attach/detach events.
59   // Both |daemon_process| and |monitor| must outlive |this|.
60   DesktopSessionWin(
61     scoped_refptr<AutoThreadTaskRunner> caller_task_runner,
62     scoped_refptr<AutoThreadTaskRunner> io_task_runner,
63     DaemonProcess* daemon_process,
64     int id,
65     WtsTerminalMonitor* monitor);
66   virtual ~DesktopSessionWin();
67 
caller_task_runner()68   const scoped_refptr<AutoThreadTaskRunner>& caller_task_runner() const {
69     return caller_task_runner_;
70   }
71 
72   // Called when |session_attach_timer_| expires.
73   void OnSessionAttachTimeout();
74 
75   // Starts monitoring for session attach/detach events for |terminal_id|.
76   void StartMonitoring(const std::string& terminal_id);
77 
78   // Stops monitoring for session attach/detach events.
79   void StopMonitoring();
80 
81   // Asks DaemonProcess to terminate this session.
82   void TerminateSession();
83 
84   // Injects a secure attention sequence into the session.
85   virtual void InjectSas() = 0;
86 
87   // WorkerProcessIpcDelegate implementation.
88   virtual void OnChannelConnected(int32 peer_pid) OVERRIDE;
89   virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
90   virtual void OnPermanentError(int exit_code) OVERRIDE;
91 
92   // WtsTerminalObserver implementation.
93   virtual void OnSessionAttached(uint32 session_id) OVERRIDE;
94   virtual void OnSessionDetached() OVERRIDE;
95 
96  private:
97   // ChromotingDesktopDaemonMsg_DesktopAttached handler.
98   void OnDesktopSessionAgentAttached(IPC::PlatformFileForTransit desktop_pipe);
99 
100   // Requests the desktop process to crash.
101   void CrashDesktopProcess(const tracked_objects::Location& location);
102 
103   // Reports time elapsed since previous event to the debug log.
104   void ReportElapsedTime(const std::string& event);
105 
106   // Task runner on which public methods of this class should be called.
107   scoped_refptr<AutoThreadTaskRunner> caller_task_runner_;
108 
109   // Message loop used by the IPC channel.
110   scoped_refptr<AutoThreadTaskRunner> io_task_runner_;
111 
112   // Handle of the desktop process (running an instance of DesktopSessionAgent).
113   base::win::ScopedHandle desktop_process_;
114 
115   // Launches and monitors the desktop process.
116   scoped_ptr<WorkerProcessLauncher> launcher_;
117 
118   // Used to unsubscribe from session attach and detach events.
119   WtsTerminalMonitor* monitor_;
120 
121   // True if |this| is subsribed to receive session attach/detach notifications.
122   bool monitoring_notifications_;
123 
124   // Used to report an error if the session attach notification does not arrives
125   // for too long.
126   base::OneShotTimer<DesktopSessionWin> session_attach_timer_;
127 
128   base::Time last_timestamp_;
129 
130   DISALLOW_COPY_AND_ASSIGN(DesktopSessionWin);
131 };
132 
133 }  // namespace remoting
134 
135 #endif  // REMOTING_HOST_DESKTOP_SESSION_WIN_H_
136