Index: third_party/libaddressinput/chromium/cpp/src/retriever.cc |
diff --git a/third_party/libaddressinput/chromium/cpp/src/retriever.cc b/third_party/libaddressinput/chromium/cpp/src/retriever.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d13c04e04740347b8d43114de30cd1ac759d0710 |
--- /dev/null |
+++ b/third_party/libaddressinput/chromium/cpp/src/retriever.cc |
@@ -0,0 +1,108 @@ |
+// Copyright (C) 2013 Google Inc. |
+// |
+// Licensed under the Apache License, Version 2.0 (the "License"); |
+// you may not use this file except in compliance with the License. |
+// You may obtain a copy of the License at |
+// |
+// http://www.apache.org/licenses/LICENSE-2.0 |
+// |
+// Unless required by applicable law or agreed to in writing, software |
+// distributed under the License is distributed on an "AS IS" BASIS, |
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+// See the License for the specific language governing permissions and |
+// limitations under the License. |
+ |
+#include "retriever.h" |
+ |
+#include <libaddressinput/callback.h> |
+#include <libaddressinput/downloader.h> |
+#include <libaddressinput/storage.h> |
+#include <libaddressinput/util/basictypes.h> |
+#include <libaddressinput/util/scoped_ptr.h> |
+ |
+#include <cassert> |
+#include <cstddef> |
+#include <string> |
+ |
+#include "lookup_key_util.h" |
+ |
+namespace i18n { |
+namespace addressinput { |
+ |
+namespace { |
+ |
+class Helper { |
+ public: |
+ // Does not take ownership of its parameters. |
+ Helper(const std::string& key, |
+ const Retriever::Callback& retrieved, |
+ const LookupKeyUtil& lookup_key_util, |
+ const Downloader& downloader, |
+ Storage* storage) |
+ : retrieved_(retrieved), |
+ lookup_key_util_(lookup_key_util), |
+ downloader_(downloader), |
+ storage_(storage), |
+ downloaded_(BuildCallback(this, &Helper::OnDownloaded)), |
+ data_ready_(BuildCallback(this, &Helper::OnDataReady)) { |
+ assert(storage_ != NULL); |
+ storage_->Get(key, *data_ready_); |
+ } |
+ |
+ private: |
+ ~Helper() {} |
+ |
+ void OnDataReady(bool success, |
+ const std::string& key, |
+ const std::string& data) { |
+ if (success) { |
+ retrieved_(success, key, data); |
+ delete this; |
+ } else { |
+ downloader_.Download(lookup_key_util_.GetUrlForKey(key), |
+ *downloaded_); |
+ } |
+ } |
+ |
+ void OnDownloaded(bool success, |
+ const std::string& url, |
+ const std::string& data) { |
+ const std::string& key = lookup_key_util_.GetKeyForUrl(url); |
+ if (success) { |
+ storage_->Put(key, data); |
+ } |
+ retrieved_(success, key, success ? data : std::string()); |
+ delete this; |
+ } |
+ |
+ const Retriever::Callback& retrieved_; |
+ const LookupKeyUtil& lookup_key_util_; |
+ const Downloader& downloader_; |
+ Storage* storage_; |
+ scoped_ptr<Downloader::Callback> downloaded_; |
+ scoped_ptr<Storage::Callback> data_ready_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(Helper); |
+}; |
+ |
+} // namespace |
+ |
+Retriever::Retriever(const std::string& validation_data_url, |
+ const Downloader* downloader, |
+ Storage* storage) |
+ : lookup_key_util_(validation_data_url), |
+ downloader_(downloader), |
+ storage_(storage) { |
+ assert(storage_ != NULL); |
+ assert(downloader_ != NULL); |
+} |
+ |
+Retriever::~Retriever() {} |
+ |
+void Retriever::Retrieve(const std::string& key, |
+ const Callback& retrieved) const { |
+ new Helper(key, retrieved, lookup_key_util_, *downloader_, storage_.get()); |
+} |
+ |
+} // namespace addressinput |
+} // namespace i18n |