1 // Copyright (c) 2011 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 "chrome/browser/prefs/overlay_persistent_pref_store.h" 6 7 #include "base/values.h" 8 9 OverlayPersistentPrefStore::OverlayPersistentPrefStore( 10 PersistentPrefStore* underlay) 11 : underlay_(underlay) { 12 underlay_->AddObserver(this); 13 } 14 OverlayPersistentPrefStore::~OverlayPersistentPrefStore() { 15 underlay_->RemoveObserver(this); 16 } 17 18 bool OverlayPersistentPrefStore::IsSetInOverlay(const std::string& key) const { 19 return overlay_.GetValue(key, NULL); 20 } 21 22 void OverlayPersistentPrefStore::AddObserver(PrefStore::Observer* observer) { 23 observers_.AddObserver(observer); 24 } 25 26 void OverlayPersistentPrefStore::RemoveObserver(PrefStore::Observer* observer) { 27 observers_.RemoveObserver(observer); 28 } 29 30 bool OverlayPersistentPrefStore::IsInitializationComplete() const { 31 return underlay_->IsInitializationComplete(); 32 } 33 34 PrefStore::ReadResult OverlayPersistentPrefStore::GetValue( 35 const std::string& key, 36 const Value** result) const { 37 if (overlay_.GetValue(key, result)) 38 return READ_OK; 39 return underlay_->GetValue(key, result); 40 } 41 42 PrefStore::ReadResult OverlayPersistentPrefStore::GetMutableValue( 43 const std::string& key, 44 Value** result) { 45 if (overlay_.GetValue(key, result)) 46 return READ_OK; 47 48 // Try to create copy of underlay if the overlay does not contain a value. 49 Value* underlay_value = NULL; 50 PrefStore::ReadResult read_result = 51 underlay_->GetMutableValue(key, &underlay_value); 52 if (read_result == READ_OK) { 53 *result = underlay_value->DeepCopy(); 54 overlay_.SetValue(key, *result); 55 return READ_OK; 56 } 57 // Return read failure if underlay stores no value for |key|. 58 return read_result; 59 } 60 61 void OverlayPersistentPrefStore::SetValue(const std::string& key, 62 Value* value) { 63 if (overlay_.SetValue(key, value)) 64 FOR_EACH_OBSERVER(PrefStore::Observer, observers_, OnPrefValueChanged(key)); 65 } 66 67 void OverlayPersistentPrefStore::SetValueSilently(const std::string& key, 68 Value* value) { 69 overlay_.SetValue(key, value); 70 } 71 72 void OverlayPersistentPrefStore::RemoveValue(const std::string& key) { 73 if (overlay_.RemoveValue(key)) 74 FOR_EACH_OBSERVER(PrefStore::Observer, observers_, OnPrefValueChanged(key)); 75 } 76 77 bool OverlayPersistentPrefStore::ReadOnly() const { 78 return false; 79 } 80 81 PersistentPrefStore::PrefReadError OverlayPersistentPrefStore::ReadPrefs() { 82 // We do not read intentionally. 83 return PersistentPrefStore::PREF_READ_ERROR_NONE; 84 } 85 86 bool OverlayPersistentPrefStore::WritePrefs() { 87 // We do not write intentionally. 88 return true; 89 } 90 91 void OverlayPersistentPrefStore::ScheduleWritePrefs() { 92 // We do not write intentionally. 93 } 94 95 void OverlayPersistentPrefStore::CommitPendingWrite() { 96 // We do not write intentionally. 97 } 98 99 void OverlayPersistentPrefStore::ReportValueChanged(const std::string& key) { 100 FOR_EACH_OBSERVER(PrefStore::Observer, observers_, OnPrefValueChanged(key)); 101 } 102 103 void OverlayPersistentPrefStore::OnPrefValueChanged(const std::string& key) { 104 if (!overlay_.GetValue(key, NULL)) 105 FOR_EACH_OBSERVER(PrefStore::Observer, observers_, OnPrefValueChanged(key)); 106 } 107 108 void OverlayPersistentPrefStore::OnInitializationCompleted() { 109 FOR_EACH_OBSERVER(PrefStore::Observer, observers_, 110 OnInitializationCompleted()); 111 } 112