Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/jni_client.h" | 5 #include "remoting/client/jni/jni_client.h" |
| 6 | 6 |
| 7 #include "base/android/jni_android.h" | 7 #include "base/android/jni_android.h" |
| 8 #include "base/android/jni_string.h" | 8 #include "base/android/jni_string.h" |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "jni/Client_jni.h" | 10 #include "jni/Client_jni.h" |
| 11 #include "remoting/client/audio_player_android.h" | |
| 11 #include "remoting/client/chromoting_client_runtime.h" | 12 #include "remoting/client/chromoting_client_runtime.h" |
| 12 #include "remoting/client/jni/chromoting_jni_instance.h" | 13 #include "remoting/client/chromoting_session.h" |
| 13 #include "remoting/client/jni/connect_to_host_info.h" | 14 #include "remoting/client/connect_to_host_info.h" |
| 14 #include "remoting/client/jni/jni_gl_display_handler.h" | 15 #include "remoting/client/jni/jni_gl_display_handler.h" |
| 15 #include "remoting/client/jni/jni_pairing_secret_fetcher.h" | 16 #include "remoting/client/jni/jni_pairing_secret_fetcher.h" |
| 16 #include "remoting/client/jni/jni_touch_event_data.h" | 17 #include "remoting/client/jni/jni_touch_event_data.h" |
| 17 #include "remoting/protocol/video_renderer.h" | 18 #include "remoting/protocol/video_renderer.h" |
| 18 | 19 |
| 19 using base::android::ConvertJavaStringToUTF8; | 20 using base::android::ConvertJavaStringToUTF8; |
| 20 using base::android::ConvertUTF8ToJavaString; | 21 using base::android::ConvertUTF8ToJavaString; |
| 21 using base::android::JavaParamRef; | 22 using base::android::JavaParamRef; |
| 22 using base::android::ScopedJavaLocalRef; | 23 using base::android::ScopedJavaLocalRef; |
| 23 | 24 |
| 24 namespace remoting { | 25 namespace remoting { |
| 25 | 26 |
| 26 JniClient::JniClient(base::android::ScopedJavaGlobalRef<jobject> java_client) | 27 JniClient::JniClient(base::android::ScopedJavaGlobalRef<jobject> java_client) |
| 27 : java_client_(java_client), weak_factory_(this) { | 28 : java_client_(java_client), weak_factory_(this) { |
| 28 runtime_ = ChromotingClientRuntime::GetInstance(); | 29 runtime_ = ChromotingClientRuntime::GetInstance(); |
| 29 weak_ptr_ = weak_factory_.GetWeakPtr(); | 30 weak_ptr_ = weak_factory_.GetWeakPtr(); |
| 30 } | 31 } |
| 31 | 32 |
| 32 JniClient::~JniClient() { | 33 JniClient::~JniClient() { |
| 33 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); | 34 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); |
| 34 | 35 |
| 35 // The session must be shut down first, since it depends on our other | 36 // The session must be shut down first, since it depends on our other |
| 36 // components' still being alive. | 37 // components' still being alive. |
| 37 DisconnectFromHost(); | 38 DisconnectFromHost(); |
| 38 } | 39 } |
| 39 | 40 |
| 40 void JniClient::ConnectToHost(const ConnectToHostInfo& info) { | 41 void JniClient::ConnectToHost(const ConnectToHostInfo& info) { |
| 41 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); | 42 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); |
| 42 DCHECK(!display_handler_); | 43 DCHECK(!display_handler_); |
| 44 DCHECK(!audio_player_); | |
| 43 DCHECK(!session_); | 45 DCHECK(!session_); |
| 44 DCHECK(!secret_fetcher_); | 46 DCHECK(!secret_fetcher_); |
| 45 display_handler_.reset(new JniGlDisplayHandler(java_client_)); | 47 display_handler_.reset(new JniGlDisplayHandler(java_client_)); |
| 46 secret_fetcher_.reset( | 48 secret_fetcher_.reset( |
| 47 new JniPairingSecretFetcher(GetWeakPtr(), info.host_id)); | 49 new JniPairingSecretFetcher(GetWeakPtr(), info.host_id)); |
| 48 session_.reset( | 50 |
| 49 new ChromotingJniInstance(GetWeakPtr(), secret_fetcher_->GetWeakPtr(), | 51 protocol::ClientAuthenticationConfig client_auth_config; |
| 50 display_handler_->CreateCursorShapeStub(), | 52 client_auth_config.host_id = info.host_id; |
| 51 display_handler_->CreateVideoRenderer(), info)); | 53 client_auth_config.pairing_client_id = info.pairing_id; |
| 54 client_auth_config.pairing_secret = info.pairing_secret; | |
| 55 client_auth_config.fetch_secret_callback = | |
| 56 base::Bind(&JniPairingSecretFetcher::FetchSecret, secret_fetcher_); | |
| 57 | |
| 58 audio_player_.reset(new AudioPlayerAndroid()); | |
| 59 | |
| 60 session_.reset(new ChromotingSession( | |
| 61 GetWeakPtr(), display_handler_->CreateCursorShapeStub(), | |
|
Yuwei
2017/03/29 22:55:27
GetWeakPtr() should be the JniRuntimeDelegate
nicholss
2017/03/29 23:34:53
Oh man yes. Thanks nice catch! I had to give the J
Yuwei
2017/03/29 23:56:29
IIRC WeakPtr should be clever enough to convert Jn
Yuwei
2017/03/30 19:02:57
Sorry for misleading... Looks like it's taking a C
| |
| 62 display_handler_->CreateVideoRenderer(), audio_player_->GetWeakPtr(), | |
| 63 info, client_auth_config)); | |
| 52 session_->Connect(); | 64 session_->Connect(); |
| 53 } | 65 } |
| 54 | 66 |
| 55 void JniClient::DisconnectFromHost() { | 67 void JniClient::DisconnectFromHost() { |
| 56 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); | 68 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); |
| 57 if (session_) { | 69 if (session_) { |
| 58 session_->Disconnect(); | 70 session_->Disconnect(); |
| 59 runtime_->network_task_runner()->DeleteSoon(FROM_HERE, | 71 runtime_->network_task_runner()->DeleteSoon(FROM_HERE, |
| 60 session_.release()); | 72 session_.release()); |
| 61 } | 73 } |
| 62 if (secret_fetcher_) { | 74 if (secret_fetcher_) { |
| 63 runtime_->network_task_runner()->DeleteSoon(FROM_HERE, | 75 runtime_->network_task_runner()->DeleteSoon(FROM_HERE, |
| 64 secret_fetcher_.release()); | 76 secret_fetcher_.release()); |
| 65 } | 77 } |
| 66 display_handler_.reset(); | 78 display_handler_.reset(); |
| 79 audio_player_.reset(); | |
| 67 } | 80 } |
| 68 | 81 |
| 69 void JniClient::OnConnectionState(protocol::ConnectionToHost::State state, | 82 void JniClient::OnConnectionState(protocol::ConnectionToHost::State state, |
| 70 protocol::ErrorCode error) { | 83 protocol::ErrorCode error) { |
| 71 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); | 84 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); |
| 72 | 85 |
| 73 JNIEnv* env = base::android::AttachCurrentThread(); | 86 JNIEnv* env = base::android::AttachCurrentThread(); |
| 74 Java_Client_onConnectionState(env, java_client_, state, error); | 87 Java_Client_onConnectionState(env, java_client_, state, error); |
| 75 } | 88 } |
| 76 | 89 |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 157 info.host_jid = ConvertJavaStringToUTF8(env, host_jid); | 170 info.host_jid = ConvertJavaStringToUTF8(env, host_jid); |
| 158 info.host_id = ConvertJavaStringToUTF8(env, host_id); | 171 info.host_id = ConvertJavaStringToUTF8(env, host_id); |
| 159 info.host_pubkey = ConvertJavaStringToUTF8(env, host_pubkey); | 172 info.host_pubkey = ConvertJavaStringToUTF8(env, host_pubkey); |
| 160 info.pairing_id = ConvertJavaStringToUTF8(env, pair_id); | 173 info.pairing_id = ConvertJavaStringToUTF8(env, pair_id); |
| 161 info.pairing_secret = ConvertJavaStringToUTF8(env, pair_secret); | 174 info.pairing_secret = ConvertJavaStringToUTF8(env, pair_secret); |
| 162 info.capabilities = ConvertJavaStringToUTF8(env, capabilities); | 175 info.capabilities = ConvertJavaStringToUTF8(env, capabilities); |
| 163 info.flags = ConvertJavaStringToUTF8(env, flags); | 176 info.flags = ConvertJavaStringToUTF8(env, flags); |
| 164 info.host_version = ConvertJavaStringToUTF8(env, host_version); | 177 info.host_version = ConvertJavaStringToUTF8(env, host_version); |
| 165 info.host_os = ConvertJavaStringToUTF8(env, host_os); | 178 info.host_os = ConvertJavaStringToUTF8(env, host_os); |
| 166 info.host_os_version = ConvertJavaStringToUTF8(env, host_os_version); | 179 info.host_os_version = ConvertJavaStringToUTF8(env, host_os_version); |
| 180 | |
| 167 ConnectToHost(info); | 181 ConnectToHost(info); |
| 168 } | 182 } |
| 169 | 183 |
| 170 void JniClient::Disconnect(JNIEnv* env, | 184 void JniClient::Disconnect(JNIEnv* env, |
| 171 const base::android::JavaParamRef<jobject>& caller) { | 185 const base::android::JavaParamRef<jobject>& caller) { |
| 172 DisconnectFromHost(); | 186 DisconnectFromHost(); |
| 173 } | 187 } |
| 174 | 188 |
| 175 void JniClient::AuthenticationResponse( | 189 void JniClient::AuthenticationResponse( |
| 176 JNIEnv* env, | 190 JNIEnv* env, |
| 177 const JavaParamRef<jobject>& caller, | 191 const JavaParamRef<jobject>& caller, |
| 178 const JavaParamRef<jstring>& pin, | 192 const JavaParamRef<jstring>& pin, |
| 179 jboolean createPair, | 193 jboolean createPair, |
| 180 const JavaParamRef<jstring>& deviceName) { | 194 const JavaParamRef<jstring>& deviceName) { |
| 181 session_->ProvideSecret(ConvertJavaStringToUTF8(env, pin), createPair, | 195 if (session_) { |
| 182 ConvertJavaStringToUTF8(env, deviceName)); | 196 session_->ProvideSecret(ConvertJavaStringToUTF8(env, pin), createPair, |
| 197 ConvertJavaStringToUTF8(env, deviceName)); | |
| 198 } | |
| 199 | |
| 200 if (secret_fetcher_) { | |
| 201 runtime_->network_task_runner()->PostTask( | |
| 202 FROM_HERE, | |
| 203 base::Bind(&JniPairingSecretFetcher::ProvideSecret, secret_fetcher_, | |
| 204 ConvertJavaStringToUTF8(env, pin))); | |
| 205 } | |
| 183 } | 206 } |
| 184 | 207 |
| 185 void JniClient::SendMouseEvent( | 208 void JniClient::SendMouseEvent( |
| 186 JNIEnv* env, | 209 JNIEnv* env, |
| 187 const base::android::JavaParamRef<jobject>& caller, | 210 const base::android::JavaParamRef<jobject>& caller, |
| 188 jint x, | 211 jint x, |
| 189 jint y, | 212 jint y, |
| 190 jint whichButton, | 213 jint whichButton, |
| 191 jboolean buttonDown) { | 214 jboolean buttonDown) { |
| 192 // Button must be within the bounds of the MouseEvent_MouseButton enum. | 215 // Button must be within the bounds of the MouseEvent_MouseButton enum. |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 254 session_->EnableVideoChannel(enable); | 277 session_->EnableVideoChannel(enable); |
| 255 } | 278 } |
| 256 | 279 |
| 257 void JniClient::OnThirdPartyTokenFetched( | 280 void JniClient::OnThirdPartyTokenFetched( |
| 258 JNIEnv* env, | 281 JNIEnv* env, |
| 259 const base::android::JavaParamRef<jobject>& caller, | 282 const base::android::JavaParamRef<jobject>& caller, |
| 260 const JavaParamRef<jstring>& token, | 283 const JavaParamRef<jstring>& token, |
| 261 const JavaParamRef<jstring>& shared_secret) { | 284 const JavaParamRef<jstring>& shared_secret) { |
| 262 runtime_->network_task_runner()->PostTask( | 285 runtime_->network_task_runner()->PostTask( |
| 263 FROM_HERE, | 286 FROM_HERE, |
| 264 base::Bind(&ChromotingJniInstance::HandleOnThirdPartyTokenFetched, | 287 base::Bind(&ChromotingSession::HandleOnThirdPartyTokenFetched, |
| 265 session_->GetWeakPtr(), ConvertJavaStringToUTF8(env, token), | 288 session_->GetWeakPtr(), ConvertJavaStringToUTF8(env, token), |
| 266 ConvertJavaStringToUTF8(env, shared_secret))); | 289 ConvertJavaStringToUTF8(env, shared_secret))); |
| 267 } | 290 } |
| 268 | 291 |
| 269 void JniClient::SendExtensionMessage( | 292 void JniClient::SendExtensionMessage( |
| 270 JNIEnv* env, | 293 JNIEnv* env, |
| 271 const base::android::JavaParamRef<jobject>& caller, | 294 const base::android::JavaParamRef<jobject>& caller, |
| 272 const JavaParamRef<jstring>& type, | 295 const JavaParamRef<jstring>& type, |
| 273 const JavaParamRef<jstring>& data) { | 296 const JavaParamRef<jstring>& data) { |
| 274 session_->SendClientMessage(ConvertJavaStringToUTF8(env, type), | 297 session_->SendClientMessage(ConvertJavaStringToUTF8(env, type), |
| 275 ConvertJavaStringToUTF8(env, data)); | 298 ConvertJavaStringToUTF8(env, data)); |
| 276 } | 299 } |
| 277 | 300 |
| 278 void JniClient::Destroy(JNIEnv* env, const JavaParamRef<jobject>& caller) { | 301 void JniClient::Destroy(JNIEnv* env, const JavaParamRef<jobject>& caller) { |
| 279 delete this; | 302 delete this; |
| 280 } | 303 } |
| 281 | 304 |
| 282 base::WeakPtr<JniClient> JniClient::GetWeakPtr() { | 305 base::WeakPtr<JniClient> JniClient::GetWeakPtr() { |
| 283 return weak_ptr_; | 306 return weak_ptr_; |
| 284 } | 307 } |
| 285 | 308 |
| 286 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& caller) { | 309 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& caller) { |
| 287 return reinterpret_cast<intptr_t>( | 310 return reinterpret_cast<intptr_t>( |
| 288 new JniClient(base::android::ScopedJavaGlobalRef<jobject>(env, caller))); | 311 new JniClient(base::android::ScopedJavaGlobalRef<jobject>(env, caller))); |
| 289 } | 312 } |
| 290 | 313 |
| 291 } // namespace remoting | 314 } // namespace remoting |
| OLD | NEW |