Chromium Code Reviews| 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 ba68da87ad202445e3851c2cd7190f8d8e918544..cb44baf894a4b9c0942e77dbde400e67e6e20323 100644 |
| --- a/remoting/client/jni/chromoting_jni_instance.cc |
| +++ b/remoting/client/jni/chromoting_jni_instance.cc |
| @@ -22,34 +22,34 @@ ChromotingJNIInstance* ChromotingJNIInstance::GetInstance() { |
| return Singleton<ChromotingJNIInstance>::get(); |
| } |
| -ChromotingJNIInstance::ChromotingJNIInstance() |
| - : username_cstr_(NULL), |
| - auth_token_cstr_(NULL), |
| - host_jid_cstr_(NULL), |
| - host_id_cstr_(NULL), |
| - host_pubkey_cstr_(NULL), |
| - pin_cstr_(NULL) { |
| +ChromotingJNIInstance::ChromotingJNIInstance() { |
| JNIEnv* env = base::android::AttachCurrentThread(); |
| + // The base and networks stacks must be registered with the JNI in order to |
|
Wez
2013/07/11 22:32:08
nit: the JNI -> JNI
solb
2013/07/11 23:59:09
Done.
|
| + // work on Android. A (required) AtExitManager cleans this up at world's end. |
|
Wez
2013/07/11 22:32:08
nit: why is (required) needed here?
solb
2013/07/11 23:59:09
Done.
|
| collector_.reset(new base::AtExitManager()); |
| base::android::RegisterJni(env); |
| net::android::RegisterJni(env); |
| - LOG(INFO) << "starting main message loop"; |
| + // On Android, the UI thread is managed by the Java side of things, so we |
|
Wez
2013/07/11 22:32:08
nit: by the Java side of things -> by Java
solb
2013/07/11 23:59:09
Done.
|
| + // need to attach and start a special type of message loop in order to allow |
| + // Chromium code to queue tasks there. |
| + LOG(INFO) << "Starting main message loop"; |
| ui_loop_.reset(new base::MessageLoopForUI()); |
| ui_loop_->Start(); |
| - LOG(INFO) << "spawning additional threads"; |
| - ui_runner_ = new AutoThreadTaskRunner(ui_loop_->message_loop_proxy(), |
| + LOG(INFO) << "Spawning additional threads"; |
| + ui_task_runner_ = new AutoThreadTaskRunner(ui_loop_->message_loop_proxy(), |
| base::MessageLoop::QuitClosure()); |
| - net_runner_ = AutoThread::CreateWithType("native_net", |
| - ui_runner_, |
| + network_task_runner_ = AutoThread::CreateWithType("native_net", |
| + ui_task_runner_, |
| base::MessageLoop::TYPE_IO); |
| - disp_runner_ = AutoThread::CreateWithType("native_disp", |
| - ui_runner_, |
| + display_task_runner_ = AutoThread::CreateWithType("native_disp", |
| + ui_task_runner_, |
| base::MessageLoop::TYPE_DEFAULT); |
| - url_requester_ = new URLRequestContextGetter(ui_runner_, net_runner_); |
| + url_requester_ = new URLRequestContextGetter(ui_task_runner_, |
| + network_task_runner_); |
| class_ = static_cast<jclass>(env->NewGlobalRef(env->FindClass(JAVA_CLASS))); |
| } |
| @@ -60,89 +60,62 @@ ChromotingJNIInstance::~ChromotingJNIInstance() { |
| // TODO(solb) detach all threads from JVM |
|
Wez
2013/07/11 22:32:08
Why the TODO?
solb
2013/07/11 23:59:09
As I mentioned in a prior CL, it's something I pla
Wez
2013/07/12 00:24:48
OK, please file a bug for that work and refer to i
Wez
2013/07/12 01:25:44
Ping.
|
| } |
| -void ChromotingJNIInstance::ConnectToHost(jstring username, |
| - jstring auth_token, |
| - jstring host_jid, |
| - jstring host_id, |
| - jstring host_pubkey) { |
| - JNIEnv* env = base::android::AttachCurrentThread(); |
| - |
| - username_jstr_ = static_cast<jstring>(env->NewGlobalRef(username)); |
| - auth_token_jstr_ = static_cast<jstring>(env->NewGlobalRef(auth_token)); |
| - host_jid_jstr_ = static_cast<jstring>(env->NewGlobalRef(host_jid)); |
| - host_id_jstr_ = static_cast<jstring>(env->NewGlobalRef(host_id)); |
| - host_pubkey_jstr_ = static_cast<jstring>(env->NewGlobalRef(host_pubkey)); |
| - |
| - username_cstr_ = env->GetStringUTFChars(username_jstr_, NULL); |
| - auth_token_cstr_ = env->GetStringUTFChars(auth_token_jstr_, NULL); |
| - host_jid_cstr_ = env->GetStringUTFChars(host_jid_jstr_, NULL); |
| - host_id_cstr_ = env->GetStringUTFChars(host_id_jstr_, NULL); |
| - host_pubkey_cstr_ = env->GetStringUTFChars(host_pubkey_jstr_, NULL); |
| +void ChromotingJNIInstance::ConnectToHost(const char* username, |
| + const char* auth_token, |
| + const char* host_jid, |
| + const char* host_id, |
| + const char* host_pubkey) { |
|
Wez
2013/07/11 22:32:08
nit: DCHECK() that you're called on the expected t
solb
2013/07/11 23:59:09
The threading of this method has become less impor
Wez
2013/07/12 00:24:48
Don't other threads read these values, though? Are
|
| + username_ = username; |
| + auth_token_ = auth_token; |
| + host_jid_ = host_jid; |
| + host_id_ = host_id; |
| + host_pubkey_ = host_pubkey; |
| // We're a singleton, so Unretained is safe here. |
| - disp_runner_->PostTask(FROM_HERE, base::Bind( |
| + display_task_runner_->PostTask(FROM_HERE, base::Bind( |
| &ChromotingJNIInstance::ConnectToHostOnDisplayThread, |
| base::Unretained(this))); |
| } |
| void ChromotingJNIInstance::DisconnectFromHost() { |
| - JNIEnv* env = base::android::AttachCurrentThread(); |
| - |
| - env->ReleaseStringUTFChars(username_jstr_, username_cstr_); |
| - env->ReleaseStringUTFChars(auth_token_jstr_, auth_token_cstr_); |
| - env->ReleaseStringUTFChars(host_jid_jstr_, host_jid_cstr_); |
| - env->ReleaseStringUTFChars(host_id_jstr_, host_id_cstr_); |
| - env->ReleaseStringUTFChars(host_pubkey_jstr_, host_pubkey_cstr_); |
| - |
| - username_cstr_ = NULL; |
| - auth_token_cstr_ = NULL; |
| - host_jid_cstr_ = NULL; |
| - host_id_cstr_ = NULL; |
| - host_pubkey_cstr_ = NULL; |
| - |
| - env->DeleteGlobalRef(username_jstr_); |
| - env->DeleteGlobalRef(auth_token_jstr_); |
| - env->DeleteGlobalRef(host_jid_jstr_); |
| - env->DeleteGlobalRef(host_id_jstr_); |
| - env->DeleteGlobalRef(host_pubkey_jstr_); |
| - |
| - if (pin_cstr_) { |
| - // AuthenticatedWithPin() has been called. |
| - env->ReleaseStringUTFChars(pin_jstr_, pin_cstr_); |
| - pin_cstr_ = NULL; |
| - env->DeleteGlobalRef(pin_jstr_); |
| + // All our work must be done on the network thread. |
|
Wez
2013/07/11 22:32:08
ConnectToHost seems to store the strings while on
solb
2013/07/11 23:59:09
Done.
|
| + if (!network_task_runner_->BelongsToCurrentThread()) { |
| + // We're a singleton, so Unretained is safe here. |
|
Wez
2013/07/11 22:32:08
Why does being a singleton make it safe? Who delet
solb
2013/07/11 23:59:09
The singleton is deleted automatically at exit, wh
Wez
2013/07/12 00:24:48
Ah, OK, so the guarantee is that the object will o
Wez
2013/07/12 01:25:44
Blah... by which time there can be no further pend
|
| + network_task_runner_->PostTask(FROM_HERE, base::Bind( |
| + &ChromotingJNIInstance::DisconnectFromHost, |
| + base::Unretained(this))); |
| + return; |
| } |
| - // We're a singleton, so Unretained is safe here. |
| - net_runner_->PostTask(FROM_HERE, base::Bind( |
| - &ChromotingJNIInstance::DisconnectFromHostOnNetworkThread, |
| - base::Unretained(this))); |
| + client_.reset(); |
| + connection_.reset(); |
| + client_context_.reset(); |
| + client_config_.reset(); |
| + chat_.reset(); // This object must outlive client_. |
|
Wez
2013/07/11 22:32:08
nit: Suggest putting a comment before |client_| "|
solb
2013/07/11 23:59:09
Done.
|
| + chat_config_.reset(); // TODO(solb) Restructure to reuse between sessions. |
|
Wez
2013/07/11 22:32:08
Either remove this TODO or elaborate on what you i
solb
2013/07/11 23:59:09
Done.
|
| + netset_.reset(); |
| } |
| -void ChromotingJNIInstance::AuthenticateWithPin(jstring pin) { |
| - JNIEnv* env = base::android::AttachCurrentThread(); |
| - |
| - pin_jstr_ = static_cast<jstring>(env->NewGlobalRef(pin)); |
| - pin_cstr_ = env->GetStringUTFChars(pin_jstr_, NULL); |
| - |
| - net_runner_->PostTask(FROM_HERE, base::Bind(announce_secret_, pin_cstr_)); |
| +void ChromotingJNIInstance::AuthenticateWithPin(const char* pin) { |
| + pin_ = pin; |
| + network_task_runner_->PostTask(FROM_HERE, base::Bind(announce_secret_, pin_)); |
| } |
| void ChromotingJNIInstance::FetchSecret( |
| bool pairable, |
| - const protocol::SecretFetchedCallback& callback_encore) { |
| + const protocol::SecretFetchedCallback& callback) { |
| // All our work must be done on the UI thread. |
|
Wez
2013/07/11 22:32:08
Previous method says network thread, not UI thread
solb
2013/07/11 23:59:09
I believe it's correct as written. This method is
|
| - if (!ui_runner_->BelongsToCurrentThread()) { |
| + if (!ui_task_runner_->BelongsToCurrentThread()) { |
| // We're a singleton, so Unretained is safe here. |
| - ui_runner_->PostTask(FROM_HERE, base::Bind( |
| + ui_task_runner_->PostTask(FROM_HERE, base::Bind( |
| &ChromotingJNIInstance::FetchSecret, |
| base::Unretained(this), |
| pairable, |
| - callback_encore)); |
| + callback)); |
| return; |
| } |
| - announce_secret_ = callback_encore; |
| + announce_secret_ = callback; |
| JNIEnv* env = base::android::AttachCurrentThread(); |
| env->CallStaticVoidMethod( |
| class_, |
| @@ -153,9 +126,9 @@ void ChromotingJNIInstance::OnConnectionState( |
| protocol::ConnectionToHost::State state, |
| protocol::ErrorCode error) { |
| // All our work must be done on the UI thread. |
|
Wez
2013/07/11 22:32:08
Here too
solb
2013/07/11 23:59:09
Once again, we're invoked on the network thread bu
Wez
2013/07/12 00:24:48
See comment above; no need for this comment at all
|
| - if (!ui_runner_->BelongsToCurrentThread()) { |
| + if (!ui_task_runner_->BelongsToCurrentThread()) { |
| // We're a singleton, so Unretained is safe here. |
| - ui_runner_->PostTask(FROM_HERE, base::Bind( |
| + ui_task_runner_->PostTask(FROM_HERE, base::Bind( |
| &ChromotingJNIInstance::OnConnectionState, |
| base::Unretained(this), |
| state, |
| @@ -171,13 +144,16 @@ void ChromotingJNIInstance::OnConnectionState( |
| error); |
| } |
| -void ChromotingJNIInstance::OnConnectionReady(bool ready) { |
| -} |
| +// We ignore this message, since OnConnectionState() tells us the same thing. |
|
Wez
2013/07/11 22:32:08
nit: Move this into the body of the method
solb
2013/07/11 23:59:09
Done.
|
| +void ChromotingJNIInstance::OnConnectionReady(bool ready) {} |
|
Wez
2013/07/11 22:32:08
Why do both exist, then?
solb
2013/07/11 23:59:09
Done.
|
| +// We ignore this message because we don't deal with capabilities. |
|
Wez
2013/07/11 22:32:08
You don't really need this comment; it's clear fro
solb
2013/07/11 23:59:09
Done.
|
| void ChromotingJNIInstance::SetCapabilities(const std::string& capabilities) {} |
| +// We ignore this message because OnConnectionState() reveals the same info. |
|
Wez
2013/07/11 22:32:08
nit: Move this comment into the body of the method
solb
2013/07/11 23:59:09
Done.
|
| void ChromotingJNIInstance::SetPairingResponse( |
| - const protocol::PairingResponse& response) {} |
| + const protocol::PairingResponse& response) { |
| +} |
| protocol::ClipboardStub* ChromotingJNIInstance::GetClipboardStub() { |
| NOTIMPLEMENTED(); |
| @@ -189,40 +165,37 @@ protocol::CursorShapeStub* ChromotingJNIInstance::GetCursorShapeStub() { |
| return NULL; |
| } |
| -// We don't use NOTIMPLEMENTED() here because NegotiatingClientAuthenticator |
| -// calls this even if it doesn't use the configuration method, and we don't |
| -// want to print an error on every run. |
| +// We don't support third party authentication, so we return a null pointer. |
|
Wez
2013/07/11 22:32:08
nit: Move this inside the method, and reword e.g.
solb
2013/07/11 23:59:09
Done.
|
| scoped_ptr<protocol::ThirdPartyClientAuthenticator::TokenFetcher> |
| ChromotingJNIInstance::GetTokenFetcher(const std::string& host_public_key) { |
| - LOG(INFO) << "ChromotingJNIInstance::GetTokenFetcher(...) [unimplemented]"; |
| return scoped_ptr<protocol::ThirdPartyClientAuthenticator::TokenFetcher>(); |
| } |
| void ChromotingJNIInstance::ConnectToHostOnDisplayThread() { |
| - DCHECK(disp_runner_->BelongsToCurrentThread()); |
| + DCHECK(display_task_runner_->BelongsToCurrentThread()); |
| if (!frames_.get()) { |
| - frames_ = new FrameConsumerProxy(disp_runner_); |
| + frames_ = new FrameConsumerProxy(display_task_runner_); |
| // TODO(solb) Instantiate some FrameConsumer implementation and attach it. |
| } |
| // We're a singleton, so Unretained is safe here. |
| - net_runner_->PostTask(FROM_HERE, base::Bind( |
| + network_task_runner_->PostTask(FROM_HERE, base::Bind( |
| &ChromotingJNIInstance::ConnectToHostOnNetworkThread, |
| base::Unretained(this))); |
| } |
| void ChromotingJNIInstance::ConnectToHostOnNetworkThread() { |
| - DCHECK(net_runner_->BelongsToCurrentThread()); |
| + DCHECK(network_task_runner_->BelongsToCurrentThread()); |
| client_config_.reset(new ClientConfig()); |
| - client_config_->host_jid = host_jid_cstr_; |
| - client_config_->host_public_key = host_pubkey_cstr_; |
| + client_config_->host_jid = host_jid_; |
| + client_config_->host_public_key = host_pubkey_; |
| // We're a singleton, so Unretained is safe here. |
|
Wez
2013/07/11 22:32:08
nit: Blank line before this comment.
solb
2013/07/11 23:59:09
Done.
|
| client_config_->fetch_secret_callback = base::Bind( |
| &ChromotingJNIInstance::FetchSecret, |
| base::Unretained(this)); |
| - client_config_->authentication_tag = host_id_cstr_; |
| + client_config_->authentication_tag = host_id_; |
| // TODO(solb) Move these hardcoded values elsewhere: |
| client_config_->authentication_methods.push_back( |
| @@ -232,7 +205,7 @@ void ChromotingJNIInstance::ConnectToHostOnNetworkThread() { |
| client_config_->authentication_methods.push_back( |
| protocol::AuthenticationMethod::FromString("spake2_plain")); |
| - client_context_.reset(new ClientContext(net_runner_.get())); |
| + client_context_.reset(new ClientContext(network_task_runner_.get())); |
| client_context_->Start(); |
| connection_.reset(new protocol::ConnectionToHost(true)); |
| @@ -250,8 +223,8 @@ void ChromotingJNIInstance::ConnectToHostOnNetworkThread() { |
| chat_config_->use_tls = CHAT_USE_TLS; |
| chat_.reset(new XmppSignalStrategy(url_requester_, |
| - username_cstr_, |
| - auth_token_cstr_, |
| + username_, |
| + auth_token_, |
| CHAT_AUTH_METHOD, |
| *chat_config_)); |
| @@ -262,16 +235,4 @@ void ChromotingJNIInstance::ConnectToHostOnNetworkThread() { |
| client_->Start(chat_.get(), fact.Pass()); |
| } |
| -void ChromotingJNIInstance::DisconnectFromHostOnNetworkThread() { |
| - DCHECK(net_runner_->BelongsToCurrentThread()); |
| - |
| - client_.reset(); |
| - connection_.reset(); |
| - client_context_.reset(); |
| - client_config_.reset(); |
| - chat_.reset(); // This object must outlive client_. |
| - chat_config_.reset(); // TODO(solb) Restructure to reuse between sessions. |
| - netset_.reset(); |
| -} |
| - |
| } // namespace remoting |