blob: 21e6045852221cc5de296cf4843bc5a2b389fd74 [file] [log] [blame]
Spyridon Mastorakis3b54e852015-04-07 08:03:25 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Davide Pesaventoe1789892017-02-26 15:50:52 -05003 * Copyright (c) 2013-2017 Regents of the University of California.
Spyridon Mastorakis3b54e852015-04-07 08:03:25 -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 "link.hpp"
Spyridon Mastorakis3b54e852015-04-07 08:03:25 -070023
24namespace ndn {
25
26BOOST_CONCEPT_ASSERT((boost::EqualityComparable<Link>));
27BOOST_CONCEPT_ASSERT((WireEncodable<Link>));
Alexander Afanasyevd5c48e02015-06-24 11:58:14 -070028BOOST_CONCEPT_ASSERT((WireEncodableWithEncodingBuffer<Link>));
Spyridon Mastorakis3b54e852015-04-07 08:03:25 -070029BOOST_CONCEPT_ASSERT((WireDecodable<Link>));
30static_assert(std::is_base_of<Data::Error, Link::Error>::value,
31 "Link::Error should inherit from Data::Error");
32
Junxiao Shid21abd32017-06-30 02:56:40 +000033Link::Link() = default;
34
35Link::Link(const Block& wire, bool wantSort)
Spyridon Mastorakis3b54e852015-04-07 08:03:25 -070036{
Junxiao Shid21abd32017-06-30 02:56:40 +000037 this->wireDecode(wire, wantSort);
Spyridon Mastorakis3b54e852015-04-07 08:03:25 -070038}
39
Junxiao Shid21abd32017-06-30 02:56:40 +000040Link::Link(const Name& name, std::initializer_list<Delegation> dels)
Spyridon Mastorakis3b54e852015-04-07 08:03:25 -070041 : Data(name)
Junxiao Shid21abd32017-06-30 02:56:40 +000042 , m_delList(dels)
Spyridon Mastorakis3b54e852015-04-07 08:03:25 -070043{
Junxiao Shid21abd32017-06-30 02:56:40 +000044 encodeContent();
Spyridon Mastorakis3b54e852015-04-07 08:03:25 -070045}
46
Junxiao Shid21abd32017-06-30 02:56:40 +000047void
48Link::encodeContent()
Spyridon Mastorakis3b54e852015-04-07 08:03:25 -070049{
Junxiao Shid21abd32017-06-30 02:56:40 +000050 setContentType(tlv::ContentType_Link);
51
52 if (m_delList.size() > 0) {
53 EncodingEstimator estimator;
54 size_t estimatedSize = m_delList.wireEncode(estimator, tlv::Content);
55
56 EncodingBuffer buffer(estimatedSize, 0);
57 m_delList.wireEncode(buffer, tlv::Content);
58
59 setContent(buffer.block());
60 }
61 else {
62 setContent(nullptr, 0);
63 }
64
65 m_isDelSetDirty = true;
66}
67
68void
69Link::wireDecode(const Block& wire, bool wantSort)
70{
71 Data::wireDecode(wire);
72
73 if (getContentType() != tlv::ContentType_Link) {
74 BOOST_THROW_EXCEPTION(Error("Expected ContentType Link"));
75 }
76
77 m_delList.wireDecode(getContent(), wantSort);
78 m_isDelSetDirty = true;
79}
80
81void
82Link::setDelegationList(const DelegationList& dels)
83{
84 m_delList = dels;
Spyridon Mastorakis3b54e852015-04-07 08:03:25 -070085 encodeContent();
86}
87
88void
89Link::addDelegation(uint32_t preference, const Name& name)
90{
Junxiao Shid21abd32017-06-30 02:56:40 +000091 m_delList.insert(preference, name, DelegationList::INS_REPLACE);
Spyridon Mastorakis3b54e852015-04-07 08:03:25 -070092 encodeContent();
93}
94
95bool
96Link::removeDelegation(const Name& name)
97{
Junxiao Shid21abd32017-06-30 02:56:40 +000098 size_t nErased = m_delList.erase(name);
99 if (nErased > 0) {
Spyridon Mastorakis3b54e852015-04-07 08:03:25 -0700100 encodeContent();
101 }
Junxiao Shid21abd32017-06-30 02:56:40 +0000102 return nErased > 0;
103}
104
105Link::PairInitializerListHelper::PairInitializerListHelper(std::initializer_list<std::pair<uint32_t, Name>> dels)
106{
107 for (const auto& p : dels) {
108 m_delList.insert(p.first, p.second, DelegationList::INS_REPLACE);
109 }
110}
111
112Link::Link(const Name& name, PairInitializerListHelper dels)
113 : Data(name)
114 , m_delList(std::move(dels.m_delList))
115{
116 encodeContent();
Spyridon Mastorakis3b54e852015-04-07 08:03:25 -0700117}
118
119const Link::DelegationSet&
120Link::getDelegations() const
121{
Junxiao Shid21abd32017-06-30 02:56:40 +0000122 if (m_isDelSetDirty) {
123 m_delSet.clear();
124 for (const auto& del : m_delList) {
125 m_delSet.emplace(static_cast<uint32_t>(del.preference), del.name);
126 }
127 m_isDelSetDirty = false;
Spyridon Mastorakis3b54e852015-04-07 08:03:25 -0700128 }
Junxiao Shid21abd32017-06-30 02:56:40 +0000129 return m_delSet;
Spyridon Mastorakis3b54e852015-04-07 08:03:25 -0700130}
131
Junxiao Shid21abd32017-06-30 02:56:40 +0000132Link::DelegationTuple
Spyridon Mastorakisc8188b32015-04-18 18:33:38 -0700133Link::getDelegationFromWire(const Block& block, size_t index)
134{
Junxiao Shid21abd32017-06-30 02:56:40 +0000135 Delegation del = Link(block, false).getDelegationList().at(index);
136 return std::make_tuple(static_cast<uint32_t>(del.preference), del.name);
Spyridon Mastorakisc8188b32015-04-18 18:33:38 -0700137}
138
139ssize_t
140Link::findDelegationFromWire(const Block& block, const Name& delegationName)
141{
Junxiao Shid21abd32017-06-30 02:56:40 +0000142 DelegationList dels = Link(block, false).getDelegationList();
143 auto i = std::find_if(dels.begin(), dels.end(),
144 [delegationName] (const Delegation& del) { return del.name == delegationName; });
145 return i == dels.end() ? -1 : std::distance(dels.begin(), i);
Spyridon Mastorakisc8188b32015-04-18 18:33:38 -0700146}
147
148ssize_t
149Link::countDelegationsFromWire(const Block& block)
150{
Junxiao Shid21abd32017-06-30 02:56:40 +0000151 return Link(block, false).getDelegationList().size();
Spyridon Mastorakis3b54e852015-04-07 08:03:25 -0700152}
153
154} // namespace ndn