blob: b53d198e81b6027328892cdf846c0c95df79336e [file] [log] [blame]
Junxiao Shi65f1a712014-11-20 14:59:36 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Alexander Afanasyev74633892015-02-08 18:08:46 -08003 * Copyright (c) 2013-2015 Regents of the University of California.
Junxiao Shi65f1a712014-11-20 14:59:36 -07004 *
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-channel-status.hpp"
23#include "encoding/tlv-nfd.hpp"
24#include "encoding/block-helpers.hpp"
25#include "util/concepts.hpp"
26
27namespace ndn {
28namespace nfd {
29
30//BOOST_CONCEPT_ASSERT((boost::EqualityComparable<ChannelStatus>));
31BOOST_CONCEPT_ASSERT((WireEncodable<ChannelStatus>));
32BOOST_CONCEPT_ASSERT((WireDecodable<ChannelStatus>));
33static_assert(std::is_base_of<tlv::Error, ChannelStatus::Error>::value,
34 "ChannelStatus::Error must inherit from tlv::Error");
35
36ChannelStatus::ChannelStatus()
37{
38}
39
40ChannelStatus::ChannelStatus(const Block& payload)
41{
42 this->wireDecode(payload);
43}
44
Alexander Afanasyev74633892015-02-08 18:08:46 -080045template<encoding::Tag TAG>
Junxiao Shi65f1a712014-11-20 14:59:36 -070046size_t
Alexander Afanasyev74633892015-02-08 18:08:46 -080047ChannelStatus::wireEncode(EncodingImpl<TAG>& encoder) const
Junxiao Shi65f1a712014-11-20 14:59:36 -070048{
49 size_t totalLength = 0;
50
Alexander Afanasyev74633892015-02-08 18:08:46 -080051 totalLength += encoder.prependByteArrayBlock(tlv::nfd::LocalUri,
Junxiao Shi65f1a712014-11-20 14:59:36 -070052 reinterpret_cast<const uint8_t*>(m_localUri.c_str()), m_localUri.size());
53
54 totalLength += encoder.prependVarNumber(totalLength);
55 totalLength += encoder.prependVarNumber(tlv::nfd::ChannelStatus);
56 return totalLength;
57}
58
59template size_t
Alexander Afanasyev74633892015-02-08 18:08:46 -080060ChannelStatus::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>&) const;
Junxiao Shi65f1a712014-11-20 14:59:36 -070061
62template size_t
Alexander Afanasyev74633892015-02-08 18:08:46 -080063ChannelStatus::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>&) const;
Junxiao Shi65f1a712014-11-20 14:59:36 -070064
65const Block&
66ChannelStatus::wireEncode() const
67{
68 if (m_wire.hasWire())
69 return m_wire;
70
71 EncodingEstimator estimator;
72 size_t estimatedSize = wireEncode(estimator);
73
74 EncodingBuffer buffer(estimatedSize, 0);
75 wireEncode(buffer);
76
77 m_wire = buffer.block();
78 return m_wire;
79}
80
81void
82ChannelStatus::wireDecode(const Block& block)
83{
84 if (block.type() != tlv::nfd::ChannelStatus) {
Spyridon Mastorakis0d2ed2e2015-07-27 19:09:12 -070085 BOOST_THROW_EXCEPTION(Error("Expecting ChannelStatus block"));
Junxiao Shi65f1a712014-11-20 14:59:36 -070086 }
87 m_wire = block;
88 m_wire.parse();
89 Block::element_const_iterator val = m_wire.elements_begin();
90
91 if (val != m_wire.elements_end() && val->type() == tlv::nfd::LocalUri) {
92 m_localUri.assign(reinterpret_cast<const char*>(val->value()), val->value_size());
93 ++val;
94 }
95 else {
Spyridon Mastorakis0d2ed2e2015-07-27 19:09:12 -070096 BOOST_THROW_EXCEPTION(Error("Missing required LocalUri field"));
Junxiao Shi65f1a712014-11-20 14:59:36 -070097 }
98}
99
100ChannelStatus&
101ChannelStatus::setLocalUri(const std::string localUri)
102{
103 m_wire.reset();
104 m_localUri = localUri;
105 return *this;
106}
107
108} // namespace nfd
109} // namespace ndn