Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(95)

Side by Side Diff: remoting/host/client_session.cc

Issue 2911893003: Deprecate NonThreadSafe in remoting in favor of SequenceChecker. (Closed)
Patch Set: Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « remoting/host/client_session.h ('k') | remoting/host/continue_window.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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"
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
75 extension_manager_.reset(new HostExtensionSessionManager(extensions, this)); 75 extension_manager_.reset(new HostExtensionSessionManager(extensions, this));
76 76
77 #if defined(OS_WIN) 77 #if defined(OS_WIN)
78 // LocalInputMonitorWin filters out an echo of the injected input before it 78 // LocalInputMonitorWin filters out an echo of the injected input before it
79 // reaches |remote_input_filter_|. 79 // reaches |remote_input_filter_|.
80 remote_input_filter_.SetExpectLocalEcho(false); 80 remote_input_filter_.SetExpectLocalEcho(false);
81 #endif // defined(OS_WIN) 81 #endif // defined(OS_WIN)
82 } 82 }
83 83
84 ClientSession::~ClientSession() { 84 ClientSession::~ClientSession() {
85 DCHECK(CalledOnValidThread()); 85 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
86 DCHECK(!audio_stream_); 86 DCHECK(!audio_stream_);
87 DCHECK(!desktop_environment_); 87 DCHECK(!desktop_environment_);
88 DCHECK(!input_injector_); 88 DCHECK(!input_injector_);
89 DCHECK(!screen_controls_); 89 DCHECK(!screen_controls_);
90 DCHECK(!video_stream_); 90 DCHECK(!video_stream_);
91 91
92 connection_.reset(); 92 connection_.reset();
93 } 93 }
94 94
95 void ClientSession::NotifyClientResolution( 95 void ClientSession::NotifyClientResolution(
96 const protocol::ClientResolution& resolution) { 96 const protocol::ClientResolution& resolution) {
97 DCHECK(CalledOnValidThread()); 97 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
98 DCHECK(resolution.dips_width() > 0 && resolution.dips_height() > 0); 98 DCHECK(resolution.dips_width() > 0 && resolution.dips_height() > 0);
99 99
100 VLOG(1) << "Received ClientResolution (dips_width=" 100 VLOG(1) << "Received ClientResolution (dips_width="
101 << resolution.dips_width() << ", dips_height=" 101 << resolution.dips_width() << ", dips_height="
102 << resolution.dips_height() << ")"; 102 << resolution.dips_height() << ")";
103 103
104 if (!screen_controls_) 104 if (!screen_controls_)
105 return; 105 return;
106 106
107 webrtc::DesktopSize client_size(resolution.dips_width(), 107 webrtc::DesktopSize client_size(resolution.dips_width(),
108 resolution.dips_height()); 108 resolution.dips_height());
109 if (connection_->session()->config().protocol() == 109 if (connection_->session()->config().protocol() ==
110 protocol::SessionConfig::Protocol::WEBRTC) { 110 protocol::SessionConfig::Protocol::WEBRTC) {
111 // When using WebRTC round down the dimensions to multiple of 2. Otherwise 111 // When using WebRTC round down the dimensions to multiple of 2. Otherwise
112 // the dimensions will be rounded on the receiver, which will cause blurring 112 // the dimensions will be rounded on the receiver, which will cause blurring
113 // due to scaling. The resulting size is still close to the client size and 113 // due to scaling. The resulting size is still close to the client size and
114 // will fit on the client's screen without scaling. 114 // will fit on the client's screen without scaling.
115 // TODO(sergeyu): Make WebRTC handle odd dimensions properly. 115 // TODO(sergeyu): Make WebRTC handle odd dimensions properly.
116 // crbug.com/636071 116 // crbug.com/636071
117 client_size.set(client_size.width() & (~1), client_size.height() & (~1)); 117 client_size.set(client_size.width() & (~1), client_size.height() & (~1));
118 } 118 }
119 119
120 // Try to match the client's resolution. 120 // Try to match the client's resolution.
121 // TODO(sergeyu): Pass clients DPI to the resizer. 121 // TODO(sergeyu): Pass clients DPI to the resizer.
122 screen_controls_->SetScreenResolution(ScreenResolution( 122 screen_controls_->SetScreenResolution(ScreenResolution(
123 client_size, webrtc::DesktopVector(kDefaultDpi, kDefaultDpi))); 123 client_size, webrtc::DesktopVector(kDefaultDpi, kDefaultDpi)));
124 } 124 }
125 125
126 void ClientSession::ControlVideo(const protocol::VideoControl& video_control) { 126 void ClientSession::ControlVideo(const protocol::VideoControl& video_control) {
127 DCHECK(CalledOnValidThread()); 127 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
128 128
129 // Note that |video_stream_| may be null, depending upon whether 129 // Note that |video_stream_| may be null, depending upon whether
130 // extensions choose to wrap or "steal" the video capturer or encoder. 130 // extensions choose to wrap or "steal" the video capturer or encoder.
131 if (video_control.has_enable()) { 131 if (video_control.has_enable()) {
132 VLOG(1) << "Received VideoControl (enable=" 132 VLOG(1) << "Received VideoControl (enable="
133 << video_control.enable() << ")"; 133 << video_control.enable() << ")";
134 pause_video_ = !video_control.enable(); 134 pause_video_ = !video_control.enable();
135 if (video_stream_) 135 if (video_stream_)
136 video_stream_->Pause(pause_video_); 136 video_stream_->Pause(pause_video_);
137 } 137 }
138 if (video_control.has_lossless_encode()) { 138 if (video_control.has_lossless_encode()) {
139 VLOG(1) << "Received VideoControl (lossless_encode=" 139 VLOG(1) << "Received VideoControl (lossless_encode="
140 << video_control.lossless_encode() << ")"; 140 << video_control.lossless_encode() << ")";
141 lossless_video_encode_ = video_control.lossless_encode(); 141 lossless_video_encode_ = video_control.lossless_encode();
142 if (video_stream_) 142 if (video_stream_)
143 video_stream_->SetLosslessEncode(lossless_video_encode_); 143 video_stream_->SetLosslessEncode(lossless_video_encode_);
144 } 144 }
145 if (video_control.has_lossless_color()) { 145 if (video_control.has_lossless_color()) {
146 VLOG(1) << "Received VideoControl (lossless_color=" 146 VLOG(1) << "Received VideoControl (lossless_color="
147 << video_control.lossless_color() << ")"; 147 << video_control.lossless_color() << ")";
148 lossless_video_color_ = video_control.lossless_color(); 148 lossless_video_color_ = video_control.lossless_color();
149 if (video_stream_) 149 if (video_stream_)
150 video_stream_->SetLosslessColor(lossless_video_color_); 150 video_stream_->SetLosslessColor(lossless_video_color_);
151 } 151 }
152 } 152 }
153 153
154 void ClientSession::ControlAudio(const protocol::AudioControl& audio_control) { 154 void ClientSession::ControlAudio(const protocol::AudioControl& audio_control) {
155 DCHECK(CalledOnValidThread()); 155 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
156 156
157 if (audio_control.has_enable()) { 157 if (audio_control.has_enable()) {
158 VLOG(1) << "Received AudioControl (enable=" 158 VLOG(1) << "Received AudioControl (enable="
159 << audio_control.enable() << ")"; 159 << audio_control.enable() << ")";
160 if (audio_stream_) 160 if (audio_stream_)
161 audio_stream_->Pause(!audio_control.enable()); 161 audio_stream_->Pause(!audio_control.enable());
162 } 162 }
163 } 163 }
164 164
165 void ClientSession::SetCapabilities( 165 void ClientSession::SetCapabilities(
166 const protocol::Capabilities& capabilities) { 166 const protocol::Capabilities& capabilities) {
167 DCHECK(CalledOnValidThread()); 167 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
168 168
169 // Ignore all the messages but the 1st one. 169 // Ignore all the messages but the 1st one.
170 if (client_capabilities_) { 170 if (client_capabilities_) {
171 LOG(WARNING) << "protocol::Capabilities has been received already."; 171 LOG(WARNING) << "protocol::Capabilities has been received already.";
172 return; 172 return;
173 } 173 }
174 174
175 // Compute the set of capabilities supported by both client and host. 175 // Compute the set of capabilities supported by both client and host.
176 client_capabilities_ = base::MakeUnique<std::string>(); 176 client_capabilities_ = base::MakeUnique<std::string>();
177 if (capabilities.has_capabilities()) 177 if (capabilities.has_capabilities())
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 << message.type() << ": " << message.data(); 216 << message.type() << ": " << message.data();
217 } 217 }
218 } 218 }
219 } 219 }
220 220
221 void ClientSession::OnConnectionAuthenticating() { 221 void ClientSession::OnConnectionAuthenticating() {
222 event_handler_->OnSessionAuthenticating(this); 222 event_handler_->OnSessionAuthenticating(this);
223 } 223 }
224 224
225 void ClientSession::OnConnectionAuthenticated() { 225 void ClientSession::OnConnectionAuthenticated() {
226 DCHECK(CalledOnValidThread()); 226 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
227 DCHECK(!audio_stream_); 227 DCHECK(!audio_stream_);
228 DCHECK(!desktop_environment_); 228 DCHECK(!desktop_environment_);
229 DCHECK(!input_injector_); 229 DCHECK(!input_injector_);
230 DCHECK(!screen_controls_); 230 DCHECK(!screen_controls_);
231 DCHECK(!video_stream_); 231 DCHECK(!video_stream_);
232 232
233 is_authenticated_ = true; 233 is_authenticated_ = true;
234 234
235 if (max_duration_ > base::TimeDelta()) { 235 if (max_duration_ > base::TimeDelta()) {
236 max_duration_timer_.Start( 236 max_duration_timer_.Start(
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
273 connection_->set_input_stub(&disable_input_filter_); 273 connection_->set_input_stub(&disable_input_filter_);
274 host_input_filter_.set_input_stub(input_injector_.get()); 274 host_input_filter_.set_input_stub(input_injector_.get());
275 275
276 // Connect the clipboard stubs. 276 // Connect the clipboard stubs.
277 connection_->set_clipboard_stub(&disable_clipboard_filter_); 277 connection_->set_clipboard_stub(&disable_clipboard_filter_);
278 clipboard_echo_filter_.set_host_stub(input_injector_.get()); 278 clipboard_echo_filter_.set_host_stub(input_injector_.get());
279 clipboard_echo_filter_.set_client_stub(connection_->client_stub()); 279 clipboard_echo_filter_.set_client_stub(connection_->client_stub());
280 } 280 }
281 281
282 void ClientSession::CreateMediaStreams() { 282 void ClientSession::CreateMediaStreams() {
283 DCHECK(CalledOnValidThread()); 283 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
284 284
285 // Create a VideoStream to pump frames from the capturer to the client. 285 // Create a VideoStream to pump frames from the capturer to the client.
286 video_stream_ = connection_->StartVideoStream( 286 video_stream_ = connection_->StartVideoStream(
287 desktop_environment_->CreateVideoCapturer()); 287 desktop_environment_->CreateVideoCapturer());
288 288
289 // Create a AudioStream to pump audio from the capturer to the client. 289 // Create a AudioStream to pump audio from the capturer to the client.
290 std::unique_ptr<protocol::AudioSource> audio_capturer = 290 std::unique_ptr<protocol::AudioSource> audio_capturer =
291 desktop_environment_->CreateAudioCapturer(); 291 desktop_environment_->CreateAudioCapturer();
292 if (audio_capturer) { 292 if (audio_capturer) {
293 audio_stream_ = connection_->StartAudioStream(std::move(audio_capturer)); 293 audio_stream_ = connection_->StartAudioStream(std::move(audio_capturer));
294 } 294 }
295 295
296 video_stream_->SetObserver(this); 296 video_stream_->SetObserver(this);
297 297
298 // Apply video-control parameters to the new stream. 298 // Apply video-control parameters to the new stream.
299 video_stream_->SetLosslessEncode(lossless_video_encode_); 299 video_stream_->SetLosslessEncode(lossless_video_encode_);
300 video_stream_->SetLosslessColor(lossless_video_color_); 300 video_stream_->SetLosslessColor(lossless_video_color_);
301 301
302 // Pause capturing if necessary. 302 // Pause capturing if necessary.
303 video_stream_->Pause(pause_video_); 303 video_stream_->Pause(pause_video_);
304 304
305 if (event_timestamp_source_for_tests_) 305 if (event_timestamp_source_for_tests_)
306 video_stream_->SetEventTimestampsSource(event_timestamp_source_for_tests_); 306 video_stream_->SetEventTimestampsSource(event_timestamp_source_for_tests_);
307 } 307 }
308 308
309 void ClientSession::OnConnectionChannelsConnected() { 309 void ClientSession::OnConnectionChannelsConnected() {
310 DCHECK(CalledOnValidThread()); 310 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
311 311
312 DCHECK(!channels_connected_); 312 DCHECK(!channels_connected_);
313 channels_connected_ = true; 313 channels_connected_ = true;
314 314
315 // Negotiate capabilities with the client. 315 // Negotiate capabilities with the client.
316 VLOG(1) << "Host capabilities: " << host_capabilities_; 316 VLOG(1) << "Host capabilities: " << host_capabilities_;
317 protocol::Capabilities capabilities; 317 protocol::Capabilities capabilities;
318 capabilities.set_capabilities(host_capabilities_); 318 capabilities.set_capabilities(host_capabilities_);
319 connection_->client_stub()->SetCapabilities(capabilities); 319 connection_->client_stub()->SetCapabilities(capabilities);
320 320
321 // Start the event executor. 321 // Start the event executor.
322 input_injector_->Start(CreateClipboardProxy()); 322 input_injector_->Start(CreateClipboardProxy());
323 SetDisableInputs(false); 323 SetDisableInputs(false);
324 324
325 // Create MouseShapePump to send mouse cursor shape. 325 // Create MouseShapePump to send mouse cursor shape.
326 mouse_shape_pump_.reset( 326 mouse_shape_pump_.reset(
327 new MouseShapePump(desktop_environment_->CreateMouseCursorMonitor(), 327 new MouseShapePump(desktop_environment_->CreateMouseCursorMonitor(),
328 connection_->client_stub())); 328 connection_->client_stub()));
329 329
330 if (pending_video_layout_message_) { 330 if (pending_video_layout_message_) {
331 connection_->client_stub()->SetVideoLayout(*pending_video_layout_message_); 331 connection_->client_stub()->SetVideoLayout(*pending_video_layout_message_);
332 pending_video_layout_message_.reset(); 332 pending_video_layout_message_.reset();
333 } 333 }
334 334
335 // Notify the event handler that all our channels are now connected. 335 // Notify the event handler that all our channels are now connected.
336 event_handler_->OnSessionChannelsConnected(this); 336 event_handler_->OnSessionChannelsConnected(this);
337 } 337 }
338 338
339 void ClientSession::OnConnectionClosed(protocol::ErrorCode error) { 339 void ClientSession::OnConnectionClosed(protocol::ErrorCode error) {
340 DCHECK(CalledOnValidThread()); 340 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
341 341
342 HOST_LOG << "Client disconnected: " << client_jid_ << "; error = " << error; 342 HOST_LOG << "Client disconnected: " << client_jid_ << "; error = " << error;
343 343
344 // Ignore any further callbacks. 344 // Ignore any further callbacks.
345 weak_factory_.InvalidateWeakPtrs(); 345 weak_factory_.InvalidateWeakPtrs();
346 346
347 // If the client never authenticated then the session failed. 347 // If the client never authenticated then the session failed.
348 if (!is_authenticated_) 348 if (!is_authenticated_)
349 event_handler_->OnSessionAuthenticationFailed(this); 349 event_handler_->OnSessionAuthenticationFailed(this);
350 350
(...skipping 10 matching lines...) Expand all
361 screen_controls_.reset(); 361 screen_controls_.reset();
362 desktop_environment_.reset(); 362 desktop_environment_.reset();
363 363
364 // Notify the ChromotingHost that this client is disconnected. 364 // Notify the ChromotingHost that this client is disconnected.
365 event_handler_->OnSessionClosed(this); 365 event_handler_->OnSessionClosed(this);
366 } 366 }
367 367
368 void ClientSession::OnRouteChange( 368 void ClientSession::OnRouteChange(
369 const std::string& channel_name, 369 const std::string& channel_name,
370 const protocol::TransportRoute& route) { 370 const protocol::TransportRoute& route) {
371 DCHECK(CalledOnValidThread()); 371 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
372 event_handler_->OnSessionRouteChange(this, channel_name, route); 372 event_handler_->OnSessionRouteChange(this, channel_name, route);
373 } 373 }
374 374
375 const std::string& ClientSession::client_jid() const { 375 const std::string& ClientSession::client_jid() const {
376 return client_jid_; 376 return client_jid_;
377 } 377 }
378 378
379 void ClientSession::DisconnectSession(protocol::ErrorCode error) { 379 void ClientSession::DisconnectSession(protocol::ErrorCode error) {
380 DCHECK(CalledOnValidThread()); 380 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
381 DCHECK(connection_.get()); 381 DCHECK(connection_.get());
382 382
383 max_duration_timer_.Stop(); 383 max_duration_timer_.Stop();
384 384
385 // This triggers OnConnectionClosed(), and the session may be destroyed 385 // This triggers OnConnectionClosed(), and the session may be destroyed
386 // as the result, so this call must be the last in this method. 386 // as the result, so this call must be the last in this method.
387 connection_->Disconnect(error); 387 connection_->Disconnect(error);
388 } 388 }
389 389
390 void ClientSession::OnLocalMouseMoved(const webrtc::DesktopVector& position) { 390 void ClientSession::OnLocalMouseMoved(const webrtc::DesktopVector& position) {
391 DCHECK(CalledOnValidThread()); 391 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
392 remote_input_filter_.LocalMouseMoved(position); 392 remote_input_filter_.LocalMouseMoved(position);
393 } 393 }
394 394
395 void ClientSession::SetDisableInputs(bool disable_inputs) { 395 void ClientSession::SetDisableInputs(bool disable_inputs) {
396 DCHECK(CalledOnValidThread()); 396 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
397 397
398 if (disable_inputs) 398 if (disable_inputs)
399 input_tracker_.ReleaseAll(); 399 input_tracker_.ReleaseAll();
400 400
401 disable_input_filter_.set_enabled(!disable_inputs); 401 disable_input_filter_.set_enabled(!disable_inputs);
402 disable_clipboard_filter_.set_enabled(!disable_inputs); 402 disable_clipboard_filter_.set_enabled(!disable_inputs);
403 } 403 }
404 404
405 uint32_t ClientSession::desktop_session_id() const { 405 uint32_t ClientSession::desktop_session_id() const {
406 DCHECK(CalledOnValidThread()); 406 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
407 DCHECK(desktop_environment_); 407 DCHECK(desktop_environment_);
408 return desktop_environment_->GetDesktopSessionId(); 408 return desktop_environment_->GetDesktopSessionId();
409 } 409 }
410 410
411 ClientSessionControl* ClientSession::session_control() { 411 ClientSessionControl* ClientSession::session_control() {
412 DCHECK(CalledOnValidThread()); 412 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
413 return this; 413 return this;
414 } 414 }
415 415
416 void ClientSession::SetEventTimestampsSourceForTests( 416 void ClientSession::SetEventTimestampsSourceForTests(
417 scoped_refptr<protocol::InputEventTimestampsSource> 417 scoped_refptr<protocol::InputEventTimestampsSource>
418 event_timestamp_source) { 418 event_timestamp_source) {
419 DCHECK(CalledOnValidThread()); 419 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
420 event_timestamp_source_for_tests_ = event_timestamp_source; 420 event_timestamp_source_for_tests_ = event_timestamp_source;
421 if (video_stream_) 421 if (video_stream_)
422 video_stream_->SetEventTimestampsSource(event_timestamp_source_for_tests_); 422 video_stream_->SetEventTimestampsSource(event_timestamp_source_for_tests_);
423 } 423 }
424 424
425 std::unique_ptr<protocol::ClipboardStub> ClientSession::CreateClipboardProxy() { 425 std::unique_ptr<protocol::ClipboardStub> ClientSession::CreateClipboardProxy() {
426 DCHECK(CalledOnValidThread()); 426 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
427 return base::MakeUnique<protocol::ClipboardThreadProxy>( 427 return base::MakeUnique<protocol::ClipboardThreadProxy>(
428 client_clipboard_factory_.GetWeakPtr(), 428 client_clipboard_factory_.GetWeakPtr(),
429 base::ThreadTaskRunnerHandle::Get()); 429 base::ThreadTaskRunnerHandle::Get());
430 } 430 }
431 431
432 void ClientSession::OnVideoSizeChanged(protocol::VideoStream* video_stream, 432 void ClientSession::OnVideoSizeChanged(protocol::VideoStream* video_stream,
433 const webrtc::DesktopSize& size, 433 const webrtc::DesktopSize& size,
434 const webrtc::DesktopVector& dpi) { 434 const webrtc::DesktopVector& dpi) {
435 DCHECK(CalledOnValidThread()); 435 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
436 436
437 mouse_clamping_filter_.set_output_size(size); 437 mouse_clamping_filter_.set_output_size(size);
438 438
439 switch (connection_->session()->config().protocol()) { 439 switch (connection_->session()->config().protocol()) {
440 case protocol::SessionConfig::Protocol::ICE: 440 case protocol::SessionConfig::Protocol::ICE:
441 mouse_clamping_filter_.set_input_size(size); 441 mouse_clamping_filter_.set_input_size(size);
442 break; 442 break;
443 443
444 case protocol::SessionConfig::Protocol::WEBRTC: { 444 case protocol::SessionConfig::Protocol::WEBRTC: {
445 // When using WebRTC protocol the client sends mouse coordinates in DIPs, 445 // When using WebRTC protocol the client sends mouse coordinates in DIPs,
(...skipping 20 matching lines...) Expand all
466 connection_->client_stub()->SetVideoLayout(layout); 466 connection_->client_stub()->SetVideoLayout(layout);
467 } else { 467 } else {
468 pending_video_layout_message_.reset(new protocol::VideoLayout(layout)); 468 pending_video_layout_message_.reset(new protocol::VideoLayout(layout));
469 } 469 }
470 break; 470 break;
471 } 471 }
472 } 472 }
473 } 473 }
474 474
475 } // namespace remoting 475 } // namespace remoting
OLDNEW
« no previous file with comments | « remoting/host/client_session.h ('k') | remoting/host/continue_window.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698