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 DCHECK(state_ == CREATED || state_ == INITIALIZED || state_ == STOPPED); |
Wez
2012/01/03 16:25:04
nit: |state_| != STARTED is really what you mean h
Sergey Ulanov
2012/01/03 21:51:02
Heh, I originally wrote it as |state_| != STARTED,
| |
45 if (signal_strategy_) | |
46 signal_strategy_->RemoveListener(this); | |
49 } | 47 } |
50 | 48 |
51 bool HeartbeatSender::Init() { | 49 bool HeartbeatSender::Init(SignalStrategy* signal_strategy, |
50 MutableHostConfig* config) { | |
52 DCHECK(state_ == CREATED); | 51 DCHECK(state_ == CREATED); |
53 | 52 |
54 if (!config_->GetString(kHostIdConfigPath, &host_id_)) { | 53 if (!config->GetString(kHostIdConfigPath, &host_id_)) { |
55 LOG(ERROR) << "host_id is not defined in the config."; | 54 LOG(ERROR) << "host_id is not defined in the config."; |
56 return false; | 55 return false; |
57 } | 56 } |
58 | 57 |
59 if (!key_pair_.Load(config_)) { | 58 if (!key_pair_.Load(config)) { |
60 return false; | 59 return false; |
61 } | 60 } |
62 | 61 |
62 DCHECK(signal_strategy); | |
63 signal_strategy_ = signal_strategy; | |
64 signal_strategy_->AddListener(this); | |
Wez
2012/01/03 16:25:04
What happens if the SignalStrategy is already conn
Sergey Ulanov
2012/01/03 21:51:02
Added OnSignalStrategyStateChange() call below to
| |
65 | |
63 state_ = INITIALIZED; | 66 state_ = INITIALIZED; |
64 | 67 |
65 return true; | 68 return true; |
66 } | 69 } |
67 | 70 |
68 void HeartbeatSender::OnSignallingConnected(SignalStrategy* signal_strategy) { | 71 void HeartbeatSender::OnSignalStrategyStateChange(SignalStrategy::State state) { |
69 DCHECK(message_loop_->BelongsToCurrentThread()); | 72 if (state == SignalStrategy::CONNECTED) { |
70 DCHECK(state_ == INITIALIZED || state_ == STOPPED); | 73 DCHECK(state_ == INITIALIZED || state_ == STOPPED); |
71 state_ = STARTED; | 74 state_ = STARTED; |
72 | 75 |
73 full_jid_ = signal_strategy->GetLocalJid(); | 76 iq_sender_.reset(new IqSender(signal_strategy_)); |
74 | 77 |
75 iq_sender_.reset(new IqSender(signal_strategy)); | 78 DoSendStanza(); |
76 | 79 timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(interval_ms_), |
77 DoSendStanza(); | 80 this, &HeartbeatSender::DoSendStanza); |
78 timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(interval_ms_), this, | 81 } else if (state == SignalStrategy::DISCONNECTED) { |
79 &HeartbeatSender::DoSendStanza); | 82 state_ = STOPPED; |
Wez
2012/01/03 16:25:04
Surely this should be INITIALIZED?
Sergey Ulanov
2012/01/03 21:51:02
STOPPED is correct here. Anyway, in my next CL I r
| |
83 request_.reset(); | |
84 iq_sender_.reset(); | |
85 timer_.Stop(); | |
86 } | |
80 } | 87 } |
81 | 88 |
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() { | 89 void HeartbeatSender::DoSendStanza() { |
98 DCHECK(message_loop_->BelongsToCurrentThread()); | |
99 DCHECK_EQ(state_, STARTED); | 90 DCHECK_EQ(state_, STARTED); |
100 | 91 |
101 VLOG(1) << "Sending heartbeat stanza to " << kChromotingBotJid; | 92 VLOG(1) << "Sending heartbeat stanza to " << kChromotingBotJid; |
102 request_.reset(iq_sender_->SendIq( | 93 request_.reset(iq_sender_->SendIq( |
103 buzz::STR_SET, kChromotingBotJid, CreateHeartbeatMessage(), | 94 buzz::STR_SET, kChromotingBotJid, CreateHeartbeatMessage(), |
104 base::Bind(&HeartbeatSender::ProcessResponse, | 95 base::Bind(&HeartbeatSender::ProcessResponse, |
105 base::Unretained(this)))); | 96 base::Unretained(this)))); |
106 } | 97 } |
107 | 98 |
108 void HeartbeatSender::ProcessResponse(const XmlElement* response) { | 99 void HeartbeatSender::ProcessResponse(const XmlElement* response) { |
109 DCHECK(message_loop_->BelongsToCurrentThread()); | |
110 | |
111 std::string type = response->Attr(buzz::QN_TYPE); | 100 std::string type = response->Attr(buzz::QN_TYPE); |
112 if (type == buzz::STR_ERROR) { | 101 if (type == buzz::STR_ERROR) { |
113 LOG(ERROR) << "Received error in response to heartbeat: " | 102 LOG(ERROR) << "Received error in response to heartbeat: " |
114 << response->Str(); | 103 << response->Str(); |
115 return; | 104 return; |
116 } | 105 } |
117 | 106 |
118 // This method must only be called for error or result stanzas. | 107 // This method must only be called for error or result stanzas. |
119 DCHECK_EQ(std::string(buzz::STR_RESULT), type); | 108 DCHECK_EQ(std::string(buzz::STR_RESULT), type); |
120 | 109 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
160 | 149 |
161 XmlElement* HeartbeatSender::CreateSignature() { | 150 XmlElement* HeartbeatSender::CreateSignature() { |
162 XmlElement* signature_tag = new XmlElement( | 151 XmlElement* signature_tag = new XmlElement( |
163 QName(kChromotingXmlNamespace, kHeartbeatSignatureTag)); | 152 QName(kChromotingXmlNamespace, kHeartbeatSignatureTag)); |
164 | 153 |
165 int64 time = static_cast<int64>(base::Time::Now().ToDoubleT()); | 154 int64 time = static_cast<int64>(base::Time::Now().ToDoubleT()); |
166 std::string time_str(base::Int64ToString(time)); | 155 std::string time_str(base::Int64ToString(time)); |
167 signature_tag->AddAttr( | 156 signature_tag->AddAttr( |
168 QName(kChromotingXmlNamespace, kSignatureTimeAttr), time_str); | 157 QName(kChromotingXmlNamespace, kSignatureTimeAttr), time_str); |
169 | 158 |
170 std::string message = full_jid_ + ' ' + time_str; | 159 std::string message = signal_strategy_->GetLocalJid() + ' ' + time_str; |
171 std::string signature(key_pair_.GetSignature(message)); | 160 std::string signature(key_pair_.GetSignature(message)); |
172 signature_tag->AddText(signature); | 161 signature_tag->AddText(signature); |
173 | 162 |
174 return signature_tag; | 163 return signature_tag; |
175 } | 164 } |
176 | 165 |
177 } // namespace remoting | 166 } // namespace remoting |
OLD | NEW |