15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
50529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#ifndef COMPONENTS_CLOUD_DEVICES_COMMON_CAPABILITY_INTERFACES_H_
60529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#define COMPONENTS_CLOUD_DEVICES_COMMON_CAPABILITY_INTERFACES_H_
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Defines common templates that could be used to create device specific
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// capabilities and print tickets.
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <vector>
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/logging.h"
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/numerics/safe_conversions.h"
150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/cloud_devices/common/cloud_device_description.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace base {
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class DictionaryValue;
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace cloud_devices {
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// All traits below specify how to serialize and validate capabilities and
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// ticket items.
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Traits should have following methods:
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//   // Returns true if capability semantically valid.
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//   static bool IsValid(const Option&);
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//   // Returns json path relative to the root of CDD/CJT.
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//   static std::string GetItemPath();
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//   // Loads ticket item. Returns false if failed.
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//   static bool Load(const base::DictionaryValue& dict, ContentType* option);
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//   // Saves ticket item.
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//   static void Save(ContentType option, base::DictionaryValue* dict);
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Represents a CDD capability that is stored as a JSON list
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Ex: "<CAPABILITY_NAME>": [ {<VALUE>}, {<VALUE>}, {<VALUE>} ]
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Option specifies data type for <VALUE>.
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Traits specifies how <VALUE> is stored in JSON and semantic validation.
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <class Option, class Traits>
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ListCapability {
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ListCapability();
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ~ListCapability();
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool LoadFrom(const CloudDeviceDescription& description);
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SaveTo(CloudDeviceDescription* description) const;
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void Reset() { options_.clear(); }
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool IsValid() const;
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  bool empty() const { return options_.empty(); }
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  size_t size() const { return options_.size(); }
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  const Option& operator[](size_t i) const { return options_[i]; }
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  bool Contains(const Option& option) const {
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return std::find(options_.begin(), options_.end(), option) !=
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)           options_.end();
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void AddOption(const Option& option) { options_.push_back(option); }
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  typedef std::vector<Option> OptionVector;
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  OptionVector options_;
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ListCapability);
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Represents CDD capability stored as JSON list with default_value value.
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Ex: "<CAPABILITY_NAME>": { "option": [{ "is_default": true, <VALUE>},
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//                                       {<VALUE>} ]}
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Option specifies data type for <VALUE>.
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Traits specifies how <VALUE> is stored in JSON and semantic validation.
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <class Option, class Traits>
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class SelectionCapability {
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SelectionCapability();
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ~SelectionCapability();
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool LoadFrom(const CloudDeviceDescription& description);
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SaveTo(CloudDeviceDescription* description) const;
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void Reset() {
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    options_.clear();
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    default_idx_ = -1;
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool IsValid() const;
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  bool empty() const { return options_.empty(); }
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  size_t size() const { return options_.size(); }
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  const Option& operator[](size_t i) const { return options_[i]; }
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  bool Contains(const Option& option) const {
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return std::find(options_.begin(), options_.end(), option) !=
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)           options_.end();
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const Option& GetDefault() const {
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CHECK_GE(default_idx_, 0);
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return options_[default_idx_];
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void AddOption(const Option& option) { AddDefaultOption(option, false); }
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void AddDefaultOption(const Option& option, bool is_default) {
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (is_default) {
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DCHECK_EQ(default_idx_, -1);
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // Point to the last element.
118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      default_idx_ = base::checked_cast<int>(size());
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    options_.push_back(option);
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  typedef std::vector<Option> OptionVector;
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  OptionVector options_;
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int default_idx_;
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SelectionCapability);
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Represents CDD capability that can be true or false.
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Ex: "<CAPABILITY_NAME>": { "default_value": true }
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Traits specifies how <VALUE> is stored in JSON and semantic validation.
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <class Traits>
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class BooleanCapability {
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BooleanCapability();
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ~BooleanCapability();
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool LoadFrom(const CloudDeviceDescription& description);
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SaveTo(CloudDeviceDescription* description) const;
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void Reset() { default_value_ = false; }
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void set_default_value(bool value) { default_value_ = value; }
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  bool default_value() const { return default_value_; }
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool default_value_;
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BooleanCapability);
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Represents CDD capability for which existence is only important.
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Ex: "<CAPABILITY_NAME>": { }
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Traits specifies how <VALUE> is stored in JSON and semantic validation.
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <class Traits>
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class EmptyCapability {
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EmptyCapability() {};
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ~EmptyCapability() {};
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool LoadFrom(const CloudDeviceDescription& description);
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SaveTo(CloudDeviceDescription* description) const;
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(EmptyCapability);
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
172effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Represents an item that is of a specific value type.
173effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Ex: "<CAPABILITY_NAME>": {<VALUE>}
174effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Option specifies data type for <VALUE>.
175effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Traits specifies how <VALUE> is stored in JSON and semantic validation.
176effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochtemplate <class Option, class Traits>
177effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass ValueCapability {
178effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public:
179effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ValueCapability();
180effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ~ValueCapability();
181effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
182effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool LoadFrom(const CloudDeviceDescription& description);
183effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void SaveTo(CloudDeviceDescription* description) const;
184effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
185effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void Reset() { value_ = Option(); }
186effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
187effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool IsValid() const;
188effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
189effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  const Option& value() const { return value_; }
190effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
191effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void set_value(const Option& value) { value_ = value; }
192effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
193effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch private:
194effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  Option value_;
195effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
196effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DISALLOW_COPY_AND_ASSIGN(ValueCapability);
197effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch};
198effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Represents CJT items.
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Ex: "<CAPABILITY_NAME>": {<VALUE>}
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Option specifies data type for <VALUE>.
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Traits specifies how <VALUE> is stored in JSON and semantic validation.
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <class Option, class Traits>
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class TicketItem {
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TicketItem();
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ~TicketItem();
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool LoadFrom(const CloudDeviceDescription& description);
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SaveTo(CloudDeviceDescription* description) const;
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void Reset() { value_ = Option(); }
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool IsValid() const;
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  const Option& value() const { return value_; }
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void set_value(const Option& value) { value_ = value; }
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Option value_;
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TicketItem);
2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace cloud_devices
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif  // COMPONENTS_CLOUD_DEVICES_COMMON_CAPABILITY_INTERFACES_H_
229