blob: a8ecef70af8c9d9dccfabc8dc1e5aa407b15c640 [file] [log] [blame]
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_AUTOFILL_PHONE_NUMBER_I18N_H_
#define CHROME_BROWSER_AUTOFILL_PHONE_NUMBER_I18N_H_
#pragma once
#include <string>
#include <vector>
#include "base/compiler_specific.h"
#include "base/memory/scoped_ptr.h"
#include "base/string16.h"
namespace i18n {
namespace phonenumbers {
class PhoneNumber;
}
}
// Utilities to process, normalize and compare international phone numbers.
namespace autofill_i18n {
// Most of the following functions require |locale| to operate. The |locale| is
// a ISO 3166 standard code ("US" for USA, "CZ" for Czech Republic, etc.).
// Normalizes phone number, by changing digits in the extended fonts
// (such as \xFF1x) into '0'-'9'. Also strips out non-digit characters.
string16 NormalizePhoneNumber(const string16& value,
const std::string& locale);
// Parses |value| to extract the components of a phone number. |number|
// returns the local number, |city_code| returns the city code, and
// |country_code| returns country code. For some regions the |city_code| is
// empty.
// The parsing is based on current locale - |locale|.
// Separator characters are stripped before parsing the digits.
// Returns true if parsing was successful, false otherwise.
bool ParsePhoneNumber(const string16& value,
const std::string& locale,
string16* country_code,
string16* city_code,
string16* number) WARN_UNUSED_RESULT;
enum FullPhoneFormat {
E164, // Example: +16502345678
INTERNATIONAL, // Example: +1 650-234-5678
NATIONAL, // Example: (650) 234-5678
RFC3966 // Example: +1-650-234-5678
};
// Constructs whole phone number from parts.
// |city_code| - area code, could be empty.
// |country_code| - country code, could be empty
// |number| - local number, should not be empty.
// |locale| - current locale, the parsing is based on.
// |phone_format| - whole number constructed in that format,
// |whole_number| - constructed whole number.
// Separator characters are stripped before parsing the digits.
// Returns true if parsing was successful, false otherwise.
bool ConstructPhoneNumber(const string16& country_code,
const string16& city_code,
const string16& number,
const std::string& locale,
FullPhoneFormat phone_format,
string16* whole_number) WARN_UNUSED_RESULT;
// Parses and then formats phone number either nationally or internationally.
// |phone| - raw, unsanitized phone number, as entered by user.
// |locale| - country locale code, such as "US".
// |phone_format| - the phone type format.
// The same as calling ParsePhoneNumber(phone, locale, &country, &city,
// &number); ConstructPhoneNumber(country, city, number, locale, phone_format,
// &formatted_phone); but almost twice as fast, as parsing done only once.
// Returns formatted phone on success, empty string on error.
string16 FormatPhone(const string16& phone,
const std::string& locale,
FullPhoneFormat phone_format);
enum PhoneMatch {
PHONES_NOT_EQUAL,
PHONES_EQUAL, // +1(650)2345678 is equal to 1-650-234-56-78.
PHONES_SUBMATCH, // 650-234-56-78 or 2345678 is a submatch for
// +1(650)2345678. The submatch is symmetric.
};
// Compares two phones, normalizing them before comparision.
PhoneMatch ComparePhones(const string16& phone1,
const string16& phone2,
const std::string& locale);
bool PhoneNumbersMatch(const string16& number_a,
const string16& number_b,
const std::string& country_code);
// The cached phone number, does parsing only once, improves performance.
class PhoneObject {
public:
PhoneObject(const string16& number, const std::string& locale);
PhoneObject(const PhoneObject&);
PhoneObject();
~PhoneObject();
string16 GetCountryCode() const { return country_code_; }
string16 GetCityCode() const { return city_code_; }
string16 GetNumber() const { return number_; }
std::string GetLocale() const { return locale_; }
string16 GetWholeNumber() const;
PhoneMatch ComparePhones(const string16& phone) const;
PhoneObject& operator=(const PhoneObject& other);
bool IsValidNumber() const { return i18n_number_ != NULL; }
private:
string16 city_code_;
string16 country_code_;
string16 number_;
mutable string16 whole_number_; // Set on first request.
std::string locale_;
scoped_ptr<i18n::phonenumbers::PhoneNumber> i18n_number_;
};
} // namespace autofill_i18n
#endif // CHROME_BROWSER_AUTOFILL_PHONE_NUMBER_I18N_H_