support for NS, TXT, NDNCERT, FH
diff --git a/src/iterative-query.hpp b/src/iterative-query.hpp
index 3f0ab98..aff9e43 100644
--- a/src/iterative-query.hpp
+++ b/src/iterative-query.hpp
@@ -26,6 +26,9 @@
 #include <cstdbool>
 #include <iostream>
 
+#include <boost/algorithm/string/predicate.hpp>
+#include <boost/lexical_cast.hpp>
+
 #include "query.hpp"
 #include "response.hpp"
 //#include "rr.hpp"
@@ -37,23 +40,24 @@
 {
 
 public:
-  enum QuerySteps{
-    NSQuery,
+  enum QuerySteps
+  {
+    NSQuery=1,
     NackNS,
     RRQuery,
     NackRR,
+    FHQuery,
     AnswerStub,
     Abort,
-    FinishedSuccessfully
+    FinishedSuccessfully,
+    UNKNOWN
   };
 
-
   static std::string
   toString(const QuerySteps& step)
   {
     std::string label;
-    switch(step)
-    {
+    switch (step) {
     case NSQuery:
       label = "NSQuery";
       break;
@@ -66,12 +70,18 @@
     case NackRR:
       label = "NackRR";
       break;
+    case FHQuery:
+      label = "FHQuery";
+      break;
     case AnswerStub:
       label = "AnswerStub";
       break;
     case Abort:
       label = "Abort";
       break;
+    case FinishedSuccessfully:
+      label = "FinishedSuccessfully";
+      break;
     default:
       label = "UNKNOW";
     }
@@ -79,109 +89,157 @@
     return label;
   }
 
-public:
-  IterativeQuery(const Query& );
+  static QuerySteps
+  toQuerySteps(std::string str)
+  {
+      QuerySteps step = UNKNOWN;
+      if (str == "NSQuery") {
+        step = NSQuery;
+      } else if (str == "NackNS") {
+        step = NackNS;
+      } else if (str == "RRQuery") {
+        step = RRQuery;
+      } else if (str == "NackRR") {
+        step = NackRR;
+      } else if (str == "FHQuery")
+        step = FHQuery;
+      else if (str == "AnswerStub")
+        step = AnswerStub;
+      else if (str == "Abort")
+        step = Abort;
+      else if (str == "FinishedSuccessfully")
+        step = FinishedSuccessfully;
+      else
+        step = UNKNOWN;
 
-  void
+      return step;
+  }
+
+
+public:
+  IterativeQuery(const Query&);
+
+  virtual void
   doData(Data& data);
 
-  bool
+  virtual bool
   doTimeout();
 
+  void abort();
 
-  void
-  abort();
-
-
-  const Interest
+  virtual const Interest
   toLatestInterest();
 
-
-  bool hasFinished() {
+  bool hasFinished()
+  {
     return m_query.getRrLabel().size() == m_finishedLabelNum;
   }
 
-  void addTryNum() {
+  void addTryNum()
+  {
     m_tryNum += 1;
   }
 
-  ssize_t getFinishedLabelNum() const {
+  ssize_t getFinishedLabelNum() const
+  {
     return m_finishedLabelNum;
   }
 
-  void setFinishedLabelNum(ssize_t finishedLabelNum) {
+  void setFinishedLabelNum(ssize_t finishedLabelNum)
+  {
     m_finishedLabelNum = finishedLabelNum;
   }
 
-  const Query& getQuery() const {
+  const Query& getQuery() const
+  {
     return m_query;
   }
 
-  const Response& getLastResponse() const {
+  const Response& getLastResponse() const
+  {
     return m_lastResponse;
   }
 
-  void setLastResponse(const Response& response) {
+  void setLastResponse(const Response& response)
+  {
     m_lastResponse = response;
   }
 
-  unsigned short getTryMax() const {
+  unsigned short getTryMax() const
+  {
     return m_tryMax;
   }
 
-  void setTryMax(unsigned short tryMax) {
+  void setTryMax(unsigned short tryMax)
+  {
     m_tryMax = tryMax;
   }
 
-  unsigned short getTryNum() const {
+  unsigned short getTryNum() const
+  {
     return m_tryNum;
   }
 
-  void setTryNum(unsigned short tryNum) {
+  void setTryNum(unsigned short tryNum)
+  {
     m_tryNum = tryNum;
   }
 
-  const Interest& getLastInterest() const {
+  const Interest& getLastInterest() const
+  {
     return m_lastInterest;
   }
 
-  void setLastInterest(const Interest& lastInterest) {
+  void setLastInterest(const Interest& lastInterest)
+  {
     m_lastInterest = lastInterest;
 
   }
 
-  QuerySteps getStep() const {
+  QuerySteps getStep() const
+  {
     return m_step;
   }
-
-  void setStep(QuerySteps step) {
+/*
+  void setStep(QuerySteps step)
+  {
     m_step = step;
   }
-
-  ssize_t getRrLabelLen() const {
+*/
+  ssize_t getRrLabelLen() const
+  {
     return m_rrLabelLen;
   }
 
-  void setRrLabelLen(ssize_t rrLabelLen) {
+  void setRrLabelLen(ssize_t rrLabelLen)
+  {
     m_rrLabelLen = rrLabelLen;
   }
 
-  unsigned int getAuthZoneIndex() const {
+  unsigned int getAuthZoneIndex() const
+  {
     return m_authZoneIndex;
   }
 
-  void setRrAsNextAuthorityZoneToTry(unsigned int authZoneIndex) {
+  void setRrAsNextAuthorityZoneToTry(unsigned int authZoneIndex)
+  {
     m_authZoneIndex = authZoneIndex;
   }
 
-private:
+  /**
+   * The function is neccesarry since the template of class CachingResolver call setForwardingHint
+
+  void setForwardingHint(const Name& lastForwardingHint)
+  {
+  }
+*/
+protected:
   QuerySteps m_step;
 
   unsigned short m_tryNum;
   unsigned short m_tryMax;
   //Name m_dstLabel;
 
-
   /*
    * the original query, not the intermediate query
    */
@@ -193,13 +251,19 @@
    */
   ssize_t m_finishedLabelNum;
 
+
+  /*
+   * used when query the KSK (key signing key), e.g., /net/ndnsim/ksk-1
+   */
+  ssize_t m_lastFinishedLabelNum;
+
+
   /*
    * the number used to generated the label
    * query.getRrLabel().getSubName(m_finishedLabelNum, m_labelLength);
    */
   ssize_t m_rrLabelLen;
 
-
   /*
    * m_lastResponse is changed once a new expecting Data is understood:
    * response.from(data)
@@ -211,26 +275,24 @@
    */
   unsigned int m_authZoneIndex;
 
-
-
-
   /*
    * last interest that has sent
    */
   Interest m_lastInterest;
+
+  //friend class IterativeQueryWithForwardingHint;
 };
 
 inline std::ostream&
 operator<<(std::ostream& os, const IterativeQuery iq)
 {
-  os<<"InterativeQuery: dstLabel="<<iq.getQuery().getRrLabel().toUri()
-      <<" currentStep="<<IterativeQuery::toString( iq.getStep())
-      <<" finishedLabel="<<iq.getFinishedLabelNum()
-      <<" rrLabelen="<<iq.getRrLabelLen()
-      <<" NextAuZoneIndex="<<iq.getAuthZoneIndex()
-      << " [OriginalQuery: " <<iq.getQuery() << "]"
-      <<" [LastReponse: "<<iq.getLastResponse()<<"]"
-      <<" [LastInterest: " <<iq.getLastInterest()<<"]";
+  os << "InterativeQuery: dstLabel=" << iq.getQuery().getRrLabel().toUri()
+      << " currentStep=" << IterativeQuery::toString(iq.getStep())
+      << " finishedLabel=" << iq.getFinishedLabelNum() << " rrLabelen="
+      << iq.getRrLabelLen() << " NextAuZoneIndex=" << iq.getAuthZoneIndex()
+      << " [OriginalQuery: " << iq.getQuery() << "]" << " [LastReponse: "
+      << iq.getLastResponse() << "]" << " [LastInterest: "
+      << iq.getLastInterest() << "]";
 
   return os;
 }