chromium/chrome/browser/ash/crosapi/screen_manager_ash.h

// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_ASH_CROSAPI_SCREEN_MANAGER_ASH_H_
#define CHROME_BROWSER_ASH_CROSAPI_SCREEN_MANAGER_ASH_H_

#include <stdint.h>

#include "chromeos/crosapi/mojom/screen_manager.mojom.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
#include "ui/gfx/image/image.h"

namespace content {
struct DesktopMediaID;
}

namespace crosapi {

// This class is the ash-chrome implementation of the ScreenManager interface.
// This class must only be used from the main thread.
class ScreenManagerAsh : public mojom::ScreenManager {
 public:
  ScreenManagerAsh();
  ScreenManagerAsh(const ScreenManagerAsh&) = delete;
  ScreenManagerAsh& operator=(const ScreenManagerAsh&) = delete;
  ~ScreenManagerAsh() override;

  void BindReceiver(mojo::PendingReceiver<mojom::ScreenManager> receiver);

  // crosapi::mojom::ScreenManager:
  void DeprecatedTakeScreenSnapshot(
      DeprecatedTakeScreenSnapshotCallback callback) override;
  void DeprecatedListWindows(DeprecatedListWindowsCallback callback) override;
  void DeprecatedTakeWindowSnapshot(
      uint64_t id,
      DeprecatedTakeWindowSnapshotCallback callback) override;
  void GetScreenCapturer(
      mojo::PendingReceiver<mojom::SnapshotCapturer> receiver) override;
  void GetWindowCapturer(
      mojo::PendingReceiver<mojom::SnapshotCapturer> receiver) override;
  void GetScreenVideoCapturer(
      mojo::PendingReceiver<mojom::VideoCaptureDevice> receiver,
      uint64_t screen_id) override;
  void GetWindowVideoCapturer(
      mojo::PendingReceiver<mojom::VideoCaptureDevice> receiver,
      uint64_t window_id) override;

  // Returns window by ID if present.
  aura::Window* GetWindowById(uint64_t id) const;

 private:
  class ScreenCapturerImpl;
  class WindowCapturerImpl;

  ScreenCapturerImpl* GetScreenCapturerImpl();
  WindowCapturerImpl* GetWindowCapturerImpl();
  void CreateVideoCaptureDevice(
      mojo::PendingReceiver<mojom::VideoCaptureDevice> receiver,
      const content::DesktopMediaID& device_id);

  std::unique_ptr<ScreenCapturerImpl> screen_capturer_impl_;
  std::unique_ptr<WindowCapturerImpl> window_capturer_impl_;

  // This class supports any number of connections. This allows the client to
  // have multiple, potentially thread-affine, remotes. This is needed by
  // WebRTC.
  mojo::ReceiverSet<mojom::ScreenManager> receivers_;
};

}  // namespace crosapi

#endif  // CHROME_BROWSER_ASH_CROSAPI_SCREEN_MANAGER_ASH_H_