| // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_BROWSER_AUTOFILL_PHONE_FIELD_H_ |
| #define CHROME_BROWSER_AUTOFILL_PHONE_FIELD_H_ |
| #pragma once |
| |
| #include <vector> |
| |
| #include "base/memory/scoped_ptr.h" |
| #include "chrome/browser/autofill/autofill_type.h" |
| #include "chrome/browser/autofill/form_field.h" |
| #include "chrome/browser/autofill/phone_number.h" |
| |
| class AutofillField; |
| |
| // A phone number in one of the following formats: |
| // - area code, prefix, suffix |
| // - area code, number |
| // - number |
| class PhoneField : public FormField { |
| public: |
| virtual ~PhoneField(); |
| |
| static PhoneField* Parse(std::vector<AutofillField*>::const_iterator* iter, |
| bool is_ecml); |
| static PhoneField* ParseECML( |
| std::vector<AutofillField*>::const_iterator* iter); |
| |
| virtual bool GetFieldInfo(FieldTypeMap* field_type_map) const; |
| |
| private: |
| PhoneField(); |
| |
| enum PhoneType { |
| PHONE_TYPE_FIRST = 0, |
| HOME_PHONE = PHONE_TYPE_FIRST, |
| FAX_PHONE, |
| |
| // Must be last. |
| PHONE_TYPE_MAX, |
| }; |
| |
| // Some field names are different for phone and fax. |
| string16 GetCountryRegex() const; |
| // This string includes all area code separators, including NoText. |
| string16 GetAreaRegex() const; |
| // Separator of the area code in the case fields are formatted without |
| // any text indicating what fields are (e.g. field1 "(" field2 ")" field3 "-" |
| // field4 means Country Code, Area Code, Prefix, Suffix) |
| string16 GetAreaNoTextRegex() const; |
| string16 GetPhoneRegex() const; |
| string16 GetPrefixSeparatorRegex() const; |
| string16 GetPrefixRegex() const; |
| string16 GetSuffixSeparatorRegex() const; |
| string16 GetSuffixRegex() const; |
| string16 GetExtensionRegex() const; |
| |
| // This is for easy description of the possible parsing paths of the phone |
| // fields. |
| enum RegexType { |
| REGEX_COUNTRY, |
| REGEX_AREA, |
| REGEX_AREA_NOTEXT, |
| REGEX_PHONE, |
| REGEX_PREFIX_SEPARATOR, |
| REGEX_PREFIX, |
| REGEX_SUFFIX_SEPARATOR, |
| REGEX_SUFFIX, |
| REGEX_EXTENSION, |
| |
| // Separates regexps in grammar. |
| REGEX_SEPARATOR, |
| }; |
| |
| string16 GetRegExp(RegexType regex_id) const; |
| |
| // |field| - field to fill up on successful parsing. |
| // |iter| - in/out. Form field iterator, points to the first field that is |
| // attempted to be parsed. If parsing successful, points to the first field |
| // after parsed fields. |
| // |regular_phone| - true if the parsed phone is a HOME phone, false |
| // otherwise. |
| static bool ParseInternal(PhoneField* field, |
| std::vector<AutofillField*>::const_iterator* iter, |
| bool regular_phone); |
| |
| void SetPhoneType(PhoneType phone_type); |
| |
| // Field types are different as well, so we create a temporary phone number, |
| // to get relevant field types. |
| scoped_ptr<PhoneNumber> number_; |
| PhoneType phone_type_; |
| |
| |
| // Parsed fields. |
| enum PhonePart { |
| FIELD_NONE = -1, |
| FIELD_COUNTRY_CODE, |
| FIELD_AREA_CODE, |
| FIELD_PHONE, |
| FIELD_SUFFIX, |
| FIELD_EXTENSION, |
| |
| FIELD_MAX, |
| }; |
| |
| // FIELD_PHONE is always present; holds suffix if prefix is present. |
| // The rest could be NULL. |
| AutofillField* parsed_phone_fields_[FIELD_MAX]; |
| |
| static struct Parser { |
| RegexType regex; // Field matching reg-ex. |
| PhonePart phone_part; // Index of the field. |
| int max_size; // Max size of the field to match. 0 means any. |
| } phone_field_grammars_[]; |
| |
| DISALLOW_COPY_AND_ASSIGN(PhoneField); |
| }; |
| |
| #endif // CHROME_BROWSER_AUTOFILL_PHONE_FIELD_H_ |