Index: remoting/client/jni/chromoting_jni_instance.cc |
diff --git a/remoting/client/jni/chromoting_jni_instance.cc b/remoting/client/jni/chromoting_jni_instance.cc |
index 77fa9c88ec87476ed6c35a8aa014e1fedcf5e8d1..df6583d7a87e744b158b3562ba1035d4e34ecbfe 100644 |
--- a/remoting/client/jni/chromoting_jni_instance.cc |
+++ b/remoting/client/jni/chromoting_jni_instance.cc |
@@ -4,73 +4,29 @@ |
#include "remoting/client/jni/chromoting_jni_instance.h" |
-#include "base/android/base_jni_registrar.h" |
-#include "base/android/jni_android.h" |
#include "base/bind.h" |
-#include "base/bind_helpers.h" |
#include "base/logging.h" |
-#include "base/memory/singleton.h" |
-#include "net/android/net_jni_registrar.h" |
-#include "remoting/base/url_request_context.h" |
#include "remoting/client/audio_player.h" |
+#include "remoting/client/jni/chromoting_jni.h" |
#include "remoting/protocol/libjingle_transport_factory.h" |
-namespace remoting { |
- |
-// static |
-ChromotingJNIInstance* ChromotingJNIInstance::GetInstance() { |
- return Singleton<ChromotingJNIInstance>::get(); |
-} |
- |
-ChromotingJNIInstance::ChromotingJNIInstance() |
- : connected_(false) { |
- JNIEnv* env = base::android::AttachCurrentThread(); |
- |
- // The base and networks stacks must be registered with JNI in order to work |
- // on Android. An AtExitManager cleans this up at world's end. |
- collector_.reset(new base::AtExitManager()); |
- base::android::RegisterJni(env); |
- net::android::RegisterJni(env); |
- |
- // On Android, the UI thread is managed by Java, so we need to attach and |
- // start a special type of message loop to allow Chromium code to run tasks. |
- LOG(INFO) << "Starting main message loop"; |
- ui_loop_.reset(new base::MessageLoopForUI()); |
- ui_loop_->Start(); |
- |
- LOG(INFO) << "Spawning additional threads"; |
- // TODO(solb) Stop pretending to control the managed UI thread's lifetime. |
- ui_task_runner_ = new AutoThreadTaskRunner(ui_loop_->message_loop_proxy(), |
- base::MessageLoop::QuitClosure()); |
- network_task_runner_ = AutoThread::CreateWithType("native_net", |
- ui_task_runner_, |
- base::MessageLoop::TYPE_IO); |
- display_task_runner_ = AutoThread::Create("native_disp", |
- ui_task_runner_); |
- |
- url_requester_ = new URLRequestContextGetter(ui_task_runner_, |
- network_task_runner_); |
- |
- class_ = static_cast<jclass>(env->NewGlobalRef(env->FindClass(JAVA_CLASS))); |
-} |
- |
-ChromotingJNIInstance::~ChromotingJNIInstance() { |
- DCHECK(ui_task_runner_->BelongsToCurrentThread()); |
- DCHECK(!connected_); |
+namespace { |
+// TODO(solb) Move into location shared with client plugin. |
+const char* const CHAT_SERVER = "talk.google.com"; |
+const int CHAT_PORT = 5222; |
+const bool CHAT_USE_TLS = true; |
+const char* const CHAT_AUTH_METHOD = "oauth2"; |
+} // namespace |
- JNIEnv* env = base::android::AttachCurrentThread(); |
- env->DeleteGlobalRef(class_); |
- // TODO(solb): crbug.com/259594 Detach all threads from JVM here. |
-} |
+namespace remoting { |
-void ChromotingJNIInstance::ConnectToHost(const char* username, |
- const char* auth_token, |
- const char* host_jid, |
- const char* host_id, |
- const char* host_pubkey) { |
- DCHECK(ui_task_runner_->BelongsToCurrentThread()); |
- DCHECK(!connected_); |
- connected_ = true; |
+ChromotingJniInstance::ChromotingJniInstance(const char* username, |
+ const char* auth_token, |
+ const char* host_jid, |
+ const char* host_id, |
+ const char* host_pubkey) { |
+ DCHECK(ChromotingJni::GetInstance()-> |
+ ui_task_runner()->BelongsToCurrentThread()); |
username_ = username; |
auth_token_ = auth_token; |
@@ -78,101 +34,123 @@ void ChromotingJNIInstance::ConnectToHost(const char* username, |
host_id_ = host_id; |
host_pubkey_ = host_pubkey; |
- display_task_runner_->PostTask(FROM_HERE, base::Bind( |
- &ChromotingJNIInstance::ConnectToHostOnDisplayThread, |
- base::Unretained(this))); |
+ ChromotingJni::GetInstance()->display_task_runner()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&ChromotingJniInstance::ConnectToHostOnDisplayThread, |
+ this)); |
} |
-void ChromotingJNIInstance::DisconnectFromHost() { |
- DCHECK(ui_task_runner_->BelongsToCurrentThread()); |
- DCHECK(connected_); |
- connected_ = false; |
+ChromotingJniInstance::~ChromotingJniInstance() {} |
+ |
+void ChromotingJniInstance::Cleanup() { |
+ if (!ChromotingJni::GetInstance()-> |
+ network_task_runner()->BelongsToCurrentThread()) { |
+ ChromotingJni::GetInstance()->network_task_runner()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&ChromotingJniInstance::Cleanup, this)); |
+ return; |
+ } |
+ |
+ username_ = ""; |
+ auth_token_ = ""; |
+ host_jid_ = ""; |
+ host_id_ = ""; |
+ host_pubkey_ = ""; |
- network_task_runner_->PostTask(FROM_HERE, base::Bind( |
- &ChromotingJNIInstance::DisconnectFromHostOnNetworkThread, |
- base::Unretained(this))); |
+ // |client_| must be torn down before |signaling_|. |
+ pin_callback_.Reset(); |
+ client_.reset(); |
+ connection_.reset(); |
+ client_context_.reset(); |
+ client_config_.reset(); |
+ signaling_.reset(); |
+ signaling_config_.reset(); |
+ network_settings_.reset(); |
} |
-void ChromotingJNIInstance::ProvideSecret(const char* pin) { |
- DCHECK(ui_task_runner_->BelongsToCurrentThread()); |
+void ChromotingJniInstance::ProvideSecret(const char* pin) { |
+ DCHECK(ChromotingJni::GetInstance()-> |
+ ui_task_runner()->BelongsToCurrentThread()); |
DCHECK(!pin_callback_.is_null()); |
// We invoke the string constructor to ensure |pin| gets copied *before* the |
// asynchronous run, since Java might want it back as soon as we return. |
- network_task_runner_->PostTask(FROM_HERE, |
- base::Bind(pin_callback_, std::string(pin))); |
+ ChromotingJni::GetInstance()->network_task_runner()->PostTask(FROM_HERE, |
+ base::Bind(pin_callback_, pin)); |
} |
-void ChromotingJNIInstance::OnConnectionState( |
+void ChromotingJniInstance::OnConnectionState( |
protocol::ConnectionToHost::State state, |
protocol::ErrorCode error) { |
- if (!ui_task_runner_->BelongsToCurrentThread()) { |
- ui_task_runner_->PostTask(FROM_HERE, base::Bind( |
- &ChromotingJNIInstance::OnConnectionState, |
- base::Unretained(this), |
- state, |
- error)); |
+ if (!ChromotingJni::GetInstance()-> |
+ ui_task_runner()->BelongsToCurrentThread()) { |
+ ChromotingJni::GetInstance()-> |
+ ui_task_runner()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&ChromotingJniInstance::OnConnectionState, |
+ this, |
+ state, |
+ error)); |
return; |
} |
- JNIEnv* env = base::android::AttachCurrentThread(); |
- env->CallStaticVoidMethod( |
- class_, |
- env->GetStaticMethodID(class_, "reportConnectionStatus", "(II)V"), |
- state, |
- error); |
+ ChromotingJni::GetInstance()->ReportConnectionStatus(state, error); |
} |
-void ChromotingJNIInstance::OnConnectionReady(bool ready) { |
+void ChromotingJniInstance::OnConnectionReady(bool ready) { |
// We ignore this message, since OnConnectionState() tells us the same thing. |
} |
-void ChromotingJNIInstance::SetCapabilities(const std::string& capabilities) {} |
+void ChromotingJniInstance::SetCapabilities(const std::string& capabilities) {} |
-void ChromotingJNIInstance::SetPairingResponse( |
+void ChromotingJniInstance::SetPairingResponse( |
const protocol::PairingResponse& response) { |
NOTIMPLEMENTED(); |
} |
-protocol::ClipboardStub* ChromotingJNIInstance::GetClipboardStub() { |
+protocol::ClipboardStub* ChromotingJniInstance::GetClipboardStub() { |
NOTIMPLEMENTED(); |
return NULL; |
} |
-protocol::CursorShapeStub* ChromotingJNIInstance::GetCursorShapeStub() { |
+protocol::CursorShapeStub* ChromotingJniInstance::GetCursorShapeStub() { |
NOTIMPLEMENTED(); |
return NULL; |
} |
scoped_ptr<protocol::ThirdPartyClientAuthenticator::TokenFetcher> |
- ChromotingJNIInstance::GetTokenFetcher(const std::string& host_public_key) { |
+ ChromotingJniInstance::GetTokenFetcher(const std::string& host_public_key) { |
// Return null to indicate that third-party authentication is unsupported. |
return scoped_ptr<protocol::ThirdPartyClientAuthenticator::TokenFetcher>(); |
} |
-void ChromotingJNIInstance::ConnectToHostOnDisplayThread() { |
- DCHECK(display_task_runner_->BelongsToCurrentThread()); |
+void ChromotingJniInstance::ConnectToHostOnDisplayThread() { |
+ DCHECK(ChromotingJni::GetInstance()-> |
+ display_task_runner()->BelongsToCurrentThread()); |
if (!frame_consumer_.get()) { |
- frame_consumer_ = new FrameConsumerProxy(display_task_runner_); |
+ frame_consumer_ = new FrameConsumerProxy( |
+ ChromotingJni::GetInstance()->display_task_runner()); |
// TODO(solb) Instantiate some FrameConsumer implementation and attach it. |
} |
- network_task_runner_->PostTask(FROM_HERE, base::Bind( |
- &ChromotingJNIInstance::ConnectToHostOnNetworkThread, |
- base::Unretained(this))); |
+ ChromotingJni::GetInstance()->network_task_runner()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&ChromotingJniInstance::ConnectToHostOnNetworkThread, |
+ this)); |
} |
-void ChromotingJNIInstance::ConnectToHostOnNetworkThread() { |
- DCHECK(network_task_runner_->BelongsToCurrentThread()); |
+void ChromotingJniInstance::ConnectToHostOnNetworkThread() { |
+ DCHECK(ChromotingJni::GetInstance()-> |
+ network_task_runner()->BelongsToCurrentThread()); |
client_config_.reset(new ClientConfig()); |
client_config_->host_jid = host_jid_; |
client_config_->host_public_key = host_pubkey_; |
client_config_->fetch_secret_callback = base::Bind( |
- &ChromotingJNIInstance::FetchSecret, |
- base::Unretained(this)); |
+ &ChromotingJniInstance::FetchSecret, |
+ this); |
client_config_->authentication_tag = host_id_; |
// TODO(solb) Move these hardcoded values elsewhere: |
@@ -181,7 +159,8 @@ void ChromotingJNIInstance::ConnectToHostOnNetworkThread() { |
client_config_->authentication_methods.push_back( |
protocol::AuthenticationMethod::FromString("spake2_plain")); |
- client_context_.reset(new ClientContext(network_task_runner_.get())); |
+ client_context_.reset(new ClientContext( |
+ ChromotingJni::GetInstance()->network_task_runner().get())); |
client_context_->Start(); |
connection_.reset(new protocol::ConnectionToHost(true)); |
@@ -198,58 +177,39 @@ void ChromotingJNIInstance::ConnectToHostOnNetworkThread() { |
signaling_config_->port = CHAT_PORT; |
signaling_config_->use_tls = CHAT_USE_TLS; |
- signaling_.reset(new XmppSignalStrategy(url_requester_, |
- username_, |
- auth_token_, |
- CHAT_AUTH_METHOD, |
- *signaling_config_)); |
+ signaling_.reset(new XmppSignalStrategy( |
+ ChromotingJni::GetInstance()->url_requester(), |
+ username_, |
+ auth_token_, |
+ CHAT_AUTH_METHOD, |
+ *signaling_config_)); |
network_settings_.reset(new NetworkSettings( |
NetworkSettings::NAT_TRAVERSAL_OUTGOING)); |
scoped_ptr<protocol::TransportFactory> fact( |
- protocol::LibjingleTransportFactory::Create(*network_settings_, |
- url_requester_)); |
+ protocol::LibjingleTransportFactory::Create( |
+ *network_settings_, |
+ ChromotingJni::GetInstance()->url_requester())); |
client_->Start(signaling_.get(), fact.Pass()); |
} |
-void ChromotingJNIInstance::DisconnectFromHostOnNetworkThread() { |
- DCHECK(network_task_runner_->BelongsToCurrentThread()); |
- |
- username_ = ""; |
- auth_token_ = ""; |
- host_jid_ = ""; |
- host_id_ = ""; |
- host_pubkey_ = ""; |
- |
- // |client_| must be torn down before |signaling_|. |
- pin_callback_.Reset(); |
- client_.reset(); |
- connection_.reset(); |
- client_context_.reset(); |
- client_config_.reset(); |
- signaling_.reset(); |
- signaling_config_.reset(); |
- network_settings_.reset(); |
-} |
- |
-void ChromotingJNIInstance::FetchSecret( |
+void ChromotingJniInstance::FetchSecret( |
bool pairable, |
const protocol::SecretFetchedCallback& callback) { |
- if (!ui_task_runner_->BelongsToCurrentThread()) { |
- ui_task_runner_->PostTask(FROM_HERE, base::Bind( |
- &ChromotingJNIInstance::FetchSecret, |
- base::Unretained(this), |
- pairable, |
- callback)); |
+ if (!ChromotingJni::GetInstance()-> |
+ ui_task_runner()->BelongsToCurrentThread()) { |
+ ChromotingJni::GetInstance()->ui_task_runner()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&ChromotingJniInstance::FetchSecret, |
+ this, |
+ pairable, |
+ callback)); |
return; |
} |
pin_callback_ = callback; |
- JNIEnv* env = base::android::AttachCurrentThread(); |
- env->CallStaticVoidMethod( |
- class_, |
- env->GetStaticMethodID(class_, "displayAuthenticationPrompt", "()V")); |
+ ChromotingJni::GetInstance()->DisplayAuthenticationPrompt(); |
} |
} // namespace remoting |