buffet: Use DictionaryValue in StorageInterface It is used to store dictionaries only. BUG=none TEST='FEATURES=test emerge-gizmo buffet' Change-Id: Ic85f77a3d31853bf8ed244d7f58264e9c809f666 Reviewed-on: https://chromium-review.googlesource.com/271301 Reviewed-by: Alex Vakulenko <avakulenko@chromium.org> Reviewed-by: Vitaly Buka <vitalybuka@chromium.org> Commit-Queue: Vitaly Buka <vitalybuka@chromium.org> Tested-by: Vitaly Buka <vitalybuka@chromium.org>
diff --git a/buffet/storage_impls.cc b/buffet/storage_impls.cc index e45ddbf..ea29d69 100644 --- a/buffet/storage_impls.cc +++ b/buffet/storage_impls.cc
@@ -10,33 +10,35 @@ #include <base/json/json_reader.h> #include <base/json/json_writer.h> +#include "buffet/utils.h" + namespace buffet { FileStorage::FileStorage(const base::FilePath& file_path) : file_path_(file_path) { } -std::unique_ptr<base::Value> FileStorage::Load() { +std::unique_ptr<base::DictionaryValue> FileStorage::Load() { std::string json; if (!base::ReadFileToString(file_path_, &json)) - return std::unique_ptr<base::Value>(); + return std::unique_ptr<base::DictionaryValue>(); - return std::unique_ptr<base::Value>(base::JSONReader::Read(json)); + return LoadJsonDict(json, nullptr); } -bool FileStorage::Save(const base::Value& config) { +bool FileStorage::Save(const base::DictionaryValue& config) { std::string json; base::JSONWriter::WriteWithOptions( &config, base::JSONWriter::OPTIONS_PRETTY_PRINT, &json); return base::ImportantFileWriter::WriteFileAtomically(file_path_, json); } - -std::unique_ptr<base::Value> MemStorage::Load() { - return std::unique_ptr<base::Value>(cache_->DeepCopy()); +std::unique_ptr<base::DictionaryValue> MemStorage::Load() { + return std::unique_ptr<base::DictionaryValue>(cache_.DeepCopy()); } -bool MemStorage::Save(const base::Value& config) { - cache_.reset(config.DeepCopy()); +bool MemStorage::Save(const base::DictionaryValue& config) { + cache_.Clear(); + cache_.MergeDictionary(&config); ++save_count_; return true; }
diff --git a/buffet/storage_impls.h b/buffet/storage_impls.h index f4034be..bacedd0 100644 --- a/buffet/storage_impls.h +++ b/buffet/storage_impls.h
@@ -18,8 +18,8 @@ public: explicit FileStorage(const base::FilePath& file_path); virtual ~FileStorage() = default; - std::unique_ptr<base::Value> Load() override; - bool Save(const base::Value& config) override; + std::unique_ptr<base::DictionaryValue> Load() override; + bool Save(const base::DictionaryValue& config) override; private: base::FilePath file_path_; @@ -31,14 +31,14 @@ public: MemStorage() = default; virtual ~MemStorage() = default; - std::unique_ptr<base::Value> Load() override; - bool Save(const base::Value& config) override; + std::unique_ptr<base::DictionaryValue> Load() override; + bool Save(const base::DictionaryValue& config) override; int save_count() { return save_count_; } void reset_save_count() { save_count_ = 0; } private: int save_count_ = 0; - std::unique_ptr<base::Value> cache_; + base::DictionaryValue cache_; DISALLOW_COPY_AND_ASSIGN(MemStorage); };
diff --git a/buffet/storage_interface.h b/buffet/storage_interface.h index 4f05235..d36e56d 100644 --- a/buffet/storage_interface.h +++ b/buffet/storage_interface.h
@@ -15,16 +15,14 @@ // the details of this storage behind an interface for test purposes. class StorageInterface { public: - // Load the device registration configuration from storage. - // If it fails (e.g. the storage container [file?] doesn't exist), then - // it returns empty unique_ptr (aka nullptr). - virtual std::unique_ptr<base::Value> Load() = 0; + // Load the dictionary from storage. If it fails (e.g. the storage container + // [file?] doesn't exist), then it returns empty unique_ptr (aka nullptr). + virtual std::unique_ptr<base::DictionaryValue> Load() = 0; - // Save the device registration configuration to storage. - // If saved successfully, returns true. Could fail when writing to - // physical storage like file system for various reasons (out of disk space, - // access permissions, etc). - virtual bool Save(const base::Value& config) = 0; + // Save the dictionary to storage. If saved successfully, returns true. Could + // fail when writing to physical storage like file system for various reasons + // (out of disk space,access permissions, etc). + virtual bool Save(const base::DictionaryValue& config) = 0; }; } // namespace buffet
diff --git a/buffet/utils.cc b/buffet/utils.cc index 7e50d0f..707b19d 100644 --- a/buffet/utils.cc +++ b/buffet/utils.cc
@@ -36,8 +36,9 @@ const char kInvalidCategoryError[] = "invalid_category"; const char kInvalidPackageError[] = "invalid_package"; -std::unique_ptr<const base::DictionaryValue> LoadJsonDict( - const base::FilePath& json_file_path, chromeos::ErrorPtr* error) { +std::unique_ptr<base::DictionaryValue> LoadJsonDict( + const base::FilePath& json_file_path, + chromeos::ErrorPtr* error) { std::string json_string; if (!base::ReadFileToString(json_file_path, &json_string)) { chromeos::errors::system::AddSystemError(error, FROM_HERE, errno); @@ -50,9 +51,10 @@ return LoadJsonDict(json_string, error); } -std::unique_ptr<const base::DictionaryValue> LoadJsonDict( - const std::string& json_string, chromeos::ErrorPtr* error) { - std::unique_ptr<const base::DictionaryValue> result; +std::unique_ptr<base::DictionaryValue> LoadJsonDict( + const std::string& json_string, + chromeos::ErrorPtr* error) { + std::unique_ptr<base::DictionaryValue> result; std::string error_message; base::Value* value = base::JSONReader::ReadAndReturnError( json_string, base::JSON_PARSE_RFC, nullptr, &error_message); @@ -65,7 +67,7 @@ error_message.c_str()); return result; } - const base::DictionaryValue* dict_value = nullptr; + base::DictionaryValue* dict_value = nullptr; if (!value->GetAsDictionary(&dict_value)) { delete value; chromeos::Error::AddToPrintf(error, FROM_HERE,
diff --git a/buffet/utils.h b/buffet/utils.h index 0325171..8e4bfd6 100644 --- a/buffet/utils.h +++ b/buffet/utils.h
@@ -30,12 +30,14 @@ // Helper function to load a JSON file that is expected to be // an object/dictionary. In case of error, returns empty unique ptr and fills // in error details in |error|. -std::unique_ptr<const base::DictionaryValue> LoadJsonDict( - const base::FilePath& json_file_path, chromeos::ErrorPtr* error); +std::unique_ptr<base::DictionaryValue> LoadJsonDict( + const base::FilePath& json_file_path, + chromeos::ErrorPtr* error); // Helper function to load a JSON dictionary from a string. -std::unique_ptr<const base::DictionaryValue> LoadJsonDict( - const std::string& json_string, chromeos::ErrorPtr* error); +std::unique_ptr<base::DictionaryValue> LoadJsonDict( + const std::string& json_string, + chromeos::ErrorPtr* error); // Synchronously resolves the |host| and connects a socket to the resolved // address/port.