1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_AUTOFILL_CREDIT_CARD_H_
6#define CHROME_BROWSER_AUTOFILL_CREDIT_CARD_H_
7#pragma once
8
9#include <ostream>
10#include <string>
11#include <vector>
12
13#include "base/string16.h"
14#include "chrome/browser/autofill/field_types.h"
15#include "chrome/browser/autofill/form_group.h"
16
17// A form group that stores credit card information.
18class CreditCard : public FormGroup {
19 public:
20  explicit CreditCard(const std::string& guid);
21
22  // For use in STL containers.
23  CreditCard();
24  CreditCard(const CreditCard& credit_card);
25  virtual ~CreditCard();
26
27  // FormGroup implementation:
28  virtual void GetPossibleFieldTypes(const string16& text,
29                                     FieldTypeSet* possible_types) const;
30  virtual void GetAvailableFieldTypes(FieldTypeSet* available_types) const;
31  virtual string16 GetInfo(AutofillFieldType type) const;
32  virtual void SetInfo(AutofillFieldType type, const string16& value);
33  // Credit card preview summary, for example: ******1234, Exp: 01/2020
34  virtual const string16 Label() const;
35
36  // Special method to set value for HTML5 month input type.
37  void SetInfoForMonthInputType(const string16& value);
38
39  // The number altered for display, for example: ******1234
40  string16 ObfuscatedNumber() const;
41  // The last four digits of the credit card number.
42  string16 LastFourDigits() const;
43
44  const std::string& type() const { return type_; }
45
46  // The guid is the primary identifier for |CreditCard| objects.
47  const std::string guid() const { return guid_; }
48  void set_guid(const std::string& guid) { guid_ = guid; }
49
50  // For use in STL containers.
51  void operator=(const CreditCard& credit_card);
52
53  // Comparison for Sync.  Returns 0 if the credit card is the same as |this|,
54  // or < 0, or > 0 if it is different.  The implied ordering can be used for
55  // culling duplicates.  The ordering is based on collation order of the
56  // textual contents of the fields.
57  // GUIDs, labels, and unique IDs are not compared, only the values of the
58  // credit cards themselves.
59  int Compare(const CreditCard& credit_card) const;
60
61  // Used by tests.
62  bool operator==(const CreditCard& credit_card) const;
63  bool operator!=(const CreditCard& credit_card) const;
64
65  // Return a version of |number| that has any separator characters removed.
66  static const string16 StripSeparators(const string16& number);
67
68  // Returns true if |text| looks like a valid credit card number.
69  // Uses the Luhn formula to validate the number.
70  static bool IsValidCreditCardNumber(const string16& text);
71
72  // Returns true if there are no values (field types) set.
73  bool IsEmpty() const;
74
75  // Returns the credit card number.
76  const string16& number() const { return number_; }
77
78 private:
79  // The month and year are zero if not present.
80  int Expiration4DigitYear() const { return expiration_year_; }
81  int Expiration2DigitYear() const { return expiration_year_ % 100; }
82  string16 ExpirationMonthAsString() const;
83  string16 Expiration4DigitYearAsString() const;
84  string16 Expiration2DigitYearAsString() const;
85
86  // Sets |expiration_month_| to the integer conversion of |text|.
87  void SetExpirationMonthFromString(const string16& text);
88
89  // Sets |expiration_year_| to the integer conversion of |text|.
90  void SetExpirationYearFromString(const string16& text);
91
92  // Sets |number_| to the stripped version of |number|, containing only digits.
93  void SetNumber(const string16& number);
94
95  // These setters verify that the month and year are within appropriate
96  // ranges.
97  void SetExpirationMonth(int expiration_month);
98  void SetExpirationYear(int expiration_year);
99
100  // Returns true if |text| matches the name on the card.  The comparison is
101  // case-insensitive.
102  bool IsNameOnCard(const string16& text) const;
103
104  // Returns true if |text| matches the card number.
105  bool IsNumber(const string16& text) const;
106
107  // Returns true if |text| matches the expiration month of the card.
108  bool IsExpirationMonth(const string16& text) const;
109
110  // Returns true if the integer value of |text| matches the 2-digit expiration
111  // year.
112  bool Is2DigitExpirationYear(const string16& text) const;
113
114  // Returns true if the integer value of |text| matches the 4-digit expiration
115  // year.
116  bool Is4DigitExpirationYear(const string16& text) const;
117
118  string16 number_;  // The credit card number.
119  string16 name_on_card_;  // The cardholder's name.
120  std::string type_;  // The type of the card.
121
122  // These members are zero if not present.
123  int expiration_month_;
124  int expiration_year_;
125
126  // The guid of this credit card.
127  std::string guid_;
128};
129
130// So we can compare CreditCards with EXPECT_EQ().
131std::ostream& operator<<(std::ostream& os, const CreditCard& credit_card);
132
133// The string identifiers for credit card icon resources.
134extern const char* const kAmericanExpressCard;
135extern const char* const kDinersCard;
136extern const char* const kDiscoverCard;
137extern const char* const kGenericCard;
138extern const char* const kJCBCard;
139extern const char* const kMasterCard;
140extern const char* const kSoloCard;
141extern const char* const kVisaCard;
142
143#endif  // CHROME_BROWSER_AUTOFILL_CREDIT_CARD_H_
144