1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autofill/phone_number.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h" 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h" 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autofill/autofill_profile.h" 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autofill/autofill_type.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autofill/field_types.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace { 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char16 kPhoneNumberSeparators[] = { ' ', '.', '(', ')', '-', 0 }; 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The number of digits in a phone number. 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst size_t kPhoneNumberLength = 7; 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The number of digits in an area code. 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst size_t kPhoneCityCodeLength = 3; 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst AutofillType::FieldTypeSubGroup kAutofillPhoneTypes[] = { 24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen AutofillType::PHONE_NUMBER, 25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen AutofillType::PHONE_CITY_CODE, 26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen AutofillType::PHONE_COUNTRY_CODE, 27dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen AutofillType::PHONE_CITY_AND_NUMBER, 28dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen AutofillType::PHONE_WHOLE_NUMBER, 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst int kAutofillPhoneLength = arraysize(kAutofillPhoneTypes); 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 35731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickPhoneNumber::PhoneNumber() {} 36731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenPhoneNumber::PhoneNumber(const PhoneNumber& number) : FormGroup() { 38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *this = number; 39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 41731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickPhoneNumber::~PhoneNumber() {} 42731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenPhoneNumber& PhoneNumber::operator=(const PhoneNumber& number) { 44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (this == &number) 45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return *this; 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen country_code_ = number.country_code_; 47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen city_code_ = number.city_code_; 48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen number_ = number.number_; 49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen extension_ = number.extension_; 50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return *this; 51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PhoneNumber::GetPossibleFieldTypes(const string16& text, 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FieldTypeSet* possible_types) const { 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 stripped_text(text); 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StripPunctuation(&stripped_text); 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!Validate(stripped_text)) 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (IsNumber(stripped_text)) 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch possible_types->insert(GetNumberType()); 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (IsCityCode(stripped_text)) 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch possible_types->insert(GetCityCodeType()); 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (IsCountryCode(stripped_text)) 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch possible_types->insert(GetCountryCodeType()); 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (IsCityAndNumber(stripped_text)) 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch possible_types->insert(GetCityAndNumberType()); 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (IsWholeNumber(stripped_text)) 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch possible_types->insert(GetWholeNumberType()); 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PhoneNumber::GetAvailableFieldTypes(FieldTypeSet* available_types) const { 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(available_types); 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!number().empty()) 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch available_types->insert(GetNumberType()); 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!city_code().empty()) 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch available_types->insert(GetCityCodeType()); 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!country_code().empty()) 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch available_types->insert(GetCountryCodeType()); 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!CityAndNumber().empty()) 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch available_types->insert(GetCityAndNumberType()); 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!WholeNumber().empty()) 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch available_types->insert(GetWholeNumberType()); 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstring16 PhoneNumber::GetInfo(AutofillFieldType type) const { 96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (type == GetNumberType()) 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return number(); 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (type == GetCityCodeType()) 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return city_code(); 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (type == GetCountryCodeType()) 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return country_code(); 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (type == GetCityAndNumberType()) 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return CityAndNumber(); 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (type == GetWholeNumberType()) 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return WholeNumber(); 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return string16(); 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid PhoneNumber::SetInfo(AutofillFieldType type, const string16& value) { 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 number(value); 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StripPunctuation(&number); 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!Validate(number)) 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FieldTypeSubGroup subgroup = AutofillType(type).subgroup(); 121dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (subgroup == AutofillType::PHONE_NUMBER) 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch set_number(number); 123dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen else if (subgroup == AutofillType::PHONE_CITY_CODE) 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch set_city_code(number); 125dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen else if (subgroup == AutofillType::PHONE_COUNTRY_CODE) 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch set_country_code(number); 127dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen else if (subgroup == AutofillType::PHONE_CITY_AND_NUMBER || 128dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen subgroup == AutofillType::PHONE_WHOLE_NUMBER) 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch set_whole_number(number); 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch else 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Static. 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool PhoneNumber::ParsePhoneNumber(const string16& value, 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16* number, 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16* city_code, 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16* country_code) { 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(number); 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(city_code); 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(country_code); 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Make a working copy of value. 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 working = value; 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *number = string16(); 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *city_code = string16(); 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *country_code = string16(); 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // First remove any punctuation. 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StripPunctuation(&working); 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (working.size() < kPhoneNumberLength) 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Treat the last 7 digits as the number. 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *number = working.substr(working.size() - kPhoneNumberLength, 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kPhoneNumberLength); 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch working.resize(working.size() - kPhoneNumberLength); 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (working.size() < kPhoneCityCodeLength) 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Treat the next three digits as the city code. 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *city_code = working.substr(working.size() - kPhoneCityCodeLength, 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kPhoneCityCodeLength); 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch working.resize(working.size() - kPhoneCityCodeLength); 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (working.empty()) 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Treat any remaining digits as the country code. 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *country_code = working; 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstring16 PhoneNumber::WholeNumber() const { 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 whole_number; 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!country_code_.empty()) 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch whole_number.append(country_code_); 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!city_code_.empty()) 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch whole_number.append(city_code_); 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!number_.empty()) 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch whole_number.append(number_); 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return whole_number; 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PhoneNumber::set_number(const string16& number) { 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 digits(number); 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StripPunctuation(&digits); 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch number_ = digits; 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PhoneNumber::set_whole_number(const string16& whole_number) { 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 number, city_code, country_code; 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ParsePhoneNumber(whole_number, &number, &city_code, &country_code); 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch set_number(number); 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch set_city_code(city_code); 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch set_country_code(country_code); 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool PhoneNumber::IsNumber(const string16& text) const { 204ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(isherman): This will need to be updated once we add support for 205ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // international phone numbers. 206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const size_t kPhoneNumberPrefixLength = 3; 207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const size_t kPhoneNumberSuffixLength = 4; 208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return 209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen (text == number_) || 210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen (text.length() == kPhoneNumberPrefixLength && 211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen StartsWith(number_, text, true)) || 212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen (text.length() == kPhoneNumberSuffixLength && 213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EndsWith(number_, text, true)); 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool PhoneNumber::IsCityCode(const string16& text) const { 217ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return text == city_code_; 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool PhoneNumber::IsCountryCode(const string16& text) const { 221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return text == country_code_; 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool PhoneNumber::IsCityAndNumber(const string16& text) const { 225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return text == CityAndNumber(); 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool PhoneNumber::IsWholeNumber(const string16& text) const { 229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return text == WholeNumber(); 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool PhoneNumber::Validate(const string16& number) const { 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (size_t i = 0; i < number.length(); ++i) { 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!IsAsciiDigit(number[i])) 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Static. 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PhoneNumber::StripPunctuation(string16* number) { 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RemoveChars(*number, kPhoneNumberSeparators, number); 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 245