172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// found in the LICENSE file. 472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/prefs/overlay_persistent_pref_store.h" 672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/values.h" 8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenOverlayPersistentPrefStore::OverlayPersistentPrefStore( 1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen PersistentPrefStore* underlay) 1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen : underlay_(underlay) { 1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen underlay_->AddObserver(this); 1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenOverlayPersistentPrefStore::~OverlayPersistentPrefStore() { 1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen underlay_->RemoveObserver(this); 1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool OverlayPersistentPrefStore::IsSetInOverlay(const std::string& key) const { 19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return overlay_.GetValue(key, NULL); 20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid OverlayPersistentPrefStore::AddObserver(PrefStore::Observer* observer) { 2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen observers_.AddObserver(observer); 2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid OverlayPersistentPrefStore::RemoveObserver(PrefStore::Observer* observer) { 2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen observers_.RemoveObserver(observer); 2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool OverlayPersistentPrefStore::IsInitializationComplete() const { 3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return underlay_->IsInitializationComplete(); 3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenPrefStore::ReadResult OverlayPersistentPrefStore::GetValue( 35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string& key, 36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const Value** result) const { 3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (overlay_.GetValue(key, result)) 3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return READ_OK; 3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return underlay_->GetValue(key, result); 4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenPrefStore::ReadResult OverlayPersistentPrefStore::GetMutableValue( 43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string& key, 44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Value** result) { 45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (overlay_.GetValue(key, result)) 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return READ_OK; 47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Try to create copy of underlay if the overlay does not contain a value. 49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Value* underlay_value = NULL; 50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PrefStore::ReadResult read_result = 51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen underlay_->GetMutableValue(key, &underlay_value); 52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (read_result == READ_OK) { 53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *result = underlay_value->DeepCopy(); 54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen overlay_.SetValue(key, *result); 55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return READ_OK; 56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Return read failure if underlay stores no value for |key|. 58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return read_result; 59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid OverlayPersistentPrefStore::SetValue(const std::string& key, 6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Value* value) { 6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (overlay_.SetValue(key, value)) 6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen FOR_EACH_OBSERVER(PrefStore::Observer, observers_, OnPrefValueChanged(key)); 6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid OverlayPersistentPrefStore::SetValueSilently(const std::string& key, 6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Value* value) { 6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen overlay_.SetValue(key, value); 7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid OverlayPersistentPrefStore::RemoveValue(const std::string& key) { 7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (overlay_.RemoveValue(key)) 7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen FOR_EACH_OBSERVER(PrefStore::Observer, observers_, OnPrefValueChanged(key)); 7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool OverlayPersistentPrefStore::ReadOnly() const { 7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return false; 7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenPersistentPrefStore::PrefReadError OverlayPersistentPrefStore::ReadPrefs() { 8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // We do not read intentionally. 8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return PersistentPrefStore::PREF_READ_ERROR_NONE; 8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool OverlayPersistentPrefStore::WritePrefs() { 8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // We do not write intentionally. 8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return true; 8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid OverlayPersistentPrefStore::ScheduleWritePrefs() { 9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // We do not write intentionally. 9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid OverlayPersistentPrefStore::CommitPendingWrite() { 96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // We do not write intentionally. 97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 99dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid OverlayPersistentPrefStore::ReportValueChanged(const std::string& key) { 100dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen FOR_EACH_OBSERVER(PrefStore::Observer, observers_, OnPrefValueChanged(key)); 101dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 102dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid OverlayPersistentPrefStore::OnPrefValueChanged(const std::string& key) { 10472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!overlay_.GetValue(key, NULL)) 10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen FOR_EACH_OBSERVER(PrefStore::Observer, observers_, OnPrefValueChanged(key)); 10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid OverlayPersistentPrefStore::OnInitializationCompleted() { 10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen FOR_EACH_OBSERVER(PrefStore::Observer, observers_, 11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen OnInitializationCompleted()); 11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 112