1b9056914e2627627ffdd615e078a9b6020ab1cf2philip.liard@gmail.com// Copyright (C) 2009 The Libphonenumber Authors
21ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com//
31ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// Licensed under the Apache License, Version 2.0 (the "License");
41ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// you may not use this file except in compliance with the License.
51ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// You may obtain a copy of the License at
61ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com//
71ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// http://www.apache.org/licenses/LICENSE-2.0
81ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com//
91ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// Unless required by applicable law or agreed to in writing, software
101ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// distributed under the License is distributed on an "AS IS" BASIS,
111ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
121ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// See the License for the specific language governing permissions and
131ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// limitations under the License.
141ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
151ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// Utility for international phone numbers.
161ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com//
171ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// Author: Shaopeng Jia
181ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// Open-sourced by: Philippe Liard
191ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
201ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#ifndef I18N_PHONENUMBERS_PHONENUMBERUTIL_H_
211ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#define I18N_PHONENUMBERS_PHONENUMBERUTIL_H_
221ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
23603e7e5f83aad6e45e8d794c604a546936b77a16philip.liard@gmail.com#include <stddef.h>
241ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include <list>
251ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include <map>
261ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include <set>
271ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include <string>
281ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include <utility>
291ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include <vector>
301ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
31af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com#include "phonenumbers/base/basictypes.h"
32af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com#include "phonenumbers/base/memory/scoped_ptr.h"
33af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com#include "phonenumbers/base/memory/singleton.h"
341ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include "phonenumbers/phonenumber.pb.h"
351ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
361ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comclass TelephoneNumber;
371ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
381ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comnamespace i18n {
391ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comnamespace phonenumbers {
401ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
411ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comusing std::list;
421ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comusing std::map;
431ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comusing std::pair;
441ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comusing std::set;
451ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comusing std::string;
461ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comusing std::vector;
471ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
481ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comusing google::protobuf::RepeatedPtrField;
491ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
5080d738a894e26aa958eacc62afbc70617b13dc83philip.liard@gmail.comclass AsYouTypeFormatter;
511ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comclass Logger;
521ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comclass NumberFormat;
531ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comclass PhoneMetadata;
54d7f0c9413b136b6e2304d923a51c61e521c28f53philip.liard@gmail.comclass PhoneNumberRegExpsAndMappings;
55384682a45e06c1a6c4956fcf23669ddf23ef336ephilip.liard@gmail.comclass RegExp;
561ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
571ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// NOTE: A lot of methods in this class require Region Code strings. These must
581ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// be provided using ISO 3166-1 two-letter country-code format. The list of the
591ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// codes can be found here:
601ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// http://www.iso.org/iso/english_country_names_and_code_elements
611ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
621ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comclass PhoneNumberUtil : public Singleton<PhoneNumberUtil> {
63fa6ddeed736e42c266027a0d7b696909083d066bphilip.liard@gmail.com private:
6480d738a894e26aa958eacc62afbc70617b13dc83philip.liard@gmail.com  friend class AsYouTypeFormatter;
656a0a07f4f0066eba2dc9bb81465f4e67d670c7b6philip.liard@gmail.com  friend class PhoneNumberMatcher;
666a0a07f4f0066eba2dc9bb81465f4e67d670c7b6philip.liard@gmail.com  friend class PhoneNumberMatcherRegExps;
676a0a07f4f0066eba2dc9bb81465f4e67d670c7b6philip.liard@gmail.com  friend class PhoneNumberMatcherTest;
68d7f0c9413b136b6e2304d923a51c61e521c28f53philip.liard@gmail.com  friend class PhoneNumberRegExpsAndMappings;
691ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  friend class PhoneNumberUtilTest;
70b3bfbbcb458043ddaaa1099b776014ba0968704dlararennie@google.com  friend class ShortNumberInfo;
71b3bfbbcb458043ddaaa1099b776014ba0968704dlararennie@google.com  friend class ShortNumberInfoTest;
72fa6ddeed736e42c266027a0d7b696909083d066bphilip.liard@gmail.com  friend class Singleton<PhoneNumberUtil>;
73fa6ddeed736e42c266027a0d7b696909083d066bphilip.liard@gmail.com
741ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com public:
751ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  ~PhoneNumberUtil();
7680b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com  static const char kRegionCodeForNonGeoEntity[];
771ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
781ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // INTERNATIONAL and NATIONAL formats are consistent with the definition
791ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // in ITU-T Recommendation E. 123. For example, the number of the Google
801ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Zürich office will be written as "+41 44 668 1800" in INTERNATIONAL
811ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // format, and as "044 668 1800" in NATIONAL format. E164 format is as per
8235bd393fb78215a9c6dbeb158913def01eb58985lararennie@google.com  // INTERNATIONAL format but with no formatting applied e.g. "+41446681800".
831ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // RFC3966 is as per INTERNATIONAL format, but with all spaces and other
841ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // separating symbols replaced with a hyphen, and with any phone number
8535bd393fb78215a9c6dbeb158913def01eb58985lararennie@google.com  // extension appended with ";ext=". It also will have a prefix of "tel:"
8635bd393fb78215a9c6dbeb158913def01eb58985lararennie@google.com  // added, e.g. "tel:+41-44-668-1800".
871ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  enum PhoneNumberFormat {
881ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    E164,
891ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    INTERNATIONAL,
901ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    NATIONAL,
911ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    RFC3966
921ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  };
931ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
941ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Type of phone numbers.
951ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  enum PhoneNumberType {
961ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    FIXED_LINE,
971ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    MOBILE,
981ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    // In some regions (e.g. the USA), it is impossible to distinguish between
991ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    // fixed-line and mobile numbers by looking at the phone number itself.
1001ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    FIXED_LINE_OR_MOBILE,
1011ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    // Freephone lines
1021ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    TOLL_FREE,
1031ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    PREMIUM_RATE,
1041ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    // The cost of this call is shared between the caller and the recipient, and
1051ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    // is hence typically less than PREMIUM_RATE calls. See
1061ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    // http://en.wikipedia.org/wiki/Shared_Cost_Service for more information.
1071ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    SHARED_COST,
1081ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    // Voice over IP numbers. This includes TSoIP (Telephony Service over IP).
1091ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    VOIP,
1101ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    // A personal number is associated with a particular person, and may be
1111ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    // routed to either a MOBILE or FIXED_LINE number. Some more information can
1121ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    // be found here: http://en.wikipedia.org/wiki/Personal_Numbers
1131ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    PERSONAL_NUMBER,
1141ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    PAGER,
1151ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    // Used for "Universal Access Numbers" or "Company Numbers". They may be
1161ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    // further routed to specific offices, but allow one number to be used for a
1171ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    // company.
1181ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    UAN,
11980b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com    // Used for "Voice Mail Access Numbers".
12080b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com    VOICEMAIL,
1211ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    // A phone number is of type UNKNOWN when it does not fit any of the known
1221ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    // patterns for a specific region.
1231ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    UNKNOWN
1241ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  };
1251ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1261ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Types of phone number matches. See detailed description beside the
1271ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // IsNumberMatch() method.
1281ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  enum MatchType {
1291ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    INVALID_NUMBER,  // NOT_A_NUMBER in the java version.
1301ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    NO_MATCH,
1311ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    SHORT_NSN_MATCH,
1321ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    NSN_MATCH,
1331ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    EXACT_MATCH,
1341ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  };
1351ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1361ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  enum ErrorType {
1371ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    NO_PARSING_ERROR,
1381ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    INVALID_COUNTRY_CODE_ERROR,  // INVALID_COUNTRY_CODE in the java version.
1391ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    NOT_A_NUMBER,
1401ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    TOO_SHORT_AFTER_IDD,
1411ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    TOO_SHORT_NSN,
1421ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    TOO_LONG_NSN,  // TOO_LONG in the java version.
1431ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  };
1441ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1451ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Possible outcomes when testing if a PhoneNumber is possible.
1461ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  enum ValidationResult {
1471ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    IS_POSSIBLE,
1481ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    INVALID_COUNTRY_CODE,
1491ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    TOO_SHORT,
1501ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    TOO_LONG,
1511ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  };
1521ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1531fb4d23b94da7f0343ce7d177bee350db73e61b5philip.liard@gmail.com  // Convenience method to get a list of what regions the library has metadata
1541fb4d23b94da7f0343ce7d177bee350db73e61b5philip.liard@gmail.com  // for.
1551fb4d23b94da7f0343ce7d177bee350db73e61b5philip.liard@gmail.com  void GetSupportedRegions(set<string>* regions) const;
1561fb4d23b94da7f0343ce7d177bee350db73e61b5philip.liard@gmail.com
15793d3e8b6d7867ccac0dd4e6beeadfbc1b76dd116dbeaumont@google.com  // Populates a list with the region codes that match the specific country
15893d3e8b6d7867ccac0dd4e6beeadfbc1b76dd116dbeaumont@google.com  // calling code. For non-geographical country calling codes, the region code
15993d3e8b6d7867ccac0dd4e6beeadfbc1b76dd116dbeaumont@google.com  // 001 is returned. Also, in the case of no region code being found, the list
16093d3e8b6d7867ccac0dd4e6beeadfbc1b76dd116dbeaumont@google.com  // is left unchanged.
16193d3e8b6d7867ccac0dd4e6beeadfbc1b76dd116dbeaumont@google.com  void GetRegionCodesForCountryCallingCode(
16293d3e8b6d7867ccac0dd4e6beeadfbc1b76dd116dbeaumont@google.com      int country_calling_code,
16393d3e8b6d7867ccac0dd4e6beeadfbc1b76dd116dbeaumont@google.com      list<string>* region_codes) const;
16493d3e8b6d7867ccac0dd4e6beeadfbc1b76dd116dbeaumont@google.com
1651ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Gets a PhoneNumberUtil instance to carry out international phone number
1661ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // formatting, parsing, or validation. The instance is loaded with phone
1671ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // number metadata for a number of most commonly used regions, as specified by
1681ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // DEFAULT_REGIONS_.
1691ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //
1701ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // The PhoneNumberUtil is implemented as a singleton. Therefore, calling
171d61796e3253144c5b28d096d748bc27271397681lararennie@google.com  // GetInstance multiple times will only result in one instance being created.
1721ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  static PhoneNumberUtil* GetInstance();
1731ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1741ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Returns true if the number is a valid vanity (alpha) number such as 800
1751ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // MICROSOFT. A valid vanity number will start with at least 3 digits and will
1761ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // have three or more alpha characters. This does not do region-specific
1771ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // checks - to work out if this number is actually valid for a region, it
1781ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // should be parsed and methods such as IsPossibleNumberWithReason or
1791ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // IsValidNumber should be used.
1801ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  bool IsAlphaNumber(const string& number) const;
1811ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1821ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Converts all alpha characters in a number to their respective digits on
1831ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // a keypad, but retains existing formatting.
1841ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  void ConvertAlphaCharactersInNumber(string* number) const;
1851ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1861ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Normalizes a string of characters representing a phone number. This
1871ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // converts wide-ascii and arabic-indic numerals to European numerals, and
1881ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // strips punctuation and alpha characters.
189384682a45e06c1a6c4956fcf23669ddf23ef336ephilip.liard@gmail.com  void NormalizeDigitsOnly(string* number) const;
1901ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1917e77f5f74f097c32c256e8e1270ecbc306fc6567lararennie@google.com  // Normalizes a string of characters representing a phone number. This strips
1927e77f5f74f097c32c256e8e1270ecbc306fc6567lararennie@google.com  // all characters which are not diallable on a mobile phone keypad (including
1937e77f5f74f097c32c256e8e1270ecbc306fc6567lararennie@google.com  // all non-ASCII digits).
1947e77f5f74f097c32c256e8e1270ecbc306fc6567lararennie@google.com  void NormalizeDiallableCharsOnly(string* number) const;
1957e77f5f74f097c32c256e8e1270ecbc306fc6567lararennie@google.com
1961ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Gets the national significant number of a phone number. Note a national
1971ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // significant number doesn't contain a national prefix or any formatting.
1981ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  void GetNationalSignificantNumber(const PhoneNumber& number,
1991ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                                    string* national_significant_num) const;
2001ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
2011ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Gets the length of the geographical area code from the PhoneNumber object
2021ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // passed in, so that clients could use it to split a national significant
2031ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // number into geographical area code and subscriber number. It works in such
2041ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // a way that the resultant subscriber number should be diallable, at least on
2051ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // some devices. An example of how this could be used:
2061ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //
207d61796e3253144c5b28d096d748bc27271397681lararennie@google.com  // const PhoneNumberUtil& phone_util(*PhoneNumberUtil::GetInstance());
2081ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // PhoneNumber number;
2091ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // phone_util.Parse("16502530000", "US", &number);
2101ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // string national_significant_number;
2111ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // phone_util.GetNationalSignificantNumber(number,
2121ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //                                         &national_significant_number);
2131ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // string area_code;
2141ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // string subscriber_number;
2151ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //
2161ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // int area_code_length = phone_util.GetLengthOfGeographicalAreaCode(number);
2171ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // if (area_code_length > 0) {
2181fb4d23b94da7f0343ce7d177bee350db73e61b5philip.liard@gmail.com  //   area_code = national_significant_number.substr(0, area_code_length);
2191fb4d23b94da7f0343ce7d177bee350db73e61b5philip.liard@gmail.com  //   subscriber_number = national_significant_number.substr(
2201ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //       area_code_length, string::npos);
2211ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // else {
2221ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //   area_code = "";
2231ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //   subscriber_number = national_significant_number;
2241ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // }
2251ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //
226d61796e3253144c5b28d096d748bc27271397681lararennie@google.com  // N.B.: area code is a very ambiguous concept, so the authors generally
227d61796e3253144c5b28d096d748bc27271397681lararennie@google.com  // recommend against using it for most purposes, but recommend using the
2281ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // more general national_number instead. Read the following carefully before
2291ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // deciding to use this method:
2301ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //
2311ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //  - geographical area codes change over time, and this method honors those
2321ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //    changes; therefore, it doesn't guarantee the stability of the result it
2331ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //    produces.
2341ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //  - subscriber numbers may not be diallable from all devices (notably mobile
2351ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //    devices, which typically requires the full national_number to be dialled
2361ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //    in most regions).
23780b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com  //  - most non-geographical numbers have no area codes, including numbers
23880b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com  //    from non-geographical entities.
2391ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //  - some geographical numbers have no area codes.
2401ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  int GetLengthOfGeographicalAreaCode(const PhoneNumber& number) const;
2411ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
2421ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Gets the length of the national destination code (NDC) from the PhoneNumber
2431ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // object passed in, so that clients could use it to split a national
2441ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // significant number into NDC and subscriber number. The NDC of a phone
2451ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // number is normally the first group of digit(s) right after the country
2461ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // calling code when the number is formatted in the international format, if
2471ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // there is a subscriber number part that follows. An example of how this
2481ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // could be used:
2491ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //
250d61796e3253144c5b28d096d748bc27271397681lararennie@google.com  // const PhoneNumberUtil& phone_util(*PhoneNumberUtil::GetInstance());
2511ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // PhoneNumber number;
2521ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // phone_util.Parse("16502530000", "US", &number);
2531ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // string national_significant_number;
2541ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // phone_util.GetNationalSignificantNumber(number,
2551ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //                                         &national_significant_number);
2561ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // string national_destination_code;
2571ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // string subscriber_number;
2581ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //
2591ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // int national_destination_code_length =
2601ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //     phone_util.GetLengthOfGeographicalAreaCode(number);
2611ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // if (national_destination_code_length > 0) {
2621fb4d23b94da7f0343ce7d177bee350db73e61b5philip.liard@gmail.com  //   national_destination_code = national_significant_number.substr(
2631ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //       0, national_destination_code_length);
2641fb4d23b94da7f0343ce7d177bee350db73e61b5philip.liard@gmail.com  //   subscriber_number = national_significant_number.substr(
2651ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //       national_destination_code_length, string::npos);
2661ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // else {
2671ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //   national_destination_code = "";
2681ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //   subscriber_number = national_significant_number;
2691ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // }
2701ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //
2711ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Refer to the unittests to see the difference between this function and
2721ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // GetLengthOfGeographicalAreaCode().
2731ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  int GetLengthOfNationalDestinationCode(const PhoneNumber& number) const;
2741ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
275b779a05159b4c448605b32f2529b80b12caec300roes@google.com  // Returns the mobile token for the provided country calling code if it has
276b779a05159b4c448605b32f2529b80b12caec300roes@google.com  // one, otherwise returns an empty string. A mobile token is a number inserted
277b779a05159b4c448605b32f2529b80b12caec300roes@google.com  // before the area code when dialing a mobile number from that country from
278b779a05159b4c448605b32f2529b80b12caec300roes@google.com  // abroad.
279b779a05159b4c448605b32f2529b80b12caec300roes@google.com  void GetCountryMobileToken(int country_calling_code,
280b779a05159b4c448605b32f2529b80b12caec300roes@google.com                             string* mobile_token) const;
281b779a05159b4c448605b32f2529b80b12caec300roes@google.com
2821ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Formats a phone number in the specified format using default rules. Note
2831ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // that this does not promise to produce a phone number that the user can
2841ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // dial from where they are - although we do format in either NATIONAL or
2851ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // INTERNATIONAL format depending on what the client asks for, we do not
2861ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // currently support a more abbreviated format, such as for users in the
2871ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // same area who could potentially dial the number without area code.
2881ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  void Format(const PhoneNumber& number,
2891ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com              PhoneNumberFormat number_format,
2901ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com              string* formatted_number) const;
2911ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
2921ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Formats a phone number in the specified format using client-defined
2931ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // formatting rules.
2941ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  void FormatByPattern(
2951ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      const PhoneNumber& number,
2961ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      PhoneNumberFormat number_format,
2971ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      const RepeatedPtrField<NumberFormat>& user_defined_formats,
2981ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      string* formatted_number) const;
2991ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
3001ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Formats a phone number in national format for dialing using the carrier as
3011ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // specified in the carrier_code. The carrier_code will always be used
3021ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // regardless of whether the phone number already has a preferred domestic
3031ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // carrier code stored. If carrier_code contains an empty string, return the
3041ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // number in national format without any carrier code.
3051ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  void FormatNationalNumberWithCarrierCode(const PhoneNumber& number,
3061ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                                           const string& carrier_code,
3071ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                                           string* formatted_number) const;
3081ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
3091ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Formats a phone number in national format for dialing using the carrier as
3101ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // specified in the preferred_domestic_carrier_code field of the PhoneNumber
3111ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // object passed in. If that is missing, use the fallback_carrier_code passed
3121ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // in instead. If there is no preferred_domestic_carrier_code, and the
3131ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // fallback_carrier_code contains an empty string, return the number in
3141ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // national format without any carrier code.
3151ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //
3161ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Use FormatNationalNumberWithCarrierCode instead if the carrier code passed
3171ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // in should take precedence over the number's preferred_domestic_carrier_code
3181ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // when formatting.
3191ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  void FormatNationalNumberWithPreferredCarrierCode(
3201ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      const PhoneNumber& number,
3211ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      const string& fallback_carrier_code,
3221ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      string* formatted_number) const;
3231ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
324d72e8b9841fa8e3dc3ed8fc9c5f0c819c94c7477philip.liard@gmail.com  // Returns a number formatted in such a way that it can be dialed from a
325d72e8b9841fa8e3dc3ed8fc9c5f0c819c94c7477philip.liard@gmail.com  // mobile phone in a specific region. If the number cannot be reached from
326d72e8b9841fa8e3dc3ed8fc9c5f0c819c94c7477philip.liard@gmail.com  // the region (e.g. some countries block toll-free numbers from being called
327d72e8b9841fa8e3dc3ed8fc9c5f0c819c94c7477philip.liard@gmail.com  // outside of the country), the method returns an empty string.
328d72e8b9841fa8e3dc3ed8fc9c5f0c819c94c7477philip.liard@gmail.com  void FormatNumberForMobileDialing(
329d72e8b9841fa8e3dc3ed8fc9c5f0c819c94c7477philip.liard@gmail.com      const PhoneNumber& number,
330d72e8b9841fa8e3dc3ed8fc9c5f0c819c94c7477philip.liard@gmail.com      const string& region_calling_from,
331d72e8b9841fa8e3dc3ed8fc9c5f0c819c94c7477philip.liard@gmail.com      bool with_formatting,
332d72e8b9841fa8e3dc3ed8fc9c5f0c819c94c7477philip.liard@gmail.com      string* formatted_number) const;
333d72e8b9841fa8e3dc3ed8fc9c5f0c819c94c7477philip.liard@gmail.com
3341ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Formats a phone number for out-of-country dialing purposes.
3351ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //
3361ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Note this function takes care of the case for calling inside of NANPA
3371ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // and between Russia and Kazakhstan (who share the same country calling
3381ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // code). In those cases, no international prefix is used. For regions which
3391ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // have multiple international prefixes, the number in its INTERNATIONAL
3401ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // format will be returned instead.
3411ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  void FormatOutOfCountryCallingNumber(
3421ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      const PhoneNumber& number,
3431ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      const string& calling_from,
3441ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      string* formatted_number) const;
3451ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
3461ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Formats a phone number using the original phone number format that the
3471ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // number is parsed from. The original format is embedded in the
3481ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // country_code_source field of the PhoneNumber object passed in. If such
3491ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // information is missing, the number will be formatted into the NATIONAL
35044e3b3fba577d10069f99b1417a796599248d47ephilip.liard@gmail.com  // format by default. When the number is an invalid number, the method returns
35144e3b3fba577d10069f99b1417a796599248d47ephilip.liard@gmail.com  // the raw input when it is available.
3521ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  void FormatInOriginalFormat(const PhoneNumber& number,
3531ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                              const string& region_calling_from,
3541ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                              string* formatted_number) const;
3551ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
3561ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Formats a phone number for out-of-country dialing purposes.
3571ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //
3581ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Note that in this version, if the number was entered originally using alpha
3591ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // characters and this version of the number is stored in raw_input, this
3601ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // representation of the number will be used rather than the digit
3611ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // representation. Grouping information, as specified by characters such as
3621ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // "-" and " ", will be retained.
3631ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //
3641ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Caveats:
3651ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // 1) This will not produce good results if the country calling code is both
3661ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // present in the raw input _and_ is the start of the national number. This
3671ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // is not a problem in the regions which typically use alpha numbers.
3681ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // 2) This will also not produce good results if the raw input has any
3691ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // grouping information within the first three digits of the national number,
3701ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // and if the function needs to strip preceding digits/words in the raw input
3711ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // before these digits. Normally people group the first three digits together
3721ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // so this is not a huge problem - and will be fixed if it proves to be so.
3731ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  void FormatOutOfCountryKeepingAlphaChars(
3741ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      const PhoneNumber& number,
3751ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      const string& calling_from,
3761ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      string* formatted_number) const;
3771ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
3781ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Attempts to extract a valid number from a phone number that is too long to
3791ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // be valid, and resets the PhoneNumber object passed in to that valid
3801ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // version. If no valid number could be extracted, the PhoneNumber object
3811ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // passed in will not be modified. It returns true if a valid phone number can
3821ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // be successfully extracted.
3831ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  bool TruncateTooLongNumber(PhoneNumber* number) const;
3841ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
3851ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Gets the type of a phone number.
3861ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  PhoneNumberType GetNumberType(const PhoneNumber& number) const;
3871ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
3881ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Tests whether a phone number matches a valid pattern. Note this doesn't
3891ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // verify the number is actually in use, which is impossible to tell by just
3901ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // looking at a number itself.
3911ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  bool IsValidNumber(const PhoneNumber& number) const;
3921ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
3931ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Tests whether a phone number is valid for a certain region. Note this
3941ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // doesn't verify the number is actually in use, which is impossible to tell
3951ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // by just looking at a number itself. If the country calling code is not the
3961ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // same as the country calling code for the region, this immediately exits
3971ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // with false.  After this, the specific number pattern rules for the region
3981ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // are examined.
3991ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // This is useful for determining for example whether a particular number is
4001ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // valid for Canada, rather than just a valid NANPA number.
40193d3e8b6d7867ccac0dd4e6beeadfbc1b76dd116dbeaumont@google.com  // Warning: In most cases, you want to use IsValidNumber instead. For
40293d3e8b6d7867ccac0dd4e6beeadfbc1b76dd116dbeaumont@google.com  // example, this method will mark numbers from British Crown dependencies
40393d3e8b6d7867ccac0dd4e6beeadfbc1b76dd116dbeaumont@google.com  // such as the Isle of Man as invalid for the region "GB" (United Kingdom),
40493d3e8b6d7867ccac0dd4e6beeadfbc1b76dd116dbeaumont@google.com  // since it has its own region code, "IM", which may be undesirable.
4051ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  bool IsValidNumberForRegion(
4061ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      const PhoneNumber& number,
4071ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      const string& region_code) const;
4081ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
4091ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Returns the region where a phone number is from. This could be used for
4101ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // geo-coding at the region level.
4111ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  void GetRegionCodeForNumber(const PhoneNumber& number,
4121ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                              string* region_code) const;
4131ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
4141ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Returns the country calling code for a specific region. For example,
4151ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // this would be 1 for the United States, and 64 for New Zealand.
4161ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  int GetCountryCodeForRegion(const string& region_code) const;
4171ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
4181ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Returns the region code that matches the specific country code. Note that
4194784d0d0f3a84cdac8d7a6b99b72fbb6b1a98ca5philip.liard@gmail.com  // it is possible that several regions share the same country calling code
4204784d0d0f3a84cdac8d7a6b99b72fbb6b1a98ca5philip.liard@gmail.com  // (e.g. US and Canada), and in that case, only one of the regions (normally
4214784d0d0f3a84cdac8d7a6b99b72fbb6b1a98ca5philip.liard@gmail.com  // the one with the largest population) is returned.
4221ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  void GetRegionCodeForCountryCode(int country_code, string* region_code) const;
4231ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
4241ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Checks if this is a region under the North American Numbering Plan
4251ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Administration (NANPA).
4261ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  bool IsNANPACountry(const string& region_code) const;
4271ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
42870942011411fc60b15cddf0a3032b1614777dbc4philip.liard@gmail.com  // Returns the national dialling prefix for a specific region. For example,
42970942011411fc60b15cddf0a3032b1614777dbc4philip.liard@gmail.com  // this would be 1 for the United States, and 0 for New Zealand. Set
43070942011411fc60b15cddf0a3032b1614777dbc4philip.liard@gmail.com  // strip_non_digits to true to strip symbols like "~" (which indicates a wait
43170942011411fc60b15cddf0a3032b1614777dbc4philip.liard@gmail.com  // for a dialling tone) from the prefix returned. If no national prefix is
43270942011411fc60b15cddf0a3032b1614777dbc4philip.liard@gmail.com  // present, we return an empty string.
43370942011411fc60b15cddf0a3032b1614777dbc4philip.liard@gmail.com  void GetNddPrefixForRegion(const string& region_code,
43470942011411fc60b15cddf0a3032b1614777dbc4philip.liard@gmail.com                             bool strip_non_digits,
43570942011411fc60b15cddf0a3032b1614777dbc4philip.liard@gmail.com                             string* national_prefix) const;
43670942011411fc60b15cddf0a3032b1614777dbc4philip.liard@gmail.com
4371ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Checks whether a phone number is a possible number. It provides a more
4381ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // lenient check than IsValidNumber() in the following sense:
4391ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //   1. It only checks the length of phone numbers. In particular, it doesn't
4401ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //      check starting digits of the number.
4411ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //   2. It doesn't attempt to figure out the type of the number, but uses
4421ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //      general rules which applies to all types of phone numbers in a
4431ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //      region. Therefore, it is much faster than IsValidNumber().
4441ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //   3. For fixed line numbers, many regions have the concept of area code,
4451ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //      which together with subscriber number constitute the national
4461ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //      significant number. It is sometimes okay to dial the subscriber
4471ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //      number only when dialing in the same area. This function will return
4481ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //      true if the subscriber-number-only version is passed in. On the other
4491ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //      hand, because IsValidNumber() validates using information on both
4501ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //      starting digits (for fixed line numbers, that would most likely be
4511ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //      area codes) and length (obviously includes the length of area codes
4521ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //      for fixed line numbers), it will return false for the
4531ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //      subscriber-number-only version.
4541ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  ValidationResult IsPossibleNumberWithReason(const PhoneNumber& number) const;
4551ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
4561ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Convenience wrapper around IsPossibleNumberWithReason. Instead of returning
4571ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // the reason for failure, this method returns a boolean value.
4581ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  bool IsPossibleNumber(const PhoneNumber& number) const;
4591ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
4601ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Checks whether a phone number is a possible number given a number in the
4611ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // form of a string, and the country where the number could be dialed from.
4621ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // It provides a more lenient check than IsValidNumber(). See
4631ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // IsPossibleNumber(const PhoneNumber& number) for details.
4641ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //
4651ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // This method first parses the number, then invokes
4661ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // IsPossibleNumber(const PhoneNumber& number) with the resultant PhoneNumber
4671ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // object.
4681ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //
4691ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // region_dialing_from represents the region that we are expecting the number
4701ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // to be dialed from. Note this is different from the region where the number
4711ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // belongs. For example, the number +1 650 253 0000 is a number that belongs
4721ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // to US. When written in this form, it could be dialed from any region. When
4731ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // it is written as 00 1 650 253 0000, it could be dialed from any region
4741ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // which uses an international dialling prefix of 00. When it is written as
4751ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // 650 253 0000, it could only be dialed from within the US, and when written
4761ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // as 253 0000, it could only be dialed from within a smaller area in the US
4771ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // (Mountain View, CA, to be more specific).
4781ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  bool IsPossibleNumberForString(
4791ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      const string& number,
4801ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      const string& region_dialing_from) const;
4811ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
4821ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Gets a valid fixed-line number for the specified region. Returns false if
48380b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com  // the region was unknown, or the region 001 is passed in. For 001
48480b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com  // (representing non-geographical numbers), call
48580b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com  // GetExampleNumberForNonGeoEntity instead.
4861ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  bool GetExampleNumber(const string& region_code,
4871ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                        PhoneNumber* number) const;
4881ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
4891ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Gets a valid number of the specified type for the specified region.
49080b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com  // Returns false if the region was unknown or 001, or if no example number of
49180b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com  // that type could be found. For 001 (representing non-geographical numbers),
49280b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com  // call GetExampleNumberForNonGeoEntity instead.
4931ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  bool GetExampleNumberForType(const string& region_code,
4941ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                               PhoneNumberType type,
4951ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                               PhoneNumber* number) const;
4961ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
49780b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com  // Gets a valid number for the specified country calling code for a
49880b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com  // non-geographical entity. Returns false if the metadata does not contain
49980b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com  // such information, or the country calling code passed in does not belong to
50080b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com  // a non-geographical entity.
50180b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com  bool GetExampleNumberForNonGeoEntity(
50280b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com      int country_calling_code, PhoneNumber* number) const;
50380b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com
5041ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Parses a string and returns it in proto buffer format. This method will
5051ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // return an error like INVALID_COUNTRY_CODE if the number is not considered
5061ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // to be a possible number, and NO_PARSING_ERROR if it parsed correctly. Note
5071ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // that validation of whether the number is actually a valid number for a
5081ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // particular region is not performed. This can be done separately with
5091ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // IsValidNumber().
5101ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //
5116276be9eef61580a3d1d0b1bf5de919ba4693737davinci@google.com  // number_to_parse can also be provided in RFC3966 format.
5126276be9eef61580a3d1d0b1bf5de919ba4693737davinci@google.com  //
5131ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // default_region represents the country that we are expecting the number to
5141ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // be from. This is only used if the number being parsed is not written in
5151ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // international format. The country_code for the number in this case would be
5161ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // stored as that of the default country supplied. If the number is guaranteed
5171ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // to start with a '+' followed by the country calling code, then
5181ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // "ZZ" can be supplied.
5191ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  ErrorType Parse(const string& number_to_parse,
5201ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                  const string& default_region,
5211ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                  PhoneNumber* number) const;
5221ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Parses a string and returns it in proto buffer format. This method differs
5231ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // from Parse() in that it always populates the raw_input field of the
5241ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // protocol buffer with number_to_parse as well as the country_code_source
5251ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // field.
5261ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  ErrorType ParseAndKeepRawInput(const string& number_to_parse,
5271ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                                 const string& default_region,
5281ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                                 PhoneNumber* number) const;
5291ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
5301ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Takes two phone numbers and compares them for equality.
5311ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  //
5321ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Returns EXACT_MATCH if the country calling code, NSN, presence of a leading
5331ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // zero for Italian numbers and any extension present are the same.
5341ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Returns NSN_MATCH if either or both has no country calling code specified,
5351ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // and the NSNs and extensions are the same.
5361ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Returns SHORT_NSN_MATCH if either or both has no country calling code
5371ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // specified, or the country calling code specified is the same, and one NSN
5381ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // could be a shorter version of the other number. This includes the case
5391ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // where one has an extension specified, and the other does not.
5401ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Returns NO_MATCH otherwise.
5411ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // For example, the numbers +1 345 657 1234 and 657 1234 are a
5421ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // SHORT_NSN_MATCH. The numbers +1 345 657 1234 and 345 657 are a NO_MATCH.
5431ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  MatchType IsNumberMatch(const PhoneNumber& first_number,
5441ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                          const PhoneNumber& second_number) const;
5451ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
5461ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Takes two phone numbers as strings and compares them for equality. This
5471ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // is a convenience wrapper for IsNumberMatch(PhoneNumber firstNumber,
5481ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // PhoneNumber secondNumber). No default region is known.
5491ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Returns INVALID_NUMBER if either number cannot be parsed into a phone
5501ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // number.
5511ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  MatchType IsNumberMatchWithTwoStrings(const string& first_number,
5521ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                                        const string& second_number) const;
5531ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
5541ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Takes two phone numbers and compares them for equality. This is a
5551ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // convenience wrapper for IsNumberMatch(PhoneNumber firstNumber,
5561ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // PhoneNumber secondNumber). No default region is known.
5571ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Returns INVALID_NUMBER if second_number cannot be parsed into a phone
5581ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // number.
5591ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  MatchType IsNumberMatchWithOneString(const PhoneNumber& first_number,
5601ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                                       const string& second_number) const;
5611ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
562fa6ddeed736e42c266027a0d7b696909083d066bphilip.liard@gmail.com  // Overrides the default logging system. This takes ownership of the provided
563fa6ddeed736e42c266027a0d7b696909083d066bphilip.liard@gmail.com  // logger.
564fa6ddeed736e42c266027a0d7b696909083d066bphilip.liard@gmail.com  void SetLogger(Logger* logger);
5651ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
56680d738a894e26aa958eacc62afbc70617b13dc83philip.liard@gmail.com  // Gets an AsYouTypeFormatter for the specific region.
56780d738a894e26aa958eacc62afbc70617b13dc83philip.liard@gmail.com  // Returns an AsYouTypeFormatter object, which could be used to format phone
56880d738a894e26aa958eacc62afbc70617b13dc83philip.liard@gmail.com  // numbers in the specific region "as you type".
56980d738a894e26aa958eacc62afbc70617b13dc83philip.liard@gmail.com  // The deletion of the returned instance is under the responsibility of the
57080d738a894e26aa958eacc62afbc70617b13dc83philip.liard@gmail.com  // caller.
57180d738a894e26aa958eacc62afbc70617b13dc83philip.liard@gmail.com  AsYouTypeFormatter* GetAsYouTypeFormatter(const string& region_code) const;
57280d738a894e26aa958eacc62afbc70617b13dc83philip.liard@gmail.com
5731ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  friend bool ConvertFromTelephoneNumberProto(
5741ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      const TelephoneNumber& proto_to_convert,
5751ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      PhoneNumber* new_proto);
5761ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  friend bool ConvertToTelephoneNumberProto(const PhoneNumber& proto_to_convert,
5771ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                                            TelephoneNumber* resulting_proto);
5781ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
5791ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com protected:
5801ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Check whether the country_calling_code is from a country whose national
5811ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // significant number could contain a leading zero. An example of such a
5821ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // country is Italy.
5831ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  bool IsLeadingZeroPossible(int country_calling_code) const;
5841ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
5851ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com private:
586d7f0c9413b136b6e2304d923a51c61e521c28f53philip.liard@gmail.com  scoped_ptr<Logger> logger_;
587d7f0c9413b136b6e2304d923a51c61e521c28f53philip.liard@gmail.com
5881ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  typedef pair<int, list<string>*> IntRegionsPair;
5891ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
5901ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // The minimum and maximum length of the national significant number.
5916276be9eef61580a3d1d0b1bf5de919ba4693737davinci@google.com  static const size_t kMinLengthForNsn = 2;
59244e3b3fba577d10069f99b1417a796599248d47ephilip.liard@gmail.com  // The ITU says the maximum length should be 15, but we have found longer
59344e3b3fba577d10069f99b1417a796599248d47ephilip.liard@gmail.com  // numbers in Germany.
59444e3b3fba577d10069f99b1417a796599248d47ephilip.liard@gmail.com  static const size_t kMaxLengthForNsn = 16;
5951ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // The maximum length of the country calling code.
5961ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  static const size_t kMaxLengthCountryCode = 3;
5971ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
5981ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  static const char kPlusChars[];
5991ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Regular expression of acceptable punctuation found in phone numbers. This
6001ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // excludes punctuation found as a leading character only. This consists of
6011ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // dash characters, white space characters, full stops, slashes, square
6021ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // brackets, parentheses and tildes. It also includes the letter 'x' as that
6031ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // is found as a placeholder for carrier information in some phone numbers.
6041ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Full-width variants are also present.
6051ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  static const char kValidPunctuation[];
6061ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
6074784d0d0f3a84cdac8d7a6b99b72fbb6b1a98ca5philip.liard@gmail.com  // Regular expression of characters typically used to start a second phone
6084784d0d0f3a84cdac8d7a6b99b72fbb6b1a98ca5philip.liard@gmail.com  // number for the purposes of parsing. This allows us to strip off parts of
6094784d0d0f3a84cdac8d7a6b99b72fbb6b1a98ca5philip.liard@gmail.com  // the number that are actually the start of another number, such as for:
6104784d0d0f3a84cdac8d7a6b99b72fbb6b1a98ca5philip.liard@gmail.com  // (530) 583-6985 x302/x2303 -> the second extension here makes this actually
6114784d0d0f3a84cdac8d7a6b99b72fbb6b1a98ca5philip.liard@gmail.com  // two phone numbers, (530) 583-6985 x302 and (530) 583-6985 x2303. We remove
6124784d0d0f3a84cdac8d7a6b99b72fbb6b1a98ca5philip.liard@gmail.com  // the second extension so that the first number is parsed correctly. The
6134784d0d0f3a84cdac8d7a6b99b72fbb6b1a98ca5philip.liard@gmail.com  // string preceding this is captured.
6144784d0d0f3a84cdac8d7a6b99b72fbb6b1a98ca5philip.liard@gmail.com  // This corresponds to SECOND_NUMBER_START in the java version.
6154784d0d0f3a84cdac8d7a6b99b72fbb6b1a98ca5philip.liard@gmail.com  static const char kCaptureUpToSecondNumberStart[];
6164784d0d0f3a84cdac8d7a6b99b72fbb6b1a98ca5philip.liard@gmail.com
617d7f0c9413b136b6e2304d923a51c61e521c28f53philip.liard@gmail.com  // Helper class holding useful regular expressions and character mappings.
618d7f0c9413b136b6e2304d923a51c61e521c28f53philip.liard@gmail.com  scoped_ptr<PhoneNumberRegExpsAndMappings> reg_exps_;
619d7f0c9413b136b6e2304d923a51c61e521c28f53philip.liard@gmail.com
6204784d0d0f3a84cdac8d7a6b99b72fbb6b1a98ca5philip.liard@gmail.com  // A mapping from a country calling code to a RegionCode object which denotes
6214784d0d0f3a84cdac8d7a6b99b72fbb6b1a98ca5philip.liard@gmail.com  // the region represented by that country calling code. Note regions under
6221ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // NANPA share the country calling code 1 and Russia and Kazakhstan share the
6231ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // country calling code 7. Under this map, 1 is mapped to region code "US" and
6241ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // 7 is mapped to region code "RU". This is implemented as a sorted vector to
6251ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // achieve better performance.
6261ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  scoped_ptr<vector<IntRegionsPair> > country_calling_code_to_region_code_map_;
6271ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
6281ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // The set of regions that share country calling code 1.
6291ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  scoped_ptr<set<string> > nanpa_regions_;
6301ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  static const int kNanpaCountryCode = 1;
6311ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
6321ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // A mapping from a region code to a PhoneMetadata for that region.
6331ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  scoped_ptr<map<string, PhoneMetadata> > region_to_metadata_map_;
6341ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
63580b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com  // A mapping from a country calling code for a non-geographical entity to the
63680b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com  // PhoneMetadata for that country calling code. Examples of the country
63780b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com  // calling codes include 800 (International Toll Free Service) and 808
63880b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com  // (International Shared Cost Service).
63980b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com  scoped_ptr<map<int, PhoneMetadata> >
64080b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com      country_code_to_non_geographical_metadata_map_;
64180b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com
6421ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  PhoneNumberUtil();
6431ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
6441ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Returns a regular expression for the possible extensions that may be found
6454784d0d0f3a84cdac8d7a6b99b72fbb6b1a98ca5philip.liard@gmail.com  // in a number, for use when matching.
6464784d0d0f3a84cdac8d7a6b99b72fbb6b1a98ca5philip.liard@gmail.com  const string& GetExtnPatternsForMatching() const;
6471ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
6486276be9eef61580a3d1d0b1bf5de919ba4693737davinci@google.com  // Checks if a number matches the plus chars pattern.
6496276be9eef61580a3d1d0b1bf5de919ba4693737davinci@google.com  bool StartsWithPlusCharsPattern(const string& number) const;
6506276be9eef61580a3d1d0b1bf5de919ba4693737davinci@google.com
65180d738a894e26aa958eacc62afbc70617b13dc83philip.liard@gmail.com  // Checks whether a string contains only valid digits.
65280d738a894e26aa958eacc62afbc70617b13dc83philip.liard@gmail.com  bool ContainsOnlyValidDigits(const string& s) const;
65380d738a894e26aa958eacc62afbc70617b13dc83philip.liard@gmail.com
65435bd393fb78215a9c6dbeb158913def01eb58985lararennie@google.com  // Checks if a format is eligible to be used by the AsYouTypeFormatter. This
65535bd393fb78215a9c6dbeb158913def01eb58985lararennie@google.com  // method is here rather than in asyoutypeformatter.h since it depends on the
65635bd393fb78215a9c6dbeb158913def01eb58985lararennie@google.com  // valid punctuation declared by the phone number util.
65780d738a894e26aa958eacc62afbc70617b13dc83philip.liard@gmail.com  bool IsFormatEligibleForAsYouTypeFormatter(const string& format) const;
65880d738a894e26aa958eacc62afbc70617b13dc83philip.liard@gmail.com
65935bd393fb78215a9c6dbeb158913def01eb58985lararennie@google.com  // Helper function to check if the national prefix formatting rule has the
66035bd393fb78215a9c6dbeb158913def01eb58985lararennie@google.com  // first group only, i.e., does not start with the national prefix.
66135bd393fb78215a9c6dbeb158913def01eb58985lararennie@google.com  bool FormattingRuleHasFirstGroupOnly(
66235bd393fb78215a9c6dbeb158913def01eb58985lararennie@google.com      const string& national_prefix_formatting_rule) const;
66335bd393fb78215a9c6dbeb158913def01eb58985lararennie@google.com
6641ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Trims unwanted end characters from a phone number string.
6651ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  void TrimUnwantedEndChars(string* number) const;
6661ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
66793d3e8b6d7867ccac0dd4e6beeadfbc1b76dd116dbeaumont@google.com  // Tests whether a phone number has a geographical association. It checks if
66893d3e8b6d7867ccac0dd4e6beeadfbc1b76dd116dbeaumont@google.com  // the number is associated to a certain region in the country where it
66993d3e8b6d7867ccac0dd4e6beeadfbc1b76dd116dbeaumont@google.com  // belongs to. Note that this doesn't verify if the number is actually in use.
67093d3e8b6d7867ccac0dd4e6beeadfbc1b76dd116dbeaumont@google.com  bool IsNumberGeographical(const PhoneNumber& phone_number) const;
67193d3e8b6d7867ccac0dd4e6beeadfbc1b76dd116dbeaumont@google.com
6721ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Helper function to check region code is not unknown or null.
6731ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  bool IsValidRegionCode(const string& region_code) const;
6741ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
67580b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com  // Helper function to check the country calling code is valid.
67680b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com  bool HasValidCountryCallingCode(int country_calling_code) const;
6771ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
6781ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  const i18n::phonenumbers::PhoneMetadata* GetMetadataForRegion(
6791ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      const string& region_code) const;
6801ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
68180b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com  const i18n::phonenumbers::PhoneMetadata* GetMetadataForNonGeographicalRegion(
68280b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com      int country_calling_code) const;
68380b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com
68480b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com  const i18n::phonenumbers::PhoneMetadata* GetMetadataForRegionOrCallingCode(
68580b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com      int country_calling_code,
68680b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com      const string& region_code) const;
68780b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com
688cbc255f39ceade5fc9d653e320c511a5f9c51e77philip.liard@gmail.com  // As per GetCountryCodeForRegion, but assumes the validity of the region_code
689cbc255f39ceade5fc9d653e320c511a5f9c51e77philip.liard@gmail.com  // has already been checked.
690cbc255f39ceade5fc9d653e320c511a5f9c51e77philip.liard@gmail.com  int GetCountryCodeForValidRegion(const string& region_code) const;
691cbc255f39ceade5fc9d653e320c511a5f9c51e77philip.liard@gmail.com
6921fb4d23b94da7f0343ce7d177bee350db73e61b5philip.liard@gmail.com  const NumberFormat* ChooseFormattingPatternForNumber(
6931fb4d23b94da7f0343ce7d177bee350db73e61b5philip.liard@gmail.com      const RepeatedPtrField<NumberFormat>& available_formats,
6941fb4d23b94da7f0343ce7d177bee350db73e61b5philip.liard@gmail.com      const string& national_number) const;
6951fb4d23b94da7f0343ce7d177bee350db73e61b5philip.liard@gmail.com
696cbc255f39ceade5fc9d653e320c511a5f9c51e77philip.liard@gmail.com  void FormatNsnUsingPatternWithCarrier(
6971fb4d23b94da7f0343ce7d177bee350db73e61b5philip.liard@gmail.com      const string& national_number,
698cbc255f39ceade5fc9d653e320c511a5f9c51e77philip.liard@gmail.com      const NumberFormat& formatting_pattern,
699cbc255f39ceade5fc9d653e320c511a5f9c51e77philip.liard@gmail.com      PhoneNumberUtil::PhoneNumberFormat number_format,
7001fb4d23b94da7f0343ce7d177bee350db73e61b5philip.liard@gmail.com      const string& carrier_code,
7011fb4d23b94da7f0343ce7d177bee350db73e61b5philip.liard@gmail.com      string* formatted_number) const;
7021fb4d23b94da7f0343ce7d177bee350db73e61b5philip.liard@gmail.com
703cbc255f39ceade5fc9d653e320c511a5f9c51e77philip.liard@gmail.com  void FormatNsnUsingPattern(
7041fb4d23b94da7f0343ce7d177bee350db73e61b5philip.liard@gmail.com      const string& national_number,
705cbc255f39ceade5fc9d653e320c511a5f9c51e77philip.liard@gmail.com      const NumberFormat& formatting_pattern,
706cbc255f39ceade5fc9d653e320c511a5f9c51e77philip.liard@gmail.com      PhoneNumberUtil::PhoneNumberFormat number_format,
7071fb4d23b94da7f0343ce7d177bee350db73e61b5philip.liard@gmail.com      string* formatted_number) const;
7081fb4d23b94da7f0343ce7d177bee350db73e61b5philip.liard@gmail.com
70980b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com  // Check if raw_input, which is assumed to be in the national format, has a
71080b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com  // national prefix. The national prefix is assumed to be in digits-only form.
71180b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com  bool RawInputContainsNationalPrefix(
71280b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com      const string& raw_input,
71380b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com      const string& national_prefix,
71480b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com      const string& region_code) const;
71580b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com
71680b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com  // Returns true if a number is from a region whose national significant number
71780b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com  // couldn't contain a leading zero, but has the italian_leading_zero field set
71880b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com  // to true.
71980b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com  bool HasUnexpectedItalianLeadingZero(const PhoneNumber& number) const;
72080b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com
72186929beca4cb5d81cbad75353b1bb13c6cd6a4bdphilip.liard@gmail.com  bool HasFormattingPatternForNumber(const PhoneNumber& number) const;
72286929beca4cb5d81cbad75353b1bb13c6cd6a4bdphilip.liard@gmail.com
723cbc255f39ceade5fc9d653e320c511a5f9c51e77philip.liard@gmail.com  // Simple wrapper of FormatNsnWithCarrier for the common case of
7241ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // no carrier code.
725cbc255f39ceade5fc9d653e320c511a5f9c51e77philip.liard@gmail.com  void FormatNsn(const string& number,
726cbc255f39ceade5fc9d653e320c511a5f9c51e77philip.liard@gmail.com                 const PhoneMetadata& metadata,
727cbc255f39ceade5fc9d653e320c511a5f9c51e77philip.liard@gmail.com                 PhoneNumberFormat number_format,
728cbc255f39ceade5fc9d653e320c511a5f9c51e77philip.liard@gmail.com                 string* formatted_number) const;
729cbc255f39ceade5fc9d653e320c511a5f9c51e77philip.liard@gmail.com
730cbc255f39ceade5fc9d653e320c511a5f9c51e77philip.liard@gmail.com  void FormatNsnWithCarrier(const string& number,
73180b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com                            const PhoneMetadata& metadata,
7321ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                            PhoneNumberFormat number_format,
733cbc255f39ceade5fc9d653e320c511a5f9c51e77philip.liard@gmail.com                            const string& carrier_code,
7341ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                            string* formatted_number) const;
7351ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
736cbc255f39ceade5fc9d653e320c511a5f9c51e77philip.liard@gmail.com  void MaybeAppendFormattedExtension(
7371ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      const PhoneNumber& number,
73880b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com      const PhoneMetadata& metadata,
7391ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      PhoneNumberFormat number_format,
7401ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      string* extension) const;
7411ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
7421ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  void GetRegionCodeForNumberFromRegionList(
7431ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      const PhoneNumber& number,
7441ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      const list<string>& region_codes,
7451ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      string* region_code) const;
7461ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
747384682a45e06c1a6c4956fcf23669ddf23ef336ephilip.liard@gmail.com  // Strips the IDD from the start of the number if present. Helper function
748384682a45e06c1a6c4956fcf23669ddf23ef336ephilip.liard@gmail.com  // used by MaybeStripInternationalPrefixAndNormalize.
749384682a45e06c1a6c4956fcf23669ddf23ef336ephilip.liard@gmail.com  bool ParsePrefixAsIdd(const RegExp& idd_pattern, string* number) const;
750384682a45e06c1a6c4956fcf23669ddf23ef336ephilip.liard@gmail.com
7511ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  void Normalize(string* number) const;
7527e77f5f74f097c32c256e8e1270ecbc306fc6567lararennie@google.com
7531ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  PhoneNumber::CountryCodeSource MaybeStripInternationalPrefixAndNormalize(
7541ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      const string& possible_idd_prefix,
7551ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      string* number) const;
7561ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
7571fb4d23b94da7f0343ce7d177bee350db73e61b5philip.liard@gmail.com  bool MaybeStripNationalPrefixAndCarrierCode(
7581ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      const PhoneMetadata& metadata,
7591ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      string* number,
7601ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      string* carrier_code) const;
7611ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
7621ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  void ExtractPossibleNumber(const string& number,
7631ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                             string* extracted_number) const;
7641ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
7651ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  bool IsViablePhoneNumber(const string& number) const;
7661ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
7671ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  bool MaybeStripExtension(string* number, string* extension) const;
7681ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
7691ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  int ExtractCountryCode(string* national_number) const;
7701ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  ErrorType MaybeExtractCountryCode(
7711ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      const PhoneMetadata* default_region_metadata,
7721ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      bool keepRawInput,
7731ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      string* national_number,
7741ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      PhoneNumber* phone_number) const;
7751ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
7761ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  bool CheckRegionForParsing(
7771ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      const string& number_to_parse,
7781ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      const string& default_region) const;
7791ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
7801ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  ErrorType ParseHelper(const string& number_to_parse,
7811ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                        const string& default_region,
7821ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                        bool keep_raw_input,
7831ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                        bool check_region,
7841ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                        PhoneNumber* phone_number) const;
7851ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
7866276be9eef61580a3d1d0b1bf5de919ba4693737davinci@google.com  void BuildNationalNumberForParsing(const string& number_to_parse,
7876276be9eef61580a3d1d0b1bf5de919ba4693737davinci@google.com                                     string* national_number) const;
7886276be9eef61580a3d1d0b1bf5de919ba4693737davinci@google.com
78980b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com  // Returns true if the number can be dialled from outside the region, or
79080b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com  // unknown. If the number can only be dialled from within the region, returns
79180b803ff192366d6bae636f40502131dace9abb5philip.liard@gmail.com  // false. Does not check the number is a valid number.
792d72e8b9841fa8e3dc3ed8fc9c5f0c819c94c7477philip.liard@gmail.com  bool CanBeInternationallyDialled(const PhoneNumber& number) const;
793d72e8b9841fa8e3dc3ed8fc9c5f0c819c94c7477philip.liard@gmail.com
7941ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  DISALLOW_COPY_AND_ASSIGN(PhoneNumberUtil);
7951ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com};
7961ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
7971ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com}  // namespace phonenumbers
7981ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com}  // namespace i18n
7991ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
8001ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#endif  // I18N_PHONENUMBERS_PHONENUMBERUTIL_H_
801