| // 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_CAPABILITY_INTERFACES_H_ |
| #define COMPONENTS_CLOUD_DEVICES_COMMON_CAPABILITY_INTERFACES_H_ |
| |
| // Defines common templates that could be used to create device specific |
| // capabilities and print tickets. |
| |
| #include <vector> |
| |
| #include "base/logging.h" |
| #include "base/numerics/safe_conversions.h" |
| #include "components/cloud_devices/common/cloud_device_description.h" |
| |
| namespace base { |
| class DictionaryValue; |
| } |
| |
| namespace cloud_devices { |
| |
| // All traits below specify how to serialize and validate capabilities and |
| // ticket items. |
| // Traits should have following methods: |
| // // Returns true if capability semantically valid. |
| // static bool IsValid(const Option&); |
| // |
| // // Returns json path relative to the root of CDD/CJT. |
| // static std::string GetItemPath(); |
| // |
| // // Loads ticket item. Returns false if failed. |
| // static bool Load(const base::DictionaryValue& dict, ContentType* option); |
| // |
| // // Saves ticket item. |
| // static void Save(ContentType option, base::DictionaryValue* dict); |
| |
| // Represents a CDD capability that is stored as a JSON list |
| // Ex: "<CAPABILITY_NAME>": [ {<VALUE>}, {<VALUE>}, {<VALUE>} ] |
| // Option specifies data type for <VALUE>. |
| // Traits specifies how <VALUE> is stored in JSON and semantic validation. |
| template <class Option, class Traits> |
| class ListCapability { |
| public: |
| ListCapability(); |
| ~ListCapability(); |
| |
| bool LoadFrom(const CloudDeviceDescription& description); |
| void SaveTo(CloudDeviceDescription* description) const; |
| |
| void Reset() { options_.clear(); } |
| |
| bool IsValid() const; |
| |
| bool empty() const { return options_.empty(); } |
| |
| size_t size() const { return options_.size(); } |
| |
| const Option& operator[](size_t i) const { return options_[i]; } |
| |
| bool Contains(const Option& option) const { |
| return std::find(options_.begin(), options_.end(), option) != |
| options_.end(); |
| } |
| |
| void AddOption(const Option& option) { options_.push_back(option); } |
| |
| private: |
| typedef std::vector<Option> OptionVector; |
| OptionVector options_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ListCapability); |
| }; |
| |
| // Represents CDD capability stored as JSON list with default_value value. |
| // Ex: "<CAPABILITY_NAME>": { "option": [{ "is_default": true, <VALUE>}, |
| // {<VALUE>} ]} |
| // Option specifies data type for <VALUE>. |
| // Traits specifies how <VALUE> is stored in JSON and semantic validation. |
| template <class Option, class Traits> |
| class SelectionCapability { |
| public: |
| SelectionCapability(); |
| ~SelectionCapability(); |
| |
| bool LoadFrom(const CloudDeviceDescription& description); |
| void SaveTo(CloudDeviceDescription* description) const; |
| |
| void Reset() { |
| options_.clear(); |
| default_idx_ = -1; |
| } |
| |
| bool IsValid() const; |
| |
| bool empty() const { return options_.empty(); } |
| |
| size_t size() const { return options_.size(); } |
| |
| const Option& operator[](size_t i) const { return options_[i]; } |
| |
| bool Contains(const Option& option) const { |
| return std::find(options_.begin(), options_.end(), option) != |
| options_.end(); |
| } |
| |
| const Option& GetDefault() const { |
| CHECK_GE(default_idx_, 0); |
| return options_[default_idx_]; |
| } |
| |
| void AddOption(const Option& option) { AddDefaultOption(option, false); } |
| |
| void AddDefaultOption(const Option& option, bool is_default) { |
| if (is_default) { |
| DCHECK_EQ(default_idx_, -1); |
| // Point to the last element. |
| default_idx_ = base::checked_cast<int>(size()); |
| } |
| options_.push_back(option); |
| } |
| |
| private: |
| typedef std::vector<Option> OptionVector; |
| |
| OptionVector options_; |
| int default_idx_; |
| |
| DISALLOW_COPY_AND_ASSIGN(SelectionCapability); |
| }; |
| |
| // Represents CDD capability that can be true or false. |
| // Ex: "<CAPABILITY_NAME>": { "default_value": true } |
| // Traits specifies how <VALUE> is stored in JSON and semantic validation. |
| template <class Traits> |
| class BooleanCapability { |
| public: |
| BooleanCapability(); |
| ~BooleanCapability(); |
| |
| bool LoadFrom(const CloudDeviceDescription& description); |
| void SaveTo(CloudDeviceDescription* description) const; |
| |
| void Reset() { default_value_ = false; } |
| |
| void set_default_value(bool value) { default_value_ = value; } |
| |
| bool default_value() const { return default_value_; } |
| |
| private: |
| bool default_value_; |
| |
| DISALLOW_COPY_AND_ASSIGN(BooleanCapability); |
| }; |
| |
| // Represents CDD capability for which existence is only important. |
| // Ex: "<CAPABILITY_NAME>": { } |
| // Traits specifies how <VALUE> is stored in JSON and semantic validation. |
| template <class Traits> |
| class EmptyCapability { |
| public: |
| EmptyCapability() {}; |
| ~EmptyCapability() {}; |
| |
| bool LoadFrom(const CloudDeviceDescription& description); |
| void SaveTo(CloudDeviceDescription* description) const; |
| |
| private: |
| DISALLOW_COPY_AND_ASSIGN(EmptyCapability); |
| }; |
| |
| // Represents an item that is of a specific value type. |
| // Ex: "<CAPABILITY_NAME>": {<VALUE>} |
| // Option specifies data type for <VALUE>. |
| // Traits specifies how <VALUE> is stored in JSON and semantic validation. |
| template <class Option, class Traits> |
| class ValueCapability { |
| public: |
| ValueCapability(); |
| ~ValueCapability(); |
| |
| bool LoadFrom(const CloudDeviceDescription& description); |
| void SaveTo(CloudDeviceDescription* description) const; |
| |
| void Reset() { value_ = Option(); } |
| |
| bool IsValid() const; |
| |
| const Option& value() const { return value_; } |
| |
| void set_value(const Option& value) { value_ = value; } |
| |
| private: |
| Option value_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ValueCapability); |
| }; |
| |
| // Represents CJT items. |
| // Ex: "<CAPABILITY_NAME>": {<VALUE>} |
| // Option specifies data type for <VALUE>. |
| // Traits specifies how <VALUE> is stored in JSON and semantic validation. |
| template <class Option, class Traits> |
| class TicketItem { |
| public: |
| TicketItem(); |
| ~TicketItem(); |
| |
| bool LoadFrom(const CloudDeviceDescription& description); |
| void SaveTo(CloudDeviceDescription* description) const; |
| |
| void Reset() { value_ = Option(); } |
| |
| bool IsValid() const; |
| |
| const Option& value() const { return value_; } |
| |
| void set_value(const Option& value) { value_ = value; } |
| |
| private: |
| Option value_; |
| |
| DISALLOW_COPY_AND_ASSIGN(TicketItem); |
| }; |
| |
| } // namespace cloud_devices |
| |
| #endif // COMPONENTS_CLOUD_DEVICES_COMMON_CAPABILITY_INTERFACES_H_ |