// 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" #include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_metadata.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; std::unique_ptr CreateAddressData( const base::Callback& get_info) { auto address_data = std::make_unique(); 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))); address_data->address_line = base::SplitString( base::UTF16ToUTF8( get_info.Run(AutofillType(ADDRESS_HOME_STREET_ADDRESS))), "\n", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); return address_data; } std::unique_ptr<::i18n::addressinput::AddressData> CreateAddressDataFromAutofillProfile(const AutofillProfile& profile, const std::string& app_locale) { std::unique_ptr<::i18n::addressinput::AddressData> address_data = i18n::CreateAddressData(base::Bind(&GetInfoHelper, profile, app_locale)); address_data->language_code = profile.language_code(); return address_data; } 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; } } bool IsFieldRequired(ServerFieldType server_type, const std::string& country_code) { ::i18n::addressinput::AddressField field_enum; if (FieldForType(server_type, &field_enum)) { return ::i18n::addressinput::IsFieldRequired(field_enum, country_code); } return false; } } // namespace i18n } // namespace autofill