| 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/desktop_session_agent.h" | 5 #include "remoting/host/desktop_session_agent.h" | 
| 6 | 6 | 
|  | 7 #include "base/file_util.h" | 
| 7 #include "base/logging.h" | 8 #include "base/logging.h" | 
| 8 #include "ipc/ipc_channel_proxy.h" | 9 #include "ipc/ipc_channel_proxy.h" | 
| 9 #include "ipc/ipc_message.h" | 10 #include "ipc/ipc_message.h" | 
| 10 #include "ipc/ipc_message_macros.h" | 11 #include "ipc/ipc_message_macros.h" | 
| 11 #include "media/video/capture/screen/screen_capture_data.h" | 12 #include "media/video/capture/screen/screen_capture_data.h" | 
| 12 #include "remoting/base/auto_thread_task_runner.h" | 13 #include "remoting/base/auto_thread_task_runner.h" | 
| 13 #include "remoting/base/constants.h" | 14 #include "remoting/base/constants.h" | 
| 14 #include "remoting/base/util.h" | 15 #include "remoting/base/util.h" | 
| 15 #include "remoting/host/audio_capturer.h" | 16 #include "remoting/host/audio_capturer.h" | 
| 16 #include "remoting/host/chromoting_messages.h" | 17 #include "remoting/host/chromoting_messages.h" | 
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 68 }  // namespace | 69 }  // namespace | 
| 69 | 70 | 
| 70 DesktopSessionAgent::Delegate::~Delegate() { | 71 DesktopSessionAgent::Delegate::~Delegate() { | 
| 71 } | 72 } | 
| 72 | 73 | 
| 73 DesktopSessionAgent::~DesktopSessionAgent() { | 74 DesktopSessionAgent::~DesktopSessionAgent() { | 
| 74   DCHECK(!audio_capturer_); | 75   DCHECK(!audio_capturer_); | 
| 75   DCHECK(!disconnect_window_); | 76   DCHECK(!disconnect_window_); | 
| 76   DCHECK(!local_input_monitor_); | 77   DCHECK(!local_input_monitor_); | 
| 77   DCHECK(!network_channel_); | 78   DCHECK(!network_channel_); | 
|  | 79   DCHECK_EQ(desktop_pipe_, IPC::InvalidPlatformFileForTransit()); | 
| 78   DCHECK(!video_capturer_); | 80   DCHECK(!video_capturer_); | 
| 79 } | 81 } | 
| 80 | 82 | 
| 81 bool DesktopSessionAgent::OnMessageReceived(const IPC::Message& message) { | 83 bool DesktopSessionAgent::OnMessageReceived(const IPC::Message& message) { | 
| 82   DCHECK(caller_task_runner()->BelongsToCurrentThread()); | 84   DCHECK(caller_task_runner()->BelongsToCurrentThread()); | 
| 83 | 85 | 
| 84   bool handled = true; | 86   bool handled = true; | 
| 85   if (started_) { | 87   if (started_) { | 
| 86     IPC_BEGIN_MESSAGE_MAP(DesktopSessionAgent, message) | 88     IPC_BEGIN_MESSAGE_MAP(DesktopSessionAgent, message) | 
| 87       IPC_MESSAGE_HANDLER(ChromotingNetworkDesktopMsg_CaptureFrame, | 89       IPC_MESSAGE_HANDLER(ChromotingNetworkDesktopMsg_CaptureFrame, | 
| (...skipping 24 matching lines...) Expand all  Loading... | 
| 112     OnChannelError(); | 114     OnChannelError(); | 
| 113   } | 115   } | 
| 114 | 116 | 
| 115   return handled; | 117   return handled; | 
| 116 } | 118 } | 
| 117 | 119 | 
| 118 void DesktopSessionAgent::OnChannelConnected(int32 peer_pid) { | 120 void DesktopSessionAgent::OnChannelConnected(int32 peer_pid) { | 
| 119   DCHECK(caller_task_runner()->BelongsToCurrentThread()); | 121   DCHECK(caller_task_runner()->BelongsToCurrentThread()); | 
| 120 | 122 | 
| 121   VLOG(1) << "IPC: desktop <- network (" << peer_pid << ")"; | 123   VLOG(1) << "IPC: desktop <- network (" << peer_pid << ")"; | 
|  | 124 | 
|  | 125   CloseDesktopPipeHandle(); | 
| 122 } | 126 } | 
| 123 | 127 | 
| 124 void DesktopSessionAgent::OnChannelError() { | 128 void DesktopSessionAgent::OnChannelError() { | 
| 125   DCHECK(caller_task_runner()->BelongsToCurrentThread()); | 129   DCHECK(caller_task_runner()->BelongsToCurrentThread()); | 
| 126 | 130 | 
| 127   // Make sure the channel is closed. | 131   // Make sure the channel is closed. | 
| 128   network_channel_.reset(); | 132   network_channel_.reset(); | 
|  | 133   CloseDesktopPipeHandle(); | 
| 129 | 134 | 
| 130   // Notify the caller that the channel has been disconnected. | 135   // Notify the caller that the channel has been disconnected. | 
| 131   if (delegate_.get()) | 136   if (delegate_.get()) | 
| 132     delegate_->OnNetworkProcessDisconnected(); | 137     delegate_->OnNetworkProcessDisconnected(); | 
| 133 } | 138 } | 
| 134 | 139 | 
| 135 void DesktopSessionAgent::OnLocalMouseMoved(const SkIPoint& new_pos) { | 140 void DesktopSessionAgent::OnLocalMouseMoved(const SkIPoint& new_pos) { | 
| 136   DCHECK(caller_task_runner()->BelongsToCurrentThread()); | 141   DCHECK(caller_task_runner()->BelongsToCurrentThread()); | 
| 137 | 142 | 
| 138   remote_input_filter_->LocalMouseMoved(new_pos); | 143   remote_input_filter_->LocalMouseMoved(new_pos); | 
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 286 } | 291 } | 
| 287 | 292 | 
| 288 bool DesktopSessionAgent::Start(const base::WeakPtr<Delegate>& delegate, | 293 bool DesktopSessionAgent::Start(const base::WeakPtr<Delegate>& delegate, | 
| 289                                 IPC::PlatformFileForTransit* desktop_pipe_out) { | 294                                 IPC::PlatformFileForTransit* desktop_pipe_out) { | 
| 290   DCHECK(caller_task_runner()->BelongsToCurrentThread()); | 295   DCHECK(caller_task_runner()->BelongsToCurrentThread()); | 
| 291   DCHECK(delegate_.get() == NULL); | 296   DCHECK(delegate_.get() == NULL); | 
| 292 | 297 | 
| 293   delegate_ = delegate; | 298   delegate_ = delegate; | 
| 294 | 299 | 
| 295   // Create an IPC channel to communicate with the network process. | 300   // Create an IPC channel to communicate with the network process. | 
| 296   return CreateChannelForNetworkProcess(desktop_pipe_out, &network_channel_); | 301   bool result = CreateChannelForNetworkProcess(&desktop_pipe_, | 
|  | 302                                                &network_channel_); | 
|  | 303   *desktop_pipe_out = desktop_pipe_; | 
|  | 304   return result; | 
| 297 } | 305 } | 
| 298 | 306 | 
| 299 void DesktopSessionAgent::Stop() { | 307 void DesktopSessionAgent::Stop() { | 
| 300   DCHECK(caller_task_runner()->BelongsToCurrentThread()); | 308   DCHECK(caller_task_runner()->BelongsToCurrentThread()); | 
| 301 | 309 | 
| 302   delegate_.reset(); | 310   delegate_.reset(); | 
| 303 | 311 | 
| 304   // Make sure the channel is closed. | 312   // Make sure the channel is closed. | 
| 305   network_channel_.reset(); | 313   network_channel_.reset(); | 
| 306 | 314 | 
| (...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 521     scoped_refptr<AutoThreadTaskRunner> audio_capture_task_runner, | 529     scoped_refptr<AutoThreadTaskRunner> audio_capture_task_runner, | 
| 522     scoped_refptr<AutoThreadTaskRunner> caller_task_runner, | 530     scoped_refptr<AutoThreadTaskRunner> caller_task_runner, | 
| 523     scoped_refptr<AutoThreadTaskRunner> input_task_runner, | 531     scoped_refptr<AutoThreadTaskRunner> input_task_runner, | 
| 524     scoped_refptr<AutoThreadTaskRunner> io_task_runner, | 532     scoped_refptr<AutoThreadTaskRunner> io_task_runner, | 
| 525     scoped_refptr<AutoThreadTaskRunner> video_capture_task_runner) | 533     scoped_refptr<AutoThreadTaskRunner> video_capture_task_runner) | 
| 526     : audio_capture_task_runner_(audio_capture_task_runner), | 534     : audio_capture_task_runner_(audio_capture_task_runner), | 
| 527       caller_task_runner_(caller_task_runner), | 535       caller_task_runner_(caller_task_runner), | 
| 528       input_task_runner_(input_task_runner), | 536       input_task_runner_(input_task_runner), | 
| 529       io_task_runner_(io_task_runner), | 537       io_task_runner_(io_task_runner), | 
| 530       video_capture_task_runner_(video_capture_task_runner), | 538       video_capture_task_runner_(video_capture_task_runner), | 
|  | 539       desktop_pipe_(IPC::InvalidPlatformFileForTransit()), | 
| 531       current_size_(SkISize::Make(0, 0)), | 540       current_size_(SkISize::Make(0, 0)), | 
| 532       next_shared_buffer_id_(1), | 541       next_shared_buffer_id_(1), | 
| 533       started_(false) { | 542       started_(false) { | 
| 534   DCHECK(caller_task_runner_->BelongsToCurrentThread()); | 543   DCHECK(caller_task_runner_->BelongsToCurrentThread()); | 
| 535 } | 544 } | 
| 536 | 545 | 
|  | 546 void DesktopSessionAgent::CloseDesktopPipeHandle() { | 
|  | 547   DCHECK(caller_task_runner_->BelongsToCurrentThread()); | 
|  | 548 | 
|  | 549   if (desktop_pipe_ != IPC::InvalidPlatformFileForTransit()) { | 
|  | 550 #if defined(OS_WIN) | 
|  | 551     base::ClosePlatformFile(desktop_pipe_); | 
|  | 552 #elif defined(OS_POSIX) | 
|  | 553     base::ClosePlatformFile(desktop_pipe_.fd); | 
|  | 554 #else  // !defined(OS_POSIX) | 
|  | 555 #error Unsupported platform. | 
|  | 556 #endif  // !defined(OS_POSIX) | 
|  | 557 | 
|  | 558     desktop_pipe_ = IPC::InvalidPlatformFileForTransit(); | 
|  | 559   } | 
|  | 560 } | 
|  | 561 | 
| 537 }  // namespace remoting | 562 }  // namespace remoting | 
| OLD | NEW | 
|---|