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