OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/plugin/chromoting_instance.h" | 5 #include "remoting/client/plugin/chromoting_instance.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 16 matching lines...) Expand all Loading... | |
27 #include "ppapi/cpp/input_event.h" | 27 #include "ppapi/cpp/input_event.h" |
28 #include "ppapi/cpp/mouse_cursor.h" | 28 #include "ppapi/cpp/mouse_cursor.h" |
29 #include "ppapi/cpp/rect.h" | 29 #include "ppapi/cpp/rect.h" |
30 #include "remoting/base/constants.h" | 30 #include "remoting/base/constants.h" |
31 #include "remoting/base/util.h" | 31 #include "remoting/base/util.h" |
32 #include "remoting/client/chromoting_client.h" | 32 #include "remoting/client/chromoting_client.h" |
33 #include "remoting/client/client_config.h" | 33 #include "remoting/client/client_config.h" |
34 #include "remoting/client/frame_consumer_proxy.h" | 34 #include "remoting/client/frame_consumer_proxy.h" |
35 #include "remoting/client/plugin/pepper_audio_player.h" | 35 #include "remoting/client/plugin/pepper_audio_player.h" |
36 #include "remoting/client/plugin/pepper_input_handler.h" | 36 #include "remoting/client/plugin/pepper_input_handler.h" |
37 #include "remoting/client/plugin/pepper_pin_fetcher.h" | |
37 #include "remoting/client/plugin/pepper_port_allocator.h" | 38 #include "remoting/client/plugin/pepper_port_allocator.h" |
38 #include "remoting/client/plugin/pepper_view.h" | 39 #include "remoting/client/plugin/pepper_view.h" |
39 #include "remoting/client/plugin/pepper_xmpp_proxy.h" | 40 #include "remoting/client/plugin/pepper_xmpp_proxy.h" |
40 #include "remoting/client/rectangle_update_decoder.h" | 41 #include "remoting/client/rectangle_update_decoder.h" |
41 #include "remoting/protocol/connection_to_host.h" | 42 #include "remoting/protocol/connection_to_host.h" |
42 #include "remoting/protocol/host_stub.h" | 43 #include "remoting/protocol/host_stub.h" |
43 #include "remoting/protocol/libjingle_transport_factory.h" | 44 #include "remoting/protocol/libjingle_transport_factory.h" |
44 | 45 |
45 // Windows defines 'PostMessage', so we have to undef it. | 46 // Windows defines 'PostMessage', so we have to undef it. |
46 #if defined(PostMessage) | 47 #if defined(PostMessage) |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
127 g_logging_instance = LAZY_INSTANCE_INITIALIZER; | 128 g_logging_instance = LAZY_INSTANCE_INITIALIZER; |
128 base::LazyInstance<base::Lock>::Leaky | 129 base::LazyInstance<base::Lock>::Leaky |
129 g_logging_lock = LAZY_INSTANCE_INITIALIZER; | 130 g_logging_lock = LAZY_INSTANCE_INITIALIZER; |
130 logging::LogMessageHandlerFunction g_logging_old_handler = NULL; | 131 logging::LogMessageHandlerFunction g_logging_old_handler = NULL; |
131 | 132 |
132 } // namespace | 133 } // namespace |
133 | 134 |
134 // String sent in the "hello" message to the plugin to describe features. | 135 // String sent in the "hello" message to the plugin to describe features. |
135 const char ChromotingInstance::kApiFeatures[] = | 136 const char ChromotingInstance::kApiFeatures[] = |
136 "highQualityScaling injectKeyEvent sendClipboardItem remapKey trapKey " | 137 "highQualityScaling injectKeyEvent sendClipboardItem remapKey trapKey " |
137 "notifyClientDimensions notifyClientResolution pauseVideo pauseAudio"; | 138 "notifyClientDimensions notifyClientResolution pauseVideo pauseAudio " |
139 "onPinFetched useAsyncPinDialog"; | |
Sergey Ulanov
2013/03/17 21:29:21
Don't need two separate features
rmsousa
2013/03/18 21:07:26
Done.
| |
138 | 140 |
139 bool ChromotingInstance::ParseAuthMethods(const std::string& auth_methods_str, | 141 bool ChromotingInstance::ParseAuthMethods(const std::string& auth_methods_str, |
140 ClientConfig* config) { | 142 ClientConfig* config) { |
141 std::vector<std::string> auth_methods; | 143 std::vector<std::string> auth_methods; |
142 base::SplitString(auth_methods_str, ',', &auth_methods); | 144 base::SplitString(auth_methods_str, ',', &auth_methods); |
143 for (std::vector<std::string>::iterator it = auth_methods.begin(); | 145 for (std::vector<std::string>::iterator it = auth_methods.begin(); |
144 it != auth_methods.end(); ++it) { | 146 it != auth_methods.end(); ++it) { |
145 protocol::AuthenticationMethod authentication_method = | 147 protocol::AuthenticationMethod authentication_method = |
146 protocol::AuthenticationMethod::FromString(*it); | 148 protocol::AuthenticationMethod::FromString(*it); |
147 if (authentication_method.is_valid()) | 149 if (authentication_method.is_valid()) |
(...skipping 16 matching lines...) Expand all Loading... | |
164 input_tracker_(&mouse_input_filter_), | 166 input_tracker_(&mouse_input_filter_), |
165 #if defined(OS_MACOSX) | 167 #if defined(OS_MACOSX) |
166 // On Mac we need an extra filter to inject missing keyup events. | 168 // On Mac we need an extra filter to inject missing keyup events. |
167 // See remoting/client/plugin/mac_key_event_processor.h for more details. | 169 // See remoting/client/plugin/mac_key_event_processor.h for more details. |
168 mac_key_event_processor_(&input_tracker_), | 170 mac_key_event_processor_(&input_tracker_), |
169 key_mapper_(&mac_key_event_processor_), | 171 key_mapper_(&mac_key_event_processor_), |
170 #else | 172 #else |
171 key_mapper_(&input_tracker_), | 173 key_mapper_(&input_tracker_), |
172 #endif | 174 #endif |
173 input_handler_(&key_mapper_), | 175 input_handler_(&key_mapper_), |
176 use_async_pin_dialog_(false), | |
174 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { | 177 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { |
175 RequestInputEvents(PP_INPUTEVENT_CLASS_MOUSE | PP_INPUTEVENT_CLASS_WHEEL); | 178 RequestInputEvents(PP_INPUTEVENT_CLASS_MOUSE | PP_INPUTEVENT_CLASS_WHEEL); |
176 RequestFilteringInputEvents(PP_INPUTEVENT_CLASS_KEYBOARD); | 179 RequestFilteringInputEvents(PP_INPUTEVENT_CLASS_KEYBOARD); |
177 | 180 |
178 // Resister this instance to handle debug log messsages. | 181 // Resister this instance to handle debug log messsages. |
179 RegisterLoggingInstance(); | 182 RegisterLoggingInstance(); |
180 | 183 |
181 // Send hello message. | 184 // Send hello message. |
182 scoped_ptr<base::DictionaryValue> data(new base::DictionaryValue()); | 185 scoped_ptr<base::DictionaryValue> data(new base::DictionaryValue()); |
183 data->SetInteger("apiVersion", kApiVersion); | 186 data->SetInteger("apiVersion", kApiVersion); |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
270 if (!data->GetString("hostJid", &config.host_jid) || | 273 if (!data->GetString("hostJid", &config.host_jid) || |
271 !data->GetString("hostPublicKey", &config.host_public_key) || | 274 !data->GetString("hostPublicKey", &config.host_public_key) || |
272 !data->GetString("localJid", &config.local_jid) || | 275 !data->GetString("localJid", &config.local_jid) || |
273 !data->GetString("sharedSecret", &config.shared_secret) || | 276 !data->GetString("sharedSecret", &config.shared_secret) || |
274 !data->GetString("authenticationMethods", &auth_methods) || | 277 !data->GetString("authenticationMethods", &auth_methods) || |
275 !ParseAuthMethods(auth_methods, &config) || | 278 !ParseAuthMethods(auth_methods, &config) || |
276 !data->GetString("authenticationTag", &config.authentication_tag)) { | 279 !data->GetString("authenticationTag", &config.authentication_tag)) { |
277 LOG(ERROR) << "Invalid connect() data."; | 280 LOG(ERROR) << "Invalid connect() data."; |
278 return; | 281 return; |
279 } | 282 } |
280 | |
281 Connect(config); | 283 Connect(config); |
282 } else if (method == "disconnect") { | 284 } else if (method == "disconnect") { |
283 Disconnect(); | 285 Disconnect(); |
284 } else if (method == "incomingIq") { | 286 } else if (method == "incomingIq") { |
285 std::string iq; | 287 std::string iq; |
286 if (!data->GetString("iq", &iq)) { | 288 if (!data->GetString("iq", &iq)) { |
287 LOG(ERROR) << "Invalid onIq() data."; | 289 LOG(ERROR) << "Invalid onIq() data."; |
288 return; | 290 return; |
289 } | 291 } |
290 OnIncomingIq(iq); | 292 OnIncomingIq(iq); |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
366 return; | 368 return; |
367 } | 369 } |
368 PauseVideo(pause); | 370 PauseVideo(pause); |
369 } else if (method == "pauseAudio") { | 371 } else if (method == "pauseAudio") { |
370 bool pause = false; | 372 bool pause = false; |
371 if (!data->GetBoolean("pause", &pause)) { | 373 if (!data->GetBoolean("pause", &pause)) { |
372 LOG(ERROR) << "Invalid pauseAudio."; | 374 LOG(ERROR) << "Invalid pauseAudio."; |
373 return; | 375 return; |
374 } | 376 } |
375 PauseAudio(pause); | 377 PauseAudio(pause); |
378 } else if (method == "useAsyncPinDialog") { | |
379 use_async_pin_dialog_ = true; | |
380 } else if (method == "onPinFetched") { | |
381 std::string pin; | |
382 if (!data->GetString("pin", &pin)) { | |
383 LOG(ERROR) << "Invalid onPinFetched."; | |
384 return; | |
385 } | |
386 OnPinFetched(pin); | |
376 } | 387 } |
377 } | 388 } |
378 | 389 |
379 void ChromotingInstance::DidChangeView(const pp::View& view) { | 390 void ChromotingInstance::DidChangeView(const pp::View& view) { |
380 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); | 391 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
381 | 392 |
382 plugin_view_ = view; | 393 plugin_view_ = view; |
383 if (view_) { | 394 if (view_) { |
384 view_->SetView(view); | 395 view_->SetView(view); |
385 mouse_input_filter_.set_input_size(view_->get_view_size_dips()); | 396 mouse_input_filter_.set_input_size(view_->get_view_size_dips()); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
417 data->SetString("error", ConnectionErrorToString(error)); | 428 data->SetString("error", ConnectionErrorToString(error)); |
418 PostChromotingMessage("onConnectionStatus", data.Pass()); | 429 PostChromotingMessage("onConnectionStatus", data.Pass()); |
419 } | 430 } |
420 | 431 |
421 void ChromotingInstance::OnConnectionReady(bool ready) { | 432 void ChromotingInstance::OnConnectionReady(bool ready) { |
422 scoped_ptr<base::DictionaryValue> data(new base::DictionaryValue()); | 433 scoped_ptr<base::DictionaryValue> data(new base::DictionaryValue()); |
423 data->SetBoolean("ready", ready); | 434 data->SetBoolean("ready", ready); |
424 PostChromotingMessage("onConnectionReady", data.Pass()); | 435 PostChromotingMessage("onConnectionReady", data.Pass()); |
425 } | 436 } |
426 | 437 |
438 scoped_ptr<protocol::PinFetcher> ChromotingInstance::CreatePinFetcher() { | |
439 return scoped_ptr<protocol::PinFetcher>(new PepperPinFetcher(AsWeakPtr())); | |
440 } | |
441 | |
442 void ChromotingInstance::FetchPin(base::WeakPtr<PepperPinFetcher> pin_fetcher) { | |
443 // Once the Session object calls this function, it won't continue the | |
444 // authentication until the callback is called (or connection is canceled). | |
445 // So, it's impossible to reach this with a pin fetcher already registered. | |
446 DCHECK(!pin_fetcher_); | |
447 pin_fetcher_ = pin_fetcher; | |
448 scoped_ptr<base::DictionaryValue> data(new base::DictionaryValue()); | |
449 PostChromotingMessage("fetchPin", data.Pass()); | |
450 } | |
451 | |
427 protocol::ClipboardStub* ChromotingInstance::GetClipboardStub() { | 452 protocol::ClipboardStub* ChromotingInstance::GetClipboardStub() { |
428 // TODO(sergeyu): Move clipboard handling to a separate class. | 453 // TODO(sergeyu): Move clipboard handling to a separate class. |
429 // crbug.com/138108 | 454 // crbug.com/138108 |
430 return this; | 455 return this; |
431 } | 456 } |
432 | 457 |
433 protocol::CursorShapeStub* ChromotingInstance::GetCursorShapeStub() { | 458 protocol::CursorShapeStub* ChromotingInstance::GetCursorShapeStub() { |
434 // TODO(sergeyu): Move cursor shape code to a separate class. | 459 // TODO(sergeyu): Move cursor shape code to a separate class. |
435 // crbug.com/138108 | 460 // crbug.com/138108 |
436 return this; | 461 return this; |
437 } | 462 } |
438 | 463 |
464 protocol::PinFetcherFactory* ChromotingInstance::GetPinFetcherFactory() { | |
465 // TODO(rmsousa): Move pin fetcher code to a separate class. | |
Sergey Ulanov
2013/03/17 21:29:21
Isn't it already in a separate class?
rmsousa
2013/03/18 21:07:26
Done.
| |
466 if (use_async_pin_dialog_) { | |
467 return this; | |
468 } else { | |
469 return NULL; | |
470 } | |
471 } | |
472 | |
439 void ChromotingInstance::InjectClipboardEvent( | 473 void ChromotingInstance::InjectClipboardEvent( |
440 const protocol::ClipboardEvent& event) { | 474 const protocol::ClipboardEvent& event) { |
441 scoped_ptr<base::DictionaryValue> data(new base::DictionaryValue()); | 475 scoped_ptr<base::DictionaryValue> data(new base::DictionaryValue()); |
442 data->SetString("mimeType", event.mime_type()); | 476 data->SetString("mimeType", event.mime_type()); |
443 data->SetString("item", event.data()); | 477 data->SetString("item", event.data()); |
444 PostChromotingMessage("injectClipboardItem", data.Pass()); | 478 PostChromotingMessage("injectClipboardItem", data.Pass()); |
445 } | 479 } |
446 | 480 |
447 void ChromotingInstance::SetCursorShape( | 481 void ChromotingInstance::SetCursorShape( |
448 const protocol::CursorShapeInfo& cursor_shape) { | 482 const protocol::CursorShapeInfo& cursor_shape) { |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
643 | 677 |
644 void ChromotingInstance::PauseAudio(bool pause) { | 678 void ChromotingInstance::PauseAudio(bool pause) { |
645 if (!IsConnected()) { | 679 if (!IsConnected()) { |
646 return; | 680 return; |
647 } | 681 } |
648 protocol::AudioControl audio_control; | 682 protocol::AudioControl audio_control; |
649 audio_control.set_enable(!pause); | 683 audio_control.set_enable(!pause); |
650 host_connection_->host_stub()->ControlAudio(audio_control); | 684 host_connection_->host_stub()->ControlAudio(audio_control); |
651 } | 685 } |
652 | 686 |
687 void ChromotingInstance::OnPinFetched(const std::string& shared_secret) { | |
688 if (pin_fetcher_) { | |
689 pin_fetcher_->OnPinFetched(shared_secret); | |
690 pin_fetcher_.reset(); | |
691 } else { | |
692 VLOG(1) << | |
693 "Ignored OnPinFetched received without a pending fetch."; | |
694 } | |
695 } | |
696 | |
653 ChromotingStats* ChromotingInstance::GetStats() { | 697 ChromotingStats* ChromotingInstance::GetStats() { |
654 if (!client_.get()) | 698 if (!client_.get()) |
655 return NULL; | 699 return NULL; |
656 return client_->GetStats(); | 700 return client_->GetStats(); |
657 } | 701 } |
658 | 702 |
659 void ChromotingInstance::PostChromotingMessage( | 703 void ChromotingInstance::PostChromotingMessage( |
660 const std::string& method, | 704 const std::string& method, |
661 scoped_ptr<base::DictionaryValue> data) { | 705 scoped_ptr<base::DictionaryValue> data) { |
662 scoped_ptr<base::DictionaryValue> message(new base::DictionaryValue()); | 706 scoped_ptr<base::DictionaryValue> message(new base::DictionaryValue()); |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
819 url_components.scheme.len); | 863 url_components.scheme.len); |
820 return url_scheme == kChromeExtensionUrlScheme; | 864 return url_scheme == kChromeExtensionUrlScheme; |
821 } | 865 } |
822 | 866 |
823 bool ChromotingInstance::IsConnected() { | 867 bool ChromotingInstance::IsConnected() { |
824 return host_connection_.get() && | 868 return host_connection_.get() && |
825 (host_connection_->state() == protocol::ConnectionToHost::CONNECTED); | 869 (host_connection_->state() == protocol::ConnectionToHost::CONNECTED); |
826 } | 870 } |
827 | 871 |
828 } // namespace remoting | 872 } // namespace remoting |
OLD | NEW |