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