1// Copyright 2014 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#include "remoting/host/single_window_desktop_environment.h"
6
7#include "base/logging.h"
8#include "base/single_thread_task_runner.h"
9#include "remoting/host/single_window_input_injector.h"
10#include "third_party/webrtc/modules/desktop_capture/desktop_capture_options.h"
11#include "third_party/webrtc/modules/desktop_capture/window_capturer.h"
12
13namespace remoting {
14
15// Enables capturing and streaming of windows.
16class SingleWindowDesktopEnvironment : public BasicDesktopEnvironment {
17
18 public:
19  virtual ~SingleWindowDesktopEnvironment();
20
21  // DesktopEnvironment interface.
22  virtual scoped_ptr<webrtc::DesktopCapturer> CreateVideoCapturer() OVERRIDE;
23  virtual scoped_ptr<InputInjector> CreateInputInjector() OVERRIDE;
24
25 protected:
26  friend class SingleWindowDesktopEnvironmentFactory;
27  SingleWindowDesktopEnvironment(
28      scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner,
29      scoped_refptr<base::SingleThreadTaskRunner> input_task_runner,
30      scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner,
31      webrtc::WindowId window_id);
32
33 private:
34  webrtc::WindowId window_id_;
35
36  DISALLOW_COPY_AND_ASSIGN(SingleWindowDesktopEnvironment);
37};
38
39SingleWindowDesktopEnvironment::~SingleWindowDesktopEnvironment() {
40}
41
42scoped_ptr<webrtc::DesktopCapturer>
43SingleWindowDesktopEnvironment::CreateVideoCapturer() {
44  DCHECK(caller_task_runner()->BelongsToCurrentThread());
45
46  webrtc::DesktopCaptureOptions options =
47      webrtc::DesktopCaptureOptions::CreateDefault();
48  options.set_use_update_notifications(true);
49
50  scoped_ptr<webrtc::WindowCapturer>window_capturer(
51        webrtc::WindowCapturer::Create(options));
52  window_capturer->SelectWindow(window_id_);
53
54  return window_capturer.PassAs<webrtc::DesktopCapturer>();
55}
56
57scoped_ptr<InputInjector>
58SingleWindowDesktopEnvironment::CreateInputInjector() {
59  DCHECK(caller_task_runner()->BelongsToCurrentThread());
60
61  scoped_ptr<InputInjector> input_injector(
62      InputInjector::Create(input_task_runner(),
63                            ui_task_runner()));
64  return SingleWindowInputInjector::CreateForWindow(
65      window_id_, input_injector.Pass()).PassAs<InputInjector>();
66}
67
68SingleWindowDesktopEnvironment::SingleWindowDesktopEnvironment(
69    scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner,
70    scoped_refptr<base::SingleThreadTaskRunner> input_task_runner,
71    scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner,
72    webrtc::WindowId window_id)
73    : BasicDesktopEnvironment(caller_task_runner,
74                              input_task_runner,
75                              ui_task_runner),
76      window_id_(window_id) {
77}
78
79SingleWindowDesktopEnvironmentFactory::SingleWindowDesktopEnvironmentFactory(
80    scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner,
81    scoped_refptr<base::SingleThreadTaskRunner> input_task_runner,
82    scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner,
83    webrtc::WindowId window_id)
84    : BasicDesktopEnvironmentFactory(caller_task_runner,
85                                     input_task_runner,
86                                     ui_task_runner),
87      window_id_(window_id) {
88}
89
90SingleWindowDesktopEnvironmentFactory::
91    ~SingleWindowDesktopEnvironmentFactory() {
92}
93
94scoped_ptr<DesktopEnvironment> SingleWindowDesktopEnvironmentFactory::Create(
95    base::WeakPtr<ClientSessionControl> client_session_control) {
96  DCHECK(caller_task_runner()->BelongsToCurrentThread());
97
98  scoped_ptr<SingleWindowDesktopEnvironment> desktop_environment(
99      new SingleWindowDesktopEnvironment(caller_task_runner(),
100                                         input_task_runner(),
101                                         ui_task_runner(),
102                                         window_id_));
103  return desktop_environment.PassAs<DesktopEnvironment>();
104}
105
106}  // namespace remoting
107