1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
// Copyright 2013 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.
#include "components/autofill/content/browser/wallet/instrument.h"
#include "base/logging.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
#include "components/autofill/content/browser/wallet/wallet_address.h"
#include "components/autofill/core/browser/autofill_country.h"
#include "components/autofill/core/browser/autofill_profile.h"
#include "components/autofill/core/browser/credit_card.h"
#include "components/autofill/core/browser/validation.h"
namespace autofill {
namespace wallet {
namespace {
// Converts a known Autofill card type to a Instrument::FormOfPayment.
// Used for creating new Instruments.
Instrument::FormOfPayment FormOfPaymentFromCardType(const std::string& type) {
if (type == kAmericanExpressCard)
return Instrument::AMEX;
else if (type == kDiscoverCard)
return Instrument::DISCOVER;
else if (type == kMasterCard)
return Instrument::MASTER_CARD;
else if (type == kVisaCard)
return Instrument::VISA;
return Instrument::UNKNOWN;
}
std::string FormOfPaymentToString(Instrument::FormOfPayment form_of_payment) {
switch (form_of_payment) {
case Instrument::UNKNOWN:
return "UNKNOWN";
case Instrument::VISA:
return "VISA";
case Instrument::MASTER_CARD:
return "MASTER_CARD";
case Instrument::AMEX:
return "AMEX";
case Instrument::DISCOVER:
return "DISCOVER";
case Instrument::JCB:
return "JCB";
}
NOTREACHED();
return "NOT_POSSIBLE";
}
} // namespace
Instrument::Instrument(const CreditCard& card,
const base::string16& card_verification_number,
const AutofillProfile& profile)
: primary_account_number_(card.GetRawInfo(CREDIT_CARD_NUMBER)),
card_verification_number_(card_verification_number),
expiration_month_(card.expiration_month()),
expiration_year_(card.expiration_year()),
form_of_payment_(FormOfPaymentFromCardType(card.type())),
address_(new Address(profile)) {
Init();
}
Instrument::Instrument(const base::string16& primary_account_number,
const base::string16& card_verification_number,
int expiration_month,
int expiration_year,
FormOfPayment form_of_payment,
scoped_ptr<Address> address)
: primary_account_number_(primary_account_number),
card_verification_number_(card_verification_number),
expiration_month_(expiration_month),
expiration_year_(expiration_year),
form_of_payment_(form_of_payment),
address_(address.Pass()) {
Init();
}
Instrument::Instrument(const Instrument& instrument)
: primary_account_number_(instrument.primary_account_number()),
card_verification_number_(instrument.card_verification_number()),
expiration_month_(instrument.expiration_month()),
expiration_year_(instrument.expiration_year()),
form_of_payment_(instrument.form_of_payment()),
address_(instrument.address() ?
new Address(*instrument.address()) : NULL) {
Init();
}
Instrument::~Instrument() {}
scoped_ptr<base::DictionaryValue> Instrument::ToDictionary() const {
// |primary_account_number_| and |card_verification_number_| can never be
// sent the server in way that would require putting them into a dictionary.
// Never add them to this function.
scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
dict->SetString("type", "CREDIT_CARD");
dict->SetInteger("credit_card.exp_month", expiration_month_);
dict->SetInteger("credit_card.exp_year", expiration_year_);
dict->SetString("credit_card.fop_type",
FormOfPaymentToString(form_of_payment_));
dict->SetString("credit_card.last_4_digits", last_four_digits_);
dict->Set("credit_card.address",
address_.get()->ToDictionaryWithoutID().release());
return dict.Pass();
}
void Instrument::Init() {
if (primary_account_number_.size() >= 4) {
last_four_digits_ =
primary_account_number_.substr(primary_account_number_.size() - 4);
}
}
} // namespace wallet
} // namespace autofill
|