OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/chromoting_jni_instance.h" | 5 #include "remoting/client/jni/chromoting_jni_instance.h" |
6 | 6 |
7 #include <android/log.h> | 7 #include <android/log.h> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "jingle/glue/thread_wrapper.h" | 11 #include "jingle/glue/thread_wrapper.h" |
12 #include "net/socket/client_socket_factory.h" | 12 #include "net/socket/client_socket_factory.h" |
13 #include "remoting/base/service_urls.h" | 13 #include "remoting/base/service_urls.h" |
14 #include "remoting/client/audio_player.h" | 14 #include "remoting/client/audio_player.h" |
15 #include "remoting/client/client_status_logger.h" | 15 #include "remoting/client/client_status_logger.h" |
16 #include "remoting/client/jni/android_keymap.h" | 16 #include "remoting/client/jni/android_keymap.h" |
17 #include "remoting/client/jni/chromoting_jni_runtime.h" | 17 #include "remoting/client/jni/chromoting_jni_runtime.h" |
18 #include "remoting/client/software_video_renderer.h" | 18 #include "remoting/client/software_video_renderer.h" |
19 #include "remoting/client/token_fetcher_proxy.h" | 19 #include "remoting/client/token_fetcher_proxy.h" |
20 #include "remoting/jingle_glue/chromium_port_allocator.h" | 20 #include "remoting/jingle_glue/chromium_port_allocator.h" |
21 #include "remoting/jingle_glue/chromium_socket_factory.h" | 21 #include "remoting/jingle_glue/chromium_socket_factory.h" |
22 #include "remoting/jingle_glue/network_settings.h" | 22 #include "remoting/jingle_glue/network_settings.h" |
23 #include "remoting/jingle_glue/server_log_entry.h" | 23 #include "remoting/jingle_glue/server_log_entry.h" |
24 #include "remoting/protocol/host_stub.h" | 24 #include "remoting/protocol/host_stub.h" |
25 #include "remoting/protocol/libjingle_transport_factory.h" | 25 #include "remoting/protocol/libjingle_transport_factory.h" |
| 26 #include "remoting/protocol/negotiating_client_authenticator.h" |
26 | 27 |
27 namespace remoting { | 28 namespace remoting { |
28 | 29 |
29 namespace { | 30 namespace { |
30 | 31 |
31 // TODO(solb) Move into location shared with client plugin. | 32 // TODO(solb) Move into location shared with client plugin. |
32 const char* const kXmppServer = "talk.google.com"; | 33 const char* const kXmppServer = "talk.google.com"; |
33 const int kXmppPort = 5222; | 34 const int kXmppPort = 5222; |
34 const bool kXmppUseTls = true; | 35 const bool kXmppUseTls = true; |
35 | 36 |
36 // Interval at which to log performance statistics, if enabled. | 37 // Interval at which to log performance statistics, if enabled. |
37 const int kPerfStatsIntervalMs = 60000; | 38 const int kPerfStatsIntervalMs = 60000; |
38 | 39 |
39 } | 40 } |
40 | 41 |
41 ChromotingJniInstance::ChromotingJniInstance(ChromotingJniRuntime* jni_runtime, | 42 ChromotingJniInstance::ChromotingJniInstance(ChromotingJniRuntime* jni_runtime, |
42 const char* username, | 43 const char* username, |
43 const char* auth_token, | 44 const char* auth_token, |
44 const char* host_jid, | 45 const char* host_jid, |
45 const char* host_id, | 46 const char* host_id, |
46 const char* host_pubkey, | 47 const char* host_pubkey, |
47 const char* pairing_id, | 48 const char* pairing_id, |
48 const char* pairing_secret) | 49 const char* pairing_secret) |
49 : jni_runtime_(jni_runtime), | 50 : jni_runtime_(jni_runtime), |
50 host_id_(host_id), | 51 host_id_(host_id), |
| 52 host_jid_(host_jid), |
51 create_pairing_(false), | 53 create_pairing_(false), |
52 stats_logging_enabled_(false), | 54 stats_logging_enabled_(false), |
53 weak_factory_(this) { | 55 weak_factory_(this) { |
54 DCHECK(jni_runtime_->ui_task_runner()->BelongsToCurrentThread()); | 56 DCHECK(jni_runtime_->ui_task_runner()->BelongsToCurrentThread()); |
55 | 57 |
56 // Intialize XMPP config. | 58 // Intialize XMPP config. |
57 xmpp_config_.host = kXmppServer; | 59 xmpp_config_.host = kXmppServer; |
58 xmpp_config_.port = kXmppPort; | 60 xmpp_config_.port = kXmppPort; |
59 xmpp_config_.use_tls = kXmppUseTls; | 61 xmpp_config_.use_tls = kXmppUseTls; |
60 xmpp_config_.username = username; | 62 xmpp_config_.username = username; |
61 xmpp_config_.auth_token = auth_token; | 63 xmpp_config_.auth_token = auth_token; |
62 xmpp_config_.auth_service = "oauth2"; | 64 xmpp_config_.auth_service = "oauth2"; |
63 | 65 |
64 // Initialize ClientConfig. | 66 // Initialize |authenticator_|. |
65 client_config_.host_jid = host_jid; | 67 scoped_ptr<protocol::ThirdPartyClientAuthenticator::TokenFetcher> |
66 client_config_.host_public_key = host_pubkey; | 68 token_fetcher(new TokenFetcherProxy( |
| 69 base::Bind(&ChromotingJniInstance::FetchThirdPartyToken, |
| 70 weak_factory_.GetWeakPtr()), |
| 71 host_pubkey)); |
67 | 72 |
68 client_config_.fetch_secret_callback = | 73 std::vector<protocol::AuthenticationMethod> auth_methods; |
69 base::Bind(&ChromotingJniInstance::FetchSecret, this); | 74 auth_methods.push_back(protocol::AuthenticationMethod::Spake2Pair()); |
70 client_config_.authentication_tag = host_id_; | 75 auth_methods.push_back(protocol::AuthenticationMethod::Spake2( |
| 76 protocol::AuthenticationMethod::HMAC_SHA256)); |
| 77 auth_methods.push_back(protocol::AuthenticationMethod::Spake2( |
| 78 protocol::AuthenticationMethod::NONE)); |
71 | 79 |
72 client_config_.client_pairing_id = pairing_id; | 80 authenticator_.reset(new protocol::NegotiatingClientAuthenticator( |
73 client_config_.client_paired_secret = pairing_secret; | 81 pairing_id, pairing_secret, host_id_, |
74 | 82 base::Bind(&ChromotingJniInstance::FetchSecret, this), |
75 client_config_.authentication_methods.push_back( | 83 token_fetcher.Pass(), auth_methods)); |
76 protocol::AuthenticationMethod::FromString("spake2_pair")); | |
77 client_config_.authentication_methods.push_back( | |
78 protocol::AuthenticationMethod::FromString("spake2_hmac")); | |
79 client_config_.authentication_methods.push_back( | |
80 protocol::AuthenticationMethod::FromString("spake2_plain")); | |
81 | 84 |
82 // Post a task to start connection | 85 // Post a task to start connection |
83 jni_runtime_->display_task_runner()->PostTask( | 86 jni_runtime_->display_task_runner()->PostTask( |
84 FROM_HERE, | 87 FROM_HERE, |
85 base::Bind(&ChromotingJniInstance::ConnectToHostOnDisplayThread, | 88 base::Bind(&ChromotingJniInstance::ConnectToHostOnDisplayThread, |
86 this)); | 89 this)); |
87 } | 90 } |
88 | 91 |
89 ChromotingJniInstance::~ChromotingJniInstance() {} | 92 ChromotingJniInstance::~ChromotingJniInstance() {} |
90 | 93 |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
186 return; | 189 return; |
187 } | 190 } |
188 | 191 |
189 protocol::MouseEvent event; | 192 protocol::MouseEvent event; |
190 event.set_x(x); | 193 event.set_x(x); |
191 event.set_y(y); | 194 event.set_y(y); |
192 event.set_button(button); | 195 event.set_button(button); |
193 if (button != protocol::MouseEvent::BUTTON_UNDEFINED) | 196 if (button != protocol::MouseEvent::BUTTON_UNDEFINED) |
194 event.set_button_down(button_down); | 197 event.set_button_down(button_down); |
195 | 198 |
196 connection_->input_stub()->InjectMouseEvent(event); | 199 client_->input_stub()->InjectMouseEvent(event); |
197 } | 200 } |
198 | 201 |
199 void ChromotingJniInstance::SendMouseWheelEvent(int delta_x, int delta_y) { | 202 void ChromotingJniInstance::SendMouseWheelEvent(int delta_x, int delta_y) { |
200 if (!jni_runtime_->network_task_runner()->BelongsToCurrentThread()) { | 203 if (!jni_runtime_->network_task_runner()->BelongsToCurrentThread()) { |
201 jni_runtime_->network_task_runner()->PostTask( | 204 jni_runtime_->network_task_runner()->PostTask( |
202 FROM_HERE, | 205 FROM_HERE, |
203 base::Bind(&ChromotingJniInstance::SendMouseWheelEvent, this, | 206 base::Bind(&ChromotingJniInstance::SendMouseWheelEvent, this, |
204 delta_x, delta_y)); | 207 delta_x, delta_y)); |
205 return; | 208 return; |
206 } | 209 } |
207 | 210 |
208 protocol::MouseEvent event; | 211 protocol::MouseEvent event; |
209 event.set_wheel_delta_x(delta_x); | 212 event.set_wheel_delta_x(delta_x); |
210 event.set_wheel_delta_y(delta_y); | 213 event.set_wheel_delta_y(delta_y); |
211 connection_->input_stub()->InjectMouseEvent(event); | 214 client_->input_stub()->InjectMouseEvent(event); |
212 } | 215 } |
213 | 216 |
214 bool ChromotingJniInstance::SendKeyEvent(int key_code, bool key_down) { | 217 bool ChromotingJniInstance::SendKeyEvent(int key_code, bool key_down) { |
215 uint32 usb_key_code = AndroidKeycodeToUsbKeycode(key_code); | 218 uint32 usb_key_code = AndroidKeycodeToUsbKeycode(key_code); |
216 if (!usb_key_code) { | 219 if (!usb_key_code) { |
217 LOG(WARNING) << "Ignoring unknown keycode: " << key_code; | 220 LOG(WARNING) << "Ignoring unknown keycode: " << key_code; |
218 return false; | 221 return false; |
219 } | 222 } |
220 | 223 |
221 SendKeyEventInternal(usb_key_code, key_down); | 224 SendKeyEventInternal(usb_key_code, key_down); |
222 return true; | 225 return true; |
223 } | 226 } |
224 | 227 |
225 void ChromotingJniInstance::SendTextEvent(const std::string& text) { | 228 void ChromotingJniInstance::SendTextEvent(const std::string& text) { |
226 if (!jni_runtime_->network_task_runner()->BelongsToCurrentThread()) { | 229 if (!jni_runtime_->network_task_runner()->BelongsToCurrentThread()) { |
227 jni_runtime_->network_task_runner()->PostTask( | 230 jni_runtime_->network_task_runner()->PostTask( |
228 FROM_HERE, | 231 FROM_HERE, |
229 base::Bind(&ChromotingJniInstance::SendTextEvent, this, text)); | 232 base::Bind(&ChromotingJniInstance::SendTextEvent, this, text)); |
230 return; | 233 return; |
231 } | 234 } |
232 | 235 |
233 protocol::TextEvent event; | 236 protocol::TextEvent event; |
234 event.set_text(text); | 237 event.set_text(text); |
235 connection_->input_stub()->InjectTextEvent(event); | 238 client_->input_stub()->InjectTextEvent(event); |
236 } | 239 } |
237 | 240 |
238 void ChromotingJniInstance::RecordPaintTime(int64 paint_time_ms) { | 241 void ChromotingJniInstance::RecordPaintTime(int64 paint_time_ms) { |
239 if (!jni_runtime_->network_task_runner()->BelongsToCurrentThread()) { | 242 if (!jni_runtime_->network_task_runner()->BelongsToCurrentThread()) { |
240 jni_runtime_->network_task_runner()->PostTask( | 243 jni_runtime_->network_task_runner()->PostTask( |
241 FROM_HERE, base::Bind(&ChromotingJniInstance::RecordPaintTime, this, | 244 FROM_HERE, base::Bind(&ChromotingJniInstance::RecordPaintTime, this, |
242 paint_time_ms)); | 245 paint_time_ms)); |
243 return; | 246 return; |
244 } | 247 } |
245 | 248 |
246 if (stats_logging_enabled_) | 249 if (stats_logging_enabled_) |
247 video_renderer_->GetStats()->video_paint_ms()->Record(paint_time_ms); | 250 video_renderer_->GetStats()->video_paint_ms()->Record(paint_time_ms); |
248 } | 251 } |
249 | 252 |
250 void ChromotingJniInstance::OnConnectionState( | 253 void ChromotingJniInstance::OnConnectionState( |
251 protocol::ConnectionToHost::State state, | 254 protocol::ConnectionToHost::State state, |
252 protocol::ErrorCode error) { | 255 protocol::ErrorCode error) { |
253 DCHECK(jni_runtime_->network_task_runner()->BelongsToCurrentThread()); | 256 DCHECK(jni_runtime_->network_task_runner()->BelongsToCurrentThread()); |
254 | 257 |
255 EnableStatsLogging(state == protocol::ConnectionToHost::CONNECTED); | 258 EnableStatsLogging(state == protocol::ConnectionToHost::CONNECTED); |
256 | 259 |
257 client_status_logger_->LogSessionStateChange(state, error); | 260 client_status_logger_->LogSessionStateChange(state, error); |
258 | 261 |
259 if (create_pairing_ && state == protocol::ConnectionToHost::CONNECTED) { | 262 if (create_pairing_ && state == protocol::ConnectionToHost::CONNECTED) { |
260 protocol::PairingRequest request; | 263 protocol::PairingRequest request; |
261 DCHECK(!device_name_.empty()); | 264 DCHECK(!device_name_.empty()); |
262 request.set_client_name(device_name_); | 265 request.set_client_name(device_name_); |
263 connection_->host_stub()->RequestPairing(request); | 266 client_->host_stub()->RequestPairing(request); |
264 } | 267 } |
265 | 268 |
266 jni_runtime_->ui_task_runner()->PostTask( | 269 jni_runtime_->ui_task_runner()->PostTask( |
267 FROM_HERE, | 270 FROM_HERE, |
268 base::Bind(&ChromotingJniRuntime::ReportConnectionStatus, | 271 base::Bind(&ChromotingJniRuntime::ReportConnectionStatus, |
269 base::Unretained(jni_runtime_), | 272 base::Unretained(jni_runtime_), |
270 state, | 273 state, |
271 error)); | 274 error)); |
272 } | 275 } |
273 | 276 |
(...skipping 29 matching lines...) Expand all Loading... |
303 } | 306 } |
304 | 307 |
305 protocol::ClipboardStub* ChromotingJniInstance::GetClipboardStub() { | 308 protocol::ClipboardStub* ChromotingJniInstance::GetClipboardStub() { |
306 return this; | 309 return this; |
307 } | 310 } |
308 | 311 |
309 protocol::CursorShapeStub* ChromotingJniInstance::GetCursorShapeStub() { | 312 protocol::CursorShapeStub* ChromotingJniInstance::GetCursorShapeStub() { |
310 return this; | 313 return this; |
311 } | 314 } |
312 | 315 |
313 scoped_ptr<protocol::ThirdPartyClientAuthenticator::TokenFetcher> | |
314 ChromotingJniInstance::GetTokenFetcher(const std::string& host_public_key) { | |
315 return scoped_ptr<protocol::ThirdPartyClientAuthenticator::TokenFetcher>( | |
316 new TokenFetcherProxy( | |
317 base::Bind(&ChromotingJniInstance::FetchThirdPartyToken, | |
318 weak_factory_.GetWeakPtr()), | |
319 host_public_key)); | |
320 } | |
321 | |
322 void ChromotingJniInstance::InjectClipboardEvent( | 316 void ChromotingJniInstance::InjectClipboardEvent( |
323 const protocol::ClipboardEvent& event) { | 317 const protocol::ClipboardEvent& event) { |
324 NOTIMPLEMENTED(); | 318 NOTIMPLEMENTED(); |
325 } | 319 } |
326 | 320 |
327 void ChromotingJniInstance::SetCursorShape( | 321 void ChromotingJniInstance::SetCursorShape( |
328 const protocol::CursorShapeInfo& shape) { | 322 const protocol::CursorShapeInfo& shape) { |
329 if (!jni_runtime_->display_task_runner()->BelongsToCurrentThread()) { | 323 if (!jni_runtime_->display_task_runner()->BelongsToCurrentThread()) { |
330 jni_runtime_->display_task_runner()->PostTask( | 324 jni_runtime_->display_task_runner()->PostTask( |
331 FROM_HERE, | 325 FROM_HERE, |
(...skipping 21 matching lines...) Expand all Loading... |
353 | 347 |
354 void ChromotingJniInstance::ConnectToHostOnNetworkThread() { | 348 void ChromotingJniInstance::ConnectToHostOnNetworkThread() { |
355 DCHECK(jni_runtime_->network_task_runner()->BelongsToCurrentThread()); | 349 DCHECK(jni_runtime_->network_task_runner()->BelongsToCurrentThread()); |
356 | 350 |
357 jingle_glue::JingleThreadWrapper::EnsureForCurrentMessageLoop(); | 351 jingle_glue::JingleThreadWrapper::EnsureForCurrentMessageLoop(); |
358 | 352 |
359 client_context_.reset(new ClientContext( | 353 client_context_.reset(new ClientContext( |
360 jni_runtime_->network_task_runner().get())); | 354 jni_runtime_->network_task_runner().get())); |
361 client_context_->Start(); | 355 client_context_->Start(); |
362 | 356 |
363 connection_.reset(new protocol::ConnectionToHost(true)); | |
364 | |
365 SoftwareVideoRenderer* renderer = | 357 SoftwareVideoRenderer* renderer = |
366 new SoftwareVideoRenderer(client_context_->main_task_runner(), | 358 new SoftwareVideoRenderer(client_context_->main_task_runner(), |
367 client_context_->decode_task_runner(), | 359 client_context_->decode_task_runner(), |
368 frame_consumer_); | 360 frame_consumer_); |
369 view_->set_frame_producer(renderer); | 361 view_->set_frame_producer(renderer); |
370 video_renderer_.reset(renderer); | 362 video_renderer_.reset(renderer); |
371 | 363 |
372 client_.reset(new ChromotingClient( | 364 client_.reset(new ChromotingClient(client_context_.get(), |
373 client_config_, client_context_.get(), connection_.get(), | 365 this, |
374 this, video_renderer_.get(), scoped_ptr<AudioPlayer>())); | 366 video_renderer_.get(), |
375 | 367 scoped_ptr<AudioPlayer>())); |
376 | 368 |
377 signaling_.reset(new XmppSignalStrategy( | 369 signaling_.reset(new XmppSignalStrategy( |
378 net::ClientSocketFactory::GetDefaultFactory(), | 370 net::ClientSocketFactory::GetDefaultFactory(), |
379 jni_runtime_->url_requester(), xmpp_config_)); | 371 jni_runtime_->url_requester(), xmpp_config_)); |
380 | 372 |
381 client_status_logger_.reset( | 373 client_status_logger_.reset( |
382 new ClientStatusLogger(ServerLogEntry::ME2ME, | 374 new ClientStatusLogger(ServerLogEntry::ME2ME, |
383 signaling_.get(), | 375 signaling_.get(), |
384 ServiceUrls::GetInstance()->directory_bot_jid())); | 376 ServiceUrls::GetInstance()->directory_bot_jid())); |
385 | 377 |
386 NetworkSettings network_settings(NetworkSettings::NAT_TRAVERSAL_FULL); | 378 NetworkSettings network_settings(NetworkSettings::NAT_TRAVERSAL_FULL); |
387 | 379 |
388 // Use Chrome's network stack to allocate ports for peer-to-peer channels. | 380 // Use Chrome's network stack to allocate ports for peer-to-peer channels. |
389 scoped_ptr<ChromiumPortAllocator> port_allocator( | 381 scoped_ptr<ChromiumPortAllocator> port_allocator( |
390 ChromiumPortAllocator::Create(jni_runtime_->url_requester(), | 382 ChromiumPortAllocator::Create(jni_runtime_->url_requester(), |
391 network_settings)); | 383 network_settings)); |
392 | 384 |
393 scoped_ptr<protocol::TransportFactory> transport_factory( | 385 scoped_ptr<protocol::TransportFactory> transport_factory( |
394 new protocol::LibjingleTransportFactory( | 386 new protocol::LibjingleTransportFactory( |
395 signaling_.get(), | 387 signaling_.get(), |
396 port_allocator.PassAs<cricket::HttpPortAllocatorBase>(), | 388 port_allocator.PassAs<cricket::HttpPortAllocatorBase>(), |
397 network_settings)); | 389 network_settings)); |
398 | 390 |
399 client_->Start(signaling_.get(), transport_factory.Pass()); | 391 client_->Start(signaling_.get(), authenticator_.Pass(), |
| 392 transport_factory.Pass(), host_jid_, std::string()); |
400 } | 393 } |
401 | 394 |
402 void ChromotingJniInstance::DisconnectFromHostOnNetworkThread() { | 395 void ChromotingJniInstance::DisconnectFromHostOnNetworkThread() { |
403 DCHECK(jni_runtime_->network_task_runner()->BelongsToCurrentThread()); | 396 DCHECK(jni_runtime_->network_task_runner()->BelongsToCurrentThread()); |
404 | 397 |
405 host_id_.clear(); | 398 host_id_.clear(); |
406 | 399 |
407 stats_logging_enabled_ = false; | 400 stats_logging_enabled_ = false; |
408 | 401 |
409 // |client_| must be torn down before |signaling_|. | 402 // |client_| must be torn down before |signaling_|. |
410 connection_.reset(); | 403 client_.reset(); |
411 client_.reset(); | 404 client_.reset(); |
412 client_status_logger_.reset(); | 405 client_status_logger_.reset(); |
413 } | 406 } |
414 | 407 |
415 void ChromotingJniInstance::FetchSecret( | 408 void ChromotingJniInstance::FetchSecret( |
416 bool pairable, | 409 bool pairable, |
417 const protocol::SecretFetchedCallback& callback) { | 410 const protocol::SecretFetchedCallback& callback) { |
418 if (!jni_runtime_->ui_task_runner()->BelongsToCurrentThread()) { | 411 if (!jni_runtime_->ui_task_runner()->BelongsToCurrentThread()) { |
419 jni_runtime_->ui_task_runner()->PostTask( | 412 jni_runtime_->ui_task_runner()->PostTask( |
420 FROM_HERE, base::Bind(&ChromotingJniInstance::FetchSecret, | 413 FROM_HERE, base::Bind(&ChromotingJniInstance::FetchSecret, |
421 this, pairable, callback)); | 414 this, pairable, callback)); |
422 return; | 415 return; |
423 } | 416 } |
424 | 417 |
425 if (!client_config_.client_pairing_id.empty()) { | 418 // Delete pairing credentials if they exist. |
426 // We attempted to connect using an existing pairing that was rejected. | 419 jni_runtime_->CommitPairingCredentials(host_id_, "", ""); |
427 // Unless we forget about the stale credentials, we'll continue trying them. | |
428 jni_runtime_->CommitPairingCredentials(host_id_, "", ""); | |
429 } | |
430 | 420 |
431 pin_callback_ = callback; | 421 pin_callback_ = callback; |
432 jni_runtime_->DisplayAuthenticationPrompt(pairable); | 422 jni_runtime_->DisplayAuthenticationPrompt(pairable); |
433 } | 423 } |
434 | 424 |
435 void ChromotingJniInstance::SetDeviceName(const std::string& device_name) { | 425 void ChromotingJniInstance::SetDeviceName(const std::string& device_name) { |
436 if (!jni_runtime_->network_task_runner()->BelongsToCurrentThread()) { | 426 if (!jni_runtime_->network_task_runner()->BelongsToCurrentThread()) { |
437 jni_runtime_->network_task_runner()->PostTask( | 427 jni_runtime_->network_task_runner()->PostTask( |
438 FROM_HERE, base::Bind(&ChromotingJniInstance::SetDeviceName, this, | 428 FROM_HERE, base::Bind(&ChromotingJniInstance::SetDeviceName, this, |
439 device_name)); | 429 device_name)); |
440 return; | 430 return; |
441 } | 431 } |
442 | 432 |
443 device_name_ = device_name; | 433 device_name_ = device_name; |
444 } | 434 } |
445 | 435 |
446 void ChromotingJniInstance::SendKeyEventInternal(int usb_key_code, | 436 void ChromotingJniInstance::SendKeyEventInternal(int usb_key_code, |
447 bool key_down) { | 437 bool key_down) { |
448 if (!jni_runtime_->network_task_runner()->BelongsToCurrentThread()) { | 438 if (!jni_runtime_->network_task_runner()->BelongsToCurrentThread()) { |
449 jni_runtime_->network_task_runner()->PostTask( | 439 jni_runtime_->network_task_runner()->PostTask( |
450 FROM_HERE, base::Bind(&ChromotingJniInstance::SendKeyEventInternal, | 440 FROM_HERE, base::Bind(&ChromotingJniInstance::SendKeyEventInternal, |
451 this, usb_key_code, key_down)); | 441 this, usb_key_code, key_down)); |
452 return; | 442 return; |
453 } | 443 } |
454 | 444 |
455 | 445 |
456 protocol::KeyEvent event; | 446 protocol::KeyEvent event; |
457 event.set_usb_keycode(usb_key_code); | 447 event.set_usb_keycode(usb_key_code); |
458 event.set_pressed(key_down); | 448 event.set_pressed(key_down); |
459 connection_->input_stub()->InjectKeyEvent(event); | 449 client_->input_stub()->InjectKeyEvent(event); |
460 } | 450 } |
461 | 451 |
462 void ChromotingJniInstance::EnableStatsLogging(bool enabled) { | 452 void ChromotingJniInstance::EnableStatsLogging(bool enabled) { |
463 DCHECK(jni_runtime_->network_task_runner()->BelongsToCurrentThread()); | 453 DCHECK(jni_runtime_->network_task_runner()->BelongsToCurrentThread()); |
464 | 454 |
465 if (enabled && !stats_logging_enabled_) { | 455 if (enabled && !stats_logging_enabled_) { |
466 jni_runtime_->network_task_runner()->PostDelayedTask( | 456 jni_runtime_->network_task_runner()->PostDelayedTask( |
467 FROM_HERE, base::Bind(&ChromotingJniInstance::LogPerfStats, this), | 457 FROM_HERE, base::Bind(&ChromotingJniInstance::LogPerfStats, this), |
468 base::TimeDelta::FromMilliseconds(kPerfStatsIntervalMs)); | 458 base::TimeDelta::FromMilliseconds(kPerfStatsIntervalMs)); |
469 } | 459 } |
(...skipping 19 matching lines...) Expand all Loading... |
489 stats->round_trip_ms()->Average()); | 479 stats->round_trip_ms()->Average()); |
490 | 480 |
491 client_status_logger_->LogStatistics(stats); | 481 client_status_logger_->LogStatistics(stats); |
492 | 482 |
493 jni_runtime_->network_task_runner()->PostDelayedTask( | 483 jni_runtime_->network_task_runner()->PostDelayedTask( |
494 FROM_HERE, base::Bind(&ChromotingJniInstance::LogPerfStats, this), | 484 FROM_HERE, base::Bind(&ChromotingJniInstance::LogPerfStats, this), |
495 base::TimeDelta::FromMilliseconds(kPerfStatsIntervalMs)); | 485 base::TimeDelta::FromMilliseconds(kPerfStatsIntervalMs)); |
496 } | 486 } |
497 | 487 |
498 } // namespace remoting | 488 } // namespace remoting |
OLD | NEW |