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