Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(74)

Side by Side Diff: remoting/host/heartbeat_sender.cc

Issue 9004050: Move signaling connection creation out of ChromotingHost. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: - Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698