| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 #include "remoting/host/heartbeat_sender.h" | 5 #include "remoting/host/heartbeat_sender.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/message_loop_proxy.h" | 9 #include "base/message_loop_proxy.h" |
| 10 #include "base/string_number_conversions.h" | 10 #include "base/string_number_conversions.h" |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 const char kHostIdAttr[] = "hostid"; | 27 const char kHostIdAttr[] = "hostid"; |
| 28 const char kHeartbeatSignatureTag[] = "signature"; | 28 const char kHeartbeatSignatureTag[] = "signature"; |
| 29 const char kSignatureTimeAttr[] = "time"; | 29 const char kSignatureTimeAttr[] = "time"; |
| 30 | 30 |
| 31 const char kHeartbeatResultTag[] = "heartbeat-result"; | 31 const char kHeartbeatResultTag[] = "heartbeat-result"; |
| 32 const char kSetIntervalTag[] = "set-interval"; | 32 const char kSetIntervalTag[] = "set-interval"; |
| 33 | 33 |
| 34 const int64 kDefaultHeartbeatIntervalMs = 5 * 60 * 1000; // 5 minutes. | 34 const int64 kDefaultHeartbeatIntervalMs = 5 * 60 * 1000; // 5 minutes. |
| 35 } | 35 } |
| 36 | 36 |
| 37 HeartbeatSender::HeartbeatSender(base::MessageLoopProxy* message_loop, | 37 HeartbeatSender::HeartbeatSender() |
| 38 MutableHostConfig* config) | |
| 39 | |
| 40 : state_(CREATED), | 38 : state_(CREATED), |
| 41 message_loop_(message_loop), | 39 signal_strategy_(NULL), |
| 42 config_(config), | |
| 43 interval_ms_(kDefaultHeartbeatIntervalMs) { | 40 interval_ms_(kDefaultHeartbeatIntervalMs) { |
| 44 DCHECK(config_); | |
| 45 } | 41 } |
| 46 | 42 |
| 47 HeartbeatSender::~HeartbeatSender() { | 43 HeartbeatSender::~HeartbeatSender() { |
| 48 DCHECK(state_ == CREATED || state_ == INITIALIZED || state_ == STOPPED); | 44 if (signal_strategy_) |
| 45 signal_strategy_->RemoveListener(this); |
| 49 } | 46 } |
| 50 | 47 |
| 51 bool HeartbeatSender::Init() { | 48 bool HeartbeatSender::Init(SignalStrategy* signal_strategy, |
| 49 MutableHostConfig* config) { |
| 52 DCHECK(state_ == CREATED); | 50 DCHECK(state_ == CREATED); |
| 53 | 51 |
| 54 if (!config_->GetString(kHostIdConfigPath, &host_id_)) { | 52 if (!config->GetString(kHostIdConfigPath, &host_id_)) { |
| 55 LOG(ERROR) << "host_id is not defined in the config."; | 53 LOG(ERROR) << "host_id is not defined in the config."; |
| 56 return false; | 54 return false; |
| 57 } | 55 } |
| 58 | 56 |
| 59 if (!key_pair_.Load(config_)) { | 57 if (!key_pair_.Load(config)) { |
| 60 return false; | 58 return false; |
| 61 } | 59 } |
| 62 | 60 |
| 61 DCHECK(signal_strategy); |
| 62 signal_strategy_ = signal_strategy; |
| 63 signal_strategy_->AddListener(this); |
| 64 |
| 63 state_ = INITIALIZED; | 65 state_ = INITIALIZED; |
| 64 | 66 |
| 67 // Update the state if the |signal_strategy_| is already connected. |
| 68 OnSignalStrategyStateChange(signal_strategy_->GetState()); |
| 69 |
| 65 return true; | 70 return true; |
| 66 } | 71 } |
| 67 | 72 |
| 68 void HeartbeatSender::OnSignallingConnected(SignalStrategy* signal_strategy) { | 73 void HeartbeatSender::OnSignalStrategyStateChange(SignalStrategy::State state) { |
| 69 DCHECK(message_loop_->BelongsToCurrentThread()); | 74 if (state == SignalStrategy::CONNECTED) { |
| 70 DCHECK(state_ == INITIALIZED || state_ == STOPPED); | 75 DCHECK(state_ == INITIALIZED || state_ == STOPPED); |
| 71 state_ = STARTED; | 76 state_ = STARTED; |
| 72 | 77 |
| 73 full_jid_ = signal_strategy->GetLocalJid(); | 78 iq_sender_.reset(new IqSender(signal_strategy_)); |
| 74 | 79 |
| 75 iq_sender_.reset(new IqSender(signal_strategy)); | 80 DoSendStanza(); |
| 76 | 81 timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(interval_ms_), |
| 77 DoSendStanza(); | 82 this, &HeartbeatSender::DoSendStanza); |
| 78 timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(interval_ms_), this, | 83 } else if (state == SignalStrategy::DISCONNECTED) { |
| 79 &HeartbeatSender::DoSendStanza); | 84 state_ = STOPPED; |
| 85 request_.reset(); |
| 86 iq_sender_.reset(); |
| 87 timer_.Stop(); |
| 88 } |
| 80 } | 89 } |
| 81 | 90 |
| 82 void HeartbeatSender::OnSignallingDisconnected() { | |
| 83 DCHECK(message_loop_->BelongsToCurrentThread()); | |
| 84 state_ = STOPPED; | |
| 85 request_.reset(); | |
| 86 iq_sender_.reset(); | |
| 87 timer_.Stop(); | |
| 88 } | |
| 89 | |
| 90 // Ignore any notifications other than signalling | |
| 91 // connected/disconnected events. | |
| 92 void HeartbeatSender::OnAccessDenied() { } | |
| 93 void HeartbeatSender::OnClientAuthenticated(const std::string& jid) { } | |
| 94 void HeartbeatSender::OnClientDisconnected(const std::string& jid) { } | |
| 95 void HeartbeatSender::OnShutdown() { } | |
| 96 | |
| 97 void HeartbeatSender::DoSendStanza() { | 91 void HeartbeatSender::DoSendStanza() { |
| 98 DCHECK(message_loop_->BelongsToCurrentThread()); | |
| 99 DCHECK_EQ(state_, STARTED); | 92 DCHECK_EQ(state_, STARTED); |
| 100 | 93 |
| 101 VLOG(1) << "Sending heartbeat stanza to " << kChromotingBotJid; | 94 VLOG(1) << "Sending heartbeat stanza to " << kChromotingBotJid; |
| 102 request_.reset(iq_sender_->SendIq( | 95 request_.reset(iq_sender_->SendIq( |
| 103 buzz::STR_SET, kChromotingBotJid, CreateHeartbeatMessage(), | 96 buzz::STR_SET, kChromotingBotJid, CreateHeartbeatMessage(), |
| 104 base::Bind(&HeartbeatSender::ProcessResponse, | 97 base::Bind(&HeartbeatSender::ProcessResponse, |
| 105 base::Unretained(this)))); | 98 base::Unretained(this)))); |
| 106 } | 99 } |
| 107 | 100 |
| 108 void HeartbeatSender::ProcessResponse(const XmlElement* response) { | 101 void HeartbeatSender::ProcessResponse(const XmlElement* response) { |
| 109 DCHECK(message_loop_->BelongsToCurrentThread()); | |
| 110 | |
| 111 std::string type = response->Attr(buzz::QN_TYPE); | 102 std::string type = response->Attr(buzz::QN_TYPE); |
| 112 if (type == buzz::STR_ERROR) { | 103 if (type == buzz::STR_ERROR) { |
| 113 LOG(ERROR) << "Received error in response to heartbeat: " | 104 LOG(ERROR) << "Received error in response to heartbeat: " |
| 114 << response->Str(); | 105 << response->Str(); |
| 115 return; | 106 return; |
| 116 } | 107 } |
| 117 | 108 |
| 118 // This method must only be called for error or result stanzas. | 109 // This method must only be called for error or result stanzas. |
| 119 DCHECK_EQ(std::string(buzz::STR_RESULT), type); | 110 DCHECK_EQ(std::string(buzz::STR_RESULT), type); |
| 120 | 111 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 160 | 151 |
| 161 XmlElement* HeartbeatSender::CreateSignature() { | 152 XmlElement* HeartbeatSender::CreateSignature() { |
| 162 XmlElement* signature_tag = new XmlElement( | 153 XmlElement* signature_tag = new XmlElement( |
| 163 QName(kChromotingXmlNamespace, kHeartbeatSignatureTag)); | 154 QName(kChromotingXmlNamespace, kHeartbeatSignatureTag)); |
| 164 | 155 |
| 165 int64 time = static_cast<int64>(base::Time::Now().ToDoubleT()); | 156 int64 time = static_cast<int64>(base::Time::Now().ToDoubleT()); |
| 166 std::string time_str(base::Int64ToString(time)); | 157 std::string time_str(base::Int64ToString(time)); |
| 167 signature_tag->AddAttr( | 158 signature_tag->AddAttr( |
| 168 QName(kChromotingXmlNamespace, kSignatureTimeAttr), time_str); | 159 QName(kChromotingXmlNamespace, kSignatureTimeAttr), time_str); |
| 169 | 160 |
| 170 std::string message = full_jid_ + ' ' + time_str; | 161 std::string message = signal_strategy_->GetLocalJid() + ' ' + time_str; |
| 171 std::string signature(key_pair_.GetSignature(message)); | 162 std::string signature(key_pair_.GetSignature(message)); |
| 172 signature_tag->AddText(signature); | 163 signature_tag->AddText(signature); |
| 173 | 164 |
| 174 return signature_tag; | 165 return signature_tag; |
| 175 } | 166 } |
| 176 | 167 |
| 177 } // namespace remoting | 168 } // namespace remoting |
| OLD | NEW |