1// Copyright 2014 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#include "components/autofill/core/browser/address_i18n.h" 6 7#include "base/bind.h" 8#include "base/callback.h" 9#include "base/logging.h" 10#include "base/strings/string_split.h" 11#include "base/strings/utf_string_conversions.h" 12#include "components/autofill/core/browser/autofill_profile.h" 13#include "components/autofill/core/browser/autofill_type.h" 14#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_data.h" 15 16namespace autofill { 17namespace i18n { 18 19namespace { 20 21base::string16 GetInfoHelper(const AutofillProfile& profile, 22 const std::string& app_locale, 23 const AutofillType& type) { 24 return profile.GetInfo(type, app_locale); 25} 26 27} // namespace 28 29using ::i18n::addressinput::AddressData; 30using ::i18n::addressinput::AddressField; 31 32scoped_ptr<AddressData> CreateAddressData( 33 const base::Callback<base::string16(const AutofillType&)>& get_info) { 34 scoped_ptr<AddressData> address_data(new AddressData()); 35 address_data->recipient = base::UTF16ToUTF8( 36 get_info.Run(AutofillType(NAME_FULL))); 37 address_data->organization = base::UTF16ToUTF8( 38 get_info.Run(AutofillType(COMPANY_NAME))); 39 address_data->region_code = base::UTF16ToUTF8( 40 get_info.Run(AutofillType(HTML_TYPE_COUNTRY_CODE, HTML_MODE_NONE))); 41 address_data->administrative_area = base::UTF16ToUTF8( 42 get_info.Run(AutofillType(ADDRESS_HOME_STATE))); 43 address_data->locality = base::UTF16ToUTF8( 44 get_info.Run(AutofillType(ADDRESS_HOME_CITY))); 45 address_data->dependent_locality = base::UTF16ToUTF8( 46 get_info.Run(AutofillType(ADDRESS_HOME_DEPENDENT_LOCALITY))); 47 address_data->sorting_code = base::UTF16ToUTF8( 48 get_info.Run(AutofillType(ADDRESS_HOME_SORTING_CODE))); 49 address_data->postal_code = base::UTF16ToUTF8( 50 get_info.Run(AutofillType(ADDRESS_HOME_ZIP))); 51 base::SplitString( 52 base::UTF16ToUTF8( 53 get_info.Run(AutofillType(ADDRESS_HOME_STREET_ADDRESS))), 54 '\n', 55 &address_data->address_line); 56 return address_data.Pass(); 57} 58 59scoped_ptr< ::i18n::addressinput::AddressData> 60 CreateAddressDataFromAutofillProfile(const AutofillProfile& profile, 61 const std::string& app_locale) { 62 scoped_ptr< ::i18n::addressinput::AddressData> address_data = 63 i18n::CreateAddressData(base::Bind(&GetInfoHelper, profile, app_locale)); 64 address_data->language_code = profile.language_code(); 65 return address_data.Pass(); 66} 67 68ServerFieldType TypeForField(AddressField address_field, bool billing) { 69 switch (address_field) { 70 case ::i18n::addressinput::COUNTRY: 71 return billing ? ADDRESS_BILLING_COUNTRY : ADDRESS_HOME_COUNTRY; 72 case ::i18n::addressinput::ADMIN_AREA: 73 return billing ? ADDRESS_BILLING_STATE : ADDRESS_HOME_STATE; 74 case ::i18n::addressinput::LOCALITY: 75 return billing ? ADDRESS_BILLING_CITY : ADDRESS_HOME_CITY; 76 case ::i18n::addressinput::DEPENDENT_LOCALITY: 77 return billing ? ADDRESS_BILLING_DEPENDENT_LOCALITY 78 : ADDRESS_HOME_DEPENDENT_LOCALITY; 79 case ::i18n::addressinput::POSTAL_CODE: 80 return billing ? ADDRESS_BILLING_ZIP : ADDRESS_HOME_ZIP; 81 case ::i18n::addressinput::SORTING_CODE: 82 return billing ? ADDRESS_BILLING_SORTING_CODE : ADDRESS_HOME_SORTING_CODE; 83 case ::i18n::addressinput::STREET_ADDRESS: 84 return billing ? ADDRESS_BILLING_STREET_ADDRESS 85 : ADDRESS_HOME_STREET_ADDRESS; 86 case ::i18n::addressinput::ORGANIZATION: 87 return COMPANY_NAME; 88 case ::i18n::addressinput::RECIPIENT: 89 return billing ? NAME_BILLING_FULL : NAME_FULL; 90 } 91 NOTREACHED(); 92 return UNKNOWN_TYPE; 93} 94 95bool FieldForType(ServerFieldType server_type, AddressField* field) { 96 switch (server_type) { 97 case ADDRESS_BILLING_COUNTRY: 98 case ADDRESS_HOME_COUNTRY: 99 if (field) 100 *field = ::i18n::addressinput::COUNTRY; 101 return true; 102 case ADDRESS_BILLING_STATE: 103 case ADDRESS_HOME_STATE: 104 if (field) 105 *field = ::i18n::addressinput::ADMIN_AREA; 106 return true; 107 case ADDRESS_BILLING_CITY: 108 case ADDRESS_HOME_CITY: 109 if (field) 110 *field = ::i18n::addressinput::LOCALITY; 111 return true; 112 case ADDRESS_BILLING_DEPENDENT_LOCALITY: 113 case ADDRESS_HOME_DEPENDENT_LOCALITY: 114 if (field) 115 *field = ::i18n::addressinput::DEPENDENT_LOCALITY; 116 return true; 117 case ADDRESS_BILLING_SORTING_CODE: 118 case ADDRESS_HOME_SORTING_CODE: 119 if (field) 120 *field = ::i18n::addressinput::SORTING_CODE; 121 return true; 122 case ADDRESS_BILLING_ZIP: 123 case ADDRESS_HOME_ZIP: 124 if (field) 125 *field = ::i18n::addressinput::POSTAL_CODE; 126 return true; 127 case ADDRESS_BILLING_STREET_ADDRESS: 128 case ADDRESS_BILLING_LINE1: 129 case ADDRESS_BILLING_LINE2: 130 case ADDRESS_HOME_STREET_ADDRESS: 131 case ADDRESS_HOME_LINE1: 132 case ADDRESS_HOME_LINE2: 133 if (field) 134 *field = ::i18n::addressinput::STREET_ADDRESS; 135 return true; 136 case COMPANY_NAME: 137 if (field) 138 *field = ::i18n::addressinput::ORGANIZATION; 139 return true; 140 case NAME_BILLING_FULL: 141 case NAME_FULL: 142 if (field) 143 *field = ::i18n::addressinput::RECIPIENT; 144 return true; 145 default: 146 return false; 147 } 148} 149 150} // namespace i18n 151} // namespace autofill 152