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_DESKTOP_SESSION_WIN_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define REMOTING_HOST_DESKTOP_SESSION_WIN_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/scoped_handle.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_platform_file.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/host/desktop_session.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "remoting/host/win/wts_terminal_observer.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/host/worker_process_ipc_delegate.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace tracked_objects {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Location;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace tracked_objects
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AutoThreadTaskRunner;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DaemonProcess;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DesktopSession;
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ScreenResolution;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WorkerProcessLauncher;
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WtsTerminalMonitor;
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// DesktopSession implementation which attaches to either physical or virtual
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// (RDP) console. Receives IPC messages from the desktop process, running in
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the target session, via |WorkerProcessIpcDelegate|, and monitors session
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// attach/detach events via |WtsTerminalObserer|.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DesktopSessionWin
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public DesktopSession,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public WorkerProcessIpcDelegate,
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      public WtsTerminalObserver {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Creates a desktop session instance that attaches to the physical console.
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static scoped_ptr<DesktopSession> CreateForConsole(
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_refptr<AutoThreadTaskRunner> caller_task_runner,
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_refptr<AutoThreadTaskRunner> io_task_runner,
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DaemonProcess* daemon_process,
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int id,
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const ScreenResolution& resolution);
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Creates a desktop session instance that attaches to a virtual console.
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static scoped_ptr<DesktopSession> CreateForVirtualTerminal(
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_refptr<AutoThreadTaskRunner> caller_task_runner,
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_refptr<AutoThreadTaskRunner> io_task_runner,
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DaemonProcess* daemon_process,
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int id,
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const ScreenResolution& resolution);
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Passes the owning |daemon_process|, a unique identifier of the desktop
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // session |id| and the interface for monitoring session attach/detach events.
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Both |daemon_process| and |monitor| must outlive |this|.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DesktopSessionWin(
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<AutoThreadTaskRunner> caller_task_runner,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<AutoThreadTaskRunner> io_task_runner,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DaemonProcess* daemon_process,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int id,
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WtsTerminalMonitor* monitor);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~DesktopSessionWin();
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const scoped_refptr<AutoThreadTaskRunner>& caller_task_runner() const {
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return caller_task_runner_;
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called when |session_attach_timer_| expires.
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnSessionAttachTimeout();
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Starts monitoring for session attach/detach events for |terminal_id|.
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void StartMonitoring(const std::string& terminal_id);
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Stops monitoring for session attach/detach events.
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void StopMonitoring();
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Asks DaemonProcess to terminate this session.
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void TerminateSession();
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Injects a secure attention sequence into the session.
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void InjectSas() = 0;
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WorkerProcessIpcDelegate implementation.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnChannelConnected(int32 peer_pid) OVERRIDE;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void OnPermanentError(int exit_code) OVERRIDE;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // WtsTerminalObserver implementation.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnSessionAttached(uint32 session_id) OVERRIDE;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnSessionDetached() OVERRIDE;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ChromotingDesktopDaemonMsg_DesktopAttached handler.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnDesktopSessionAgentAttached(IPC::PlatformFileForTransit desktop_pipe);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Requests the desktop process to crash.
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CrashDesktopProcess(const tracked_objects::Location& location);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
103a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Reports time elapsed since previous event to the debug log.
104a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  void ReportElapsedTime(const std::string& event);
105a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Task runner on which public methods of this class should be called.
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<AutoThreadTaskRunner> caller_task_runner_;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Message loop used by the IPC channel.
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<AutoThreadTaskRunner> io_task_runner_;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Handle of the desktop process (running an instance of DesktopSessionAgent).
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ScopedHandle desktop_process_;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Launches and monitors the desktop process.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WorkerProcessLauncher> launcher_;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Used to unsubscribe from session attach and detach events.
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WtsTerminalMonitor* monitor_;
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // True if |this| is subsribed to receive session attach/detach notifications.
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool monitoring_notifications_;
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Used to report an error if the session attach notification does not arrives
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // for too long.
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::OneShotTimer<DesktopSessionWin> session_attach_timer_;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
128a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  base::Time last_timestamp_;
129a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DesktopSessionWin);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace remoting
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // REMOTING_HOST_DESKTOP_SESSION_WIN_H_
136