Chromium Code Reviews| 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/register_support_host_request.h" | 5 #include "remoting/host/register_support_host_request.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.h" | 9 #include "base/message_loop.h" |
| 10 #include "base/string_number_conversions.h" | 10 #include "base/string_number_conversions.h" |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 29 const char kSignatureTag[] = "signature"; | 29 const char kSignatureTag[] = "signature"; |
| 30 const char kSignatureTimeAttr[] = "time"; | 30 const char kSignatureTimeAttr[] = "time"; |
| 31 | 31 |
| 32 // Strings used to parse responses received from the bot. | 32 // Strings used to parse responses received from the bot. |
| 33 const char kRegisterQueryResultTag[] = "register-support-host-result"; | 33 const char kRegisterQueryResultTag[] = "register-support-host-result"; |
| 34 const char kSupportIdTag[] = "support-id"; | 34 const char kSupportIdTag[] = "support-id"; |
| 35 const char kSupportIdLifetimeTag[] = "support-id-lifetime"; | 35 const char kSupportIdLifetimeTag[] = "support-id-lifetime"; |
| 36 } | 36 } |
| 37 | 37 |
| 38 RegisterSupportHostRequest::RegisterSupportHostRequest() | 38 RegisterSupportHostRequest::RegisterSupportHostRequest() |
| 39 : message_loop_(NULL) { | 39 : signal_strategy_(NULL) { |
| 40 } | 40 } |
| 41 | 41 |
| 42 RegisterSupportHostRequest::~RegisterSupportHostRequest() { | 42 RegisterSupportHostRequest::~RegisterSupportHostRequest() { |
| 43 if (signal_strategy_) | |
| 44 signal_strategy_->RemoveListener(this); | |
| 43 } | 45 } |
| 44 | 46 |
| 45 bool RegisterSupportHostRequest::Init(HostConfig* config, | 47 bool RegisterSupportHostRequest::Init(SignalStrategy* signal_strategy, |
| 48 HostConfig* config, | |
| 46 const RegisterCallback& callback) { | 49 const RegisterCallback& callback) { |
| 47 callback_ = callback; | |
| 48 | |
| 49 if (!key_pair_.Load(config)) { | 50 if (!key_pair_.Load(config)) { |
|
Wez
2012/01/03 16:25:04
nit: Consider DCHECK()ing |signal_strategy|, since
Sergey Ulanov
2012/01/03 21:51:02
Fixed in a different CL.
| |
| 50 return false; | 51 return false; |
| 51 } | 52 } |
| 53 | |
| 54 callback_ = callback; | |
| 55 signal_strategy_ = signal_strategy; | |
| 56 signal_strategy_->AddListener(this); | |
| 57 iq_sender_.reset(new IqSender(signal_strategy_)); | |
| 58 | |
| 52 return true; | 59 return true; |
| 53 } | 60 } |
| 54 | 61 |
| 55 void RegisterSupportHostRequest::OnSignallingConnected( | 62 void RegisterSupportHostRequest::OnSignalStrategyStateChange( |
| 56 SignalStrategy* signal_strategy) { | 63 SignalStrategy::State state) { |
| 57 DCHECK(!callback_.is_null()); | 64 if (state == SignalStrategy::CONNECTED) { |
| 65 DCHECK(!callback_.is_null()); | |
| 58 | 66 |
| 59 message_loop_ = MessageLoop::current(); | 67 request_.reset(iq_sender_->SendIq( |
| 60 | 68 buzz::STR_SET, kChromotingBotJid, |
| 61 iq_sender_.reset(new IqSender(signal_strategy)); | 69 CreateRegistrationRequest(signal_strategy_->GetLocalJid()), |
| 62 request_.reset(iq_sender_->SendIq( | 70 base::Bind(&RegisterSupportHostRequest::ProcessResponse, |
| 63 buzz::STR_SET, kChromotingBotJid, | 71 base::Unretained(this)))); |
| 64 CreateRegistrationRequest(signal_strategy->GetLocalJid()), | 72 } else if (state == SignalStrategy::DISCONNECTED) { |
| 65 base::Bind(&RegisterSupportHostRequest::ProcessResponse, | 73 request_.reset(); |
| 66 base::Unretained(this)))); | 74 if (!callback_.is_null()) { |
| 75 // We will reach here if signaling fails to connect. | |
|
Wez
2012/01/03 16:25:04
Or if signalling disconnects before we've received
Sergey Ulanov
2012/01/03 21:51:02
Done.
| |
| 76 RegisterCallback callback = callback_; | |
| 77 callback_.Reset(); | |
| 78 callback.Run(false, std::string(), base::TimeDelta()); | |
| 79 } | |
| 80 } | |
| 67 } | 81 } |
| 68 | 82 |
| 69 void RegisterSupportHostRequest::OnSignallingDisconnected() { | 83 bool RegisterSupportHostRequest::OnSignalStrategyIncomingStanza( |
| 70 if (!message_loop_) { | 84 const buzz::XmlElement* stanza) { |
| 71 // We will reach here with |message_loop_| NULL if the Host's | 85 return false; |
| 72 // XMPP connection attempt fails. | |
| 73 CHECK(!callback_.is_null()); | |
| 74 DCHECK(!request_.get()); | |
| 75 callback_.Run(false, std::string(), base::TimeDelta()); | |
| 76 return; | |
| 77 } | |
| 78 DCHECK_EQ(message_loop_, MessageLoop::current()); | |
| 79 request_.reset(); | |
| 80 iq_sender_.reset(); | |
| 81 } | 86 } |
| 82 | 87 |
| 83 // Ignore any notifications other than signalling | |
| 84 // connected/disconnected events. | |
| 85 void RegisterSupportHostRequest::OnAccessDenied() { } | |
| 86 void RegisterSupportHostRequest::OnClientAuthenticated( | |
| 87 const std::string& jid) { } | |
| 88 void RegisterSupportHostRequest::OnClientDisconnected( | |
| 89 const std::string& jid) { } | |
| 90 void RegisterSupportHostRequest::OnShutdown() { } | |
| 91 | |
| 92 XmlElement* RegisterSupportHostRequest::CreateRegistrationRequest( | 88 XmlElement* RegisterSupportHostRequest::CreateRegistrationRequest( |
| 93 const std::string& jid) { | 89 const std::string& jid) { |
| 94 XmlElement* query = new XmlElement( | 90 XmlElement* query = new XmlElement( |
| 95 QName(kChromotingXmlNamespace, kRegisterQueryTag)); | 91 QName(kChromotingXmlNamespace, kRegisterQueryTag)); |
| 96 XmlElement* public_key = new XmlElement( | 92 XmlElement* public_key = new XmlElement( |
| 97 QName(kChromotingXmlNamespace, kPublicKeyTag)); | 93 QName(kChromotingXmlNamespace, kPublicKeyTag)); |
| 98 public_key->AddText(key_pair_.GetPublicKey()); | 94 public_key->AddText(key_pair_.GetPublicKey()); |
| 99 query->AddElement(public_key); | 95 query->AddElement(public_key); |
| 100 query->AddElement(CreateSignature(jid)); | 96 query->AddElement(CreateSignature(jid)); |
| 101 return query; | 97 return query; |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 171 return false; | 167 return false; |
| 172 } | 168 } |
| 173 | 169 |
| 174 *support_id = support_id_element->BodyText(); | 170 *support_id = support_id_element->BodyText(); |
| 175 *lifetime = base::TimeDelta::FromSeconds(lifetime_int); | 171 *lifetime = base::TimeDelta::FromSeconds(lifetime_int); |
| 176 return true; | 172 return true; |
| 177 } | 173 } |
| 178 | 174 |
| 179 | 175 |
| 180 void RegisterSupportHostRequest::ProcessResponse(const XmlElement* response) { | 176 void RegisterSupportHostRequest::ProcessResponse(const XmlElement* response) { |
| 181 DCHECK_EQ(message_loop_, MessageLoop::current()); | |
| 182 std::string support_id; | 177 std::string support_id; |
| 183 base::TimeDelta lifetime; | 178 base::TimeDelta lifetime; |
| 184 bool success = ParseResponse(response, &support_id, &lifetime); | 179 bool success = ParseResponse(response, &support_id, &lifetime); |
| 185 callback_.Run(success, support_id, lifetime); | 180 RegisterCallback callback = callback_; |
| 181 callback_.Reset(); | |
| 182 callback.Run(success, support_id, lifetime); | |
| 186 } | 183 } |
| 187 | 184 |
| 188 } // namespace remoting | 185 } // namespace remoting |
| OLD | NEW |