| 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);
|
|
|
|
|