1bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// Copyright (C) 2014 Google Inc. 2bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// 3bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// Licensed under the Apache License, Version 2.0 (the "License"); 4bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// you may not use this file except in compliance with the License. 5bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// You may obtain a copy of the License at 6bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// 7bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// http://www.apache.org/licenses/LICENSE-2.0 8bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// 9bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// Unless required by applicable law or agreed to in writing, software 10bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// distributed under the License is distributed on an "AS IS" BASIS, 11bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// See the License for the specific language governing permissions and 13bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// limitations under the License. 14bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// 15bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// The public interface to the address validation features of libaddressinput. 16bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// The AddressValidator will examine an AddressData struct and return a map of 17bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// the problems found with the different fields of this struct. 18bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com 19bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com#ifndef I18N_ADDRESSINPUT_ADDRESS_VALIDATOR_H_ 20bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com#define I18N_ADDRESSINPUT_ADDRESS_VALIDATOR_H_ 21bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com 22bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com#include <libaddressinput/address_field.h> 23bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com#include <libaddressinput/address_problem.h> 24bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com#include <libaddressinput/callback.h> 25bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com#include <libaddressinput/util/basictypes.h> 26bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com 27bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com#include <map> 28bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com 29bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.comnamespace i18n { 30bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.comnamespace addressinput { 31bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com 329693f6426f3500db74dcfc766a130a747a571e5eroubert@google.comclass Supplier; 33bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.comstruct AddressData; 34bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com 35bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.comtypedef std::multimap<AddressField, AddressProblem> FieldProblemMap; 36bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com 37bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// Validates an AddressData struct. Sample usage: 38bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// class MyClass { 39bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// public: 40bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// MyClass() 418466869ca5e66ec41d133c8ca2f25789028ef4dfroubert@google.com// : supplier_(new MySupplier), 428466869ca5e66ec41d133c8ca2f25789028ef4dfroubert@google.com// validator_(new AddressValidator(supplier_.get())), 43bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// validated_(BuildCallback(this, &MyClass::Validated)) {} 44bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// 45bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// virtual ~MyClass() {} 46bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// 47bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// void ValidateAddress() const { 48bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// address_.region_code = "US"; 49bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// address_.administrative_area = "CA"; 50bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// validator_.Validate(address_, filter_, &problems_, *validated_); 51bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// } 52bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// 53bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// void Validated(bool success, 54bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// const AddressData& address, 55bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// const FieldProblemMap& problems) { 56bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// if (success && problems.empty()) { 57bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// ... 58bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// } 59bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// } 60bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// 61bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// private: 62bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// AddressData address_; 63bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// FieldProblemMap filter_; 64bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// FieldProblemMap problems_; 658466869ca5e66ec41d133c8ca2f25789028ef4dfroubert@google.com// const scoped_ptr<Supplier> supplier_; 668466869ca5e66ec41d133c8ca2f25789028ef4dfroubert@google.com// const scoped_ptr<AddressValidator> validator_; 67bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// const scoped_ptr<const AddressValidator::Callback> validated_; 68bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// }; 69bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.comclass AddressValidator { 70bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com public: 718c9b0e35847b85f4cc7434058e4e4ec5d5560c40roubert@google.com typedef i18n::addressinput::Callback<const AddressData&, 728c9b0e35847b85f4cc7434058e4e4ec5d5560c40roubert@google.com const FieldProblemMap&> Callback; 73bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com 74af2251ef30326d338a413850ec8b4e6253498b2croubert@google.com // Does not take ownership of |supplier|. 75af2251ef30326d338a413850ec8b4e6253498b2croubert@google.com AddressValidator(Supplier* supplier); 76af2251ef30326d338a413850ec8b4e6253498b2croubert@google.com 77bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com ~AddressValidator(); 78bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com 79bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com // Validates the |address| and populates |problems| with the validation 80bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com // problems, filtered according to the |filter| parameter. 81bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com // 82bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com // Set |allow_postal| to allow postal addresses, rather than only addresses 83bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com // describing physical locations. 84bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com // 85bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com // Set |require_name| if recipient should be considered a required field. 86bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com // 87bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com // If the |filter| is NULL or empty, then all discovered validation problems 88bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com // are returned. If the |filter| contains problem elements, then only those 89bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com // field-problem pairs present in the |filter| will be returned. 90bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com // 91bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com // Calls the |validated| callback when validation is done. All objects passed 92bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com // as parameters must be kept available until the callback has been called. 93bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com // 94bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com // The |success| parameter of the callback indicates whether it was possible 95bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com // to perform validation. If |success| is true, then |problems| will contain 96bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com // information about any problems found with the |address|. 97bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com void Validate(const AddressData& address, 98bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com bool allow_postal, 99bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com bool require_name, 100bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com const FieldProblemMap* filter, 101bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com FieldProblemMap* problems, 102bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com const Callback& validated) const; 103bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com 104bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com private: 105af2251ef30326d338a413850ec8b4e6253498b2croubert@google.com Supplier* const supplier_; 106bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com 107bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com DISALLOW_COPY_AND_ASSIGN(AddressValidator); 108bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com}; 109bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com 110bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com} // namespace addressinput 111bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com} // namespace i18n 112bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com 113bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com#endif // I18N_ADDRESSINPUT_ADDRESS_VALIDATOR_H_ 114