| 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 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 42 #include "remoting/host/curtaining_host_observer.h" | 42 #include "remoting/host/curtaining_host_observer.h" |
| 43 #include "remoting/host/desktop_environment_factory.h" | 43 #include "remoting/host/desktop_environment_factory.h" |
| 44 #include "remoting/host/desktop_resizer.h" | 44 #include "remoting/host/desktop_resizer.h" |
| 45 #include "remoting/host/desktop_session_connector.h" | 45 #include "remoting/host/desktop_session_connector.h" |
| 46 #include "remoting/host/dns_blackhole_checker.h" | 46 #include "remoting/host/dns_blackhole_checker.h" |
| 47 #include "remoting/host/event_executor.h" | 47 #include "remoting/host/event_executor.h" |
| 48 #include "remoting/host/heartbeat_sender.h" | 48 #include "remoting/host/heartbeat_sender.h" |
| 49 #include "remoting/host/host_config.h" | 49 #include "remoting/host/host_config.h" |
| 50 #include "remoting/host/host_event_logger.h" | 50 #include "remoting/host/host_event_logger.h" |
| 51 #include "remoting/host/host_exit_codes.h" | 51 #include "remoting/host/host_exit_codes.h" |
| 52 #include "remoting/host/host_status_service.h" |
| 52 #include "remoting/host/host_user_interface.h" | 53 #include "remoting/host/host_user_interface.h" |
| 53 #include "remoting/host/ipc_constants.h" | 54 #include "remoting/host/ipc_constants.h" |
| 54 #include "remoting/host/ipc_desktop_environment_factory.h" | 55 #include "remoting/host/ipc_desktop_environment_factory.h" |
| 55 #include "remoting/host/json_host_config.h" | 56 #include "remoting/host/json_host_config.h" |
| 56 #include "remoting/host/logging.h" | 57 #include "remoting/host/logging.h" |
| 57 #include "remoting/host/log_to_server.h" | 58 #include "remoting/host/log_to_server.h" |
| 58 #include "remoting/host/network_settings.h" | 59 #include "remoting/host/network_settings.h" |
| 59 #include "remoting/host/policy_hack/policy_watcher.h" | 60 #include "remoting/host/policy_hack/policy_watcher.h" |
| 60 #include "remoting/host/resizing_host_observer.h" | 61 #include "remoting/host/resizing_host_observer.h" |
| 61 #include "remoting/host/session_manager_factory.h" | 62 #include "remoting/host/session_manager_factory.h" |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 98 // This is used for tagging system event logs. | 99 // This is used for tagging system event logs. |
| 99 const char kApplicationName[] = "chromoting"; | 100 const char kApplicationName[] = "chromoting"; |
| 100 | 101 |
| 101 // The command line switch used to get version of the daemon. | 102 // The command line switch used to get version of the daemon. |
| 102 const char kVersionSwitchName[] = "version"; | 103 const char kVersionSwitchName[] = "version"; |
| 103 | 104 |
| 104 // The command line switch used to pass name of the pipe to capture audio on | 105 // The command line switch used to pass name of the pipe to capture audio on |
| 105 // linux. | 106 // linux. |
| 106 const char kAudioPipeSwitchName[] = "audio-pipe-name"; | 107 const char kAudioPipeSwitchName[] = "audio-pipe-name"; |
| 107 | 108 |
| 109 // The command line switch used to enable host status service. |
| 110 const char kEnableStatusServiceSwitchName[] = "enable-status-service"; |
| 111 |
| 108 void QuitMessageLoop(MessageLoop* message_loop) { | 112 void QuitMessageLoop(MessageLoop* message_loop) { |
| 109 message_loop->PostTask(FROM_HERE, MessageLoop::QuitClosure()); | 113 message_loop->PostTask(FROM_HERE, MessageLoop::QuitClosure()); |
| 110 } | 114 } |
| 111 | 115 |
| 112 // Returns true if GetUsername() is implemented on this platform. | 116 // Returns true if GetUsername() is implemented on this platform. |
| 113 bool CanGetUsername() { | 117 bool CanGetUsername() { |
| 114 #if defined(OS_LINUX) | 118 #if defined(OS_LINUX) |
| 115 return true; | 119 return true; |
| 116 #else // defined(OS_LINUX) | 120 #else // defined(OS_LINUX) |
| 117 return false; | 121 return false; |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 196 // Applies the host config, returning true if successful. | 200 // Applies the host config, returning true if successful. |
| 197 bool ApplyConfig(scoped_ptr<JsonHostConfig> config); | 201 bool ApplyConfig(scoped_ptr<JsonHostConfig> config); |
| 198 | 202 |
| 199 void OnPolicyUpdate(scoped_ptr<base::DictionaryValue> policies); | 203 void OnPolicyUpdate(scoped_ptr<base::DictionaryValue> policies); |
| 200 bool OnHostDomainPolicyUpdate(const std::string& host_domain); | 204 bool OnHostDomainPolicyUpdate(const std::string& host_domain); |
| 201 bool OnUsernamePolicyUpdate(bool username_match_required); | 205 bool OnUsernamePolicyUpdate(bool username_match_required); |
| 202 bool OnNatPolicyUpdate(bool nat_traversal_enabled); | 206 bool OnNatPolicyUpdate(bool nat_traversal_enabled); |
| 203 bool OnCurtainPolicyUpdate(bool curtain_required); | 207 bool OnCurtainPolicyUpdate(bool curtain_required); |
| 204 bool OnHostTalkGadgetPrefixPolicyUpdate(const std::string& talkgadget_prefix); | 208 bool OnHostTalkGadgetPrefixPolicyUpdate(const std::string& talkgadget_prefix); |
| 205 | 209 |
| 210 void StartHostStatusService(); |
| 211 |
| 206 void StartHost(); | 212 void StartHost(); |
| 207 | 213 |
| 208 void OnAuthFailed(); | 214 void OnAuthFailed(); |
| 209 | 215 |
| 210 void RejectAuthenticatingClient(); | 216 void RejectAuthenticatingClient(); |
| 211 | 217 |
| 212 // Invoked when the user uses the Disconnect windows to terminate | 218 // Invoked when the user uses the Disconnect windows to terminate |
| 213 // the sessions, or when the local session is activated in curtain mode. | 219 // the sessions, or when the local session is activated in curtain mode. |
| 214 void OnDisconnectRequested(); | 220 void OnDisconnectRequested(); |
| 215 | 221 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 235 // Created on the UI thread but used from the network thread. | 241 // Created on the UI thread but used from the network thread. |
| 236 scoped_ptr<net::NetworkChangeNotifier> network_change_notifier_; | 242 scoped_ptr<net::NetworkChangeNotifier> network_change_notifier_; |
| 237 | 243 |
| 238 // Accessed on the UI thread. | 244 // Accessed on the UI thread. |
| 239 scoped_ptr<IPC::ChannelProxy> daemon_channel_; | 245 scoped_ptr<IPC::ChannelProxy> daemon_channel_; |
| 240 FilePath host_config_path_; | 246 FilePath host_config_path_; |
| 241 scoped_ptr<ConfigFileWatcher> config_watcher_; | 247 scoped_ptr<ConfigFileWatcher> config_watcher_; |
| 242 scoped_ptr<DesktopEnvironmentFactory> desktop_environment_factory_; | 248 scoped_ptr<DesktopEnvironmentFactory> desktop_environment_factory_; |
| 243 | 249 |
| 244 // Accessed on the network thread. | 250 // Accessed on the network thread. |
| 251 |
| 252 scoped_ptr<HostStatusService> status_service_; |
| 253 |
| 245 std::string host_id_; | 254 std::string host_id_; |
| 246 protocol::SharedSecretHash host_secret_hash_; | 255 protocol::SharedSecretHash host_secret_hash_; |
| 247 HostKeyPair key_pair_; | 256 HostKeyPair key_pair_; |
| 248 std::string oauth_refresh_token_; | 257 std::string oauth_refresh_token_; |
| 249 std::string serialized_config_; | 258 std::string serialized_config_; |
| 250 std::string xmpp_login_; | 259 std::string xmpp_login_; |
| 251 std::string xmpp_auth_token_; | 260 std::string xmpp_auth_token_; |
| 252 std::string xmpp_auth_service_; | 261 std::string xmpp_auth_service_; |
| 253 | 262 |
| 254 scoped_ptr<policy_hack::PolicyWatcher> policy_watcher_; | 263 scoped_ptr<policy_hack::PolicyWatcher> policy_watcher_; |
| (...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 529 // If an audio pipe is specific on the command-line then initialize | 538 // If an audio pipe is specific on the command-line then initialize |
| 530 // AudioCapturerLinux to capture from it. | 539 // AudioCapturerLinux to capture from it. |
| 531 FilePath audio_pipe_name = CommandLine::ForCurrentProcess()-> | 540 FilePath audio_pipe_name = CommandLine::ForCurrentProcess()-> |
| 532 GetSwitchValuePath(kAudioPipeSwitchName); | 541 GetSwitchValuePath(kAudioPipeSwitchName); |
| 533 if (!audio_pipe_name.empty()) { | 542 if (!audio_pipe_name.empty()) { |
| 534 remoting::AudioCapturerLinux::InitializePipeReader( | 543 remoting::AudioCapturerLinux::InitializePipeReader( |
| 535 context_->audio_task_runner(), audio_pipe_name); | 544 context_->audio_task_runner(), audio_pipe_name); |
| 536 } | 545 } |
| 537 #endif // defined(OS_LINUX) | 546 #endif // defined(OS_LINUX) |
| 538 | 547 |
| 548 if (CommandLine::ForCurrentProcess()->HasSwitch( |
| 549 kEnableStatusServiceSwitchName)) { |
| 550 context_->network_task_runner()->PostTask( |
| 551 FROM_HERE, |
| 552 base::Bind(&HostProcess::StartHostStatusService, |
| 553 base::Unretained(this))); |
| 554 } |
| 555 |
| 539 // Create a desktop environment factory appropriate to the build type & | 556 // Create a desktop environment factory appropriate to the build type & |
| 540 // platform. | 557 // platform. |
| 541 #if defined(OS_WIN) | 558 #if defined(OS_WIN) |
| 542 | 559 |
| 543 #if defined(REMOTING_MULTI_PROCESS) | 560 #if defined(REMOTING_MULTI_PROCESS) |
| 544 IpcDesktopEnvironmentFactory* desktop_environment_factory = | 561 IpcDesktopEnvironmentFactory* desktop_environment_factory = |
| 545 new IpcDesktopEnvironmentFactory( | 562 new IpcDesktopEnvironmentFactory( |
| 546 daemon_channel_.get(), | 563 daemon_channel_.get(), |
| 547 context_->input_task_runner(), | 564 context_->input_task_runner(), |
| 548 context_->network_task_runner(), | 565 context_->network_task_runner(), |
| (...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 801 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 818 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
| 802 | 819 |
| 803 if (talkgadget_prefix != talkgadget_prefix_) { | 820 if (talkgadget_prefix != talkgadget_prefix_) { |
| 804 LOG(INFO) << "Policy sets talkgadget prefix: " << talkgadget_prefix; | 821 LOG(INFO) << "Policy sets talkgadget prefix: " << talkgadget_prefix; |
| 805 talkgadget_prefix_ = talkgadget_prefix; | 822 talkgadget_prefix_ = talkgadget_prefix; |
| 806 return true; | 823 return true; |
| 807 } | 824 } |
| 808 return false; | 825 return false; |
| 809 } | 826 } |
| 810 | 827 |
| 828 void HostProcess::StartHostStatusService() { |
| 829 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
| 830 status_service_.reset(new HostStatusService()); |
| 831 } |
| 832 |
| 811 void HostProcess::StartHost() { | 833 void HostProcess::StartHost() { |
| 812 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 834 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
| 813 DCHECK(!host_); | 835 DCHECK(!host_); |
| 814 DCHECK(!signal_strategy_.get()); | 836 DCHECK(!signal_strategy_.get()); |
| 815 | 837 |
| 816 if (shutting_down_) | 838 if (shutting_down_) |
| 817 return; | 839 return; |
| 818 | 840 |
| 819 signal_strategy_.reset( | 841 signal_strategy_.reset( |
| 820 new XmppSignalStrategy(context_->url_request_context_getter(), | 842 new XmppSignalStrategy(context_->url_request_context_getter(), |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 881 // and disconnect. | 903 // and disconnect. |
| 882 curtaining_host_observer_.reset(new CurtainingHostObserver( | 904 curtaining_host_observer_.reset(new CurtainingHostObserver( |
| 883 curtain_.get(), host_)); | 905 curtain_.get(), host_)); |
| 884 curtaining_host_observer_->SetEnableCurtaining(curtain_required_); | 906 curtaining_host_observer_->SetEnableCurtaining(curtain_required_); |
| 885 | 907 |
| 886 if (host_user_interface_.get()) { | 908 if (host_user_interface_.get()) { |
| 887 host_user_interface_->Start( | 909 host_user_interface_->Start( |
| 888 host_, base::Bind(&HostProcess::OnDisconnectRequested, this)); | 910 host_, base::Bind(&HostProcess::OnDisconnectRequested, this)); |
| 889 } | 911 } |
| 890 | 912 |
| 913 if (status_service_) |
| 914 status_service_->SetHostIsUp(host_id_); |
| 915 |
| 891 host_->Start(xmpp_login_); | 916 host_->Start(xmpp_login_); |
| 892 | 917 |
| 893 CreateAuthenticatorFactory(); | 918 CreateAuthenticatorFactory(); |
| 894 } | 919 } |
| 895 | 920 |
| 896 void HostProcess::OnAuthFailed() { | 921 void HostProcess::OnAuthFailed() { |
| 897 Shutdown(kInvalidOauthCredentialsExitCode); | 922 Shutdown(kInvalidOauthCredentialsExitCode); |
| 898 } | 923 } |
| 899 | 924 |
| 900 void HostProcess::RejectAuthenticatingClient() { | 925 void HostProcess::RejectAuthenticatingClient() { |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 938 | 963 |
| 939 StartHost(); | 964 StartHost(); |
| 940 } | 965 } |
| 941 | 966 |
| 942 void HostProcess::Shutdown(int exit_code) { | 967 void HostProcess::Shutdown(int exit_code) { |
| 943 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 968 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
| 944 | 969 |
| 945 if (shutting_down_) | 970 if (shutting_down_) |
| 946 return; | 971 return; |
| 947 | 972 |
| 973 if (status_service_) |
| 974 status_service_->SetHostIsDown(); |
| 975 |
| 948 shutting_down_ = true; | 976 shutting_down_ = true; |
| 949 *exit_code_out_ = exit_code; | 977 *exit_code_out_ = exit_code; |
| 950 if (host_) { | 978 if (host_) { |
| 951 host_->Shutdown(base::Bind(&HostProcess::ShutdownOnNetworkThread, this)); | 979 host_->Shutdown(base::Bind(&HostProcess::ShutdownOnNetworkThread, this)); |
| 952 } else { | 980 } else { |
| 953 ShutdownOnNetworkThread(); | 981 ShutdownOnNetworkThread(); |
| 954 } | 982 } |
| 955 } | 983 } |
| 956 | 984 |
| 957 void HostProcess::ShutdownOnNetworkThread() { | 985 void HostProcess::ShutdownOnNetworkThread() { |
| 958 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 986 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
| 959 | 987 |
| 960 // Destroy networking objects while we are on the network thread. | 988 // Destroy networking objects while we are on the network thread. |
| 961 host_ = NULL; | 989 host_ = NULL; |
| 962 ResetHost(); | 990 ResetHost(); |
| 963 | 991 |
| 964 if (policy_watcher_.get()) { | 992 if (policy_watcher_.get()) { |
| 965 base::WaitableEvent done_event(true, false); | 993 base::WaitableEvent done_event(true, false); |
| 966 policy_watcher_->StopWatching(&done_event); | 994 policy_watcher_->StopWatching(&done_event); |
| 967 done_event.Wait(); | 995 done_event.Wait(); |
| 968 policy_watcher_.reset(); | 996 policy_watcher_.reset(); |
| 969 } | 997 } |
| 970 | 998 |
| 999 status_service_.reset(); |
| 1000 |
| 971 // Complete the rest of shutdown on the main thread. | 1001 // Complete the rest of shutdown on the main thread. |
| 972 context_->ui_task_runner()->PostTask(FROM_HERE, | 1002 context_->ui_task_runner()->PostTask(FROM_HERE, |
| 973 base::Bind(&HostProcess::ShutdownOnUiThread, this)); | 1003 base::Bind(&HostProcess::ShutdownOnUiThread, this)); |
| 974 } | 1004 } |
| 975 | 1005 |
| 976 void HostProcess::ResetHost() { | 1006 void HostProcess::ResetHost() { |
| 977 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 1007 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
| 978 | 1008 |
| 979 curtaining_host_observer_.reset(); | 1009 curtaining_host_observer_.reset(); |
| 980 host_event_logger_.reset(); | 1010 host_event_logger_.reset(); |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1081 user32.GetFunctionPointer("SetProcessDPIAware")); | 1111 user32.GetFunctionPointer("SetProcessDPIAware")); |
| 1082 set_process_dpi_aware(); | 1112 set_process_dpi_aware(); |
| 1083 } | 1113 } |
| 1084 | 1114 |
| 1085 // CommandLine::Init() ignores the passed |argc| and |argv| on Windows getting | 1115 // CommandLine::Init() ignores the passed |argc| and |argv| on Windows getting |
| 1086 // the command line from GetCommandLineW(), so we can safely pass NULL here. | 1116 // the command line from GetCommandLineW(), so we can safely pass NULL here. |
| 1087 return main(0, NULL); | 1117 return main(0, NULL); |
| 1088 } | 1118 } |
| 1089 | 1119 |
| 1090 #endif // defined(OS_WIN) | 1120 #endif // defined(OS_WIN) |
| OLD | NEW |