Index: remoting/jingle_glue/jingle_info_request.cc |
diff --git a/remoting/jingle_glue/jingle_info_request.cc b/remoting/jingle_glue/jingle_info_request.cc |
index b8866b5bc46976f604acfc8fe6a10a9c0b266219..1dabf2625e8fe0af0f3d6c891bb4f054542edde9 100644 |
--- a/remoting/jingle_glue/jingle_info_request.cc |
+++ b/remoting/jingle_glue/jingle_info_request.cc |
@@ -5,7 +5,11 @@ |
#include "remoting/jingle_glue/jingle_info_request.h" |
#include "base/task.h" |
+#include "base/message_loop.h" |
+#include "base/stl_util.h" |
#include "base/string_number_conversions.h" |
+#include "net/base/net_util.h" |
+#include "remoting/jingle_glue/host_resolver.h" |
#include "remoting/jingle_glue/iq_request.h" |
#include "third_party/libjingle/source/talk/base/socketaddress.h" |
#include "third_party/libjingle/source/talk/xmllite/xmlelement.h" |
@@ -13,12 +17,17 @@ |
namespace remoting { |
-JingleInfoRequest::JingleInfoRequest(IqRequest* request) |
- : request_(request) { |
+ |
+JingleInfoRequest::JingleInfoRequest(IqRequest* request, |
+ HostResolverFactory* host_resolver_factory) |
+ : host_resolver_factory_(host_resolver_factory), |
+ request_(request) { |
request_->set_callback(NewCallback(this, &JingleInfoRequest::OnResponse)); |
} |
JingleInfoRequest::~JingleInfoRequest() { |
+ STLDeleteContainerPointers(stun_dns_requests_.begin(), |
+ stun_dns_requests_.end()); |
} |
void JingleInfoRequest::Send(const OnJingleInfoCallback& callback) { |
@@ -28,10 +37,6 @@ void JingleInfoRequest::Send(const OnJingleInfoCallback& callback) { |
} |
void JingleInfoRequest::OnResponse(const buzz::XmlElement* stanza) { |
- std::vector<std::string> relay_hosts; |
- std::vector<talk_base::SocketAddress> stun_hosts; |
- std::string relay_token; |
- |
const buzz::XmlElement* query = |
stanza->FirstNamed(buzz::QN_JINGLE_INFO_QUERY); |
if (query == NULL) { |
@@ -53,7 +58,12 @@ void JingleInfoRequest::OnResponse(const buzz::XmlElement* stanza) { |
if (!base::StringToInt(port_str, &port)) { |
LOG(WARNING) << "Unable to parse port in stanza" << stanza->Str(); |
} else { |
- stun_hosts.push_back(talk_base::SocketAddress(host, port)); |
+ net::IPAddressNumber ip_number; |
+ HostResolver* resolver = host_resolver_factory_->CreateHostResolver(); |
+ stun_dns_requests_.insert(resolver); |
+ resolver->SignalDone.connect( |
+ this, &JingleInfoRequest::OnStunAddressResponse); |
+ resolver->Resolve(talk_base::SocketAddress(host, port)); |
} |
} |
} |
@@ -61,19 +71,31 @@ void JingleInfoRequest::OnResponse(const buzz::XmlElement* stanza) { |
const buzz::XmlElement* relay = query->FirstNamed(buzz::QN_JINGLE_INFO_RELAY); |
if (relay) { |
- relay_token = relay->TextNamed(buzz::QN_JINGLE_INFO_TOKEN); |
+ relay_token_ = relay->TextNamed(buzz::QN_JINGLE_INFO_TOKEN); |
for (const buzz::XmlElement* server = |
relay->FirstNamed(buzz::QN_JINGLE_INFO_SERVER); |
server != NULL; |
server = server->NextNamed(buzz::QN_JINGLE_INFO_SERVER)) { |
std::string host = server->Attr(buzz::QN_JINGLE_INFO_HOST); |
- if (host != buzz::STR_EMPTY) { |
- relay_hosts.push_back(host); |
- } |
+ if (host != buzz::STR_EMPTY) |
+ relay_hosts_.push_back(host); |
} |
} |
- on_jingle_info_cb_.Run(relay_token, relay_hosts, stun_hosts); |
+ if (stun_dns_requests_.empty()) |
+ on_jingle_info_cb_.Run(relay_token_, relay_hosts_, stun_hosts_); |
+} |
+ |
+void JingleInfoRequest::OnStunAddressResponse( |
+ HostResolver* resolver, const talk_base::SocketAddress& address) { |
+ if (!address.IsNil()) |
+ stun_hosts_.push_back(address); |
+ |
+ MessageLoop::current()->DeleteSoon(FROM_HERE, resolver); |
+ stun_dns_requests_.erase(resolver); |
+ |
+ if (stun_dns_requests_.empty()) |
+ on_jingle_info_cb_.Run(relay_token_, relay_hosts_, stun_hosts_); |
} |
} // namespace remoting |