25 #include <ndn-cxx/util/concepts.hpp> 26 #include <ndn-cxx/encoding/block-helpers.hpp> 31 BOOST_CONCEPT_ASSERT((ndn::WireEncodable<LsaInfo>));
32 BOOST_CONCEPT_ASSERT((ndn::WireDecodable<LsaInfo>));
33 static_assert(std::is_base_of<ndn::tlv::Error, LsaInfo::Error>::value,
34 "LsaInfo::Error must inherit from tlv::Error");
40 , m_expirationPeriod(INFINITE_EXPIRATION_PERIOD)
41 , m_hasInfiniteExpirationPeriod(true)
50 template<ndn::encoding::Tag TAG>
54 size_t totalLength = 0;
57 if (!m_hasInfiniteExpirationPeriod) {
58 totalLength += prependNonNegativeIntegerBlock(encoder,
60 m_expirationPeriod.count());
63 totalLength += prependNonNegativeIntegerBlock(encoder,
69 totalLength += encoder.prependVarNumber(totalLength);
76 LsaInfo::wireEncode<ndn::encoding::EncoderTag>(ndn::EncodingImpl<ndn::encoding::EncoderTag>& block)
const;
79 LsaInfo::wireEncode<ndn::encoding::EstimatorTag>(ndn::EncodingImpl<ndn::encoding::EstimatorTag>& block)
const;
84 if (m_wire.hasWire()) {
88 ndn::EncodingEstimator estimator;
91 ndn::EncodingBuffer buffer(estimatedSize, 0);
94 m_wire = buffer.block();
102 m_originRouter.clear();
103 m_sequenceNumber = 0;
104 m_expirationPeriod = ndn::time::milliseconds::min();
109 std::stringstream error;
110 error <<
"Expected LsaInfo Block, but Block is of a different type: #" 112 BOOST_THROW_EXCEPTION(
Error(error.str()));
117 ndn::Block::element_const_iterator val = m_wire.elements_begin();
121 ndn::Block::element_const_iterator it = val->elements_begin();
123 if (it != val->elements_end() && it->type() == ndn::tlv::Name) {
124 m_originRouter.wireDecode(*it);
127 BOOST_THROW_EXCEPTION(
Error(
"OriginRouter: Missing required Name field"));
133 BOOST_THROW_EXCEPTION(
Error(
"Missing required OriginRouter field"));
137 m_sequenceNumber = ndn::readNonNegativeInteger(*val);
141 BOOST_THROW_EXCEPTION(
Error(
"Missing required SequenceNumber field"));
145 m_expirationPeriod = ndn::time::milliseconds(ndn::readNonNegativeInteger(*val));
146 m_hasInfiniteExpirationPeriod =
false;
150 m_hasInfiniteExpirationPeriod =
true;
165 os <<
"ExpirationPeriod: Infinity";
173 std::shared_ptr<LsaInfo>
176 std::shared_ptr<LsaInfo> lsaInfo = std::make_shared<LsaInfo>();
181 ndn::time::system_clock::duration duration
184 lsaInfo->setExpirationPeriod(ndn::time::duration_cast<ndn::time::milliseconds>(duration));
const ndn::time::system_clock::TimePoint & getExpirationTimePoint() const
const ndn::Name & getOrigRouter() const
const ndn::time::milliseconds & getExpirationPeriod() const
uint32_t getLsSeqNo() const
std::shared_ptr< LsaInfo > makeLsaInfo(const Lsa &lsa)
const ndn::Block & wireEncode() const
Create a TLV encoding of this object.
const ndn::Name & getOriginRouter() const
Data abstraction for LsaInfo.
uint64_t getSequenceNumber() const
Copyright (c) 2014-2018, The University of Memphis, Regents of the University of California, Arizona Board of Regents.
bool hasInfiniteExpirationPeriod() const
std::ostream & operator<<(std::ostream &os, const AdjacencyLsa &adjacencyLsa)
static const ndn::time::milliseconds INFINITE_EXPIRATION_PERIOD
void wireDecode(const ndn::Block &wire)
Populate this object by decoding the one contained in the given block.