diff options
Diffstat (limited to 'shortnumberutil.cc')
-rw-r--r-- | shortnumberutil.cc | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/shortnumberutil.cc b/shortnumberutil.cc new file mode 100644 index 0000000..acd5c82 --- /dev/null +++ b/shortnumberutil.cc @@ -0,0 +1,78 @@ +// Copyright (C) 2012 The Libphonenumber Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Author: David Yonge-Mallo + +#include "phonenumbers/shortnumberutil.h" + +#include "phonenumbers/base/memory/scoped_ptr.h" +#include "phonenumbers/phonemetadata.pb.h" +#include "phonenumbers/phonenumberutil.h" +#include "phonenumbers/regexp_adapter.h" +#include "phonenumbers/regexp_factory.h" + +namespace i18n { +namespace phonenumbers { + +using std::string; + +ShortNumberUtil::ShortNumberUtil() + : phone_util_(*PhoneNumberUtil::GetInstance()) { +} + +bool ShortNumberUtil::ConnectsToEmergencyNumber(const string& number, + const string& region_code) const { + return MatchesEmergencyNumberHelper(number, region_code, + true /* allows prefix match */); +} + +bool ShortNumberUtil::IsEmergencyNumber(const string& number, + const string& region_code) const { + return MatchesEmergencyNumberHelper(number, region_code, + false /* doesn't allow prefix match */); +} + +bool ShortNumberUtil::MatchesEmergencyNumberHelper(const string& number, + const string& region_code, bool allow_prefix_match) const { + string extracted_number; + phone_util_.ExtractPossibleNumber(number, &extracted_number); + if (phone_util_.StartsWithPlusCharsPattern(extracted_number)) { + // Returns false if the number starts with a plus sign. We don't believe + // dialing the country code before emergency numbers (e.g. +1911) works, + // but later, if that proves to work, we can add additional logic here to + // handle it. + return false; + } + const PhoneMetadata* metadata = phone_util_.GetMetadataForRegion(region_code); + if (!metadata || !metadata->has_emergency()) { + return false; + } + const scoped_ptr<const AbstractRegExpFactory> regexp_factory( + new RegExpFactory()); + const scoped_ptr<const RegExp> emergency_number_pattern( + regexp_factory->CreateRegExp( + metadata->emergency().national_number_pattern())); + phone_util_.NormalizeDigitsOnly(&extracted_number); + const scoped_ptr<RegExpInput> normalized_number_input( + regexp_factory->CreateInput(extracted_number)); + + // In Brazil, emergency numbers don't work when additional digits are + // appended. + return (!allow_prefix_match || region_code == "BR") + ? emergency_number_pattern->FullMatch(extracted_number) + : emergency_number_pattern->Consume(normalized_number_input.get()); +} + +} // namespace phonenumbers +} // namespace i18n |