blob: c360a4151b85ed42325549435091c32bbbc44da8 [file] [log] [blame]
Alexander Afanasyevc169a812014-05-20 20:37:29 -04001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Alexander Afanasyev258ec2b2014-05-14 16:15:37 -07002/**
Alexander Afanasyevc169a812014-05-20 20:37:29 -04003 * Copyright (c) 2013-2014 Regents of the University of California.
Alexander Afanasyev258ec2b2014-05-14 16:15:37 -07004 *
5 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
Alexander Afanasyev258ec2b2014-05-14 16:15:37 -07006 *
Alexander Afanasyevc169a812014-05-20 20:37:29 -04007 * 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.
Alexander Afanasyev258ec2b2014-05-14 16:15:37 -070020 */
21
22#include "interest-filter.hpp"
23
24#include "util/regex/regex-pattern-list-matcher.hpp"
25
26namespace ndn {
27
28InterestFilter::InterestFilter(const Name& prefix, const std::string& regexFilter)
29 : m_prefix(prefix)
30 , m_regexFilter(ndn::make_shared<RegexPatternListMatcher>(regexFilter,
31 shared_ptr<RegexBackrefManager>()))
32{
33}
34
35bool
36InterestFilter::doesMatch(const Name& name) const
37{
38 if (name.size() < m_prefix.size())
39 return false;
40
41 if (hasRegexFilter()) {
42 // perform prefix match and regular expression match for the remaining components
43 bool isMatch = m_prefix.isPrefixOf(name);
44
45 if (!isMatch)
46 return false;
47
48 return m_regexFilter->match(name, m_prefix.size(), name.size() - m_prefix.size());
49 }
50 else {
51 // perform just prefix match
52
53 return m_prefix.isPrefixOf(name);
54 }
55}
56
57std::ostream&
58operator<<(std::ostream& os, const InterestFilter& filter)
59{
60 os << filter.getPrefix();
61 if (filter.hasRegexFilter()) {
62 os << "?regex=" << filter.getRegexFilter();
63 }
64 return os;
65}
66
67} // namespace ndn