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_IPC_DESKTOP_ENVIRONMENT_H_ 6 #define REMOTING_HOST_IPC_DESKTOP_ENVIRONMENT_H_ 7 8 #include <map> 9 #include <string> 10 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" 18 19 namespace base { 20 class SingleThreadTaskRunner; 21 } // base 22 23 namespace IPC { 24 class Sender; 25 } // namespace IPC 26 27 namespace remoting { 28 29 class ClientSessionControl; 30 class DesktopSessionProxy; 31 class GnubbyAuthHandler; 32 class ScreenResolution; 33 34 // A variant of desktop environment integrating with the desktop by means of 35 // a helper process and talking to that process via IPC. 36 class IpcDesktopEnvironment : public DesktopEnvironment { 37 public: 38 // |desktop_session_connector| is used to bind DesktopSessionProxy to 39 // a desktop session, to be notified every time the desktop process is 40 // restarted. 41 IpcDesktopEnvironment( 42 scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner, 43 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, 44 scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner, 45 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, 46 base::WeakPtr<ClientSessionControl> client_session_control, 47 base::WeakPtr<DesktopSessionConnector> desktop_session_connector, 48 bool virtual_terminal); 49 virtual ~IpcDesktopEnvironment(); 50 51 // DesktopEnvironment implementation. 52 virtual scoped_ptr<AudioCapturer> CreateAudioCapturer() OVERRIDE; 53 virtual scoped_ptr<InputInjector> CreateInputInjector() OVERRIDE; 54 virtual scoped_ptr<ScreenControls> CreateScreenControls() OVERRIDE; 55 virtual scoped_ptr<webrtc::ScreenCapturer> CreateVideoCapturer() OVERRIDE; 56 virtual std::string GetCapabilities() const OVERRIDE; 57 virtual void SetCapabilities(const std::string& capabilities) OVERRIDE; 58 virtual scoped_ptr<GnubbyAuthHandler> CreateGnubbyAuthHandler( 59 protocol::ClientStub* client_stub) OVERRIDE; 60 61 private: 62 scoped_refptr<DesktopSessionProxy> desktop_session_proxy_; 63 64 DISALLOW_COPY_AND_ASSIGN(IpcDesktopEnvironment); 65 }; 66 67 // Used to create IpcDesktopEnvironment objects integrating with the desktop via 68 // a helper process and talking to that process via IPC. 69 class IpcDesktopEnvironmentFactory 70 : public DesktopEnvironmentFactory, 71 public DesktopSessionConnector { 72 public: 73 // Passes a reference to the IPC channel connected to the daemon process and 74 // relevant task runners. |daemon_channel| must outlive this object. 75 IpcDesktopEnvironmentFactory( 76 scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner, 77 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, 78 scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner, 79 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, 80 IPC::Sender* daemon_channel); 81 virtual ~IpcDesktopEnvironmentFactory(); 82 83 // DesktopEnvironmentFactory implementation. 84 virtual scoped_ptr<DesktopEnvironment> Create( 85 base::WeakPtr<ClientSessionControl> client_session_control) OVERRIDE; 86 virtual void SetEnableCurtaining(bool enable) OVERRIDE; 87 virtual bool SupportsAudioCapture() const OVERRIDE; 88 89 // DesktopSessionConnector implementation. 90 virtual void ConnectTerminal( 91 DesktopSessionProxy* desktop_session_proxy, 92 const ScreenResolution& resolution, 93 bool virtual_terminal) OVERRIDE; 94 virtual void DisconnectTerminal( 95 DesktopSessionProxy* desktop_session_proxy) OVERRIDE; 96 virtual void SetScreenResolution( 97 DesktopSessionProxy* desktop_session_proxy, 98 const ScreenResolution& resolution) OVERRIDE; 99 virtual void OnDesktopSessionAgentAttached( 100 int terminal_id, 101 base::ProcessHandle desktop_process, 102 IPC::PlatformFileForTransit desktop_pipe) OVERRIDE; 103 virtual void OnTerminalDisconnected(int terminal_id) OVERRIDE; 104 105 private: 106 // Used to run the audio capturer. 107 scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner_; 108 109 // Task runner on which methods of DesktopEnvironmentFactory interface should 110 // be called. 111 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner_; 112 113 // Used to run the video capturer. 114 scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner_; 115 116 // Task runner used for running background I/O. 117 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; 118 119 // True if curtain mode is enabled. 120 bool curtain_enabled_; 121 122 // IPC channel connected to the daemon process. 123 IPC::Sender* daemon_channel_; 124 125 // List of DesktopEnvironment instances we've told the daemon process about. 126 typedef std::map<int, DesktopSessionProxy*> ActiveConnectionsList; 127 ActiveConnectionsList active_connections_; 128 129 // Factory for weak pointers to DesktopSessionConnector interface. 130 base::WeakPtrFactory<DesktopSessionConnector> connector_factory_; 131 132 // Next desktop session ID. IDs are allocated sequentially starting from 0. 133 // This gives us more than 67 years of unique IDs assuming a new ID is 134 // allocated every second. 135 int next_id_; 136 137 DISALLOW_COPY_AND_ASSIGN(IpcDesktopEnvironmentFactory); 138 }; 139 140 } // namespace remoting 141 142 #endif // REMOTING_HOST_IPC_DESKTOP_ENVIRONMENT_H_ 143