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

Side by Side Diff: chrome/browser/local_discovery/endpoint_resolver.cc

Issue 1442923002: Extract resolution logic from PrivetHTTPAsynchronousFactory (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@1436373002
Patch Set: Created 5 years, 1 month 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
OLDNEW
(Empty)
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/local_discovery/endpoint_resolver.h"
6
7 #include "base/command_line.h"
8 #include "base/debug/dump_without_crashing.h"
9 #include "chrome/browser/local_discovery/service_discovery_shared_client.h"
10 #include "chrome/common/chrome_switches.h"
11 #include "net/base/ip_endpoint.h"
12 #include "net/base/net_util.h"
13
14 namespace local_discovery {
15
16 EndpointResolver::EndpointResolver() {
17 service_discovery_client_ = ServiceDiscoverySharedClient::GetInstance();
18 }
19
20 EndpointResolver::~EndpointResolver() {}
21
22 void EndpointResolver::Start(const std::string& service_name,
23 const ResultCallback& callback) {
24 service_resolver_ = service_discovery_client_->CreateServiceResolver(
25 service_name, base::Bind(&EndpointResolver::ServiceResolveComplete,
26 base::Unretained(this), callback));
27 service_resolver_->StartResolving();
28 }
29
30 void EndpointResolver::ServiceResolveComplete(
31 const ResultCallback& callback,
32 ServiceResolver::RequestStatus result,
33 const ServiceDescription& description) {
34 if (result != ServiceResolver::STATUS_SUCCESS)
35 return callback.Run(net::IPEndPoint());
36
37 Start(description.address, callback);
38 }
39
40 void EndpointResolver::Start(const net::HostPortPair& address,
41 const ResultCallback& callback) {
42 #if defined(OS_MACOSX)
43 net::IPAddressNumber ip_address;
44 if (!net::ParseIPLiteralToNumber(address.host(), &ip_address)) {
45 NOTREACHED() << address.ToString();
46 // Unexpected, but could be a reason for crbug.com/513505
47 base::debug::DumpWithoutCrashing();
48 return callback.Run(net::IPEndPoint());
49 }
50
51 // OSX already has IP there.
52 callback.Run(net::IPEndPoint(ip_address, address.port()));
53 #else // OS_MACOSX
54 net::AddressFamily address_family = net::ADDRESS_FAMILY_UNSPECIFIED;
55 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
56 switches::kPrivetIPv6Only)) {
57 address_family = net::ADDRESS_FAMILY_IPV6;
58 }
59
60 domain_resolver_ = service_discovery_client_->CreateLocalDomainResolver(
61 address.host(), address_family,
62 base::Bind(&EndpointResolver::DomainResolveComplete,
63 base::Unretained(this), address.port(), callback));
64 domain_resolver_->Start();
65 #endif // OS_MACOSX
66 }
67
68 void EndpointResolver::DomainResolveComplete(
69 uint16 port,
70 const ResultCallback& callback,
71 bool success,
72 const net::IPAddressNumber& address_ipv4,
73 const net::IPAddressNumber& address_ipv6) {
74 if (!success)
75 return callback.Run(net::IPEndPoint());
76
77 net::IPAddressNumber address = address_ipv4;
78 if (address.empty())
79 address = address_ipv6;
80
81 DCHECK(!address.empty());
82
83 callback.Run(net::IPEndPoint(address, port));
84 }
85
86 } // namespace local_discovery
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698