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)                       &region_, 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