nfdc: ensure FaceUri is in canonical form

refs #1909

Change-Id: If0560c03f3cafe3cd3a181246a7c185e07ade1ca
diff --git a/tools/nfdc.cpp b/tools/nfdc.cpp
index 8578e43..123cdb5 100644
--- a/tools/nfdc.cpp
+++ b/tools/nfdc.cpp
@@ -79,6 +79,7 @@
   , m_origin(ROUTE_ORIGIN_STATIC)
   , m_expires(DEFAULT_EXPIRATION_PERIOD)
   , m_controller(face)
+  , m_ioService(face.getIoService())
 {
 }
 
@@ -169,17 +170,28 @@
     fibAddNextHop(parameters);
   }
   else {
-    ControlParameters faceParameters;
-    faceParameters.setUri(m_commandLineArguments[1]);
+    ndn::util::FaceUri faceUri;
+    faceUri.parse(m_commandLineArguments[1]);
 
-    m_controller.start<FaceCreateCommand>(faceParameters,
-                                          bind(&Nfdc::fibAddNextHop, this, _1),
-                                          bind(&Nfdc::onError, this, _1, _2,
-                                               "Face creation failed"));
+    faceUri.canonize(bind(&Nfdc::startFibAddNextHop, this, _1),
+                     bind(&Nfdc::onCanonizeFailure, this, _1),
+                     m_ioService, ndn::time::seconds(4));
   }
 }
 
 void
+Nfdc::startFibAddNextHop(const ndn::util::FaceUri& canonicalUri)
+{
+  ControlParameters parameters;
+  parameters.setUri(canonicalUri.toString());
+
+  m_controller.start<FaceCreateCommand>(parameters,
+                                        bind(&Nfdc::fibAddNextHop, this, _1),
+                                        bind(&Nfdc::onError, this, _1, _2,
+                                             "Face creation failed"));
+}
+
+void
 Nfdc::fibAddNextHop(const ControlParameters& faceCreateResult)
 {
   ControlParameters ribParameters;
@@ -245,17 +257,28 @@
     ribRegisterPrefix(parameters);
   }
   else {
-    ControlParameters faceParameters;
-    faceParameters.setUri(m_commandLineArguments[1]);
+    ndn::util::FaceUri faceUri;
+    faceUri.parse(m_commandLineArguments[1]);
 
-    m_controller.start<FaceCreateCommand>(faceParameters,
-                                          bind(&Nfdc::ribRegisterPrefix, this, _1),
-                                          bind(&Nfdc::onError, this, _1, _2,
-                                               "Face creation failed"));
+    faceUri.canonize(bind(&Nfdc::startRibRegisterPrefix, this, _1),
+                     bind(&Nfdc::onCanonizeFailure, this, _1),
+                     m_ioService, ndn::time::seconds(4));
   }
 }
 
 void
+Nfdc::startRibRegisterPrefix(const ndn::util::FaceUri& canonicalUri)
+{
+  ControlParameters parameters;
+  parameters.setUri(canonicalUri.toString());
+
+  m_controller.start<FaceCreateCommand>(parameters,
+                                        bind(&Nfdc::ribRegisterPrefix, this, _1),
+                                        bind(&Nfdc::onError, this, _1, _2,
+                                             "Face creation failed"));
+}
+
+void
 Nfdc::ribRegisterPrefix(const ControlParameters& faceCreateResult)
 {
   ControlParameters ribParameters;
@@ -302,13 +325,30 @@
 }
 
 void
+Nfdc::onCanonizeFailure(const std::string& reason)
+{
+  std::cerr << reason << std::endl;
+}
+
+void
 Nfdc::faceCreate()
 {
   if (!isValidUri(m_commandLineArguments[0]))
     throw Error("invalid uri format");
 
+  ndn::util::FaceUri faceUri;
+  faceUri.parse(m_commandLineArguments[0]);
+
+  faceUri.canonize(bind(&Nfdc::startFaceCreate, this, _1),
+                   bind(&Nfdc::onCanonizeFailure, this, _1),
+                   m_ioService, ndn::time::seconds(4));
+}
+
+void
+Nfdc::startFaceCreate(const ndn::util::FaceUri& canonicalUri)
+{
   ControlParameters parameters;
-  parameters.setUri(m_commandLineArguments[0]);
+  parameters.setUri(canonicalUri.toString());
 
   m_controller.start<FaceCreateCommand>(parameters,
                                         bind(&Nfdc::onSuccess, this, _1,
@@ -333,16 +373,28 @@
     faceDestroy(parameters);
   }
   else{
-    ControlParameters faceParameters;
-    faceParameters.setUri(m_commandLineArguments[0]);
-    m_controller.start<FaceCreateCommand>(faceParameters,
-                                          bind(&Nfdc::faceDestroy, this, _1),
-                                          bind(&Nfdc::onError, this, _1, _2,
-                                               "Face destroy failed"));
+    ndn::util::FaceUri faceUri;
+    faceUri.parse(m_commandLineArguments[0]);
+
+    faceUri.canonize(bind(&Nfdc::startFaceDestroy, this, _1),
+                     bind(&Nfdc::onCanonizeFailure, this, _1),
+                     m_ioService, ndn::time::seconds(4));
   }
 }
 
 void
+Nfdc::startFaceDestroy(const ndn::util::FaceUri& canonicalUri)
+{
+  ControlParameters parameters;
+  parameters.setUri(canonicalUri.toString());
+
+  m_controller.start<FaceCreateCommand>(parameters,
+                                        bind(&Nfdc::faceDestroy, this, _1),
+                                        bind(&Nfdc::onError, this, _1, _2,
+                                             "Face destroy failed"));
+}
+
+void
 Nfdc::faceDestroy(const ControlParameters& faceCreateResult)
 {
   ControlParameters faceParameters;