lp: IncomingFaceId, NextHopFaceId, CachePolicy tags
LocalControlHeader is deprecated.
This commit also adjusts includes in some lp/ headers.
refs #3296
Change-Id: Icdc7b469d70739fe5c65da51817c92ff9136c923
diff --git a/src/management/nfd-local-control-header.hpp b/src/management/nfd-local-control-header.hpp
index 327035d..3bc049e 100644
--- a/src/management/nfd-local-control-header.hpp
+++ b/src/management/nfd-local-control-header.hpp
@@ -22,309 +22,16 @@
#ifndef NDN_MANAGEMENT_NFD_LOCAL_CONTROL_HEADER_HPP
#define NDN_MANAGEMENT_NFD_LOCAL_CONTROL_HEADER_HPP
-#include "../encoding/encoding-buffer.hpp"
-#include "../encoding/tlv-nfd.hpp"
-#include "../encoding/block-helpers.hpp"
+#include "../lp/tags.hpp"
namespace ndn {
namespace nfd {
-/**
- * @ingroup management
- * @brief Class to handle work with LocalControlHeader
- * @sa http://redmine.named-data.net/projects/nfd/wiki/LocalControlHeader
- */
-class LocalControlHeader
-{
-public:
- class Error : public std::runtime_error
- {
- public:
- explicit
- Error(const std::string& what)
- : std::runtime_error(what)
- {
- }
- };
-
- enum EncodeFlags : uint8_t {
- ENCODE_NONE = 0,
- ENCODE_INCOMING_FACE_ID = (1 << 0),
- ENCODE_NEXT_HOP = (1 << 1),
- ENCODE_CACHING_POLICY = (1 << 2),
- ENCODE_ALL = 0xff
- };
-
- enum CachingPolicy : uint8_t {
- INVALID_POLICY = 0,
- NO_CACHE = 1
- };
-
- LocalControlHeader()
- : m_incomingFaceId(INVALID_FACE_ID)
- , m_nextHopFaceId(INVALID_FACE_ID)
- , m_cachingPolicy(CachingPolicy::INVALID_POLICY)
- {
- }
-
- /**
- * @brief Create from wire encoding
- *
- * @sa wireDecode
- */
- explicit
- LocalControlHeader(const Block& wire, uint8_t encodeMask = ENCODE_ALL)
- {
- wireDecode(wire, encodeMask);
- }
-
- /**
- * @brief Create wire encoding with options LocalControlHeader and the supplied item
- *
- * The caller is responsible of checking whether LocalControlHeader contains
- * any information.
- *
- * !It is an error to call this method if none of IncomingFaceId, NextHopFaceId and CachingPolicy
- * are set, or neither of them are enabled.
- *
- * @throws LocalControlHeader::Error when empty LocalControlHeader be produced
- *
- * @returns Block, containing LocalControlHeader. Top-level length field of the
- * returned LocalControlHeader includes payload length, but the memory
- * block is independent of the payload's wire buffer. It is expected
- * that both LocalControlHeader's and payload's wire will be send out
- * together within a single send call.
- *
- * @see http://redmine.named-data.net/projects/nfd/wiki/LocalControlHeader
- */
- template<class U>
- inline Block
- wireEncode(const U& payload, uint8_t encodeMask = ENCODE_ALL) const;
-
- /**
- * @brief Decode from the wire format and set LocalControlHeader on the supplied item
- *
- * The supplied wire MUST contain LocalControlHeader. Determination whether the optional
- * LocalControlHeader should be done before calling this method.
- */
- inline void
- wireDecode(const Block& wire, uint8_t encodeMask = ENCODE_ALL);
-
- inline static const Block&
- getPayload(const Block& wire);
-
- ///////////////////////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////////
- // Getters/setters
-
- bool
- empty(uint8_t encodeMask) const
- {
- bool needIncomingFaceId = encodeMask & ENCODE_INCOMING_FACE_ID;
- bool needNextHopFaceId = encodeMask & ENCODE_NEXT_HOP;
- bool needCachingPolicy = encodeMask & ENCODE_CACHING_POLICY;
-
- return !((needIncomingFaceId && hasIncomingFaceId()) ||
- (needNextHopFaceId && hasNextHopFaceId()) ||
- (needCachingPolicy && hasCachingPolicy()));
- }
-
- //
-
- bool
- hasIncomingFaceId() const
- {
- return m_incomingFaceId != INVALID_FACE_ID;
- }
-
- uint64_t
- getIncomingFaceId() const
- {
- return m_incomingFaceId;
- }
-
- void
- setIncomingFaceId(uint64_t incomingFaceId)
- {
- m_incomingFaceId = incomingFaceId;
- }
-
- //
-
- bool
- hasNextHopFaceId() const
- {
- return m_nextHopFaceId != INVALID_FACE_ID;
- }
-
- uint64_t
- getNextHopFaceId() const
- {
- return m_nextHopFaceId;
- }
-
- void
- setNextHopFaceId(uint64_t nextHopFaceId)
- {
- m_nextHopFaceId = nextHopFaceId;
- }
-
- //
-
- bool
- hasCachingPolicy() const
- {
- return m_cachingPolicy != CachingPolicy::INVALID_POLICY;
- }
-
- CachingPolicy
- getCachingPolicy() const
- {
- return m_cachingPolicy;
- }
-
- void
- setCachingPolicy(CachingPolicy cachingPolicy)
- {
- m_cachingPolicy = cachingPolicy;
- }
-
-private:
- template<encoding::Tag TAG>
- inline size_t
- wireEncode(EncodingImpl<TAG>& block, size_t payloadSize, uint8_t encodeMask) const;
-
-private:
- uint64_t m_incomingFaceId;
- uint64_t m_nextHopFaceId;
- CachingPolicy m_cachingPolicy;
-};
-
-
-/**
- * @brief Fast encoding or block size estimation
- */
-template<encoding::Tag TAG>
-inline size_t
-LocalControlHeader::wireEncode(EncodingImpl<TAG>& block, size_t payloadSize,
- uint8_t encodeMask) const
-{
- bool needIncomingFaceId = encodeMask & ENCODE_INCOMING_FACE_ID;
- bool needNextHopFaceId = encodeMask & ENCODE_NEXT_HOP;
- bool needCachingPolicy = encodeMask & ENCODE_CACHING_POLICY;
-
- size_t totalLength = payloadSize;
-
- if (needIncomingFaceId && hasIncomingFaceId())
- {
- totalLength += prependNonNegativeIntegerBlock(block,
- tlv::nfd::IncomingFaceId, getIncomingFaceId());
- }
-
- if (needNextHopFaceId && hasNextHopFaceId())
- {
- totalLength += prependNonNegativeIntegerBlock(block,
- tlv::nfd::NextHopFaceId, getNextHopFaceId());
- }
-
- if (needCachingPolicy && hasCachingPolicy())
- {
- size_t cachingPolicyLength = 0;
- cachingPolicyLength += block.prependVarNumber(0);
- cachingPolicyLength += block.prependVarNumber(tlv::nfd::NoCache);
- cachingPolicyLength += block.prependVarNumber(cachingPolicyLength);
- cachingPolicyLength += block.prependVarNumber(tlv::nfd::CachingPolicy);
-
- totalLength += cachingPolicyLength;
- }
-
- totalLength += block.prependVarNumber(totalLength);
- totalLength += block.prependVarNumber(tlv::nfd::LocalControlHeader);
- return totalLength;
-}
-
-template<class U>
-inline Block
-LocalControlHeader::wireEncode(const U& payload, uint8_t encodeMask) const
-{
- /// @todo should this be BOOST_ASSERT instead? This is kind of unnecessary overhead
- if (empty(encodeMask))
- BOOST_THROW_EXCEPTION(Error("Requested wire for LocalControlHeader, but none of the fields are "
- "set or enabled"));
-
- EncodingEstimator estimator;
- size_t length = wireEncode(estimator, payload.wireEncode().size(), encodeMask);
-
- EncodingBuffer buffer(length);
- wireEncode(buffer, payload.wireEncode().size(), encodeMask);
-
- return buffer.block(false);
-}
-
-inline void
-LocalControlHeader::wireDecode(const Block& wire, uint8_t encodeMask)
-{
- bool needIncomingFaceId = encodeMask & ENCODE_INCOMING_FACE_ID;
- bool needNextHopFaceId = encodeMask & ENCODE_NEXT_HOP;
- bool needCachingPolicy = encodeMask & ENCODE_CACHING_POLICY;
-
- BOOST_ASSERT(wire.type() == tlv::nfd::LocalControlHeader);
- wire.parse();
-
- m_incomingFaceId = INVALID_FACE_ID;
- m_nextHopFaceId = INVALID_FACE_ID;
- m_cachingPolicy = CachingPolicy::INVALID_POLICY;
-
- for (Block::element_const_iterator i = wire.elements_begin();
- i != wire.elements_end();
- ++i)
- {
- switch (i->type())
- {
- case tlv::nfd::IncomingFaceId:
- if (needIncomingFaceId)
- m_incomingFaceId = readNonNegativeInteger(*i);
- break;
- case tlv::nfd::NextHopFaceId:
- if (needNextHopFaceId)
- m_nextHopFaceId = readNonNegativeInteger(*i);
- break;
- case tlv::nfd::CachingPolicy:
- if (needCachingPolicy) {
- i->parse();
- Block::element_const_iterator it = i->elements_begin();
- if (it != i->elements_end() && it->type() == tlv::nfd::NoCache) {
- m_cachingPolicy = CachingPolicy::NO_CACHE;
- }
- else {
- BOOST_THROW_EXCEPTION(Error("CachingPolicy: Missing required NoCache field"));
- }
- }
- break;
- default:
- // ignore all unsupported
- break;
- }
- }
-}
-
-inline const Block&
-LocalControlHeader::getPayload(const Block& wire)
-{
- if (wire.type() == tlv::nfd::LocalControlHeader)
- {
- wire.parse();
- if (wire.elements_size() < 1)
- return wire; // don't throw an error, but don't continue processing
-
- return wire.elements()[wire.elements().size()-1];
- }
- else
- {
- return wire;
- }
-}
+#ifdef NDN_LP_KEEP_LOCAL_CONTROL_HEADER
+typedef ndn::lp::LocalControlHeaderFacade LocalControlHeader;
+#else
+#error "LocalControlHeader is deleted"
+#endif // NDN_LP_KEEP_LOCAL_CONTROL_HEADER
} // namespace nfd
} // namespace ndn