peek: add --app-params and --app-params-file options

Change-Id: Ic1afb118d2e1a58d99d046e072a9df439e0020b3
diff --git a/tools/peek/ndnpeek/main.cpp b/tools/peek/ndnpeek/main.cpp
index 989887a..89b2222 100644
--- a/tools/peek/ndnpeek/main.cpp
+++ b/tools/peek/ndnpeek/main.cpp
@@ -24,6 +24,7 @@
  *
  * @author Jerald Paul Abraham <jeraldabraham@email.arizona.edu>
  * @author Zhuo Li <zhuoli@email.arizona.edu>
+ * @author Davide Pesavento <davidepesa@gmail.com>
  */
 
 #include "ndnpeek.hpp"
@@ -83,6 +84,8 @@
     ("link-file",  po::value<std::string>(), "set ForwardingHint from a raw binary file")
     ("lifetime,l", po::value<time::milliseconds::rep>()->default_value(options.interestLifetime.count()),
                    "set InterestLifetime, in milliseconds")
+    ("app-params,A",    po::value<std::string>(), "set ApplicationParameters from a base64-encoded string")
+    ("app-params-file", po::value<std::string>(), "set ApplicationParameters from a file")
   ;
 
   po::options_description visibleOptDesc;
@@ -159,6 +162,37 @@
     return 2;
   }
 
+  if (vm.count("app-params") > 0) {
+    if (vm.count("app-params-file") > 0) {
+      std::cerr << "ERROR: cannot specify both '--app-params' and '--app-params-file'" << std::endl;
+      return 2;
+    }
+    std::istringstream is(vm["app-params"].as<std::string>());
+    try {
+      options.applicationParameters = io::loadBuffer(is, io::BASE64);
+    }
+    catch (const io::Error& e) {
+      std::cerr << "ERROR: invalid ApplicationParameters string: " << e.what() << std::endl;
+      return 2;
+    }
+  }
+
+  if (vm.count("app-params-file") > 0) {
+    auto filename = vm["app-params-file"].as<std::string>();
+    std::ifstream paramsFile = openBinaryFile(filename);
+    if (!paramsFile) {
+      return 2;
+    }
+    try {
+      options.applicationParameters = io::loadBuffer(paramsFile, io::NO_ENCODING);
+    }
+    catch (const io::Error& e) {
+      std::cerr << "ERROR: cannot read ApplicationParameters from file '" << filename
+                << "': " << e.what() << std::endl;
+      return 2;
+    }
+  }
+
   try {
     Face face;
     NdnPeek program(face, options);
diff --git a/tools/peek/ndnpeek/ndnpeek.cpp b/tools/peek/ndnpeek/ndnpeek.cpp
index ff7f7a0..7bcb137 100644
--- a/tools/peek/ndnpeek/ndnpeek.cpp
+++ b/tools/peek/ndnpeek/ndnpeek.cpp
@@ -24,6 +24,7 @@
  *
  * @author Jerald Paul Abraham <jeraldabraham@email.arizona.edu>
  * @author Zhuo Li <zhuoli@email.arizona.edu>
+ * @author Davide Pesavento <davidepesa@gmail.com>
  */
 
 #include "ndnpeek.hpp"
@@ -66,6 +67,9 @@
   if (m_options.link) {
     interest.setForwardingHint(m_options.link->getDelegationList());
   }
+  if (m_options.applicationParameters) {
+    interest.setApplicationParameters(m_options.applicationParameters);
+  }
 
   if (m_options.isVerbose) {
     std::cerr << "INTEREST: " << interest << std::endl;
diff --git a/tools/peek/ndnpeek/ndnpeek.hpp b/tools/peek/ndnpeek/ndnpeek.hpp
index d02155f..357597e 100644
--- a/tools/peek/ndnpeek/ndnpeek.hpp
+++ b/tools/peek/ndnpeek/ndnpeek.hpp
@@ -24,6 +24,7 @@
  *
  * @author Jerald Paul Abraham <jeraldabraham@email.arizona.edu>
  * @author Zhuo Li <zhuoli@email.arizona.edu>
+ * @author Davide Pesavento <davidepesa@gmail.com>
  */
 
 #ifndef NDN_TOOLS_NDNPEEK_NDNPEEK_HPP
@@ -48,6 +49,7 @@
   bool mustBeFresh = false;
   shared_ptr<Link> link;
   time::milliseconds interestLifetime = DEFAULT_INTEREST_LIFETIME;
+  shared_ptr<Buffer> applicationParameters;
 
   // program behavior options
   bool isVerbose = false;
@@ -107,7 +109,7 @@
   onTimeout();
 
 private:
-  const PeekOptions& m_options;
+  const PeekOptions m_options;
   Face& m_face;
   Scheduler m_scheduler;
   time::steady_clock::TimePoint m_sendTime;