blob: 603c4fa3b54353a82003c240ae3e70f3844cafa4 [file] [log] [blame]
// Copyright 2013 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/contact_info.h"
#include <stddef.h>
#include <ostream>
#include <string>
#include "base/basictypes.h"
#include "base/logging.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "components/autofill/core/browser/autofill_type.h"
namespace autofill {
static const ServerFieldType kAutofillNameInfoTypes[] = {
NAME_FIRST,
NAME_MIDDLE,
NAME_LAST
};
static const size_t kAutofillNameInfoLength =
arraysize(kAutofillNameInfoTypes);
NameInfo::NameInfo() {}
NameInfo::NameInfo(const NameInfo& info) : FormGroup() {
*this = info;
}
NameInfo::~NameInfo() {}
NameInfo& NameInfo::operator=(const NameInfo& info) {
if (this == &info)
return *this;
first_ = info.first_;
middle_ = info.middle_;
last_ = info.last_;
return *this;
}
void NameInfo::GetSupportedTypes(ServerFieldTypeSet* supported_types) const {
supported_types->insert(NAME_FIRST);
supported_types->insert(NAME_MIDDLE);
supported_types->insert(NAME_LAST);
supported_types->insert(NAME_MIDDLE_INITIAL);
supported_types->insert(NAME_FULL);
}
base::string16 NameInfo::GetRawInfo(ServerFieldType type) const {
// TODO(isherman): Is GetStorableType even necessary?
switch (AutofillType(type).GetStorableType()) {
case NAME_FIRST:
return first();
case NAME_MIDDLE:
return middle();
case NAME_LAST:
return last();
case NAME_MIDDLE_INITIAL:
return MiddleInitial();
case NAME_FULL:
return FullName();
default:
return base::string16();
}
}
void NameInfo::SetRawInfo(ServerFieldType type, const base::string16& value) {
// TODO(isherman): Is GetStorableType even necessary?
ServerFieldType storable_type = AutofillType(type).GetStorableType();
DCHECK_EQ(NAME, AutofillType(storable_type).group());
switch (storable_type) {
case NAME_FIRST:
first_ = value;
break;
case NAME_MIDDLE:
case NAME_MIDDLE_INITIAL:
middle_ = value;
break;
case NAME_LAST:
last_ = value;
break;
case NAME_FULL:
SetFullName(value);
break;
default:
NOTREACHED();
}
}
base::string16 NameInfo::FullName() const {
std::vector<base::string16> full_name;
if (!first_.empty())
full_name.push_back(first_);
if (!middle_.empty())
full_name.push_back(middle_);
if (!last_.empty())
full_name.push_back(last_);
return JoinString(full_name, ' ');
}
base::string16 NameInfo::MiddleInitial() const {
if (middle_.empty())
return base::string16();
base::string16 middle_name(middle());
base::string16 initial;
initial.push_back(middle_name[0]);
return initial;
}
void NameInfo::SetFullName(const base::string16& full) {
// Clear the names.
first_ = base::string16();
middle_ = base::string16();
last_ = base::string16();
std::vector<base::string16> full_name_tokens;
Tokenize(full, ASCIIToUTF16(" "), &full_name_tokens);
// There are four possibilities: empty; first name; first and last names;
// first, middle (possibly multiple strings) and then the last name.
if (full_name_tokens.size() > 0) {
first_ = full_name_tokens[0];
if (full_name_tokens.size() > 1) {
last_ = full_name_tokens.back();
if (full_name_tokens.size() > 2) {
full_name_tokens.erase(full_name_tokens.begin());
full_name_tokens.pop_back();
middle_ = JoinString(full_name_tokens, ' ');
}
}
}
}
EmailInfo::EmailInfo() {}
EmailInfo::EmailInfo(const EmailInfo& info) : FormGroup() {
*this = info;
}
EmailInfo::~EmailInfo() {}
EmailInfo& EmailInfo::operator=(const EmailInfo& info) {
if (this == &info)
return *this;
email_ = info.email_;
return *this;
}
void EmailInfo::GetSupportedTypes(ServerFieldTypeSet* supported_types) const {
supported_types->insert(EMAIL_ADDRESS);
}
base::string16 EmailInfo::GetRawInfo(ServerFieldType type) const {
if (type == EMAIL_ADDRESS)
return email_;
return base::string16();
}
void EmailInfo::SetRawInfo(ServerFieldType type, const base::string16& value) {
DCHECK_EQ(EMAIL_ADDRESS, type);
email_ = value;
}
CompanyInfo::CompanyInfo() {}
CompanyInfo::CompanyInfo(const CompanyInfo& info) : FormGroup() {
*this = info;
}
CompanyInfo::~CompanyInfo() {}
CompanyInfo& CompanyInfo::operator=(const CompanyInfo& info) {
if (this == &info)
return *this;
company_name_ = info.company_name_;
return *this;
}
void CompanyInfo::GetSupportedTypes(ServerFieldTypeSet* supported_types) const {
supported_types->insert(COMPANY_NAME);
}
base::string16 CompanyInfo::GetRawInfo(ServerFieldType type) const {
if (type == COMPANY_NAME)
return company_name_;
return base::string16();
}
void CompanyInfo::SetRawInfo(ServerFieldType type,
const base::string16& value) {
DCHECK_EQ(COMPANY_NAME, type);
company_name_ = value;
}
} // namespace autofill