OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "remoting/host/client_session.h" | 5 #include "remoting/host/client_session.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
11 #include "base/memory/ptr_util.h" | 11 #include "base/memory/ptr_util.h" |
| 12 #include "base/optional.h" |
12 #include "base/single_thread_task_runner.h" | 13 #include "base/single_thread_task_runner.h" |
13 #include "base/threading/thread_task_runner_handle.h" | 14 #include "base/threading/thread_task_runner_handle.h" |
14 #include "build/build_config.h" | 15 #include "build/build_config.h" |
15 #include "remoting/base/capabilities.h" | 16 #include "remoting/base/capabilities.h" |
16 #include "remoting/base/constants.h" | 17 #include "remoting/base/constants.h" |
17 #include "remoting/base/logging.h" | 18 #include "remoting/base/logging.h" |
18 #include "remoting/host/audio_capturer.h" | 19 #include "remoting/host/audio_capturer.h" |
19 #include "remoting/host/desktop_environment.h" | 20 #include "remoting/host/desktop_environment.h" |
20 #include "remoting/host/host_extension_session.h" | 21 #include "remoting/host/host_extension_session.h" |
21 #include "remoting/host/input_injector.h" | 22 #include "remoting/host/input_injector.h" |
22 #include "remoting/host/mouse_shape_pump.h" | 23 #include "remoting/host/mouse_shape_pump.h" |
| 24 #include "remoting/host/process_stats_sender.h" |
23 #include "remoting/host/screen_controls.h" | 25 #include "remoting/host/screen_controls.h" |
24 #include "remoting/host/screen_resolution.h" | 26 #include "remoting/host/screen_resolution.h" |
25 #include "remoting/proto/control.pb.h" | 27 #include "remoting/proto/control.pb.h" |
26 #include "remoting/proto/event.pb.h" | 28 #include "remoting/proto/event.pb.h" |
27 #include "remoting/protocol/audio_stream.h" | 29 #include "remoting/protocol/audio_stream.h" |
28 #include "remoting/protocol/client_stub.h" | 30 #include "remoting/protocol/client_stub.h" |
29 #include "remoting/protocol/clipboard_thread_proxy.h" | 31 #include "remoting/protocol/clipboard_thread_proxy.h" |
30 #include "remoting/protocol/pairing_registry.h" | 32 #include "remoting/protocol/pairing_registry.h" |
31 #include "remoting/protocol/session.h" | 33 #include "remoting/protocol/session.h" |
32 #include "remoting/protocol/session_config.h" | 34 #include "remoting/protocol/session_config.h" |
(...skipping 27 matching lines...) Expand all Loading... |
60 mouse_clamping_filter_(&remote_input_filter_), | 62 mouse_clamping_filter_(&remote_input_filter_), |
61 disable_input_filter_(&mouse_clamping_filter_), | 63 disable_input_filter_(&mouse_clamping_filter_), |
62 disable_clipboard_filter_(clipboard_echo_filter_.host_filter()), | 64 disable_clipboard_filter_(clipboard_echo_filter_.host_filter()), |
63 client_clipboard_factory_(clipboard_echo_filter_.client_filter()), | 65 client_clipboard_factory_(clipboard_echo_filter_.client_filter()), |
64 max_duration_(max_duration), | 66 max_duration_(max_duration), |
65 pairing_registry_(pairing_registry), | 67 pairing_registry_(pairing_registry), |
66 // Note that |lossless_video_color_| defaults to true, but actually only | 68 // Note that |lossless_video_color_| defaults to true, but actually only |
67 // controls VP9 video stream color quality. | 69 // controls VP9 video stream color quality. |
68 lossless_video_color_(!base::CommandLine::ForCurrentProcess()->HasSwitch( | 70 lossless_video_color_(!base::CommandLine::ForCurrentProcess()->HasSwitch( |
69 kDisableI444SwitchName)), | 71 kDisableI444SwitchName)), |
| 72 current_process_stats_agent_("Network Process"), |
70 weak_factory_(this) { | 73 weak_factory_(this) { |
71 connection_->session()->AddPlugin(&host_experiment_session_plugin_); | 74 connection_->session()->AddPlugin(&host_experiment_session_plugin_); |
72 connection_->SetEventHandler(this); | 75 connection_->SetEventHandler(this); |
73 | 76 |
74 // Create a manager for the configured extensions, if any. | 77 // Create a manager for the configured extensions, if any. |
75 extension_manager_.reset(new HostExtensionSessionManager(extensions, this)); | 78 extension_manager_.reset(new HostExtensionSessionManager(extensions, this)); |
76 | 79 |
77 #if defined(OS_WIN) | 80 #if defined(OS_WIN) |
78 // LocalInputMonitorWin filters out an echo of the injected input before it | 81 // LocalInputMonitorWin filters out an echo of the injected input before it |
79 // reaches |remote_input_filter_|. | 82 // reaches |remote_input_filter_|. |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
236 max_duration_timer_.Start( | 239 max_duration_timer_.Start( |
237 FROM_HERE, max_duration_, | 240 FROM_HERE, max_duration_, |
238 base::Bind(&ClientSession::DisconnectSession, base::Unretained(this), | 241 base::Bind(&ClientSession::DisconnectSession, base::Unretained(this), |
239 protocol::MAX_SESSION_LENGTH)); | 242 protocol::MAX_SESSION_LENGTH)); |
240 } | 243 } |
241 | 244 |
242 // Notify EventHandler. | 245 // Notify EventHandler. |
243 event_handler_->OnSessionAuthenticated(this); | 246 event_handler_->OnSessionAuthenticated(this); |
244 | 247 |
245 DesktopEnvironmentOptions options = desktop_environment_options_; | 248 DesktopEnvironmentOptions options = desktop_environment_options_; |
246 options.ApplyHostSessionOptions(HostSessionOptions( | 249 const HostSessionOptions session_options( |
247 host_experiment_session_plugin_.configuration())); | 250 host_experiment_session_plugin_.configuration()); |
| 251 options.ApplyHostSessionOptions(session_options); |
248 // Create the desktop environment. Drop the connection if it could not be | 252 // Create the desktop environment. Drop the connection if it could not be |
249 // created for any reason (for instance the curtain could not initialize). | 253 // created for any reason (for instance the curtain could not initialize). |
250 desktop_environment_ = | 254 desktop_environment_ = |
251 desktop_environment_factory_->Create(weak_factory_.GetWeakPtr(), options); | 255 desktop_environment_factory_->Create(weak_factory_.GetWeakPtr(), options); |
252 if (!desktop_environment_) { | 256 if (!desktop_environment_) { |
253 DisconnectSession(protocol::HOST_CONFIGURATION_ERROR); | 257 DisconnectSession(protocol::HOST_CONFIGURATION_ERROR); |
254 return; | 258 return; |
255 } | 259 } |
256 | 260 |
257 // Connect host stub. | 261 // Connect host stub. |
258 connection_->set_host_stub(this); | 262 connection_->set_host_stub(this); |
259 | 263 |
| 264 if (connection_->stats_stub()) { |
| 265 base::Optional<int> track_process_stats_interval = |
| 266 session_options.GetInt("Track-Process-Stats-Interval"); |
| 267 // Track-Process-Stats-Interval-Ms is for testing only, usually we should |
| 268 // not set the interval as small as one second or less. |
| 269 base::Optional<int> track_process_stats_interval_ms = |
| 270 session_options.GetInt("Track-Process-Stats-Interval-Ms"); |
| 271 base::TimeDelta interval; |
| 272 if (track_process_stats_interval && *track_process_stats_interval > 0) { |
| 273 interval = base::TimeDelta::FromSeconds(*track_process_stats_interval); |
| 274 } else if (track_process_stats_interval_ms && |
| 275 *track_process_stats_interval_ms > 0) { |
| 276 interval = base::TimeDelta::FromMilliseconds( |
| 277 *track_process_stats_interval_ms); |
| 278 } |
| 279 if (interval > base::TimeDelta()) { |
| 280 // TODO(zijiehe): Add ForwardProcessStatsAgent from DesktopEnvironment. |
| 281 stats_sender_.reset(new ProcessStatsSender( |
| 282 connection_->stats_stub(), |
| 283 interval, |
| 284 { ¤t_process_stats_agent_ })); |
| 285 } |
| 286 } |
| 287 |
260 // Collate the set of capabilities to offer the client, if it supports them. | 288 // Collate the set of capabilities to offer the client, if it supports them. |
261 host_capabilities_ = desktop_environment_->GetCapabilities(); | 289 host_capabilities_ = desktop_environment_->GetCapabilities(); |
262 if (!host_capabilities_.empty()) | 290 if (!host_capabilities_.empty()) |
263 host_capabilities_.append(" "); | 291 host_capabilities_.append(" "); |
264 host_capabilities_.append(extension_manager_->GetCapabilities()); | 292 host_capabilities_.append(extension_manager_->GetCapabilities()); |
265 | 293 |
266 // Create the object that controls the screen resolution. | 294 // Create the object that controls the screen resolution. |
267 screen_controls_ = desktop_environment_->CreateScreenControls(); | 295 screen_controls_ = desktop_environment_->CreateScreenControls(); |
268 | 296 |
269 // Create the event executor. | 297 // Create the event executor. |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
353 | 381 |
354 // Stop components access the client, audio or video stubs, which are no | 382 // Stop components access the client, audio or video stubs, which are no |
355 // longer valid once ConnectionToClient calls OnConnectionClosed(). | 383 // longer valid once ConnectionToClient calls OnConnectionClosed(). |
356 audio_stream_.reset(); | 384 audio_stream_.reset(); |
357 video_stream_.reset(); | 385 video_stream_.reset(); |
358 mouse_shape_pump_.reset(); | 386 mouse_shape_pump_.reset(); |
359 client_clipboard_factory_.InvalidateWeakPtrs(); | 387 client_clipboard_factory_.InvalidateWeakPtrs(); |
360 input_injector_.reset(); | 388 input_injector_.reset(); |
361 screen_controls_.reset(); | 389 screen_controls_.reset(); |
362 desktop_environment_.reset(); | 390 desktop_environment_.reset(); |
| 391 stats_sender_.reset(); |
363 | 392 |
364 // Notify the ChromotingHost that this client is disconnected. | 393 // Notify the ChromotingHost that this client is disconnected. |
365 event_handler_->OnSessionClosed(this); | 394 event_handler_->OnSessionClosed(this); |
366 } | 395 } |
367 | 396 |
368 void ClientSession::OnRouteChange( | 397 void ClientSession::OnRouteChange( |
369 const std::string& channel_name, | 398 const std::string& channel_name, |
370 const protocol::TransportRoute& route) { | 399 const protocol::TransportRoute& route) { |
371 DCHECK(CalledOnValidThread()); | 400 DCHECK(CalledOnValidThread()); |
372 event_handler_->OnSessionRouteChange(this, channel_name, route); | 401 event_handler_->OnSessionRouteChange(this, channel_name, route); |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
466 connection_->client_stub()->SetVideoLayout(layout); | 495 connection_->client_stub()->SetVideoLayout(layout); |
467 } else { | 496 } else { |
468 pending_video_layout_message_.reset(new protocol::VideoLayout(layout)); | 497 pending_video_layout_message_.reset(new protocol::VideoLayout(layout)); |
469 } | 498 } |
470 break; | 499 break; |
471 } | 500 } |
472 } | 501 } |
473 } | 502 } |
474 | 503 |
475 } // namespace remoting | 504 } // namespace remoting |
OLD | NEW |