pref_value_store.cc revision 5af4e3efaa07e1369024c188538dcf582ed5a21e
13345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Copyright (c) 2010 The Chromium Authors. All rights reserved.
23345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Use of this source code is governed by a BSD-style license that can be
33345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// found in the LICENSE file.
43345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
53345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/prefs/pref_value_store.h"
63345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
75af4e3efaa07e1369024c188538dcf582ed5a21eKristian Monsen#ifdef ANDROID
85af4e3efaa07e1369024c188538dcf582ed5a21eKristian Monsen#include "base/logging.h"
92d4c389cec3afa34e36dcf7cdac6383e84f473afIain Merrick#endif
1021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/prefs/pref_notifier.h"
113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenPrefValueStore::PrefStoreKeeper::PrefStoreKeeper()
1321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    : pref_value_store_(NULL),
1421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      type_(PrefValueStore::INVALID_STORE) {
1521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenPrefValueStore::PrefStoreKeeper::~PrefStoreKeeper() {
1821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (pref_store_.get())
1921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    pref_store_->RemoveObserver(this);
2021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid PrefValueStore::PrefStoreKeeper::Initialize(
2321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    PrefValueStore* store,
2421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    PrefStore* pref_store,
2521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    PrefValueStore::PrefStoreType type) {
2621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (pref_store_.get())
2721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    pref_store_->RemoveObserver(this);
2821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  type_ = type;
2921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  pref_value_store_ = store;
3021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  pref_store_.reset(pref_store);
3121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (pref_store_.get())
3221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    pref_store_->AddObserver(this);
333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid PrefValueStore::PrefStoreKeeper::OnPrefValueChanged(
3621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    const std::string& key) {
3721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  pref_value_store_->OnPrefValueChanged(type_, key);
3821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
3921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
4021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid PrefValueStore::PrefStoreKeeper::OnInitializationCompleted() {
4121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  pref_value_store_->OnInitializationCompleted(type_);
4221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
4321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
4421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenPrefValueStore::PrefValueStore(PrefStore* managed_platform_prefs,
4521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                               PrefStore* device_management_prefs,
4621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                               PrefStore* extension_prefs,
4721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                               PrefStore* command_line_prefs,
4821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                               PrefStore* user_prefs,
4921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                               PrefStore* recommended_prefs,
5021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                               PrefStore* default_prefs,
5121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                               PrefNotifier* pref_notifier)
5221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    : pref_notifier_(pref_notifier) {
5321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  InitPrefStore(MANAGED_PLATFORM_STORE, managed_platform_prefs);
5421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  InitPrefStore(DEVICE_MANAGEMENT_STORE, device_management_prefs);
5521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  InitPrefStore(EXTENSION_STORE, extension_prefs);
5621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  InitPrefStore(COMMAND_LINE_STORE, command_line_prefs);
5721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  InitPrefStore(USER_STORE, user_prefs);
5821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  InitPrefStore(RECOMMENDED_STORE, recommended_prefs);
5921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  InitPrefStore(DEFAULT_STORE, default_prefs);
6021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
6121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  CheckInitializationCompleted();
623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
643345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickPrefValueStore::~PrefValueStore() {}
653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool PrefValueStore::GetValue(const std::string& name,
673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                              Value** out_value) const {
683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Check the |PrefStore|s in order of their priority from highest to lowest
693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // to find the value of the preference described by the given preference name.
7021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  for (size_t i = 0; i <= PREF_STORE_TYPE_MAX; ++i) {
7121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    if (GetValueFromStore(name.c_str(), static_cast<PrefStoreType>(i),
72731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                          out_value))
733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return true;
743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return false;
763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid PrefValueStore::RegisterPreferenceType(const std::string& name,
793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                            Value::ValueType type) {
803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  pref_types_[name] = type;
813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
833345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickValue::ValueType PrefValueStore::GetRegisteredType(
843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const std::string& name) const {
853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  PrefTypeMap::const_iterator found = pref_types_.find(name);
863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (found == pref_types_.end())
873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return Value::TYPE_NULL;
883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return found->second;
893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool PrefValueStore::HasPrefPath(const char* path) const {
923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  Value* tmp_value = NULL;
933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const std::string name(path);
943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool rv = GetValue(name, &tmp_value);
953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Merely registering a pref doesn't count as "having" it: we require a
963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // non-default value set.
973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return rv && !PrefValueFromDefaultStore(path);
983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
10021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid PrefValueStore::NotifyPrefChanged(
10121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    const char* path,
10221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    PrefValueStore::PrefStoreType new_store) {
10321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  DCHECK(new_store != INVALID_STORE);
1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
10521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // If this pref is not registered, just discard the notification.
10621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (!pref_types_.count(path))
10721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    return;
1083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
10921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  bool changed = true;
11021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Replying that the pref has changed in case the new store is invalid may
11121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // cause problems, but it's the safer choice.
11221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (new_store != INVALID_STORE) {
11321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    PrefStoreType controller = ControllingPrefStoreForPref(path);
11421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    DCHECK(controller != INVALID_STORE);
11521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    // If the pref is controlled by a higher-priority store, its effective value
11621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    // cannot have changed.
11721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    if (controller != INVALID_STORE &&
11821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        controller < new_store) {
11921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      changed = false;
12021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    }
1213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
12221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
12321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (changed)
12421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    pref_notifier_->OnPreferenceChanged(path);
1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochbool PrefValueStore::PrefValueInManagedPlatformStore(const char* name) const {
12821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return PrefValueInStore(name, MANAGED_PLATFORM_STORE);
1294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
1304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochbool PrefValueStore::PrefValueInDeviceManagementStore(const char* name) const {
13221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return PrefValueInStore(name, DEVICE_MANAGEMENT_STORE);
1333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool PrefValueStore::PrefValueInExtensionStore(const char* name) const {
13621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return PrefValueInStore(name, EXTENSION_STORE);
1373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool PrefValueStore::PrefValueInUserStore(const char* name) const {
14021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return PrefValueInStore(name, USER_STORE);
141731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
142731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool PrefValueStore::PrefValueFromExtensionStore(const char* name) const {
14421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return ControllingPrefStoreForPref(name) == EXTENSION_STORE;
1453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool PrefValueStore::PrefValueFromUserStore(const char* name) const {
14821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return ControllingPrefStoreForPref(name) == USER_STORE;
1493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool PrefValueStore::PrefValueFromDefaultStore(const char* name) const {
15221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return ControllingPrefStoreForPref(name) == DEFAULT_STORE;
1533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool PrefValueStore::PrefValueUserModifiable(const char* name) const {
15621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  PrefStoreType effective_store = ControllingPrefStoreForPref(name);
15721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return effective_store >= USER_STORE ||
15821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen         effective_store == INVALID_STORE;
1593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
16121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Returns true if the actual value is a valid type for the expected type when
16221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// found in the given store.
16321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool PrefValueStore::IsValidType(Value::ValueType expected,
16421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                 Value::ValueType actual,
16521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                 PrefValueStore::PrefStoreType store) {
16621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (expected == actual)
16721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    return true;
16821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
16921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Dictionaries and lists are allowed to hold TYPE_NULL values too, but only
17021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // in the default pref store.
17121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (store == DEFAULT_STORE &&
17221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      actual == Value::TYPE_NULL &&
17321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      (expected == Value::TYPE_DICTIONARY || expected == Value::TYPE_LIST)) {
17421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    return true;
1753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
17621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return false;
1773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
179731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool PrefValueStore::PrefValueInStore(
180731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const char* name,
18121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    PrefValueStore::PrefStoreType store) const {
182731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Declare a temp Value* and call GetValueFromStore,
183731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // ignoring the output value.
1843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  Value* tmp_value = NULL;
185731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return GetValueFromStore(name, store, &tmp_value);
186731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
187731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
18821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool PrefValueStore::PrefValueInStoreRange(
189731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const char* name,
19021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    PrefValueStore::PrefStoreType first_checked_store,
19121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    PrefValueStore::PrefStoreType last_checked_store) const {
19221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (first_checked_store > last_checked_store) {
19321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    NOTREACHED();
19421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    return false;
19521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
19621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
19721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  for (size_t i = first_checked_store;
19821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen       i <= static_cast<size_t>(last_checked_store); ++i) {
19921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    if (PrefValueInStore(name, static_cast<PrefStoreType>(i)))
200731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return true;
2013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return false;
2033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
20521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenPrefValueStore::PrefStoreType PrefValueStore::ControllingPrefStoreForPref(
20621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    const char* name) const {
20721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  for (size_t i = 0; i <= PREF_STORE_TYPE_MAX; ++i) {
20821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    if (PrefValueInStore(name, static_cast<PrefStoreType>(i)))
20921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      return static_cast<PrefStoreType>(i);
2104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  }
21121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return INVALID_STORE;
21221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
2134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
21421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool PrefValueStore::GetValueFromStore(const char* name,
21521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                       PrefValueStore::PrefStoreType store_type,
21621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                       Value** out_value) const {
21721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Only return true if we find a value and it is the correct type, so stale
21821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // values with the incorrect type will be ignored.
21921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  const PrefStore* store = GetPrefStore(static_cast<PrefStoreType>(store_type));
22021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (store) {
22121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    switch (store->GetValue(name, out_value)) {
22221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      case PrefStore::READ_USE_DEFAULT:
22321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        store = GetPrefStore(DEFAULT_STORE);
22421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        if (!store || store->GetValue(name, out_value) != PrefStore::READ_OK) {
22521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen          *out_value = NULL;
22621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen          return false;
22721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        }
22821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        // Fall through...
22921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      case PrefStore::READ_OK:
23021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        if (IsValidType(GetRegisteredType(name),
23121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                        (*out_value)->GetType(),
23221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                        store_type)) {
23321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen          return true;
23421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        }
23521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        break;
23621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      case PrefStore::READ_NO_VALUE:
23721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        break;
23821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    }
2393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
24121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // No valid value found for the given preference name: set the return false.
24221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  *out_value = NULL;
24321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return false;
2443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
24621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid PrefValueStore::OnPrefValueChanged(PrefValueStore::PrefStoreType type,
24721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                        const std::string& key) {
24821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  NotifyPrefChanged(key.c_str(), type);
2494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
2504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
25121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid PrefValueStore::OnInitializationCompleted(
25221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    PrefValueStore::PrefStoreType type) {
25321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  CheckInitializationCompleted();
2543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2555af4e3efaa07e1369024c188538dcf582ed5a21eKristian Monsen
25621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid PrefValueStore::InitPrefStore(PrefValueStore::PrefStoreType type,
25721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                   PrefStore* pref_store) {
25821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  pref_stores_[type].Initialize(this, pref_store, type);
25921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
26021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
26121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid PrefValueStore::CheckInitializationCompleted() {
26221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  for (size_t i = 0; i <= PREF_STORE_TYPE_MAX; ++i) {
26321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    PrefStore* store = GetPrefStore(static_cast<PrefStoreType>(i));
26421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    if (store && !store->IsInitializationComplete())
26521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      return;
26621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
26721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  pref_notifier_->OnInitializationCompleted();
2683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
269