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