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 // This file implements a standalone host process for Me2Me. | 5 // This file implements a standalone host process for Me2Me. |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/at_exit.h" | 9 #include "base/at_exit.h" |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
11 #include "base/callback.h" | 11 #include "base/callback.h" |
12 #include "base/command_line.h" | 12 #include "base/command_line.h" |
13 #include "base/debug/alias.h" | 13 #include "base/debug/alias.h" |
14 #include "base/files/file_path.h" | 14 #include "base/files/file_path.h" |
15 #include "base/files/file_util.h" | 15 #include "base/files/file_util.h" |
16 #include "base/memory/scoped_ptr.h" | 16 #include "base/memory/scoped_ptr.h" |
17 #include "base/message_loop/message_loop.h" | 17 #include "base/message_loop/message_loop.h" |
18 #include "base/single_thread_task_runner.h" | 18 #include "base/single_thread_task_runner.h" |
19 #include "base/strings/string_number_conversions.h" | 19 #include "base/strings/string_number_conversions.h" |
20 #include "base/strings/string_util.h" | 20 #include "base/strings/string_util.h" |
21 #include "base/strings/utf_string_conversions.h" | 21 #include "base/strings/utf_string_conversions.h" |
22 #include "base/threading/thread.h" | 22 #include "base/threading/thread.h" |
23 #include "build/build_config.h" | 23 #include "build/build_config.h" |
24 #include "crypto/nss_util.h" | 24 #include "crypto/nss_util.h" |
25 #include "ipc/ipc_channel.h" | 25 #include "ipc/ipc_channel.h" |
26 #include "ipc/ipc_channel_proxy.h" | 26 #include "ipc/ipc_channel_proxy.h" |
27 #include "ipc/ipc_listener.h" | 27 #include "ipc/ipc_listener.h" |
28 #include "media/base/media.h" | 28 #include "media/base/media.h" |
29 #include "net/base/network_change_notifier.h" | |
29 #include "net/socket/client_socket_factory.h" | 30 #include "net/socket/client_socket_factory.h" |
30 #include "net/socket/ssl_server_socket.h" | 31 #include "net/socket/ssl_server_socket.h" |
31 #include "net/url_request/url_fetcher.h" | 32 #include "net/url_request/url_fetcher.h" |
32 #include "policy/policy_constants.h" | 33 #include "policy/policy_constants.h" |
33 #include "remoting/base/auto_thread_task_runner.h" | 34 #include "remoting/base/auto_thread_task_runner.h" |
34 #include "remoting/base/breakpad.h" | 35 #include "remoting/base/breakpad.h" |
35 #include "remoting/base/constants.h" | 36 #include "remoting/base/constants.h" |
36 #include "remoting/base/logging.h" | 37 #include "remoting/base/logging.h" |
37 #include "remoting/base/rsa_key_pair.h" | 38 #include "remoting/base/rsa_key_pair.h" |
38 #include "remoting/base/service_urls.h" | 39 #include "remoting/base/service_urls.h" |
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
316 scoped_refptr<RsaKeyPair> key_pair_; | 317 scoped_refptr<RsaKeyPair> key_pair_; |
317 std::string oauth_refresh_token_; | 318 std::string oauth_refresh_token_; |
318 std::string serialized_config_; | 319 std::string serialized_config_; |
319 std::string host_owner_; | 320 std::string host_owner_; |
320 std::string host_owner_email_; | 321 std::string host_owner_email_; |
321 bool use_service_account_; | 322 bool use_service_account_; |
322 bool enable_vp9_; | 323 bool enable_vp9_; |
323 int64_t frame_recorder_buffer_size_; | 324 int64_t frame_recorder_buffer_size_; |
324 | 325 |
325 scoped_ptr<PolicyWatcher> policy_watcher_; | 326 scoped_ptr<PolicyWatcher> policy_watcher_; |
327 bool policies_loaded_; | |
326 std::string host_domain_; | 328 std::string host_domain_; |
327 bool host_username_match_required_; | 329 bool host_username_match_required_; |
328 bool allow_nat_traversal_; | 330 bool allow_nat_traversal_; |
329 bool allow_relay_; | 331 bool allow_relay_; |
330 uint16 min_udp_port_; | 332 uint16 min_udp_port_; |
331 uint16 max_udp_port_; | 333 uint16 max_udp_port_; |
332 std::string talkgadget_prefix_; | 334 std::string talkgadget_prefix_; |
333 bool allow_pairing_; | 335 bool allow_pairing_; |
334 | 336 |
335 bool curtain_required_; | 337 bool curtain_required_; |
336 ThirdPartyAuthConfig third_party_auth_config_; | 338 ThirdPartyAuthConfig third_party_auth_config_; |
337 bool enable_gnubby_auth_; | 339 bool enable_gnubby_auth_; |
338 | 340 |
339 // Boolean to change flow, where ncessary, if we're | 341 // Boolean to change flow, where necessary, if we're |
340 // capturing a window instead of the entire desktop. | 342 // capturing a window instead of the entire desktop. |
341 bool enable_window_capture_; | 343 bool enable_window_capture_; |
342 | 344 |
343 // Used to specify which window to stream, if enabled. | 345 // Used to specify which window to stream, if enabled. |
344 webrtc::WindowId window_id_; | 346 webrtc::WindowId window_id_; |
345 | 347 |
346 // Used to send heartbeats while running, and the reason for going offline | 348 // Used to send heartbeats while running, and the reason for going offline |
347 // when shutting down. | 349 // when shutting down. |
348 scoped_ptr<HostSignalingManager> host_signaling_manager_; | 350 scoped_ptr<HostSignalingManager> host_signaling_manager_; |
349 | 351 |
(...skipping 21 matching lines...) Expand all Loading... | |
371 }; | 373 }; |
372 | 374 |
373 HostProcess::HostProcess(scoped_ptr<ChromotingHostContext> context, | 375 HostProcess::HostProcess(scoped_ptr<ChromotingHostContext> context, |
374 int* exit_code_out, | 376 int* exit_code_out, |
375 ShutdownWatchdog* shutdown_watchdog) | 377 ShutdownWatchdog* shutdown_watchdog) |
376 : context_(context.Pass()), | 378 : context_(context.Pass()), |
377 state_(HOST_INITIALIZING), | 379 state_(HOST_INITIALIZING), |
378 use_service_account_(false), | 380 use_service_account_(false), |
379 enable_vp9_(false), | 381 enable_vp9_(false), |
380 frame_recorder_buffer_size_(0), | 382 frame_recorder_buffer_size_(0), |
383 policies_loaded_(false), | |
381 host_username_match_required_(false), | 384 host_username_match_required_(false), |
382 allow_nat_traversal_(true), | 385 allow_nat_traversal_(true), |
383 allow_relay_(true), | 386 allow_relay_(true), |
384 min_udp_port_(0), | 387 min_udp_port_(0), |
385 max_udp_port_(0), | 388 max_udp_port_(0), |
386 allow_pairing_(true), | 389 allow_pairing_(true), |
387 curtain_required_(false), | 390 curtain_required_(false), |
388 enable_gnubby_auth_(false), | 391 enable_gnubby_auth_(false), |
389 enable_window_capture_(false), | 392 enable_window_capture_(false), |
390 window_id_(0), | 393 window_id_(0), |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
540 ShutdownHost(kInvalidHostConfigurationExitCode); | 543 ShutdownHost(kInvalidHostConfigurationExitCode); |
541 return; | 544 return; |
542 } | 545 } |
543 | 546 |
544 if (!ApplyConfig(*config)) { | 547 if (!ApplyConfig(*config)) { |
545 LOG(ERROR) << "Failed to apply the configuration."; | 548 LOG(ERROR) << "Failed to apply the configuration."; |
546 ShutdownHost(kInvalidHostConfigurationExitCode); | 549 ShutdownHost(kInvalidHostConfigurationExitCode); |
547 return; | 550 return; |
548 } | 551 } |
549 | 552 |
553 if (!policies_loaded_) | |
Łukasz Anforowicz
2015/01/31 00:02:34
The early return is not needed - this can be made
Sergey Ulanov
2015/01/31 00:34:26
Done.
| |
554 return; | |
555 | |
550 if (state_ == HOST_INITIALIZING) { | 556 if (state_ == HOST_INITIALIZING) { |
551 // TODO(sergeyu): Currently OnPolicyUpdate() assumes that host config is | 557 StartHost(); |
Łukasz Anforowicz
2015/01/31 00:02:34
It seems that StartHost can only proceed if
1) pol
Sergey Ulanov
2015/01/31 00:34:26
Added StartHostIfReady() that checks these two con
| |
552 // already loaded so PolicyWatcher has to be started here. Separate policy | 558 } else if (state_ == HOST_STARTED) { |
553 // loading from policy verifications and move |policy_watcher_| | |
554 // initialization to StartOnNetworkThread(). | |
555 policy_watcher_ = | |
556 PolicyWatcher::Create(nullptr, context_->file_task_runner()); | |
557 policy_watcher_->StartWatching( | |
558 base::Bind(&HostProcess::OnPolicyUpdate, base::Unretained(this)), | |
559 base::Bind(&HostProcess::OnPolicyError, base::Unretained(this))); | |
560 } else { | |
561 // Reapply policies that could be affected by a new config. | 559 // Reapply policies that could be affected by a new config. |
562 ApplyHostDomainPolicy(); | 560 ApplyHostDomainPolicy(); |
Łukasz Anforowicz
2015/01/31 00:02:34
Would it make sense to add DCHECK(policy_loaded_)
Sergey Ulanov
2015/01/31 00:34:26
Added DCHECK here. I don't think we need a DCHECK
| |
563 ApplyUsernamePolicy(); | 561 ApplyUsernamePolicy(); |
564 | 562 |
565 if (state_ == HOST_STARTED) { | 563 // TODO(sergeyu): Here we assume that PIN is the only part of the config |
566 // TODO(sergeyu): Here we assume that PIN is the only part of the config | 564 // that may change while the service is running. Change ApplyConfig() to |
567 // that may change while the service is running. Change ApplyConfig() to | 565 // detect other changes in the config and restart host if necessary here. |
568 // detect other changes in the config and restart host if necessary here. | 566 CreateAuthenticatorFactory(); |
569 CreateAuthenticatorFactory(); | |
570 } | |
571 } | 567 } |
572 } | 568 } |
573 | 569 |
574 void HostProcess::OnConfigWatcherError() { | 570 void HostProcess::OnConfigWatcherError() { |
575 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 571 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
576 ShutdownHost(kInvalidHostConfigurationExitCode); | 572 ShutdownHost(kInvalidHostConfigurationExitCode); |
577 } | 573 } |
578 | 574 |
579 void HostProcess::StartOnNetworkThread() { | 575 void HostProcess::StartOnNetworkThread() { |
580 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 576 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
717 DCHECK(context_->ui_task_runner()->BelongsToCurrentThread()); | 713 DCHECK(context_->ui_task_runner()->BelongsToCurrentThread()); |
718 | 714 |
719 if (!InitWithCommandLine(base::CommandLine::ForCurrentProcess())) { | 715 if (!InitWithCommandLine(base::CommandLine::ForCurrentProcess())) { |
720 // Shutdown the host if the command line is invalid. | 716 // Shutdown the host if the command line is invalid. |
721 context_->network_task_runner()->PostTask( | 717 context_->network_task_runner()->PostTask( |
722 FROM_HERE, base::Bind(&HostProcess::ShutdownHost, this, | 718 FROM_HERE, base::Bind(&HostProcess::ShutdownHost, this, |
723 kUsageExitCode)); | 719 kUsageExitCode)); |
724 return; | 720 return; |
725 } | 721 } |
726 | 722 |
723 policy_watcher_ = | |
724 PolicyWatcher::Create(nullptr, context_->file_task_runner()); | |
725 policy_watcher_->StartWatching( | |
726 base::Bind(&HostProcess::OnPolicyUpdate, base::Unretained(this)), | |
727 base::Bind(&HostProcess::OnPolicyError, base::Unretained(this))); | |
728 | |
727 #if defined(OS_LINUX) | 729 #if defined(OS_LINUX) |
728 // If an audio pipe is specific on the command-line then initialize | 730 // If an audio pipe is specific on the command-line then initialize |
729 // AudioCapturerLinux to capture from it. | 731 // AudioCapturerLinux to capture from it. |
730 base::FilePath audio_pipe_name = base::CommandLine::ForCurrentProcess()-> | 732 base::FilePath audio_pipe_name = base::CommandLine::ForCurrentProcess()-> |
731 GetSwitchValuePath(kAudioPipeSwitchName); | 733 GetSwitchValuePath(kAudioPipeSwitchName); |
732 if (!audio_pipe_name.empty()) { | 734 if (!audio_pipe_name.empty()) { |
733 remoting::AudioCapturerLinux::InitializePipeReader( | 735 remoting::AudioCapturerLinux::InitializePipeReader( |
734 context_->audio_task_runner(), audio_pipe_name); | 736 context_->audio_task_runner(), audio_pipe_name); |
735 } | 737 } |
736 | 738 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
777 base::Bind(&HostProcess::StartOnNetworkThread, this)); | 779 base::Bind(&HostProcess::StartOnNetworkThread, this)); |
778 } | 780 } |
779 | 781 |
780 void HostProcess::ShutdownOnUiThread() { | 782 void HostProcess::ShutdownOnUiThread() { |
781 DCHECK(context_->ui_task_runner()->BelongsToCurrentThread()); | 783 DCHECK(context_->ui_task_runner()->BelongsToCurrentThread()); |
782 | 784 |
783 // Tear down resources that need to be torn down on the UI thread. | 785 // Tear down resources that need to be torn down on the UI thread. |
784 daemon_channel_.reset(); | 786 daemon_channel_.reset(); |
785 desktop_environment_factory_.reset(); | 787 desktop_environment_factory_.reset(); |
786 | 788 |
789 policy_watcher_.reset(); | |
790 | |
787 // It is now safe for the HostProcess to be deleted. | 791 // It is now safe for the HostProcess to be deleted. |
788 self_ = nullptr; | 792 self_ = nullptr; |
789 | 793 |
790 #if defined(OS_LINUX) | 794 #if defined(OS_LINUX) |
791 // Cause the global AudioPipeReader to be freed, otherwise the audio | 795 // Cause the global AudioPipeReader to be freed, otherwise the audio |
792 // thread will remain in-use and prevent the process from exiting. | 796 // thread will remain in-use and prevent the process from exiting. |
793 // TODO(wez): DesktopEnvironmentFactory should own the pipe reader. | 797 // TODO(wez): DesktopEnvironmentFactory should own the pipe reader. |
794 // See crbug.com/161373 and crbug.com/104544. | 798 // See crbug.com/161373 and crbug.com/104544. |
795 AudioCapturerLinux::InitializePipeReader(nullptr, base::FilePath()); | 799 AudioCapturerLinux::InitializePipeReader(nullptr, base::FilePath()); |
796 #endif | 800 #endif |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
949 &frame_recorder_buffer_kb); | 953 &frame_recorder_buffer_kb); |
950 } | 954 } |
951 if (frame_recorder_buffer_kb > 0) { | 955 if (frame_recorder_buffer_kb > 0) { |
952 frame_recorder_buffer_size_ = 1024LL * frame_recorder_buffer_kb; | 956 frame_recorder_buffer_size_ = 1024LL * frame_recorder_buffer_kb; |
953 } | 957 } |
954 | 958 |
955 return true; | 959 return true; |
956 } | 960 } |
957 | 961 |
958 void HostProcess::OnPolicyUpdate(scoped_ptr<base::DictionaryValue> policies) { | 962 void HostProcess::OnPolicyUpdate(scoped_ptr<base::DictionaryValue> policies) { |
959 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 963 if (!context_->network_task_runner()->BelongsToCurrentThread()) { |
964 context_->network_task_runner()->PostTask( | |
965 FROM_HERE, base::Bind(&HostProcess::OnPolicyUpdate, this, | |
966 base::Passed(&policies))); | |
967 return; | |
968 } | |
960 | 969 |
961 bool restart_required = false; | 970 bool restart_required = false; |
962 restart_required |= OnHostDomainPolicyUpdate(policies.get()); | 971 restart_required |= OnHostDomainPolicyUpdate(policies.get()); |
963 restart_required |= OnCurtainPolicyUpdate(policies.get()); | 972 restart_required |= OnCurtainPolicyUpdate(policies.get()); |
964 // Note: UsernamePolicyUpdate must run after OnCurtainPolicyUpdate. | 973 // Note: UsernamePolicyUpdate must run after OnCurtainPolicyUpdate. |
965 restart_required |= OnUsernamePolicyUpdate(policies.get()); | 974 restart_required |= OnUsernamePolicyUpdate(policies.get()); |
966 restart_required |= OnNatPolicyUpdate(policies.get()); | 975 restart_required |= OnNatPolicyUpdate(policies.get()); |
967 restart_required |= OnRelayPolicyUpdate(policies.get()); | 976 restart_required |= OnRelayPolicyUpdate(policies.get()); |
968 restart_required |= OnUdpPortPolicyUpdate(policies.get()); | 977 restart_required |= OnUdpPortPolicyUpdate(policies.get()); |
969 restart_required |= OnHostTalkGadgetPrefixPolicyUpdate(policies.get()); | 978 restart_required |= OnHostTalkGadgetPrefixPolicyUpdate(policies.get()); |
970 restart_required |= OnHostTokenUrlPolicyUpdate(policies.get()); | 979 restart_required |= OnHostTokenUrlPolicyUpdate(policies.get()); |
971 restart_required |= OnPairingPolicyUpdate(policies.get()); | 980 restart_required |= OnPairingPolicyUpdate(policies.get()); |
972 restart_required |= OnGnubbyAuthPolicyUpdate(policies.get()); | 981 restart_required |= OnGnubbyAuthPolicyUpdate(policies.get()); |
973 | 982 |
983 policies_loaded_ = true; | |
Łukasz Anforowicz
2015/01/31 00:02:34
If adding DCHECK (as I suggested elsewhere) to App
Sergey Ulanov
2015/01/31 00:34:26
I'd like to avoid too many changes in how policies
| |
984 | |
974 if (state_ == HOST_INITIALIZING) { | 985 if (state_ == HOST_INITIALIZING) { |
975 StartHost(); | 986 if (!serialized_config_.empty()) |
976 } else if (state_ == HOST_STARTED && restart_required) { | 987 StartHost(); |
977 RestartHost(); | 988 } else if (state_ == HOST_STARTED) { |
989 if (restart_required) | |
990 RestartHost(); | |
978 } | 991 } |
979 } | 992 } |
980 | 993 |
981 void HostProcess::OnPolicyError() { | 994 void HostProcess::OnPolicyError() { |
982 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 995 if (!context_->network_task_runner()->BelongsToCurrentThread()) { |
996 context_->network_task_runner()->PostTask( | |
997 FROM_HERE, base::Bind(&HostProcess::OnPolicyError, this)); | |
998 return; | |
999 } | |
983 | 1000 |
984 ShutdownHost(kInvalidHostConfigurationExitCode); | 1001 ShutdownHost(kInvalidHostConfigurationExitCode); |
985 } | 1002 } |
986 | 1003 |
987 void HostProcess::ApplyHostDomainPolicy() { | 1004 void HostProcess::ApplyHostDomainPolicy() { |
1005 if (state_ != HOST_STARTED) | |
1006 return; | |
1007 | |
988 HOST_LOG << "Policy sets host domain: " << host_domain_; | 1008 HOST_LOG << "Policy sets host domain: " << host_domain_; |
989 | 1009 |
990 if (!host_domain_.empty()) { | 1010 if (!host_domain_.empty()) { |
991 // If the user does not have a Google email, their client JID will not be | 1011 // If the user does not have a Google email, their client JID will not be |
992 // based on their email. In that case, the username/host domain policies | 1012 // based on their email. In that case, the username/host domain policies |
993 // would be meaningless, since there is no way to check that the JID | 1013 // would be meaningless, since there is no way to check that the JID |
994 // trying to connect actually corresponds to the owner email in question. | 1014 // trying to connect actually corresponds to the owner email in question. |
995 if (host_owner_ != host_owner_email_) { | 1015 if (host_owner_ != host_owner_email_) { |
996 LOG(ERROR) << "The username and host domain policies cannot be enabled " | 1016 LOG(ERROR) << "The username and host domain policies cannot be enabled " |
997 << "for accounts with a non-Google email."; | 1017 << "for accounts with a non-Google email."; |
(...skipping 14 matching lines...) Expand all Loading... | |
1012 if (!policies->GetString(policy::key::kRemoteAccessHostDomain, | 1032 if (!policies->GetString(policy::key::kRemoteAccessHostDomain, |
1013 &host_domain_)) { | 1033 &host_domain_)) { |
1014 return false; | 1034 return false; |
1015 } | 1035 } |
1016 | 1036 |
1017 ApplyHostDomainPolicy(); | 1037 ApplyHostDomainPolicy(); |
1018 return false; | 1038 return false; |
1019 } | 1039 } |
1020 | 1040 |
1021 void HostProcess::ApplyUsernamePolicy() { | 1041 void HostProcess::ApplyUsernamePolicy() { |
1042 if (state_ != HOST_STARTED) | |
1043 return; | |
1044 | |
1022 if (host_username_match_required_) { | 1045 if (host_username_match_required_) { |
1023 HOST_LOG << "Policy requires host username match."; | 1046 HOST_LOG << "Policy requires host username match."; |
1024 | 1047 |
1025 // See comment in ApplyHostDomainPolicy. | 1048 // See comment in ApplyHostDomainPolicy. |
1026 if (host_owner_ != host_owner_email_) { | 1049 if (host_owner_ != host_owner_email_) { |
1027 LOG(ERROR) << "The username and host domain policies cannot be enabled " | 1050 LOG(ERROR) << "The username and host domain policies cannot be enabled " |
1028 << "for accounts with a non-Google email."; | 1051 << "for accounts with a non-Google email."; |
1029 ShutdownHost(kUsernameMismatchExitCode); | 1052 ShutdownHost(kUsernameMismatchExitCode); |
1030 } | 1053 } |
1031 | 1054 |
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1361 new IpcHostEventLogger(host_->AsWeakPtr(), daemon_channel_.get())); | 1384 new IpcHostEventLogger(host_->AsWeakPtr(), daemon_channel_.get())); |
1362 #else // !defined(REMOTING_MULTI_PROCESS) | 1385 #else // !defined(REMOTING_MULTI_PROCESS) |
1363 host_event_logger_ = | 1386 host_event_logger_ = |
1364 HostEventLogger::Create(host_->AsWeakPtr(), kApplicationName); | 1387 HostEventLogger::Create(host_->AsWeakPtr(), kApplicationName); |
1365 #endif // !defined(REMOTING_MULTI_PROCESS) | 1388 #endif // !defined(REMOTING_MULTI_PROCESS) |
1366 | 1389 |
1367 host_->SetEnableCurtaining(curtain_required_); | 1390 host_->SetEnableCurtaining(curtain_required_); |
1368 host_->Start(host_owner_email_); | 1391 host_->Start(host_owner_email_); |
1369 | 1392 |
1370 CreateAuthenticatorFactory(); | 1393 CreateAuthenticatorFactory(); |
1394 | |
1395 ApplyHostDomainPolicy(); | |
1396 ApplyUsernamePolicy(); | |
1371 } | 1397 } |
1372 | 1398 |
1373 void HostProcess::OnAuthFailed() { | 1399 void HostProcess::OnAuthFailed() { |
1374 ShutdownHost(kInvalidOauthCredentialsExitCode); | 1400 ShutdownHost(kInvalidOauthCredentialsExitCode); |
1375 } | 1401 } |
1376 | 1402 |
1377 void HostProcess::RestartHost() { | 1403 void HostProcess::RestartHost() { |
1378 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 1404 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
1379 DCHECK_EQ(state_, HOST_STARTED); | 1405 DCHECK_EQ(state_, HOST_STARTED); |
1380 | 1406 |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1432 | 1458 |
1433 if (state_ == HOST_STOPPING_TO_RESTART) { | 1459 if (state_ == HOST_STOPPING_TO_RESTART) { |
1434 StartHost(); | 1460 StartHost(); |
1435 } else if (state_ == HOST_STOPPING) { | 1461 } else if (state_ == HOST_STOPPING) { |
1436 state_ = HOST_STOPPED; | 1462 state_ = HOST_STOPPED; |
1437 | 1463 |
1438 shutdown_watchdog_->SetExitCode(*exit_code_out_); | 1464 shutdown_watchdog_->SetExitCode(*exit_code_out_); |
1439 shutdown_watchdog_->Arm(); | 1465 shutdown_watchdog_->Arm(); |
1440 | 1466 |
1441 config_watcher_.reset(); | 1467 config_watcher_.reset(); |
1442 policy_watcher_.reset(); | |
1443 | 1468 |
1444 // Complete the rest of shutdown on the main thread. | 1469 // Complete the rest of shutdown on the main thread. |
1445 context_->ui_task_runner()->PostTask( | 1470 context_->ui_task_runner()->PostTask( |
1446 FROM_HERE, base::Bind(&HostProcess::ShutdownOnUiThread, this)); | 1471 FROM_HERE, base::Bind(&HostProcess::ShutdownOnUiThread, this)); |
1447 } else { | 1472 } else { |
1448 // This method is only called in STOPPING_TO_RESTART and STOPPING states. | 1473 // This method is only called in STOPPING_TO_RESTART and STOPPING states. |
1449 NOTREACHED(); | 1474 NOTREACHED(); |
1450 } | 1475 } |
1451 } | 1476 } |
1452 | 1477 |
(...skipping 21 matching lines...) Expand all Loading... | |
1474 gtk_init(nullptr, nullptr); | 1499 gtk_init(nullptr, nullptr); |
1475 #endif | 1500 #endif |
1476 | 1501 |
1477 // Enable support for SSL server sockets, which must be done while still | 1502 // Enable support for SSL server sockets, which must be done while still |
1478 // single-threaded. | 1503 // single-threaded. |
1479 net::EnableSSLServerSockets(); | 1504 net::EnableSSLServerSockets(); |
1480 | 1505 |
1481 // Ensures runtime specific CPU features are initialized. | 1506 // Ensures runtime specific CPU features are initialized. |
1482 media::InitializeCPUSpecificMediaFeatures(); | 1507 media::InitializeCPUSpecificMediaFeatures(); |
1483 | 1508 |
1509 scoped_ptr<net::NetworkChangeNotifier> network_change_notifier; | |
Łukasz Anforowicz
2015/01/31 00:02:34
I don't understand what this does - this will alwa
Sergey Ulanov
2015/01/31 00:34:26
Yes. Thank you.
| |
1510 | |
1484 // Create the main message loop and start helper threads. | 1511 // Create the main message loop and start helper threads. |
1485 base::MessageLoopForUI message_loop; | 1512 base::MessageLoopForUI message_loop; |
1486 scoped_ptr<ChromotingHostContext> context = | 1513 scoped_ptr<ChromotingHostContext> context = |
1487 ChromotingHostContext::Create(new AutoThreadTaskRunner( | 1514 ChromotingHostContext::Create(new AutoThreadTaskRunner( |
1488 message_loop.message_loop_proxy(), base::MessageLoop::QuitClosure())); | 1515 message_loop.message_loop_proxy(), base::MessageLoop::QuitClosure())); |
1489 if (!context) | 1516 if (!context) |
1490 return kInitializationFailed; | 1517 return kInitializationFailed; |
1491 | 1518 |
1519 // BasicURLRequestContext holds references to threads, so it needs to be | |
1520 // dereferences on UI threads. Store the reference to the URLRequestGetter to | |
Łukasz Anforowicz
2015/01/31 00:02:34
I don't understand :-( I would understand if you
Sergey Ulanov
2015/01/31 00:34:26
Thread::Stop() is a blocking operation (because it
Łukasz Anforowicz
2015/01/31 00:41:35
Acknowledged.
| |
1521 // make sure it's not destroyed on other threads. | |
1522 // TODO(sergeyu): Consider fixing it in BasicURLRequestContext. | |
1523 scoped_refptr<net::URLRequestContextGetter> url_request_context_getter = | |
1524 context->url_request_context_getter(); | |
1525 | |
1492 // Create & start the HostProcess using these threads. | 1526 // Create & start the HostProcess using these threads. |
1493 // TODO(wez): The HostProcess holds a reference to itself until Shutdown(). | 1527 // TODO(wez): The HostProcess holds a reference to itself until Shutdown(). |
1494 // Remove this hack as part of the multi-process refactoring. | 1528 // Remove this hack as part of the multi-process refactoring. |
1495 int exit_code = kSuccessExitCode; | 1529 int exit_code = kSuccessExitCode; |
1496 ShutdownWatchdog shutdown_watchdog( | 1530 ShutdownWatchdog shutdown_watchdog( |
1497 base::TimeDelta::FromSeconds(kShutdownTimeoutSeconds)); | 1531 base::TimeDelta::FromSeconds(kShutdownTimeoutSeconds)); |
1498 new HostProcess(context.Pass(), &exit_code, &shutdown_watchdog); | 1532 new HostProcess(context.Pass(), &exit_code, &shutdown_watchdog); |
1499 | 1533 |
1500 // Run the main (also UI) message loop until the host no longer needs it. | 1534 // Run the main (also UI) message loop until the host no longer needs it. |
1501 message_loop.Run(); | 1535 message_loop.Run(); |
1502 | 1536 |
1503 return exit_code; | 1537 return exit_code; |
1504 } | 1538 } |
1505 | 1539 |
1506 } // namespace remoting | 1540 } // namespace remoting |
OLD | NEW |