Add onRequestUpdateCallback in CA and also fix a status bug

Change-Id: I82ace0ee982b4b1bb5c1c10d316b314d9300348e
diff --git a/src/ca-module.cpp b/src/ca-module.cpp
index edd61dc..6b93ee4 100644
--- a/src/ca-module.cpp
+++ b/src/ca-module.cpp
@@ -35,9 +35,19 @@
   : m_face(face)
   , m_keyChain(keyChain)
 {
+  // load the config and create storage
   m_config.load(configPath);
   m_storage = CaStorage::createCaStorage(storageType);
 
+  // set default handler and callback
+  m_probeHandler = [&] (const std::string& probeInfo) {
+    return probeInfo;
+  };
+  m_requestUpdateCallback = [&] (const CertificateRequest& CertRequest) {
+    // do nothing
+  };
+
+  // register prefix
   for (const auto& item : m_config.m_caItems) {
     Name prefix = item.m_caName;
     prefix.append("CA");
@@ -131,6 +141,7 @@
   }
   std::string requestId = std::to_string(random::generateWord64());
   CertificateRequest certRequest(caItem.m_caName, requestId, clientCert);
+  certRequest.setStatus(ChallengeModule::WAIT_SELECTION);
   try {
     m_storage->addRequest(certRequest);
   }
@@ -141,11 +152,12 @@
 
   Data result;
   result.setName(request.getName());
-  result.setContent(dataContentFromJson(genResponseNewJson(requestId,
-                                                           ChallengeModule::WAIT_SELECTION,
+  result.setContent(dataContentFromJson(genResponseNewJson(requestId, certRequest.getStatus(),
                                                            caItem.m_supportedChallenges)));
   m_keyChain.sign(result, signingByCertificate(caItem.m_anchor));
   m_face.put(result);
+
+  m_requestUpdateCallback(certRequest);
 }
 
 void
@@ -193,6 +205,8 @@
   result.setContent(dataContentFromJson(contentJson));
   m_keyChain.sign(result, signingByCertificate(caItem.m_anchor));
   m_face.put(result);
+
+  m_requestUpdateCallback(certRequest);
 }
 
 void
@@ -233,6 +247,8 @@
   m_keyChain.sign(result, signingByCertificate(caItem.m_anchor));
   m_face.put(result);
 
+  m_requestUpdateCallback(certRequest);
+
   if (certRequest.getStatus() == ChallengeModule::SUCCESS) {
     issueCertificate(certRequest, caItem);
   }
diff --git a/src/ca-module.hpp b/src/ca-module.hpp
index 39597e9..0e768da 100644
--- a/src/ca-module.hpp
+++ b/src/ca-module.hpp
@@ -47,6 +47,11 @@
    */
   using ProbeHandler = function<std::string (const std::string&)>;
 
+  /**
+   * @brief The function would be invoked whenever the certificate request gets update
+   */
+  using RequestUpdateCallback = function<void (const CertificateRequest&)>;
+
 public:
   CaModule(Face& face, security::v2::KeyChain& keyChain, const std::string& configPath,
            const std::string& storageType = "ca-storage-sqlite3");
@@ -71,6 +76,12 @@
     m_probeHandler = handler;
   }
 
+  void
+  setRequestUpdateCallback(const RequestUpdateCallback& onUpateCallback)
+  {
+    m_requestUpdateCallback = onUpateCallback;
+  }
+
 PUBLIC_WITH_TESTS_ELSE_PRIVATE:
   void
   handleProbe(const Interest& request, const CaItem& caItem);
@@ -105,13 +116,14 @@
   static Block
   dataContentFromJson(const JsonSection& jsonSection);
 
-PUBLIC_WITH_TESTS_ELSE_PROTECTED:
+PUBLIC_WITH_TESTS_ELSE_PRIVATE:
   Face& m_face;
   CaConfig m_config;
   unique_ptr<CaStorage> m_storage;
   security::v2::KeyChain& m_keyChain;
 
   ProbeHandler m_probeHandler;
+  RequestUpdateCallback m_requestUpdateCallback;
   std::list<const RegisteredPrefixId*> m_registeredPrefixIds;
   std::list<const InterestFilterId*> m_interestFilterIds;
 };