| // 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. |
| |
| #include "src/developer/debug/zxdb/client/map_setting_store.h" |
| |
| #include <lib/syslog/cpp/macros.h> |
| |
| #include "src/developer/debug/shared/logging/logging.h" |
| #include "src/developer/debug/zxdb/client/setting_schema.h" |
| |
| namespace zxdb { |
| |
| MapSettingStore::MapSettingStore(fxl::RefPtr<SettingSchema> schema, MapSettingStore* fallback) |
| : SettingStore(std::move(schema)), fallback_(fallback) {} |
| |
| void MapSettingStore::AddObserver(const std::string& setting_name, SettingStoreObserver* observer) { |
| observer_map_[setting_name].AddObserver(observer); |
| } |
| |
| void MapSettingStore::RemoveObserver(const std::string& setting_name, |
| SettingStoreObserver* observer) { |
| observer_map_[setting_name].RemoveObserver(observer); |
| } |
| |
| void MapSettingStore::NotifySettingChanged(const std::string& setting_name) const { |
| for (const auto& [key, observers] : observer_map_) { |
| if (key != setting_name) |
| continue; |
| |
| for (auto& observer : observers) |
| observer.OnSettingChanged(*this, setting_name); |
| } |
| } |
| |
| SettingValue MapSettingStore::GetStorageValue(const std::string& key) const { |
| // Explicit setting on this map. |
| if (auto it = values_.find(key); it != values_.end()) |
| return it->second; |
| |
| // Check the fallback store. |
| if (fallback_) { |
| SettingValue value = fallback_->GetStorageValue(key); |
| if (!value.is_null()) |
| return value; |
| } |
| |
| // Not found in this store. |
| return SettingValue(); |
| } |
| |
| Err MapSettingStore::SetStorageValue(const std::string& key, SettingValue value) { |
| values_[key] = std::move(value); |
| NotifySettingChanged(key); |
| return Err(); |
| } |
| |
| Err MapSettingStore::ClearStorageValue(const std::string& key) { |
| auto found = values_.find(key); |
| if (found == values_.end()) |
| return Err(); // Already gone. |
| |
| values_.erase(found); |
| NotifySettingChanged(key); |
| return Err(); |
| } |
| |
| } // namespace zxdb |