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