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#ifndef I18N_ADDRESSINPUT_VALIDATION_TASK_H_ 16bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com#define I18N_ADDRESSINPUT_VALIDATION_TASK_H_ 17bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com 18bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com#include <libaddressinput/address_field.h> 19bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com#include <libaddressinput/address_problem.h> 20bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com#include <libaddressinput/address_validator.h> 219693f6426f3500db74dcfc766a130a747a571e5eroubert@google.com#include <libaddressinput/supplier.h> 22bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com#include <libaddressinput/util/basictypes.h> 23bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com#include <libaddressinput/util/scoped_ptr.h> 24bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com 259f47fe3ed525accac995b095d408a825673a2ee1roubert@google.com#include <string> 269f47fe3ed525accac995b095d408a825673a2ee1roubert@google.com 27bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.comnamespace i18n { 28bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.comnamespace addressinput { 29bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com 30bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.comclass LookupKey; 31bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.comstruct AddressData; 32bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com 33bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// A ValidationTask object encapsulates the information necessary to perform 34bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// validation of one particular address and call a callback when that has been 35bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// done. Calling the Run() method will load required metadata, then perform 36bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// validation, call the callback and delete the ValidationTask object itself. 37bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.comclass ValidationTask { 38bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com public: 39bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com ValidationTask(const AddressData& address, 40bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com bool allow_postal, 41bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com bool require_name, 42bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com const FieldProblemMap* filter, 43bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com FieldProblemMap* problems, 44bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com const AddressValidator::Callback& validated); 45bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com 46bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com ~ValidationTask(); 47bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com 48396ee7878c98be2ad9de7120ff6e7e3745530029roubert@google.com // Calls supplier->Load(), with Validate() as callback. 499693f6426f3500db74dcfc766a130a747a571e5eroubert@google.com void Run(Supplier* supplier) const; 50bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com 51bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com private: 52bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com friend class ValidationTaskTest; 53bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com 54bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com // Uses the address metadata of |hierarchy| to validate |address_|, writing 55bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com // problems found into |problems_|, then calls the |validated_| callback and 56bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com // deletes this ValidationTask object. 57bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com void Validate(bool success, 58bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com const LookupKey& lookup_key, 599693f6426f3500db74dcfc766a130a747a571e5eroubert@google.com const Supplier::RuleHierarchy& hierarchy); 60bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com 61bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com // Checks all fields for UNEXPECTED_FIELD problems. 62b1b5b1fcaaaa95129f1f351641dd20d14bc667e3roubert@google.com void CheckUnexpectedField(const std::string& region_code) const; 63bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com 64bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com // Checks all fields for MISSING_REQUIRED_FIELD problems. 65b1b5b1fcaaaa95129f1f351641dd20d14bc667e3roubert@google.com void CheckMissingRequiredField(const std::string& region_code) const; 66bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com 67bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com // Checks the hierarchical fields for UNKNOWN_VALUE problems. 68000aa6dbb70273ccefa77a5d4cd1a400939a2666roubert@google.com void CheckUnknownValue(const Supplier::RuleHierarchy& hierarchy) const; 69bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com 70bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com // Checks the POSTAL_CODE field for problems. 71bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com void CheckPostalCodeFormatAndValue( 729693f6426f3500db74dcfc766a130a747a571e5eroubert@google.com const Supplier::RuleHierarchy& hierarchy) const; 73bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com 74bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com // Checks the STREET_ADDRESS field for USES_P_O_BOX problems. 75000aa6dbb70273ccefa77a5d4cd1a400939a2666roubert@google.com void CheckUsesPoBox(const Supplier::RuleHierarchy& hierarchy) const; 76bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com 77bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com // Writes (|field|,|problem|) to |problems_|. 78bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com void ReportProblem(AddressField field, AddressProblem problem) const; 79bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com 80bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com // Writes (|field|,|problem|) to |problems_|, if this pair should be reported. 81bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com void ReportProblemMaybe(AddressField field, AddressProblem problem) const; 82bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com 83bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com // Returns whether (|field|,|problem|) should be reported. 84bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com bool ShouldReport(AddressField field, AddressProblem problem) const; 85bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com 86bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com const AddressData& address_; 87bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com const bool allow_postal_; 88bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com const bool require_name_; 89bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com const FieldProblemMap* filter_; 90bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com FieldProblemMap* const problems_; 91bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com const AddressValidator::Callback& validated_; 929693f6426f3500db74dcfc766a130a747a571e5eroubert@google.com const scoped_ptr<const Supplier::Callback> supplied_; 93bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com const scoped_ptr<LookupKey> lookup_key_; 94bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com 95bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com DISALLOW_COPY_AND_ASSIGN(ValidationTask); 96bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com}; 97bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com 98bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com} // namespace addressinput 99bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com} // namespace i18n 100bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com 101bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com#endif // I18N_ADDRESSINPUT_VALIDATION_TASK_H_ 102