| Index: remoting/host/remoting_me2me_host.cc
|
| diff --git a/remoting/host/remoting_me2me_host.cc b/remoting/host/remoting_me2me_host.cc
|
| index 74ce044c191511685861374f07e5a4b3db328ebf..a364e19164c95abde3393d929e205dcdd0ae9443 100644
|
| --- a/remoting/host/remoting_me2me_host.cc
|
| +++ b/remoting/host/remoting_me2me_host.cc
|
| @@ -26,7 +26,6 @@
|
| #include "ipc/ipc_channel_proxy.h"
|
| #include "ipc/ipc_listener.h"
|
| #include "media/base/media.h"
|
| -#include "net/base/network_change_notifier.h"
|
| #include "net/socket/client_socket_factory.h"
|
| #include "net/socket/ssl_server_socket.h"
|
| #include "net/url_request/url_fetcher.h"
|
| @@ -45,13 +44,12 @@
|
| #include "remoting/host/config_watcher.h"
|
| #include "remoting/host/desktop_environment.h"
|
| #include "remoting/host/desktop_session_connector.h"
|
| -#include "remoting/host/dns_blackhole_checker.h"
|
| -#include "remoting/host/heartbeat_sender.h"
|
| #include "remoting/host/host_change_notification_listener.h"
|
| #include "remoting/host/host_config.h"
|
| #include "remoting/host/host_event_logger.h"
|
| #include "remoting/host/host_exit_codes.h"
|
| #include "remoting/host/host_main.h"
|
| +#include "remoting/host/host_signaling_manager.h"
|
| #include "remoting/host/host_status_logger.h"
|
| #include "remoting/host/ipc_constants.h"
|
| #include "remoting/host/ipc_desktop_environment.h"
|
| @@ -143,15 +141,19 @@ const char kWindowIdSwitchName[] = "window-id";
|
| // of the process.
|
| const int kShutdownTimeoutSeconds = 15;
|
|
|
| +// Maximum time to wait for reporting host-offline-reason to the service,
|
| +// before continuing normal process shutdown.
|
| +const int kHostOfflineReasonTimeoutSeconds = 10;
|
| +
|
| } // namespace
|
|
|
| namespace remoting {
|
|
|
| -class HostProcess
|
| - : public ConfigWatcher::Delegate,
|
| - public HostChangeNotificationListener::Listener,
|
| - public IPC::Listener,
|
| - public base::RefCountedThreadSafe<HostProcess> {
|
| +class HostProcess : public ConfigWatcher::Delegate,
|
| + public HostSignalingManager::Listener,
|
| + public HostChangeNotificationListener::Listener,
|
| + public IPC::Listener,
|
| + public base::RefCountedThreadSafe<HostProcess> {
|
| public:
|
| // |shutdown_watchdog| is armed when shutdown is started, and should be kept
|
| // alive as long as possible until the process exits (since destroying the
|
| @@ -254,19 +256,23 @@ class HostProcess
|
| bool OnPairingPolicyUpdate(base::DictionaryValue* policies);
|
| bool OnGnubbyAuthPolicyUpdate(base::DictionaryValue* policies);
|
|
|
| - void StartHost();
|
| + scoped_ptr<HostSignalingManager> CreateHostSignalingManager();
|
|
|
| - void OnHeartbeatSuccessful();
|
| - void OnUnknownHostIdError();
|
| + void StartHost();
|
|
|
| - void OnAuthFailed();
|
| + // Overrides for HostSignalingManager::Listener interface.
|
| + void OnHeartbeatSuccessful() override;
|
| + void OnUnknownHostIdError() override;
|
| + void OnAuthFailed() override;
|
|
|
| void RestartHost();
|
|
|
| // Stops the host and shuts down the process with the specified |exit_code|.
|
| void ShutdownHost(HostExitCodes exit_code);
|
|
|
| - void ScheduleHostShutdown();
|
| + // Private helper used by ShutdownHost method to initiate sending of
|
| + // host-offline-reason before continuing shutdown.
|
| + void SendOfflineReasonAndShutdownOnNetworkThread(HostExitCodes exit_code);
|
|
|
| void ShutdownOnNetworkThread();
|
|
|
| @@ -289,9 +295,6 @@ class HostProcess
|
|
|
| scoped_ptr<ChromotingHostContext> context_;
|
|
|
| - // Created on the UI thread but used from the network thread.
|
| - scoped_ptr<net::NetworkChangeNotifier> network_change_notifier_;
|
| -
|
| // Accessed on the UI thread.
|
| scoped_ptr<IPC::ChannelProxy> daemon_channel_;
|
|
|
| @@ -341,10 +344,10 @@ class HostProcess
|
| // Used to specify which window to stream, if enabled.
|
| webrtc::WindowId window_id_;
|
|
|
| - scoped_ptr<OAuthTokenGetter> oauth_token_getter_;
|
| - scoped_ptr<XmppSignalStrategy> signal_strategy_;
|
| - scoped_ptr<SignalingConnector> signaling_connector_;
|
| - scoped_ptr<HeartbeatSender> heartbeat_sender_;
|
| + // Used to send heartbeats while running, and the reason for going offline
|
| + // when shutting down.
|
| + scoped_ptr<HostSignalingManager> host_signaling_manager_;
|
| +
|
| scoped_ptr<HostChangeNotificationListener> host_change_notification_listener_;
|
| scoped_ptr<HostStatusLogger> host_status_logger_;
|
| scoped_ptr<HostEventLogger> host_event_logger_;
|
| @@ -364,6 +367,8 @@ class HostProcess
|
| scoped_refptr<PairingRegistry> pairing_registry_;
|
|
|
| ShutdownWatchdog* shutdown_watchdog_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(HostProcess);
|
| };
|
|
|
| HostProcess::HostProcess(scoped_ptr<ChromotingHostContext> context,
|
| @@ -777,7 +782,6 @@ void HostProcess::ShutdownOnUiThread() {
|
| DCHECK(context_->ui_task_runner()->BelongsToCurrentThread());
|
|
|
| // Tear down resources that need to be torn down on the UI thread.
|
| - network_change_notifier_.reset();
|
| daemon_channel_.reset();
|
| desktop_environment_factory_.reset();
|
|
|
| @@ -793,7 +797,6 @@ void HostProcess::ShutdownOnUiThread() {
|
| #endif
|
| }
|
|
|
| -// Overridden from HeartbeatSender::Listener
|
| void HostProcess::OnUnknownHostIdError() {
|
| LOG(ERROR) << "Host ID not found.";
|
| ShutdownHost(kInvalidHostIdExitCode);
|
| @@ -899,7 +902,8 @@ bool HostProcess::ApplyConfig(const base::DictionaryValue& config) {
|
| }
|
|
|
| if (!oauth_refresh_token_.empty()) {
|
| - // SignalingConnector is responsible for getting OAuth token.
|
| + // SignalingConnector (inside HostSignalingManager) is responsible for
|
| + // getting OAuth token.
|
| xmpp_server_config_.auth_token = "";
|
| xmpp_server_config_.auth_service = "oauth2";
|
| } else if (!config.GetString(kXmppAuthServiceConfigPath,
|
| @@ -1279,44 +1283,32 @@ bool HostProcess::OnGnubbyAuthPolicyUpdate(base::DictionaryValue* policies) {
|
| return true;
|
| }
|
|
|
| +scoped_ptr<HostSignalingManager> HostProcess::CreateHostSignalingManager() {
|
| + DCHECK(!host_id_.empty()); // |ApplyConfig| should already have been run.
|
| +
|
| + scoped_ptr<OAuthTokenGetter::OAuthCredentials> oauth_credentials(
|
| + new OAuthTokenGetter::OAuthCredentials(xmpp_server_config_.username,
|
| + oauth_refresh_token_,
|
| + use_service_account_));
|
| +
|
| + return HostSignalingManager::Create(this, context_->network_task_runner(),
|
| + context_->url_request_context_getter(),
|
| + xmpp_server_config_, talkgadget_prefix_,
|
| + host_id_, key_pair_, directory_bot_jid_,
|
| + oauth_credentials.Pass());
|
| +}
|
| +
|
| void HostProcess::StartHost() {
|
| DCHECK(context_->network_task_runner()->BelongsToCurrentThread());
|
| DCHECK(!host_);
|
| - DCHECK(!signal_strategy_.get());
|
| + DCHECK(!host_signaling_manager_);
|
| +
|
| DCHECK(state_ == HOST_INITIALIZING || state_ == HOST_STOPPING_TO_RESTART ||
|
| - state_ == HOST_STOPPED) << state_;
|
| + state_ == HOST_STOPPED)
|
| + << "state_ = " << state_;
|
| state_ = HOST_STARTED;
|
|
|
| - signal_strategy_.reset(
|
| - new XmppSignalStrategy(net::ClientSocketFactory::GetDefaultFactory(),
|
| - context_->url_request_context_getter(),
|
| - xmpp_server_config_));
|
| -
|
| - scoped_ptr<DnsBlackholeChecker> dns_blackhole_checker(
|
| - new DnsBlackholeChecker(context_->url_request_context_getter(),
|
| - talkgadget_prefix_));
|
| -
|
| - // Create a NetworkChangeNotifier for use by the signaling connector.
|
| - network_change_notifier_.reset(net::NetworkChangeNotifier::Create());
|
| -
|
| - signaling_connector_.reset(new SignalingConnector(
|
| - signal_strategy_.get(),
|
| - dns_blackhole_checker.Pass(),
|
| - base::Bind(&HostProcess::OnAuthFailed, this)));
|
| -
|
| - if (!oauth_refresh_token_.empty()) {
|
| - scoped_ptr<OAuthTokenGetter::OAuthCredentials> oauth_credentials;
|
| - oauth_credentials.reset(
|
| - new OAuthTokenGetter::OAuthCredentials(
|
| - xmpp_server_config_.username, oauth_refresh_token_,
|
| - use_service_account_));
|
| -
|
| - oauth_token_getter_.reset(new OAuthTokenGetter(
|
| - oauth_credentials.Pass(), context_->url_request_context_getter(),
|
| - false));
|
| -
|
| - signaling_connector_->EnableOAuth(oauth_token_getter_.get());
|
| - }
|
| + host_signaling_manager_ = CreateHostSignalingManager();
|
|
|
| uint32 network_flags = 0;
|
| if (allow_nat_traversal_) {
|
| @@ -1340,15 +1332,14 @@ void HostProcess::StartHost() {
|
| }
|
|
|
| host_.reset(new ChromotingHost(
|
| - signal_strategy_.get(),
|
| + host_signaling_manager_->signal_strategy(),
|
| desktop_environment_factory_.get(),
|
| - CreateHostSessionManager(signal_strategy_.get(), network_settings,
|
| + CreateHostSessionManager(host_signaling_manager_->signal_strategy(),
|
| + network_settings,
|
| context_->url_request_context_getter()),
|
| - context_->audio_task_runner(),
|
| - context_->input_task_runner(),
|
| + context_->audio_task_runner(), context_->input_task_runner(),
|
| context_->video_capture_task_runner(),
|
| - context_->video_encode_task_runner(),
|
| - context_->network_task_runner(),
|
| + context_->video_encode_task_runner(), context_->network_task_runner(),
|
| context_->ui_task_runner()));
|
|
|
| if (enable_vp9_) {
|
| @@ -1370,17 +1361,13 @@ void HostProcess::StartHost() {
|
| host_->SetMaximumSessionDuration(base::TimeDelta::FromHours(20));
|
| #endif
|
|
|
| - heartbeat_sender_.reset(new HeartbeatSender(
|
| - base::Bind(&HostProcess::OnHeartbeatSuccessful, base::Unretained(this)),
|
| - base::Bind(&HostProcess::OnUnknownHostIdError, base::Unretained(this)),
|
| - host_id_, signal_strategy_.get(), key_pair_, directory_bot_jid_));
|
| -
|
| host_change_notification_listener_.reset(new HostChangeNotificationListener(
|
| - this, host_id_, signal_strategy_.get(), directory_bot_jid_));
|
| + this, host_id_, host_signaling_manager_->signal_strategy(),
|
| + directory_bot_jid_));
|
|
|
| - host_status_logger_.reset(
|
| - new HostStatusLogger(host_->AsWeakPtr(), ServerLogEntry::ME2ME,
|
| - signal_strategy_.get(), directory_bot_jid_));
|
| + host_status_logger_.reset(new HostStatusLogger(
|
| + host_->AsWeakPtr(), ServerLogEntry::ME2ME,
|
| + host_signaling_manager_->signal_strategy(), directory_bot_jid_));
|
|
|
| // Set up reporting the host status notifications.
|
| #if defined(REMOTING_MULTI_PROCESS)
|
| @@ -1409,6 +1396,16 @@ void HostProcess::RestartHost() {
|
| ShutdownOnNetworkThread();
|
| }
|
|
|
| +void HostProcess::SendOfflineReasonAndShutdownOnNetworkThread(
|
| + HostExitCodes exit_code) {
|
| + DCHECK(context_->network_task_runner()->BelongsToCurrentThread());
|
| + DCHECK(host_signaling_manager_);
|
| + host_signaling_manager_.release()->SendHostOfflineReasonAndDelete(
|
| + ExitCodeToString(exit_code),
|
| + base::TimeDelta::FromSeconds(kHostOfflineReasonTimeoutSeconds));
|
| + ShutdownOnNetworkThread();
|
| +}
|
| +
|
| void HostProcess::ShutdownHost(HostExitCodes exit_code) {
|
| DCHECK(context_->network_task_runner()->BelongsToCurrentThread());
|
|
|
| @@ -1417,14 +1414,14 @@ void HostProcess::ShutdownHost(HostExitCodes exit_code) {
|
| switch (state_) {
|
| case HOST_INITIALIZING:
|
| state_ = HOST_STOPPING;
|
| - ShutdownOnNetworkThread();
|
| + DCHECK(!host_signaling_manager_);
|
| + host_signaling_manager_ = CreateHostSignalingManager();
|
| + SendOfflineReasonAndShutdownOnNetworkThread(exit_code);
|
| break;
|
|
|
| case HOST_STARTED:
|
| state_ = HOST_STOPPING;
|
| - heartbeat_sender_->SetHostOfflineReason(
|
| - ExitCodeToString(exit_code), base::Bind(base::DoNothing));
|
| - ScheduleHostShutdown();
|
| + SendOfflineReasonAndShutdownOnNetworkThread(exit_code);
|
| break;
|
|
|
| case HOST_STOPPING_TO_RESTART:
|
| @@ -1438,28 +1435,14 @@ void HostProcess::ShutdownHost(HostExitCodes exit_code) {
|
| }
|
| }
|
|
|
| -// TODO(weitaosu): shut down the host once we get an ACK for the offline status
|
| -// XMPP message.
|
| -void HostProcess::ScheduleHostShutdown() {
|
| - // Delay the shutdown by 2 second to allow SendOfflineStatus to complete.
|
| - context_->network_task_runner()->PostDelayedTask(
|
| - FROM_HERE,
|
| - base::Bind(&HostProcess::ShutdownOnNetworkThread, base::Unretained(this)),
|
| - base::TimeDelta::FromSeconds(2));
|
| -}
|
| -
|
| void HostProcess::ShutdownOnNetworkThread() {
|
| DCHECK(context_->network_task_runner()->BelongsToCurrentThread());
|
|
|
| host_.reset();
|
| host_event_logger_.reset();
|
| host_status_logger_.reset();
|
| - heartbeat_sender_.reset();
|
| + host_signaling_manager_.reset();
|
| host_change_notification_listener_.reset();
|
| - signaling_connector_.reset();
|
| - oauth_token_getter_.reset();
|
| - signal_strategy_.reset();
|
| - network_change_notifier_.reset();
|
|
|
| if (state_ == HOST_STOPPING_TO_RESTART) {
|
| StartHost();
|
|
|