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#ifndef CHROME_BROWSER_PREFS_OVERLAY_PERSISTENT_PREF_STORE_H_
672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#define CHROME_BROWSER_PREFS_OVERLAY_PERSISTENT_PREF_STORE_H_
772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#pragma once
872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include <string>
1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/basictypes.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h"
1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/observer_list.h"
1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/prefs/pref_value_map.h"
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/common/persistent_pref_store.h"
1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// PersistentPrefStore that directs all write operations into a in-memory
1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// PrefValueMap. Read operations are first answered by the PrefValueMap.
1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// If the PrefValueMap does not contain a value for the requested key,
2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// the look-up is passed on to an underlying PersistentPrefStore |underlay_|.
2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass OverlayPersistentPrefStore : public PersistentPrefStore,
2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                   public PrefStore::Observer {
2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public:
2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  explicit OverlayPersistentPrefStore(PersistentPrefStore* underlay);
2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~OverlayPersistentPrefStore();
2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Returns true if a value has been set for the |key| in this
28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // OverlayPersistentPrefStore, i.e. if it potentially overrides a value
29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // from the |underlay_|.
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual bool IsSetInOverlay(const std::string& key) const;
31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Methods of PrefStore.
3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void AddObserver(PrefStore::Observer* observer);
3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void RemoveObserver(PrefStore::Observer* observer);
3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual bool IsInitializationComplete() const;
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual ReadResult GetValue(const std::string& key,
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                              const Value** result) const;
3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Methods of PersistentPrefStore.
40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual ReadResult GetMutableValue(const std::string& key, Value** result);
4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void SetValue(const std::string& key, Value* value);
4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void SetValueSilently(const std::string& key, Value* value);
4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void RemoveValue(const std::string& key);
4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual bool ReadOnly() const;
4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual PrefReadError ReadPrefs();
4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual bool WritePrefs();
4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void ScheduleWritePrefs();
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void CommitPendingWrite();
49dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void ReportValueChanged(const std::string& key);
5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen private:
5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Methods of PrefStore::Observer.
5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void OnPrefValueChanged(const std::string& key);
5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void OnInitializationCompleted();
5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ObserverList<PrefStore::Observer, true> observers_;
5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  PrefValueMap overlay_;
5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_refptr<PersistentPrefStore> underlay_;
5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(OverlayPersistentPrefStore);
6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen};
6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif  // CHROME_BROWSER_PREFS_OVERLAY_PERSISTENT_PREF_STORE_H_
64