Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1498)

Unified Diff: third_party/libaddressinput/chromium/cpp/src/address_validator.cc

Issue 109323011: [rac] Download all rules for a country code in libaddressinput. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add a TODO. Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/libaddressinput/chromium/cpp/src/address_validator.cc
diff --git a/third_party/libaddressinput/chromium/cpp/src/address_validator.cc b/third_party/libaddressinput/chromium/cpp/src/address_validator.cc
index 0732826b9562917ab6b6c7bad98351cb347e3afe..ba48487649b67e35119199e97e44c89a50f9abf9 100644
--- a/third_party/libaddressinput/chromium/cpp/src/address_validator.cc
+++ b/third_party/libaddressinput/chromium/cpp/src/address_validator.cc
@@ -18,33 +18,109 @@
#include <libaddressinput/load_rules_delegate.h>
#include <libaddressinput/localization.h>
#include <libaddressinput/storage.h>
+#include <libaddressinput/util/basictypes.h>
+#include <libaddressinput/util/scoped_ptr.h>
+#include <cassert>
+#include <cstddef>
+#include <map>
+#include <set>
#include <string>
+#include "country_rules_aggregator.h"
#include "retriever.h"
+#include "ruleset.h"
+#include "util/stl_util.h"
namespace i18n {
namespace addressinput {
-AddressValidator::AddressValidator(scoped_ptr<const Downloader> downloader,
- scoped_ptr<Storage> storage,
- LoadRulesDelegate* load_rules_delegate)
- : retriever_(new Retriever(
+namespace {
+
+// Validates AddressData structure.
+class AddressValidatorImpl : public AddressValidator {
+ public:
+ // Takes ownership of |downloader| and |storage|. Does not take ownership of
+ // |load_rules_delegate|.
+ AddressValidatorImpl(scoped_ptr<const Downloader> downloader,
+ scoped_ptr<Storage> storage,
+ LoadRulesDelegate* load_rules_delegate)
+ : aggregator_(scoped_ptr<Retriever>(new Retriever(
VALIDATION_DATA_URL,
downloader.Pass(),
- scoped_ptr<Storage>(storage.Pass()))),
- load_rules_delegate_(load_rules_delegate) {}
+ storage.Pass()))),
+ load_rules_delegate_(load_rules_delegate),
+ loading_rules_(),
+ rules_() {}
-AddressValidator::~AddressValidator() {}
+ virtual ~AddressValidatorImpl() {
+ STLDeleteValues(&rules_);
+ }
+
+ // AddressValidator implementation.
+ virtual void LoadRules(const std::string& country_code) {
+ if (rules_.find(country_code) == rules_.end() &&
+ loading_rules_.find(country_code) == loading_rules_.end()) {
+ loading_rules_.insert(country_code);
+ aggregator_.AggregateRules(
+ country_code,
+ BuildScopedPtrCallback(this, &AddressValidatorImpl::OnRulesLoaded));
+ }
+ }
+
+ // AddressValidator implementation.
+ virtual Status ValidateAddress(
+ const AddressData& address,
+ const AddressProblemFilter& filter,
+ const Localization& localization,
+ AddressProblems* problems) const {
+ // TODO(rouslan): Validate the address.
+ return RULES_UNAVAILABLE;
+ }
+
+ private:
+ // Called when CountryRulesAggregator::AggregateRules loads the |ruleset| for
+ // the |country_code|.
+ void OnRulesLoaded(bool success,
+ const std::string& country_code,
+ scoped_ptr<Ruleset> ruleset) {
+ assert(rules_.find(country_code) == rules_.end());
+ loading_rules_.erase(country_code);
+ if (success) {
+ rules_[country_code] = ruleset.release();
+ }
+ if (load_rules_delegate_ != NULL) {
+ load_rules_delegate_->OnAddressValidationRulesLoaded(
+ country_code, success);
+ }
+ }
+
+ // Loads the ruleset for a country code.
+ CountryRulesAggregator aggregator_;
-void AddressValidator::LoadRules(const std::string& country_code) {}
+ // An optional delegate to be invoked when a ruleset finishes loading.
+ LoadRulesDelegate* load_rules_delegate_;
+
+ // A set of country codes for which a ruleset is being loaded.
+ std::set<std::string> loading_rules_;
+
+ // A mapping of a country code to the owned ruleset for that country code.
+ std::map<std::string, Ruleset*> rules_;
+
+ DISALLOW_COPY_AND_ASSIGN(AddressValidatorImpl);
+};
+
+} // namespace
+
+AddressValidator::~AddressValidator() {}
-AddressValidator::Status AddressValidator::ValidateAddress(
- const AddressData& address,
- const AddressProblemFilter& filter,
- const Localization& localization,
- AddressProblems* problems) const {
- return RULES_UNAVAILABLE;
+// static
+scoped_ptr<AddressValidator> AddressValidator::Build(
+ scoped_ptr<const Downloader> downloader,
+ scoped_ptr<Storage> storage,
+ LoadRulesDelegate* load_rules_delegate) {
+ return scoped_ptr<AddressValidator>(new AddressValidatorImpl(
+ downloader.Pass(), storage.Pass(), load_rules_delegate));
}
} // namespace addressinput

Powered by Google App Engine
This is Rietveld 408576698