blob: db4aef4587f1f73d98f07145e3734aa21945d2ed [file] [log] [blame]
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
* ndn-cxx library is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later version.
*
* ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received copies of the GNU General Public License and GNU Lesser
* General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
* <http://www.gnu.org/licenses/>.
*
* See AUTHORS.md for complete list of ndn-cxx authors and contributors.
*/
#ifndef NDN_MANAGEMENT_NFD_FACE_TRAITS_HPP
#define NDN_MANAGEMENT_NFD_FACE_TRAITS_HPP
#include "../encoding/tlv-nfd.hpp"
#include "../encoding/encoding-buffer.hpp"
#include "../encoding/block-helpers.hpp"
namespace ndn {
namespace nfd {
/**
* \ingroup management
* \deprecated provides additional information about a face
*/
enum FaceFlags {
/** \deprecated face is local (for scope control purpose)
*/
FACE_IS_LOCAL = 1,
/** \deprecated face is created on demand (accepted incoming connection,
* not initiated outgoing connection)
*/
FACE_IS_ON_DEMAND = 2
};
/**
* \ingroup management
* \brief provides additional information about a faceScope
*/
enum FaceScope {
/** \brief face is non-local
*/
FACE_SCOPE_NON_LOCAL = 0,
/** \brief face is local
*/
FACE_SCOPE_LOCAL = 1
};
std::ostream&
operator<<(std::ostream& os, FaceScope faceScope);
/**
* \ingroup management
* \brief provides additional information about a facePersistency
*/
enum FacePersistency {
/** \brief face is persistent
*/
FACE_PERSISTENCY_PERSISTENT = 0,
/** \brief face is on-demand
*/
FACE_PERSISTENCY_ON_DEMAND = 1,
/** \brief face is permanent
*/
FACE_PERSISTENCY_PERMANENT = 2
};
std::ostream&
operator<<(std::ostream& os, FacePersistency facePersistency);
/**
* \ingroup management
* \brief provides additional information about a linkType
*/
enum LinkType {
/** \brief link is point-to-point
*/
LINK_TYPE_POINT_TO_POINT = 0,
/** \brief link is multi-access
*/
LINK_TYPE_MULTI_ACCESS = 1
};
std::ostream&
operator<<(std::ostream& os, LinkType linkType);
/** \ingroup management
* \brief providers getters and setters of face information fields
* \tparam C the concrete class; it must provide .wireReset() method
to clear wire encoding when a field changes
*/
template<class C>
class FaceTraits
{
public:
class Error : public tlv::Error
{
public:
explicit
Error(const std::string& what)
: tlv::Error(what)
{
}
};
FaceTraits()
: m_faceId(0)
, m_faceScope(FACE_SCOPE_NON_LOCAL)
, m_facePersistency(FACE_PERSISTENCY_PERSISTENT)
, m_linkType(LINK_TYPE_POINT_TO_POINT)
{
}
uint64_t
getFaceId() const
{
return m_faceId;
}
C&
setFaceId(uint64_t faceId)
{
wireReset();
m_faceId = faceId;
return static_cast<C&>(*this);
}
const std::string&
getRemoteUri() const
{
return m_remoteUri;
}
C&
setRemoteUri(const std::string& remoteUri)
{
wireReset();
m_remoteUri = remoteUri;
return static_cast<C&>(*this);
}
const std::string&
getLocalUri() const
{
return m_localUri;
}
C&
setLocalUri(const std::string& localUri)
{
wireReset();
m_localUri = localUri;
return static_cast<C&>(*this);
}
FaceScope
getFaceScope() const
{
return m_faceScope;
}
C&
setFaceScope(FaceScope faceScope)
{
wireReset();
m_faceScope = faceScope;
return static_cast<C&>(*this);
}
FacePersistency
getFacePersistency() const
{
return m_facePersistency;
}
C&
setFacePersistency(FacePersistency facePersistency)
{
wireReset();
m_facePersistency = facePersistency;
return static_cast<C&>(*this);
}
LinkType
getLinkType() const
{
return m_linkType;
}
C&
setLinkType(LinkType linkType)
{
wireReset();
m_linkType = linkType;
return static_cast<C&>(*this);
}
/**
* \deprecated Use getFaceScope instead
*/
bool
isLocal() const
{
return getFlags() & FACE_IS_LOCAL;
}
/**
* \deprecated Use getFacePersistency instead
*/
bool
isOnDemand() const
{
return getFlags() & FACE_IS_ON_DEMAND;
}
/**
* \deprecated Use getFaceScope, and getFacePersistency instead
*/
uint64_t
getFlags() const
{
uint64_t flags = 0;
if (m_faceScope == FACE_SCOPE_LOCAL)
flags |= FACE_IS_LOCAL;
if (m_facePersistency == FACE_PERSISTENCY_ON_DEMAND)
flags |= FACE_IS_ON_DEMAND;
return flags;
}
/**
* \deprecated Use setFaceScope, and setFacePersistency instead
*/
C&
setFlags(uint64_t flags)
{
wireReset();
if ((flags & FACE_IS_LOCAL) != 0)
m_faceScope = FACE_SCOPE_LOCAL;
else
m_faceScope = FACE_SCOPE_NON_LOCAL;
if ((flags & FACE_IS_ON_DEMAND) != 0)
m_facePersistency = FACE_PERSISTENCY_ON_DEMAND;
else
m_facePersistency = FACE_PERSISTENCY_PERSISTENT;
return static_cast<C&>(*this);
}
protected:
virtual void
wireReset() const = 0;
protected:
uint64_t m_faceId;
std::string m_remoteUri;
std::string m_localUri;
FaceScope m_faceScope;
FacePersistency m_facePersistency;
LinkType m_linkType;
};
} // namespace nfd
} // namespace ndn
#endif // NDN_MANAGEMENT_NFD_FACE_TRAITS_HPP