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

Side by Side Diff: remoting/ios/bridge/client_instance.cc

Issue 384523003: Cleanups in ChromotingClient (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 5 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
« no previous file with comments | « remoting/ios/bridge/client_instance.h ('k') | remoting/protocol/connection_to_host.h » ('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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/ios/bridge/client_instance.h" 5 #include "remoting/ios/bridge/client_instance.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/synchronization/waitable_event.h" 9 #include "base/synchronization/waitable_event.h"
10 #include "net/socket/client_socket_factory.h" 10 #include "net/socket/client_socket_factory.h"
11 #include "remoting/base/url_request_context_getter.h" 11 #include "remoting/base/url_request_context_getter.h"
12 #include "remoting/client/audio_player.h" 12 #include "remoting/client/audio_player.h"
13 #include "remoting/client/plugin/delegating_signal_strategy.h" 13 #include "remoting/client/plugin/delegating_signal_strategy.h"
14 #include "remoting/ios/bridge/client_proxy.h" 14 #include "remoting/ios/bridge/client_proxy.h"
15 #include "remoting/jingle_glue/chromium_port_allocator.h" 15 #include "remoting/jingle_glue/chromium_port_allocator.h"
16 #include "remoting/protocol/host_stub.h" 16 #include "remoting/protocol/host_stub.h"
17 #include "remoting/protocol/libjingle_transport_factory.h" 17 #include "remoting/protocol/libjingle_transport_factory.h"
18 #include "remoting/protocol/negotiating_client_authenticator.h"
18 19
19 namespace { 20 namespace {
20 const char* const kXmppServer = "talk.google.com"; 21 const char* const kXmppServer = "talk.google.com";
21 const int kXmppPort = 5222; 22 const int kXmppPort = 5222;
22 const bool kXmppUseTls = true; 23 const bool kXmppUseTls = true;
23 24
24 void DoNothing() {} 25 void DoNothing() {}
25 } // namespace 26 } // namespace
26 27
27 namespace remoting { 28 namespace remoting {
28 29
29 ClientInstance::ClientInstance(const base::WeakPtr<ClientProxy>& proxy, 30 ClientInstance::ClientInstance(const base::WeakPtr<ClientProxy>& proxy,
30 const std::string& username, 31 const std::string& username,
31 const std::string& auth_token, 32 const std::string& auth_token,
32 const std::string& host_jid, 33 const std::string& host_jid,
33 const std::string& host_id, 34 const std::string& host_id,
34 const std::string& host_pubkey, 35 const std::string& host_pubkey,
35 const std::string& pairing_id, 36 const std::string& pairing_id,
36 const std::string& pairing_secret) 37 const std::string& pairing_secret)
37 : proxyToClient_(proxy), host_id_(host_id), create_pairing_(false) { 38 : proxyToClient_(proxy),
38 39 host_id_(host_id),
40 host_jid_(host_jid),
41 create_pairing_(false) {
39 if (!base::MessageLoop::current()) { 42 if (!base::MessageLoop::current()) {
40 VLOG(1) << "Starting main message loop"; 43 VLOG(1) << "Starting main message loop";
41 ui_loop_ = new base::MessageLoopForUI(); 44 ui_loop_ = new base::MessageLoopForUI();
42 ui_loop_->Attach(); 45 ui_loop_->Attach();
43 } else { 46 } else {
44 VLOG(1) << "Using existing main message loop"; 47 VLOG(1) << "Using existing main message loop";
45 ui_loop_ = base::MessageLoopForUI::current(); 48 ui_loop_ = base::MessageLoopForUI::current();
46 } 49 }
47 50
48 VLOG(1) << "Spawning additional threads"; 51 VLOG(1) << "Spawning additional threads";
(...skipping 15 matching lines...) Expand all
64 DCHECK(ui_task_runner_->BelongsToCurrentThread()); 67 DCHECK(ui_task_runner_->BelongsToCurrentThread());
65 68
66 // Initialize XMPP config. 69 // Initialize XMPP config.
67 xmpp_config_.host = kXmppServer; 70 xmpp_config_.host = kXmppServer;
68 xmpp_config_.port = kXmppPort; 71 xmpp_config_.port = kXmppPort;
69 xmpp_config_.use_tls = kXmppUseTls; 72 xmpp_config_.use_tls = kXmppUseTls;
70 xmpp_config_.username = username; 73 xmpp_config_.username = username;
71 xmpp_config_.auth_token = auth_token; 74 xmpp_config_.auth_token = auth_token;
72 xmpp_config_.auth_service = "oauth2"; 75 xmpp_config_.auth_service = "oauth2";
73 76
74 // Initialize ClientConfig. 77 // Initialize |authenticator_|.
75 client_config_.host_jid = host_jid; 78 scoped_ptr<protocol::ThirdPartyClientAuthenticator::TokenFetcher>
76 client_config_.host_public_key = host_pubkey; 79 token_fetcher(new TokenFetcherProxy(
77 client_config_.authentication_tag = host_id_; 80 base::Bind(&ChromotingJniInstance::FetchThirdPartyToken,
78 client_config_.client_pairing_id = pairing_id; 81 weak_factory_.GetWeakPtr()),
79 client_config_.client_paired_secret = pairing_secret; 82 host_pubkey));
80 client_config_.authentication_methods.push_back( 83
81 protocol::AuthenticationMethod::FromString("spake2_pair")); 84 std::vector<protocol::AuthenticationMethod> auth_methods;
82 client_config_.authentication_methods.push_back( 85 auth_methods.push_back(protocol::AuthenticationMethod::Spake2Pair());
83 protocol::AuthenticationMethod::FromString("spake2_hmac")); 86 auth_methods.push_back(protocol::AuthenticationMethod::Spake2(
84 client_config_.authentication_methods.push_back( 87 protocol::AuthenticationMethod::HMAC_SHA256));
85 protocol::AuthenticationMethod::FromString("spake2_plain")); 88 auth_methods.push_back(protocol::AuthenticationMethod::Spake2(
89 protocol::AuthenticationMethod::NONE));
90
91 authenticator_.reset(new protocol::NegotiatingClientAuthenticator(
92 pairing_id, pairing_secret, host_id_,
93 base::Bind(&ClientInstance::FetchSecret, this),
94 token_fetcher.Pass(), auth_methods));
86 } 95 }
87 96
88 ClientInstance::~ClientInstance() {} 97 ClientInstance::~ClientInstance() {}
89 98
90 void ClientInstance::Start() { 99 void ClientInstance::Start() {
91 DCHECK(ui_task_runner_->BelongsToCurrentThread()); 100 DCHECK(ui_task_runner_->BelongsToCurrentThread());
92 101
93 // Creates a reference to |this|, so don't want to bind during constructor
94 client_config_.fetch_secret_callback =
95 base::Bind(&ClientInstance::FetchSecret, this);
96
97 view_.reset(new FrameConsumerBridge( 102 view_.reset(new FrameConsumerBridge(
98 base::Bind(&ClientProxy::RedrawCanvas, proxyToClient_))); 103 base::Bind(&ClientProxy::RedrawCanvas, proxyToClient_)));
99 104
100 // |consumer_proxy| must be created on the UI thread to proxy calls from the 105 // |consumer_proxy| must be created on the UI thread to proxy calls from the
101 // network or decode thread to the UI thread, but ownership will belong to a 106 // network or decode thread to the UI thread, but ownership will belong to a
102 // SoftwareVideoRenderer which runs on the network thread. 107 // SoftwareVideoRenderer which runs on the network thread.
103 scoped_refptr<FrameConsumerProxy> consumer_proxy = 108 scoped_refptr<FrameConsumerProxy> consumer_proxy =
104 new FrameConsumerProxy(ui_task_runner_, view_->AsWeakPtr()); 109 new FrameConsumerProxy(ui_task_runner_, view_->AsWeakPtr());
105 110
106 // Post a task to start connection 111 // Post a task to start connection
107 base::WaitableEvent done_event(true, false); 112 base::WaitableEvent done_event(true, false);
108 network_task_runner_->PostTask( 113 network_task_runner_->PostTask(
109 FROM_HERE, 114 FROM_HERE,
110 base::Bind(&ClientInstance::ConnectToHostOnNetworkThread, 115 base::Bind(&ClientInstance::ConnectToHostOnNetworkThread,
111 this, 116 this,
112 consumer_proxy, 117 consumer_proxy,
113 base::Bind(&base::WaitableEvent::Signal, 118 base::Bind(&base::WaitableEvent::Signal,
114 base::Unretained(&done_event)))); 119 base::Unretained(&done_event))));
115 // Wait until initialization completes before continuing 120 // Wait until initialization completes before continuing
116 done_event.Wait(); 121 done_event.Wait();
117 } 122 }
118 123
119 void ClientInstance::Cleanup() { 124 void ClientInstance::Cleanup() {
120 DCHECK(ui_task_runner_->BelongsToCurrentThread()); 125 DCHECK(ui_task_runner_->BelongsToCurrentThread());
121 126
122 client_config_.fetch_secret_callback.Reset(); // Release ref to this
123 // |view_| must be destroyed on the UI thread before the producer is gone. 127 // |view_| must be destroyed on the UI thread before the producer is gone.
124 view_.reset(); 128 view_.reset();
125 129
126 base::WaitableEvent done_event(true, false); 130 base::WaitableEvent done_event(true, false);
127 network_task_runner_->PostTask( 131 network_task_runner_->PostTask(
128 FROM_HERE, 132 FROM_HERE,
129 base::Bind(&ClientInstance::DisconnectFromHostOnNetworkThread, 133 base::Bind(&ClientInstance::DisconnectFromHostOnNetworkThread,
130 this, 134 this,
131 base::Bind(&base::WaitableEvent::Signal, 135 base::Bind(&base::WaitableEvent::Signal,
132 base::Unretained(&done_event)))); 136 base::Unretained(&done_event))));
133 // Wait until we are fully disconnected before continuing 137 // Wait until we are fully disconnected before continuing
134 done_event.Wait(); 138 done_event.Wait();
135 } 139 }
136 140
137 // HOST attempts to continue automatically with previously supplied credentials, 141 // HOST attempts to continue automatically with previously supplied credentials,
138 // if it can't it requests the user's PIN. 142 // if it can't it requests the user's PIN.
139 void ClientInstance::FetchSecret( 143 void ClientInstance::FetchSecret(
140 bool pairable, 144 bool pairable,
141 const protocol::SecretFetchedCallback& callback) { 145 const protocol::SecretFetchedCallback& callback) {
142 if (!ui_task_runner_->BelongsToCurrentThread()) { 146 if (!ui_task_runner_->BelongsToCurrentThread()) {
143 ui_task_runner_->PostTask( 147 ui_task_runner_->PostTask(
144 FROM_HERE, 148 FROM_HERE,
145 base::Bind(&ClientInstance::FetchSecret, this, pairable, callback)); 149 base::Bind(&ClientInstance::FetchSecret, this, pairable, callback));
146 return; 150 return;
147 } 151 }
148 152
149 pin_callback_ = callback; 153 pin_callback_ = callback;
150 154
151 if (proxyToClient_) { 155 if (proxyToClient_) {
152 if (!client_config_.client_pairing_id.empty()) { 156 // Delete pairing credentials if they exist.
153 // We attempted to connect using an existing pairing that was rejected. 157 proxyToClient_->CommitPairingCredentials(host_id_, "", "");
154 // Unless we forget about the stale credentials, we'll continue trying
155 // them.
156 VLOG(1) << "Deleting rejected pairing credentials";
157 158
158 proxyToClient_->CommitPairingCredentials(host_id_, "", "");
159 }
160 proxyToClient_->DisplayAuthenticationPrompt(pairable); 159 proxyToClient_->DisplayAuthenticationPrompt(pairable);
161 } 160 }
162 } 161 }
163 162
164 void ClientInstance::ProvideSecret(const std::string& pin, 163 void ClientInstance::ProvideSecret(const std::string& pin,
165 bool create_pairing) { 164 bool create_pairing) {
166 DCHECK(ui_task_runner_->BelongsToCurrentThread()); 165 DCHECK(ui_task_runner_->BelongsToCurrentThread());
167 create_pairing_ = create_pairing; 166 create_pairing_ = create_pairing;
168 167
169 // Before this function can complete, FetchSecret must be called 168 // Before this function can complete, FetchSecret must be called
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 221
223 protocol::MouseEvent action; 222 protocol::MouseEvent action;
224 action.set_x(position.x()); 223 action.set_x(position.x());
225 action.set_y(position.y()); 224 action.set_y(position.y());
226 action.set_wheel_delta_x(wheel_delta.x()); 225 action.set_wheel_delta_x(wheel_delta.x());
227 action.set_wheel_delta_y(wheel_delta.y()); 226 action.set_wheel_delta_y(wheel_delta.y());
228 action.set_button(mButton); 227 action.set_button(mButton);
229 if (mButton != protocol::MouseEvent::BUTTON_UNDEFINED) 228 if (mButton != protocol::MouseEvent::BUTTON_UNDEFINED)
230 action.set_button_down(button_down); 229 action.set_button_down(button_down);
231 230
232 connection_->input_stub()->InjectMouseEvent(action); 231 client_->input_stub()->InjectMouseEvent(action);
233 } 232 }
234 233
235 void ClientInstance::PerformKeyboardAction(int key_code, bool key_down) { 234 void ClientInstance::PerformKeyboardAction(int key_code, bool key_down) {
236 if (!network_task_runner_->BelongsToCurrentThread()) { 235 if (!network_task_runner_->BelongsToCurrentThread()) {
237 network_task_runner_->PostTask( 236 network_task_runner_->PostTask(
238 FROM_HERE, 237 FROM_HERE,
239 base::Bind( 238 base::Bind(
240 &ClientInstance::PerformKeyboardAction, this, key_code, key_down)); 239 &ClientInstance::PerformKeyboardAction, this, key_code, key_down));
241 return; 240 return;
242 } 241 }
243 242
244 protocol::KeyEvent action; 243 protocol::KeyEvent action;
245 action.set_usb_keycode(key_code); 244 action.set_usb_keycode(key_code);
246 action.set_pressed(key_down); 245 action.set_pressed(key_down);
247 connection_->input_stub()->InjectKeyEvent(action); 246 client_->input_stub()->InjectKeyEvent(action);
248 } 247 }
249 248
250 void ClientInstance::OnConnectionState(protocol::ConnectionToHost::State state, 249 void ClientInstance::OnConnectionState(protocol::ConnectionToHost::State state,
251 protocol::ErrorCode error) { 250 protocol::ErrorCode error) {
252 if (!ui_task_runner_->BelongsToCurrentThread()) { 251 if (!ui_task_runner_->BelongsToCurrentThread()) {
253 ui_task_runner_->PostTask( 252 ui_task_runner_->PostTask(
254 FROM_HERE, 253 FROM_HERE,
255 base::Bind(&ClientInstance::OnConnectionState, this, state, error)); 254 base::Bind(&ClientInstance::OnConnectionState, this, state, error));
256 return; 255 return;
257 } 256 }
258 257
259 // TODO (aboone) This functionality is not scheduled for QA yet. 258 // TODO (aboone) This functionality is not scheduled for QA yet.
260 // if (create_pairing_ && state == protocol::ConnectionToHost::CONNECTED) { 259 // if (create_pairing_ && state == protocol::ConnectionToHost::CONNECTED) {
261 // VLOG(1) << "Attempting to pair with host"; 260 // VLOG(1) << "Attempting to pair with host";
262 // protocol::PairingRequest request; 261 // protocol::PairingRequest request;
263 // request.set_client_name("iOS"); 262 // request.set_client_name("iOS");
264 // connection_->host_stub()->RequestPairing(request); 263 // client_->host_stub()->RequestPairing(request);
265 // } 264 // }
266 265
267 if (proxyToClient_) 266 if (proxyToClient_)
268 proxyToClient_->ReportConnectionStatus(state, error); 267 proxyToClient_->ReportConnectionStatus(state, error);
269 } 268 }
270 269
271 void ClientInstance::OnConnectionReady(bool ready) { 270 void ClientInstance::OnConnectionReady(bool ready) {
272 // We ignore this message, since OnConnectionState tells us the same thing. 271 // We ignore this message, since OnConnectionState tells us the same thing.
273 } 272 }
274 273
275 void ClientInstance::OnRouteChanged(const std::string& channel_name, 274 void ClientInstance::OnRouteChanged(const std::string& channel_name,
276 const protocol::TransportRoute& route) { 275 const protocol::TransportRoute& route) {
277 VLOG(1) << "Using " << protocol::TransportRoute::GetTypeString(route.type) 276 VLOG(1) << "Using " << protocol::TransportRoute::GetTypeString(route.type)
278 << " connection for " << channel_name << " channel"; 277 << " connection for " << channel_name << " channel";
279 } 278 }
280 279
281 void ClientInstance::SetCapabilities(const std::string& capabilities) { 280 void ClientInstance::SetCapabilities(const std::string& capabilities) {
282 DCHECK(video_renderer_);
283 DCHECK(connection_);
284 DCHECK(connection_->state() == protocol::ConnectionToHost::CONNECTED);
285 video_renderer_->Initialize(connection_->config());
286 } 281 }
287 282
288 void ClientInstance::SetPairingResponse( 283 void ClientInstance::SetPairingResponse(
289 const protocol::PairingResponse& response) { 284 const protocol::PairingResponse& response) {
290 if (!ui_task_runner_->BelongsToCurrentThread()) { 285 if (!ui_task_runner_->BelongsToCurrentThread()) {
291 ui_task_runner_->PostTask( 286 ui_task_runner_->PostTask(
292 FROM_HERE, 287 FROM_HERE,
293 base::Bind(&ClientInstance::SetPairingResponse, this, response)); 288 base::Bind(&ClientInstance::SetPairingResponse, this, response));
294 return; 289 return;
295 } 290 }
296 291
297 VLOG(1) << "Successfully established pairing with host"; 292 VLOG(1) << "Successfully established pairing with host";
298 293
299 if (proxyToClient_) 294 if (proxyToClient_)
300 proxyToClient_->CommitPairingCredentials( 295 proxyToClient_->CommitPairingCredentials(
301 host_id_, response.client_id(), response.shared_secret()); 296 host_id_, response.client_id(), response.shared_secret());
302 } 297 }
303 298
304 void ClientInstance::DeliverHostMessage( 299 void ClientInstance::DeliverHostMessage(
305 const protocol::ExtensionMessage& message) { 300 const protocol::ExtensionMessage& message) {
306 NOTIMPLEMENTED(); 301 NOTIMPLEMENTED();
307 } 302 }
308 303
309 // Returning interface of protocol::ClipboardStub 304 // Returning interface of protocol::ClipboardStub
310 protocol::ClipboardStub* ClientInstance::GetClipboardStub() { return this; } 305 protocol::ClipboardStub* ClientInstance::GetClipboardStub() { return this; }
311 306
312 // Returning interface of protocol::CursorShapeStub 307 // Returning interface of protocol::CursorShapeStub
313 protocol::CursorShapeStub* ClientInstance::GetCursorShapeStub() { return this; } 308 protocol::CursorShapeStub* ClientInstance::GetCursorShapeStub() { return this; }
314 309
315 scoped_ptr<protocol::ThirdPartyClientAuthenticator::TokenFetcher>
316 ClientInstance::GetTokenFetcher(const std::string& host_public_key) {
317 // Returns null when third-party authentication is unsupported.
318 return scoped_ptr<protocol::ThirdPartyClientAuthenticator::TokenFetcher>();
319 }
320
321 void ClientInstance::InjectClipboardEvent( 310 void ClientInstance::InjectClipboardEvent(
322 const protocol::ClipboardEvent& event) { 311 const protocol::ClipboardEvent& event) {
323 NOTIMPLEMENTED(); 312 NOTIMPLEMENTED();
324 } 313 }
325 314
326 void ClientInstance::SetCursorShape(const protocol::CursorShapeInfo& shape) { 315 void ClientInstance::SetCursorShape(const protocol::CursorShapeInfo& shape) {
327 if (!ui_task_runner_->BelongsToCurrentThread()) { 316 if (!ui_task_runner_->BelongsToCurrentThread()) {
328 ui_task_runner_->PostTask( 317 ui_task_runner_->PostTask(
329 FROM_HERE, base::Bind(&ClientInstance::SetCursorShape, this, shape)); 318 FROM_HERE, base::Bind(&ClientInstance::SetCursorShape, this, shape));
330 return; 319 return;
331 } 320 }
332 if (proxyToClient_) 321 if (proxyToClient_)
333 proxyToClient_->UpdateCursorShape(shape); 322 proxyToClient_->UpdateCursorShape(shape);
334 } 323 }
335 324
336 void ClientInstance::ConnectToHostOnNetworkThread( 325 void ClientInstance::ConnectToHostOnNetworkThread(
337 scoped_refptr<FrameConsumerProxy> consumer_proxy, 326 scoped_refptr<FrameConsumerProxy> consumer_proxy,
338 const base::Closure& done) { 327 const base::Closure& done) {
339 DCHECK(network_task_runner_->BelongsToCurrentThread()); 328 DCHECK(network_task_runner_->BelongsToCurrentThread());
340 329
341 client_context_->Start(); 330 client_context_->Start();
342 331
343 video_renderer_.reset( 332 video_renderer_.reset(
344 new SoftwareVideoRenderer(client_context_->main_task_runner(), 333 new SoftwareVideoRenderer(client_context_->main_task_runner(),
345 client_context_->decode_task_runner(), 334 client_context_->decode_task_runner(),
346 consumer_proxy)); 335 consumer_proxy));
347 336
348 view_->Initialize(video_renderer_.get()); 337 view_->Initialize(video_renderer_.get());
349 338
350 connection_.reset(new protocol::ConnectionToHost(true)); 339 client_.reset(new ChromotingClient(client_context_.get(),
351
352 client_.reset(new ChromotingClient(client_config_,
353 client_context_.get(),
354 connection_.get(),
355 this, 340 this,
356 video_renderer_.get(), 341 video_renderer_.get(),
357 scoped_ptr<AudioPlayer>())); 342 scoped_ptr<AudioPlayer>()));
358 343
359 signaling_.reset( 344 signaling_.reset(
360 new XmppSignalStrategy(net::ClientSocketFactory::GetDefaultFactory(), 345 new XmppSignalStrategy(net::ClientSocketFactory::GetDefaultFactory(),
361 url_requester_, 346 url_requester_,
362 xmpp_config_)); 347 xmpp_config_));
363 348
364 NetworkSettings network_settings(NetworkSettings::NAT_TRAVERSAL_ENABLED); 349 NetworkSettings network_settings(NetworkSettings::NAT_TRAVERSAL_ENABLED);
365 350
366 scoped_ptr<ChromiumPortAllocator> port_allocator( 351 scoped_ptr<ChromiumPortAllocator> port_allocator(
367 ChromiumPortAllocator::Create(url_requester_, network_settings)); 352 ChromiumPortAllocator::Create(url_requester_, network_settings));
368 353
369 scoped_ptr<protocol::TransportFactory> transport_factory( 354 scoped_ptr<protocol::TransportFactory> transport_factory(
370 new protocol::LibjingleTransportFactory( 355 new protocol::LibjingleTransportFactory(
371 signaling_.get(), 356 signaling_.get(),
372 port_allocator.PassAs<cricket::HttpPortAllocatorBase>(), 357 port_allocator.PassAs<cricket::HttpPortAllocatorBase>(),
373 network_settings)); 358 network_settings));
374 359
375 client_->Start(signaling_.get(), transport_factory.Pass()); 360 client_->Start(signaling_.get(), authenticator_.Pass(),
361 transport_factory.Pass(), host_jid_, std::string());
376 362
377 if (!done.is_null()) 363 if (!done.is_null())
378 done.Run(); 364 done.Run();
379 } 365 }
380 366
381 void ClientInstance::DisconnectFromHostOnNetworkThread( 367 void ClientInstance::DisconnectFromHostOnNetworkThread(
382 const base::Closure& done) { 368 const base::Closure& done) {
383 DCHECK(network_task_runner_->BelongsToCurrentThread()); 369 DCHECK(network_task_runner_->BelongsToCurrentThread());
384 370
385 host_id_.clear(); 371 host_id_.clear();
386 372
387 // |client_| must be torn down before |signaling_|. 373 // |client_| must be torn down before |signaling_|.
388 connection_.reset();
389 client_.reset(); 374 client_.reset();
390 signaling_.reset(); 375 signaling_.reset();
391 video_renderer_.reset(); 376 video_renderer_.reset();
392 client_context_->Stop(); 377 client_context_->Stop();
393 if (!done.is_null()) 378 if (!done.is_null())
394 done.Run(); 379 done.Run();
395 } 380 }
396 381
397 } // namespace remoting 382 } // namespace remoting
OLDNEW
« no previous file with comments | « remoting/ios/bridge/client_instance.h ('k') | remoting/protocol/connection_to_host.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698