blob: 4c9ce37c5f1436e9d0b53f92875c3864431cbea1 [file] [log] [blame]
Junxiao Shi65f1a712014-11-20 14:59:36 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Junxiao Shibc6beb12017-01-11 23:20:39 +00003 * Copyright (c) 2013-2017 Regents of the University of California.
Junxiao Shi65f1a712014-11-20 14:59:36 -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
Junxiao Shi7357ef22016-09-07 02:39:37 +000022#include "strategy-choice.hpp"
Junxiao Shi65f1a712014-11-20 14:59:36 -070023#include "encoding/block-helpers.hpp"
Davide Pesaventoeba76ad2017-02-05 02:48:24 -050024#include "encoding/encoding-buffer.hpp"
25#include "encoding/tlv-nfd.hpp"
Junxiao Shi65f1a712014-11-20 14:59:36 -070026#include "util/concepts.hpp"
27
28namespace ndn {
29namespace nfd {
30
Davide Pesaventoeba76ad2017-02-05 02:48:24 -050031BOOST_CONCEPT_ASSERT((StatusDatasetItem<StrategyChoice>));
Junxiao Shi65f1a712014-11-20 14:59:36 -070032
Junxiao Shibc6beb12017-01-11 23:20:39 +000033StrategyChoice::StrategyChoice() = default;
Junxiao Shi65f1a712014-11-20 14:59:36 -070034
35StrategyChoice::StrategyChoice(const Block& payload)
36{
37 this->wireDecode(payload);
38}
39
Alexander Afanasyev74633892015-02-08 18:08:46 -080040template<encoding::Tag TAG>
Junxiao Shi65f1a712014-11-20 14:59:36 -070041size_t
Alexander Afanasyev74633892015-02-08 18:08:46 -080042StrategyChoice::wireEncode(EncodingImpl<TAG>& encoder) const
Junxiao Shi65f1a712014-11-20 14:59:36 -070043{
44 size_t totalLength = 0;
45
46 totalLength += prependNestedBlock(encoder, tlv::nfd::Strategy, m_strategy);
47 totalLength += m_name.wireEncode(encoder);
48
49 totalLength += encoder.prependVarNumber(totalLength);
50 totalLength += encoder.prependVarNumber(tlv::nfd::StrategyChoice);
51 return totalLength;
52}
53
54template size_t
Alexander Afanasyev74633892015-02-08 18:08:46 -080055StrategyChoice::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>&) const;
Junxiao Shi65f1a712014-11-20 14:59:36 -070056
57template size_t
Alexander Afanasyev74633892015-02-08 18:08:46 -080058StrategyChoice::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>&) const;
Junxiao Shi65f1a712014-11-20 14:59:36 -070059
60const Block&
61StrategyChoice::wireEncode() const
62{
63 if (m_wire.hasWire())
64 return m_wire;
65
66 EncodingEstimator estimator;
67 size_t estimatedSize = wireEncode(estimator);
68
69 EncodingBuffer buffer(estimatedSize, 0);
70 wireEncode(buffer);
71
72 m_wire = buffer.block();
73 return m_wire;
74}
75
76void
77StrategyChoice::wireDecode(const Block& block)
78{
79 if (block.type() != tlv::nfd::StrategyChoice) {
Spyridon Mastorakis0d2ed2e2015-07-27 19:09:12 -070080 BOOST_THROW_EXCEPTION(Error("expecting StrategyChoice block"));
Junxiao Shi65f1a712014-11-20 14:59:36 -070081 }
82 m_wire = block;
83 m_wire.parse();
84 Block::element_const_iterator val = m_wire.elements_begin();
85
86 if (val != m_wire.elements_end() && val->type() == tlv::Name) {
87 m_name.wireDecode(*val);
88 ++val;
89 }
90 else {
Spyridon Mastorakis0d2ed2e2015-07-27 19:09:12 -070091 BOOST_THROW_EXCEPTION(Error("missing required Name field"));
Junxiao Shi65f1a712014-11-20 14:59:36 -070092 }
93
94 if (val != m_wire.elements_end() && val->type() == tlv::nfd::Strategy) {
95 val->parse();
96 if (val->elements().empty()) {
Spyridon Mastorakis0d2ed2e2015-07-27 19:09:12 -070097 BOOST_THROW_EXCEPTION(Error("expecting Strategy/Name"));
Junxiao Shi65f1a712014-11-20 14:59:36 -070098 }
99 else {
100 m_strategy.wireDecode(*val->elements_begin());
101 }
102 ++val;
103 }
104 else {
Spyridon Mastorakis0d2ed2e2015-07-27 19:09:12 -0700105 BOOST_THROW_EXCEPTION(Error("missing required Strategy field"));
Junxiao Shi65f1a712014-11-20 14:59:36 -0700106 }
107}
108
109StrategyChoice&
110StrategyChoice::setName(const Name& name)
111{
112 m_wire.reset();
113 m_name = name;
114 return *this;
115}
116
117StrategyChoice&
118StrategyChoice::setStrategy(const Name& strategy)
119{
120 m_wire.reset();
121 m_strategy = strategy;
122 return *this;
123}
124
Junxiao Shibc6beb12017-01-11 23:20:39 +0000125bool
126operator==(const StrategyChoice& a, const StrategyChoice& b)
127{
128 return a.getName() == b.getName() && a.getStrategy() == b.getStrategy();
129}
130
131std::ostream&
132operator<<(std::ostream& os, const StrategyChoice& sc)
133{
134 return os << "StrategyChoice("
135 << "Name: " << sc.getName() << ", "
136 << "Strategy: " << sc.getStrategy()
137 << ")";
138}
139
Junxiao Shi65f1a712014-11-20 14:59:36 -0700140} // namespace nfd
141} // namespace ndn