1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef COMPONENTS_CLOUD_DEVICES_COMMON_CAPABILITY_INTERFACES_H_
6#define COMPONENTS_CLOUD_DEVICES_COMMON_CAPABILITY_INTERFACES_H_
7
8// Defines common templates that could be used to create device specific
9// capabilities and print tickets.
10
11#include <vector>
12
13#include "base/logging.h"
14#include "base/numerics/safe_conversions.h"
15#include "components/cloud_devices/common/cloud_device_description.h"
16
17namespace base {
18class DictionaryValue;
19}
20
21namespace cloud_devices {
22
23// All traits below specify how to serialize and validate capabilities and
24// ticket items.
25// Traits should have following methods:
26//   // Returns true if capability semantically valid.
27//   static bool IsValid(const Option&);
28//
29//   // Returns json path relative to the root of CDD/CJT.
30//   static std::string GetItemPath();
31//
32//   // Loads ticket item. Returns false if failed.
33//   static bool Load(const base::DictionaryValue& dict, ContentType* option);
34//
35//   // Saves ticket item.
36//   static void Save(ContentType option, base::DictionaryValue* dict);
37
38// Represents a CDD capability that is stored as a JSON list
39// Ex: "<CAPABILITY_NAME>": [ {<VALUE>}, {<VALUE>}, {<VALUE>} ]
40// Option specifies data type for <VALUE>.
41// Traits specifies how <VALUE> is stored in JSON and semantic validation.
42template <class Option, class Traits>
43class ListCapability {
44 public:
45  ListCapability();
46  ~ListCapability();
47
48  bool LoadFrom(const CloudDeviceDescription& description);
49  void SaveTo(CloudDeviceDescription* description) const;
50
51  void Reset() { options_.clear(); }
52
53  bool IsValid() const;
54
55  bool empty() const { return options_.empty(); }
56
57  size_t size() const { return options_.size(); }
58
59  const Option& operator[](size_t i) const { return options_[i]; }
60
61  bool Contains(const Option& option) const {
62    return std::find(options_.begin(), options_.end(), option) !=
63           options_.end();
64  }
65
66  void AddOption(const Option& option) { options_.push_back(option); }
67
68 private:
69  typedef std::vector<Option> OptionVector;
70  OptionVector options_;
71
72  DISALLOW_COPY_AND_ASSIGN(ListCapability);
73};
74
75// Represents CDD capability stored as JSON list with default_value value.
76// Ex: "<CAPABILITY_NAME>": { "option": [{ "is_default": true, <VALUE>},
77//                                       {<VALUE>} ]}
78// Option specifies data type for <VALUE>.
79// Traits specifies how <VALUE> is stored in JSON and semantic validation.
80template <class Option, class Traits>
81class SelectionCapability {
82 public:
83  SelectionCapability();
84  ~SelectionCapability();
85
86  bool LoadFrom(const CloudDeviceDescription& description);
87  void SaveTo(CloudDeviceDescription* description) const;
88
89  void Reset() {
90    options_.clear();
91    default_idx_ = -1;
92  }
93
94  bool IsValid() const;
95
96  bool empty() const { return options_.empty(); }
97
98  size_t size() const { return options_.size(); }
99
100  const Option& operator[](size_t i) const { return options_[i]; }
101
102  bool Contains(const Option& option) const {
103    return std::find(options_.begin(), options_.end(), option) !=
104           options_.end();
105  }
106
107  const Option& GetDefault() const {
108    CHECK_GE(default_idx_, 0);
109    return options_[default_idx_];
110  }
111
112  void AddOption(const Option& option) { AddDefaultOption(option, false); }
113
114  void AddDefaultOption(const Option& option, bool is_default) {
115    if (is_default) {
116      DCHECK_EQ(default_idx_, -1);
117      // Point to the last element.
118      default_idx_ = base::checked_cast<int>(size());
119    }
120    options_.push_back(option);
121  }
122
123 private:
124  typedef std::vector<Option> OptionVector;
125
126  OptionVector options_;
127  int default_idx_;
128
129  DISALLOW_COPY_AND_ASSIGN(SelectionCapability);
130};
131
132// Represents CDD capability that can be true or false.
133// Ex: "<CAPABILITY_NAME>": { "default_value": true }
134// Traits specifies how <VALUE> is stored in JSON and semantic validation.
135template <class Traits>
136class BooleanCapability {
137 public:
138  BooleanCapability();
139  ~BooleanCapability();
140
141  bool LoadFrom(const CloudDeviceDescription& description);
142  void SaveTo(CloudDeviceDescription* description) const;
143
144  void Reset() { default_value_ = false; }
145
146  void set_default_value(bool value) { default_value_ = value; }
147
148  bool default_value() const { return default_value_; }
149
150 private:
151  bool default_value_;
152
153  DISALLOW_COPY_AND_ASSIGN(BooleanCapability);
154};
155
156// Represents CDD capability for which existence is only important.
157// Ex: "<CAPABILITY_NAME>": { }
158// Traits specifies how <VALUE> is stored in JSON and semantic validation.
159template <class Traits>
160class EmptyCapability {
161 public:
162  EmptyCapability() {};
163  ~EmptyCapability() {};
164
165  bool LoadFrom(const CloudDeviceDescription& description);
166  void SaveTo(CloudDeviceDescription* description) const;
167
168 private:
169  DISALLOW_COPY_AND_ASSIGN(EmptyCapability);
170};
171
172// Represents an item that is of a specific value type.
173// Ex: "<CAPABILITY_NAME>": {<VALUE>}
174// Option specifies data type for <VALUE>.
175// Traits specifies how <VALUE> is stored in JSON and semantic validation.
176template <class Option, class Traits>
177class ValueCapability {
178 public:
179  ValueCapability();
180  ~ValueCapability();
181
182  bool LoadFrom(const CloudDeviceDescription& description);
183  void SaveTo(CloudDeviceDescription* description) const;
184
185  void Reset() { value_ = Option(); }
186
187  bool IsValid() const;
188
189  const Option& value() const { return value_; }
190
191  void set_value(const Option& value) { value_ = value; }
192
193 private:
194  Option value_;
195
196  DISALLOW_COPY_AND_ASSIGN(ValueCapability);
197};
198
199// Represents CJT items.
200// Ex: "<CAPABILITY_NAME>": {<VALUE>}
201// Option specifies data type for <VALUE>.
202// Traits specifies how <VALUE> is stored in JSON and semantic validation.
203template <class Option, class Traits>
204class TicketItem {
205 public:
206  TicketItem();
207  ~TicketItem();
208
209  bool LoadFrom(const CloudDeviceDescription& description);
210  void SaveTo(CloudDeviceDescription* description) const;
211
212  void Reset() { value_ = Option(); }
213
214  bool IsValid() const;
215
216  const Option& value() const { return value_; }
217
218  void set_value(const Option& value) { value_ = value; }
219
220 private:
221  Option value_;
222
223  DISALLOW_COPY_AND_ASSIGN(TicketItem);
224};
225
226}  // namespace cloud_devices
227
228#endif  // COMPONENTS_CLOUD_DEVICES_COMMON_CAPABILITY_INTERFACES_H_
229