control-response.cpp
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2013-2019 Regents of the University of California.
4  *
5  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
6  *
7  * ndn-cxx library is free software: you can redistribute it and/or modify it under the
8  * terms of the GNU Lesser General Public License as published by the Free Software
9  * Foundation, either version 3 of the License, or (at your option) any later version.
10  *
11  * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
12  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
13  * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
14  *
15  * You should have received copies of the GNU General Public License and GNU Lesser
16  * General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
17  * <http://www.gnu.org/licenses/>.
18  *
19  * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
20  */
21 
25 
26 namespace ndn {
27 namespace mgmt {
28 
29 // BOOST_CONCEPT_ASSERT((boost::EqualityComparable<ControlResponse>));
30 BOOST_CONCEPT_ASSERT((WireEncodable<ControlResponse>));
31 BOOST_CONCEPT_ASSERT((WireDecodable<ControlResponse>));
32 static_assert(std::is_base_of<tlv::Error, ControlResponse::Error>::value,
33  "ControlResponse::Error must inherit from tlv::Error");
34 
36  : m_code(200)
37 {
38 }
39 
40 ControlResponse::ControlResponse(uint32_t code, const std::string& text)
41  : m_code(code)
42  , m_text(text)
43 {
44 }
45 
47 {
48  wireDecode(block);
49 }
50 
51 const Block&
53 {
54  if (m_wire.hasWire())
55  return m_wire;
56 
60 
61  if (m_body.hasWire()) {
63  }
64 
65  m_wire.encode();
66  return m_wire;
67 }
68 
69 void
71 {
72  m_wire = wire;
73  m_wire.parse();
74 
76  NDN_THROW(Error("ControlResponse", m_wire.type()));
77 
78  auto val = m_wire.elements_begin();
79  if (val == m_wire.elements_end() || val->type() != tlv::nfd::StatusCode) {
80  NDN_THROW(Error("missing StatusCode sub-element"));
81  }
82  m_code = readNonNegativeIntegerAs<uint32_t>(*val);
83  ++val;
84 
85  if (val == m_wire.elements_end() || val->type() != tlv::nfd::StatusText) {
86  NDN_THROW(Error("missing StatusText sub-element"));
87  }
88  m_text = readString(*val);
89  ++val;
90 
91  if (val != m_wire.elements_end())
92  m_body = *val;
93  else
94  m_body = {};
95 }
96 
97 std::ostream&
98 operator<<(std::ostream& os, const ControlResponse& response)
99 {
100  os << response.getCode() << " " << response.getText();
101  return os;
102 }
103 
104 } // namespace mgmt
105 } // namespace ndn
Definition: data.cpp:26
void parse() const
Parse TLV-VALUE into sub-elements.
Definition: block.cpp:325
Represents a TLV element of the NDN packet format.
Definition: block.hpp:42
const Block & wireEncode() const
bool hasWire() const noexcept
Check if the Block contains a fully encoded wire representation.
Definition: block.hpp:217
std::string readString(const Block &block)
Read TLV-VALUE of a TLV element as a string.
element_const_iterator elements_begin() const
Equivalent to elements().begin()
Definition: block.hpp:386
Block makeNonNegativeIntegerBlock(uint32_t type, uint64_t value)
Create a TLV block containing a non-negative integer.
#define NDN_THROW(e)
Definition: exception.hpp:61
element_const_iterator elements_end() const
Equivalent to elements().end()
Definition: block.hpp:394
Block makeStringBlock(uint32_t type, const std::string &value)
Create a TLV block containing a string.
void push_back(const Block &element)
Append a sub-element.
Definition: block.cpp:457
std::ostream & operator<<(std::ostream &os, const ControlResponse &response)
void wireDecode(const Block &block)
void encode()
Encode sub-elements into TLV-VALUE.
Definition: block.cpp:353
const std::string & getText() const
ControlCommand response.
uint32_t type() const
Return the TLV-TYPE of the Block.
Definition: block.hpp:261