blob: fa7f8840ff87f539911a5683cfd45839c99fcc4f [file] [log] [blame]
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
/**
* Copyright (C) 2013 Regents of the University of California.
* See COPYING for copyright and distribution information.
*/
#ifndef NDN_MANAGEMENT_NFD_STATUS_HPP
#define NDN_MANAGEMENT_NFD_STATUS_HPP
#include "../encoding/tlv-nfd.hpp"
#include "../encoding/tlv.hpp"
#include "../encoding/encoding-buffer.hpp"
#include <boost/chrono/include.hpp>
namespace ndn {
namespace nfd {
class Status {
public:
struct Error : public Tlv::Error
{
Error(const std::string& what)
: Tlv::Error(what)
{
}
};
Status();
explicit
Status(const Block& payload)
{
this->wireDecode(payload);
}
// Status is encoded as a series of blocks within Data Payload, not a single block.
// Thus there is no "const Block& wireEncode() const" method.
template<bool T>
size_t
wireEncode(EncodingImpl<T>& encoder) const;
void
wireDecode(const Block& payload);
public:
typedef boost::chrono::time_point<boost::chrono::system_clock, boost::chrono::seconds> Timestamp;
int
getNfdVersion() const
{
return m_nfdVersion;
}
void
setNfdVersion(int nfdVersion)
{
m_nfdVersion = nfdVersion;
}
Timestamp
getStartTimestamp() const
{
return m_startTimestamp;
}
void
setStartTimestamp(Timestamp startTimestamp)
{
m_startTimestamp = startTimestamp;
}
Timestamp
getCurrentTimestamp() const
{
return m_currentTimestamp;
}
void
setCurrentTimestamp(Timestamp currentTimestamp)
{
m_currentTimestamp = currentTimestamp;
}
size_t
getNNameTreeEntries() const
{
return m_nNameTreeEntries;
}
void
setNNameTreeEntries(size_t nNameTreeEntries)
{
m_nNameTreeEntries = nNameTreeEntries;
}
size_t
getNFibEntries() const
{
return m_nFibEntries;
}
void
setNFibEntries(size_t nFibEntries)
{
m_nFibEntries = nFibEntries;
}
size_t
getNPitEntries() const
{
return m_nPitEntries;
}
void
setNPitEntries(size_t nPitEntries)
{
m_nPitEntries = nPitEntries;
}
size_t
getNMeasurementsEntries() const
{
return m_nMeasurementsEntries;
}
void
setNMeasurementsEntries(size_t nMeasurementsEntries)
{
m_nMeasurementsEntries = nMeasurementsEntries;
}
size_t
getNCsEntries() const
{
return m_nCsEntries;
}
void
setNCsEntries(size_t nCsEntries)
{
m_nCsEntries = nCsEntries;
}
int
getNInInterests() const
{
return m_nInInterests;
}
void
setNInInterests(int nInInterests)
{
m_nInInterests = nInInterests;
}
int
getNOutInterests() const
{
return m_nOutInterests;
}
void
setNOutInterests(int nOutInterests)
{
m_nOutInterests = nOutInterests;
}
int
getNInDatas() const
{
return m_nInDatas;
}
void
setNInDatas(int nInDatas)
{
m_nInDatas = nInDatas;
}
int
getNOutDatas() const
{
return m_nOutDatas;
}
void
setNOutDatas(int nOutDatas)
{
m_nOutDatas = nOutDatas;
}
private:
int m_nfdVersion;
Timestamp m_startTimestamp;
Timestamp m_currentTimestamp;
size_t m_nNameTreeEntries;
size_t m_nFibEntries;
size_t m_nPitEntries;
size_t m_nMeasurementsEntries;
size_t m_nCsEntries;
int m_nInInterests;
int m_nOutInterests;
int m_nInDatas;
int m_nOutDatas;
};
BOOST_STATIC_ASSERT((boost::is_same<Status::Timestamp::period, boost::ratio<1> >::value));
inline
Status::Status()
{
m_nfdVersion = 0;
m_startTimestamp = Timestamp::min();
m_currentTimestamp = Timestamp::min();
m_nNameTreeEntries = 0;
m_nFibEntries = 0;
m_nPitEntries = 0;
m_nMeasurementsEntries = 0;
m_nCsEntries = 0;
m_nInInterests = 0;
m_nOutInterests = 0;
m_nInDatas = 0;
m_nOutDatas = 0;
}
template<bool T>
inline size_t
Status::wireEncode(EncodingImpl<T>& encoder) const
{
size_t total_len = 0;
total_len += prependNonNegativeIntegerBlock(encoder, tlv::nfd::NOutDatas,
m_nOutDatas);
total_len += prependNonNegativeIntegerBlock(encoder, tlv::nfd::NInDatas,
m_nInDatas);
total_len += prependNonNegativeIntegerBlock(encoder, tlv::nfd::NOutInterests,
m_nOutInterests);
total_len += prependNonNegativeIntegerBlock(encoder, tlv::nfd::NInInterests,
m_nInInterests);
total_len += prependNonNegativeIntegerBlock(encoder, tlv::nfd::NCsEntries,
m_nCsEntries);
total_len += prependNonNegativeIntegerBlock(encoder, tlv::nfd::NMeasurementsEntries,
m_nMeasurementsEntries);
total_len += prependNonNegativeIntegerBlock(encoder, tlv::nfd::NPitEntries,
m_nPitEntries);
total_len += prependNonNegativeIntegerBlock(encoder, tlv::nfd::NFibEntries,
m_nFibEntries);
total_len += prependNonNegativeIntegerBlock(encoder, tlv::nfd::NNameTreeEntries,
m_nNameTreeEntries);
total_len += prependNonNegativeIntegerBlock(encoder, tlv::nfd::CurrentTimestamp,
m_currentTimestamp.time_since_epoch().count());
total_len += prependNonNegativeIntegerBlock(encoder, tlv::nfd::StartTimestamp,
m_startTimestamp.time_since_epoch().count());
total_len += prependNonNegativeIntegerBlock(encoder, tlv::nfd::NfdVersion,
m_nfdVersion);
return total_len;
}
inline void
Status::wireDecode(const Block& payload)
{
m_nfdVersion = 0;
m_startTimestamp = Timestamp::min();
m_currentTimestamp = Timestamp::min();
m_nNameTreeEntries = 0;
m_nFibEntries = 0;
m_nPitEntries = 0;
m_nMeasurementsEntries = 0;
m_nCsEntries = 0;
m_nInInterests = 0;
m_nOutInterests = 0;
m_nInDatas = 0;
m_nOutDatas = 0;
if (payload.type() != Tlv::Content) {
throw Error("Requested decoding of Status Payload, but block is not Content");
}
payload.parse();
Block::element_const_iterator val;
val = payload.find(tlv::nfd::NfdVersion);
if (val != payload.elements_end()) {
m_nfdVersion = static_cast<int>(readNonNegativeInteger(*val));
}
val = payload.find(tlv::nfd::StartTimestamp);
if (val != payload.elements_end()) {
m_startTimestamp = Timestamp(boost::chrono::seconds(readNonNegativeInteger(*val)));
}
val = payload.find(tlv::nfd::CurrentTimestamp);
if (val != payload.elements_end()) {
m_currentTimestamp = Timestamp(boost::chrono::seconds(readNonNegativeInteger(*val)));
}
val = payload.find(tlv::nfd::NNameTreeEntries);
if (val != payload.elements_end()) {
m_nNameTreeEntries = static_cast<size_t>(readNonNegativeInteger(*val));
}
val = payload.find(tlv::nfd::NFibEntries);
if (val != payload.elements_end()) {
m_nFibEntries = static_cast<size_t>(readNonNegativeInteger(*val));
}
val = payload.find(tlv::nfd::NPitEntries);
if (val != payload.elements_end()) {
m_nPitEntries = static_cast<size_t>(readNonNegativeInteger(*val));
}
val = payload.find(tlv::nfd::NMeasurementsEntries);
if (val != payload.elements_end()) {
m_nMeasurementsEntries = static_cast<size_t>(readNonNegativeInteger(*val));
}
val = payload.find(tlv::nfd::NCsEntries);
if (val != payload.elements_end()) {
m_nCsEntries = static_cast<size_t>(readNonNegativeInteger(*val));
}
val = payload.find(tlv::nfd::NInInterests);
if (val != payload.elements_end()) {
m_nInInterests = static_cast<int>(readNonNegativeInteger(*val));
}
val = payload.find(tlv::nfd::NOutInterests);
if (val != payload.elements_end()) {
m_nOutInterests = static_cast<int>(readNonNegativeInteger(*val));
}
val = payload.find(tlv::nfd::NInDatas);
if (val != payload.elements_end()) {
m_nInDatas = static_cast<int>(readNonNegativeInteger(*val));
}
val = payload.find(tlv::nfd::NOutDatas);
if (val != payload.elements_end()) {
m_nOutDatas = static_cast<int>(readNonNegativeInteger(*val));
}
}
} // namespace nfd
} // namespace ndn
#endif // NDN_MANAGEMENT_NFD_STATUS_HPP