blob: 6bde1d4934225634549598481170d0f3a8f07710 [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
86template size_t
Alexander Afanasyev74633892015-02-08 18:08:46 -080087FaceQueryFilter::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>&) const;
Chengyu Fanfc8aebb2014-10-22 16:35:23 -060088
89template size_t
Alexander Afanasyev74633892015-02-08 18:08:46 -080090FaceQueryFilter::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>&) const;
Chengyu Fanfc8aebb2014-10-22 16:35:23 -060091
92const Block&
93FaceQueryFilter::wireEncode() const
94{
95 if (m_wire.hasWire())
96 return m_wire;
97
98 EncodingEstimator estimator;
99 size_t estimatedSize = wireEncode(estimator);
100
101 EncodingBuffer buffer(estimatedSize, 0);
102 wireEncode(buffer);
103
104 m_wire = buffer.block();
105 return m_wire;
106}
107
108void
109FaceQueryFilter::wireDecode(const Block& block)
110{
Junxiao Shia341ae82017-02-13 19:45:12 +0000111 // all fields are optional
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600112 if (block.type() != tlv::nfd::FaceQueryFilter) {
Spyridon Mastorakis0d2ed2e2015-07-27 19:09:12 -0700113 BOOST_THROW_EXCEPTION(Error("expecting FaceQueryFilter block"));
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600114 }
115
116 m_wire = block;
117 m_wire.parse();
118 Block::element_const_iterator val = m_wire.elements_begin();
119
120 if (val != m_wire.elements_end() && val->type() == tlv::nfd::FaceId) {
121 m_faceId = readNonNegativeInteger(*val);
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600122 ++val;
123 }
124 else {
Junxiao Shia341ae82017-02-13 19:45:12 +0000125 m_faceId = nullopt;
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600126 }
127
128 if (val != m_wire.elements_end() && val->type() == tlv::nfd::UriScheme) {
Junxiao Shi5d75fd92017-08-08 18:09:20 +0000129 m_uriScheme = readString(*val);
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600130 ++val;
131 }
132 else {
Junxiao Shia341ae82017-02-13 19:45:12 +0000133 m_uriScheme.clear();
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600134 }
135
136 if (val != m_wire.elements_end() && val->type() == tlv::nfd::Uri) {
Junxiao Shi5d75fd92017-08-08 18:09:20 +0000137 m_remoteUri = readString(*val);
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600138 ++val;
139 }
140 else {
Junxiao Shia341ae82017-02-13 19:45:12 +0000141 m_remoteUri.clear();
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600142 }
143
144 if (val != m_wire.elements_end() && val->type() == tlv::nfd::LocalUri) {
Junxiao Shi5d75fd92017-08-08 18:09:20 +0000145 m_localUri = readString(*val);
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600146 ++val;
147 }
148 else {
Junxiao Shia341ae82017-02-13 19:45:12 +0000149 m_localUri.clear();
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600150 }
151
152 if (val != m_wire.elements_end() && val->type() == tlv::nfd::FaceScope) {
Junxiao Shi5d75fd92017-08-08 18:09:20 +0000153 m_faceScope = readNonNegativeIntegerAs<FaceScope>(*val);
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600154 ++val;
155 }
156 else {
Junxiao Shia341ae82017-02-13 19:45:12 +0000157 m_faceScope = nullopt;
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600158 }
159
160 if (val != m_wire.elements_end() && val->type() == tlv::nfd::FacePersistency) {
Junxiao Shi5d75fd92017-08-08 18:09:20 +0000161 m_facePersistency = readNonNegativeIntegerAs<FacePersistency>(*val);
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600162 ++val;
163 }
164 else {
Junxiao Shia341ae82017-02-13 19:45:12 +0000165 m_facePersistency = nullopt;
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600166 }
167
168 if (val != m_wire.elements_end() && val->type() == tlv::nfd::LinkType) {
Junxiao Shi5d75fd92017-08-08 18:09:20 +0000169 m_linkType = readNonNegativeIntegerAs<LinkType>(*val);
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600170 ++val;
171 }
172 else {
Junxiao Shia341ae82017-02-13 19:45:12 +0000173 m_linkType = nullopt;
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600174 }
Junxiao Shia341ae82017-02-13 19:45:12 +0000175}
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600176
Junxiao Shia341ae82017-02-13 19:45:12 +0000177bool
178FaceQueryFilter::empty() const
179{
180 return !this->hasFaceId() &&
181 !this->hasUriScheme() &&
182 !this->hasRemoteUri() &&
183 !this->hasLocalUri() &&
184 !this->hasFaceScope() &&
185 !this->hasFacePersistency() &&
186 !this->hasLinkType();
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600187}
188
189FaceQueryFilter&
190FaceQueryFilter::setFaceId(uint64_t faceId)
191{
192 m_wire.reset();
193 m_faceId = faceId;
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600194 return *this;
195}
196
197FaceQueryFilter&
198FaceQueryFilter::unsetFaceId()
199{
200 m_wire.reset();
Junxiao Shia341ae82017-02-13 19:45:12 +0000201 m_faceId = nullopt;
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600202 return *this;
203}
204
205FaceQueryFilter&
206FaceQueryFilter::setUriScheme(const std::string& uriScheme)
207{
208 m_wire.reset();
209 m_uriScheme = uriScheme;
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600210 return *this;
211}
212
213FaceQueryFilter&
214FaceQueryFilter::unsetUriScheme()
215{
Junxiao Shia341ae82017-02-13 19:45:12 +0000216 return this->setUriScheme("");
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600217}
218
219FaceQueryFilter&
220FaceQueryFilter::setRemoteUri(const std::string& remoteUri)
221{
222 m_wire.reset();
223 m_remoteUri = remoteUri;
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600224 return *this;
225}
226
227FaceQueryFilter&
228FaceQueryFilter::unsetRemoteUri()
229{
Junxiao Shia341ae82017-02-13 19:45:12 +0000230 return this->setRemoteUri("");
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600231}
232
233FaceQueryFilter&
234FaceQueryFilter::setLocalUri(const std::string& localUri)
235{
236 m_wire.reset();
237 m_localUri = localUri;
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600238 return *this;
239}
240
241FaceQueryFilter&
242FaceQueryFilter::unsetLocalUri()
243{
Junxiao Shia341ae82017-02-13 19:45:12 +0000244 return this->setLocalUri("");
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600245}
246
247FaceQueryFilter&
248FaceQueryFilter::setFaceScope(FaceScope faceScope)
249{
250 m_wire.reset();
251 m_faceScope = faceScope;
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600252 return *this;
253}
254
255FaceQueryFilter&
256FaceQueryFilter::unsetFaceScope()
257{
258 m_wire.reset();
Junxiao Shia341ae82017-02-13 19:45:12 +0000259 m_faceScope = nullopt;
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600260 return *this;
261}
262
263FaceQueryFilter&
264FaceQueryFilter::setFacePersistency(FacePersistency facePersistency)
265{
266 m_wire.reset();
267 m_facePersistency = facePersistency;
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600268 return *this;
269}
270
271FaceQueryFilter&
272FaceQueryFilter::unsetFacePersistency()
273{
274 m_wire.reset();
Junxiao Shia341ae82017-02-13 19:45:12 +0000275 m_facePersistency = nullopt;
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600276 return *this;
277}
278
279FaceQueryFilter&
280FaceQueryFilter::setLinkType(LinkType linkType)
281{
282 m_wire.reset();
283 m_linkType = linkType;
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600284 return *this;
285}
286
287FaceQueryFilter&
288FaceQueryFilter::unsetLinkType()
289{
290 m_wire.reset();
Junxiao Shia341ae82017-02-13 19:45:12 +0000291 m_linkType = nullopt;
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600292 return *this;
293}
294
Junxiao Shia825d262017-02-07 18:24:59 +0000295bool
296operator==(const FaceQueryFilter& a, const FaceQueryFilter& b)
297{
298 return a.hasFaceId() == b.hasFaceId() &&
299 (!a.hasFaceId() || a.getFaceId() == b.getFaceId()) &&
300 a.hasUriScheme() == b.hasUriScheme() &&
301 (!a.hasUriScheme() || a.getUriScheme() == b.getUriScheme()) &&
302 a.hasRemoteUri() == b.hasRemoteUri() &&
303 (!a.hasRemoteUri() || a.getRemoteUri() == b.getRemoteUri()) &&
304 a.hasLocalUri() == b.hasLocalUri() &&
305 (!a.hasLocalUri() || a.getLocalUri() == b.getLocalUri()) &&
306 a.hasFaceScope() == b.hasFaceScope() &&
307 (!a.hasFaceScope() || a.getFaceScope() == b.getFaceScope()) &&
308 a.hasFacePersistency() == b.hasFacePersistency() &&
Junxiao Shi0eaf4442017-02-09 01:49:09 +0000309 (!a.hasFacePersistency() || a.getFacePersistency() == b.getFacePersistency()) &&
Junxiao Shia825d262017-02-07 18:24:59 +0000310 a.hasLinkType() == b.hasLinkType() &&
311 (!a.hasLinkType() || a.getLinkType() == b.getLinkType());
312}
313
Chengyu Fanfc8aebb2014-10-22 16:35:23 -0600314std::ostream&
315operator<<(std::ostream& os, const FaceQueryFilter& filter)
316{
317 os << "FaceQueryFilter(";
318 if (filter.hasFaceId()) {
319 os << "FaceID: " << filter.getFaceId() << ",\n";
320 }
321
322 if (filter.hasUriScheme()) {
323 os << "UriScheme: " << filter.getUriScheme() << ",\n";
324 }
325
326 if (filter.hasRemoteUri()) {
327 os << "RemoteUri: " << filter.getRemoteUri() << ",\n";
328 }
329
330 if (filter.hasLocalUri()) {
331 os << "LocalUri: " << filter.getLocalUri() << ",\n";
332 }
333
334 if (filter.hasFaceScope()) {
335 os << "FaceScope: " << filter.getFaceScope() << ",\n";
336 }
337
338 if (filter.hasFacePersistency()) {
339 os << "FacePersistency: " << filter.getFacePersistency() << ",\n";
340 }
341
342 if (filter.hasLinkType()) {
343 os << "LinkType: " << filter.getLinkType() << ",\n";
344 }
345 os << ")";
346 return os;
347}
348
349} // namespace nfd
350} // namespace ndn