Chromium Code Reviews| Index: remoting/host/desktop_session_proxy.cc |
| diff --git a/remoting/host/desktop_session_proxy.cc b/remoting/host/desktop_session_proxy.cc |
| index 04add543b748fba7e1da31d563d1047bf6a6d829..9e1bd5dd838a11b8447f3e8b82220eb38f1daff6 100644 |
| --- a/remoting/host/desktop_session_proxy.cc |
| +++ b/remoting/host/desktop_session_proxy.cc |
| @@ -28,6 +28,8 @@ |
| #include "base/win/scoped_handle.h" |
| #endif // defined(OS_WIN) |
| +const char kSendInitialResolution[] = "sendInitialResolution"; |
| + |
| namespace remoting { |
| DesktopSessionProxy::DesktopSessionProxy( |
| @@ -35,14 +37,19 @@ DesktopSessionProxy::DesktopSessionProxy( |
| scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, |
| scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, |
| scoped_refptr<base::SingleThreadTaskRunner> video_capture_task_runner, |
| - base::WeakPtr<ClientSessionControl> client_session_control) |
| + base::WeakPtr<ClientSessionControl> client_session_control, |
| + base::WeakPtr<DesktopSessionConnector> desktop_session_connector, |
| + bool virtual_terminal) |
| : audio_capture_task_runner_(audio_capture_task_runner), |
| caller_task_runner_(caller_task_runner), |
| io_task_runner_(io_task_runner), |
| video_capture_task_runner_(video_capture_task_runner), |
| client_session_control_(client_session_control), |
| + desktop_session_connector_(desktop_session_connector), |
| desktop_process_(base::kNullProcessHandle), |
| - pending_capture_frame_requests_(0) { |
| + pending_capture_frame_requests_(0), |
| + is_desktop_session_created_(false), |
| + virtual_terminal_(virtual_terminal) { |
| DCHECK(caller_task_runner_->BelongsToCurrentThread()); |
| } |
| @@ -70,6 +77,33 @@ scoped_ptr<media::ScreenCapturer> DesktopSessionProxy::CreateVideoCapturer() { |
| return scoped_ptr<media::ScreenCapturer>(new IpcVideoFrameCapturer(this)); |
| } |
| +Capabilities DesktopSessionProxy::GetCapabilities() const { |
| + // Ask the client to send it's resolution unconditionally. |
| + return virtual_terminal_ ? Capabilities(kSendInitialResolution) : |
| + Capabilities(); |
| +} |
| + |
| +void DesktopSessionProxy::SetCapabilities(const Capabilities& capabilities) { |
| + // Delay creation of the desktop session until the client screen resolution is |
| + // received if the desktop session requires the initial screen resolution |
| + // (when |virtual_terminal_| is true) and the client is expected to |
| + // sent its screen resolution (the 'sendInitialResolution' capability is |
| + // supported). |
| + if (virtual_terminal_ && capabilities.HasCapability(kSendInitialResolution)) { |
| + VLOG(1) << "Waiting for the client screen resolution."; |
| + return; |
| + } |
| + |
| + // Create the desktop session. |
| + if (!is_desktop_session_created_) { |
| + is_desktop_session_created_ = true; |
|
Sergey Ulanov
2013/04/16 08:38:53
is_desktop_session_connected_?
alexeypa (please no reviews)
2013/04/16 22:06:11
Done.
|
| + if (desktop_session_connector_) { |
| + desktop_session_connector_->ConnectTerminal(this, screen_resolution_, |
| + virtual_terminal_); |
| + } |
| + } |
| +} |
| + |
| bool DesktopSessionProxy::OnMessageReceived(const IPC::Message& message) { |
| DCHECK(caller_task_runner_->BelongsToCurrentThread()); |
| @@ -288,36 +322,35 @@ void DesktopSessionProxy::SetScreenResolution( |
| const ScreenResolution& resolution) { |
| DCHECK(caller_task_runner_->BelongsToCurrentThread()); |
| + if (!resolution.IsValid()) |
| + return; |
| + |
| screen_resolution_ = resolution; |
| - if (!screen_resolution_.IsValid()) |
| + |
| + // Create the desktop session if it is not created yet. |
| + if (!is_desktop_session_created_) { |
| + is_desktop_session_created_ = true; |
| + if (desktop_session_connector_) { |
| + desktop_session_connector_->ConnectTerminal(this, screen_resolution_, |
| + virtual_terminal_); |
| + } |
| return; |
| + } |
| // Pass the client's resolution to both daemon and desktop session agent. |
| - // Depending on the session kind the screen resolution ccan be set by either |
| + // Depending on the session kind the screen resolution can be set by either |
| // the daemon (for example RDP sessions on Windows) or by the desktop session |
| // agent (when sharing the physical console). |
| if (desktop_session_connector_) |
| - desktop_session_connector_->SetScreenResolution(this, resolution); |
| + desktop_session_connector_->SetScreenResolution(this, screen_resolution_); |
| SendToDesktop( |
| - new ChromotingNetworkDesktopMsg_SetScreenResolution(resolution)); |
| -} |
| - |
| -void DesktopSessionProxy::ConnectToDesktopSession( |
| - base::WeakPtr<DesktopSessionConnector> desktop_session_connector, |
| - bool virtual_terminal) { |
| - DCHECK(caller_task_runner_->BelongsToCurrentThread()); |
| - DCHECK(!desktop_session_connector_); |
| - DCHECK(desktop_session_connector); |
| - |
| - desktop_session_connector_ = desktop_session_connector; |
| - desktop_session_connector_->ConnectTerminal( |
| - this, ScreenResolution(), virtual_terminal); |
| + new ChromotingNetworkDesktopMsg_SetScreenResolution(screen_resolution_)); |
| } |
| DesktopSessionProxy::~DesktopSessionProxy() { |
| DCHECK(caller_task_runner_->BelongsToCurrentThread()); |
| - if (desktop_session_connector_) |
| + if (desktop_session_connector_ && is_desktop_session_created_) |
| desktop_session_connector_->DisconnectTerminal(this); |
| if (desktop_process_ != base::kNullProcessHandle) { |