| 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/ipc_desktop_environment.h" | 5 #include "remoting/host/ipc_desktop_environment.h" | 
| 6 | 6 | 
| 7 #include <utility> | 7 #include <utility> | 
| 8 | 8 | 
| 9 #include "base/callback.h" | 9 #include "base/callback.h" | 
| 10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" | 
| 11 #include "base/logging.h" | 11 #include "base/logging.h" | 
|  | 12 #include "base/process_util.h" | 
| 12 #include "base/single_thread_task_runner.h" | 13 #include "base/single_thread_task_runner.h" | 
| 13 #include "ipc/ipc_channel_proxy.h" | 14 #include "ipc/ipc_channel_proxy.h" | 
| 14 #include "media/video/capture/screen/screen_capturer.h" | 15 #include "media/video/capture/screen/screen_capturer.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" | 
| 17 #include "remoting/host/desktop_session_proxy.h" | 18 #include "remoting/host/desktop_session_proxy.h" | 
| 18 #include "remoting/host/event_executor.h" | 19 #include "remoting/host/event_executor.h" | 
| 19 | 20 | 
| 20 namespace remoting { | 21 namespace remoting { | 
| 21 | 22 | 
| 22 IpcDesktopEnvironment::IpcDesktopEnvironment( | 23 IpcDesktopEnvironment::IpcDesktopEnvironment( | 
| 23     scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, | 24     scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, | 
|  | 25     scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, | 
| 24     const std::string& client_jid, | 26     const std::string& client_jid, | 
| 25     const base::Closure& disconnect_callback, | 27     const base::Closure& disconnect_callback, | 
| 26     base::WeakPtr<DesktopSessionConnector> desktop_session_connector) | 28     base::WeakPtr<DesktopSessionConnector> desktop_session_connector) | 
| 27     : caller_task_runner_(caller_task_runner), | 29     : caller_task_runner_(caller_task_runner), | 
| 28       connected_(false), | 30       connected_(false), | 
| 29       desktop_session_connector_(desktop_session_connector), | 31       desktop_session_connector_(desktop_session_connector), | 
| 30       desktop_session_proxy_(new DesktopSessionProxy(caller_task_runner, | 32       desktop_session_proxy_(new DesktopSessionProxy(caller_task_runner, | 
|  | 33                                                      io_task_runner, | 
| 31                                                      client_jid, | 34                                                      client_jid, | 
| 32                                                      disconnect_callback)) { | 35                                                      disconnect_callback)) { | 
| 33   DCHECK(caller_task_runner_->BelongsToCurrentThread()); | 36   DCHECK(caller_task_runner_->BelongsToCurrentThread()); | 
| 34 } | 37 } | 
| 35 | 38 | 
| 36 IpcDesktopEnvironment::~IpcDesktopEnvironment() { | 39 IpcDesktopEnvironment::~IpcDesktopEnvironment() { | 
| 37   DCHECK(caller_task_runner_->BelongsToCurrentThread()); | 40   DCHECK(caller_task_runner_->BelongsToCurrentThread()); | 
| 38 | 41 | 
| 39   if (connected_ && desktop_session_connector_) | 42   if (connected_ && desktop_session_connector_) | 
| 40     desktop_session_connector_->DisconnectTerminal(desktop_session_proxy_); | 43     desktop_session_connector_->DisconnectTerminal(desktop_session_proxy_); | 
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 72   DCHECK(caller_task_runner_->BelongsToCurrentThread()); | 75   DCHECK(caller_task_runner_->BelongsToCurrentThread()); | 
| 73 | 76 | 
| 74   if (!connected_) { | 77   if (!connected_) { | 
| 75     connected_ = true; | 78     connected_ = true; | 
| 76     desktop_session_connector_->ConnectTerminal(desktop_session_proxy_); | 79     desktop_session_connector_->ConnectTerminal(desktop_session_proxy_); | 
| 77   } | 80   } | 
| 78 } | 81 } | 
| 79 | 82 | 
| 80 IpcDesktopEnvironmentFactory::IpcDesktopEnvironmentFactory( | 83 IpcDesktopEnvironmentFactory::IpcDesktopEnvironmentFactory( | 
| 81     scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, | 84     scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, | 
|  | 85     scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, | 
| 82     IPC::ChannelProxy* daemon_channel) | 86     IPC::ChannelProxy* daemon_channel) | 
| 83     : caller_task_runner_(caller_task_runner), | 87     : caller_task_runner_(caller_task_runner), | 
|  | 88       io_task_runner_(io_task_runner), | 
| 84       daemon_channel_(daemon_channel), | 89       daemon_channel_(daemon_channel), | 
| 85       connector_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), | 90       connector_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), | 
| 86       next_id_(0) { | 91       next_id_(0) { | 
| 87 } | 92 } | 
| 88 | 93 | 
| 89 IpcDesktopEnvironmentFactory::~IpcDesktopEnvironmentFactory() { | 94 IpcDesktopEnvironmentFactory::~IpcDesktopEnvironmentFactory() { | 
| 90   DCHECK(caller_task_runner_->BelongsToCurrentThread()); | 95   DCHECK(caller_task_runner_->BelongsToCurrentThread()); | 
| 91 } | 96 } | 
| 92 | 97 | 
| 93 scoped_ptr<DesktopEnvironment> IpcDesktopEnvironmentFactory::Create( | 98 scoped_ptr<DesktopEnvironment> IpcDesktopEnvironmentFactory::Create( | 
| 94     const std::string& client_jid, | 99     const std::string& client_jid, | 
| 95     const base::Closure& disconnect_callback) { | 100     const base::Closure& disconnect_callback) { | 
| 96   DCHECK(caller_task_runner_->BelongsToCurrentThread()); | 101   DCHECK(caller_task_runner_->BelongsToCurrentThread()); | 
| 97 | 102 | 
| 98   return scoped_ptr<DesktopEnvironment>(new IpcDesktopEnvironment( | 103   return scoped_ptr<DesktopEnvironment>(new IpcDesktopEnvironment( | 
| 99       caller_task_runner_, client_jid, disconnect_callback, | 104       caller_task_runner_, io_task_runner_, client_jid, disconnect_callback, | 
| 100       connector_factory_.GetWeakPtr())); | 105       connector_factory_.GetWeakPtr())); | 
| 101 } | 106 } | 
| 102 | 107 | 
| 103 bool IpcDesktopEnvironmentFactory::SupportsAudioCapture() const { | 108 bool IpcDesktopEnvironmentFactory::SupportsAudioCapture() const { | 
| 104   DCHECK(caller_task_runner_->BelongsToCurrentThread()); | 109   DCHECK(caller_task_runner_->BelongsToCurrentThread()); | 
| 105 | 110 | 
| 106   return AudioCapturer::IsSupported(); | 111   return AudioCapturer::IsSupported(); | 
| 107 } | 112 } | 
| 108 | 113 | 
| 109 void IpcDesktopEnvironmentFactory::ConnectTerminal( | 114 void IpcDesktopEnvironmentFactory::ConnectTerminal( | 
| (...skipping 23 matching lines...) Expand all  Loading... | 
| 133     int id = i->first; | 138     int id = i->first; | 
| 134     active_connections_.erase(i); | 139     active_connections_.erase(i); | 
| 135 | 140 | 
| 136     VLOG(1) << "Network: unregistered desktop environment " << id; | 141     VLOG(1) << "Network: unregistered desktop environment " << id; | 
| 137     daemon_channel_->Send(new ChromotingNetworkHostMsg_DisconnectTerminal(id)); | 142     daemon_channel_->Send(new ChromotingNetworkHostMsg_DisconnectTerminal(id)); | 
| 138   } | 143   } | 
| 139 } | 144 } | 
| 140 | 145 | 
| 141 void IpcDesktopEnvironmentFactory::OnDesktopSessionAgentAttached( | 146 void IpcDesktopEnvironmentFactory::OnDesktopSessionAgentAttached( | 
| 142     int terminal_id, | 147     int terminal_id, | 
| 143     IPC::PlatformFileForTransit desktop_process, | 148     base::ProcessHandle desktop_process, | 
| 144     IPC::PlatformFileForTransit desktop_pipe) { | 149     IPC::PlatformFileForTransit desktop_pipe) { | 
| 145   if (!caller_task_runner_->BelongsToCurrentThread()) { | 150   if (!caller_task_runner_->BelongsToCurrentThread()) { | 
| 146     caller_task_runner_->PostTask(FROM_HERE, base::Bind( | 151     caller_task_runner_->PostTask(FROM_HERE, base::Bind( | 
| 147         &IpcDesktopEnvironmentFactory::OnDesktopSessionAgentAttached, | 152         &IpcDesktopEnvironmentFactory::OnDesktopSessionAgentAttached, | 
| 148         base::Unretained(this), terminal_id, desktop_process, desktop_pipe)); | 153         base::Unretained(this), terminal_id, desktop_process, desktop_pipe)); | 
| 149     return; | 154     return; | 
| 150   } | 155   } | 
| 151 | 156 | 
| 152   ActiveConnectionsList::iterator i = active_connections_.find(terminal_id); | 157   ActiveConnectionsList::iterator i = active_connections_.find(terminal_id); | 
| 153   if (i != active_connections_.end()) { | 158   if (i != active_connections_.end()) { | 
| 154     i->second->DetachFromDesktop(); | 159     i->second->DetachFromDesktop(); | 
| 155     i->second->AttachToDesktop(desktop_process, desktop_pipe); | 160     i->second->AttachToDesktop(desktop_process, desktop_pipe); | 
| 156   } else { | 161   } else { | 
|  | 162     base::CloseProcessHandle(desktop_process); | 
|  | 163 | 
| 157 #if defined(OS_POSIX) | 164 #if defined(OS_POSIX) | 
| 158     DCHECK(desktop_process.auto_close); |  | 
| 159     DCHECK(desktop_pipe.auto_close); | 165     DCHECK(desktop_pipe.auto_close); | 
| 160 | 166 | 
| 161     base::ClosePlatformFile(desktop_process.fd); |  | 
| 162     base::ClosePlatformFile(desktop_pipe.fd); | 167     base::ClosePlatformFile(desktop_pipe.fd); | 
| 163 #elif defined(OS_WIN) | 168 #endif  // defined(OS_POSIX) | 
| 164     base::ClosePlatformFile(desktop_process); |  | 
| 165 #endif  // defined(OS_WIN) |  | 
| 166   } | 169   } | 
| 167 } | 170 } | 
| 168 | 171 | 
| 169 void IpcDesktopEnvironmentFactory::OnTerminalDisconnected(int terminal_id) { | 172 void IpcDesktopEnvironmentFactory::OnTerminalDisconnected(int terminal_id) { | 
| 170   if (!caller_task_runner_->BelongsToCurrentThread()) { | 173   if (!caller_task_runner_->BelongsToCurrentThread()) { | 
| 171     caller_task_runner_->PostTask(FROM_HERE, base::Bind( | 174     caller_task_runner_->PostTask(FROM_HERE, base::Bind( | 
| 172         &IpcDesktopEnvironmentFactory::OnTerminalDisconnected, | 175         &IpcDesktopEnvironmentFactory::OnTerminalDisconnected, | 
| 173         base::Unretained(this), terminal_id)); | 176         base::Unretained(this), terminal_id)); | 
| 174     return; | 177     return; | 
| 175   } | 178   } | 
| 176 | 179 | 
| 177   ActiveConnectionsList::iterator i = active_connections_.find(terminal_id); | 180   ActiveConnectionsList::iterator i = active_connections_.find(terminal_id); | 
| 178   if (i != active_connections_.end()) { | 181   if (i != active_connections_.end()) { | 
| 179     scoped_refptr<DesktopSessionProxy> desktop_session_proxy = i->second; | 182     scoped_refptr<DesktopSessionProxy> desktop_session_proxy = i->second; | 
| 180     active_connections_.erase(i); | 183     active_connections_.erase(i); | 
| 181 | 184 | 
| 182     // Disconnect the client session. | 185     // Disconnect the client session. | 
| 183     desktop_session_proxy->DisconnectSession(); | 186     desktop_session_proxy->DisconnectSession(); | 
| 184   } | 187   } | 
| 185 } | 188 } | 
| 186 | 189 | 
| 187 }  // namespace remoting | 190 }  // namespace remoting | 
| OLD | NEW | 
|---|