Chromium Code Reviews| 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" |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 41 #include "remoting/host/curtaining_host_observer.h" | 41 #include "remoting/host/curtaining_host_observer.h" |
| 42 #include "remoting/host/desktop_environment_factory.h" | 42 #include "remoting/host/desktop_environment_factory.h" |
| 43 #include "remoting/host/desktop_resizer.h" | 43 #include "remoting/host/desktop_resizer.h" |
| 44 #include "remoting/host/desktop_session_connector.h" | 44 #include "remoting/host/desktop_session_connector.h" |
| 45 #include "remoting/host/dns_blackhole_checker.h" | 45 #include "remoting/host/dns_blackhole_checker.h" |
| 46 #include "remoting/host/event_executor.h" | 46 #include "remoting/host/event_executor.h" |
| 47 #include "remoting/host/heartbeat_sender.h" | 47 #include "remoting/host/heartbeat_sender.h" |
| 48 #include "remoting/host/host_config.h" | 48 #include "remoting/host/host_config.h" |
| 49 #include "remoting/host/host_event_logger.h" | 49 #include "remoting/host/host_event_logger.h" |
| 50 #include "remoting/host/host_exit_codes.h" | 50 #include "remoting/host/host_exit_codes.h" |
| 51 #include "remoting/host/host_status_service.h" | |
| 51 #include "remoting/host/host_user_interface.h" | 52 #include "remoting/host/host_user_interface.h" |
| 52 #include "remoting/host/ipc_consts.h" | 53 #include "remoting/host/ipc_consts.h" |
| 53 #include "remoting/host/ipc_desktop_environment_factory.h" | 54 #include "remoting/host/ipc_desktop_environment_factory.h" |
| 54 #include "remoting/host/json_host_config.h" | 55 #include "remoting/host/json_host_config.h" |
| 55 #include "remoting/host/logging.h" | 56 #include "remoting/host/logging.h" |
| 56 #include "remoting/host/log_to_server.h" | 57 #include "remoting/host/log_to_server.h" |
| 57 #include "remoting/host/network_settings.h" | 58 #include "remoting/host/network_settings.h" |
| 58 #include "remoting/host/policy_hack/policy_watcher.h" | 59 #include "remoting/host/policy_hack/policy_watcher.h" |
| 59 #include "remoting/host/resizing_host_observer.h" | 60 #include "remoting/host/resizing_host_observer.h" |
| 60 #include "remoting/host/session_manager_factory.h" | 61 #include "remoting/host/session_manager_factory.h" |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 97 // This is used for tagging system event logs. | 98 // This is used for tagging system event logs. |
| 98 const char kApplicationName[] = "chromoting"; | 99 const char kApplicationName[] = "chromoting"; |
| 99 | 100 |
| 100 // The command line switch used to get version of the daemon. | 101 // The command line switch used to get version of the daemon. |
| 101 const char kVersionSwitchName[] = "version"; | 102 const char kVersionSwitchName[] = "version"; |
| 102 | 103 |
| 103 // The command line switch used to pass name of the pipe to capture audio on | 104 // The command line switch used to pass name of the pipe to capture audio on |
| 104 // linux. | 105 // linux. |
| 105 const char kAudioPipeSwitchName[] = "audio-pipe-name"; | 106 const char kAudioPipeSwitchName[] = "audio-pipe-name"; |
| 106 | 107 |
| 108 // The command line switch used to enable host status service. | |
| 109 const char kEnableStatusServiceSwitchName[] = "enable-status-service"; | |
| 110 | |
| 107 void QuitMessageLoop(MessageLoop* message_loop) { | 111 void QuitMessageLoop(MessageLoop* message_loop) { |
| 108 message_loop->PostTask(FROM_HERE, MessageLoop::QuitClosure()); | 112 message_loop->PostTask(FROM_HERE, MessageLoop::QuitClosure()); |
| 109 } | 113 } |
| 110 | 114 |
| 111 // Returns true if GetUsername() is implemented on this platform. | 115 // Returns true if GetUsername() is implemented on this platform. |
| 112 bool CanGetUsername() { | 116 bool CanGetUsername() { |
| 113 #if defined(OS_LINUX) | 117 #if defined(OS_LINUX) |
| 114 return true; | 118 return true; |
| 115 #else // defined(OS_LINUX) | 119 #else // defined(OS_LINUX) |
| 116 return false; | 120 return false; |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 186 // Applies the host config, returning true if successful. | 190 // Applies the host config, returning true if successful. |
| 187 bool ApplyConfig(scoped_ptr<JsonHostConfig> config); | 191 bool ApplyConfig(scoped_ptr<JsonHostConfig> config); |
| 188 | 192 |
| 189 void OnPolicyUpdate(scoped_ptr<base::DictionaryValue> policies); | 193 void OnPolicyUpdate(scoped_ptr<base::DictionaryValue> policies); |
| 190 bool OnHostDomainPolicyUpdate(const std::string& host_domain); | 194 bool OnHostDomainPolicyUpdate(const std::string& host_domain); |
| 191 bool OnUsernamePolicyUpdate(bool username_match_required); | 195 bool OnUsernamePolicyUpdate(bool username_match_required); |
| 192 bool OnNatPolicyUpdate(bool nat_traversal_enabled); | 196 bool OnNatPolicyUpdate(bool nat_traversal_enabled); |
| 193 bool OnCurtainPolicyUpdate(bool curtain_required); | 197 bool OnCurtainPolicyUpdate(bool curtain_required); |
| 194 bool OnHostTalkGadgetPrefixPolicyUpdate(const std::string& talkgadget_prefix); | 198 bool OnHostTalkGadgetPrefixPolicyUpdate(const std::string& talkgadget_prefix); |
| 195 | 199 |
| 200 void StartHostStatusService(); | |
| 201 | |
| 196 void StartHost(); | 202 void StartHost(); |
| 197 | 203 |
| 198 void OnAuthFailed(); | 204 void OnAuthFailed(); |
| 199 | 205 |
| 200 void RejectAuthenticatingClient(); | 206 void RejectAuthenticatingClient(); |
| 201 | 207 |
| 202 // Invoked when the user uses the Disconnect windows to terminate | 208 // Invoked when the user uses the Disconnect windows to terminate |
| 203 // the sessions, or when the local session is activated in curtain mode. | 209 // the sessions, or when the local session is activated in curtain mode. |
| 204 void OnDisconnectRequested(); | 210 void OnDisconnectRequested(); |
| 205 | 211 |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 221 const int& line_number); | 227 const int& line_number); |
| 222 | 228 |
| 223 scoped_ptr<ChromotingHostContext> context_; | 229 scoped_ptr<ChromotingHostContext> context_; |
| 224 scoped_ptr<IPC::ChannelProxy> daemon_channel_; | 230 scoped_ptr<IPC::ChannelProxy> daemon_channel_; |
| 225 scoped_ptr<net::NetworkChangeNotifier> network_change_notifier_; | 231 scoped_ptr<net::NetworkChangeNotifier> network_change_notifier_; |
| 226 | 232 |
| 227 FilePath host_config_path_; | 233 FilePath host_config_path_; |
| 228 scoped_ptr<ConfigFileWatcher> config_watcher_; | 234 scoped_ptr<ConfigFileWatcher> config_watcher_; |
| 229 | 235 |
| 230 // Accessed on the network thread. | 236 // Accessed on the network thread. |
| 237 | |
| 238 scoped_ptr<HostStatusService> status_service_; | |
| 239 | |
| 231 std::string host_id_; | 240 std::string host_id_; |
| 232 protocol::SharedSecretHash host_secret_hash_; | 241 protocol::SharedSecretHash host_secret_hash_; |
| 233 HostKeyPair key_pair_; | 242 HostKeyPair key_pair_; |
| 234 std::string oauth_refresh_token_; | 243 std::string oauth_refresh_token_; |
| 235 std::string serialized_config_; | 244 std::string serialized_config_; |
| 236 std::string xmpp_login_; | 245 std::string xmpp_login_; |
| 237 std::string xmpp_auth_token_; | 246 std::string xmpp_auth_token_; |
| 238 std::string xmpp_auth_service_; | 247 std::string xmpp_auth_service_; |
| 239 | 248 |
| 240 scoped_ptr<policy_hack::PolicyWatcher> policy_watcher_; | 249 scoped_ptr<policy_hack::PolicyWatcher> policy_watcher_; |
| (...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 486 // If an audio pipe is specific on the command-line then initialize | 495 // If an audio pipe is specific on the command-line then initialize |
| 487 // AudioCapturerLinux to capture from it. | 496 // AudioCapturerLinux to capture from it. |
| 488 FilePath audio_pipe_name = CommandLine::ForCurrentProcess()-> | 497 FilePath audio_pipe_name = CommandLine::ForCurrentProcess()-> |
| 489 GetSwitchValuePath(kAudioPipeSwitchName); | 498 GetSwitchValuePath(kAudioPipeSwitchName); |
| 490 if (!audio_pipe_name.empty()) { | 499 if (!audio_pipe_name.empty()) { |
| 491 remoting::AudioCapturerLinux::InitializePipeReader( | 500 remoting::AudioCapturerLinux::InitializePipeReader( |
| 492 context_->audio_task_runner(), audio_pipe_name); | 501 context_->audio_task_runner(), audio_pipe_name); |
| 493 } | 502 } |
| 494 #endif // defined(OS_LINUX) | 503 #endif // defined(OS_LINUX) |
| 495 | 504 |
| 505 if (CommandLine::ForCurrentProcess()->HasSwitch( | |
| 506 kEnableStatusServiceSwitchName)) { | |
| 507 context_->network_task_runner()->PostTask( | |
| 508 FROM_HERE, | |
| 509 base::Bind(&HostProcess::StartHostStatusService, | |
| 510 base::Unretained(this))); | |
| 511 } | |
| 512 | |
| 496 // Create a desktop environment factory appropriate to the build type & | 513 // Create a desktop environment factory appropriate to the build type & |
| 497 // platform. | 514 // platform. |
| 498 #if defined(OS_WIN) | 515 #if defined(OS_WIN) |
| 499 | 516 |
| 500 #if defined(REMOTING_MULTI_PROCESS) | 517 #if defined(REMOTING_MULTI_PROCESS) |
| 501 IpcDesktopEnvironmentFactory* desktop_environment_factory = | 518 IpcDesktopEnvironmentFactory* desktop_environment_factory = |
| 502 new IpcDesktopEnvironmentFactory( | 519 new IpcDesktopEnvironmentFactory( |
| 503 daemon_channel_.get(), | 520 daemon_channel_.get(), |
| 504 context_->input_task_runner(), | 521 context_->input_task_runner(), |
| 505 context_->network_task_runner(), | 522 context_->network_task_runner(), |
| (...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 739 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 756 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
| 740 | 757 |
| 741 if (talkgadget_prefix != talkgadget_prefix_) { | 758 if (talkgadget_prefix != talkgadget_prefix_) { |
| 742 LOG(INFO) << "Updated talkgadget policy."; | 759 LOG(INFO) << "Updated talkgadget policy."; |
| 743 talkgadget_prefix_ = talkgadget_prefix; | 760 talkgadget_prefix_ = talkgadget_prefix; |
| 744 return true; | 761 return true; |
| 745 } | 762 } |
| 746 return false; | 763 return false; |
| 747 } | 764 } |
| 748 | 765 |
| 766 void HostProcess::StartHostStatusService() { | |
| 767 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | |
| 768 status_service_.reset(new HostStatusService()); | |
| 769 } | |
| 770 | |
| 749 void HostProcess::StartHost() { | 771 void HostProcess::StartHost() { |
| 750 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 772 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
| 751 DCHECK(!host_); | 773 DCHECK(!host_); |
| 752 DCHECK(!signal_strategy_.get()); | 774 DCHECK(!signal_strategy_.get()); |
| 753 | 775 |
| 754 if (shutting_down_) | 776 if (shutting_down_) |
| 755 return; | 777 return; |
| 756 | 778 |
| 757 signal_strategy_.reset( | 779 signal_strategy_.reset( |
| 758 new XmppSignalStrategy(context_->url_request_context_getter(), | 780 new XmppSignalStrategy(context_->url_request_context_getter(), |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 819 // so it's disabled until we've had time to fully investigate. | 841 // so it's disabled until we've had time to fully investigate. |
| 820 // curtaining_host_observer_.reset(new CurtainingHostObserver( | 842 // curtaining_host_observer_.reset(new CurtainingHostObserver( |
| 821 // curtain_.get(), host_)); | 843 // curtain_.get(), host_)); |
| 822 | 844 |
| 823 if (host_user_interface_.get()) { | 845 if (host_user_interface_.get()) { |
| 824 host_user_interface_->Start( | 846 host_user_interface_->Start( |
| 825 host_, base::Bind(&HostProcess::OnDisconnectRequested, | 847 host_, base::Bind(&HostProcess::OnDisconnectRequested, |
| 826 base::Unretained(this))); | 848 base::Unretained(this))); |
| 827 } | 849 } |
| 828 | 850 |
| 851 if (status_service_) | |
| 852 status_service_->SetState(true, host_id_); | |
| 853 | |
| 829 host_->Start(xmpp_login_); | 854 host_->Start(xmpp_login_); |
| 830 | 855 |
| 831 CreateAuthenticatorFactory(); | 856 CreateAuthenticatorFactory(); |
| 832 } | 857 } |
| 833 | 858 |
| 834 void HostProcess::OnAuthFailed() { | 859 void HostProcess::OnAuthFailed() { |
| 835 Shutdown(kInvalidOauthCredentialsExitCode); | 860 Shutdown(kInvalidOauthCredentialsExitCode); |
| 836 } | 861 } |
| 837 | 862 |
| 838 void HostProcess::RejectAuthenticatingClient() { | 863 void HostProcess::RejectAuthenticatingClient() { |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 877 | 902 |
| 878 StartHost(); | 903 StartHost(); |
| 879 } | 904 } |
| 880 | 905 |
| 881 void HostProcess::Shutdown(int exit_code) { | 906 void HostProcess::Shutdown(int exit_code) { |
| 882 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 907 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
| 883 | 908 |
| 884 if (shutting_down_) | 909 if (shutting_down_) |
| 885 return; | 910 return; |
| 886 | 911 |
| 912 if (status_service_) | |
| 913 status_service_->SetState(false, ""); | |
|
alexeypa (please no reviews)
2012/11/15 19:45:56
nit: It may be worth splitting SetState into two s
Sergey Ulanov
2012/11/16 00:52:10
Done.
| |
| 914 | |
| 887 shutting_down_ = true; | 915 shutting_down_ = true; |
| 888 exit_code_ = exit_code; | 916 exit_code_ = exit_code; |
| 889 if (host_) { | 917 if (host_) { |
| 890 host_->Shutdown(base::Bind( | 918 host_->Shutdown(base::Bind( |
| 891 &HostProcess::OnShutdownFinished, base::Unretained(this))); | 919 &HostProcess::OnShutdownFinished, base::Unretained(this))); |
| 892 } else { | 920 } else { |
| 893 OnShutdownFinished(); | 921 OnShutdownFinished(); |
| 894 } | 922 } |
| 895 } | 923 } |
| 896 | 924 |
| 897 void HostProcess::OnShutdownFinished() { | 925 void HostProcess::OnShutdownFinished() { |
| 898 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 926 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
| 899 | 927 |
| 900 // Destroy networking objects while we are on the network thread. | 928 // Destroy networking objects while we are on the network thread. |
| 901 host_ = NULL; | 929 host_ = NULL; |
| 902 ResetHost(); | 930 ResetHost(); |
| 903 | 931 |
| 904 if (policy_watcher_.get()) { | 932 if (policy_watcher_.get()) { |
| 905 base::WaitableEvent done_event(true, false); | 933 base::WaitableEvent done_event(true, false); |
| 906 policy_watcher_->StopWatching(&done_event); | 934 policy_watcher_->StopWatching(&done_event); |
| 907 done_event.Wait(); | 935 done_event.Wait(); |
| 908 policy_watcher_.reset(); | 936 policy_watcher_.reset(); |
| 909 } | 937 } |
| 910 | 938 |
| 939 status_service_.reset(); | |
| 940 | |
| 911 // Complete the rest of shutdown on the main thread. | 941 // Complete the rest of shutdown on the main thread. |
| 912 context_->ui_task_runner()->PostTask( | 942 context_->ui_task_runner()->PostTask( |
| 913 FROM_HERE, | 943 FROM_HERE, |
| 914 base::Bind(&HostProcess::ShutdownHostProcess, | 944 base::Bind(&HostProcess::ShutdownHostProcess, |
| 915 base::Unretained(this))); | 945 base::Unretained(this))); |
| 916 } | 946 } |
| 917 | 947 |
| 918 void HostProcess::ResetHost() { | 948 void HostProcess::ResetHost() { |
| 919 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 949 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
| 920 | 950 |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1018 user32.GetFunctionPointer("SetProcessDPIAware")); | 1048 user32.GetFunctionPointer("SetProcessDPIAware")); |
| 1019 set_process_dpi_aware(); | 1049 set_process_dpi_aware(); |
| 1020 } | 1050 } |
| 1021 | 1051 |
| 1022 // CommandLine::Init() ignores the passed |argc| and |argv| on Windows getting | 1052 // CommandLine::Init() ignores the passed |argc| and |argv| on Windows getting |
| 1023 // the command line from GetCommandLineW(), so we can safely pass NULL here. | 1053 // the command line from GetCommandLineW(), so we can safely pass NULL here. |
| 1024 return main(0, NULL); | 1054 return main(0, NULL); |
| 1025 } | 1055 } |
| 1026 | 1056 |
| 1027 #endif // defined(OS_WIN) | 1057 #endif // defined(OS_WIN) |
| OLD | NEW |