blob: 885b7c0623d955fbcf7f71c7925cba6cb4f1e602 [file] [log] [blame]
// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_PREF_VALUE_STORE_H_
#define CHROME_BROWSER_PREF_VALUE_STORE_H_
#include "base/basictypes.h"
#include "base/file_path.h"
#include "base/string16.h"
#include "base/scoped_ptr.h"
#include "base/values.h"
#include "chrome/common/pref_store.h"
class PrefStore;
// The class PrefValueStore provides values for preferences. Each Preference
// has a unique name. This name is used to retrieve the value of a Preference.
// The value of a preference can be either managed, user-defined or recommended.
// Managed preference values are set (managed) by a third person (like an
// admin for example). They have the highest priority and can not be
// altered by the user.
// User-defined values are chosen by the user. If there is already
// a managed value for a preference the user-defined value is ignored and
// the managed value is used (returned).
// Otherwise user-defined values have a higher precedence than recommended
// values. Recommended preference values are set by a third person
// (like an admin).
class PrefValueStore {
public:
// In decreasing order of precedence:
// |managed_prefs| contains all managed (policy) preference values.
// |extension_prefs| contains preference values set by extensions.
// |command_line_prefs| contains preference values set by command-line
// switches.
// |user_prefs| contains all user-set preference values.
// |recommended_prefs| contains all recommended (policy) preference values.
PrefValueStore(PrefStore* managed_prefs,
PrefStore* extension_prefs,
PrefStore* command_line_prefs,
PrefStore* user_prefs,
PrefStore* recommended_prefs);
~PrefValueStore();
// Get the preference value for the given preference name.
// Return true if a value for the given preference name was found.
bool GetValue(const std::wstring& name, Value** out_value) const;
// Read preference values into the three PrefStores so that they are available
// through the GetValue method. Return the first error that occurs (but
// continue reading the remaining PrefStores).
PrefStore::PrefReadError ReadPrefs();
// Persists prefs (to disk or elsewhere). Returns true if writing values was
// successful. In practice, only the user prefs are expected to be written
// out.
bool WritePrefs();
// Calls the method ScheduleWritePrefs on the PrefStores. In practice, only
// the user prefs are expected to be written out.
void ScheduleWritePrefs();
// Returns true if the PrefValueStore contains the given preference.
bool HasPrefPath(const wchar_t* name) const;
// Returns true if the PrefValueStore is read-only.
// Because the managed and recommended PrefStores are always read-only, the
// PrefValueStore as a whole is read-only if the PrefStore containing the user
// preferences is read-only.
bool ReadOnly();
// Alters the user-defined value of a preference. Even if the preference is
// managed this method allows the user-defined value of the preference to be
// set. But GetValue calls will not return this value as long as the
// preference is managed. Instead GetValue will return the managed value
// of the preference. Note that the PrefValueStore takes the ownership of
// the value referenced by |in_value|. It is an error to call this when no
// user PrefStore has been set.
void SetUserPrefValue(const wchar_t* name, Value* in_value);
// Removes a value from the PrefValueStore. If a preference is managed
// or recommended this function should have no effect.
void RemoveUserPrefValue(const wchar_t* name);
// These methods return true if a preference with the given name is in the
// indicated pref store, even if that value is currently being overridden by
// a higher-priority source.
bool PrefValueInManagedStore(const wchar_t* name);
bool PrefValueInExtensionStore(const wchar_t* name);
bool PrefValueInUserStore(const wchar_t* name);
// These methods return true if a preference with the given name is actually
// being controlled by the indicated pref store and not being overridden by
// a higher-priority source.
bool PrefValueFromExtensionStore(const wchar_t* name);
bool PrefValueFromUserStore(const wchar_t* name);
private:
// PrefStores must be listed here in order from highest to lowest priority.
enum PrefStoreType {
MANAGED = 0,
EXTENSION,
COMMAND_LINE,
USER,
RECOMMENDED,
PREF_STORE_TYPE_MAX = RECOMMENDED
};
scoped_ptr<PrefStore> pref_stores_[PREF_STORE_TYPE_MAX + 1];
bool PrefValueInStore(const wchar_t* name, PrefStoreType type);
bool PrefValueFromStore(const wchar_t* name, PrefStoreType type);
DISALLOW_COPY_AND_ASSIGN(PrefValueStore);
};
#endif // CHROME_BROWSER_PREF_VALUE_STORE_H_