| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef SRC_DEVELOPER_DEBUG_ZXDB_CLIENT_MAP_SETTING_STORE_H_ |
| #define SRC_DEVELOPER_DEBUG_ZXDB_CLIENT_MAP_SETTING_STORE_H_ |
| |
| #include <map> |
| #include <memory> |
| |
| #include "src/developer/debug/zxdb/client/setting_store.h" |
| #include "src/developer/debug/zxdb/client/setting_store_observer.h" |
| #include "src/lib/fxl/observer_list.h" |
| |
| namespace zxdb { |
| |
| // An implementation of SettingStore that just stores the values in a map. This is used for |
| // standalone settings where there is no separate object backing the storage. |
| // |
| // This type of SettingStore also implements fallback for hierarchical settings. If a value is |
| // not explicitly set in the current store, it will recursively query fallback stores until a |
| // value is found. |
| class MapSettingStore : public SettingStore { |
| public: |
| explicit MapSettingStore(fxl::RefPtr<SettingSchema> schema, MapSettingStore* fallback = nullptr); |
| |
| SettingStore* fallback() const { return fallback_; } |
| void set_fallback(MapSettingStore* fallback) { fallback_ = fallback; } |
| |
| void AddObserver(const std::string& setting_name, SettingStoreObserver*); |
| void RemoveObserver(const std::string& setting_name, SettingStoreObserver*); |
| |
| protected: |
| // SettingStore implementation. |
| virtual SettingValue GetStorageValue(const std::string& key) const override; |
| virtual Err SetStorageValue(const std::string& key, SettingValue value) override; |
| virtual Err ClearStorageValue(const std::string& key) override; |
| |
| private: |
| void NotifySettingChanged(const std::string& setting_name) const; |
| |
| // SettingStore this store lookup settings when it cannot find them locally. Can be null. If set, |
| // must outlive |this|. |
| MapSettingStore* fallback_; |
| std::map<std::string, SettingValue> values_; |
| |
| std::map<std::string, fxl::ObserverList<SettingStoreObserver>> observer_map_; |
| |
| FXL_DISALLOW_COPY_AND_ASSIGN(MapSettingStore); |
| }; |
| |
| } // namespace zxdb |
| |
| #endif // SRC_DEVELOPER_DEBUG_ZXDB_CLIENT_MAP_SETTING_STORE_H_ |