OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/local_discovery/privet_http_asynchronous_factory_impl.h
" | 5 #include "chrome/browser/local_discovery/privet_http_asynchronous_factory_impl.h
" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/strings/stringprintf.h" | 9 #include "base/strings/stringprintf.h" |
10 #include "chrome/browser/local_discovery/privet_http_impl.h" | 10 #include "chrome/browser/local_discovery/privet_http_impl.h" |
(...skipping 20 matching lines...) Expand all Loading... |
31 PrivetHTTPAsynchronousFactoryImpl::PrivetHTTPAsynchronousFactoryImpl( | 31 PrivetHTTPAsynchronousFactoryImpl::PrivetHTTPAsynchronousFactoryImpl( |
32 net::URLRequestContextGetter* request_context) | 32 net::URLRequestContextGetter* request_context) |
33 : request_context_(request_context) { | 33 : request_context_(request_context) { |
34 } | 34 } |
35 | 35 |
36 PrivetHTTPAsynchronousFactoryImpl::~PrivetHTTPAsynchronousFactoryImpl() { | 36 PrivetHTTPAsynchronousFactoryImpl::~PrivetHTTPAsynchronousFactoryImpl() { |
37 } | 37 } |
38 | 38 |
39 scoped_ptr<PrivetHTTPResolution> | 39 scoped_ptr<PrivetHTTPResolution> |
40 PrivetHTTPAsynchronousFactoryImpl::CreatePrivetHTTP( | 40 PrivetHTTPAsynchronousFactoryImpl::CreatePrivetHTTP( |
41 const std::string& name, | 41 const std::string& service_name) { |
42 const net::HostPortPair& address, | |
43 const ResultCallback& callback) { | |
44 return scoped_ptr<PrivetHTTPResolution>( | 42 return scoped_ptr<PrivetHTTPResolution>( |
45 new ResolutionImpl(name, address, callback, request_context_.get())); | 43 new ResolutionImpl(service_name, request_context_.get())); |
46 } | 44 } |
47 | 45 |
48 PrivetHTTPAsynchronousFactoryImpl::ResolutionImpl::ResolutionImpl( | 46 PrivetHTTPAsynchronousFactoryImpl::ResolutionImpl::ResolutionImpl( |
49 const std::string& name, | 47 const std::string& service_name, |
50 const net::HostPortPair& address, | |
51 const ResultCallback& callback, | |
52 net::URLRequestContextGetter* request_context) | 48 net::URLRequestContextGetter* request_context) |
53 : name_(name), | 49 : name_(service_name), request_context_(request_context) { |
54 hostport_(address), | |
55 callback_(callback), | |
56 request_context_(request_context) { | |
57 service_discovery_client_ = ServiceDiscoverySharedClient::GetInstance(); | 50 service_discovery_client_ = ServiceDiscoverySharedClient::GetInstance(); |
58 | |
59 net::AddressFamily address_family = net::ADDRESS_FAMILY_UNSPECIFIED; | |
60 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | |
61 switches::kPrivetIPv6Only)) { | |
62 address_family = net::ADDRESS_FAMILY_IPV6; | |
63 } | |
64 | |
65 resolver_ = service_discovery_client_->CreateLocalDomainResolver( | |
66 address.host(), address_family, | |
67 base::Bind(&ResolutionImpl::ResolveComplete, base::Unretained(this))); | |
68 } | 51 } |
69 | 52 |
70 PrivetHTTPAsynchronousFactoryImpl::ResolutionImpl::~ResolutionImpl() { | 53 PrivetHTTPAsynchronousFactoryImpl::ResolutionImpl::~ResolutionImpl() { |
71 } | 54 } |
72 | 55 |
73 void PrivetHTTPAsynchronousFactoryImpl::ResolutionImpl::Start() { | |
74 #if defined(OS_MACOSX) | |
75 // MAC already has IP there. | |
76 callback_.Run(scoped_ptr<PrivetHTTPClient>( | |
77 new PrivetHTTPClientImpl(name_, hostport_, request_context_.get()))); | |
78 #else | |
79 resolver_->Start(); | |
80 #endif | |
81 } | |
82 | |
83 const std::string& | 56 const std::string& |
84 PrivetHTTPAsynchronousFactoryImpl::ResolutionImpl::GetName() { | 57 PrivetHTTPAsynchronousFactoryImpl::ResolutionImpl::GetName() { |
85 return name_; | 58 return name_; |
86 } | 59 } |
87 | 60 |
88 void PrivetHTTPAsynchronousFactoryImpl::ResolutionImpl::ResolveComplete( | 61 void PrivetHTTPAsynchronousFactoryImpl::ResolutionImpl::Start( |
| 62 const net::HostPortPair& address, |
| 63 const ResultCallback& callback) { |
| 64 #if defined(OS_MACOSX) |
| 65 // MAC already has IP there. |
| 66 callback.Run(scoped_ptr<PrivetHTTPClient>( |
| 67 new PrivetHTTPClientImpl(name_, address, request_context_.get()))); |
| 68 #else // OS_MACOSX |
| 69 net::AddressFamily address_family = net::ADDRESS_FAMILY_UNSPECIFIED; |
| 70 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 71 switches::kPrivetIPv6Only)) { |
| 72 address_family = net::ADDRESS_FAMILY_IPV6; |
| 73 } |
| 74 |
| 75 domain_resolver_ = service_discovery_client_->CreateLocalDomainResolver( |
| 76 address.host(), address_family, |
| 77 base::Bind(&ResolutionImpl::DomainResolveComplete, base::Unretained(this), |
| 78 address.port(), callback)); |
| 79 domain_resolver_->Start(); |
| 80 #endif // OS_MACOSX |
| 81 } |
| 82 |
| 83 void PrivetHTTPAsynchronousFactoryImpl::ResolutionImpl::DomainResolveComplete( |
| 84 uint16 port, |
| 85 const ResultCallback& callback, |
89 bool success, | 86 bool success, |
90 const net::IPAddressNumber& address_ipv4, | 87 const net::IPAddressNumber& address_ipv4, |
91 const net::IPAddressNumber& address_ipv6) { | 88 const net::IPAddressNumber& address_ipv6) { |
92 if (!success) { | 89 if (!success) { |
93 callback_.Run(scoped_ptr<PrivetHTTPClient>()); | 90 callback.Run(scoped_ptr<PrivetHTTPClient>()); |
94 return; | 91 return; |
95 } | 92 } |
96 | 93 |
97 net::IPAddressNumber address = address_ipv4; | 94 net::IPAddressNumber address = address_ipv4; |
98 if (address.empty()) | 95 if (address.empty()) |
99 address = address_ipv6; | 96 address = address_ipv6; |
100 | 97 |
101 DCHECK(!address.empty()); | 98 DCHECK(!address.empty()); |
102 | 99 |
103 net::HostPortPair new_address = | 100 net::HostPortPair new_address = |
104 net::HostPortPair(IPAddressToHostString(address), hostport_.port()); | 101 net::HostPortPair(IPAddressToHostString(address), port); |
105 callback_.Run(scoped_ptr<PrivetHTTPClient>( | 102 callback.Run(scoped_ptr<PrivetHTTPClient>( |
106 new PrivetHTTPClientImpl(name_, new_address, request_context_.get()))); | 103 new PrivetHTTPClientImpl(name_, new_address, request_context_.get()))); |
107 } | 104 } |
108 | 105 |
109 } // namespace local_discovery | 106 } // namespace local_discovery |
OLD | NEW |