1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "third_party/libaddressinput/chromium/chrome_storage_impl.h" 6 7#include "base/memory/scoped_ptr.h" 8#include "base/prefs/writeable_pref_store.h" 9#include "base/values.h" 10#include "third_party/libaddressinput/chromium/fallback_data_store.h" 11 12namespace autofill { 13 14ChromeStorageImpl::ChromeStorageImpl(WriteablePrefStore* store) 15 : backing_store_(store), 16 scoped_observer_(this) { 17 scoped_observer_.Add(backing_store_); 18} 19 20ChromeStorageImpl::~ChromeStorageImpl() {} 21 22void ChromeStorageImpl::Put(const std::string& key, std::string* data) { 23 DCHECK(data); 24 scoped_ptr<std::string> owned_data(data); 25 scoped_ptr<base::StringValue> string_value( 26 new base::StringValue(std::string())); 27 string_value->GetString()->swap(*owned_data); 28 backing_store_->SetValue(key, string_value.release()); 29} 30 31void ChromeStorageImpl::Get(const std::string& key, 32 const Storage::Callback& data_ready) const { 33 // |Get()| should not be const, so this is just a thunk that fixes that. 34 const_cast<ChromeStorageImpl*>(this)->DoGet(key, data_ready); 35} 36 37void ChromeStorageImpl::OnPrefValueChanged(const std::string& key) {} 38 39void ChromeStorageImpl::OnInitializationCompleted(bool succeeded) { 40 for (std::vector<Request*>::iterator iter = outstanding_requests_.begin(); 41 iter != outstanding_requests_.end(); ++iter) { 42 DoGet((*iter)->key, (*iter)->callback); 43 } 44 45 outstanding_requests_.clear(); 46} 47 48void ChromeStorageImpl::DoGet(const std::string& key, 49 const Storage::Callback& data_ready) { 50 if (!backing_store_->IsInitializationComplete()) { 51 outstanding_requests_.push_back(new Request(key, data_ready)); 52 return; 53 } 54 55 const base::Value* value = NULL; 56 scoped_ptr<std::string> data(new std::string); 57 if (backing_store_->GetValue(key, &value) && value->GetAsString(data.get())) { 58 data_ready(true, key, data.release()); 59 } else if (FallbackDataStore::Get(key, data.get())) { 60 data_ready(true, key, data.release()); 61 } else { 62 data_ready(false, key, NULL); 63 } 64} 65 66ChromeStorageImpl::Request::Request(const std::string& key, 67 const Callback& callback) 68 : key(key), 69 callback(callback) {} 70 71} // namespace autofill 72