1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file. 4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/autofill/core/browser/address_i18n.h" 6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/bind.h" 8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/callback.h" 9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/logging.h" 10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/strings/string_split.h" 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/autofill/core/browser/autofill_profile.h" 13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/autofill/core/browser/autofill_type.h" 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_data.h" 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace autofill { 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace i18n { 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace { 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)base::string16 GetInfoHelper(const AutofillProfile& profile, 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& app_locale, 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const AutofillType& type) { 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return profile.GetInfo(type, app_locale); 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)using ::i18n::addressinput::AddressData; 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing ::i18n::addressinput::AddressField; 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)scoped_ptr<AddressData> CreateAddressData( 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::Callback<base::string16(const AutofillType&)>& get_info) { 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<AddressData> address_data(new AddressData()); 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) address_data->recipient = base::UTF16ToUTF8( 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) get_info.Run(AutofillType(NAME_FULL))); 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci address_data->organization = base::UTF16ToUTF8( 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci get_info.Run(AutofillType(COMPANY_NAME))); 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch address_data->region_code = base::UTF16ToUTF8( 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) get_info.Run(AutofillType(HTML_TYPE_COUNTRY_CODE, HTML_MODE_NONE))); 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) address_data->administrative_area = base::UTF16ToUTF8( 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) get_info.Run(AutofillType(ADDRESS_HOME_STATE))); 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) address_data->locality = base::UTF16ToUTF8( 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) get_info.Run(AutofillType(ADDRESS_HOME_CITY))); 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) address_data->dependent_locality = base::UTF16ToUTF8( 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) get_info.Run(AutofillType(ADDRESS_HOME_DEPENDENT_LOCALITY))); 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) address_data->sorting_code = base::UTF16ToUTF8( 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) get_info.Run(AutofillType(ADDRESS_HOME_SORTING_CODE))); 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) address_data->postal_code = base::UTF16ToUTF8( 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) get_info.Run(AutofillType(ADDRESS_HOME_ZIP))); 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::SplitString( 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::UTF16ToUTF8( 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) get_info.Run(AutofillType(ADDRESS_HOME_STREET_ADDRESS))), 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) '\n', 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &address_data->address_line); 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return address_data.Pass(); 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)scoped_ptr< ::i18n::addressinput::AddressData> 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CreateAddressDataFromAutofillProfile(const AutofillProfile& profile, 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& app_locale) { 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr< ::i18n::addressinput::AddressData> address_data = 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) i18n::CreateAddressData(base::Bind(&GetInfoHelper, profile, app_locale)); 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) address_data->language_code = profile.language_code(); 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return address_data.Pass(); 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 68116680a4aac90f2aa7413d9095a592090648e557Ben MurdochServerFieldType TypeForField(AddressField address_field, bool billing) { 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch switch (address_field) { 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ::i18n::addressinput::COUNTRY: 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return billing ? ADDRESS_BILLING_COUNTRY : ADDRESS_HOME_COUNTRY; 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ::i18n::addressinput::ADMIN_AREA: 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return billing ? ADDRESS_BILLING_STATE : ADDRESS_HOME_STATE; 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ::i18n::addressinput::LOCALITY: 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return billing ? ADDRESS_BILLING_CITY : ADDRESS_HOME_CITY; 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ::i18n::addressinput::DEPENDENT_LOCALITY: 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return billing ? ADDRESS_BILLING_DEPENDENT_LOCALITY 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : ADDRESS_HOME_DEPENDENT_LOCALITY; 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ::i18n::addressinput::POSTAL_CODE: 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return billing ? ADDRESS_BILLING_ZIP : ADDRESS_HOME_ZIP; 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ::i18n::addressinput::SORTING_CODE: 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return billing ? ADDRESS_BILLING_SORTING_CODE : ADDRESS_HOME_SORTING_CODE; 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ::i18n::addressinput::STREET_ADDRESS: 84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return billing ? ADDRESS_BILLING_STREET_ADDRESS 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : ADDRESS_HOME_STREET_ADDRESS; 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case ::i18n::addressinput::ORGANIZATION: 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return COMPANY_NAME; 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ::i18n::addressinput::RECIPIENT: 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return billing ? NAME_BILLING_FULL : NAME_FULL; 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NOTREACHED(); 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return UNKNOWN_TYPE; 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool FieldForType(ServerFieldType server_type, AddressField* field) { 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch switch (server_type) { 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ADDRESS_BILLING_COUNTRY: 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ADDRESS_HOME_COUNTRY: 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (field) 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch *field = ::i18n::addressinput::COUNTRY; 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return true; 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ADDRESS_BILLING_STATE: 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ADDRESS_HOME_STATE: 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (field) 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch *field = ::i18n::addressinput::ADMIN_AREA; 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return true; 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ADDRESS_BILLING_CITY: 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ADDRESS_HOME_CITY: 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (field) 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch *field = ::i18n::addressinput::LOCALITY; 111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return true; 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ADDRESS_BILLING_DEPENDENT_LOCALITY: 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ADDRESS_HOME_DEPENDENT_LOCALITY: 114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (field) 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch *field = ::i18n::addressinput::DEPENDENT_LOCALITY; 116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return true; 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ADDRESS_BILLING_SORTING_CODE: 118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ADDRESS_HOME_SORTING_CODE: 119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (field) 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch *field = ::i18n::addressinput::SORTING_CODE; 121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return true; 122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ADDRESS_BILLING_ZIP: 123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ADDRESS_HOME_ZIP: 124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (field) 125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch *field = ::i18n::addressinput::POSTAL_CODE; 126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return true; 127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ADDRESS_BILLING_STREET_ADDRESS: 128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ADDRESS_BILLING_LINE1: 129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ADDRESS_BILLING_LINE2: 130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ADDRESS_HOME_STREET_ADDRESS: 131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ADDRESS_HOME_LINE1: 132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ADDRESS_HOME_LINE2: 133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (field) 134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch *field = ::i18n::addressinput::STREET_ADDRESS; 135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return true; 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case COMPANY_NAME: 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (field) 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *field = ::i18n::addressinput::ORGANIZATION; 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; 140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case NAME_BILLING_FULL: 141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case NAME_FULL: 142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (field) 143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch *field = ::i18n::addressinput::RECIPIENT; 144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return true; 145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch default: 146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return false; 147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace i18n 151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace autofill 152