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

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

Issue 12096071: Adding a unit test to verify the IPC channel between the network and desktop processes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 10 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 | Annotate | Revision Log
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/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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698