1 // Copyright 2016 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/desktop_environment_options.h"
6 
7 #include <string>
8 #include <utility>
9 
10 #include "base/optional.h"
11 #include "build/build_config.h"
12 
13 #if defined(OS_WIN)
14 #include "remoting/host/win/evaluate_d3d.h"
15 #endif
16 
17 namespace remoting {
18 
19 using DesktopCaptureOptions = webrtc::DesktopCaptureOptions;
20 
21 // static
CreateDefault()22 DesktopEnvironmentOptions DesktopEnvironmentOptions::CreateDefault() {
23   DesktopEnvironmentOptions options;
24   options.desktop_capture_options_ = DesktopCaptureOptions::CreateDefault();
25   options.Initialize();
26   return options;
27 }
28 
DesktopEnvironmentOptions()29 DesktopEnvironmentOptions::DesktopEnvironmentOptions() {
30   Initialize();
31 }
32 
33 DesktopEnvironmentOptions::DesktopEnvironmentOptions(
34     DesktopEnvironmentOptions&& other) = default;
35 DesktopEnvironmentOptions::DesktopEnvironmentOptions(
36     const DesktopEnvironmentOptions& other) = default;
37 DesktopEnvironmentOptions::~DesktopEnvironmentOptions() = default;
38 DesktopEnvironmentOptions&
39 DesktopEnvironmentOptions::operator=(
40     DesktopEnvironmentOptions&& other) = default;
41 DesktopEnvironmentOptions&
42 DesktopEnvironmentOptions::operator=(
43     const DesktopEnvironmentOptions& other) = default;
44 
Initialize()45 void DesktopEnvironmentOptions::Initialize() {
46   desktop_capture_options_.set_detect_updated_region(true);
47 #if defined (OS_WIN)
48   // Whether DirectX capturer can be enabled depends on various factors,
49   // including how many applications are using related APIs.
50   // WebRTC/DesktopCapturer will take care of those details. This check is used
51   // to ensure D3D APIs are safe to access in the current environment.
52   desktop_capture_options_.set_allow_directx_capturer(IsD3DAvailable());
53 #endif
54 }
55 
56 const DesktopCaptureOptions*
desktop_capture_options() const57 DesktopEnvironmentOptions::desktop_capture_options() const {
58   return &desktop_capture_options_;
59 }
60 
61 DesktopCaptureOptions*
desktop_capture_options()62 DesktopEnvironmentOptions::desktop_capture_options() {
63   return &desktop_capture_options_;
64 }
65 
enable_curtaining() const66 bool DesktopEnvironmentOptions::enable_curtaining() const {
67   return enable_curtaining_;
68 }
69 
set_enable_curtaining(bool enabled)70 void DesktopEnvironmentOptions::set_enable_curtaining(bool enabled) {
71   enable_curtaining_ = enabled;
72 }
73 
enable_user_interface() const74 bool DesktopEnvironmentOptions::enable_user_interface() const {
75   return enable_user_interface_;
76 }
77 
set_enable_user_interface(bool enabled)78 void DesktopEnvironmentOptions::set_enable_user_interface(bool enabled) {
79   enable_user_interface_ = enabled;
80 }
81 
enable_notifications() const82 bool DesktopEnvironmentOptions::enable_notifications() const {
83   return enable_notifications_;
84 }
85 
set_enable_notifications(bool enabled)86 void DesktopEnvironmentOptions::set_enable_notifications(bool enabled) {
87   enable_notifications_ = enabled;
88 }
89 
terminate_upon_input() const90 bool DesktopEnvironmentOptions::terminate_upon_input() const {
91   return terminate_upon_input_;
92 }
93 
set_terminate_upon_input(bool enabled)94 void DesktopEnvironmentOptions::set_terminate_upon_input(bool enabled) {
95   terminate_upon_input_ = enabled;
96 }
97 
enable_file_transfer() const98 bool DesktopEnvironmentOptions::enable_file_transfer() const {
99   return enable_file_transfer_;
100 }
101 
set_enable_file_transfer(bool enabled)102 void DesktopEnvironmentOptions::set_enable_file_transfer(bool enabled) {
103   enable_file_transfer_ = enabled;
104 }
105 
ApplySessionOptions(const SessionOptions & options)106 void DesktopEnvironmentOptions::ApplySessionOptions(
107     const SessionOptions& options) {
108 #if defined(OS_WIN)
109   base::Optional<bool> directx_capturer =
110       options.GetBool("DirectX-Capturer");
111   if (directx_capturer) {
112     desktop_capture_options_.set_allow_directx_capturer(*directx_capturer);
113   }
114 #endif
115   // This field is for test purpose. Usually it should not be set to false.
116   base::Optional<bool> detect_updated_region =
117       options.GetBool("Detect-Updated-Region");
118   if (detect_updated_region) {
119     desktop_capture_options_.set_detect_updated_region(*detect_updated_region);
120   }
121 }
122 
123 }  // namespace remoting
124