blob: d0ffaa72cecb196d969aaa51fc904c8a10aa2f0c [file] [log] [blame]
// 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 "build/build_config.h"
#include "chrome/browser/local_discovery/service_discovery_shared_client.h"
#include "chrome/common/chrome_switches.h"
#include "net/base/ip_address.h"
#include "net/base/ip_endpoint.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::IPAddress ip_address;
if (!ip_address.AssignFromIPLiteral(address.host())) {
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_t port,
const ResultCallback& callback,
bool success,
const net::IPAddress& address_ipv4,
const net::IPAddress& address_ipv6) {
if (!success)
return callback.Run(net::IPEndPoint());
net::IPAddress address = address_ipv4;
if (!address.IsValid())
address = address_ipv6;
DCHECK(address.IsValid());
callback.Run(net::IPEndPoint(address, port));
}
} // namespace local_discovery