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

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

Issue 2007123003: [Android Client] Break down multi-threaded classes by thread (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rename JniSecretFetcher to JniPairingSecretFetcher Created 4 years, 6 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
« no previous file with comments | « remoting/client/jni/jni_client.h ('k') | remoting/client/jni/jni_display_handler.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/jni/chromoting_jni_instance.h" 11 #include "remoting/client/jni/chromoting_jni_instance.h"
12 #include "remoting/client/jni/chromoting_jni_runtime.h" 12 #include "remoting/client/jni/chromoting_jni_runtime.h"
13 #include "remoting/client/jni/jni_display_handler.h"
14 #include "remoting/client/jni/jni_pairing_secret_fetcher.h"
13 #include "remoting/client/jni/jni_touch_event_data.h" 15 #include "remoting/client/jni/jni_touch_event_data.h"
14 16
15 using base::android::ConvertJavaStringToUTF8; 17 using base::android::ConvertJavaStringToUTF8;
16 using base::android::ConvertUTF8ToJavaString; 18 using base::android::ConvertUTF8ToJavaString;
17 19
18 namespace { 20 namespace remoting {
19 21
20 const int kBytesPerPixel = 4; 22 JniClient::JniClient(ChromotingJniRuntime* runtime,
23 base::android::ScopedJavaGlobalRef<jobject> java_client)
24 : runtime_(runtime),
25 java_client_(java_client),
26 weak_factory_(this) {}
27
28 JniClient::~JniClient() {
29 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
30
31 // The session must be shut down first, since it depends on our other
32 // components' still being alive.
33 DisconnectFromHost();
21 } 34 }
22 35
23 namespace remoting { 36 void JniClient::ConnectToHost(base::WeakPtr<JniDisplayHandler> display_handler,
24 37 const std::string& username,
25 JniClient::JniClient(jobject java_client)
26 : java_client_(java_client), weak_factory_(this) {}
27
28 JniClient::~JniClient() {
29 DCHECK(runtime()->ui_task_runner()->BelongsToCurrentThread());
30 }
31
32 void JniClient::ConnectToHost(const std::string& username,
33 const std::string& auth_token, 38 const std::string& auth_token,
34 const std::string& host_jid, 39 const std::string& host_jid,
35 const std::string& host_id, 40 const std::string& host_id,
36 const std::string& host_pubkey, 41 const std::string& host_pubkey,
37 const std::string& pairing_id, 42 const std::string& pairing_id,
38 const std::string& pairing_secret, 43 const std::string& pairing_secret,
39 const std::string& capabilities, 44 const std::string& capabilities,
40 const std::string& flags) { 45 const std::string& flags) {
41 DCHECK(runtime()->ui_task_runner()->BelongsToCurrentThread()); 46 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
42 DCHECK(!session_); 47 DCHECK(!session_);
43 session_ = new ChromotingJniInstance( 48 DCHECK(!secret_fetcher_);
44 runtime(), this, username, auth_token, host_jid, host_id, host_pubkey, 49 secret_fetcher_.reset(new JniPairingSecretFetcher(runtime_, GetWeakPtr(),
45 pairing_id, pairing_secret, capabilities, flags); 50 host_id));
51
52 display_handler_ = display_handler;
53 session_.reset(new ChromotingJniInstance(
54 runtime_, GetWeakPtr(), display_handler_,
55 secret_fetcher_->GetWeakPtr(), username, auth_token, host_jid, host_id,
56 host_pubkey, pairing_id, pairing_secret, capabilities, flags));
46 session_->Connect(); 57 session_->Connect();
47 } 58 }
48 59
49 void JniClient::DisconnectFromHost() { 60 void JniClient::DisconnectFromHost() {
50 DCHECK(runtime()->ui_task_runner()->BelongsToCurrentThread()); 61 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
62 display_handler_ = nullptr;
51 if (session_) { 63 if (session_) {
52 session_->Disconnect(); 64 session_->Disconnect();
53 session_ = nullptr; 65 runtime_->network_task_runner()->DeleteSoon(FROM_HERE,
66 session_.release());
54 } 67 }
55 } 68 }
56 69
57 void JniClient::OnConnectionState(protocol::ConnectionToHost::State state, 70 void JniClient::OnConnectionState(protocol::ConnectionToHost::State state,
58 protocol::ErrorCode error) { 71 protocol::ErrorCode error) {
59 DCHECK(runtime()->ui_task_runner()->BelongsToCurrentThread()); 72 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
60 73
61 JNIEnv* env = base::android::AttachCurrentThread(); 74 JNIEnv* env = base::android::AttachCurrentThread();
62 Java_Client_onConnectionState(env, java_client_, state, error); 75 Java_Client_onConnectionState(env, java_client_.obj(), state, error);
63 } 76 }
64 77
65 void JniClient::DisplayAuthenticationPrompt(bool pairing_supported) { 78 void JniClient::DisplayAuthenticationPrompt(bool pairing_supported) {
66 DCHECK(runtime()->ui_task_runner()->BelongsToCurrentThread()); 79 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
67 80
68 JNIEnv* env = base::android::AttachCurrentThread(); 81 JNIEnv* env = base::android::AttachCurrentThread();
69 Java_Client_displayAuthenticationPrompt(env, java_client_, pairing_supported); 82 Java_Client_displayAuthenticationPrompt(env, java_client_.obj(),
83 pairing_supported);
70 } 84 }
71 85
72 void JniClient::CommitPairingCredentials(const std::string& host, 86 void JniClient::CommitPairingCredentials(const std::string& host,
73 const std::string& id, 87 const std::string& id,
74 const std::string& secret) { 88 const std::string& secret) {
75 DCHECK(runtime()->ui_task_runner()->BelongsToCurrentThread()); 89 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
76 90
77 JNIEnv* env = base::android::AttachCurrentThread(); 91 JNIEnv* env = base::android::AttachCurrentThread();
78 ScopedJavaLocalRef<jstring> j_host = ConvertUTF8ToJavaString(env, host); 92 ScopedJavaLocalRef<jstring> j_host = ConvertUTF8ToJavaString(env, host);
79 ScopedJavaLocalRef<jstring> j_id = ConvertUTF8ToJavaString(env, id); 93 ScopedJavaLocalRef<jstring> j_id = ConvertUTF8ToJavaString(env, id);
80 ScopedJavaLocalRef<jstring> j_secret = ConvertUTF8ToJavaString(env, secret); 94 ScopedJavaLocalRef<jstring> j_secret = ConvertUTF8ToJavaString(env, secret);
81 95
82 Java_Client_commitPairingCredentials(env, java_client_, j_host.obj(), 96 Java_Client_commitPairingCredentials(env, java_client_.obj(), j_host.obj(),
83 j_id.obj(), j_secret.obj()); 97 j_id.obj(), j_secret.obj());
84 } 98 }
85 99
86 void JniClient::FetchThirdPartyToken(const std::string& token_url, 100 void JniClient::FetchThirdPartyToken(const std::string& token_url,
87 const std::string& client_id, 101 const std::string& client_id,
88 const std::string& scope) { 102 const std::string& scope) {
89 DCHECK(runtime()->ui_task_runner()->BelongsToCurrentThread()); 103 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
90 JNIEnv* env = base::android::AttachCurrentThread(); 104 JNIEnv* env = base::android::AttachCurrentThread();
91 105
92 ScopedJavaLocalRef<jstring> j_url = ConvertUTF8ToJavaString(env, token_url); 106 ScopedJavaLocalRef<jstring> j_url = ConvertUTF8ToJavaString(env, token_url);
93 ScopedJavaLocalRef<jstring> j_client_id = 107 ScopedJavaLocalRef<jstring> j_client_id =
94 ConvertUTF8ToJavaString(env, client_id); 108 ConvertUTF8ToJavaString(env, client_id);
95 ScopedJavaLocalRef<jstring> j_scope = ConvertUTF8ToJavaString(env, scope); 109 ScopedJavaLocalRef<jstring> j_scope = ConvertUTF8ToJavaString(env, scope);
96 110
97 Java_Client_fetchThirdPartyToken(env, java_client_, j_url.obj(), 111 Java_Client_fetchThirdPartyToken(env, java_client_.obj(), j_url.obj(),
98 j_client_id.obj(), j_scope.obj()); 112 j_client_id.obj(), j_scope.obj());
99 } 113 }
100 114
101 void JniClient::SetCapabilities(const std::string& capabilities) { 115 void JniClient::SetCapabilities(const std::string& capabilities) {
102 DCHECK(runtime()->ui_task_runner()->BelongsToCurrentThread()); 116 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
103 JNIEnv* env = base::android::AttachCurrentThread(); 117 JNIEnv* env = base::android::AttachCurrentThread();
104 118
105 ScopedJavaLocalRef<jstring> j_cap = 119 ScopedJavaLocalRef<jstring> j_cap =
106 ConvertUTF8ToJavaString(env, capabilities); 120 ConvertUTF8ToJavaString(env, capabilities);
107 121
108 Java_Client_setCapabilities(env, java_client_, j_cap.obj()); 122 Java_Client_setCapabilities(env, java_client_.obj(), j_cap.obj());
109 } 123 }
110 124
111 void JniClient::HandleExtensionMessage(const std::string& type, 125 void JniClient::HandleExtensionMessage(const std::string& type,
112 const std::string& message) { 126 const std::string& message) {
113 DCHECK(runtime()->ui_task_runner()->BelongsToCurrentThread()); 127 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
114 JNIEnv* env = base::android::AttachCurrentThread(); 128 JNIEnv* env = base::android::AttachCurrentThread();
115 129
116 ScopedJavaLocalRef<jstring> j_type = ConvertUTF8ToJavaString(env, type); 130 ScopedJavaLocalRef<jstring> j_type = ConvertUTF8ToJavaString(env, type);
117 ScopedJavaLocalRef<jstring> j_message = ConvertUTF8ToJavaString(env, message); 131 ScopedJavaLocalRef<jstring> j_message = ConvertUTF8ToJavaString(env, message);
118 132
119 Java_Client_handleExtensionMessage(env, java_client_, j_type.obj(), 133 Java_Client_handleExtensionMessage(env, java_client_.obj(), j_type.obj(),
120 j_message.obj()); 134 j_message.obj());
121 } 135 }
122 136
123 base::android::ScopedJavaLocalRef<jobject> JniClient::NewBitmap(int width,
124 int height) {
125 JNIEnv* env = base::android::AttachCurrentThread();
126 return Java_Client_newBitmap(env, width, height);
127 }
128
129 void JniClient::UpdateFrameBitmap(jobject bitmap) {
130 DCHECK(runtime()->display_task_runner()->BelongsToCurrentThread());
131
132 JNIEnv* env = base::android::AttachCurrentThread();
133 Java_Client_setVideoFrame(env, java_client_, bitmap);
134 }
135
136 void JniClient::UpdateCursorShape(
137 const protocol::CursorShapeInfo& cursor_shape) {
138 DCHECK(runtime()->display_task_runner()->BelongsToCurrentThread());
139
140 // const_cast<> is safe as long as the Java updateCursorShape() method copies
141 // the data out of the buffer without mutating it, and doesn't keep any
142 // reference to the buffer afterwards. Unfortunately, there seems to be no way
143 // to create a read-only ByteBuffer from a pointer-to-const.
144 char* data = string_as_array(const_cast<std::string*>(&cursor_shape.data()));
145 int cursor_total_bytes =
146 cursor_shape.width() * cursor_shape.height() * kBytesPerPixel;
147
148 JNIEnv* env = base::android::AttachCurrentThread();
149 base::android::ScopedJavaLocalRef<jobject> buffer(
150 env, env->NewDirectByteBuffer(data, cursor_total_bytes));
151 Java_Client_updateCursorShape(env, java_client_, cursor_shape.width(),
152 cursor_shape.height(), cursor_shape.hotspot_x(),
153 cursor_shape.hotspot_y(), buffer.obj());
154 }
155
156 void JniClient::RedrawCanvas() {
157 DCHECK(runtime()->display_task_runner()->BelongsToCurrentThread());
158
159 JNIEnv* env = base::android::AttachCurrentThread();
160 Java_Client_redrawGraphicsInternal(env, java_client_);
161 }
162
163 // static 137 // static
164 bool JniClient::RegisterJni(JNIEnv* env) { 138 bool JniClient::RegisterJni(JNIEnv* env) {
165 return RegisterNativesImpl(env); 139 return RegisterNativesImpl(env);
166 } 140 }
167 141
168 void JniClient::Connect( 142 void JniClient::Connect(
169 JNIEnv* env, 143 JNIEnv* env,
170 const base::android::JavaParamRef<jobject>& caller, 144 const base::android::JavaParamRef<jobject>& caller,
145 jlong display_handler,
171 const base::android::JavaParamRef<jstring>& username, 146 const base::android::JavaParamRef<jstring>& username,
172 const base::android::JavaParamRef<jstring>& authToken, 147 const base::android::JavaParamRef<jstring>& authToken,
173 const base::android::JavaParamRef<jstring>& hostJid, 148 const base::android::JavaParamRef<jstring>& hostJid,
174 const base::android::JavaParamRef<jstring>& hostId, 149 const base::android::JavaParamRef<jstring>& hostId,
175 const base::android::JavaParamRef<jstring>& hostPubkey, 150 const base::android::JavaParamRef<jstring>& hostPubkey,
176 const base::android::JavaParamRef<jstring>& pairId, 151 const base::android::JavaParamRef<jstring>& pairId,
177 const base::android::JavaParamRef<jstring>& pairSecret, 152 const base::android::JavaParamRef<jstring>& pairSecret,
178 const base::android::JavaParamRef<jstring>& capabilities, 153 const base::android::JavaParamRef<jstring>& capabilities,
179 const base::android::JavaParamRef<jstring>& flags) { 154 const base::android::JavaParamRef<jstring>& flags) {
180 ConnectToHost(ConvertJavaStringToUTF8(env, username), 155 JniDisplayHandler* raw_handler = reinterpret_cast<JniDisplayHandler*>(
156 display_handler);
157 DCHECK(raw_handler);
158 ConnectToHost(raw_handler->GetWeakPtr(),
159 ConvertJavaStringToUTF8(env, username),
181 ConvertJavaStringToUTF8(env, authToken), 160 ConvertJavaStringToUTF8(env, authToken),
182 ConvertJavaStringToUTF8(env, hostJid), 161 ConvertJavaStringToUTF8(env, hostJid),
183 ConvertJavaStringToUTF8(env, hostId), 162 ConvertJavaStringToUTF8(env, hostId),
184 ConvertJavaStringToUTF8(env, hostPubkey), 163 ConvertJavaStringToUTF8(env, hostPubkey),
185 ConvertJavaStringToUTF8(env, pairId), 164 ConvertJavaStringToUTF8(env, pairId),
186 ConvertJavaStringToUTF8(env, pairSecret), 165 ConvertJavaStringToUTF8(env, pairSecret),
187 ConvertJavaStringToUTF8(env, capabilities), 166 ConvertJavaStringToUTF8(env, capabilities),
188 ConvertJavaStringToUTF8(env, flags)); 167 ConvertJavaStringToUTF8(env, flags));
189 } 168 }
190 169
191 void JniClient::Disconnect(JNIEnv* env, 170 void JniClient::Disconnect(JNIEnv* env,
192 const base::android::JavaParamRef<jobject>& caller) { 171 const base::android::JavaParamRef<jobject>& caller) {
193 DisconnectFromHost(); 172 DisconnectFromHost();
194 } 173 }
195 174
196 void JniClient::AuthenticationResponse( 175 void JniClient::AuthenticationResponse(
197 JNIEnv* env, 176 JNIEnv* env,
198 const JavaParamRef<jobject>& caller, 177 const JavaParamRef<jobject>& caller,
199 const JavaParamRef<jstring>& pin, 178 const JavaParamRef<jstring>& pin,
200 jboolean createPair, 179 jboolean createPair,
201 const JavaParamRef<jstring>& deviceName) { 180 const JavaParamRef<jstring>& deviceName) {
202 session_->ProvideSecret(ConvertJavaStringToUTF8(env, pin).c_str(), createPair, 181 session_->ProvideSecret(ConvertJavaStringToUTF8(env, pin).c_str(), createPair,
203 ConvertJavaStringToUTF8(env, deviceName)); 182 ConvertJavaStringToUTF8(env, deviceName));
204 } 183 }
205 184
206 void JniClient::ScheduleRedraw(
207 JNIEnv* env,
208 const base::android::JavaParamRef<jobject>& caller) {
209 session_->RedrawDesktop();
210 }
211
212 void JniClient::SendMouseEvent( 185 void JniClient::SendMouseEvent(
213 JNIEnv* env, 186 JNIEnv* env,
214 const base::android::JavaParamRef<jobject>& caller, 187 const base::android::JavaParamRef<jobject>& caller,
215 jint x, 188 jint x,
216 jint y, 189 jint y,
217 jint whichButton, 190 jint whichButton,
218 jboolean buttonDown) { 191 jboolean buttonDown) {
219 // Button must be within the bounds of the MouseEvent_MouseButton enum. 192 // Button must be within the bounds of the MouseEvent_MouseButton enum.
220 DCHECK(whichButton >= 0 && whichButton < 5); 193 DCHECK(whichButton >= 0 && whichButton < 5);
221 194
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
279 const base::android::JavaParamRef<jobject>& caller, 252 const base::android::JavaParamRef<jobject>& caller,
280 jboolean enable) { 253 jboolean enable) {
281 session_->EnableVideoChannel(enable); 254 session_->EnableVideoChannel(enable);
282 } 255 }
283 256
284 void JniClient::OnThirdPartyTokenFetched( 257 void JniClient::OnThirdPartyTokenFetched(
285 JNIEnv* env, 258 JNIEnv* env,
286 const base::android::JavaParamRef<jobject>& caller, 259 const base::android::JavaParamRef<jobject>& caller,
287 const JavaParamRef<jstring>& token, 260 const JavaParamRef<jstring>& token,
288 const JavaParamRef<jstring>& shared_secret) { 261 const JavaParamRef<jstring>& shared_secret) {
289 runtime()->network_task_runner()->PostTask( 262 runtime_->network_task_runner()->PostTask(
290 FROM_HERE, 263 FROM_HERE,
291 base::Bind(&ChromotingJniInstance::HandleOnThirdPartyTokenFetched, 264 base::Bind(&ChromotingJniInstance::HandleOnThirdPartyTokenFetched,
292 session_, ConvertJavaStringToUTF8(env, token), 265 session_->GetWeakPtr(), ConvertJavaStringToUTF8(env, token),
293 ConvertJavaStringToUTF8(env, shared_secret))); 266 ConvertJavaStringToUTF8(env, shared_secret)));
294 } 267 }
295 268
296 void JniClient::SendExtensionMessage( 269 void JniClient::SendExtensionMessage(
297 JNIEnv* env, 270 JNIEnv* env,
298 const base::android::JavaParamRef<jobject>& caller, 271 const base::android::JavaParamRef<jobject>& caller,
299 const JavaParamRef<jstring>& type, 272 const JavaParamRef<jstring>& type,
300 const JavaParamRef<jstring>& data) { 273 const JavaParamRef<jstring>& data) {
301 session_->SendClientMessage(ConvertJavaStringToUTF8(env, type), 274 session_->SendClientMessage(ConvertJavaStringToUTF8(env, type),
302 ConvertJavaStringToUTF8(env, data)); 275 ConvertJavaStringToUTF8(env, data));
303 } 276 }
304 277
305 void JniClient::Destroy(JNIEnv* env, const JavaParamRef<jobject>& caller) { 278 void JniClient::Destroy(JNIEnv* env, const JavaParamRef<jobject>& caller) {
306 // The session must be shut down first, since it depends on our other
307 // components' still being alive.
308 DisconnectFromHost();
309
310 env->DeleteGlobalRef(java_client_);
311 delete this; 279 delete this;
312 } 280 }
313 281
314 base::WeakPtr<JniClient> JniClient::GetWeakPtr() { 282 base::WeakPtr<JniClient> JniClient::GetWeakPtr() {
315 return weak_factory_.GetWeakPtr(); 283 return weak_factory_.GetWeakPtr();
316 } 284 }
317 285
318 // static
319 ChromotingJniRuntime* JniClient::runtime() {
320 return ChromotingJniRuntime::GetInstance();
321 }
322
323 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& caller) { 286 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& caller) {
324 jobject caller_ref = env->NewGlobalRef(caller); 287 return reinterpret_cast<intptr_t>(
325 return reinterpret_cast<intptr_t>(new JniClient(caller_ref)); 288 new JniClient(ChromotingJniRuntime::GetInstance(),
289 base::android::ScopedJavaGlobalRef<jobject>(env, caller)));
326 } 290 }
327 291
328 } // namespace remoting 292 } // namespace remoting
OLDNEW
« no previous file with comments | « remoting/client/jni/jni_client.h ('k') | remoting/client/jni/jni_display_handler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698