OLD | NEW |
(Empty) | |
| 1 // Copyright 2014 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/privet_http_asynchronous_factory_impl.h
" |
| 6 |
| 7 #include "base/bind.h" |
| 8 #include "base/command_line.h" |
| 9 #include "base/strings/stringprintf.h" |
| 10 #include "chrome/browser/local_discovery/privet_http_impl.h" |
| 11 #include "chrome/common/chrome_switches.h" |
| 12 |
| 13 namespace local_discovery { |
| 14 |
| 15 namespace { |
| 16 |
| 17 std::string IPAddressToHostString(const net::IPAddressNumber& address) { |
| 18 std::string address_str = net::IPAddressToString(address); |
| 19 |
| 20 // IPv6 addresses need to be surrounded by brackets. |
| 21 if (address.size() == net::kIPv6AddressSize) { |
| 22 address_str = base::StringPrintf("[%s]", address_str.c_str()); |
| 23 } |
| 24 |
| 25 return address_str; |
| 26 } |
| 27 |
| 28 } // namespace |
| 29 |
| 30 PrivetHTTPAsynchronousFactoryImpl::PrivetHTTPAsynchronousFactoryImpl( |
| 31 ServiceDiscoveryClient* service_discovery_client, |
| 32 net::URLRequestContextGetter* request_context) |
| 33 : service_discovery_client_(service_discovery_client), |
| 34 request_context_(request_context) {} |
| 35 |
| 36 PrivetHTTPAsynchronousFactoryImpl::~PrivetHTTPAsynchronousFactoryImpl() {} |
| 37 |
| 38 scoped_ptr<PrivetHTTPResolution> |
| 39 PrivetHTTPAsynchronousFactoryImpl::CreatePrivetHTTP( |
| 40 const std::string& name, |
| 41 const net::HostPortPair& address, |
| 42 const ResultCallback& callback) { |
| 43 return scoped_ptr<PrivetHTTPResolution>( |
| 44 new ResolutionImpl(name, |
| 45 address, |
| 46 callback, |
| 47 service_discovery_client_, |
| 48 request_context_.get())); |
| 49 } |
| 50 |
| 51 PrivetHTTPAsynchronousFactoryImpl::ResolutionImpl::ResolutionImpl( |
| 52 const std::string& name, |
| 53 const net::HostPortPair& address, |
| 54 const ResultCallback& callback, |
| 55 ServiceDiscoveryClient* service_discovery_client, |
| 56 net::URLRequestContextGetter* request_context) |
| 57 : name_(name), |
| 58 hostport_(address), |
| 59 callback_(callback), |
| 60 request_context_(request_context) { |
| 61 net::AddressFamily address_family = net::ADDRESS_FAMILY_UNSPECIFIED; |
| 62 |
| 63 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kPrivetIPv6Only)) { |
| 64 address_family = net::ADDRESS_FAMILY_IPV6; |
| 65 } |
| 66 |
| 67 resolver_ = service_discovery_client->CreateLocalDomainResolver( |
| 68 address.host(), |
| 69 address_family, |
| 70 base::Bind(&ResolutionImpl::ResolveComplete, base::Unretained(this))); |
| 71 } |
| 72 |
| 73 PrivetHTTPAsynchronousFactoryImpl::ResolutionImpl::~ResolutionImpl() {} |
| 74 |
| 75 void PrivetHTTPAsynchronousFactoryImpl::ResolutionImpl::Start() { |
| 76 resolver_->Start(); |
| 77 } |
| 78 |
| 79 const std::string& |
| 80 PrivetHTTPAsynchronousFactoryImpl::ResolutionImpl::GetName() { |
| 81 return name_; |
| 82 } |
| 83 |
| 84 void PrivetHTTPAsynchronousFactoryImpl::ResolutionImpl::ResolveComplete( |
| 85 bool success, |
| 86 const net::IPAddressNumber& address_ipv4, |
| 87 const net::IPAddressNumber& address_ipv6) { |
| 88 if (!success) { |
| 89 callback_.Run(scoped_ptr<PrivetHTTPClient>()); |
| 90 return; |
| 91 } |
| 92 |
| 93 net::IPAddressNumber address = address_ipv4; |
| 94 if (address.empty()) |
| 95 address = address_ipv6; |
| 96 |
| 97 DCHECK(!address.empty()); |
| 98 |
| 99 net::HostPortPair new_address = |
| 100 net::HostPortPair(IPAddressToHostString(address), hostport_.port()); |
| 101 callback_.Run(scoped_ptr<PrivetHTTPClient>( |
| 102 new PrivetHTTPClientImpl(name_, new_address, request_context_.get()))); |
| 103 } |
| 104 |
| 105 } // namespace local_discovery |
OLD | NEW |