cros_settings.h revision 68043e1e95eeb07d5cae7aca370b26518b0867d6
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef CHROME_BROWSER_CHROMEOS_SETTINGS_CROS_SETTINGS_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_CHROMEOS_SETTINGS_CROS_SETTINGS_H_ 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback_forward.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback_registry.h" 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/containers/hash_tables.h" 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/threading/non_thread_safe.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/chromeos/settings/cros_settings_names.h" 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings_provider.h" 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace base { 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass DictionaryValue; 210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)class ListValue; 2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class Value; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass DeviceSettingsService; 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class manages per-device/global settings. 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class CrosSettings : public base::NonThreadSafe { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Manage singleton instance. 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static void Initialize(); 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static bool IsInitialized(); 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static void Shutdown(); 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static CrosSettings* Get(); 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Creates a device settings service instance. This is meant for unit tests, 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // production code uses the singleton returned by Get() above. 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch explicit CrosSettings(DeviceSettingsService* device_settings_service); 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual ~CrosSettings(); 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Helper function to test if the given |path| is a valid cros setting. 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static bool IsCrosSettings(const std::string& path); 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Sets |in_value| to given |path| in cros settings. 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void Set(const std::string& path, const base::Value& in_value); 48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Returns setting value for the given |path|. 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::Value* GetPref(const std::string& path) const; 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Requests all providers to fetch their values from a trusted store, if they 53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // haven't done so yet. Returns true if the cros settings returned by |this| 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // are trusted during the current loop cycle; otherwise returns false, and 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // |callback| will be invoked later when trusted values become available. 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // PrepareTrustedValues() should be tried again in that case. 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual CrosSettingsProvider::TrustedStatus PrepareTrustedValues( 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::Closure& callback) const; 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Convenience forms of Set(). These methods will replace any existing 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // value at that |path|, even if it has a different type. 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void SetBoolean(const std::string& path, bool in_value); 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void SetInteger(const std::string& path, int in_value); 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void SetDouble(const std::string& path, double in_value); 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void SetString(const std::string& path, const std::string& in_value); 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Convenience functions for manipulating lists. Note that the following 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // functions employs a read, modify and write pattern. If underlying settings 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // provider updates its value asynchronously such as DeviceSettingsProvider, 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // value cache they read from might not be fresh and multiple calls to those 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // function would lose data. See http://crbug.com/127215 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void AppendToList(const std::string& path, const base::Value* value); 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void RemoveFromList(const std::string& path, const base::Value* value); 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // These are convenience forms of Get(). The value will be retrieved 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // and the return value will be true if the |path| is valid and the value at 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // the end of the path can be returned in the form specified. 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool GetBoolean(const std::string& path, bool* out_value) const; 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool GetInteger(const std::string& path, int* out_value) const; 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool GetDouble(const std::string& path, double* out_value) const; 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool GetString(const std::string& path, std::string* out_value) const; 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool GetList(const std::string& path, 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::ListValue** out_value) const; 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool GetDictionary(const std::string& path, 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::DictionaryValue** out_value) const; 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Helper function for the whitelist op. Implemented here because we will need 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // this in a few places. The functions searches for |email| in the pref |path| 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // It respects whitelists so foo@bar.baz will match *@bar.baz too. 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool FindEmailInList(const std::string& path, const std::string& email) const; 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Adding/removing of providers. 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool AddSettingsProvider(CrosSettingsProvider* provider); 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool RemoveSettingsProvider(CrosSettingsProvider* provider); 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Add an observer Callback for changes for the given |path|. 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef base::CallbackRegistry<void(void)>::Subscription ObserverSubscription; 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<ObserverSubscription> AddSettingsObserver( 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& path, 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::Closure& callback); 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Returns the provider that handles settings with the |path| or prefix. 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CrosSettingsProvider* GetProvider(const std::string& path) const; 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci friend class CrosSettingsTest; 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Fires system setting change callback. 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void FireObservers(const std::string& path); 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // List of ChromeOS system settings providers. 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<CrosSettingsProvider*> providers_; 113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // A map from settings names to a list of observers. Observers get fired in 115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // the order they are added. 116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) typedef base::hash_map<std::string, base::CallbackRegistry<void(void)>*> 117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SettingsObserverMap; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SettingsObserverMap settings_observers_; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CrosSettings); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper class for tests. Initializes the CrosSettings singleton on 124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// construction and tears it down again on destruction. 12546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class ScopedTestCrosSettings { 12646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public: 127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ScopedTestCrosSettings(); 128a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ~ScopedTestCrosSettings(); 129a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(ScopedTestCrosSettings); 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 133a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 134a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} // namespace chromeos 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_CHROMEOS_SETTINGS_CROS_SETTINGS_H_ 137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)