Add Exclude range to client

refs #3693

Change-Id: Ia190e29493755d3a04cac4d557f99a9e6e351a92
diff --git a/ndn-traffic-client.conf.sample b/ndn-traffic-client.conf.sample
index 6ceed63..0eea0ab 100644
--- a/ndn-traffic-client.conf.sample
+++ b/ndn-traffic-client.conf.sample
@@ -30,6 +30,7 @@
 #ExcludeAfter=NDN Name Component
 #ExcludeBeforeBytes=NNI [>0]
 #ExcludeAfterBytes=NNI [>0]
+#ExcludeRange=NDN Name Component (After),NDN Name Component (Before)
 #ChildSelector=NNI [0-1]
 #MustBeFresh=NNI [0-1]
 #NonceDuplicationPercentage=NNI [0-100]
diff --git a/src/ndn-traffic-client.cpp b/src/ndn-traffic-client.cpp
index be35d52..d6faaf7 100644
--- a/src/ndn-traffic-client.cpp
+++ b/src/ndn-traffic-client.cpp
@@ -115,6 +115,8 @@
         detail += "ExcludeBefore=" + m_excludeBefore + ", ";
       if (!m_excludeAfter.empty())
         detail += "ExcludeAfter=" + m_excludeAfter + ", ";
+      if (!m_excludeRange.empty())
+        detail += "ExcludeRange=" + m_excludeRange + ", ";
       if (m_excludeBeforeBytes > 0)
         detail += "ExcludeBeforeBytes=" + to_string(m_excludeBeforeBytes) + ", ";
       if (m_excludeAfterBytes > 0)
@@ -140,7 +142,7 @@
     bool
     extractParameterValue(const std::string& detail, std::string& parameter, std::string& value)
     {
-      std::string allowedCharacters = ":/+._-%";
+      std::string allowedCharacters = ":/+.,_-%";
       std::size_t i = 0;
 
       parameter = "";
@@ -192,6 +194,8 @@
             m_excludeBeforeBytes = std::stoi(value);
           else if (parameter == "ExcludeAfterBytes")
             m_excludeAfterBytes = std::stoi(value);
+          else if (parameter == "ExcludeRange")
+            m_excludeRange = value;
           else if (parameter == "ChildSelector")
             m_childSelector = std::stoi(value);
           else if (parameter == "MustBeFresh")
@@ -232,6 +236,7 @@
     int m_maxSuffixComponents;
     std::string m_excludeBefore;
     std::string m_excludeAfter;
+    std::string m_excludeRange;
     int m_excludeBeforeBytes;
     int m_excludeAfterBytes;
     int m_childSelector;
@@ -709,6 +714,19 @@
                     interest.setExclude(exclude);
                   }
 
+                if (!m_trafficPatterns[patternId].m_excludeRange.empty()) {
+                  auto& range = m_trafficPatterns[patternId].m_excludeRange;
+
+                  if (range.find(",") != std::string::npos) {
+                    std::string after = range.substr(0, range.find(","));
+                    std::string before = range.substr(range.find(",") + 1, std::string::npos);
+                    exclude.clear();
+                    exclude.excludeRange(name::Component::fromEscapedString(after),
+                                         name::Component::fromEscapedString(before));
+                    interest.setExclude(exclude);
+                  }
+                }
+
                 if (m_trafficPatterns[patternId].m_childSelector >= 0)
                   interest.setChildSelector(m_trafficPatterns[patternId].m_childSelector);