IBR-DTNSuite  0.12
StaticRegexRoute.cpp
Go to the documentation of this file.
1 /*
2  * StaticRegexRoute.cpp
3  *
4  * Created on: 28.11.2012
5  * Author: morgenro
6  */
7 
10 #include <ibrcommon/Logger.h>
11 #include <typeinfo>
12 
13 namespace dtn
14 {
15  namespace routing
16  {
17  StaticRegexRoute::StaticRegexRoute(const std::string &regex, const dtn::data::EID &dest)
18  : _dest(dest), _regex_str(regex), _invalid(false), _expire(0)
19  {
20  if ( regcomp(&_regex, regex.c_str(), 0) )
21  {
22  IBRCOMMON_LOGGER_TAG("StaticRegexRoute", error) << "Could not compile regex: " << regex << IBRCOMMON_LOGGER_ENDL;
23  _invalid = true;
24  }
25  }
26 
28  {
29  if (!_invalid) {
30  regfree(&_regex);
31  }
32  }
33 
35  : _dest(obj._dest), _regex_str(obj._regex_str), _invalid(obj._invalid)
36  {
37  if ( regcomp(&_regex, _regex_str.c_str(), 0) )
38  {
39  _invalid = true;
40  }
41  }
42 
44  {
45  if (!_invalid)
46  {
47  regfree(&_regex);
48  }
49 
50  _dest = obj._dest;
51  _regex_str = obj._regex_str;
52  _invalid = obj._invalid;
53 
54  if (!_invalid)
55  {
56  if ( regcomp(&_regex, obj._regex_str.c_str(), 0) )
57  {
58  IBRCOMMON_LOGGER_TAG("StaticRegexRoute", error) << "Could not compile regex: " << _regex_str << IBRCOMMON_LOGGER_ENDL;
59  _invalid = true;
60  }
61  }
62 
63  return *this;
64  }
65 
66  bool StaticRegexRoute::match(const dtn::data::EID &eid) const
67  {
68  if (_invalid) return false;
69 
70  const std::string dest = eid.getString();
71 
72  // test against the regular expression
73  int reti = regexec(&_regex, dest.c_str(), 0, NULL, 0);
74 
75  if( !reti )
76  {
77  // the expression match
78  return true;
79  }
80  else if( reti == REG_NOMATCH )
81  {
82  // the expression not match
83  return false;
84  }
85  else
86  {
87  char msgbuf[100];
88  regerror(reti, &_regex, msgbuf, sizeof(msgbuf));
89  IBRCOMMON_LOGGER_TAG("StaticRegexRoute", error) << "Regex match failed: " << std::string(msgbuf) << IBRCOMMON_LOGGER_ENDL;
90  return false;
91  }
92  }
93 
95  {
96  return _dest;
97  }
98 
99  const std::string StaticRegexRoute::toString() const
100  {
101  std::stringstream ss;
102  ss << _regex_str << " => " << _dest.getString();
103  return ss.str();
104  }
105 
107  {
108  return _expire;
109  }
110 
112  {
114  }
115 
116  bool StaticRegexRoute::equals(const StaticRoute &route) const
117  {
118  try {
119  const StaticRegexRoute &r = dynamic_cast<const StaticRegexRoute&>(route);
120  return (_regex_str == r._regex_str) && (_dest == r._dest);
121  } catch (const std::bad_cast&) {
122  return false;
123  }
124  }
125  }
126 }