ipc_desktop_environment.h 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  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. #ifndef REMOTING_HOST_IPC_DESKTOP_ENVIRONMENT_H_
  5. #define REMOTING_HOST_IPC_DESKTOP_ENVIRONMENT_H_
  6. #include <cstdint>
  7. #include <map>
  8. #include <memory>
  9. #include <string>
  10. #include "base/callback_forward.h"
  11. #include "base/memory/ref_counted.h"
  12. #include "base/memory/weak_ptr.h"
  13. #include "mojo/public/cpp/bindings/associated_receiver.h"
  14. #include "mojo/public/cpp/bindings/associated_remote.h"
  15. #include "mojo/public/cpp/system/message_pipe.h"
  16. #include "remoting/host/desktop_environment.h"
  17. #include "remoting/host/desktop_session_connector.h"
  18. #include "remoting/host/file_transfer/ipc_file_operations.h"
  19. #include "remoting/host/mojom/desktop_session.mojom.h"
  20. #include "remoting/host/mojom/remoting_host.mojom.h"
  21. #include "remoting/protocol/desktop_capturer.h"
  22. namespace base {
  23. class SingleThreadTaskRunner;
  24. } // base
  25. namespace remoting {
  26. class ClientSessionControl;
  27. class DesktopSessionProxy;
  28. class ScreenResolution;
  29. // A variant of desktop environment integrating with the desktop by means of
  30. // a helper process and talking to that process via IPC.
  31. class IpcDesktopEnvironment : public DesktopEnvironment {
  32. public:
  33. // |desktop_session_connector| is used to bind DesktopSessionProxy to
  34. // a desktop session, to be notified every time the desktop process is
  35. // restarted.
  36. IpcDesktopEnvironment(
  37. scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner,
  38. scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner,
  39. scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
  40. base::WeakPtr<ClientSessionControl> client_session_control,
  41. base::WeakPtr<ClientSessionEvents> client_session_events,
  42. base::WeakPtr<DesktopSessionConnector> desktop_session_connector,
  43. const DesktopEnvironmentOptions& options);
  44. IpcDesktopEnvironment(const IpcDesktopEnvironment&) = delete;
  45. IpcDesktopEnvironment& operator=(const IpcDesktopEnvironment&) = delete;
  46. ~IpcDesktopEnvironment() override;
  47. // DesktopEnvironment implementation.
  48. std::unique_ptr<ActionExecutor> CreateActionExecutor() override;
  49. std::unique_ptr<AudioCapturer> CreateAudioCapturer() override;
  50. std::unique_ptr<InputInjector> CreateInputInjector() override;
  51. std::unique_ptr<ScreenControls> CreateScreenControls() override;
  52. std::unique_ptr<DesktopCapturer> CreateVideoCapturer() override;
  53. DesktopDisplayInfoMonitor* GetDisplayInfoMonitor() override;
  54. std::unique_ptr<webrtc::MouseCursorMonitor> CreateMouseCursorMonitor()
  55. override;
  56. std::unique_ptr<KeyboardLayoutMonitor> CreateKeyboardLayoutMonitor(
  57. base::RepeatingCallback<void(const protocol::KeyboardLayout&)> callback)
  58. override;
  59. std::unique_ptr<FileOperations> CreateFileOperations() override;
  60. std::unique_ptr<UrlForwarderConfigurator> CreateUrlForwarderConfigurator()
  61. override;
  62. std::string GetCapabilities() const override;
  63. void SetCapabilities(const std::string& capabilities) override;
  64. uint32_t GetDesktopSessionId() const override;
  65. std::unique_ptr<DesktopAndCursorConditionalComposer>
  66. CreateComposingVideoCapturer() override;
  67. std::unique_ptr<RemoteWebAuthnStateChangeNotifier>
  68. CreateRemoteWebAuthnStateChangeNotifier() override;
  69. private:
  70. scoped_refptr<DesktopSessionProxy> desktop_session_proxy_;
  71. };
  72. // Used to create IpcDesktopEnvironment objects integrating with the desktop via
  73. // a helper process and talking to that process via IPC.
  74. class IpcDesktopEnvironmentFactory
  75. : public DesktopEnvironmentFactory,
  76. public DesktopSessionConnector {
  77. public:
  78. // Passes a reference to the IPC channel connected to the daemon process and
  79. // relevant task runners. |daemon_channel| must outlive this object.
  80. IpcDesktopEnvironmentFactory(
  81. scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner,
  82. scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner,
  83. scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
  84. mojo::AssociatedRemote<mojom::DesktopSessionManager> remote);
  85. IpcDesktopEnvironmentFactory(const IpcDesktopEnvironmentFactory&) = delete;
  86. IpcDesktopEnvironmentFactory& operator=(const IpcDesktopEnvironmentFactory&) =
  87. delete;
  88. ~IpcDesktopEnvironmentFactory() override;
  89. // DesktopEnvironmentFactory implementation.
  90. std::unique_ptr<DesktopEnvironment> Create(
  91. base::WeakPtr<ClientSessionControl> client_session_control,
  92. base::WeakPtr<ClientSessionEvents> client_session_events,
  93. const DesktopEnvironmentOptions& options) override;
  94. bool SupportsAudioCapture() const override;
  95. // DesktopSessionConnector implementation.
  96. void ConnectTerminal(DesktopSessionProxy* desktop_session_proxy,
  97. const ScreenResolution& resolution,
  98. bool virtual_terminal) override;
  99. void DisconnectTerminal(DesktopSessionProxy* desktop_session_proxy) override;
  100. void SetScreenResolution(DesktopSessionProxy* desktop_session_proxy,
  101. const ScreenResolution& resolution) override;
  102. bool BindConnectionEventsReceiver(
  103. mojo::ScopedInterfaceEndpointHandle handle) override;
  104. void OnDesktopSessionAgentAttached(
  105. int terminal_id,
  106. int session_id,
  107. mojo::ScopedMessagePipeHandle desktop_pipe) override;
  108. void OnTerminalDisconnected(int terminal_id) override;
  109. private:
  110. // Used to run the audio capturer.
  111. scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner_;
  112. // Task runner on which methods of DesktopEnvironmentFactory interface should
  113. // be called.
  114. scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner_;
  115. // Task runner used for running background I/O.
  116. scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
  117. // List of DesktopEnvironment instances we've told the daemon process about.
  118. typedef std::map<int, DesktopSessionProxy*> ActiveConnectionsList;
  119. ActiveConnectionsList active_connections_;
  120. // Next desktop session ID. IDs are allocated sequentially starting from 0.
  121. // This gives us more than 67 years of unique IDs assuming a new ID is
  122. // allocated every second.
  123. int next_id_ = 0;
  124. mojo::AssociatedRemote<mojom::DesktopSessionManager> desktop_session_manager_;
  125. mojo::AssociatedReceiver<mojom::DesktopSessionConnectionEvents>
  126. desktop_session_connection_events_{this};
  127. // Factory for weak pointers to DesktopSessionConnector interface.
  128. base::WeakPtrFactory<DesktopSessionConnector> connector_factory_{this};
  129. };
  130. } // namespace remoting
  131. #endif // REMOTING_HOST_IPC_DESKTOP_ENVIRONMENT_H_