blob: 568dace305aad65165635af953c77b69e2086413 [file] [log] [blame]
Junxiao Shi70911652014-08-12 10:14:24 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
3 * Copyright (c) 2013-2014 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
22#include "nfd-control-response.hpp"
23
24namespace ndn {
25namespace nfd {
26
27ControlResponse::ControlResponse()
28 : m_code(200)
29{
30}
31
32ControlResponse::ControlResponse(uint32_t code, const std::string& text)
33 : m_code(code)
34 , m_text(text)
35{
36}
37
38ControlResponse::ControlResponse(const Block& block)
39{
40 wireDecode(block);
41}
42
43const Block&
44ControlResponse::wireEncode() const
45{
46 if (m_wire.hasWire())
47 return m_wire;
48
49 m_wire = Block(tlv::nfd::ControlResponse);
50 m_wire.push_back
51 (nonNegativeIntegerBlock(tlv::nfd::StatusCode, m_code));
52
53 m_wire.push_back
54 (dataBlock(tlv::nfd::StatusText, m_text.c_str(), m_text.size()));
55
56 if (m_body.hasWire())
57 {
58 m_wire.push_back(m_body);
59 }
60
61 m_wire.encode();
62 return m_wire;
63}
64
65void
66ControlResponse::wireDecode(const Block& wire)
67{
68 m_wire = wire;
69 m_wire.parse();
70
71 if (m_wire.type() != tlv::nfd::ControlResponse)
72 throw Error("Requested decoding of ControlResponse, but Block is of different type");
73
74 Block::element_const_iterator val = m_wire.elements_begin();
75 if (val == m_wire.elements_end() ||
76 val->type() != tlv::nfd::StatusCode)
77 {
78 throw Error("Incorrect ControlResponse format (StatusCode missing or not the first item)");
79 }
80
81 m_code = readNonNegativeInteger(*val);
82 ++val;
83
84 if (val == m_wire.elements_end() ||
85 val->type() != tlv::nfd::StatusText)
86 {
87 throw Error("Incorrect ControlResponse format (StatusText missing or not the second item)");
88 }
89 m_text.assign(reinterpret_cast<const char*>(val->value()), val->value_size());
90 ++val;
91
92 if (val != m_wire.elements_end())
93 m_body = *val;
94 else
95 m_body = Block();
96}
97
98std::ostream&
99operator<<(std::ostream& os, const ControlResponse& response)
100{
101 os << response.getCode() << " " << response.getText();
102 return os;
103}
104
105} // namespace nfd
106} // namespace ndn