|  | // Copyright 2014 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/core/browser/address_i18n.h" | 
|  |  | 
|  | #include "base/bind.h" | 
|  | #include "base/callback.h" | 
|  | #include "base/logging.h" | 
|  | #include "base/strings/string_split.h" | 
|  | #include "base/strings/utf_string_conversions.h" | 
|  | #include "components/autofill/core/browser/autofill_profile.h" | 
|  | #include "components/autofill/core/browser/autofill_type.h" | 
|  | #include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_data.h" | 
|  |  | 
|  | namespace autofill { | 
|  | namespace i18n { | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | base::string16 GetInfoHelper(const AutofillProfile& profile, | 
|  | const std::string& app_locale, | 
|  | const AutofillType& type) { | 
|  | return profile.GetInfo(type, app_locale); | 
|  | } | 
|  |  | 
|  | }  // namespace | 
|  |  | 
|  | using ::i18n::addressinput::AddressData; | 
|  | using ::i18n::addressinput::AddressField; | 
|  |  | 
|  | scoped_ptr<AddressData> CreateAddressData( | 
|  | const base::Callback<base::string16(const AutofillType&)>& get_info) { | 
|  | scoped_ptr<AddressData> address_data(new AddressData()); | 
|  | address_data->recipient = base::UTF16ToUTF8( | 
|  | get_info.Run(AutofillType(NAME_FULL))); | 
|  | address_data->organization = base::UTF16ToUTF8( | 
|  | get_info.Run(AutofillType(COMPANY_NAME))); | 
|  | address_data->region_code = base::UTF16ToUTF8( | 
|  | get_info.Run(AutofillType(HTML_TYPE_COUNTRY_CODE, HTML_MODE_NONE))); | 
|  | address_data->administrative_area = base::UTF16ToUTF8( | 
|  | get_info.Run(AutofillType(ADDRESS_HOME_STATE))); | 
|  | address_data->locality = base::UTF16ToUTF8( | 
|  | get_info.Run(AutofillType(ADDRESS_HOME_CITY))); | 
|  | address_data->dependent_locality = base::UTF16ToUTF8( | 
|  | get_info.Run(AutofillType(ADDRESS_HOME_DEPENDENT_LOCALITY))); | 
|  | address_data->sorting_code = base::UTF16ToUTF8( | 
|  | get_info.Run(AutofillType(ADDRESS_HOME_SORTING_CODE))); | 
|  | address_data->postal_code = base::UTF16ToUTF8( | 
|  | get_info.Run(AutofillType(ADDRESS_HOME_ZIP))); | 
|  | base::SplitString( | 
|  | base::UTF16ToUTF8( | 
|  | get_info.Run(AutofillType(ADDRESS_HOME_STREET_ADDRESS))), | 
|  | '\n', | 
|  | &address_data->address_line); | 
|  | return address_data.Pass(); | 
|  | } | 
|  |  | 
|  | scoped_ptr< ::i18n::addressinput::AddressData> | 
|  | CreateAddressDataFromAutofillProfile(const AutofillProfile& profile, | 
|  | const std::string& app_locale) { | 
|  | scoped_ptr< ::i18n::addressinput::AddressData> address_data = | 
|  | i18n::CreateAddressData(base::Bind(&GetInfoHelper, profile, app_locale)); | 
|  | address_data->language_code = profile.language_code(); | 
|  | return address_data.Pass(); | 
|  | } | 
|  |  | 
|  | ServerFieldType TypeForField(AddressField address_field, bool billing) { | 
|  | switch (address_field) { | 
|  | case ::i18n::addressinput::COUNTRY: | 
|  | return billing ? ADDRESS_BILLING_COUNTRY : ADDRESS_HOME_COUNTRY; | 
|  | case ::i18n::addressinput::ADMIN_AREA: | 
|  | return billing ? ADDRESS_BILLING_STATE : ADDRESS_HOME_STATE; | 
|  | case ::i18n::addressinput::LOCALITY: | 
|  | return billing ? ADDRESS_BILLING_CITY : ADDRESS_HOME_CITY; | 
|  | case ::i18n::addressinput::DEPENDENT_LOCALITY: | 
|  | return billing ? ADDRESS_BILLING_DEPENDENT_LOCALITY | 
|  | : ADDRESS_HOME_DEPENDENT_LOCALITY; | 
|  | case ::i18n::addressinput::POSTAL_CODE: | 
|  | return billing ? ADDRESS_BILLING_ZIP : ADDRESS_HOME_ZIP; | 
|  | case ::i18n::addressinput::SORTING_CODE: | 
|  | return billing ? ADDRESS_BILLING_SORTING_CODE : ADDRESS_HOME_SORTING_CODE; | 
|  | case ::i18n::addressinput::STREET_ADDRESS: | 
|  | return billing ? ADDRESS_BILLING_STREET_ADDRESS | 
|  | : ADDRESS_HOME_STREET_ADDRESS; | 
|  | case ::i18n::addressinput::ORGANIZATION: | 
|  | return COMPANY_NAME; | 
|  | case ::i18n::addressinput::RECIPIENT: | 
|  | return billing ? NAME_BILLING_FULL : NAME_FULL; | 
|  | } | 
|  | NOTREACHED(); | 
|  | return UNKNOWN_TYPE; | 
|  | } | 
|  |  | 
|  | bool FieldForType(ServerFieldType server_type, AddressField* field) { | 
|  | switch (server_type) { | 
|  | case ADDRESS_BILLING_COUNTRY: | 
|  | case ADDRESS_HOME_COUNTRY: | 
|  | if (field) | 
|  | *field = ::i18n::addressinput::COUNTRY; | 
|  | return true; | 
|  | case ADDRESS_BILLING_STATE: | 
|  | case ADDRESS_HOME_STATE: | 
|  | if (field) | 
|  | *field = ::i18n::addressinput::ADMIN_AREA; | 
|  | return true; | 
|  | case ADDRESS_BILLING_CITY: | 
|  | case ADDRESS_HOME_CITY: | 
|  | if (field) | 
|  | *field = ::i18n::addressinput::LOCALITY; | 
|  | return true; | 
|  | case ADDRESS_BILLING_DEPENDENT_LOCALITY: | 
|  | case ADDRESS_HOME_DEPENDENT_LOCALITY: | 
|  | if (field) | 
|  | *field = ::i18n::addressinput::DEPENDENT_LOCALITY; | 
|  | return true; | 
|  | case ADDRESS_BILLING_SORTING_CODE: | 
|  | case ADDRESS_HOME_SORTING_CODE: | 
|  | if (field) | 
|  | *field = ::i18n::addressinput::SORTING_CODE; | 
|  | return true; | 
|  | case ADDRESS_BILLING_ZIP: | 
|  | case ADDRESS_HOME_ZIP: | 
|  | if (field) | 
|  | *field = ::i18n::addressinput::POSTAL_CODE; | 
|  | return true; | 
|  | case ADDRESS_BILLING_STREET_ADDRESS: | 
|  | case ADDRESS_BILLING_LINE1: | 
|  | case ADDRESS_BILLING_LINE2: | 
|  | case ADDRESS_HOME_STREET_ADDRESS: | 
|  | case ADDRESS_HOME_LINE1: | 
|  | case ADDRESS_HOME_LINE2: | 
|  | if (field) | 
|  | *field = ::i18n::addressinput::STREET_ADDRESS; | 
|  | return true; | 
|  | case COMPANY_NAME: | 
|  | if (field) | 
|  | *field = ::i18n::addressinput::ORGANIZATION; | 
|  | return true; | 
|  | case NAME_BILLING_FULL: | 
|  | case NAME_FULL: | 
|  | if (field) | 
|  | *field = ::i18n::addressinput::RECIPIENT; | 
|  | return true; | 
|  | default: | 
|  | return false; | 
|  | } | 
|  | } | 
|  |  | 
|  | }  // namespace i18n | 
|  | }  // namespace autofill |