All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
nfd-control-parameters.hpp
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
7 #ifndef NDN_MANAGEMENT_NFD_CONTROL_PARAMETERS_HPP
8 #define NDN_MANAGEMENT_NFD_CONTROL_PARAMETERS_HPP
9 
10 #include "../name.hpp"
11 #include "../encoding/tlv-nfd.hpp"
12 
13 namespace ndn {
14 namespace nfd {
15 
27 };
28 
30  "Name",
31  "FaceId",
32  "Uri",
33  "LocalControlFeature",
34  "Origin",
35  "Cost",
36  "Flags",
37  "Strategy",
38  "ExpirationPeriod",
39 };
40 
44 };
45 
50 {
51 public:
52  class Error : public Tlv::Error
53  {
54  public:
55  explicit
56  Error(const std::string& what)
57  : Tlv::Error(what)
58  {
59  }
60  };
61 
63  : m_hasFields(CONTROL_PARAMETER_UBOUND)
64  {
65  }
66 
67  explicit
68  ControlParameters(const Block& block)
69  : m_hasFields(CONTROL_PARAMETER_UBOUND)
70  {
71  wireDecode(block);
72  }
73 
74  template<bool T>
75  size_t
76  wireEncode(EncodingImpl<T>& encoder) const;
77 
78  const Block&
79  wireEncode() const;
80 
81  void
82  wireDecode(const Block& wire);
83 
84 public: // getters & setters
85 
86  bool
87  hasName() const
88  {
89  return m_hasFields[CONTROL_PARAMETER_NAME];
90  }
91 
92  const Name&
93  getName() const
94  {
95  BOOST_ASSERT(this->hasName());
96  return m_name;
97  }
98 
100  setName(const Name& name)
101  {
102  m_wire.reset();
103  m_name = name;
104  m_hasFields[CONTROL_PARAMETER_NAME] = true;
105  return *this;
106  }
107 
110  {
111  m_wire.reset();
112  m_hasFields[CONTROL_PARAMETER_NAME] = false;
113  return *this;
114  }
115 
116  bool
117  hasFaceId() const
118  {
119  return m_hasFields[CONTROL_PARAMETER_FACE_ID];
120  }
121 
122  uint64_t
123  getFaceId() const
124  {
125  BOOST_ASSERT(this->hasFaceId());
126  return m_faceId;
127  }
128 
130  setFaceId(uint64_t faceId)
131  {
132  m_wire.reset();
133  m_faceId = faceId;
134  m_hasFields[CONTROL_PARAMETER_FACE_ID] = true;
135  return *this;
136  }
137 
140  {
141  m_wire.reset();
142  m_hasFields[CONTROL_PARAMETER_FACE_ID] = false;
143  return *this;
144  }
145 
146  bool
147  hasUri() const
148  {
149  return m_hasFields[CONTROL_PARAMETER_URI];
150  }
151 
152  const std::string&
153  getUri() const
154  {
155  BOOST_ASSERT(this->hasUri());
156  return m_uri;
157  }
158 
160  setUri(const std::string& uri)
161  {
162  m_wire.reset();
163  m_uri = uri;
164  m_hasFields[CONTROL_PARAMETER_URI] = true;
165  return *this;
166  }
167 
170  {
171  m_wire.reset();
172  m_hasFields[CONTROL_PARAMETER_URI] = false;
173  return *this;
174  }
175 
176  bool
178  {
179  return m_hasFields[CONTROL_PARAMETER_LOCAL_CONTROL_FEATURE];
180  }
181 
184  {
185  BOOST_ASSERT(this->hasLocalControlFeature());
186  return m_localControlFeature;
187  }
188 
191  {
192  m_wire.reset();
193  m_localControlFeature = localControlFeature;
194  m_hasFields[CONTROL_PARAMETER_LOCAL_CONTROL_FEATURE] = true;
195  return *this;
196  }
197 
200  {
201  m_wire.reset();
202  m_hasFields[CONTROL_PARAMETER_LOCAL_CONTROL_FEATURE] = false;
203  return *this;
204  }
205 
206  bool
207  hasOrigin() const
208  {
209  return m_hasFields[CONTROL_PARAMETER_ORIGIN];
210  }
211 
212  uint64_t
213  getOrigin() const
214  {
215  BOOST_ASSERT(this->hasOrigin());
216  return m_origin;
217  }
218 
220  setOrigin(uint64_t origin)
221  {
222  m_wire.reset();
223  m_origin = origin;
224  m_hasFields[CONTROL_PARAMETER_ORIGIN] = true;
225  return *this;
226  }
227 
230  {
231  m_wire.reset();
232  m_hasFields[CONTROL_PARAMETER_ORIGIN] = false;
233  return *this;
234  }
235 
236  bool
237  hasCost() const
238  {
239  return m_hasFields[CONTROL_PARAMETER_COST];
240  }
241 
242  uint64_t
243  getCost() const
244  {
245  BOOST_ASSERT(this->hasCost());
246  return m_cost;
247  }
248 
250  setCost(uint64_t cost)
251  {
252  m_wire.reset();
253  m_cost = cost;
254  m_hasFields[CONTROL_PARAMETER_COST] = true;
255  return *this;
256  }
257 
260  {
261  m_wire.reset();
262  m_hasFields[CONTROL_PARAMETER_COST] = false;
263  return *this;
264  }
265 
266  bool
267  hasFlags() const
268  {
269  return m_hasFields[CONTROL_PARAMETER_FLAGS];
270  }
271 
272  uint64_t
273  getFlags() const
274  {
275  BOOST_ASSERT(this->hasFlags());
276  return m_flags;
277  }
278 
280  setFlags(uint64_t flags)
281  {
282  m_wire.reset();
283  m_flags = flags;
284  m_hasFields[CONTROL_PARAMETER_FLAGS] = true;
285  return *this;
286  }
287 
290  {
291  m_wire.reset();
292  m_hasFields[CONTROL_PARAMETER_FLAGS] = false;
293  return *this;
294  }
295 
296  bool
297  hasStrategy() const
298  {
299  return m_hasFields[CONTROL_PARAMETER_STRATEGY];
300  }
301 
302  const Name&
303  getStrategy() const
304  {
305  BOOST_ASSERT(this->hasStrategy());
306  return m_strategy;
307  }
308 
310  setStrategy(const Name& strategy)
311  {
312  m_wire.reset();
313  m_strategy = strategy;
314  m_hasFields[CONTROL_PARAMETER_STRATEGY] = true;
315  return *this;
316  }
317 
320  {
321  m_wire.reset();
322  m_hasFields[CONTROL_PARAMETER_STRATEGY] = false;
323  return *this;
324  }
325 
326  bool
328  {
329  return m_hasFields[CONTROL_PARAMETER_EXPIRATION_PERIOD];
330  }
331 
332  const time::milliseconds&
334  {
335  BOOST_ASSERT(this->hasExpirationPeriod());
336  return m_expirationPeriod;
337  }
338 
340  setExpirationPeriod(const time::milliseconds& expirationPeriod)
341  {
342  m_wire.reset();
343  m_expirationPeriod = expirationPeriod;
344  m_hasFields[CONTROL_PARAMETER_EXPIRATION_PERIOD] = true;
345  return *this;
346  }
347 
350  {
351  m_wire.reset();
352  m_hasFields[CONTROL_PARAMETER_EXPIRATION_PERIOD] = false;
353  return *this;
354  }
355 
356  const std::vector<bool>&
358  {
359  return m_hasFields;
360  }
361 
362 private: // fields
363  std::vector<bool> m_hasFields;
364 
365  Name m_name;
366  uint64_t m_faceId;
367  std::string m_uri;
368  LocalControlFeature m_localControlFeature;
369  uint64_t m_origin;
370  uint64_t m_cost;
371  uint64_t m_flags;
372  Name m_strategy;
373  time::milliseconds m_expirationPeriod;
374 
375 private:
376  mutable Block m_wire;
377 };
378 
379 
380 template<bool T>
381 inline size_t
383 {
384  size_t totalLength = 0;
385 
386  if (this->hasExpirationPeriod()) {
387  totalLength += prependNonNegativeIntegerBlock(encoder,
388  tlv::nfd::ExpirationPeriod, m_expirationPeriod.count());
389  }
390  if (this->hasStrategy()) {
391  totalLength += prependNestedBlock(encoder, tlv::nfd::Strategy, m_strategy);
392  }
393  if (this->hasFlags()) {
394  totalLength += prependNonNegativeIntegerBlock(encoder, tlv::nfd::Flags, m_flags);
395  }
396  if (this->hasCost()) {
397  totalLength += prependNonNegativeIntegerBlock(encoder, tlv::nfd::Cost, m_cost);
398  }
399  if (this->hasOrigin()) {
400  totalLength += prependNonNegativeIntegerBlock(encoder, tlv::nfd::Origin, m_origin);
401  }
402  if (this->hasLocalControlFeature()) {
403  totalLength += prependNonNegativeIntegerBlock(encoder,
404  tlv::nfd::LocalControlFeature, m_localControlFeature);
405  }
406  if (this->hasUri()) {
407  size_t valLength = encoder.prependByteArray(
408  reinterpret_cast<const uint8_t*>(m_uri.c_str()), m_uri.size());
409  totalLength += valLength;
410  totalLength += encoder.prependVarNumber(valLength);
411  totalLength += encoder.prependVarNumber(tlv::nfd::Uri);
412  }
413  if (this->hasFaceId()) {
414  totalLength += prependNonNegativeIntegerBlock(encoder, tlv::nfd::FaceId, m_faceId);
415  }
416  if (this->hasName()) {
417  totalLength += m_name.wireEncode(encoder);
418  }
419 
420  totalLength += encoder.prependVarNumber(totalLength);
421  totalLength += encoder.prependVarNumber(tlv::nfd::ControlParameters);
422  return totalLength;
423 }
424 
425 inline const Block&
427 {
428  if (m_wire.hasWire())
429  return m_wire;
430 
431  EncodingEstimator estimator;
432  size_t estimatedSize = wireEncode(estimator);
433 
434  EncodingBuffer buffer(estimatedSize, 0);
435  wireEncode(buffer);
436 
437  m_wire = buffer.block();
438  return m_wire;
439 }
440 
441 inline void
443 {
444  if (block.type() != tlv::nfd::ControlParameters) {
445  throw Error("expecting TLV-TYPE ControlParameters");
446  }
447  m_wire = block;
448  m_wire.parse();
450 
451  val = m_wire.find(Tlv::Name);
452  m_hasFields[CONTROL_PARAMETER_NAME] = val != m_wire.elements_end();
453  if (this->hasName()) {
454  m_name.wireDecode(*val);
455  }
456 
457  val = m_wire.find(tlv::nfd::FaceId);
458  m_hasFields[CONTROL_PARAMETER_FACE_ID] = val != m_wire.elements_end();
459  if (this->hasFaceId()) {
460  m_faceId = static_cast<uint64_t>(readNonNegativeInteger(*val));
461  }
462 
463  val = m_wire.find(tlv::nfd::Uri);
464  m_hasFields[CONTROL_PARAMETER_URI] = val != m_wire.elements_end();
465  if (this->hasUri()) {
466  m_uri.assign(reinterpret_cast<const char*>(val->value()), val->value_size());
467  }
468 
469  val = m_wire.find(tlv::nfd::LocalControlFeature);
470  m_hasFields[CONTROL_PARAMETER_LOCAL_CONTROL_FEATURE] = val != m_wire.elements_end();
471  if (this->hasLocalControlFeature()) {
472  m_localControlFeature = static_cast<LocalControlFeature>(readNonNegativeInteger(*val));
473  }
474 
475  val = m_wire.find(tlv::nfd::Origin);
476  m_hasFields[CONTROL_PARAMETER_ORIGIN] = val != m_wire.elements_end();
477  if (this->hasOrigin()) {
478  m_origin = static_cast<uint64_t>(readNonNegativeInteger(*val));
479  }
480 
481  val = m_wire.find(tlv::nfd::Cost);
482  m_hasFields[CONTROL_PARAMETER_COST] = val != m_wire.elements_end();
483  if (this->hasCost()) {
484  m_cost = static_cast<uint64_t>(readNonNegativeInteger(*val));
485  }
486 
487  val = m_wire.find(tlv::nfd::Flags);
488  m_hasFields[CONTROL_PARAMETER_FLAGS] = val != m_wire.elements_end();
489  if (this->hasFlags()) {
490  m_flags = static_cast<uint64_t>(readNonNegativeInteger(*val));
491  }
492 
493  val = m_wire.find(tlv::nfd::Strategy);
494  m_hasFields[CONTROL_PARAMETER_STRATEGY] = val != m_wire.elements_end();
495  if (this->hasStrategy()) {
496  val->parse();
497  if (val->elements().empty()) {
498  throw Error("expecting Strategy/Name");
499  }
500  else {
501  m_strategy.wireDecode(*val->elements_begin());
502  }
503  }
504 
505  val = m_wire.find(tlv::nfd::ExpirationPeriod);
506  m_hasFields[CONTROL_PARAMETER_EXPIRATION_PERIOD] = val != m_wire.elements_end();
507  if (this->hasExpirationPeriod()) {
508  m_expirationPeriod = time::milliseconds(readNonNegativeInteger(*val));
509  }
510 }
511 
512 inline std::ostream&
513 operator<<(std::ostream& os, const ControlParameters& parameters)
514 {
515  os << "ControlParameters(";
516 
517  if (parameters.hasName()) {
518  os << "Name: " << parameters.getName() << ", ";
519  }
520 
521  if (parameters.hasFaceId()) {
522  os << "FaceId: " << parameters.getFaceId() << ", ";
523  }
524 
525  if (parameters.hasUri()) {
526  os << "Uri: " << parameters.getUri() << ", ";
527  }
528 
529  if (parameters.hasLocalControlFeature()) {
530  os << "LocalControlFeature: " << parameters.getLocalControlFeature() << ", ";
531  }
532 
533  if (parameters.hasOrigin()) {
534  os << "Origin: " << parameters.getOrigin() << ", ";
535  }
536 
537  if (parameters.hasCost()) {
538  os << "Cost: " << parameters.getCost() << ", ";
539  }
540 
541  if (parameters.hasFlags()) {
542  os << "Flags: " << parameters.getFlags() << ", ";
543  }
544 
545  if (parameters.hasStrategy()) {
546  os << "Strategy: " << parameters.getStrategy() << ", ";
547  }
548 
549  if (parameters.hasExpirationPeriod()) {
550  os << "ExpirationPeriod: " << parameters.getExpirationPeriod() << ", ";
551  }
552 
553  os << ")";
554  return os;
555 }
556 
557 
558 } // namespace nfd
559 } // namespace ndn
560 
561 #endif // NDN_MANAGEMENT_NFD_CONTROL_PARAMETERS_HPP
std::ostream & operator<<(std::ostream &os, const ControlParameters &parameters)
ControlParameters & setFaceId(uint64_t faceId)
size_t prependNestedBlock(EncodingImpl< P > &encoder, uint32_t type, const U &nestedBlock)
represents parameters in a ControlCommand request or response
element_const_iterator find(uint32_t type) const
Definition: block.hpp:343
void wireDecode(const Block &wire)
ControlParameters & setFlags(uint64_t flags)
Class representing wire element of the NDN packet.
Definition: block.hpp:26
uint64_t readNonNegativeInteger(const Block &block)
ControlParameters & setUri(const std::string &uri)
ControlParameters & setStrategy(const Name &strategy)
ControlParameters & setExpirationPeriod(const time::milliseconds &expirationPeriod)
element_const_iterator elements_end() const
Definition: block.hpp:476
const std::vector< bool > & getPresentFields() const
ControlParameters & setLocalControlFeature(LocalControlFeature localControlFeature)
ControlParameters & unsetExpirationPeriod()
element_container::const_iterator element_const_iterator
Definition: block.hpp:31
void reset()
Reset wire buffer of the element.
Definition: block.hpp:300
A Name holds an array of Name::Component and represents an NDN name.
Definition: name.hpp:26
const std::string CONTROL_PARAMETER_FIELD[CONTROL_PARAMETER_UBOUND]
size_t wireEncode(EncodingImpl< T > &block) const
Fast encoding or block size estimation.
Definition: name.hpp:711
void parse() const
Parse wire buffer into subblocks.
Definition: block.cpp:265
uint32_t type() const
Definition: block.hpp:320
LocalControlFeature getLocalControlFeature() const
ControlParameters & setCost(uint64_t cost)
const time::milliseconds & getExpirationPeriod() const
ControlParameters & setOrigin(uint64_t origin)
ControlParameters & setName(const Name &name)
bool hasWire() const
Check if the Block has fully encoded wire.
Definition: block.hpp:288
size_t prependNonNegativeIntegerBlock(EncodingImpl< P > &encoder, uint32_t type, uint64_t number)
helper methods
void wireDecode(const Block &wire)
Definition: name.hpp:746
const std::string & getUri() const
Class representing wire element of the NDN packet.
ControlParameters & unsetLocalControlFeature()