address.cc revision 424c4d7b64af9d0d8fd9624f381f469654d5e3d2
13cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks// Copyright 2013 The Chromium Authors. All rights reserved.
23cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks// Use of this source code is governed by a BSD-style license that can be
33cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks// found in the LICENSE file.
43cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks
53cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks#include "components/autofill/core/browser/address.h"
63cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks
73cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks#include <stddef.h>
83cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks
93cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks#include "base/basictypes.h"
103cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks#include "base/logging.h"
113cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks#include "base/strings/string_util.h"
123cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks#include "base/strings/utf_string_conversions.h"
133cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks#include "components/autofill/core/browser/autofill_country.h"
143cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks#include "components/autofill/core/browser/autofill_field.h"
153cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks#include "components/autofill/core/browser/autofill_type.h"
163cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks
173cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaksnamespace {
183cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks
193cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaksconst char16 kAddressSplitChars[] = {'-', ',', '#', '.', ' ', 0};
203cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks
213cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks}  // namespace
223cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks
233cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaksnamespace autofill {
243cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks
253cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna ZaksAddress::Address() {}
263cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks
273cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna ZaksAddress::Address(const Address& address) : FormGroup() {
283cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks  *this = address;
293cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks}
303cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks
313cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna ZaksAddress::~Address() {}
323cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks
333cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna ZaksAddress& Address::operator=(const Address& address) {
343cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks  if (this == &address)
353cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks    return *this;
363cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks
373cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks  line1_ = address.line1_;
383cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks  line2_ = address.line2_;
393cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks  city_ = address.city_;
403cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks  state_ = address.state_;
413cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks  country_code_ = address.country_code_;
423cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks  zip_code_ = address.zip_code_;
433cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks  return *this;
443cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks}
453cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks
463cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaksbase::string16 Address::GetRawInfo(ServerFieldType type) const {
473cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks  DCHECK_EQ(ADDRESS_HOME, AutofillType(type).group());
483cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks  switch (type) {
493cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks    case ADDRESS_HOME_LINE1:
503cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks      return line1_;
513cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks
523cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks    case ADDRESS_HOME_LINE2:
533cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks      return line2_;
543cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks
553cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks    case ADDRESS_HOME_CITY:
563cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks      return city_;
573cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks
583cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks    case ADDRESS_HOME_STATE:
593cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks      return state_;
603cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks
613cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks    case ADDRESS_HOME_ZIP:
623cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks      return zip_code_;
633cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks
643cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks    case ADDRESS_HOME_COUNTRY:
653cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks      return ASCIIToUTF16(country_code_);
663cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks
673cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks    default:
683cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks      return base::string16();
693cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks  }
703cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks}
713cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks
723cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaksvoid Address::SetRawInfo(ServerFieldType type, const base::string16& value) {
733cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks  DCHECK_EQ(ADDRESS_HOME, AutofillType(type).group());
743cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks  switch (type) {
753cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks    case ADDRESS_HOME_LINE1:
76      line1_ = value;
77      break;
78
79    case ADDRESS_HOME_LINE2:
80      line2_ = value;
81      break;
82
83    case ADDRESS_HOME_CITY:
84      city_ = value;
85      break;
86
87    case ADDRESS_HOME_STATE:
88      state_ = value;
89      break;
90
91    case ADDRESS_HOME_COUNTRY:
92      DCHECK(value.empty() ||
93             (value.length() == 2u && IsStringASCII(value)));
94      country_code_ = UTF16ToASCII(value);
95      break;
96
97    case ADDRESS_HOME_ZIP:
98      zip_code_ = value;
99      break;
100
101    default:
102      NOTREACHED();
103  }
104}
105
106base::string16 Address::GetInfo(const AutofillType& type,
107                                const std::string& app_locale) const {
108  if (type.html_type() == HTML_TYPE_COUNTRY_CODE) {
109    return ASCIIToUTF16(country_code_);
110  } else if (type.html_type() == HTML_TYPE_STREET_ADDRESS) {
111    base::string16 address = line1_;
112    if (!line2_.empty())
113      address += ASCIIToUTF16(", ") + line2_;
114    return address;
115  }
116
117  ServerFieldType storable_type = type.GetStorableType();
118  if (storable_type == ADDRESS_HOME_COUNTRY && !country_code_.empty())
119    return AutofillCountry(country_code_, app_locale).name();
120
121  return GetRawInfo(storable_type);
122}
123
124bool Address::SetInfo(const AutofillType& type,
125                      const base::string16& value,
126                      const std::string& app_locale) {
127  if (type.html_type() == HTML_TYPE_COUNTRY_CODE) {
128    if (!value.empty() && (value.size() != 2u || !IsStringASCII(value))) {
129      country_code_ = std::string();
130      return false;
131    }
132
133    country_code_ = StringToUpperASCII(UTF16ToASCII(value));
134    return true;
135  } else if (type.html_type() == HTML_TYPE_STREET_ADDRESS) {
136    // Don't attempt to parse the address into lines, since this is potentially
137    // a user-entered address in the user's own format, so the code would have
138    // to rely on iffy heuristics at best.  Instead, just give up when importing
139    // addresses like this.
140    line1_ = line2_ = base::string16();
141    return false;
142  }
143
144  ServerFieldType storable_type = type.GetStorableType();
145  if (storable_type == ADDRESS_HOME_COUNTRY && !value.empty()) {
146    country_code_ = AutofillCountry::GetCountryCode(value, app_locale);
147    return !country_code_.empty();
148  }
149
150  SetRawInfo(storable_type, value);
151  return true;
152}
153
154void Address::GetMatchingTypes(const base::string16& text,
155                               const std::string& app_locale,
156                               ServerFieldTypeSet* matching_types) const {
157  FormGroup::GetMatchingTypes(text, app_locale, matching_types);
158
159  // Check to see if the |text| canonicalized as a country name is a match.
160  std::string country_code = AutofillCountry::GetCountryCode(text, app_locale);
161  if (!country_code.empty() && country_code_ == country_code)
162    matching_types->insert(ADDRESS_HOME_COUNTRY);
163}
164
165void Address::GetSupportedTypes(ServerFieldTypeSet* supported_types) const {
166  supported_types->insert(ADDRESS_HOME_LINE1);
167  supported_types->insert(ADDRESS_HOME_LINE2);
168  supported_types->insert(ADDRESS_HOME_CITY);
169  supported_types->insert(ADDRESS_HOME_STATE);
170  supported_types->insert(ADDRESS_HOME_ZIP);
171  supported_types->insert(ADDRESS_HOME_COUNTRY);
172}
173
174}  // namespace autofill
175