blob: 5204aa97700b8785d01ce838a7c4dac66f15e770 [file] [log] [blame]
Chengyu Fanfc8aebb2014-10-22 16:35:23 -06001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Junxiao Shi5d75fd92017-08-08 18:09:20 +00002/*
Junxiao Shia825d262017-02-07 18:24:59 +00003 * Copyright (c) 2013-2017 Regents of the University of California.
Chengyu Fanfc8aebb2014-10-22 16:35:23 -06004 *
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 "face-query-filter.hpp"
Junxiao Shi65f1a712014-11-20 14:59:36 -070023#include "encoding/block-helpers.hpp"
Junxiao Shi5d75fd92017-08-08 18:09:20 +000024#include "encoding/tlv-nfd.hpp"
Junxiao Shi65f1a712014-11-20 14:59:36 -070025#include "util/concepts.hpp"
Chengyu Fanfc8aebb2014-10-22 16:35:23 -060026
27namespace ndn {
28namespace nfd {
29
Junxiao Shia825d262017-02-07 18:24:59 +000030BOOST_CONCEPT_ASSERT((boost::EqualityComparable<FaceQueryFilter>));
Junxiao Shi65f1a712014-11-20 14:59:36 -070031BOOST_CONCEPT_ASSERT((WireEncodable<FaceQueryFilter>));
32BOOST_CONCEPT_ASSERT((WireDecodable<FaceQueryFilter>));
33static_assert(std::is_base_of<tlv::Error, FaceQueryFilter::Error>::value,
34 "FaceQueryFilter::Error must inherit from tlv::Error");
35
Junxiao Shia341ae82017-02-13 19:45:12 +000036FaceQueryFilter::FaceQueryFilter() = default;
Chengyu Fanfc8aebb2014-10-22 16:35:23 -060037
38FaceQueryFilter::FaceQueryFilter(const Block& block)
39{
40 this->wireDecode(block);
41}
42
Alexander Afanasyev74633892015-02-08 18:08:46 -080043template<encoding::Tag TAG>
Chengyu Fanfc8aebb2014-10-22 16:35:23 -060044size_t
Alexander Afanasyev74633892015-02-08 18:08:46 -080045FaceQueryFilter::wireEncode(EncodingImpl<TAG>& encoder) const
Chengyu Fanfc8aebb2014-10-22 16:35:23 -060046{
47 size_t totalLength = 0;
48
Junxiao Shia341ae82017-02-13 19:45:12 +000049 if (m_linkType) {
Chengyu Fanfc8aebb2014-10-22 16:35:23 -060050 totalLength += prependNonNegativeIntegerBlock(encoder,
Junxiao Shia341ae82017-02-13 19:45:12 +000051 tlv::nfd::LinkType, *m_linkType);
Chengyu Fanfc8aebb2014-10-22 16:35:23 -060052 }
53
Junxiao Shia341ae82017-02-13 19:45:12 +000054 if (m_facePersistency) {
Chengyu Fanfc8aebb2014-10-22 16:35:23 -060055 totalLength += prependNonNegativeIntegerBlock(encoder,
Junxiao Shia341ae82017-02-13 19:45:12 +000056 tlv::nfd::FacePersistency, *m_facePersistency);
Chengyu Fanfc8aebb2014-10-22 16:35:23 -060057 }
58
Junxiao Shia341ae82017-02-13 19:45:12 +000059 if (m_faceScope) {
Chengyu Fanfc8aebb2014-10-22 16:35:23 -060060 totalLength += prependNonNegativeIntegerBlock(encoder,
Junxiao Shia341ae82017-02-13 19:45:12 +000061 tlv::nfd::FaceScope, *m_faceScope);
Chengyu Fanfc8aebb2014-10-22 16:35:23 -060062 }
63
Junxiao Shia341ae82017-02-13 19:45:12 +000064 if (hasLocalUri()) {
Junxiao Shi5d75fd92017-08-08 18:09:20 +000065 totalLength += prependStringBlock(encoder, tlv::nfd::LocalUri, m_localUri);
Chengyu Fanfc8aebb2014-10-22 16:35:23 -060066 }
67
Junxiao Shia341ae82017-02-13 19:45:12 +000068 if (hasRemoteUri()) {
Junxiao Shi5d75fd92017-08-08 18:09:20 +000069 totalLength += prependStringBlock(encoder, tlv::nfd::Uri, m_remoteUri);
Chengyu Fanfc8aebb2014-10-22 16:35:23 -060070 }
71
Junxiao Shia341ae82017-02-13 19:45:12 +000072 if (hasUriScheme()) {
Junxiao Shi5d75fd92017-08-08 18:09:20 +000073 totalLength += prependStringBlock(encoder, tlv::nfd::UriScheme, m_uriScheme);
Chengyu Fanfc8aebb2014-10-22 16:35:23 -060074 }
75
Junxiao Shia341ae82017-02-13 19:45:12 +000076 if (m_faceId) {
Chengyu Fanfc8aebb2014-10-22 16:35:23 -060077 totalLength += prependNonNegativeIntegerBlock(encoder,
Junxiao Shia341ae82017-02-13 19:45:12 +000078 tlv::nfd::FaceId, *m_faceId);
Chengyu Fanfc8aebb2014-10-22 16:35:23 -060079 }
80
81 totalLength += encoder.prependVarNumber(totalLength);
82 totalLength += encoder.prependVarNumber(tlv::nfd::FaceQueryFilter);
83 return totalLength;
84}
85
Davide Pesavento88a0d812017-08-19 21:31:42 -040086NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(FaceQueryFilter);
Chengyu Fanfc8aebb2014-10-22 16:35:23 -060087
88const Block&
89FaceQueryFilter::wireEncode() const
90{
91 if (m_wire.hasWire())
92 return m_wire;
93
94 EncodingEstimator estimator;
95 size_t estimatedSize = wireEncode(estimator);
96
97 EncodingBuffer buffer(estimatedSize, 0);
98 wireEncode(buffer);
99
100 m_wire = buffer.block();
101 return m_wire;
102}
103
104void
105FaceQueryFilter::wireDecode(const Block& block)
106{
Junxiao Shia341ae82017-02-13 19:45:12 +0000107 // all fields are optional
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600108 if (block.type() != tlv::nfd::FaceQueryFilter) {
Spyridon Mastorakis0d2ed2e2015-07-27 19:09:12 -0700109 BOOST_THROW_EXCEPTION(Error("expecting FaceQueryFilter block"));
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600110 }
111
112 m_wire = block;
113 m_wire.parse();
114 Block::element_const_iterator val = m_wire.elements_begin();
115
116 if (val != m_wire.elements_end() && val->type() == tlv::nfd::FaceId) {
117 m_faceId = readNonNegativeInteger(*val);
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600118 ++val;
119 }
120 else {
Junxiao Shia341ae82017-02-13 19:45:12 +0000121 m_faceId = nullopt;
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600122 }
123
124 if (val != m_wire.elements_end() && val->type() == tlv::nfd::UriScheme) {
Junxiao Shi5d75fd92017-08-08 18:09:20 +0000125 m_uriScheme = readString(*val);
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600126 ++val;
127 }
128 else {
Junxiao Shia341ae82017-02-13 19:45:12 +0000129 m_uriScheme.clear();
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600130 }
131
132 if (val != m_wire.elements_end() && val->type() == tlv::nfd::Uri) {
Junxiao Shi5d75fd92017-08-08 18:09:20 +0000133 m_remoteUri = readString(*val);
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600134 ++val;
135 }
136 else {
Junxiao Shia341ae82017-02-13 19:45:12 +0000137 m_remoteUri.clear();
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600138 }
139
140 if (val != m_wire.elements_end() && val->type() == tlv::nfd::LocalUri) {
Junxiao Shi5d75fd92017-08-08 18:09:20 +0000141 m_localUri = readString(*val);
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600142 ++val;
143 }
144 else {
Junxiao Shia341ae82017-02-13 19:45:12 +0000145 m_localUri.clear();
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600146 }
147
148 if (val != m_wire.elements_end() && val->type() == tlv::nfd::FaceScope) {
Junxiao Shi5d75fd92017-08-08 18:09:20 +0000149 m_faceScope = readNonNegativeIntegerAs<FaceScope>(*val);
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600150 ++val;
151 }
152 else {
Junxiao Shia341ae82017-02-13 19:45:12 +0000153 m_faceScope = nullopt;
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600154 }
155
156 if (val != m_wire.elements_end() && val->type() == tlv::nfd::FacePersistency) {
Junxiao Shi5d75fd92017-08-08 18:09:20 +0000157 m_facePersistency = readNonNegativeIntegerAs<FacePersistency>(*val);
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600158 ++val;
159 }
160 else {
Junxiao Shia341ae82017-02-13 19:45:12 +0000161 m_facePersistency = nullopt;
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600162 }
163
164 if (val != m_wire.elements_end() && val->type() == tlv::nfd::LinkType) {
Junxiao Shi5d75fd92017-08-08 18:09:20 +0000165 m_linkType = readNonNegativeIntegerAs<LinkType>(*val);
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600166 ++val;
167 }
168 else {
Junxiao Shia341ae82017-02-13 19:45:12 +0000169 m_linkType = nullopt;
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600170 }
Junxiao Shia341ae82017-02-13 19:45:12 +0000171}
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600172
Junxiao Shia341ae82017-02-13 19:45:12 +0000173bool
174FaceQueryFilter::empty() const
175{
176 return !this->hasFaceId() &&
177 !this->hasUriScheme() &&
178 !this->hasRemoteUri() &&
179 !this->hasLocalUri() &&
180 !this->hasFaceScope() &&
181 !this->hasFacePersistency() &&
182 !this->hasLinkType();
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600183}
184
185FaceQueryFilter&
186FaceQueryFilter::setFaceId(uint64_t faceId)
187{
188 m_wire.reset();
189 m_faceId = faceId;
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600190 return *this;
191}
192
193FaceQueryFilter&
194FaceQueryFilter::unsetFaceId()
195{
196 m_wire.reset();
Junxiao Shia341ae82017-02-13 19:45:12 +0000197 m_faceId = nullopt;
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600198 return *this;
199}
200
201FaceQueryFilter&
202FaceQueryFilter::setUriScheme(const std::string& uriScheme)
203{
204 m_wire.reset();
205 m_uriScheme = uriScheme;
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600206 return *this;
207}
208
209FaceQueryFilter&
210FaceQueryFilter::unsetUriScheme()
211{
Junxiao Shia341ae82017-02-13 19:45:12 +0000212 return this->setUriScheme("");
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600213}
214
215FaceQueryFilter&
216FaceQueryFilter::setRemoteUri(const std::string& remoteUri)
217{
218 m_wire.reset();
219 m_remoteUri = remoteUri;
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600220 return *this;
221}
222
223FaceQueryFilter&
224FaceQueryFilter::unsetRemoteUri()
225{
Junxiao Shia341ae82017-02-13 19:45:12 +0000226 return this->setRemoteUri("");
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600227}
228
229FaceQueryFilter&
230FaceQueryFilter::setLocalUri(const std::string& localUri)
231{
232 m_wire.reset();
233 m_localUri = localUri;
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600234 return *this;
235}
236
237FaceQueryFilter&
238FaceQueryFilter::unsetLocalUri()
239{
Junxiao Shia341ae82017-02-13 19:45:12 +0000240 return this->setLocalUri("");
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600241}
242
243FaceQueryFilter&
244FaceQueryFilter::setFaceScope(FaceScope faceScope)
245{
246 m_wire.reset();
247 m_faceScope = faceScope;
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600248 return *this;
249}
250
251FaceQueryFilter&
252FaceQueryFilter::unsetFaceScope()
253{
254 m_wire.reset();
Junxiao Shia341ae82017-02-13 19:45:12 +0000255 m_faceScope = nullopt;
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600256 return *this;
257}
258
259FaceQueryFilter&
260FaceQueryFilter::setFacePersistency(FacePersistency facePersistency)
261{
262 m_wire.reset();
263 m_facePersistency = facePersistency;
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600264 return *this;
265}
266
267FaceQueryFilter&
268FaceQueryFilter::unsetFacePersistency()
269{
270 m_wire.reset();
Junxiao Shia341ae82017-02-13 19:45:12 +0000271 m_facePersistency = nullopt;
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600272 return *this;
273}
274
275FaceQueryFilter&
276FaceQueryFilter::setLinkType(LinkType linkType)
277{
278 m_wire.reset();
279 m_linkType = linkType;
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600280 return *this;
281}
282
283FaceQueryFilter&
284FaceQueryFilter::unsetLinkType()
285{
286 m_wire.reset();
Junxiao Shia341ae82017-02-13 19:45:12 +0000287 m_linkType = nullopt;
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600288 return *this;
289}
290
Junxiao Shia825d262017-02-07 18:24:59 +0000291bool
292operator==(const FaceQueryFilter& a, const FaceQueryFilter& b)
293{
294 return a.hasFaceId() == b.hasFaceId() &&
295 (!a.hasFaceId() || a.getFaceId() == b.getFaceId()) &&
296 a.hasUriScheme() == b.hasUriScheme() &&
297 (!a.hasUriScheme() || a.getUriScheme() == b.getUriScheme()) &&
298 a.hasRemoteUri() == b.hasRemoteUri() &&
299 (!a.hasRemoteUri() || a.getRemoteUri() == b.getRemoteUri()) &&
300 a.hasLocalUri() == b.hasLocalUri() &&
301 (!a.hasLocalUri() || a.getLocalUri() == b.getLocalUri()) &&
302 a.hasFaceScope() == b.hasFaceScope() &&
303 (!a.hasFaceScope() || a.getFaceScope() == b.getFaceScope()) &&
304 a.hasFacePersistency() == b.hasFacePersistency() &&
Junxiao Shi0eaf4442017-02-09 01:49:09 +0000305 (!a.hasFacePersistency() || a.getFacePersistency() == b.getFacePersistency()) &&
Junxiao Shia825d262017-02-07 18:24:59 +0000306 a.hasLinkType() == b.hasLinkType() &&
307 (!a.hasLinkType() || a.getLinkType() == b.getLinkType());
308}
309
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600310std::ostream&
311operator<<(std::ostream& os, const FaceQueryFilter& filter)
312{
313 os << "FaceQueryFilter(";
314 if (filter.hasFaceId()) {
315 os << "FaceID: " << filter.getFaceId() << ",\n";
316 }
317
318 if (filter.hasUriScheme()) {
319 os << "UriScheme: " << filter.getUriScheme() << ",\n";
320 }
321
322 if (filter.hasRemoteUri()) {
323 os << "RemoteUri: " << filter.getRemoteUri() << ",\n";
324 }
325
326 if (filter.hasLocalUri()) {
327 os << "LocalUri: " << filter.getLocalUri() << ",\n";
328 }
329
330 if (filter.hasFaceScope()) {
331 os << "FaceScope: " << filter.getFaceScope() << ",\n";
332 }
333
334 if (filter.hasFacePersistency()) {
335 os << "FacePersistency: " << filter.getFacePersistency() << ",\n";
336 }
337
338 if (filter.hasLinkType()) {
339 os << "LinkType: " << filter.getLinkType() << ",\n";
340 }
341 os << ")";
342 return os;
343}
344
345} // namespace nfd
346} // namespace ndn