// Copyright 2014 The Chromium 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 COMPONENTS_CLOUD_DEVICES_COMMON_DESCRIPTION_DESCRIPTION_ITEMS_INL_H_ #define COMPONENTS_CLOUD_DEVICES_COMMON_DESCRIPTION_DESCRIPTION_ITEMS_INL_H_ #include #include "base/numerics/safe_conversions.h" #include "components/cloud_devices/common/description_items.h" // Implementation of templates defined in header file. // This file should be included from CC file with implementation of device // specific capabilities. namespace cloud_devices { template ListCapability::ListCapability() { Reset(); } template ListCapability::~ListCapability() { } template bool ListCapability::IsValid() const { if (empty()) return false; // This type of capabilities can't be empty. for (size_t i = 0; i < options_.size(); ++i) { if (!Traits::IsValid(options_[i])) return false; } return true; } template bool ListCapability::LoadFrom( const CloudDeviceDescription& description) { Reset(); const base::ListValue* options = description.GetListItem(Traits::GetCapabilityPath()); if (!options) return false; for (size_t i = 0; i < options->GetSize(); ++i) { const base::DictionaryValue* option_value = NULL; if (!options->GetDictionary(i, &option_value)) return false; // Every entry must be a dictionary. Option option; if (!Traits::Load(*option_value, &option)) return false; AddOption(option); } return IsValid(); } template void ListCapability::SaveTo( CloudDeviceDescription* description) const { DCHECK(IsValid()); base::ListValue* options_list = description->CreateListItem(Traits::GetCapabilityPath()); for (size_t i = 0; i < options_.size(); ++i) { base::DictionaryValue* option_value = new base::DictionaryValue; options_list->Append(option_value); Traits::Save(options_[i], option_value); } } template SelectionCapability::SelectionCapability() { Reset(); } template SelectionCapability::~SelectionCapability() { } template bool SelectionCapability::IsValid() const { if (empty()) return false; // This type of capabilities can't be empty for (size_t i = 0; i < options_.size(); ++i) { if (!Traits::IsValid(options_[i])) return false; } return default_idx_ >= 0 && default_idx_ < base::checked_cast(size()); } template bool SelectionCapability::LoadFrom( const CloudDeviceDescription& description) { Reset(); const base::DictionaryValue* item = description.GetItem(Traits::GetCapabilityPath()); if (!item) return false; const base::ListValue* options = NULL; if (!item->GetList(json::kKeyOption, &options)) return false; for (size_t i = 0; i < options->GetSize(); ++i) { const base::DictionaryValue* option_value = NULL; if (!options->GetDictionary(i, &option_value)) return false; // Every entry must be a dictionary. Option option; if (!Traits::Load(*option_value, &option)) return false; bool is_default = false; option_value->GetBoolean(json::kKeyIsDefault, &is_default); if (is_default && default_idx_ >= 0) { return false; // Multiple defaults. } AddDefaultOption(option, is_default); } return IsValid(); } template void SelectionCapability::SaveTo( CloudDeviceDescription* description) const { DCHECK(IsValid()); base::ListValue* options_list = new base::ListValue; description->CreateItem(Traits::GetCapabilityPath()) ->Set(json::kKeyOption, options_list); for (size_t i = 0; i < options_.size(); ++i) { base::DictionaryValue* option_value = new base::DictionaryValue; options_list->Append(option_value); if (base::checked_cast(i) == default_idx_) option_value->SetBoolean(json::kKeyIsDefault, true); Traits::Save(options_[i], option_value); } } template BooleanCapability::BooleanCapability() { Reset(); } template BooleanCapability::~BooleanCapability() { } template bool BooleanCapability::LoadFrom( const CloudDeviceDescription& description) { Reset(); const base::DictionaryValue* dict = description.GetItem(Traits::GetCapabilityPath()); if (!dict) return false; default_value_ = Traits::kDefault; dict->GetBoolean(json::kKeyDefault, &default_value_); return true; } template void BooleanCapability::SaveTo( CloudDeviceDescription* description) const { base::DictionaryValue* dict = description->CreateItem(Traits::GetCapabilityPath()); if (default_value_ != Traits::kDefault) dict->SetBoolean(json::kKeyDefault, default_value_); } template bool EmptyCapability::LoadFrom( const CloudDeviceDescription& description) { return description.GetItem(Traits::GetCapabilityPath()) != NULL; } template void EmptyCapability::SaveTo( CloudDeviceDescription* description) const { description->CreateItem(Traits::GetCapabilityPath()); } template ValueCapability::ValueCapability() { Reset(); } template ValueCapability::~ValueCapability() { } template bool ValueCapability::IsValid() const { return Traits::IsValid(value()); } template bool ValueCapability::LoadFrom( const CloudDeviceDescription& description) { Reset(); const base::DictionaryValue* option_value = description.GetItem(Traits::GetCapabilityPath()); if (!option_value) return false; Option option; if (!Traits::Load(*option_value, &option)) return false; set_value(option); return IsValid(); } template void ValueCapability::SaveTo( CloudDeviceDescription* description) const { DCHECK(IsValid()); Traits::Save(value(), description->CreateItem(Traits::GetCapabilityPath())); } template TicketItem::TicketItem() { Reset(); } template TicketItem::~TicketItem() { } template bool TicketItem::IsValid() const { return Traits::IsValid(value()); } template bool TicketItem::LoadFrom( const CloudDeviceDescription& description) { Reset(); const base::DictionaryValue* option_value = description.GetItem(Traits::GetTicketItemPath()); if (!option_value) return false; Option option; if (!Traits::Load(*option_value, &option)) return false; set_value(option); return IsValid(); } template void TicketItem::SaveTo( CloudDeviceDescription* description) const { DCHECK(IsValid()); Traits::Save(value(), description->CreateItem(Traits::GetTicketItemPath())); } } // namespace cloud_devices #endif // COMPONENTS_CLOUD_DEVICES_COMMON_DESCRIPTION_DESCRIPTION_ITEMS_INL_H_