1e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com// Copyright (C) 2014 Google Inc. 2e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com// 3e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com// Licensed under the Apache License, Version 2.0 (the "License"); 4e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com// you may not use this file except in compliance with the License. 5e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com// You may obtain a copy of the License at 6e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com// 7e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com// http://www.apache.org/licenses/LICENSE-2.0 8e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com// 9e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com// Unless required by applicable law or agreed to in writing, software 10e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com// distributed under the License is distributed on an "AS IS" BASIS, 11e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com// See the License for the specific language governing permissions and 13e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com// limitations under the License. 14e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com// 15e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com// A struct for storing address data: country code, administrative area, 16e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com// locality, etc. The field names correspond to the OASIS xAL standard: 17e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com// https://www.oasis-open.org/committees/ciq/download.shtml 18e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com 19e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com#ifndef I18N_ADDRESSINPUT_ADDRESS_DATA_H_ 20e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com#define I18N_ADDRESSINPUT_ADDRESS_DATA_H_ 21e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com 22e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com#include <libaddressinput/address_field.h> 23e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com 246e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com#include <iosfwd> 25e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com#include <string> 26e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com#include <vector> 27e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com 28e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.comnamespace i18n { 29e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.comnamespace addressinput { 30e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com 31e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.comstruct AddressData { 32e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com // CLDR (Common Locale Data Repository) region code. 33e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com std::string region_code; 34e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com 35e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com // The address lines represent the most specific part of any address. 36e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com std::vector<std::string> address_line; 37e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com 38e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com // Top-level administrative subdivision of this country. 39e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com std::string administrative_area; 40e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com 41e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com // Generally refers to the city/town portion of an address. 42e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com std::string locality; 43e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com 44e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com // Dependent locality or sublocality. Used for UK dependent localities, or 45e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com // neighborhoods or boroughs in other locations. 46e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com std::string dependent_locality; 47e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com 48e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com // Values are frequently alphanumeric. 49e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com std::string postal_code; 50e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com 51e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com // This corresponds to the SortingCode sub-element of the xAL 52e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com // PostalServiceElements element. Use is very country-specific. 53e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com std::string sorting_code; 54e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com 55e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com // Language code of the address. Should be in BCP-47 format. 56e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com std::string language_code; 57e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com 58b52a2aeb63a28914850f3ed81cd7fd26ecdd4cdcrouslan@chromium.org // The organization, firm, company, or institution at this address. This 59b52a2aeb63a28914850f3ed81cd7fd26ecdd4cdcrouslan@chromium.org // corresponds to the FirmName sub-element of the xAL FirmType element. 60b52a2aeb63a28914850f3ed81cd7fd26ecdd4cdcrouslan@chromium.org std::string organization; 61b52a2aeb63a28914850f3ed81cd7fd26ecdd4cdcrouslan@chromium.org 62e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com // Name of recipient or contact person. Not present in xAL. 63e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com std::string recipient; 64e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com 65e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com // Returns whether the |field| is empty. 66e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com bool IsFieldEmpty(AddressField field) const; 67e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com 68e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com // Returns the value of the |field|. The parameter must not be STREET_ADDRESS, 69e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com // which comprises multiple fields (will crash otherwise). 70e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com const std::string& GetFieldValue(AddressField field) const; 71e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com 722fbc3617221414ff659533aaf8033526443b3773rouslan@chromium.org // Copies |value| into the |field|. The parameter must not be STREET_ADDRESS, 732fbc3617221414ff659533aaf8033526443b3773rouslan@chromium.org // which comprises multiple fields (will crash otherwise). 742fbc3617221414ff659533aaf8033526443b3773rouslan@chromium.org void SetFieldValue(AddressField field, const std::string& value); 752fbc3617221414ff659533aaf8033526443b3773rouslan@chromium.org 76e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com // Returns the value of the |field|. The parameter must be STREET_ADDRESS, 77e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com // which comprises multiple fields (will crash otherwise). 78e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com const std::vector<std::string>& GetRepeatedFieldValue( 79e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com AddressField field) const; 80e66bf12636bf12067bd8b199b8e6c1035315d2aakeghani@google.com 816e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com bool operator==(const AddressData& other) const; 826e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 83e66bf12636bf12067bd8b199b8e6c1035315d2aakeghani@google.com // Returns true if the parameter comprises multiple fields, false otherwise. 84e66bf12636bf12067bd8b199b8e6c1035315d2aakeghani@google.com // Use it to determine whether to call |GetFieldValue| or 85e66bf12636bf12067bd8b199b8e6c1035315d2aakeghani@google.com // |GetRepeatedFieldValue|. 86e66bf12636bf12067bd8b199b8e6c1035315d2aakeghani@google.com static bool IsRepeatedFieldValue(AddressField field); 87e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com}; 88e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com 89e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com} // namespace addressinput 90e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com} // namespace i18n 91e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com 926e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com// Produces human-readable output in logging, for example in unit tests. 936e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.comstd::ostream& operator<<(std::ostream& o, 946e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com const i18n::addressinput::AddressData& address); 956e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 96e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com#endif // I18N_ADDRESSINPUT_ADDRESS_DATA_H_ 97