| Index: third_party/libphonenumber/cpp/src/phonenumberutil.h
 | 
| ===================================================================
 | 
| --- third_party/libphonenumber/cpp/src/phonenumberutil.h	(revision 0)
 | 
| +++ third_party/libphonenumber/cpp/src/phonenumberutil.h	(revision 0)
 | 
| @@ -0,0 +1,678 @@
 | 
| +// Copyright (C) 2009 Google Inc.
 | 
| +//
 | 
| +// Licensed under the Apache License, Version 2.0 (the "License");
 | 
| +// you may not use this file except in compliance with the License.
 | 
| +// You may obtain a copy of the License at
 | 
| +//
 | 
| +// http://www.apache.org/licenses/LICENSE-2.0
 | 
| +//
 | 
| +// Unless required by applicable law or agreed to in writing, software
 | 
| +// distributed under the License is distributed on an "AS IS" BASIS,
 | 
| +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
| +// See the License for the specific language governing permissions and
 | 
| +// limitations under the License.
 | 
| +
 | 
| +// Utility for international phone numbers.
 | 
| +//
 | 
| +// Author: Shaopeng Jia
 | 
| +// Open-sourced by: Philippe Liard
 | 
| +
 | 
| +#ifndef I18N_PHONENUMBERS_PHONENUMBERUTIL_H_
 | 
| +#define I18N_PHONENUMBERS_PHONENUMBERUTIL_H_
 | 
| +
 | 
| +#include <list>
 | 
| +#include <map>
 | 
| +#include <set>
 | 
| +#include <string>
 | 
| +#include <utility>
 | 
| +#include <vector>
 | 
| +
 | 
| +#include "base/scoped_ptr.h"
 | 
| +#include "base/singleton.h"
 | 
| +#include "phonenumber.pb.h"
 | 
| +
 | 
| +class TelephoneNumber;
 | 
| +
 | 
| +namespace i18n {
 | 
| +namespace phonenumbers {
 | 
| +
 | 
| +using std::list;
 | 
| +using std::map;
 | 
| +using std::pair;
 | 
| +using std::set;
 | 
| +using std::string;
 | 
| +using std::vector;
 | 
| +
 | 
| +using google::protobuf::RepeatedPtrField;
 | 
| +
 | 
| +class LoggerAdapter;
 | 
| +class NumberFormat;
 | 
| +class PhoneMetadata;
 | 
| +class PhoneMetadataCollection;
 | 
| +class PhoneNumber;
 | 
| +
 | 
| +class PhoneNumberUtil {
 | 
| +  friend struct DefaultSingletonTraits<PhoneNumberUtil>;
 | 
| +  friend class PhoneNumberUtilTest;
 | 
| + public:
 | 
| +  // INTERNATIONAL and NATIONAL formats are consistent with the definition
 | 
| +  // in ITU-T Recommendation E. 123. For example, the number of the Google
 | 
| +  // Zürich office will be written as "+41 44 668 1800" in INTERNATIONAL
 | 
| +  // format, and as "044 668 1800" in NATIONAL format. E164 format is as per
 | 
| +  // INTERNATIONAL format but with no formatting applied e.g. +41446681800.
 | 
| +  // RFC3966 is as per INTERNATIONAL format, but with all spaces and other
 | 
| +  // separating symbols replaced with a hyphen, and with any phone number
 | 
| +  // extension appended with ";ext=".
 | 
| +  enum PhoneNumberFormat {
 | 
| +    E164,
 | 
| +    INTERNATIONAL,
 | 
| +    NATIONAL,
 | 
| +    RFC3966
 | 
| +  };
 | 
| +
 | 
| +  // Type of phone numbers.
 | 
| +  enum PhoneNumberType {
 | 
| +    FIXED_LINE,
 | 
| +    MOBILE,
 | 
| +    // In some regions (e.g. the USA), it is impossible to distinguish between
 | 
| +    // fixed-line and mobile numbers by looking at the phone number itself.
 | 
| +    FIXED_LINE_OR_MOBILE,
 | 
| +    // Freephone lines
 | 
| +    TOLL_FREE,
 | 
| +    PREMIUM_RATE,
 | 
| +    // The cost of this call is shared between the caller and the recipient, and
 | 
| +    // is hence typically less than PREMIUM_RATE calls. See
 | 
| +    // http://en.wikipedia.org/wiki/Shared_Cost_Service for more information.
 | 
| +    SHARED_COST,
 | 
| +    // Voice over IP numbers. This includes TSoIP (Telephony Service over IP).
 | 
| +    VOIP,
 | 
| +    // A personal number is associated with a particular person, and may be
 | 
| +    // routed to either a MOBILE or FIXED_LINE number. Some more information can
 | 
| +    // be found here: http://en.wikipedia.org/wiki/Personal_Numbers
 | 
| +    PERSONAL_NUMBER,
 | 
| +    PAGER,
 | 
| +    // Used for "Universal Access Numbers" or "Company Numbers". They may be
 | 
| +    // further routed to specific offices, but allow one number to be used for a
 | 
| +    // company.
 | 
| +    UAN,
 | 
| +    // A phone number is of type UNKNOWN when it does not fit any of the known
 | 
| +    // patterns for a specific region.
 | 
| +    UNKNOWN
 | 
| +  };
 | 
| +
 | 
| +  // Types of phone number matches. See detailed description beside the
 | 
| +  // IsNumberMatch() method.
 | 
| +  enum MatchType {
 | 
| +    INVALID_NUMBER,  // NOT_A_NUMBER in the java version.
 | 
| +    NO_MATCH,
 | 
| +    SHORT_NSN_MATCH,
 | 
| +    NSN_MATCH,
 | 
| +    EXACT_MATCH,
 | 
| +  };
 | 
| +
 | 
| +  enum ErrorType {
 | 
| +    NO_PARSING_ERROR,
 | 
| +    INVALID_COUNTRY_CODE_ERROR,  // INVALID_COUNTRY_CODE in the java version.
 | 
| +    NOT_A_NUMBER,
 | 
| +    TOO_SHORT_AFTER_IDD,
 | 
| +    TOO_SHORT_NSN,
 | 
| +    TOO_LONG_NSN,  // TOO_LONG in the java version.
 | 
| +  };
 | 
| +
 | 
| +  // Possible outcomes when testing if a PhoneNumber is possible.
 | 
| +  enum ValidationResult {
 | 
| +    IS_POSSIBLE,
 | 
| +    INVALID_COUNTRY_CODE,
 | 
| +    TOO_SHORT,
 | 
| +    TOO_LONG,
 | 
| +  };
 | 
| +
 | 
| +  // Gets a PhoneNumberUtil instance to carry out international phone number
 | 
| +  // formatting, parsing, or validation. The instance is loaded with phone
 | 
| +  // number metadata for a number of most commonly used regions, as specified by
 | 
| +  // DEFAULT_REGIONS_.
 | 
| +  //
 | 
| +  // The PhoneNumberUtil is implemented as a singleton. Therefore, calling
 | 
| +  // getInstance multiple times will only result in one instance being created.
 | 
| +  static PhoneNumberUtil* GetInstance();
 | 
| +
 | 
| +  // Returns true if the number is a valid vanity (alpha) number such as 800
 | 
| +  // MICROSOFT. A valid vanity number will start with at least 3 digits and will
 | 
| +  // have three or more alpha characters. This does not do region-specific
 | 
| +  // checks - to work out if this number is actually valid for a region, it
 | 
| +  // should be parsed and methods such as IsPossibleNumberWithReason or
 | 
| +  // IsValidNumber should be used.
 | 
| +  bool IsAlphaNumber(const string& number) const;
 | 
| +
 | 
| +  // Converts all alpha characters in a number to their respective digits on
 | 
| +  // a keypad, but retains existing formatting.
 | 
| +  void ConvertAlphaCharactersInNumber(string* number) const;
 | 
| +
 | 
| +  // Normalizes a string of characters representing a phone number. This
 | 
| +  // converts wide-ascii and arabic-indic numerals to European numerals, and
 | 
| +  // strips punctuation and alpha characters.
 | 
| +  static void NormalizeDigitsOnly(string* number);
 | 
| +
 | 
| +  // Gets the national significant number of a phone number. Note a national
 | 
| +  // significant number doesn't contain a national prefix or any formatting.
 | 
| +  void GetNationalSignificantNumber(const PhoneNumber& number,
 | 
| +                                    string* national_significant_num) const;
 | 
| +
 | 
| +  // Gets the length of the geographical area code from the PhoneNumber object
 | 
| +  // passed in, so that clients could use it to split a national significant
 | 
| +  // number into geographical area code and subscriber number. It works in such
 | 
| +  // a way that the resultant subscriber number should be diallable, at least on
 | 
| +  // some devices. An example of how this could be used:
 | 
| +  //
 | 
| +  // const PhoneNumberUtil& phone_util(PhoneNumberUtil::GetInstance());
 | 
| +  // PhoneNumber number;
 | 
| +  // phone_util.Parse("16502530000", "US", &number);
 | 
| +  // string national_significant_number;
 | 
| +  // phone_util.GetNationalSignificantNumber(number,
 | 
| +  //                                         &national_significant_number);
 | 
| +  // string area_code;
 | 
| +  // string subscriber_number;
 | 
| +  //
 | 
| +  // int area_code_length = phone_util.GetLengthOfGeographicalAreaCode(number);
 | 
| +  // if (area_code_length > 0) {
 | 
| +  //   area_code = national_significant_number.substring(0, area_code_length);
 | 
| +  //   subscriber_number = national_significant_number.substring(
 | 
| +  //       area_code_length, string::npos);
 | 
| +  // else {
 | 
| +  //   area_code = "";
 | 
| +  //   subscriber_number = national_significant_number;
 | 
| +  // }
 | 
| +  //
 | 
| +  // N.B.: area code is a very ambiguous concept, so the I18N team generally
 | 
| +  // recommends against using it for most purposes, but recommends using the
 | 
| +  // more general national_number instead. Read the following carefully before
 | 
| +  // deciding to use this method:
 | 
| +  //
 | 
| +  //  - geographical area codes change over time, and this method honors those
 | 
| +  //    changes; therefore, it doesn't guarantee the stability of the result it
 | 
| +  //    produces.
 | 
| +  //  - subscriber numbers may not be diallable from all devices (notably mobile
 | 
| +  //    devices, which typically requires the full national_number to be dialled
 | 
| +  //    in most regions).
 | 
| +  //  - most non-geographical numbers have no area codes.
 | 
| +  //  - some geographical numbers have no area codes.
 | 
| +  int GetLengthOfGeographicalAreaCode(const PhoneNumber& number) const;
 | 
| +
 | 
| +  // Gets the length of the national destination code (NDC) from the PhoneNumber
 | 
| +  // object passed in, so that clients could use it to split a national
 | 
| +  // significant number into NDC and subscriber number. The NDC of a phone
 | 
| +  // number is normally the first group of digit(s) right after the country
 | 
| +  // calling code when the number is formatted in the international format, if
 | 
| +  // there is a subscriber number part that follows. An example of how this
 | 
| +  // could be used:
 | 
| +  //
 | 
| +  // const PhoneNumberUtil& phone_util(PhoneNumberUtil::GetInstance());
 | 
| +  // PhoneNumber number;
 | 
| +  // phone_util.Parse("16502530000", "US", &number);
 | 
| +  // string national_significant_number;
 | 
| +  // phone_util.GetNationalSignificantNumber(number,
 | 
| +  //                                         &national_significant_number);
 | 
| +  // string national_destination_code;
 | 
| +  // string subscriber_number;
 | 
| +  //
 | 
| +  // int national_destination_code_length =
 | 
| +  //     phone_util.GetLengthOfGeographicalAreaCode(number);
 | 
| +  // if (national_destination_code_length > 0) {
 | 
| +  //   national_destination_code = national_significant_number.substring(
 | 
| +  //       0, national_destination_code_length);
 | 
| +  //   subscriber_number = national_significant_number.substring(
 | 
| +  //       national_destination_code_length, string::npos);
 | 
| +  // else {
 | 
| +  //   national_destination_code = "";
 | 
| +  //   subscriber_number = national_significant_number;
 | 
| +  // }
 | 
| +  //
 | 
| +  // Refer to the unittests to see the difference between this function and
 | 
| +  // GetLengthOfGeographicalAreaCode().
 | 
| +  int GetLengthOfNationalDestinationCode(const PhoneNumber& number) const;
 | 
| +
 | 
| +  // Formats a phone number in the specified format using default rules. Note
 | 
| +  // that this does not promise to produce a phone number that the user can
 | 
| +  // dial from where they are - although we do format in either NATIONAL or
 | 
| +  // INTERNATIONAL format depending on what the client asks for, we do not
 | 
| +  // currently support a more abbreviated format, such as for users in the
 | 
| +  // same area who could potentially dial the number without area code.
 | 
| +  void Format(const PhoneNumber& number,
 | 
| +              PhoneNumberFormat number_format,
 | 
| +              string* formatted_number) const;
 | 
| +
 | 
| +  // Formats a phone number in the specified format using client-defined
 | 
| +  // formatting rules.
 | 
| +  void FormatByPattern(
 | 
| +      const PhoneNumber& number,
 | 
| +      PhoneNumberFormat number_format,
 | 
| +      const RepeatedPtrField<NumberFormat>& user_defined_formats,
 | 
| +      string* formatted_number) const;
 | 
| +
 | 
| +  // Formats a phone number in national format for dialing using the carrier as
 | 
| +  // specified in the carrier_code. The carrier_code will always be used
 | 
| +  // regardless of whether the phone number already has a preferred domestic
 | 
| +  // carrier code stored. If carrier_code contains an empty string, return the
 | 
| +  // number in national format without any carrier code.
 | 
| +  void FormatNationalNumberWithCarrierCode(const PhoneNumber& number,
 | 
| +                                           const string& carrier_code,
 | 
| +                                           string* formatted_number) const;
 | 
| +
 | 
| +  // Formats a phone number in national format for dialing using the carrier as
 | 
| +  // specified in the preferred_domestic_carrier_code field of the PhoneNumber
 | 
| +  // object passed in. If that is missing, use the fallback_carrier_code passed
 | 
| +  // in instead. If there is no preferred_domestic_carrier_code, and the
 | 
| +  // fallback_carrier_code contains an empty string, return the number in
 | 
| +  // national format without any carrier code.
 | 
| +  //
 | 
| +  // Use FormatNationalNumberWithCarrierCode instead if the carrier code passed
 | 
| +  // in should take precedence over the number's preferred_domestic_carrier_code
 | 
| +  // when formatting.
 | 
| +  void FormatNationalNumberWithPreferredCarrierCode(
 | 
| +      const PhoneNumber& number,
 | 
| +      const string& fallback_carrier_code,
 | 
| +      string* formatted_number) const;
 | 
| +
 | 
| +  // Formats a phone number for out-of-country dialing purposes.
 | 
| +  //
 | 
| +  // Note this function takes care of the case for calling inside of NANPA
 | 
| +  // and between Russia and Kazakhstan (who share the same country calling
 | 
| +  // code). In those cases, no international prefix is used. For regions which
 | 
| +  // have multiple international prefixes, the number in its INTERNATIONAL
 | 
| +  // format will be returned instead.
 | 
| +  void FormatOutOfCountryCallingNumber(
 | 
| +      const PhoneNumber& number,
 | 
| +      const string& calling_from,
 | 
| +      string* formatted_number) const;
 | 
| +
 | 
| +  // Formats a phone number using the original phone number format that the
 | 
| +  // number is parsed from. The original format is embedded in the
 | 
| +  // country_code_source field of the PhoneNumber object passed in. If such
 | 
| +  // information is missing, the number will be formatted into the NATIONAL
 | 
| +  // format by default.
 | 
| +  void FormatInOriginalFormat(const PhoneNumber& number,
 | 
| +                              const string& region_calling_from,
 | 
| +                              string* formatted_number) const;
 | 
| +
 | 
| +  // Formats a phone number for out-of-country dialing purposes.
 | 
| +  //
 | 
| +  // Note that in this version, if the number was entered originally using alpha
 | 
| +  // characters and this version of the number is stored in raw_input, this
 | 
| +  // representation of the number will be used rather than the digit
 | 
| +  // representation. Grouping information, as specified by characters such as
 | 
| +  // "-" and " ", will be retained.
 | 
| +  //
 | 
| +  // Caveats:
 | 
| +  // 1) This will not produce good results if the country calling code is both
 | 
| +  // present in the raw input _and_ is the start of the national number. This
 | 
| +  // is not a problem in the regions which typically use alpha numbers.
 | 
| +  // 2) This will also not produce good results if the raw input has any
 | 
| +  // grouping information within the first three digits of the national number,
 | 
| +  // and if the function needs to strip preceding digits/words in the raw input
 | 
| +  // before these digits. Normally people group the first three digits together
 | 
| +  // so this is not a huge problem - and will be fixed if it proves to be so.
 | 
| +  void FormatOutOfCountryKeepingAlphaChars(
 | 
| +      const PhoneNumber& number,
 | 
| +      const string& calling_from,
 | 
| +      string* formatted_number) const;
 | 
| +
 | 
| +  // Attempts to extract a valid number from a phone number that is too long to
 | 
| +  // be valid, and resets the PhoneNumber object passed in to that valid
 | 
| +  // version. If no valid number could be extracted, the PhoneNumber object
 | 
| +  // passed in will not be modified. It returns true if a valid phone number can
 | 
| +  // be successfully extracted.
 | 
| +  bool TruncateTooLongNumber(PhoneNumber* number) const;
 | 
| +
 | 
| +  // Gets the type of a phone number.
 | 
| +  PhoneNumberType GetNumberType(const PhoneNumber& number) const;
 | 
| +
 | 
| +  // Tests whether a phone number matches a valid pattern. Note this doesn't
 | 
| +  // verify the number is actually in use, which is impossible to tell by just
 | 
| +  // looking at a number itself.
 | 
| +  bool IsValidNumber(const PhoneNumber& number) const;
 | 
| +
 | 
| +  // Tests whether a phone number is valid for a certain region. Note this
 | 
| +  // doesn't verify the number is actually in use, which is impossible to tell
 | 
| +  // by just looking at a number itself. If the country calling code is not the
 | 
| +  // same as the country calling code for the region, this immediately exits
 | 
| +  // with false.  After this, the specific number pattern rules for the region
 | 
| +  // are examined.
 | 
| +  // This is useful for determining for example whether a particular number is
 | 
| +  // valid for Canada, rather than just a valid NANPA number.
 | 
| +  //
 | 
| +  // The region_code parameter is an ISO 3166-1 two-letter country code string.
 | 
| +  bool IsValidNumberForRegion(
 | 
| +      const PhoneNumber& number,
 | 
| +      const string& region_code) const;
 | 
| +
 | 
| +  // Returns the region where a phone number is from. This could be used for
 | 
| +  // geo-coding at the region level.
 | 
| +  // The country/region is returned as an ISO 3166-1 two-letter country code
 | 
| +  // string.
 | 
| +  void GetRegionCodeForNumber(const PhoneNumber& number,
 | 
| +                              string* region_code) const;
 | 
| +
 | 
| +  // Returns the country calling code for a specific region. For example,
 | 
| +  // this would be 1 for the United States, and 64 for New Zealand.
 | 
| +  //
 | 
| +  // The region_code parameter is an ISO 3166-1 two-letter country code string.
 | 
| +  int GetCountryCodeForRegion(const string& region_code) const;
 | 
| +
 | 
| +  // Returns the region code that matches the specific country code. Note that
 | 
| +  // it is possible that several regions share the same country code (e.g. US
 | 
| +  // and Canada), and in that case, only one of the regions (normally the one
 | 
| +  // with the largest population) is returned.
 | 
| +  //
 | 
| +  // The region code is returned as an ISO 3166-1 two-letter country code
 | 
| +  // string.
 | 
| +  void GetRegionCodeForCountryCode(int country_code, string* region_code) const;
 | 
| +
 | 
| +  // Checks if this is a region under the North American Numbering Plan
 | 
| +  // Administration (NANPA).
 | 
| +  //
 | 
| +  // The region_code parameter is an ISO 3166-1 two-letter country code string.
 | 
| +  bool IsNANPACountry(const string& region_code) const;
 | 
| +
 | 
| +  // Checks whether a phone number is a possible number. It provides a more
 | 
| +  // lenient check than IsValidNumber() in the following sense:
 | 
| +  //   1. It only checks the length of phone numbers. In particular, it doesn't
 | 
| +  //      check starting digits of the number.
 | 
| +  //   2. It doesn't attempt to figure out the type of the number, but uses
 | 
| +  //      general rules which applies to all types of phone numbers in a
 | 
| +  //      region. Therefore, it is much faster than IsValidNumber().
 | 
| +  //   3. For fixed line numbers, many regions have the concept of area code,
 | 
| +  //      which together with subscriber number constitute the national
 | 
| +  //      significant number. It is sometimes okay to dial the subscriber
 | 
| +  //      number only when dialing in the same area. This function will return
 | 
| +  //      true if the subscriber-number-only version is passed in. On the other
 | 
| +  //      hand, because IsValidNumber() validates using information on both
 | 
| +  //      starting digits (for fixed line numbers, that would most likely be
 | 
| +  //      area codes) and length (obviously includes the length of area codes
 | 
| +  //      for fixed line numbers), it will return false for the
 | 
| +  //      subscriber-number-only version.
 | 
| +  ValidationResult IsPossibleNumberWithReason(const PhoneNumber& number) const;
 | 
| +
 | 
| +  // Convenience wrapper around IsPossibleNumberWithReason. Instead of returning
 | 
| +  // the reason for failure, this method returns a boolean value.
 | 
| +  bool IsPossibleNumber(const PhoneNumber& number) const;
 | 
| +
 | 
| +  // Checks whether a phone number is a possible number given a number in the
 | 
| +  // form of a string, and the country where the number could be dialed from.
 | 
| +  // It provides a more lenient check than IsValidNumber(). See
 | 
| +  // IsPossibleNumber(const PhoneNumber& number) for details.
 | 
| +  //
 | 
| +  // This method first parses the number, then invokes
 | 
| +  // IsPossibleNumber(const PhoneNumber& number) with the resultant PhoneNumber
 | 
| +  // object.
 | 
| +  //
 | 
| +  // region_dialing_from represents the region that we are expecting the number
 | 
| +  // to be dialed from. Note this is different from the region where the number
 | 
| +  // belongs. For example, the number +1 650 253 0000 is a number that belongs
 | 
| +  // to US. When written in this form, it could be dialed from any region. When
 | 
| +  // it is written as 00 1 650 253 0000, it could be dialed from any region
 | 
| +  // which uses an international dialling prefix of 00. When it is written as
 | 
| +  // 650 253 0000, it could only be dialed from within the US, and when written
 | 
| +  // as 253 0000, it could only be dialed from within a smaller area in the US
 | 
| +  // (Mountain View, CA, to be more specific).
 | 
| +  //
 | 
| +  // The country_dialing_from parameter is an ISO 3166-1 two-letter country code
 | 
| +  // string.
 | 
| +  bool IsPossibleNumberForString(
 | 
| +      const string& number,
 | 
| +      const string& country_dialing_from) const;
 | 
| +
 | 
| +  // Gets a valid fixed-line number for the specified region. Returns false if
 | 
| +  // the region was unknown.
 | 
| +  bool GetExampleNumber(const string& region_code,
 | 
| +                        PhoneNumber* number) const;
 | 
| +
 | 
| +  // Gets a valid number of the specified type for the specified region.
 | 
| +  // Returns false if the region was unknown or if no example number of that
 | 
| +  // type could be found.
 | 
| +  //
 | 
| +  // The region_code parameter is an ISO 3166-1 two-letter country code string.
 | 
| +  bool GetExampleNumberForType(const string& region_code,
 | 
| +                               PhoneNumberType type,
 | 
| +                               PhoneNumber* number) const;
 | 
| +
 | 
| +  // Parses a string and returns it in proto buffer format. This method will
 | 
| +  // return an error like INVALID_COUNTRY_CODE if the number is not considered
 | 
| +  // to be a possible number, and NO_PARSING_ERROR if it parsed correctly. Note
 | 
| +  // that validation of whether the number is actually a valid number for a
 | 
| +  // particular region is not performed. This can be done separately with
 | 
| +  // IsValidNumber().
 | 
| +  //
 | 
| +  // default_region represents the country that we are expecting the number to
 | 
| +  // be from. This is only used if the number being parsed is not written in
 | 
| +  // international format. The country_code for the number in this case would be
 | 
| +  // stored as that of the default country supplied. If the number is guaranteed
 | 
| +  // to start with a '+' followed by the country calling code, then
 | 
| +  // "ZZ" can be supplied.
 | 
| +  //
 | 
| +  // The default_country parameter is an ISO 3166-1 two-letter country code
 | 
| +  // string.
 | 
| +  ErrorType Parse(const string& number_to_parse,
 | 
| +                  const string& default_country,
 | 
| +                  PhoneNumber* number) const;
 | 
| +  // Parses a string and returns it in proto buffer format. This method differs
 | 
| +  // from Parse() in that it always populates the raw_input field of the
 | 
| +  // protocol buffer with number_to_parse as well as the country_code_source
 | 
| +  // field.
 | 
| +  //
 | 
| +  // The default_country parameter is an ISO 3166-1 two-letter country code
 | 
| +  // string.
 | 
| +  ErrorType ParseAndKeepRawInput(const string& number_to_parse,
 | 
| +                                 const string& default_country,
 | 
| +                                 PhoneNumber* number) const;
 | 
| +
 | 
| +  // Takes two phone numbers and compares them for equality.
 | 
| +  //
 | 
| +  // Returns EXACT_MATCH if the country calling code, NSN, presence of a leading
 | 
| +  // zero for Italian numbers and any extension present are the same.
 | 
| +  // Returns NSN_MATCH if either or both has no country calling code specified,
 | 
| +  // and the NSNs and extensions are the same.
 | 
| +  // Returns SHORT_NSN_MATCH if either or both has no country calling code
 | 
| +  // specified, or the country calling code specified is the same, and one NSN
 | 
| +  // could be a shorter version of the other number. This includes the case
 | 
| +  // where one has an extension specified, and the other does not.
 | 
| +  // Returns NO_MATCH otherwise.
 | 
| +  // For example, the numbers +1 345 657 1234 and 657 1234 are a
 | 
| +  // SHORT_NSN_MATCH. The numbers +1 345 657 1234 and 345 657 are a NO_MATCH.
 | 
| +  MatchType IsNumberMatch(const PhoneNumber& first_number,
 | 
| +                          const PhoneNumber& second_number) const;
 | 
| +
 | 
| +  // Takes two phone numbers as strings and compares them for equality. This
 | 
| +  // is a convenience wrapper for IsNumberMatch(PhoneNumber firstNumber,
 | 
| +  // PhoneNumber secondNumber). No default region is known.
 | 
| +  // Returns INVALID_NUMBER if either number cannot be parsed into a phone
 | 
| +  // number.
 | 
| +  MatchType IsNumberMatchWithTwoStrings(const string& first_number,
 | 
| +                                        const string& second_number) const;
 | 
| +
 | 
| +  // Takes two phone numbers and compares them for equality. This is a
 | 
| +  // convenience wrapper for IsNumberMatch(PhoneNumber firstNumber,
 | 
| +  // PhoneNumber secondNumber). No default region is known.
 | 
| +  // Returns INVALID_NUMBER if second_number cannot be parsed into a phone
 | 
| +  // number.
 | 
| +  MatchType IsNumberMatchWithOneString(const PhoneNumber& first_number,
 | 
| +                                       const string& second_number) const;
 | 
| +
 | 
| +  // Implement this 'interface' to override the way metadatas are fetched.
 | 
| +  // Useful for testing injecting stable metadatas.
 | 
| +  class MetadataProvider {
 | 
| +   public:
 | 
| +     virtual ~MetadataProvider() {}
 | 
| +
 | 
| +     // Returns a pair containing a pointer to the data and its size
 | 
| +     virtual pair<const void*, unsigned> operator()() = 0;
 | 
| +  };
 | 
| +
 | 
| +  // Override the default logging system. The provided adapter destruction is
 | 
| +  // handled by this class (don't delete it).
 | 
| +  static void SetLoggerAdapter(LoggerAdapter* logger_adapter);
 | 
| +
 | 
| +  friend bool ConvertFromTelephoneNumberProto(
 | 
| +      const TelephoneNumber& proto_to_convert,
 | 
| +      PhoneNumber* new_proto);
 | 
| +  friend bool ConvertToTelephoneNumberProto(const PhoneNumber& proto_to_convert,
 | 
| +                                            TelephoneNumber* resulting_proto);
 | 
| +
 | 
| + protected:
 | 
| +  // Check whether the country_calling_code is from a country whose national
 | 
| +  // significant number could contain a leading zero. An example of such a
 | 
| +  // country is Italy.
 | 
| +  bool IsLeadingZeroPossible(int country_calling_code) const;
 | 
| +
 | 
| + private:
 | 
| +  typedef pair<int, list<string>*> IntRegionsPair;
 | 
| +
 | 
| +  // The minimum and maximum length of the national significant number.
 | 
| +  static const size_t kMinLengthForNsn = 3;
 | 
| +  static const size_t kMaxLengthForNsn = 15;
 | 
| +
 | 
| +  // A mapping from a country calling code to a region code which denotes the
 | 
| +  // region represented by that country calling code. Note countries under
 | 
| +  // NANPA share the country calling code 1 and Russia and Kazakhstan share the
 | 
| +  // country calling code 7. Under this map, 1 is mapped to region code "US" and
 | 
| +  // 7 is mapped to region code "RU". This is implemented as a sorted vector to
 | 
| +  // achieve better performance.
 | 
| +  //
 | 
| +  // Region codes are ISO 3166-1 two-letter country code strings.
 | 
| +  scoped_ptr<vector<IntRegionsPair> > country_calling_code_to_region_code_map_;
 | 
| +
 | 
| +  struct CompareFirst {
 | 
| +    bool operator()(const IntRegionsPair& p1,
 | 
| +                    const IntRegionsPair& p2) const {
 | 
| +      return p1.first < p2.first;
 | 
| +    }
 | 
| +  };
 | 
| +
 | 
| +  // The set of regions that share country calling code 1.
 | 
| +  scoped_ptr<set<string> > nanpa_regions_;
 | 
| +  static const int kNanpaCountryCode = 1;
 | 
| +
 | 
| +  // A mapping from a region code to a PhoneMetadata for that region.
 | 
| +  // Region codes are ISO 3166-1 two-letter country code strings.
 | 
| +  scoped_ptr<map<string, PhoneMetadata> > region_to_metadata_map_;
 | 
| +
 | 
| +  bool LoadMetadata(PhoneMetadataCollection* metadata,
 | 
| +                    MetadataProvider& provider);
 | 
| +
 | 
| +  explicit PhoneNumberUtil(MetadataProvider* provider = 0);
 | 
| +  ~PhoneNumberUtil();
 | 
| +
 | 
| +  // Gets all the supported regions.
 | 
| +  void GetSupportedRegions(set<string>* regions) const;
 | 
| +
 | 
| +  // Returns the national dialling prefix for a specific region. For example,
 | 
| +  // this would be 1 for the United States, and 0 for New Zealand. Set
 | 
| +  // stripNonDigits to true to strip symbols like "~" (which indicates a wait
 | 
| +  // for a dialling tone) from the prefix returned. If no national prefix is
 | 
| +  // present, we return an empty string.
 | 
| +  //
 | 
| +  // Set strip_non_digits to true to strip non-digits from the national
 | 
| +  // dialling prefix.
 | 
| +  void GetNddPrefixForRegion(const string& region_code,
 | 
| +                             bool strip_non_digits,
 | 
| +                             string* national_prefix) const;
 | 
| +
 | 
| +  // Helper function to check region code is not unknown or null.
 | 
| +  //
 | 
| +  // The region_code parameter is an ISO 3166-1 two-letter country code string.
 | 
| +  bool IsValidRegionCode(const string& region_code) const;
 | 
| +
 | 
| +  // Helper function to check region code is not unknown. The
 | 
| +  // country_calling_code and number supplied is used only for the resultant log
 | 
| +  // message.
 | 
| +  //
 | 
| +  // The region_code parameter is an ISO 3166-1 two-letter country code string.
 | 
| +  bool HasValidRegionCode(const string& region_code,
 | 
| +                          int country_code,
 | 
| +                          const string& number) const;
 | 
| +
 | 
| +  // The region_code parameter is an ISO 3166-1 two-letter country code string.
 | 
| +  const i18n::phonenumbers::PhoneMetadata* GetMetadataForRegion(
 | 
| +      const string& region_code) const;
 | 
| +
 | 
| +  void GetRegionCodesForCountryCallingCode(
 | 
| +      int country_calling_code,
 | 
| +      list<string>* region_codes) const;
 | 
| +
 | 
| +  // Simple wrapper of FormatNationalNumberWithCarrier for the common case of
 | 
| +  // no carrier code.
 | 
| +  //
 | 
| +  // The region_code parameter is an ISO 3166-1 two-letter country code string.
 | 
| +  void FormatNationalNumber(const string& number,
 | 
| +                            const string& region_code,
 | 
| +                            PhoneNumberFormat number_format,
 | 
| +                            string* formatted_number) const;
 | 
| +
 | 
| +  // The region_code parameter is an ISO 3166-1 two-letter country code string.
 | 
| +  void FormatNationalNumberWithCarrier(const string& number,
 | 
| +                                       const string& region_code,
 | 
| +                                       PhoneNumberFormat number_format,
 | 
| +                                       const string& carrier_code,
 | 
| +                                       string* formatted_number) const;
 | 
| +
 | 
| +  // The region_code parameter is an ISO 3166-1 two-letter country code string.
 | 
| +  void MaybeGetFormattedExtension(
 | 
| +      const PhoneNumber& number,
 | 
| +      const string& region_code,
 | 
| +      PhoneNumberFormat number_format,
 | 
| +      string* extension) const;
 | 
| +
 | 
| +  // The region_code parameter is an ISO 3166-1 two-letter country code string.
 | 
| +  void FormatExtension(const string& extension_digits,
 | 
| +                       const string& region_code,
 | 
| +                       string* extension) const;
 | 
| +
 | 
| +  void GetRegionCodeForNumberFromRegionList(
 | 
| +      const PhoneNumber& number,
 | 
| +      const list<string>& region_codes,
 | 
| +      string* region_code) const;
 | 
| +
 | 
| +  void Normalize(string* number) const;
 | 
| +  PhoneNumber::CountryCodeSource MaybeStripInternationalPrefixAndNormalize(
 | 
| +      const string& possible_idd_prefix,
 | 
| +      string* number) const;
 | 
| +
 | 
| +  static void MaybeStripNationalPrefixAndCarrierCode(
 | 
| +      const PhoneMetadata& metadata,
 | 
| +      string* number,
 | 
| +      string* carrier_code);
 | 
| +
 | 
| +  static void ExtractPossibleNumber(const string& number,
 | 
| +                                    string* extracted_number);
 | 
| +
 | 
| +  static bool IsViablePhoneNumber(const string& number);
 | 
| +
 | 
| +  static bool MaybeStripExtension(string* number, string* extension);
 | 
| +
 | 
| +  int ExtractCountryCode(string* national_number) const;
 | 
| +  ErrorType MaybeExtractCountryCode(
 | 
| +      const PhoneMetadata* default_region_metadata,
 | 
| +      bool keepRawInput,
 | 
| +      string* national_number,
 | 
| +      PhoneNumber* phone_number) const;
 | 
| +
 | 
| +  // The default_region parameter is an ISO 3166-1 two-letter country code
 | 
| +  // string.
 | 
| +  bool CheckRegionForParsing(
 | 
| +      const string& number_to_parse,
 | 
| +      const string& default_region) const;
 | 
| +
 | 
| +  // The default_region parameter is an ISO 3166-1 two-letter country code
 | 
| +  // string.
 | 
| +  ErrorType ParseHelper(const string& number_to_parse,
 | 
| +                        const string& default_region,
 | 
| +                        bool keep_raw_input,
 | 
| +                        bool check_region,
 | 
| +                        PhoneNumber* phone_number) const;
 | 
| +
 | 
| +  DISALLOW_COPY_AND_ASSIGN(PhoneNumberUtil);
 | 
| +};
 | 
| +
 | 
| +}  // namespace phonenumbers
 | 
| +}  // namespace i18n
 | 
| +
 | 
| +#endif  // I18N_PHONENUMBERS_PHONENUMBERUTIL_H_
 | 
| 
 | 
| Property changes on: third_party\libphonenumber\cpp\src\phonenumberutil.h
 | 
| ___________________________________________________________________
 | 
| Added: svn:eol-style
 | 
|    + LF
 | 
| 
 | 
| 
 |