Index: chrome/browser/local_discovery/endpoint_resolver.cc |
diff --git a/chrome/browser/local_discovery/endpoint_resolver.cc b/chrome/browser/local_discovery/endpoint_resolver.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ad5f7c0e8f1e0c33d482a7e093970b45de9ec99e |
--- /dev/null |
+++ b/chrome/browser/local_discovery/endpoint_resolver.cc |
@@ -0,0 +1,86 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/local_discovery/endpoint_resolver.h" |
+ |
+#include "base/command_line.h" |
+#include "base/debug/dump_without_crashing.h" |
+#include "chrome/browser/local_discovery/service_discovery_shared_client.h" |
+#include "chrome/common/chrome_switches.h" |
+#include "net/base/ip_endpoint.h" |
+#include "net/base/net_util.h" |
+ |
+namespace local_discovery { |
+ |
+EndpointResolver::EndpointResolver() { |
+ service_discovery_client_ = ServiceDiscoverySharedClient::GetInstance(); |
+} |
+ |
+EndpointResolver::~EndpointResolver() {} |
+ |
+void EndpointResolver::Start(const std::string& service_name, |
+ const ResultCallback& callback) { |
+ service_resolver_ = service_discovery_client_->CreateServiceResolver( |
+ service_name, base::Bind(&EndpointResolver::ServiceResolveComplete, |
+ base::Unretained(this), callback)); |
+ service_resolver_->StartResolving(); |
+} |
+ |
+void EndpointResolver::ServiceResolveComplete( |
+ const ResultCallback& callback, |
+ ServiceResolver::RequestStatus result, |
+ const ServiceDescription& description) { |
+ if (result != ServiceResolver::STATUS_SUCCESS) |
+ return callback.Run(net::IPEndPoint()); |
+ |
+ Start(description.address, callback); |
+} |
+ |
+void EndpointResolver::Start(const net::HostPortPair& address, |
+ const ResultCallback& callback) { |
+#if defined(OS_MACOSX) |
+ net::IPAddressNumber ip_address; |
+ if (!net::ParseIPLiteralToNumber(address.host(), &ip_address)) { |
+ NOTREACHED() << address.ToString(); |
+ // Unexpected, but could be a reason for crbug.com/513505 |
+ base::debug::DumpWithoutCrashing(); |
+ return callback.Run(net::IPEndPoint()); |
+ } |
+ |
+ // OSX already has IP there. |
+ callback.Run(net::IPEndPoint(ip_address, address.port())); |
+#else // OS_MACOSX |
+ net::AddressFamily address_family = net::ADDRESS_FAMILY_UNSPECIFIED; |
+ if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
+ switches::kPrivetIPv6Only)) { |
+ address_family = net::ADDRESS_FAMILY_IPV6; |
+ } |
+ |
+ domain_resolver_ = service_discovery_client_->CreateLocalDomainResolver( |
+ address.host(), address_family, |
+ base::Bind(&EndpointResolver::DomainResolveComplete, |
+ base::Unretained(this), address.port(), callback)); |
+ domain_resolver_->Start(); |
+#endif // OS_MACOSX |
+} |
+ |
+void EndpointResolver::DomainResolveComplete( |
+ uint16 port, |
+ const ResultCallback& callback, |
+ bool success, |
+ const net::IPAddressNumber& address_ipv4, |
+ const net::IPAddressNumber& address_ipv6) { |
+ if (!success) |
+ return callback.Run(net::IPEndPoint()); |
+ |
+ net::IPAddressNumber address = address_ipv4; |
+ if (address.empty()) |
+ address = address_ipv6; |
+ |
+ DCHECK(!address.empty()); |
+ |
+ callback.Run(net::IPEndPoint(address, port)); |
+} |
+ |
+} // namespace local_discovery |