Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (C) 2013 Google Inc. | 1 // Copyright (C) 2013 Google Inc. |
| 2 // | 2 // |
| 3 // Licensed under the Apache License, Version 2.0 (the "License"); | 3 // Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 // you may not use this file except in compliance with the License. | 4 // you may not use this file except in compliance with the License. |
| 5 // You may obtain a copy of the License at | 5 // You may obtain a copy of the License at |
| 6 // | 6 // |
| 7 // http://www.apache.org/licenses/LICENSE-2.0 | 7 // http://www.apache.org/licenses/LICENSE-2.0 |
| 8 // | 8 // |
| 9 // Unless required by applicable law or agreed to in writing, software | 9 // Unless required by applicable law or agreed to in writing, software |
| 10 // distributed under the License is distributed on an "AS IS" BASIS, | 10 // distributed under the License is distributed on an "AS IS" BASIS, |
| 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 12 // See the License for the specific language governing permissions and | 12 // See the License for the specific language governing permissions and |
| 13 // limitations under the License. | 13 // limitations under the License. |
| 14 | 14 |
| 15 #include <libaddressinput/address_validator.h> | 15 #include <libaddressinput/address_validator.h> |
| 16 | 16 |
| 17 #include <libaddressinput/downloader.h> | 17 #include <libaddressinput/downloader.h> |
| 18 #include <libaddressinput/load_rules_delegate.h> | 18 #include <libaddressinput/load_rules_delegate.h> |
| 19 #include <libaddressinput/localization.h> | 19 #include <libaddressinput/localization.h> |
| 20 #include <libaddressinput/storage.h> | 20 #include <libaddressinput/storage.h> |
| 21 #include <libaddressinput/util/basictypes.h> | |
| 22 #include <libaddressinput/util/scoped_ptr.h> | |
| 21 | 23 |
| 24 #include <cassert> | |
| 25 #include <map> | |
| 22 #include <string> | 26 #include <string> |
| 27 #include <utility> | |
| 23 | 28 |
| 29 #include "country_rules_retriever.h" | |
| 24 #include "retriever.h" | 30 #include "retriever.h" |
| 31 #include "ruleset.h" | |
| 32 #include "util/stl_util.h" | |
| 25 | 33 |
| 26 namespace i18n { | 34 namespace i18n { |
| 27 namespace addressinput { | 35 namespace addressinput { |
| 28 | 36 |
| 29 AddressValidator::AddressValidator(scoped_ptr<const Downloader> downloader, | 37 namespace { |
| 30 scoped_ptr<Storage> storage, | 38 |
| 31 LoadRulesDelegate* load_rules_delegate) | 39 // Validates AddressData structure. |
| 32 : retriever_(new Retriever( | 40 class AddressValidatorImpl : public AddressValidator { |
| 41 public: | |
| 42 // Takes ownership of |downloader| and |storage|. Does not take ownership of | |
| 43 // |load_rules_delegate|. | |
| 44 AddressValidatorImpl(scoped_ptr<const Downloader> downloader, | |
| 45 scoped_ptr<Storage> storage, | |
| 46 LoadRulesDelegate* load_rules_delegate) | |
| 47 : retriever_(scoped_ptr<Retriever>(new Retriever( | |
| 33 VALIDATION_DATA_URL, | 48 VALIDATION_DATA_URL, |
| 34 downloader.Pass(), | 49 downloader.Pass(), |
| 35 scoped_ptr<Storage>(storage.Pass()))), | 50 scoped_ptr<Storage>(storage.Pass())))), |
|
Evan Stade
2014/01/08 21:08:59
I'm not sure but I don't think you need the scoped
please use gerrit instead
2014/01/09 00:38:11
Done.
| |
| 36 load_rules_delegate_(load_rules_delegate) {} | 51 load_rules_delegate_(load_rules_delegate), |
| 52 status_(), | |
| 53 rules_() {} | |
| 54 | |
| 55 virtual ~AddressValidatorImpl() { | |
| 56 STLDeleteContainerPairSecondPointers(rules_.begin(), rules_.end()); | |
|
Evan Stade
2014/01/08 21:08:59
STLDeleteValues
please use gerrit instead
2014/01/09 00:38:11
Done.
| |
| 57 } | |
| 58 | |
| 59 // AddressValidator implementation. | |
| 60 virtual void LoadRules(const std::string& country_code) { | |
| 61 std::map<std::string, Status>::const_iterator status_it = | |
| 62 status_.find(country_code); | |
| 63 if (status_it == status_.end()) { | |
| 64 assert(rules_.find(country_code) == rules_.end()); | |
| 65 status_.insert(std::make_pair(country_code, RULES_NOT_READY)); | |
|
Evan Stade
2014/01/08 21:08:59
do you really need this to be a map? It seems like
please use gerrit instead
2014/01/09 00:38:11
Done.
| |
| 66 retriever_.RetrieveRules( | |
| 67 country_code, | |
| 68 BuildScopedPtrCallback(this, &AddressValidatorImpl::OnRulesLoaded)); | |
| 69 } | |
| 70 } | |
| 71 | |
| 72 // AddressValidator implementation. | |
| 73 virtual Status ValidateAddress( | |
| 74 const AddressData& address, | |
| 75 const AddressProblemFilter& filter, | |
| 76 const Localization& localization, | |
| 77 AddressProblems* problems) const { | |
| 78 return RULES_UNAVAILABLE; | |
|
Evan Stade
2014/01/08 21:08:59
add TODO to implement (so there's no confusion abo
please use gerrit instead
2014/01/09 00:38:11
Done.
| |
| 79 } | |
| 80 | |
| 81 private: | |
| 82 // Called when CountryRulesRetriever::RetrieveRules finishes loading all rules | |
| 83 // for the |country_code|. | |
| 84 void OnRulesLoaded(bool success, | |
| 85 const std::string& country_code, | |
| 86 scoped_ptr<Ruleset> ruleset) { | |
| 87 assert(rules_.find(country_code) == rules_.end()); | |
| 88 if (success) { | |
| 89 status_[country_code] = SUCCESS; | |
| 90 rules_.insert(std::make_pair(country_code, ruleset.release())); | |
| 91 } else { | |
| 92 status_.erase(country_code); | |
| 93 } | |
| 94 if (load_rules_delegate_) { | |
| 95 load_rules_delegate_->OnAddressValidationRulesLoaded( | |
| 96 country_code, success); | |
| 97 } | |
| 98 } | |
| 99 | |
| 100 // Retrieves all rules for a country code. | |
| 101 CountryRulesRetriever retriever_; | |
| 102 | |
| 103 // An optional delegate to be invoked when rules for a country code finish | |
| 104 // loading. | |
| 105 LoadRulesDelegate* load_rules_delegate_; | |
| 106 | |
| 107 // A mapping of a country code to the status of its rule download. | |
| 108 std::map<std::string, Status> status_; | |
| 109 | |
| 110 // A mapping of a country code to all rules loaded for that country code. | |
|
Evan Stade
2014/01/08 21:08:59
Ruleset ownership comment plx
please use gerrit instead
2014/01/09 00:38:11
Done.
| |
| 111 std::map<std::string, Ruleset*> rules_; | |
| 112 | |
| 113 DISALLOW_COPY_AND_ASSIGN(AddressValidatorImpl); | |
| 114 }; | |
| 115 | |
| 116 } // namespace | |
| 37 | 117 |
| 38 AddressValidator::~AddressValidator() {} | 118 AddressValidator::~AddressValidator() {} |
| 39 | 119 |
| 40 void AddressValidator::LoadRules(const std::string& country_code) {} | 120 // static |
| 41 | 121 scoped_ptr<AddressValidator> AddressValidator::Build( |
| 42 AddressValidator::Status AddressValidator::ValidateAddress( | 122 scoped_ptr<const Downloader> downloader, |
| 43 const AddressData& address, | 123 scoped_ptr<Storage> storage, |
| 44 const AddressProblemFilter& filter, | 124 LoadRulesDelegate* load_rules_delegate) { |
| 45 const Localization& localization, | 125 return scoped_ptr<AddressValidator>(new AddressValidatorImpl( |
| 46 AddressProblems* problems) const { | 126 downloader.Pass(), storage.Pass(), load_rules_delegate)); |
| 47 return RULES_UNAVAILABLE; | |
| 48 } | 127 } |
| 49 | 128 |
| 50 } // namespace addressinput | 129 } // namespace addressinput |
| 51 } // namespace i18n | 130 } // namespace i18n |
| OLD | NEW |