All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
nfd-local-control-header.hpp
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
7 #ifndef NDN_MANAGEMENT_NFD_LOCAL_CONTROL_HEADER_HPP
8 #define NDN_MANAGEMENT_NFD_LOCAL_CONTROL_HEADER_HPP
9 
10 #include "../encoding/encoding-buffer.hpp"
11 #include "../encoding/tlv-nfd.hpp"
12 
13 namespace ndn {
14 namespace nfd {
15 
17 {
18 public:
19  class Error : public std::runtime_error
20  {
21  public:
22  explicit
23  Error(const std::string& what)
24  : std::runtime_error(what)
25  {
26  }
27  };
28 
30  : m_incomingFaceId(INVALID_FACE_ID)
31  , m_nextHopFaceId(INVALID_FACE_ID)
32  {
33  }
34 
40  explicit
42  bool encodeIncomingFaceId = true, bool encodeNextHopFaceId = true)
43  {
44  wireDecode(wire, encodeIncomingFaceId, encodeNextHopFaceId);
45  }
46 
66  template<class U>
67  inline Block
68  wireEncode(const U& payload,
69  bool encodeIncomingFaceId, bool encodeNextHopFaceId) const;
70 
77  inline void
78  wireDecode(const Block& wire,
79  bool encodeIncomingFaceId = true, bool encodeNextHopFaceId = true);
80 
81  inline static const Block&
82  getPayload(const Block& wire);
83 
87  // Getters/setters
88 
89  bool
90  empty(bool encodeIncomingFaceId, bool encodeNextHopFaceId) const
91  {
92  return !((encodeIncomingFaceId && hasIncomingFaceId()) ||
93  (encodeNextHopFaceId && hasNextHopFaceId()));
94  }
95 
96  //
97 
98  bool
100  {
101  return m_incomingFaceId != INVALID_FACE_ID;
102  }
103 
104  uint64_t
106  {
107  return m_incomingFaceId;
108  }
109 
110  void
111  setIncomingFaceId(uint64_t incomingFaceId)
112  {
113  m_incomingFaceId = incomingFaceId;
114  }
115 
116  //
117 
118  bool
120  {
121  return m_nextHopFaceId != INVALID_FACE_ID;
122  }
123 
124  uint64_t
126  {
127  return m_nextHopFaceId;
128  }
129 
130  void
131  setNextHopFaceId(uint64_t nextHopFaceId)
132  {
133  m_nextHopFaceId = nextHopFaceId;
134  }
135 
136 private:
137  template<bool T>
138  inline size_t
139  wireEncode(EncodingImpl<T>& block, size_t payloadSize,
140  bool encodeIncomingFaceId, bool encodeNextHopFaceId) const;
141 
142 private:
143  uint64_t m_incomingFaceId;
144  uint64_t m_nextHopFaceId;
145 };
146 
147 
151 template<bool T>
152 inline size_t
153 LocalControlHeader::wireEncode(EncodingImpl<T>& block, size_t payloadSize,
154  bool encodeIncomingFaceId, bool encodeNextHopFaceId) const
155 {
156  size_t totalLength = payloadSize;
157 
158  if (encodeIncomingFaceId && hasIncomingFaceId())
159  {
160  totalLength += prependNonNegativeIntegerBlock(block,
162  }
163 
164  if (encodeNextHopFaceId && hasNextHopFaceId())
165  {
166  totalLength += prependNonNegativeIntegerBlock(block,
168  }
169 
170  totalLength += block.prependVarNumber(totalLength);
171  totalLength += block.prependVarNumber(tlv::nfd::LocalControlHeader);
172  return totalLength;
173 }
174 
175 template<class U>
176 inline Block
178  bool encodeIncomingFaceId, bool encodeNextHopFaceId) const
179 {
181  if (empty(encodeIncomingFaceId, encodeNextHopFaceId))
182  throw Error("Requested wire for LocalControlHeader, but none of the fields are set or enabled");
183 
184  EncodingEstimator estimator;
185  size_t length = wireEncode(estimator, payload.wireEncode().size(),
186  encodeIncomingFaceId, encodeNextHopFaceId);
187 
188  EncodingBuffer buffer(length);
189  wireEncode(buffer, payload.wireEncode().size(),
190  encodeIncomingFaceId, encodeNextHopFaceId);
191 
192  return buffer.block(false);
193 }
194 
195 inline void
197  bool encodeIncomingFaceId/* = true*/,
198  bool encodeNextHopFaceId/* = true*/)
199 {
200  BOOST_ASSERT(wire.type() == tlv::nfd::LocalControlHeader);
201  wire.parse();
202 
203  m_incomingFaceId = INVALID_FACE_ID;
204  m_nextHopFaceId = INVALID_FACE_ID;
205 
207  i != wire.elements_end();
208  ++i)
209  {
210  switch (i->type())
211  {
213  if (encodeIncomingFaceId)
214  m_incomingFaceId = readNonNegativeInteger(*i);
215  break;
217  if (encodeNextHopFaceId)
218  m_nextHopFaceId = readNonNegativeInteger(*i);
219  break;
220  default:
221  // ignore all unsupported
222  break;
223  }
224  }
225 }
226 
227 inline const Block&
229 {
230  if (wire.type() == tlv::nfd::LocalControlHeader)
231  {
232  wire.parse();
233  if (wire.elements_size() < 1)
234  return wire; // don't throw an error, but don't continue processing
235 
236  return wire.elements()[wire.elements().size()-1];
237  }
238  else
239  {
240  return wire;
241  }
242 }
243 
244 
245 } // namespace nfd
246 } // namespace ndn
247 
248 #endif // NDN_MANAGEMENT_NFD_LOCAL_CONTROL_HEADER_HPP
LocalControlHeader(const Block &wire, bool encodeIncomingFaceId=true, bool encodeNextHopFaceId=true)
Create from wire encoding.
const element_container & elements() const
Get all subelements.
Definition: block.hpp:464
Class representing wire element of the NDN packet.
Definition: block.hpp:26
uint64_t readNonNegativeInteger(const Block &block)
void wireDecode(const Block &wire, bool encodeIncomingFaceId=true, bool encodeNextHopFaceId=true)
Decode from the wire format and set LocalControlHeader on the supplied item.
element_const_iterator elements_end() const
Definition: block.hpp:476
static const Block & getPayload(const Block &wire)
element_const_iterator elements_begin() const
Definition: block.hpp:470
element_container::const_iterator element_const_iterator
Definition: block.hpp:31
size_t elements_size() const
Definition: block.hpp:482
bool empty(bool encodeIncomingFaceId, bool encodeNextHopFaceId) const
void parse() const
Parse wire buffer into subblocks.
Definition: block.cpp:265
uint32_t type() const
Definition: block.hpp:320
size_t prependNonNegativeIntegerBlock(EncodingImpl< P > &encoder, uint32_t type, uint64_t number)
helper methods
Block wireEncode(const U &payload, bool encodeIncomingFaceId, bool encodeNextHopFaceId) const
Create wire encoding with options LocalControlHeader and the supplied item.
void setIncomingFaceId(uint64_t incomingFaceId)
void setNextHopFaceId(uint64_t nextHopFaceId)
Class representing wire element of the NDN packet.
const uint64_t INVALID_FACE_ID
Definition: tlv-nfd.hpp:75