OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "net/dns/dns_config_service_win.h" | 5 #include "net/dns/dns_config_service_win.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
127 rv = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, out.get(), &len); | 127 rv = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, out.get(), &len); |
128 } | 128 } |
129 if (rv != NO_ERROR) | 129 if (rv != NO_ERROR) |
130 out.reset(); | 130 out.reset(); |
131 return out.Pass(); | 131 return out.Pass(); |
132 } | 132 } |
133 | 133 |
134 // Converts a base::string16 domain name to ASCII, possibly using punycode. | 134 // Converts a base::string16 domain name to ASCII, possibly using punycode. |
135 // Returns true if the conversion succeeds and output is not empty. In case of | 135 // Returns true if the conversion succeeds and output is not empty. In case of |
136 // failure, |domain| might become dirty. | 136 // failure, |domain| might become dirty. |
137 bool ParseDomainASCII(const base::string16& widestr, std::string* domain) { | 137 bool ParseDomainASCII(base::StringPiece16 widestr, std::string* domain) { |
138 DCHECK(domain); | 138 DCHECK(domain); |
139 if (widestr.empty()) | 139 if (widestr.empty()) |
140 return false; | 140 return false; |
141 | 141 |
142 // Check if already ASCII. | 142 // Check if already ASCII. |
143 if (base::IsStringASCII(widestr)) { | 143 if (base::IsStringASCII(widestr)) { |
144 *domain = base::UTF16ToASCII(widestr); | 144 domain->assign(widestr.begin(), widestr.end()); |
145 return true; | 145 return true; |
146 } | 146 } |
147 | 147 |
148 // Otherwise try to convert it from IDN to punycode. | 148 // Otherwise try to convert it from IDN to punycode. |
149 const int kInitialBufferSize = 256; | 149 const int kInitialBufferSize = 256; |
150 url::RawCanonOutputT<base::char16, kInitialBufferSize> punycode; | 150 url::RawCanonOutputT<base::char16, kInitialBufferSize> punycode; |
151 if (!url::IDNToASCII(widestr.data(), widestr.length(), &punycode)) | 151 if (!url::IDNToASCII(widestr.data(), widestr.length(), &punycode)) |
152 return false; | 152 return false; |
153 | 153 |
154 // |punycode_output| should now be ASCII; convert it to a std::string. | 154 // |punycode_output| should now be ASCII; convert it to a std::string. |
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
469 DCHECK(output); | 469 DCHECK(output); |
470 if (value.empty()) | 470 if (value.empty()) |
471 return false; | 471 return false; |
472 | 472 |
473 output->clear(); | 473 output->clear(); |
474 | 474 |
475 // If the list includes an empty hostname (",," or ", ,"), it is terminated. | 475 // If the list includes an empty hostname (",," or ", ,"), it is terminated. |
476 // Although nslookup and network connection property tab ignore such | 476 // Although nslookup and network connection property tab ignore such |
477 // fragments ("a,b,,c" becomes ["a", "b", "c"]), our reference is getaddrinfo | 477 // fragments ("a,b,,c" becomes ["a", "b", "c"]), our reference is getaddrinfo |
478 // (which sees ["a", "b"]). WMI queries also return a matching search list. | 478 // (which sees ["a", "b"]). WMI queries also return a matching search list. |
479 std::vector<base::string16> woutput; | 479 for (const base::StringPiece16& t : base::SplitStringPiece( |
480 base::SplitString(value, ',', &woutput); | 480 value, L",", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL)) { |
481 for (size_t i = 0; i < woutput.size(); ++i) { | |
482 // Convert non-ASCII to punycode, although getaddrinfo does not properly | 481 // Convert non-ASCII to punycode, although getaddrinfo does not properly |
483 // handle such suffixes. | 482 // handle such suffixes. |
484 const base::string16& t = woutput[i]; | |
485 std::string parsed; | 483 std::string parsed; |
486 if (!ParseDomainASCII(t, &parsed)) | 484 if (!ParseDomainASCII(t, &parsed)) |
487 break; | 485 break; |
488 output->push_back(parsed); | 486 output->push_back(parsed); |
489 } | 487 } |
490 return !output->empty(); | 488 return !output->empty(); |
491 } | 489 } |
492 | 490 |
493 ConfigParseWinResult ConvertSettingsToDnsConfig( | 491 ConfigParseWinResult ConvertSettingsToDnsConfig( |
494 const DnsSystemSettings& settings, | 492 const DnsSystemSettings& settings, |
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
779 } | 777 } |
780 | 778 |
781 } // namespace internal | 779 } // namespace internal |
782 | 780 |
783 // static | 781 // static |
784 scoped_ptr<DnsConfigService> DnsConfigService::CreateSystemService() { | 782 scoped_ptr<DnsConfigService> DnsConfigService::CreateSystemService() { |
785 return scoped_ptr<DnsConfigService>(new internal::DnsConfigServiceWin()); | 783 return scoped_ptr<DnsConfigService>(new internal::DnsConfigServiceWin()); |
786 } | 784 } |
787 | 785 |
788 } // namespace net | 786 } // namespace net |
OLD | NEW |