Home | History | Annotate | Download | only in chromeos
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_CHROMEOS_CROS_SETTINGS_H_
      6 #define CHROME_BROWSER_CHROMEOS_CROS_SETTINGS_H_
      7 #pragma once
      8 
      9 #include <string>
     10 #include <vector>
     11 
     12 #include "base/hash_tables.h"
     13 #include "base/memory/singleton.h"
     14 #include "base/observer_list.h"
     15 #include "base/threading/non_thread_safe.h"
     16 #include "chrome/browser/chromeos/cros_settings_names.h"
     17 #include "content/common/notification_observer.h"
     18 
     19 namespace base {
     20 template <typename T> struct DefaultLazyInstanceTraits;
     21 }
     22 
     23 class Value;
     24 
     25 namespace chromeos {
     26 
     27 class CrosSettingsProvider;
     28 
     29 // A class manages per-device/global settings.
     30 class CrosSettings : public base::NonThreadSafe {
     31  public:
     32   // Class factory.
     33   static CrosSettings* Get();
     34 
     35   // Helper function to test if given path is a value cros settings name.
     36   static bool IsCrosSettings(const std::string& path);
     37 
     38   // Sets |in_value| to given |path| in cros settings.
     39   // Note that this takes ownership of |in_value|.
     40   void Set(const std::string& path, Value* in_value);
     41 
     42   // Fires system setting change notification.
     43   void FireObservers(const char* path);
     44 
     45   // Gets settings value of given |path| to |out_value|.
     46   // Note that the caller owns |out_value| returned.
     47   bool Get(const std::string& path, Value** out_value) const;
     48 
     49   // Convenience forms of Set().  These methods will replace any existing
     50   // value at that path, even if it has a different type.
     51   void SetBoolean(const std::string& path, bool in_value);
     52   void SetInteger(const std::string& path, int in_value);
     53   void SetDouble(const std::string& path, double in_value);
     54   void SetString(const std::string& path, const std::string& in_value);
     55 
     56   // These are convenience forms of Get().  The value will be retrieved
     57   // and the return value will be true if the path is valid and the value at
     58   // the end of the path can be returned in the form specified.
     59   bool GetBoolean(const std::string& path, bool* out_value) const;
     60   bool GetInteger(const std::string& path, int* out_value) const;
     61   bool GetDouble(const std::string& path, double* out_value) const;
     62   bool GetString(const std::string& path, std::string* out_value) const;
     63 
     64   // adding/removing of providers
     65   bool AddSettingsProvider(CrosSettingsProvider* provider);
     66   bool RemoveSettingsProvider(CrosSettingsProvider* provider);
     67 
     68   // If the pref at the given path changes, we call the observer's Observe
     69   // method with PREF_CHANGED.
     70   void AddSettingsObserver(const char* path, NotificationObserver* obs);
     71   void RemoveSettingsObserver(const char* path, NotificationObserver* obs);
     72 
     73  private:
     74   // List of ChromeOS system settings providers.
     75   std::vector<CrosSettingsProvider*> providers_;
     76 
     77   // A map from settings names to a list of observers. Observers get fired in
     78   // the order they are added.
     79   typedef ObserverList<NotificationObserver> NotificationObserverList;
     80   typedef base::hash_map<std::string, NotificationObserverList*>
     81       SettingsObserverMap;
     82   SettingsObserverMap settings_observers_;
     83 
     84   CrosSettings();
     85   ~CrosSettings();
     86   CrosSettingsProvider* GetProvider(const std::string& path) const;
     87   friend struct base::DefaultLazyInstanceTraits<CrosSettings>;
     88 
     89   DISALLOW_COPY_AND_ASSIGN(CrosSettings);
     90 };
     91 
     92 }  // namespace chromeos
     93 
     94 #endif  // CHROME_BROWSER_CHROMEOS_CROS_SETTINGS_H_
     95