summaryrefslogtreecommitdiff
path: root/shortnumberutil.cc
diff options
context:
space:
mode:
Diffstat (limited to 'shortnumberutil.cc')
-rw-r--r--shortnumberutil.cc78
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