15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "third_party/libaddressinput/chromium/chrome_storage_impl.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/memory/scoped_ptr.h"
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/prefs/writeable_pref_store.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/values.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "third_party/libaddressinput/chromium/fallback_data_store.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace autofill {
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ChromeStorageImpl::ChromeStorageImpl(WriteablePrefStore* store)
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : backing_store_(store),
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      scoped_observer_(this) {
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_observer_.Add(backing_store_);
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ChromeStorageImpl::~ChromeStorageImpl() {}
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ChromeStorageImpl::Put(const std::string& key, std::string* data) {
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(data);
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<std::string> owned_data(data);
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::StringValue> string_value(
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      new base::StringValue(std::string()));
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  string_value->GetString()->swap(*owned_data);
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  backing_store_->SetValue(key, string_value.release());
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ChromeStorageImpl::Get(const std::string& key,
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            const Storage::Callback& data_ready) const {
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // |Get()| should not be const, so this is just a thunk that fixes that.
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const_cast<ChromeStorageImpl*>(this)->DoGet(key, data_ready);
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ChromeStorageImpl::OnPrefValueChanged(const std::string& key) {}
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ChromeStorageImpl::OnInitializationCompleted(bool succeeded) {
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  for (std::vector<Request*>::iterator iter = outstanding_requests_.begin();
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       iter != outstanding_requests_.end(); ++iter) {
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    DoGet((*iter)->key, (*iter)->callback);
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  outstanding_requests_.clear();
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ChromeStorageImpl::DoGet(const std::string& key,
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              const Storage::Callback& data_ready) {
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!backing_store_->IsInitializationComplete()) {
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    outstanding_requests_.push_back(new Request(key, data_ready));
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::Value* value = NULL;
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<std::string> data(new std::string);
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (backing_store_->GetValue(key, &value) && value->GetAsString(data.get())) {
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    data_ready(true, key, data.release());
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else if (FallbackDataStore::Get(key, data.get())) {
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    data_ready(true, key, data.release());
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } else {
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    data_ready(false, key, NULL);
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ChromeStorageImpl::Request::Request(const std::string& key,
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                    const Callback& callback)
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : key(key),
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      callback(callback) {}
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace autofill
72