1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/wallet/instrument.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h" 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/wallet/wallet_address.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_country.h" 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_profile.h" 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/credit_card.h" 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/validation.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace autofill { 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace wallet { 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Converts a known Autofill card type to a Instrument::FormOfPayment. 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Used for creating new Instruments. 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Instrument::FormOfPayment FormOfPaymentFromCardType(const std::string& type) { 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type == kAmericanExpressCard) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return Instrument::AMEX; 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (type == kDiscoverCard) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return Instrument::DISCOVER; 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (type == kMasterCard) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return Instrument::MASTER_CARD; 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (type == kVisaCard) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return Instrument::VISA; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return Instrument::UNKNOWN; 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string FormOfPaymentToString(Instrument::FormOfPayment form_of_payment) { 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (form_of_payment) { 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case Instrument::UNKNOWN: 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return "UNKNOWN"; 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case Instrument::VISA: 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return "VISA"; 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case Instrument::MASTER_CARD: 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return "MASTER_CARD"; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case Instrument::AMEX: 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return "AMEX"; 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case Instrument::DISCOVER: 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return "DISCOVER"; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case Instrument::JCB: 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return "JCB"; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return "NOT_POSSIBLE"; 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Instrument::Instrument(const CreditCard& card, 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& card_verification_number, 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const AutofillProfile& profile) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : primary_account_number_(card.GetRawInfo(CREDIT_CARD_NUMBER)), 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) card_verification_number_(card_verification_number), 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expiration_month_(card.expiration_month()), 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expiration_year_(card.expiration_year()), 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) form_of_payment_(FormOfPaymentFromCardType(card.type())), 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) address_(new Address(profile)) { 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Init(); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)Instrument::Instrument(const base::string16& primary_account_number, 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& card_verification_number, 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int expiration_month, 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int expiration_year, 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FormOfPayment form_of_payment, 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<Address> address) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : primary_account_number_(primary_account_number), 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) card_verification_number_(card_verification_number), 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expiration_month_(expiration_month), 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expiration_year_(expiration_year), 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) form_of_payment_(form_of_payment), 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) address_(address.Pass()) { 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Init(); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Instrument::Instrument(const Instrument& instrument) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : primary_account_number_(instrument.primary_account_number()), 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) card_verification_number_(instrument.card_verification_number()), 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expiration_month_(instrument.expiration_month()), 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expiration_year_(instrument.expiration_year()), 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) form_of_payment_(instrument.form_of_payment()), 92ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch address_(instrument.address() ? 93ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch new Address(*instrument.address()) : NULL) { 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Init(); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Instrument::~Instrument() {} 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<base::DictionaryValue> Instrument::ToDictionary() const { 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |primary_account_number_| and |card_verification_number_| can never be 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // sent the server in way that would require putting them into a dictionary. 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Never add them to this function. 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString("type", "CREDIT_CARD"); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetInteger("credit_card.exp_month", expiration_month_); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetInteger("credit_card.exp_year", expiration_year_); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString("credit_card.fop_type", 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FormOfPaymentToString(form_of_payment_)); 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString("credit_card.last_4_digits", last_four_digits_); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->Set("credit_card.address", 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) address_.get()->ToDictionaryWithoutID().release()); 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return dict.Pass(); 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Instrument::Init() { 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (primary_account_number_.size() >= 4) { 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_four_digits_ = 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) primary_account_number_.substr(primary_account_number_.size() - 4); 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace wallet 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace autofill 126