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)