phone_number_i18n.cc revision 116680a4aac90f2aa7413d9095a592090648e557
1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/phone_number_i18n.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_country.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/libphonenumber/src/phonenumber_api.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using i18n::phonenumbers::PhoneNumber; 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using i18n::phonenumbers::PhoneNumberUtil; 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace autofill { 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::string SanitizeRegion(const std::string& region, 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& app_locale) { 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (region.length() == 2) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return region; 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return AutofillCountry::CountryCodeForLocale(app_locale); 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns true if |phone_number| is valid. 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool IsValidPhoneNumber(const PhoneNumber& phone_number) { 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PhoneNumberUtil* phone_util = PhoneNumberUtil::GetInstance(); 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!phone_util->IsPossibleNumber(phone_number)) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Verify that the number has a valid area code (that in some cases could be 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // empty) for the parsed country code. Also verify that this is a valid 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // number (for example, in the US 1234567 is not valid, because numbers do not 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // start with 1). 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!phone_util->IsValidNumber(phone_number)) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Formats the given |number| as a human-readable string, and writes the result 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// into |formatted_number|. Also, normalizes the formatted number, and writes 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// that result into |normalized_number|. This function should only be called 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// with numbers already known to be valid, i.e. validation should be done prior 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// to calling this function. Note that the |country_code|, which determines 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// whether to format in the national or in the international format, is passed 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// in explicitly, as |number| might have an implicit country code set, even 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// though the original input lacked a country code. 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FormatValidatedNumber(const PhoneNumber& number, 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& country_code, 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16* formatted_number, 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16* normalized_number) { 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PhoneNumberUtil::PhoneNumberFormat format = 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) country_code.empty() ? 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PhoneNumberUtil::NATIONAL : 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PhoneNumberUtil::INTERNATIONAL; 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PhoneNumberUtil* phone_util = PhoneNumberUtil::GetInstance(); 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string processed_number; 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) phone_util->Format(number, format, &processed_number); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (formatted_number) 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *formatted_number = base::UTF8ToUTF16(processed_number); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (normalized_number) { 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) phone_util->NormalizeDigitsOnly(&processed_number); 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *normalized_number = base::UTF8ToUTF16(processed_number); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace i18n { 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Parses the number stored in |value| as it should be interpreted in the given 8223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// |default_region|, and stores the results into the remaining arguments. 8323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// The |default_region| should be sanitized prior to calling this function. 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ParsePhoneNumber(const base::string16& value, 8523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const std::string& default_region, 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16* country_code, 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16* city_code, 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16* number, 8923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) std::string* inferred_region, 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PhoneNumber* i18n_number) { 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) country_code->clear(); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) city_code->clear(); 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) number->clear(); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *i18n_number = PhoneNumber(); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string number_text(base::UTF16ToUTF8(value)); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Parse phone number based on the region. 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PhoneNumberUtil* phone_util = PhoneNumberUtil::GetInstance(); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // The |default_region| should already be sanitized. 10223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) DCHECK_EQ(2U, default_region.size()); 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (phone_util->ParseAndKeepRawInput( 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch number_text, default_region, i18n_number) != 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PhoneNumberUtil::NO_PARSING_ERROR) { 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!IsValidPhoneNumber(*i18n_number)) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string national_significant_number; 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) phone_util->GetNationalSignificantNumber(*i18n_number, 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &national_significant_number); 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int area_length = phone_util->GetLengthOfGeographicalAreaCode(*i18n_number); 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int destination_length = 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) phone_util->GetLengthOfNationalDestinationCode(*i18n_number); 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Some phones have a destination code in lieu of area code: mobile operators 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // in Europe, toll and toll-free numbers in USA, etc. From our point of view 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // these two types of codes are the same. 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (destination_length > area_length) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) area_length = destination_length; 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string area_code; 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string subscriber_number; 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (area_length > 0) { 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) area_code = national_significant_number.substr(0, area_length); 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) subscriber_number = national_significant_number.substr(area_length); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) subscriber_number = national_significant_number; 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *number = base::UTF8ToUTF16(subscriber_number); 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *city_code = base::UTF8ToUTF16(area_code); 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check if parsed number has a country code that was not inferred from the 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // region. 138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (i18n_number->has_country_code() && 139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch i18n_number->country_code_source() != PhoneNumber::FROM_DEFAULT_COUNTRY) { 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *country_code = base::UTF8ToUTF16( 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("%d", i18n_number->country_code())); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // The region might be different from what we started with. 14523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) phone_util->GetRegionCodeForNumber(*i18n_number, inferred_region); 14623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::string16 NormalizePhoneNumber(const base::string16& value, 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& region) { 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK_EQ(2u, region.size()); 15323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) base::string16 country_code, unused_city_code, unused_number; 15423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) std::string unused_region; 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PhoneNumber phone_number; 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!ParsePhoneNumber(value, region, &country_code, &unused_city_code, 15723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) &unused_number, &unused_region, &phone_number)) { 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return base::string16(); // Parsing failed - do not store phone. 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 normalized_number; 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FormatValidatedNumber(phone_number, country_code, NULL, &normalized_number); 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return normalized_number; 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ConstructPhoneNumber(const base::string16& country_code, 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& city_code, 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& number, 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& region, 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16* whole_number) { 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK_EQ(2u, region.size()); 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) whole_number->clear(); 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) base::string16 unused_country_code, unused_city_code, unused_number; 17523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) std::string unused_region; 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PhoneNumber phone_number; 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!ParsePhoneNumber(country_code + city_code + number, region, 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &unused_country_code, &unused_city_code, &unused_number, 17923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) &unused_region, &phone_number)) { 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FormatValidatedNumber(phone_number, country_code, whole_number, NULL); 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool PhoneNumbersMatch(const base::string16& number_a, 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& number_b, 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& raw_region, 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& app_locale) { 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sanitize the provided |raw_region| before trying to use it for parsing. 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string region = SanitizeRegion(raw_region, app_locale); 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PhoneNumberUtil* phone_util = PhoneNumberUtil::GetInstance(); 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Parse phone numbers based on the region 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PhoneNumber i18n_number1; 1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (phone_util->Parse( 1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF16ToUTF8(number_a), region.c_str(), &i18n_number1) != 2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PhoneNumberUtil::NO_PARSING_ERROR) { 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PhoneNumber i18n_number2; 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (phone_util->Parse( 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF16ToUTF8(number_b), region.c_str(), &i18n_number2) != 2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PhoneNumberUtil::NO_PARSING_ERROR) { 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (phone_util->IsNumberMatch(i18n_number1, i18n_number2)) { 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case PhoneNumberUtil::INVALID_NUMBER: 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case PhoneNumberUtil::NO_MATCH: 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case PhoneNumberUtil::SHORT_NSN_MATCH: 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case PhoneNumberUtil::NSN_MATCH: 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case PhoneNumberUtil::EXACT_MATCH: 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PhoneObject::PhoneObject(const base::string16& number, 22723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const std::string& region) { 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK_EQ(2u, region.size()); 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(isherman): Autofill profiles should always have a |region| set, but in 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // some cases it should be marked as implicit. Otherwise, phone numbers 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // might behave differently when they are synced across computers: 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // [ http://crbug.com/100845 ]. Once the bug is fixed, add a DCHECK here to 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // verify. 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<PhoneNumber> i18n_number(new PhoneNumber); 23623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if (ParsePhoneNumber(number, region, &country_code_, &city_code_, &number_, 23723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ®ion_, i18n_number.get())) { 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The phone number was successfully parsed, so store the parsed version. 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The formatted and normalized versions will be set on the first call to 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the coresponding methods. 24123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) i18n_number_ = i18n_number.Pass(); 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Parsing failed. Store passed phone "as is" into |whole_number_|. 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) whole_number_ = number; 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)PhoneObject::PhoneObject(const PhoneObject& other) { *this = other; } 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)PhoneObject::PhoneObject() {} 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)PhoneObject::~PhoneObject() {} 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const base::string16& PhoneObject::GetFormattedNumber() const { 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (i18n_number_ && formatted_number_.empty()) { 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FormatValidatedNumber(*i18n_number_, country_code_, &formatted_number_, 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &whole_number_); 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return formatted_number_; 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)base::string16 PhoneObject::GetNationallyFormattedNumber() const { 2644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::string16 formatted = whole_number_; 2654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (i18n_number_) 2664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FormatValidatedNumber(*i18n_number_, base::string16(), &formatted, NULL); 2674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return formatted; 2694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 2704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const base::string16& PhoneObject::GetWholeNumber() const { 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (i18n_number_ && whole_number_.empty()) { 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FormatValidatedNumber(*i18n_number_, country_code_, &formatted_number_, 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &whole_number_); 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return whole_number_; 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PhoneObject& PhoneObject::operator=(const PhoneObject& other) { 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (this == &other) 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return *this; 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) region_ = other.region_; 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (other.i18n_number_.get()) 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) i18n_number_.reset(new PhoneNumber(*other.i18n_number_)); 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) i18n_number_.reset(); 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) country_code_ = other.country_code_; 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) city_code_ = other.city_code_; 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) number_ = other.number_; 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) formatted_number_ = other.formatted_number_; 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) whole_number_ = other.whole_number_; 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return *this; 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace i18n 302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace autofill 303