diff --git a/internal/platform/implementation/linux/preferences_manager.cc b/internal/platform/implementation/linux/preferences_manager.cc index 392ee425..9779cefd 100644 --- a/internal/platform/implementation/linux/preferences_manager.cc +++ b/internal/platform/implementation/linux/preferences_manager.cc @@ -29,6 +29,8 @@ #include "internal/platform/implementation/platform.h" #include "nlohmann/json.hpp" #include "nlohmann/json_fwd.hpp" +#include "google/protobuf/json/json.h" +#include "google/protobuf/message.h" namespace nearby { namespace linux { @@ -113,6 +115,16 @@ bool PreferencesManager::SetTime(absl::string_view key, absl::Time value) { return Commit(); } +bool PreferencesManager::SetProtoMessage( + absl::string_view key, const google::protobuf::Message& value) { + std::string json_string; + if (!google::protobuf::json::MessageToJsonString(value, &json_string).ok()) { + return false; + } + absl::MutexLock lock(&mutex_); + return SetValue(key, json::parse(json_string)); +} + // Get JSON value. json PreferencesManager::Get(absl::string_view key, const json& default_value) const { @@ -179,12 +191,35 @@ absl::Time PreferencesManager::GetTime(absl::string_view key, return absl::FromUnixNanos(result->get()); } +bool PreferencesManager::GetProtoMessage(absl::string_view key, + google::protobuf::Message* value) const { + absl::MutexLock lock(&mutex_); + auto result = value_.find(absl::StrCat(key)); + if (result == value_.end()) { + return false; + } + return google::protobuf::json::JsonStringToMessage(result->dump(), value).ok(); +} + // Removes preferences void PreferencesManager::Remove(absl::string_view key) { absl::MutexLock lock(&mutex_); value_.erase(absl::StrCat(key)); } +bool PreferencesManager::RemoveKeyPrefix(absl::string_view prefix) { + absl::MutexLock lock(&mutex_); + auto it = value_.begin(); + while (it != value_.end()) { + if (it.key().starts_with(prefix)) { + it = value_.erase(it); + } else { + ++it; + } + } + return true; +} + // Private methods // Writes data to storage. diff --git a/internal/platform/implementation/linux/preferences_manager.h b/internal/platform/implementation/linux/preferences_manager.h index 860fdb04..5b11e141 100644 --- a/internal/platform/implementation/linux/preferences_manager.h +++ b/internal/platform/implementation/linux/preferences_manager.h @@ -30,6 +30,7 @@ #include "internal/platform/implementation/preferences_manager.h" #include "nlohmann/json.hpp" #include "nlohmann/json_fwd.hpp" +#include "google/protobuf/message.h" namespace nearby { namespace linux { @@ -72,6 +73,10 @@ class PreferencesManager : public api::PreferencesManager { bool SetTime(absl::string_view key, absl::Time value) override ABSL_LOCKS_EXCLUDED(mutex_); + bool SetProtoMessage(absl::string_view key, + const google::protobuf::Message& value) override + ABSL_LOCKS_EXCLUDED(mutex_); + // Gets values nlohmann::json Get(absl::string_view key, const nlohmann::json& default_value) const override @@ -105,8 +110,14 @@ class PreferencesManager : public api::PreferencesManager { absl::Time default_value) const override ABSL_LOCKS_EXCLUDED(mutex_); + bool GetProtoMessage(absl::string_view key, + google::protobuf::Message* value) const override + ABSL_LOCKS_EXCLUDED(mutex_); + // Removes preferences void Remove(absl::string_view key) override ABSL_LOCKS_EXCLUDED(mutex_); + bool RemoveKeyPrefix(absl::string_view prefix) override + ABSL_LOCKS_EXCLUDED(mutex_); private: // Writes data to storage.