Commit 3b92bcc9 authored by Nikita Podguzov's avatar Nikita Podguzov Committed by Commit Bot

Use |base::Value| in CloudDeviceDescription.

Bug: 848942
Change-Id: I5e98582e5d1a949c8db25846068655ed2c551068
Reviewed-on: https://chromium-review.googlesource.com/c/1454897
Commit-Queue: Nikita Podguzov <nikitapodguzov@google.com>
Reviewed-by: default avatarLei Zhang <thestig@chromium.org>
Reviewed-by: default avatarVladislav Kuzkokov <vkuzkokov@chromium.org>
Cr-Commit-Position: refs/heads/master@{#629937}
parent 446495bd
...@@ -15,8 +15,8 @@ ...@@ -15,8 +15,8 @@
namespace cloud_devices { namespace cloud_devices {
CloudDeviceDescription::CloudDeviceDescription() CloudDeviceDescription::CloudDeviceDescription()
: root_(std::make_unique<base::DictionaryValue>()) { : root_(base::Value(base::Value::Type::DICTIONARY)) {
root_->SetString(json::kVersion, json::kVersion10); root_.SetKey(json::kVersion, base::Value(json::kVersion10));
} }
CloudDeviceDescription::~CloudDeviceDescription() = default; CloudDeviceDescription::~CloudDeviceDescription() = default;
...@@ -30,13 +30,10 @@ bool CloudDeviceDescription::InitFromString(const std::string& json) { ...@@ -30,13 +30,10 @@ bool CloudDeviceDescription::InitFromString(const std::string& json) {
} }
bool CloudDeviceDescription::InitFromValue(base::Value ticket) { bool CloudDeviceDescription::InitFromValue(base::Value ticket) {
auto parsed = base::DictionaryValue::From( if (!ticket.is_dict())
base::Value::ToUniquePtrValue(std::move(ticket)));
if (!parsed)
return false; return false;
root_ = std::move(ticket);
root_ = std::move(parsed); return IsValidTicket(root_);
return IsValidTicket(*root_);
} }
// static // static
...@@ -51,36 +48,24 @@ bool CloudDeviceDescription::IsValidTicket(const base::Value& ticket) { ...@@ -51,36 +48,24 @@ bool CloudDeviceDescription::IsValidTicket(const base::Value& ticket) {
std::string CloudDeviceDescription::ToString() const { std::string CloudDeviceDescription::ToString() const {
std::string json; std::string json;
base::JSONWriter::WriteWithOptions( base::JSONWriter::WriteWithOptions(
*root_, base::JSONWriter::OPTIONS_PRETTY_PRINT, &json); root_, base::JSONWriter::OPTIONS_PRETTY_PRINT, &json);
return json; return json;
} }
base::Value CloudDeviceDescription::ToValue() && { base::Value CloudDeviceDescription::ToValue() && {
return base::Value::FromUniquePtrValue(std::move(root_)); return std::move(root_);
}
const base::DictionaryValue* CloudDeviceDescription::GetItem(
const std::string& path) const {
const base::DictionaryValue* value = nullptr;
root_->GetDictionary(path, &value);
return value;
}
base::DictionaryValue* CloudDeviceDescription::CreateItem(
const std::string& path) {
return root_->SetDictionary(path, std::make_unique<base::DictionaryValue>());
} }
const base::ListValue* CloudDeviceDescription::GetListItem( const base::Value* CloudDeviceDescription::GetItem(
const std::string& path) const { const std::vector<base::StringPiece>& path,
const base::ListValue* value = nullptr; base::Value::Type type) const {
root_->GetList(path, &value); return root_.FindPathOfType(path, type);
return value;
} }
base::ListValue* CloudDeviceDescription::CreateListItem( base::Value* CloudDeviceDescription::CreateItem(
const std::string& path) { const std::vector<base::StringPiece>& path,
return root_->SetList(path, std::make_unique<base::ListValue>()); base::Value::Type type) {
return root_.SetPath(path, base::Value(type));
} }
} // namespace cloud_devices } // namespace cloud_devices
...@@ -7,8 +7,10 @@ ...@@ -7,8 +7,10 @@
#include <memory> #include <memory>
#include <string> #include <string>
#include <vector>
#include "base/macros.h" #include "base/macros.h"
#include "base/strings/string_piece_forward.h"
#include "base/values.h" #include "base/values.h"
namespace cloud_devices { namespace cloud_devices {
...@@ -30,24 +32,18 @@ class CloudDeviceDescription { ...@@ -30,24 +32,18 @@ class CloudDeviceDescription {
base::Value ToValue() &&; base::Value ToValue() &&;
// Returns dictionary with capability/option. // Returns item of given type with capability/option.
// Returns NULL if missing. // Returns nullptr if missing.
const base::DictionaryValue* GetItem(const std::string& path) const; const base::Value* GetItem(const std::vector<base::StringPiece>& path,
base::Value::Type type) const;
// Create dictionary for capability/option. // Creates item with given type for capability/option.
// Never returns NULL. // Returns nullptr if an intermediate Value in the path is not a dictionary.
base::DictionaryValue* CreateItem(const std::string& path); base::Value* CreateItem(const std::vector<base::StringPiece>& path,
base::Value::Type type);
// Returns list with capability/option.
// Returns NULL if missing.
const base::ListValue* GetListItem(const std::string& path) const;
// Create list for capability/option.
// Never returns NULL.
base::ListValue* CreateListItem(const std::string& path);
private: private:
std::unique_ptr<base::DictionaryValue> root_; base::Value root_;
DISALLOW_COPY_AND_ASSIGN(CloudDeviceDescription); DISALLOW_COPY_AND_ASSIGN(CloudDeviceDescription);
}; };
......
...@@ -19,10 +19,6 @@ ...@@ -19,10 +19,6 @@
#include "base/stl_util.h" #include "base/stl_util.h"
#include "components/cloud_devices/common/cloud_device_description.h" #include "components/cloud_devices/common/cloud_device_description.h"
namespace base {
class DictionaryValue;
}
namespace cloud_devices { namespace cloud_devices {
// All traits below specify how to serialize and validate capabilities and // All traits below specify how to serialize and validate capabilities and
...@@ -35,10 +31,10 @@ namespace cloud_devices { ...@@ -35,10 +31,10 @@ namespace cloud_devices {
// static std::string GetItemPath(); // static std::string GetItemPath();
// //
// // Loads ticket item. Returns false if failed. // // Loads ticket item. Returns false if failed.
// static bool Load(const base::DictionaryValue& dict, ContentType* option); // static bool Load(const base::Value& dict, ContentType* option);
// //
// // Saves ticket item. // // Saves ticket item.
// static void Save(ContentType option, base::DictionaryValue* dict); // static void Save(ContentType option, base::Value* dict);
// Represents a CDD capability that is stored as a JSON list // Represents a CDD capability that is stored as a JSON list
// Ex: "<CAPABILITY_NAME>": [ {<VALUE>}, {<VALUE>}, {<VALUE>} ] // Ex: "<CAPABILITY_NAME>": [ {<VALUE>}, {<VALUE>}, {<VALUE>} ]
......
...@@ -45,16 +45,14 @@ template <class Option, class Traits> ...@@ -45,16 +45,14 @@ template <class Option, class Traits>
bool ListCapability<Option, Traits>::LoadFrom( bool ListCapability<Option, Traits>::LoadFrom(
const CloudDeviceDescription& description) { const CloudDeviceDescription& description) {
Reset(); Reset();
const base::ListValue* options = const base::Value* options_value =
description.GetListItem(Traits::GetCapabilityPath()); description.GetItem(Traits::GetCapabilityPath(), base::Value::Type::LIST);
if (!options) if (!options_value)
return false; return false;
for (size_t i = 0; i < options->GetSize(); ++i) { const base::Value::ListStorage& options = options_value->GetList();
const base::DictionaryValue* option_value = NULL; for (const base::Value& option_value : options) {
if (!options->GetDictionary(i, &option_value))
return false; // Every entry must be a dictionary.
Option option; Option option;
if (!Traits::Load(*option_value, &option)) if (!option_value.is_dict() || !Traits::Load(option_value, &option))
return false; return false;
AddOption(option); AddOption(option);
} }
...@@ -65,13 +63,12 @@ template <class Option, class Traits> ...@@ -65,13 +63,12 @@ template <class Option, class Traits>
void ListCapability<Option, Traits>::SaveTo( void ListCapability<Option, Traits>::SaveTo(
CloudDeviceDescription* description) const { CloudDeviceDescription* description) const {
DCHECK(IsValid()); DCHECK(IsValid());
base::ListValue* options_list = base::Value* options_list = description->CreateItem(
description->CreateListItem(Traits::GetCapabilityPath()); Traits::GetCapabilityPath(), base::Value::Type::LIST);
for (size_t i = 0; i < options_.size(); ++i) { for (const Option& option : options_) {
std::unique_ptr<base::DictionaryValue> option_value( base::Value option_value(base::Value::Type::DICTIONARY);
new base::DictionaryValue); Traits::Save(option, &option_value);
Traits::Save(options_[i], option_value.get()); options_list->GetList().emplace_back(std::move(option_value));
options_list->Append(std::move(option_value));
} }
} }
...@@ -99,22 +96,21 @@ template <class Option, class Traits> ...@@ -99,22 +96,21 @@ template <class Option, class Traits>
bool SelectionCapability<Option, Traits>::LoadFrom( bool SelectionCapability<Option, Traits>::LoadFrom(
const CloudDeviceDescription& description) { const CloudDeviceDescription& description) {
Reset(); Reset();
const base::DictionaryValue* item = const base::Value* item = description.GetItem(Traits::GetCapabilityPath(),
description.GetItem(Traits::GetCapabilityPath()); base::Value::Type::DICTIONARY);
if (!item) if (!item)
return false; return false;
const base::ListValue* options = NULL; const base::Value* options_value =
if (!item->GetList(json::kKeyOption, &options)) item->FindKeyOfType(json::kKeyOption, base::Value::Type::LIST);
if (!options_value)
return false; return false;
for (size_t i = 0; i < options->GetSize(); ++i) { const base::Value::ListStorage& options = options_value->GetList();
const base::DictionaryValue* option_value = NULL; for (const base::Value& option_value : options) {
if (!options->GetDictionary(i, &option_value))
return false; // Every entry must be a dictionary.
Option option; Option option;
if (!Traits::Load(*option_value, &option)) if (!option_value.is_dict() || !Traits::Load(option_value, &option))
return false; return false;
bool is_default = false; bool is_default =
option_value->GetBoolean(json::kKeyIsDefault, &is_default); option_value.FindBoolKey(json::kKeyIsDefault).value_or(false);
if (is_default && default_idx_ >= 0) { if (is_default && default_idx_ >= 0) {
return false; // Multiple defaults. return false; // Multiple defaults.
} }
...@@ -127,16 +123,17 @@ template <class Option, class Traits> ...@@ -127,16 +123,17 @@ template <class Option, class Traits>
void SelectionCapability<Option, Traits>::SaveTo( void SelectionCapability<Option, Traits>::SaveTo(
CloudDeviceDescription* description) const { CloudDeviceDescription* description) const {
DCHECK(IsValid()); DCHECK(IsValid());
auto options_list = std::make_unique<base::ListValue>(); base::Value options_list(base::Value::Type::LIST);
for (size_t i = 0; i < options_.size(); ++i) { for (size_t i = 0; i < options_.size(); ++i) {
auto option_value = std::make_unique<base::DictionaryValue>(); base::Value option_value(base::Value::Type::DICTIONARY);
if (base::checked_cast<int>(i) == default_idx_) if (base::checked_cast<int>(i) == default_idx_)
option_value->SetBoolean(json::kKeyIsDefault, true); option_value.SetKey(json::kKeyIsDefault, base::Value(true));
Traits::Save(options_[i], option_value.get()); Traits::Save(options_[i], &option_value);
options_list->Append(std::move(option_value)); options_list.GetList().emplace_back(std::move(option_value));
} }
description->CreateItem(Traits::GetCapabilityPath()) description
->Set(json::kKeyOption, std::move(options_list)); ->CreateItem(Traits::GetCapabilityPath(), base::Value::Type::DICTIONARY)
->SetKey(json::kKeyOption, std::move(options_list));
} }
template <class Traits> template <class Traits>
...@@ -152,34 +149,36 @@ template <class Traits> ...@@ -152,34 +149,36 @@ template <class Traits>
bool BooleanCapability<Traits>::LoadFrom( bool BooleanCapability<Traits>::LoadFrom(
const CloudDeviceDescription& description) { const CloudDeviceDescription& description) {
Reset(); Reset();
const base::DictionaryValue* dict = const base::Value* dict = description.GetItem(Traits::GetCapabilityPath(),
description.GetItem(Traits::GetCapabilityPath()); base::Value::Type::DICTIONARY);
if (!dict) if (!dict)
return false; return false;
default_value_ = Traits::kDefault; default_value_ = dict->FindBoolKey(json::kKeyDefault)
dict->GetBoolean(json::kKeyDefault, &default_value_); .value_or(static_cast<bool>(Traits::kDefault));
return true; return true;
} }
template <class Traits> template <class Traits>
void BooleanCapability<Traits>::SaveTo( void BooleanCapability<Traits>::SaveTo(
CloudDeviceDescription* description) const { CloudDeviceDescription* description) const {
base::DictionaryValue* dict = base::Value* dict = description->CreateItem(Traits::GetCapabilityPath(),
description->CreateItem(Traits::GetCapabilityPath()); base::Value::Type::DICTIONARY);
if (default_value_ != Traits::kDefault) if (default_value_ != Traits::kDefault)
dict->SetBoolean(json::kKeyDefault, default_value_); dict->SetKey(json::kKeyDefault, base::Value(default_value_));
} }
template <class Traits> template <class Traits>
bool EmptyCapability<Traits>::LoadFrom( bool EmptyCapability<Traits>::LoadFrom(
const CloudDeviceDescription& description) { const CloudDeviceDescription& description) {
return description.GetItem(Traits::GetCapabilityPath()) != NULL; return description.GetItem(Traits::GetCapabilityPath(),
base::Value::Type::DICTIONARY) != nullptr;
} }
template <class Traits> template <class Traits>
void EmptyCapability<Traits>::SaveTo( void EmptyCapability<Traits>::SaveTo(
CloudDeviceDescription* description) const { CloudDeviceDescription* description) const {
description->CreateItem(Traits::GetCapabilityPath()); description->CreateItem(Traits::GetCapabilityPath(),
base::Value::Type::DICTIONARY);
} }
template <class Option, class Traits> template <class Option, class Traits>
...@@ -200,8 +199,8 @@ template <class Option, class Traits> ...@@ -200,8 +199,8 @@ template <class Option, class Traits>
bool ValueCapability<Option, Traits>::LoadFrom( bool ValueCapability<Option, Traits>::LoadFrom(
const CloudDeviceDescription& description) { const CloudDeviceDescription& description) {
Reset(); Reset();
const base::DictionaryValue* option_value = const base::Value* option_value = description.GetItem(
description.GetItem(Traits::GetCapabilityPath()); Traits::GetCapabilityPath(), base::Value::Type::DICTIONARY);
if (!option_value) if (!option_value)
return false; return false;
Option option; Option option;
...@@ -215,7 +214,8 @@ template <class Option, class Traits> ...@@ -215,7 +214,8 @@ template <class Option, class Traits>
void ValueCapability<Option, Traits>::SaveTo( void ValueCapability<Option, Traits>::SaveTo(
CloudDeviceDescription* description) const { CloudDeviceDescription* description) const {
DCHECK(IsValid()); DCHECK(IsValid());
Traits::Save(value(), description->CreateItem(Traits::GetCapabilityPath())); Traits::Save(value(), description->CreateItem(Traits::GetCapabilityPath(),
base::Value::Type::DICTIONARY));
} }
template <class Option, class Traits> template <class Option, class Traits>
...@@ -236,8 +236,8 @@ template <class Option, class Traits> ...@@ -236,8 +236,8 @@ template <class Option, class Traits>
bool TicketItem<Option, Traits>::LoadFrom( bool TicketItem<Option, Traits>::LoadFrom(
const CloudDeviceDescription& description) { const CloudDeviceDescription& description) {
Reset(); Reset();
const base::DictionaryValue* option_value = const base::Value* option_value = description.GetItem(
description.GetItem(Traits::GetTicketItemPath()); Traits::GetTicketItemPath(), base::Value::Type::DICTIONARY);
if (!option_value) if (!option_value)
return false; return false;
Option option; Option option;
...@@ -251,7 +251,8 @@ template <class Option, class Traits> ...@@ -251,7 +251,8 @@ template <class Option, class Traits>
void TicketItem<Option, Traits>::SaveTo( void TicketItem<Option, Traits>::SaveTo(
CloudDeviceDescription* description) const { CloudDeviceDescription* description) const {
DCHECK(IsValid()); DCHECK(IsValid());
Traits::Save(value(), description->CreateItem(Traits::GetTicketItemPath())); Traits::Save(value(), description->CreateItem(Traits::GetTicketItemPath(),
base::Value::Type::DICTIONARY));
} }
} // namespace cloud_devices } // namespace cloud_devices
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment