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