• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
17 namespace base {
18 class DictionaryValue;
19 }
20 
21 namespace 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.
42 template <class Option, class Traits>
43 class ListCapability {
44  public:
45   ListCapability();
46   ~ListCapability();
47 
48   bool LoadFrom(const CloudDeviceDescription& description);
49   void SaveTo(CloudDeviceDescription* description) const;
50 
Reset()51   void Reset() { options_.clear(); }
52 
53   bool IsValid() const;
54 
empty()55   bool empty() const { return options_.empty(); }
56 
size()57   size_t size() const { return options_.size(); }
58 
59   const Option& operator[](size_t i) const { return options_[i]; }
60 
Contains(const Option & option)61   bool Contains(const Option& option) const {
62     return std::find(options_.begin(), options_.end(), option) !=
63            options_.end();
64   }
65 
AddOption(const Option & option)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.
80 template <class Option, class Traits>
81 class SelectionCapability {
82  public:
83   SelectionCapability();
84   ~SelectionCapability();
85 
86   bool LoadFrom(const CloudDeviceDescription& description);
87   void SaveTo(CloudDeviceDescription* description) const;
88 
Reset()89   void Reset() {
90     options_.clear();
91     default_idx_ = -1;
92   }
93 
94   bool IsValid() const;
95 
empty()96   bool empty() const { return options_.empty(); }
97 
size()98   size_t size() const { return options_.size(); }
99 
100   const Option& operator[](size_t i) const { return options_[i]; }
101 
Contains(const Option & option)102   bool Contains(const Option& option) const {
103     return std::find(options_.begin(), options_.end(), option) !=
104            options_.end();
105   }
106 
GetDefault()107   const Option& GetDefault() const {
108     CHECK_GE(default_idx_, 0);
109     return options_[default_idx_];
110   }
111 
AddOption(const Option & option)112   void AddOption(const Option& option) { AddDefaultOption(option, false); }
113 
AddDefaultOption(const Option & option,bool is_default)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.
135 template <class Traits>
136 class BooleanCapability {
137  public:
138   BooleanCapability();
139   ~BooleanCapability();
140 
141   bool LoadFrom(const CloudDeviceDescription& description);
142   void SaveTo(CloudDeviceDescription* description) const;
143 
Reset()144   void Reset() { default_value_ = false; }
145 
set_default_value(bool value)146   void set_default_value(bool value) { default_value_ = value; }
147 
default_value()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.
159 template <class Traits>
160 class EmptyCapability {
161  public:
EmptyCapability()162   EmptyCapability() {};
~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.
176 template <class Option, class Traits>
177 class ValueCapability {
178  public:
179   ValueCapability();
180   ~ValueCapability();
181 
182   bool LoadFrom(const CloudDeviceDescription& description);
183   void SaveTo(CloudDeviceDescription* description) const;
184 
Reset()185   void Reset() { value_ = Option(); }
186 
187   bool IsValid() const;
188 
value()189   const Option& value() const { return value_; }
190 
set_value(const Option & value)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.
203 template <class Option, class Traits>
204 class TicketItem {
205  public:
206   TicketItem();
207   ~TicketItem();
208 
209   bool LoadFrom(const CloudDeviceDescription& description);
210   void SaveTo(CloudDeviceDescription* description) const;
211 
Reset()212   void Reset() { value_ = Option(); }
213 
214   bool IsValid() const;
215 
value()216   const Option& value() const { return value_; }
217 
set_value(const Option & value)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