Index: remoting/host/remoting_me2me_host.cc |
diff --git a/remoting/host/remoting_me2me_host.cc b/remoting/host/remoting_me2me_host.cc |
index 0b58d346b9604e33ffddaddd35e63f908847ea66..20e48f98d9be3f6409e79affa86aa7a8324a7355 100644 |
--- a/remoting/host/remoting_me2me_host.cc |
+++ b/remoting/host/remoting_me2me_host.cc |
@@ -44,6 +44,8 @@ |
#include "remoting/host/desktop_environment.h" |
#include "remoting/host/desktop_session_connector.h" |
#include "remoting/host/dns_blackhole_checker.h" |
+#include "remoting/host/gcd_rest_client.h" |
+#include "remoting/host/gcd_state_updater.h" |
#include "remoting/host/heartbeat_sender.h" |
#include "remoting/host/host_change_notification_listener.h" |
#include "remoting/host/host_config.h" |
@@ -73,6 +75,7 @@ |
#include "remoting/protocol/pairing_registry.h" |
#include "remoting/protocol/port_range.h" |
#include "remoting/protocol/token_validator.h" |
+#include "remoting/signaling/push_notification_subscriber.h" |
#include "remoting/signaling/xmpp_signal_strategy.h" |
#if defined(OS_POSIX) |
@@ -305,6 +308,8 @@ class HostProcess : public ConfigWatcher::Delegate, |
const std::string& file_name, |
const int& line_number); |
+ bool using_gcd() { return !gcd_device_id_.empty(); } |
+ |
scoped_ptr<ChromotingHostContext> context_; |
// Accessed on the UI thread. |
@@ -357,12 +362,17 @@ class HostProcess : public ConfigWatcher::Delegate, |
// Used to specify which window to stream, if enabled. |
webrtc::WindowId window_id_; |
- // |heartbeat_sender_| and |signaling_connector_| have to be destroyed before |
- // |signal_strategy_| because their destructors need to call |
- // signal_strategy_->RemoveListener(this) |
+ // Must outlive |gcd_state_updater_| and |signaling_connector_|. |
+ scoped_ptr<OAuthTokenGetter> oauth_token_getter_; |
+ |
+ // Must outlive |signaling_connector_|, |gcd_subscriber_|, and |
+ // |heartbeat_sender_|. |
scoped_ptr<SignalStrategy> signal_strategy_; |
+ |
scoped_ptr<SignalingConnector> signaling_connector_; |
scoped_ptr<HeartbeatSender> heartbeat_sender_; |
+ scoped_ptr<GcdStateUpdater> gcd_state_updater_; |
+ scoped_ptr<PushNotificationSubscriber> gcd_subscriber_; |
scoped_ptr<HostChangeNotificationListener> host_change_notification_listener_; |
scoped_ptr<HostStatusLogger> host_status_logger_; |
@@ -1305,8 +1315,13 @@ bool HostProcess::OnGnubbyAuthPolicyUpdate(base::DictionaryValue* policies) { |
} |
void HostProcess::InitializeSignaling() { |
- DCHECK(!host_id_.empty()); // |ApplyConfig| should already have been run. |
+ DCHECK(!host_id_.empty()); // ApplyConfig() should already have been run. |
DCHECK(!signal_strategy_); |
+ DCHECK(!oauth_token_getter_); |
+ DCHECK(!signaling_connector_); |
+ DCHECK(!gcd_state_updater_); |
+ DCHECK(!gcd_subscriber_); |
+ DCHECK(!heartbeat_sender_); |
// Create SignalStrategy. |
XmppSignalStrategy* xmpp_signal_strategy = new XmppSignalStrategy( |
@@ -1321,19 +1336,40 @@ void HostProcess::InitializeSignaling() { |
new OAuthTokenGetter::OAuthCredentials(xmpp_server_config_.username, |
oauth_refresh_token_, |
use_service_account_)); |
- scoped_ptr<OAuthTokenGetter> oauth_token_getter(new OAuthTokenGetterImpl( |
+ oauth_token_getter_.reset(new OAuthTokenGetterImpl( |
oauth_credentials.Pass(), context_->url_request_context_getter(), false, |
- gcd_device_id_.empty())); |
+ !using_gcd())); |
signaling_connector_.reset(new SignalingConnector( |
xmpp_signal_strategy, dns_blackhole_checker.Pass(), |
- oauth_token_getter.Pass(), |
+ oauth_token_getter_.get(), |
base::Bind(&HostProcess::OnAuthFailed, base::Unretained(this)))); |
- // Create HeartbeatSender. |
- heartbeat_sender_.reset(new HeartbeatSender( |
- base::Bind(&HostProcess::OnHeartbeatSuccessful, base::Unretained(this)), |
- base::Bind(&HostProcess::OnUnknownHostIdError, base::Unretained(this)), |
- host_id_, xmpp_signal_strategy, key_pair_, directory_bot_jid_)); |
+ if (using_gcd()) { |
+ // Create objects to manage GCD state. |
+ ServiceUrls* service_urls = ServiceUrls::GetInstance(); |
+ scoped_ptr<GcdRestClient> gcd_rest_client(new GcdRestClient( |
+ service_urls->gcd_base_url(), gcd_device_id_, |
+ context_->url_request_context_getter(), oauth_token_getter_.get())); |
+ gcd_state_updater_.reset( |
+ new GcdStateUpdater(base::Bind(&HostProcess::OnHeartbeatSuccessful, |
+ base::Unretained(this)), |
+ base::Bind(&HostProcess::OnUnknownHostIdError, |
+ base::Unretained(this)), |
+ signal_strategy_.get(), gcd_rest_client.Pass())); |
+ |
+ PushNotificationSubscriber::Subscription sub; |
+ sub.channel = "cloud_devices"; |
+ PushNotificationSubscriber::SubscriptionList subs; |
+ subs.push_back(sub); |
+ gcd_subscriber_.reset( |
+ new PushNotificationSubscriber(signal_strategy_.get(), subs)); |
+ } else { |
+ // Create HeartbeatSender. |
+ 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_)); |
+ } |
} |
void HostProcess::StartHostIfReady() { |
@@ -1409,9 +1445,14 @@ void HostProcess::StartHost() { |
host_change_notification_listener_.reset(new HostChangeNotificationListener( |
this, host_id_, signal_strategy_.get(), directory_bot_jid_)); |
- host_status_logger_.reset( |
- new HostStatusLogger(host_->AsWeakPtr(), ServerLogEntry::ME2ME, |
- signal_strategy_.get(), directory_bot_jid_)); |
+ if (using_gcd()) { |
+ // TODO(jrw): Implement logging for GCD hosts. |
+ HOST_LOG << "Logging not implemented for GCD hosts."; |
+ } else { |
+ host_status_logger_.reset(new HostStatusLogger( |
+ host_->AsWeakPtr(), ServerLogEntry::ME2ME, |
+ signal_strategy_.get(), directory_bot_jid_)); |
+ } |
// Set up reporting the host status notifications. |
#if defined(REMOTING_MULTI_PROCESS) |
@@ -1485,10 +1526,18 @@ void HostProcess::GoOffline(const std::string& host_offline_reason) { |
InitializeSignaling(); |
HOST_LOG << "SendHostOfflineReason: sending " << host_offline_reason << "."; |
- heartbeat_sender_->SetHostOfflineReason( |
- host_offline_reason, |
- base::TimeDelta::FromSeconds(kHostOfflineReasonTimeoutSeconds), |
- base::Bind(&HostProcess::OnHostOfflineReasonAck, this)); |
+ if (heartbeat_sender_) { |
+ heartbeat_sender_->SetHostOfflineReason( |
+ host_offline_reason, |
+ base::TimeDelta::FromSeconds(kHostOfflineReasonTimeoutSeconds), |
+ base::Bind(&HostProcess::OnHostOfflineReasonAck, this)); |
+ } |
+ if (gcd_state_updater_) { |
+ gcd_state_updater_->SetHostOfflineReason( |
+ host_offline_reason, |
+ base::TimeDelta::FromSeconds(kHostOfflineReasonTimeoutSeconds), |
+ base::Bind(&HostProcess::OnHostOfflineReasonAck, this)); |
+ } |
return; // Shutdown will resume after OnHostOfflineReasonAck. |
} |
@@ -1504,8 +1553,11 @@ void HostProcess::OnHostOfflineReasonAck(bool success) { |
HOST_LOG << "SendHostOfflineReason " << (success ? "succeeded." : "failed."); |
heartbeat_sender_.reset(); |
+ oauth_token_getter_.reset(); |
signaling_connector_.reset(); |
signal_strategy_.reset(); |
+ gcd_state_updater_.reset(); |
+ gcd_subscriber_.reset(); |
if (state_ == HOST_GOING_OFFLINE_TO_RESTART) { |
SetState(HOST_STARTING); |