Index: remoting/host/heartbeat_sender.cc |
diff --git a/remoting/host/heartbeat_sender.cc b/remoting/host/heartbeat_sender.cc |
index 56ec75121df681dc7e8f9f9155a40b522ab413d6..5ef02b7a0366f7de53b77f127271c70abda861e2 100644 |
--- a/remoting/host/heartbeat_sender.cc |
+++ b/remoting/host/heartbeat_sender.cc |
@@ -34,15 +34,12 @@ const int64 kDefaultHeartbeatIntervalMs = 5 * 60 * 1000; // 5 minutes. |
} |
HeartbeatSender::HeartbeatSender(MessageLoop* message_loop, |
- JingleClient* jingle_client, |
MutableHostConfig* config) |
: state_(CREATED), |
message_loop_(message_loop), |
- jingle_client_(jingle_client), |
config_(config), |
interval_ms_(kDefaultHeartbeatIntervalMs) { |
- DCHECK(jingle_client_); |
DCHECK(config_); |
} |
@@ -67,56 +64,42 @@ bool HeartbeatSender::Init() { |
return true; |
} |
-void HeartbeatSender::Start() { |
- if (MessageLoop::current() != message_loop_) { |
- message_loop_->PostTask( |
- FROM_HERE, NewRunnableMethod(this, &HeartbeatSender::Start)); |
- return; |
- } |
- |
- DCHECK_EQ(INITIALIZED, state_); |
+void HeartbeatSender::OnSignallingConnected(SignalStrategy* signal_strategy, |
+ const std::string& full_jid) { |
+ DCHECK_EQ(MessageLoop::current(), message_loop_); |
+ DCHECK(state_ == INITIALIZED || state_ == STOPPED); |
state_ = STARTED; |
- request_.reset(jingle_client_->CreateIqRequest()); |
+ full_jid_ = full_jid; |
+ request_.reset(signal_strategy->CreateIqRequest()); |
request_->set_callback(NewCallback(this, &HeartbeatSender::ProcessResponse)); |
- message_loop_->PostTask( |
- FROM_HERE, NewRunnableMethod(this, &HeartbeatSender::DoSendStanza)); |
+ DoSendStanza(); |
+ timer_.Start(base::TimeDelta::FromMilliseconds(interval_ms_), this, |
+ &HeartbeatSender::DoSendStanza); |
} |
-void HeartbeatSender::Stop() { |
- if (MessageLoop::current() != message_loop_) { |
- message_loop_->PostTask( |
- FROM_HERE, NewRunnableMethod(this, &HeartbeatSender::Stop)); |
- return; |
- } |
- |
- // We may call Stop() even if we have not started. |
- if (state_ != STARTED) |
- return; |
+void HeartbeatSender::OnSignallingDisconnected() { |
+ DCHECK_EQ(MessageLoop::current(), message_loop_); |
+ DCHECK_EQ(state_, STARTED); |
state_ = STOPPED; |
request_.reset(NULL); |
} |
-void HeartbeatSender::DoSendStanza() { |
- if (state_ == STARTED) { |
- // |jingle_client_| may be already destroyed if |state_| is set to |
- // |STOPPED|, so don't touch it here unless we are in |STARTED| state. |
- DCHECK(MessageLoop::current() == message_loop_); |
- |
- VLOG(1) << "Sending heartbeat stanza to " << kChromotingBotJid; |
+void HeartbeatSender::OnShutdown() { |
+} |
- request_->SendIq(buzz::STR_SET, kChromotingBotJid, |
- CreateHeartbeatMessage()); |
+void HeartbeatSender::DoSendStanza() { |
+ DCHECK_EQ(MessageLoop::current(), message_loop_); |
+ DCHECK_EQ(state_, STARTED); |
- // Schedule next heartbeat. |
- message_loop_->PostDelayedTask( |
- FROM_HERE, NewRunnableMethod(this, &HeartbeatSender::DoSendStanza), |
- interval_ms_); |
- } |
+ VLOG(1) << "Sending heartbeat stanza to " << kChromotingBotJid; |
+ request_->SendIq(buzz::STR_SET, kChromotingBotJid, CreateHeartbeatMessage()); |
} |
void HeartbeatSender::ProcessResponse(const XmlElement* response) { |
+ DCHECK_EQ(MessageLoop::current(), message_loop_); |
+ |
std::string type = response->Attr(buzz::QN_TYPE); |
if (type == buzz::STR_ERROR) { |
LOG(ERROR) << "Received error in response to heartbeat: " |
@@ -140,12 +123,25 @@ void HeartbeatSender::ProcessResponse(const XmlElement* response) { |
LOG(ERROR) << "Received invalid set-interval: " |
<< set_interval_element->Str(); |
} else { |
- interval_ms_ = interval * base::Time::kMillisecondsPerSecond; |
+ SetInterval(interval * base::Time::kMillisecondsPerSecond); |
} |
} |
} |
} |
+void HeartbeatSender::SetInterval(int interval) { |
+ if (interval != interval_ms_) { |
+ interval_ms_ = interval; |
+ |
+ // Restart the timer with the new interval. |
+ if (state_ == STARTED) { |
+ timer_.Stop(); |
+ timer_.Start(base::TimeDelta::FromMilliseconds(interval_ms_), this, |
+ &HeartbeatSender::DoSendStanza); |
+ } |
+ } |
+} |
+ |
XmlElement* HeartbeatSender::CreateHeartbeatMessage() { |
XmlElement* query = new XmlElement( |
QName(kChromotingXmlNamespace, kHeartbeatQueryTag)); |
@@ -163,7 +159,7 @@ XmlElement* HeartbeatSender::CreateSignature() { |
signature_tag->AddAttr( |
QName(kChromotingXmlNamespace, kSignatureTimeAttr), time_str); |
- std::string message = jingle_client_->GetFullJid() + ' ' + time_str; |
+ std::string message = full_jid_ + ' ' + time_str; |
std::string signature(key_pair_.GetSignature(message)); |
signature_tag->AddText(signature); |