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.
5 #ifndef REMOTING_HOST_IPC_DESKTOP_ENVIRONMENT_H_
6 #define REMOTING_HOST_IPC_DESKTOP_ENVIRONMENT_H_
11 #include "base/basictypes.h"
12 #include "base/callback_forward.h"
13 #include "base/memory/ref_counted.h"
14 #include "base/memory/scoped_ptr.h"
15 #include "base/memory/weak_ptr.h"
16 #include "remoting/host/desktop_environment.h"
17 #include "remoting/host/desktop_session_connector.h"
20 class SingleThreadTaskRunner;
29 class ClientSessionControl;
30 class DesktopSessionProxy;
31 class ScreenResolution;
33 // A variant of desktop environment integrating with the desktop by means of
34 // a helper process and talking to that process via IPC.
35 class IpcDesktopEnvironment : public DesktopEnvironment {
37 // |desktop_session_connector| is used to bind DesktopSessionProxy to
38 // a desktop session, to be notified every time the desktop process is
40 IpcDesktopEnvironment(
41 scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner,
42 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner,
43 scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner,
44 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
45 base::WeakPtr<ClientSessionControl> client_session_control,
46 base::WeakPtr<DesktopSessionConnector> desktop_session_connector,
47 bool virtual_terminal);
48 virtual ~IpcDesktopEnvironment();
50 // DesktopEnvironment implementation.
51 virtual scoped_ptr<AudioCapturer> CreateAudioCapturer() OVERRIDE;
52 virtual scoped_ptr<InputInjector> CreateInputInjector() OVERRIDE;
53 virtual scoped_ptr<ScreenControls> CreateScreenControls() OVERRIDE;
54 virtual scoped_ptr<webrtc::ScreenCapturer> CreateVideoCapturer() OVERRIDE;
55 virtual std::string GetCapabilities() const OVERRIDE;
56 virtual void SetCapabilities(const std::string& capabilities) OVERRIDE;
59 scoped_refptr<DesktopSessionProxy> desktop_session_proxy_;
61 DISALLOW_COPY_AND_ASSIGN(IpcDesktopEnvironment);
64 // Used to create IpcDesktopEnvironment objects integrating with the desktop via
65 // a helper process and talking to that process via IPC.
66 class IpcDesktopEnvironmentFactory
67 : public DesktopEnvironmentFactory,
68 public DesktopSessionConnector {
70 // Passes a reference to the IPC channel connected to the daemon process and
71 // relevant task runners. |daemon_channel| must outlive this object.
72 IpcDesktopEnvironmentFactory(
73 scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner,
74 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner,
75 scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner,
76 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
77 IPC::Sender* daemon_channel);
78 virtual ~IpcDesktopEnvironmentFactory();
80 // DesktopEnvironmentFactory implementation.
81 virtual scoped_ptr<DesktopEnvironment> Create(
82 base::WeakPtr<ClientSessionControl> client_session_control) OVERRIDE;
83 virtual void SetEnableCurtaining(bool enable) OVERRIDE;
84 virtual bool SupportsAudioCapture() const OVERRIDE;
86 // DesktopSessionConnector implementation.
87 virtual void ConnectTerminal(
88 DesktopSessionProxy* desktop_session_proxy,
89 const ScreenResolution& resolution,
90 bool virtual_terminal) OVERRIDE;
91 virtual void DisconnectTerminal(
92 DesktopSessionProxy* desktop_session_proxy) OVERRIDE;
93 virtual void SetScreenResolution(
94 DesktopSessionProxy* desktop_session_proxy,
95 const ScreenResolution& resolution) OVERRIDE;
96 virtual void OnDesktopSessionAgentAttached(
98 base::ProcessHandle desktop_process,
99 IPC::PlatformFileForTransit desktop_pipe) OVERRIDE;
100 virtual void OnTerminalDisconnected(int terminal_id) OVERRIDE;
103 // Used to run the audio capturer.
104 scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner_;
106 // Task runner on which methods of DesktopEnvironmentFactory interface should
108 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner_;
110 // Used to run the video capturer.
111 scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner_;
113 // Task runner used for running background I/O.
114 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
116 // True if curtain mode is enabled.
117 bool curtain_enabled_;
119 // IPC channel connected to the daemon process.
120 IPC::Sender* daemon_channel_;
122 // List of DesktopEnvironment instances we've told the daemon process about.
123 typedef std::map<int, DesktopSessionProxy*> ActiveConnectionsList;
124 ActiveConnectionsList active_connections_;
126 // Factory for weak pointers to DesktopSessionConnector interface.
127 base::WeakPtrFactory<DesktopSessionConnector> connector_factory_;
129 // Next desktop session ID. IDs are allocated sequentially starting from 0.
130 // This gives us more than 67 years of unique IDs assuming a new ID is
131 // allocated every second.
134 DISALLOW_COPY_AND_ASSIGN(IpcDesktopEnvironmentFactory);
137 } // namespace remoting
139 #endif // REMOTING_HOST_IPC_DESKTOP_ENVIRONMENT_H_