| 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 <algorithm> | 7 #include <algorithm> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #if defined(OS_NACL) | |
| 12 #include <sys/mount.h> | |
| 13 #include <nacl_io/nacl_io.h> | |
| 14 #endif | |
| 15 | |
| 16 #include "base/bind.h" | 11 #include "base/bind.h" |
| 17 #include "base/callback.h" | 12 #include "base/callback.h" |
| 18 #include "base/json/json_reader.h" | 13 #include "base/json/json_reader.h" |
| 19 #include "base/json/json_writer.h" | 14 #include "base/json/json_writer.h" |
| 20 #include "base/lazy_instance.h" | 15 #include "base/lazy_instance.h" |
| 21 #include "base/logging.h" | 16 #include "base/logging.h" |
| 22 #include "base/strings/string_split.h" | 17 #include "base/strings/string_split.h" |
| 23 #include "base/strings/stringprintf.h" | 18 #include "base/strings/stringprintf.h" |
| 24 #include "base/synchronization/lock.h" | 19 #include "base/synchronization/lock.h" |
| 25 #include "base/threading/thread.h" | 20 #include "base/threading/thread.h" |
| 26 #include "base/values.h" | 21 #include "base/values.h" |
| 27 #include "crypto/random.h" | 22 #include "crypto/random.h" |
| 28 #include "jingle/glue/thread_wrapper.h" | 23 #include "jingle/glue/thread_wrapper.h" |
| 29 #include "media/base/yuv_convert.h" | 24 #include "media/base/media.h" |
| 30 #include "net/socket/ssl_server_socket.h" | 25 #include "net/socket/ssl_server_socket.h" |
| 31 #include "ppapi/cpp/completion_callback.h" | 26 #include "ppapi/cpp/completion_callback.h" |
| 32 #include "ppapi/cpp/dev/url_util_dev.h" | 27 #include "ppapi/cpp/dev/url_util_dev.h" |
| 33 #include "ppapi/cpp/image_data.h" | 28 #include "ppapi/cpp/image_data.h" |
| 34 #include "ppapi/cpp/input_event.h" | 29 #include "ppapi/cpp/input_event.h" |
| 35 #include "ppapi/cpp/rect.h" | 30 #include "ppapi/cpp/rect.h" |
| 36 #include "ppapi/cpp/var_array_buffer.h" | 31 #include "ppapi/cpp/var_array_buffer.h" |
| 37 #include "ppapi/cpp/var_dictionary.h" | 32 #include "ppapi/cpp/var_dictionary.h" |
| 38 #include "remoting/base/constants.h" | 33 #include "remoting/base/constants.h" |
| 39 #include "remoting/base/util.h" | 34 #include "remoting/base/util.h" |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 208 initialized_(false), | 203 initialized_(false), |
| 209 plugin_task_runner_(new PluginThreadTaskRunner(&plugin_thread_delegate_)), | 204 plugin_task_runner_(new PluginThreadTaskRunner(&plugin_thread_delegate_)), |
| 210 context_(plugin_task_runner_.get()), | 205 context_(plugin_task_runner_.get()), |
| 211 input_tracker_(&mouse_input_filter_), | 206 input_tracker_(&mouse_input_filter_), |
| 212 key_mapper_(&input_tracker_), | 207 key_mapper_(&input_tracker_), |
| 213 normalizing_input_filter_(CreateNormalizingInputFilter(&key_mapper_)), | 208 normalizing_input_filter_(CreateNormalizingInputFilter(&key_mapper_)), |
| 214 input_handler_(this, normalizing_input_filter_.get()), | 209 input_handler_(this, normalizing_input_filter_.get()), |
| 215 use_async_pin_dialog_(false), | 210 use_async_pin_dialog_(false), |
| 216 use_media_source_rendering_(false), | 211 use_media_source_rendering_(false), |
| 217 weak_factory_(this) { | 212 weak_factory_(this) { |
| 218 #if defined(OS_NACL) | |
| 219 // In NaCl global resources need to be initialized differently because they | |
| 220 // are not shared with Chrome. | |
| 221 thread_task_runner_handle_.reset( | |
| 222 new base::ThreadTaskRunnerHandle(plugin_task_runner_)); | |
| 223 thread_wrapper_.reset( | |
| 224 new jingle_glue::JingleThreadWrapper(plugin_task_runner_)); | |
| 225 media::InitializeCPUSpecificYUVConversions(); | |
| 226 #else | |
| 227 jingle_glue::JingleThreadWrapper::EnsureForCurrentMessageLoop(); | |
| 228 #endif | |
| 229 | |
| 230 #if defined(OS_NACL) | |
| 231 nacl_io_init_ppapi(pp_instance, pp::Module::Get()->get_browser_interface()); | |
| 232 mount("", "/etc", "memfs", 0, ""); | |
| 233 mount("", "/usr", "memfs", 0, ""); | |
| 234 #endif | |
| 235 | |
| 236 RequestInputEvents(PP_INPUTEVENT_CLASS_MOUSE | PP_INPUTEVENT_CLASS_WHEEL); | 213 RequestInputEvents(PP_INPUTEVENT_CLASS_MOUSE | PP_INPUTEVENT_CLASS_WHEEL); |
| 237 RequestFilteringInputEvents(PP_INPUTEVENT_CLASS_KEYBOARD); | 214 RequestFilteringInputEvents(PP_INPUTEVENT_CLASS_KEYBOARD); |
| 238 | 215 |
| 239 // Resister this instance to handle debug log messsages. | 216 // Resister this instance to handle debug log messsages. |
| 240 RegisterLoggingInstance(); | 217 RegisterLoggingInstance(); |
| 241 | 218 |
| 242 #if defined(USE_OPENSSL) | 219 #if defined(USE_OPENSSL) |
| 243 // Initialize random seed for libjingle. It's necessary only with OpenSSL. | 220 // Initialize random seed for libjingle. It's necessary only with OpenSSL. |
| 244 char random_seed[kRandomSeedSize]; | 221 char random_seed[kRandomSeedSize]; |
| 245 crypto::RandBytes(random_seed, sizeof(random_seed)); | 222 crypto::RandBytes(random_seed, sizeof(random_seed)); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 280 } | 257 } |
| 281 | 258 |
| 282 bool ChromotingInstance::Init(uint32_t argc, | 259 bool ChromotingInstance::Init(uint32_t argc, |
| 283 const char* argn[], | 260 const char* argn[], |
| 284 const char* argv[]) { | 261 const char* argv[]) { |
| 285 CHECK(!initialized_); | 262 CHECK(!initialized_); |
| 286 initialized_ = true; | 263 initialized_ = true; |
| 287 | 264 |
| 288 VLOG(1) << "Started ChromotingInstance::Init"; | 265 VLOG(1) << "Started ChromotingInstance::Init"; |
| 289 | 266 |
| 290 // Check that the calling content is part of an app or extension. This is only | 267 // Check to make sure the media library is initialized. |
| 291 // necessary for non-PNaCl version of the plugin. Also PPB_URLUtil_Dev doesn't | 268 // http://crbug.com/91521. |
| 292 // work in NaCl at the moment so the check fails in NaCl builds. | 269 if (!media::IsMediaLibraryInitialized()) { |
| 293 #if !defined(OS_NACL) | 270 LOG(ERROR) << "Media library not initialized."; |
| 271 return false; |
| 272 } |
| 273 |
| 274 // Check that the calling content is part of an app or extension. |
| 294 if (!IsCallerAppOrExtension()) { | 275 if (!IsCallerAppOrExtension()) { |
| 295 LOG(ERROR) << "Not an app or extension"; | 276 LOG(ERROR) << "Not an app or extension"; |
| 296 return false; | 277 return false; |
| 297 } | 278 } |
| 298 #endif | |
| 299 | 279 |
| 300 // Start all the threads. | 280 // Start all the threads. |
| 301 context_.Start(); | 281 context_.Start(); |
| 302 | 282 |
| 303 return true; | 283 return true; |
| 304 } | 284 } |
| 305 | 285 |
| 306 void ChromotingInstance::HandleMessage(const pp::Var& message) { | 286 void ChromotingInstance::HandleMessage(const pp::Var& message) { |
| 307 if (!message.is_string()) { | 287 if (!message.is_string()) { |
| 308 LOG(ERROR) << "Received a message that is not a string."; | 288 LOG(ERROR) << "Received a message that is not a string."; |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 358 } else if (method == "allowMouseLock") { | 338 } else if (method == "allowMouseLock") { |
| 359 HandleAllowMouseLockMessage(); | 339 HandleAllowMouseLockMessage(); |
| 360 } else if (method == "enableMediaSourceRendering") { | 340 } else if (method == "enableMediaSourceRendering") { |
| 361 HandleEnableMediaSourceRendering(); | 341 HandleEnableMediaSourceRendering(); |
| 362 } | 342 } |
| 363 } | 343 } |
| 364 | 344 |
| 365 void ChromotingInstance::DidChangeFocus(bool has_focus) { | 345 void ChromotingInstance::DidChangeFocus(bool has_focus) { |
| 366 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); | 346 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
| 367 | 347 |
| 368 if (!IsConnected()) | |
| 369 return; | |
| 370 | |
| 371 input_handler_.DidChangeFocus(has_focus); | 348 input_handler_.DidChangeFocus(has_focus); |
| 372 } | 349 } |
| 373 | 350 |
| 374 void ChromotingInstance::DidChangeView(const pp::View& view) { | 351 void ChromotingInstance::DidChangeView(const pp::View& view) { |
| 375 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); | 352 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
| 376 | 353 |
| 377 plugin_view_ = view; | 354 plugin_view_ = view; |
| 378 mouse_input_filter_.set_input_size( | 355 mouse_input_filter_.set_input_size( |
| 379 webrtc::DesktopSize(view.GetRect().width(), view.GetRect().height())); | 356 webrtc::DesktopSize(view.GetRect().width(), view.GetRect().height())); |
| 380 | 357 |
| (...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 643 } | 620 } |
| 644 } | 621 } |
| 645 | 622 |
| 646 ConnectWithConfig(config, local_jid); | 623 ConnectWithConfig(config, local_jid); |
| 647 } | 624 } |
| 648 | 625 |
| 649 void ChromotingInstance::ConnectWithConfig(const ClientConfig& config, | 626 void ChromotingInstance::ConnectWithConfig(const ClientConfig& config, |
| 650 const std::string& local_jid) { | 627 const std::string& local_jid) { |
| 651 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); | 628 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
| 652 | 629 |
| 630 jingle_glue::JingleThreadWrapper::EnsureForCurrentMessageLoop(); |
| 631 |
| 653 if (use_media_source_rendering_) { | 632 if (use_media_source_rendering_) { |
| 654 video_renderer_.reset(new MediaSourceVideoRenderer(this)); | 633 video_renderer_.reset(new MediaSourceVideoRenderer(this)); |
| 655 } else { | 634 } else { |
| 656 view_.reset(new PepperView(this, &context_)); | 635 view_.reset(new PepperView(this, &context_)); |
| 657 view_weak_factory_.reset( | 636 view_weak_factory_.reset( |
| 658 new base::WeakPtrFactory<FrameConsumer>(view_.get())); | 637 new base::WeakPtrFactory<FrameConsumer>(view_.get())); |
| 659 | 638 |
| 660 // SoftwareVideoRenderer runs on a separate thread so for now we wrap | 639 // SoftwareVideoRenderer runs on a separate thread so for now we wrap |
| 661 // PepperView with a ref-counted proxy object. | 640 // PepperView with a ref-counted proxy object. |
| 662 scoped_refptr<FrameConsumerProxy> consumer_proxy = | 641 scoped_refptr<FrameConsumerProxy> consumer_proxy = |
| (...skipping 481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1144 pp::VarArrayBuffer array_buffer(buffer_size); | 1123 pp::VarArrayBuffer array_buffer(buffer_size); |
| 1145 void* data_ptr = array_buffer.Map(); | 1124 void* data_ptr = array_buffer.Map(); |
| 1146 memcpy(data_ptr, buffer, buffer_size); | 1125 memcpy(data_ptr, buffer, buffer_size); |
| 1147 array_buffer.Unmap(); | 1126 array_buffer.Unmap(); |
| 1148 pp::VarDictionary data_dictionary; | 1127 pp::VarDictionary data_dictionary; |
| 1149 data_dictionary.Set(pp::Var("buffer"), array_buffer); | 1128 data_dictionary.Set(pp::Var("buffer"), array_buffer); |
| 1150 PostChromotingMessage("mediaSourceData", data_dictionary); | 1129 PostChromotingMessage("mediaSourceData", data_dictionary); |
| 1151 } | 1130 } |
| 1152 | 1131 |
| 1153 } // namespace remoting | 1132 } // namespace remoting |
| OLD | NEW |