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