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

Side by Side Diff: remoting/client/jni/chromoting_jni_instance.cc

Issue 1288063004: Simplify FrameConsumer interface. Remove FrameProducer interface. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 4 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
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/client/jni/chromoting_jni_instance.h" 5 #include "remoting/client/jni/chromoting_jni_instance.h"
6 6
7 #include <android/log.h> 7 #include <android/log.h>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "jingle/glue/thread_wrapper.h" 11 #include "jingle/glue/thread_wrapper.h"
12 #include "net/socket/client_socket_factory.h" 12 #include "net/socket/client_socket_factory.h"
13 #include "remoting/base/service_urls.h" 13 #include "remoting/base/service_urls.h"
14 #include "remoting/client/audio_player.h" 14 #include "remoting/client/audio_player.h"
15 #include "remoting/client/client_status_logger.h" 15 #include "remoting/client/client_status_logger.h"
16 #include "remoting/client/jni/android_keymap.h" 16 #include "remoting/client/jni/android_keymap.h"
17 #include "remoting/client/jni/chromoting_jni_runtime.h" 17 #include "remoting/client/jni/chromoting_jni_runtime.h"
18 #include "remoting/client/jni/jni_frame_consumer.h"
18 #include "remoting/client/software_video_renderer.h" 19 #include "remoting/client/software_video_renderer.h"
19 #include "remoting/client/token_fetcher_proxy.h" 20 #include "remoting/client/token_fetcher_proxy.h"
20 #include "remoting/protocol/chromium_port_allocator.h" 21 #include "remoting/protocol/chromium_port_allocator.h"
21 #include "remoting/protocol/chromium_socket_factory.h" 22 #include "remoting/protocol/chromium_socket_factory.h"
22 #include "remoting/protocol/host_stub.h" 23 #include "remoting/protocol/host_stub.h"
23 #include "remoting/protocol/libjingle_transport_factory.h" 24 #include "remoting/protocol/libjingle_transport_factory.h"
24 #include "remoting/protocol/negotiating_client_authenticator.h" 25 #include "remoting/protocol/negotiating_client_authenticator.h"
25 #include "remoting/protocol/network_settings.h" 26 #include "remoting/protocol/network_settings.h"
26 #include "remoting/signaling/server_log_entry.h" 27 #include "remoting/signaling/server_log_entry.h"
27 28
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
78 auth_methods.push_back(protocol::AuthenticationMethod::Spake2( 79 auth_methods.push_back(protocol::AuthenticationMethod::Spake2(
79 protocol::AuthenticationMethod::NONE)); 80 protocol::AuthenticationMethod::NONE));
80 auth_methods.push_back(protocol::AuthenticationMethod::ThirdParty()); 81 auth_methods.push_back(protocol::AuthenticationMethod::ThirdParty());
81 82
82 authenticator_.reset(new protocol::NegotiatingClientAuthenticator( 83 authenticator_.reset(new protocol::NegotiatingClientAuthenticator(
83 pairing_id, pairing_secret, host_id_, 84 pairing_id, pairing_secret, host_id_,
84 base::Bind(&ChromotingJniInstance::FetchSecret, this), 85 base::Bind(&ChromotingJniInstance::FetchSecret, this),
85 token_fetcher.Pass(), auth_methods)); 86 token_fetcher.Pass(), auth_methods));
86 87
87 // Post a task to start connection 88 // Post a task to start connection
88 jni_runtime_->display_task_runner()->PostTask( 89 jni_runtime_->network_task_runner()->PostTask(
89 FROM_HERE, 90 FROM_HERE,
90 base::Bind(&ChromotingJniInstance::ConnectToHostOnDisplayThread, 91 base::Bind(&ChromotingJniInstance::ConnectToHostOnNetworkThread, this));
91 this));
92 } 92 }
93 93
94 ChromotingJniInstance::~ChromotingJniInstance() { 94 ChromotingJniInstance::~ChromotingJniInstance() {
95 // This object is ref-counted, so this dtor can execute on any thread. 95 // This object is ref-counted, so this dtor can execute on any thread.
96 // Ensure that all these objects have been freed already, so they are not 96 // Ensure that all these objects have been freed already, so they are not
97 // destroyed on some random thread. 97 // destroyed on some random thread.
98 DCHECK(!view_); 98 DCHECK(!view_);
99 DCHECK(!client_context_); 99 DCHECK(!client_context_);
100 DCHECK(!video_renderer_); 100 DCHECK(!video_renderer_);
101 DCHECK(!authenticator_); 101 DCHECK(!authenticator_);
102 DCHECK(!client_); 102 DCHECK(!client_);
103 DCHECK(!signaling_); 103 DCHECK(!signaling_);
104 DCHECK(!client_status_logger_); 104 DCHECK(!client_status_logger_);
105 } 105 }
106 106
107 void ChromotingJniInstance::Disconnect() { 107 void ChromotingJniInstance::Disconnect() {
108 if (!jni_runtime_->display_task_runner()->BelongsToCurrentThread()) { 108 if (!jni_runtime_->network_task_runner()->BelongsToCurrentThread()) {
109 jni_runtime_->display_task_runner()->PostTask( 109 jni_runtime_->network_task_runner()->PostTask(
110 FROM_HERE, 110 FROM_HERE,
111 base::Bind(&ChromotingJniInstance::Disconnect, this)); 111 base::Bind(&ChromotingJniInstance::Disconnect, this));
112 return; 112 return;
113 } 113 }
114 114
115 // This must be destroyed on the display thread before the producer is gone. 115 host_id_.clear();
116
117 stats_logging_enabled_ = false;
118
119 // |client_| must be torn down before |signaling_|.
120 client_.reset();
121 client_status_logger_.reset();
122 video_renderer_.reset();
116 view_.reset(); 123 view_.reset();
117 124 authenticator_.reset();
118 // The weak pointers must be invalidated on the same thread they were used. 125 signaling_.reset();
119 view_weak_factory_->InvalidateWeakPtrs(); 126 client_context_.reset();
120
121 jni_runtime_->network_task_runner()->PostTask(
122 FROM_HERE,
123 base::Bind(&ChromotingJniInstance::DisconnectFromHostOnNetworkThread,
124 this));
125 } 127 }
126 128
127 void ChromotingJniInstance::FetchThirdPartyToken( 129 void ChromotingJniInstance::FetchThirdPartyToken(
128 const GURL& token_url, 130 const GURL& token_url,
129 const std::string& client_id, 131 const std::string& client_id,
130 const std::string& scope, 132 const std::string& scope,
131 base::WeakPtr<TokenFetcherProxy> token_fetcher_proxy) { 133 base::WeakPtr<TokenFetcherProxy> token_fetcher_proxy) {
132 DCHECK(jni_runtime_->network_task_runner()->BelongsToCurrentThread()); 134 DCHECK(jni_runtime_->network_task_runner()->BelongsToCurrentThread());
133 DCHECK(!token_fetcher_proxy_.get()); 135 DCHECK(!token_fetcher_proxy_.get());
134 136
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
374 if (!jni_runtime_->display_task_runner()->BelongsToCurrentThread()) { 376 if (!jni_runtime_->display_task_runner()->BelongsToCurrentThread()) {
375 jni_runtime_->display_task_runner()->PostTask( 377 jni_runtime_->display_task_runner()->PostTask(
376 FROM_HERE, 378 FROM_HERE,
377 base::Bind(&ChromotingJniInstance::SetCursorShape, this, shape)); 379 base::Bind(&ChromotingJniInstance::SetCursorShape, this, shape));
378 return; 380 return;
379 } 381 }
380 382
381 jni_runtime_->UpdateCursorShape(shape); 383 jni_runtime_->UpdateCursorShape(shape);
382 } 384 }
383 385
384 void ChromotingJniInstance::ConnectToHostOnDisplayThread() { 386 void ChromotingJniInstance::ConnectToHostOnNetworkThread() {
385 DCHECK(jni_runtime_->display_task_runner()->BelongsToCurrentThread());
386
387 view_.reset(new JniFrameConsumer(jni_runtime_, this));
388 view_weak_factory_.reset(new base::WeakPtrFactory<JniFrameConsumer>(
389 view_.get()));
390 scoped_ptr<FrameConsumerProxy> frame_consumer =
391 make_scoped_ptr(new FrameConsumerProxy(view_weak_factory_->GetWeakPtr()));
392
393 jni_runtime_->network_task_runner()->PostTask(
394 FROM_HERE,
395 base::Bind(&ChromotingJniInstance::ConnectToHostOnNetworkThread, this,
396 base::Passed(&frame_consumer)));
397 }
398
399 void ChromotingJniInstance::ConnectToHostOnNetworkThread(
400 scoped_ptr<FrameConsumerProxy> frame_consumer) {
401 DCHECK(jni_runtime_->network_task_runner()->BelongsToCurrentThread()); 387 DCHECK(jni_runtime_->network_task_runner()->BelongsToCurrentThread());
402 DCHECK(frame_consumer);
403 388
404 jingle_glue::JingleThreadWrapper::EnsureForCurrentMessageLoop(); 389 jingle_glue::JingleThreadWrapper::EnsureForCurrentMessageLoop();
405 390
406 client_context_.reset(new ClientContext(jni_runtime_->network_task_runner())); 391 client_context_.reset(new ClientContext(jni_runtime_->network_task_runner()));
407 client_context_->Start(); 392 client_context_->Start();
408 393
409 SoftwareVideoRenderer* renderer = new SoftwareVideoRenderer( 394 view_.reset(new JniFrameConsumer(jni_runtime_));
410 client_context_->main_task_runner(), 395 video_renderer_.reset(new SoftwareVideoRenderer(
411 client_context_->decode_task_runner(), frame_consumer.Pass()); 396 client_context_->decode_task_runner(), view_.get()));
412 view_->set_frame_producer(renderer);
413 video_renderer_.reset(renderer);
414 397
415 client_.reset(new ChromotingClient( 398 client_.reset(new ChromotingClient(
416 client_context_.get(), this, video_renderer_.get(), nullptr)); 399 client_context_.get(), this, video_renderer_.get(), nullptr));
417 400
418 signaling_.reset(new XmppSignalStrategy( 401 signaling_.reset(new XmppSignalStrategy(
419 net::ClientSocketFactory::GetDefaultFactory(), 402 net::ClientSocketFactory::GetDefaultFactory(),
420 jni_runtime_->url_requester(), xmpp_config_)); 403 jni_runtime_->url_requester(), xmpp_config_));
421 404
422 client_status_logger_.reset( 405 client_status_logger_.reset(
423 new ClientStatusLogger(ServerLogEntry::ME2ME, 406 new ClientStatusLogger(ServerLogEntry::ME2ME,
(...skipping 10 matching lines...) Expand all
434 417
435 scoped_ptr<protocol::TransportFactory> transport_factory( 418 scoped_ptr<protocol::TransportFactory> transport_factory(
436 new protocol::LibjingleTransportFactory( 419 new protocol::LibjingleTransportFactory(
437 signaling_.get(), port_allocator.Pass(), network_settings, 420 signaling_.get(), port_allocator.Pass(), network_settings,
438 protocol::TransportRole::CLIENT)); 421 protocol::TransportRole::CLIENT));
439 422
440 client_->Start(signaling_.get(), authenticator_.Pass(), 423 client_->Start(signaling_.get(), authenticator_.Pass(),
441 transport_factory.Pass(), host_jid_, capabilities_); 424 transport_factory.Pass(), host_jid_, capabilities_);
442 } 425 }
443 426
444 void ChromotingJniInstance::DisconnectFromHostOnNetworkThread() {
445 DCHECK(jni_runtime_->network_task_runner()->BelongsToCurrentThread());
446
447 host_id_.clear();
448
449 stats_logging_enabled_ = false;
450
451 // |client_| must be torn down before |signaling_|.
452 client_.reset();
453 client_status_logger_.reset();
454 video_renderer_.reset();
455 authenticator_.reset();
456 signaling_.reset();
457 client_context_.reset();
458 }
459
460 void ChromotingJniInstance::FetchSecret( 427 void ChromotingJniInstance::FetchSecret(
461 bool pairable, 428 bool pairable,
462 const protocol::SecretFetchedCallback& callback) { 429 const protocol::SecretFetchedCallback& callback) {
463 if (!jni_runtime_->ui_task_runner()->BelongsToCurrentThread()) { 430 if (!jni_runtime_->ui_task_runner()->BelongsToCurrentThread()) {
464 jni_runtime_->ui_task_runner()->PostTask( 431 jni_runtime_->ui_task_runner()->PostTask(
465 FROM_HERE, base::Bind(&ChromotingJniInstance::FetchSecret, 432 FROM_HERE, base::Bind(&ChromotingJniInstance::FetchSecret,
466 this, pairable, callback)); 433 this, pairable, callback));
467 return; 434 return;
468 } 435 }
469 436
(...skipping 17 matching lines...) Expand all
487 454
488 void ChromotingJniInstance::SendKeyEventInternal(int usb_key_code, 455 void ChromotingJniInstance::SendKeyEventInternal(int usb_key_code,
489 bool key_down) { 456 bool key_down) {
490 if (!jni_runtime_->network_task_runner()->BelongsToCurrentThread()) { 457 if (!jni_runtime_->network_task_runner()->BelongsToCurrentThread()) {
491 jni_runtime_->network_task_runner()->PostTask( 458 jni_runtime_->network_task_runner()->PostTask(
492 FROM_HERE, base::Bind(&ChromotingJniInstance::SendKeyEventInternal, 459 FROM_HERE, base::Bind(&ChromotingJniInstance::SendKeyEventInternal,
493 this, usb_key_code, key_down)); 460 this, usb_key_code, key_down));
494 return; 461 return;
495 } 462 }
496 463
497
498 protocol::KeyEvent event; 464 protocol::KeyEvent event;
499 event.set_usb_keycode(usb_key_code); 465 event.set_usb_keycode(usb_key_code);
500 event.set_pressed(key_down); 466 event.set_pressed(key_down);
501 client_->input_stub()->InjectKeyEvent(event); 467 client_->input_stub()->InjectKeyEvent(event);
502 } 468 }
503 469
504 void ChromotingJniInstance::EnableStatsLogging(bool enabled) { 470 void ChromotingJniInstance::EnableStatsLogging(bool enabled) {
505 DCHECK(jni_runtime_->network_task_runner()->BelongsToCurrentThread()); 471 DCHECK(jni_runtime_->network_task_runner()->BelongsToCurrentThread());
506 472
507 if (enabled && !stats_logging_enabled_) { 473 if (enabled && !stats_logging_enabled_) {
(...skipping 20 matching lines...) Expand all
528 stats->round_trip_ms()); 494 stats->round_trip_ms());
529 495
530 client_status_logger_->LogStatistics(stats); 496 client_status_logger_->LogStatistics(stats);
531 497
532 jni_runtime_->network_task_runner()->PostDelayedTask( 498 jni_runtime_->network_task_runner()->PostDelayedTask(
533 FROM_HERE, base::Bind(&ChromotingJniInstance::LogPerfStats, this), 499 FROM_HERE, base::Bind(&ChromotingJniInstance::LogPerfStats, this),
534 base::TimeDelta::FromMilliseconds(kPerfStatsIntervalMs)); 500 base::TimeDelta::FromMilliseconds(kPerfStatsIntervalMs));
535 } 501 }
536 502
537 } // namespace remoting 503 } // namespace remoting
OLDNEW
« no previous file with comments | « remoting/client/jni/chromoting_jni_instance.h ('k') | remoting/client/jni/chromoting_jni_runtime.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698