fetch: Switch code to use ndn-cxx

This commit also moves code to ndn::chronoshare namespace and changes
logging to show file and line number of the logging statement.

Change-Id: I075320644166cea9d5d3ef65bb26a2cabfd4dc5a
diff --git a/src/fetcher.cpp b/src/fetcher.cpp
index 83f8491..56899de 100644
--- a/src/fetcher.cpp
+++ b/src/fetcher.cpp
@@ -18,30 +18,26 @@
  * See AUTHORS.md for complete list of ChronoShare authors and contributors.
  */
 
-#include "fetcher.h"
-#include "ccnx-pco.h"
-#include "fetch-manager.h"
-#include "logging.h"
+#include "fetcher.hpp"
+#include "fetch-manager.hpp"
+#include "core/logging.hpp"
 
+#include <boost/asio/io_service.hpp>
 #include <boost/date_time/posix_time/posix_time.hpp>
-#include <boost/make_shared.hpp>
-#include <boost/ref.hpp>
-#include <boost/throw_exception.hpp>
+
+namespace ndn {
+namespace chronoshare {
 
 _LOG_INIT(Fetcher);
 
-using namespace boost;
-using namespace std;
-using namespace Ndnx;
-
-Fetcher::Fetcher(Ccnx::CcnxWrapperPtr ccnx, ExecutorPtr executor,
-                 const SegmentCallback& segmentCallback, const FinishCallback& finishCallback,
-                 OnFetchCompleteCallback onFetchComplete, OnFetchFailedCallback onFetchFailed,
-                 const Ccnx::Name& deviceName, const Ccnx::Name& name, int64_t minSeqNo,
-                 int64_t maxSeqNo,
-                 boost::posix_time::time_duration timeout /* = boost::posix_time::seconds (30)*/,
-                 const Ccnx::Name& forwardingHint /* = Ccnx::Name ()*/)
-  : m_ccnx(ccnx)
+Fetcher::Fetcher(Face& face,
+                 const SegmentCallback& segmentCallback,
+                 const FinishCallback& finishCallback,
+                 const OnFetchCompleteCallback& onFetchComplete,
+                 const OnFetchFailedCallback& onFetchFailed,
+                 const Name& deviceName, const Name& name, int64_t minSeqNo, int64_t maxSeqNo,
+                 time::milliseconds timeout, const Name& forwardingHint)
+  : m_face(face)
 
   , m_segmentCallback(segmentCallback)
   , m_onFetchComplete(onFetchComplete)
@@ -57,14 +53,20 @@
 
   , m_minSendSeqNo(minSeqNo - 1)
   , m_maxInOrderRecvSeqNo(minSeqNo - 1)
-  , m_minSeqNo(minSeqNo)
+  // , m_minSeqNo(minSeqNo)
   , m_maxSeqNo(maxSeqNo)
 
   , m_pipeline(6) // initial "congestion window"
   , m_activePipeline(0)
-  , m_retryPause(0)
-  , m_nextScheduledRetry(date_time::second_clock<boost::posix_time::ptime>::universal_time())
-  , m_executor(executor) // must be 1
+
+  , m_slowStart(false)
+  , m_threshold(32767) // TODO make these values dynamic
+  , m_roundCount(32767)
+
+  , m_retryPause(time::seconds::zero())
+  , m_nextScheduledRetry(time::steady_clock::now())
+
+  , m_ioService(m_face.getIoService())
 {
 }
 
@@ -78,13 +80,13 @@
   m_active = true;
   m_minSendSeqNo = m_maxInOrderRecvSeqNo;
   // cout << "Restart: " << m_minSendSeqNo << endl;
-  m_lastPositiveActivity = date_time::second_clock<boost::posix_time::ptime>::universal_time();
+  m_lastPositiveActivity = time::steady_clock::now();
 
-  m_executor->execute(bind(&Fetcher::FillPipeline, this));
+  m_ioService.post(bind(&Fetcher::FillPipeline, this));
 }
 
 void
-Fetcher::SetForwardingHint(const Ccnx::Name& forwardingHint)
+Fetcher::SetForwardingHint(const Name& forwardingHint)
 {
   m_forwardingHint = forwardingHint;
 }
@@ -93,7 +95,7 @@
 Fetcher::FillPipeline()
 {
   for (; m_minSendSeqNo < m_maxSeqNo && m_activePipeline < m_pipeline; m_minSendSeqNo++) {
-    unique_lock<mutex> lock(m_seqNoMutex);
+    std::unique_lock<std::mutex> lock(m_seqNoMutex);
 
     if (m_outOfOrderRecvSeqNo.find(m_minSendSeqNo + 1) != m_outOfOrderRecvSeqNo.end())
       continue;
@@ -103,72 +105,66 @@
 
     m_inActivePipeline.insert(m_minSendSeqNo + 1);
 
-    _LOG_DEBUG(" >>> i " << Name(m_forwardingHint)(m_name) << ", seq = " << (m_minSendSeqNo + 1));
+    _LOG_DEBUG(
+      " >>> i " << Name(m_forwardingHint).append(m_name) << ", seq = " << (m_minSendSeqNo + 1));
 
     // cout << ">>> " << m_minSendSeqNo+1 << endl;
-    m_ccnx->sendInterest(Name(m_forwardingHint)(m_name)(m_minSendSeqNo + 1),
-                         Closure(bind(&Fetcher::OnData, this, m_minSendSeqNo + 1, _1, _2),
-                                 bind(&Fetcher::OnTimeout, this, m_minSendSeqNo + 1, _1, _2, _3)),
-                         Selectors().interestLifetime(1)); // Alex: this lifetime should be changed to RTO
+
+    Interest interest(
+      Name(m_forwardingHint).append(m_name).appendNumber(m_minSendSeqNo + 1)); // Alex: this lifetime should be changed to RTO
+    _LOG_DEBUG("interest Name: " << interest);
+    interest.setInterestLifetime(time::seconds(1));
+    m_face.expressInterest(interest,
+                           bind(&Fetcher::OnData, this, m_minSendSeqNo + 1, _1, _2),
+                           bind(&Fetcher::OnTimeout, this, m_minSendSeqNo + 1, _1));
+
     _LOG_DEBUG(" >>> i ok");
 
     m_activePipeline++;
   }
 }
-
 void
-Fetcher::OnData(uint64_t seqno, const Ccnx::Name& name, PcoPtr data)
+Fetcher::OnData(uint64_t seqno, const Interest& interest, Data& data)
 {
-  m_executor->execute(bind(&Fetcher::OnData_Execute, this, seqno, name, data));
-}
+  const Name& name = data.getName();
+  _LOG_DEBUG(" <<< d " << name.getSubName(0, name.size() - 1) << ", seq = " << seqno);
 
-void
-Fetcher::OnData_Execute(uint64_t seqno, Ccnx::Name name, Ccnx::PcoPtr data)
-{
-  _LOG_DEBUG(" <<< d " << name.getPartialName(0, name.size() - 1) << ", seq = " << seqno);
+  shared_ptr<Data> pco = make_shared<Data>(data.wireEncode());
 
   if (m_forwardingHint == Name()) {
     // TODO: check verified!!!!
     if (true) {
-      if (!m_segmentCallback.empty()) {
-        m_segmentCallback(m_deviceName, m_name, seqno, data);
+      if (m_segmentCallback != nullptr) {
+        m_segmentCallback(m_deviceName, m_name, seqno, pco);
       }
     }
     else {
-      _LOG_ERROR("Can not verify signature content. Name = " << data->name());
+      _LOG_ERROR("Can not verify signature content. Name = " << data.getName());
       // probably needs to do more in the future
     }
     // we don't have to tell FetchManager about this
   }
   else {
     // in this case we don't care whether "data" is verified,  in fact, we expect it is unverified
-    try {
-      PcoPtr pco = make_shared<ParsedContentObject>(*data->contentPtr());
 
-      // we need to verify this pco and apply callback only when verified
-      // TODO: check verified !!!
-      if (true) {
-        if (!m_segmentCallback.empty()) {
-          m_segmentCallback(m_deviceName, m_name, seqno, pco);
-        }
-      }
-      else {
-        _LOG_ERROR("Can not verify signature content. Name = " << pco->name());
-        // probably needs to do more in the future
+    // we need to verify this pco and apply callback only when verified
+    // TODO: check verified !!!
+    if (true) {
+      if (m_segmentCallback != nullptr) {
+        m_segmentCallback(m_deviceName, m_name, seqno, pco);
       }
     }
-    catch (MisformedContentObjectException& e) {
-      cerr << "MisformedContentObjectException..." << endl;
-      // no idea what should do...
-      // let's ignore for now
+    else {
+      _LOG_ERROR("Can not verify signature content. Name = " << pco->getName());
+      // probably needs to do more in the future
     }
   }
 
   m_activePipeline--;
-  m_lastPositiveActivity = date_time::second_clock<boost::posix_time::ptime>::universal_time();
+  m_lastPositiveActivity = time::steady_clock::now();
 
   {
-    unique_lock<mutex> lock (m_pipelineMutex);
+    std::unique_lock<std::mutex> lock(m_seqNoMutex);
     if(m_slowStart){
       m_pipeline++;
       if(m_pipeline == m_threshold)
@@ -184,16 +180,16 @@
     }
   }
 
-  _LOG_DEBUG ("slowStart: " << boolalpha << m_slowStart << " pipeline: " << m_pipeline << " threshold: " << m_threshold);
+  _LOG_DEBUG ("slowStart: " << std::boolalpha << m_slowStart << " pipeline: " << m_pipeline << " threshold: " << m_threshold);
 
 
   ////////////////////////////////////////////////////////////////////////////
-  unique_lock<mutex> lock(m_seqNoMutex);
+  std::unique_lock<std::mutex> lock(m_seqNoMutex);
 
   m_outOfOrderRecvSeqNo.insert(seqno);
   m_inActivePipeline.erase(seqno);
   _LOG_DEBUG("Total segments received: " << m_outOfOrderRecvSeqNo.size());
-  set<int64_t>::iterator inOrderSeqNo = m_outOfOrderRecvSeqNo.begin();
+  std::set<int64_t>::iterator inOrderSeqNo = m_outOfOrderRecvSeqNo.begin();
   for (; inOrderSeqNo != m_outOfOrderRecvSeqNo.end(); inOrderSeqNo++) {
     _LOG_TRACE("Checking " << *inOrderSeqNo << " and " << m_maxInOrderRecvSeqNo + 1);
     if (*inOrderSeqNo == m_maxInOrderRecvSeqNo + 1) {
@@ -209,54 +205,47 @@
   m_outOfOrderRecvSeqNo.erase(m_outOfOrderRecvSeqNo.begin(), inOrderSeqNo);
   ////////////////////////////////////////////////////////////////////////////
 
-  _LOG_TRACE("Max in order received: " << m_maxInOrderRecvSeqNo
-                                       << ", max seqNo to request: " << m_maxSeqNo);
+  _LOG_TRACE("Max in order received: " << m_maxInOrderRecvSeqNo << ", max seqNo to request: " << m_maxSeqNo);
 
   if (m_maxInOrderRecvSeqNo == m_maxSeqNo) {
     _LOG_TRACE("Fetch finished: " << m_name);
     m_active = false;
     // invoke callback
-    if (!m_finishCallback.empty()) {
+    if (m_finishCallback != nullptr) {
       _LOG_TRACE("Notifying callback");
       m_finishCallback(m_deviceName, m_name);
     }
 
     // tell FetchManager that we have finish our job
-    // m_onFetchComplete (*this);
+    // m_onFetchComplete(*this);
     // using executor, so we won't be deleted if there is scheduled FillPipeline call
-    if (!m_onFetchComplete.empty()) {
+    if (m_onFetchComplete != nullptr) {
       m_timedwait = true;
-      m_executor->execute(bind(m_onFetchComplete, ref(*this), m_deviceName, m_name));
+      m_ioService.post(bind(m_onFetchComplete, std::ref(*this), m_deviceName, m_name));
     }
   }
   else {
-    m_executor->execute(bind(&Fetcher::FillPipeline, this));
+    m_ioService.post(bind(&Fetcher::FillPipeline, this));
   }
 }
 
 void
-Fetcher::OnTimeout(uint64_t seqno, const Ccnx::Name& name, const Closure& closure, Selectors selectors)
+Fetcher::OnTimeout(uint64_t seqno, const Interest& interest)
 {
-  _LOG_DEBUG(this << ", " << m_executor.get());
-  m_executor->execute(bind(&Fetcher::OnTimeout_Execute, this, seqno, name, closure, selectors));
-}
-
-void
-Fetcher::OnTimeout_Execute(uint64_t seqno, Ccnx::Name name, Ccnx::Closure closure,
-                           Ccnx::Selectors selectors)
-{
-  _LOG_DEBUG(" <<< :( timeout " << name.getPartialName(0, name.size() - 1) << ", seq = " << seqno);
+  const Name name = interest.getName();
+  _LOG_DEBUG(" <<< :( timeout " << name.getSubName(0, name.size() - 1) << ", seq = " << seqno);
 
   // cout << "Fetcher::OnTimeout: " << name << endl;
   // cout << "Last: " << m_lastPositiveActivity << ", config: " << m_maximumNoActivityPeriod
   //      << ", now: " << date_time::second_clock<boost::posix_time::ptime>::universal_time()
-  //      << ", oldest: " << (date_time::second_clock<boost::posix_time::ptime>::universal_time() - m_maximumNoActivityPeriod) << endl;
+  //      << ", oldest: " <<(date_time::second_clock<boost::posix_time::ptime>::universal_time() -
+  //      m_maximumNoActivityPeriod) << endl;
 
-  if (m_lastPositiveActivity < (date_time::second_clock<boost::posix_time::ptime>::universal_time() -
-                                m_maximumNoActivityPeriod)) {
+  if (m_lastPositiveActivity <
+      (time::steady_clock::now() - m_maximumNoActivityPeriod)) {
     bool done = false;
     {
-      unique_lock<mutex> lock(m_seqNoMutex);
+      std::unique_lock<std::mutex> lock(m_seqNoMutex);
       m_inActivePipeline.erase(seqno);
       m_activePipeline--;
 
@@ -267,20 +256,25 @@
 
     if (done) {
       {
-        unique_lock<mutex> lock(m_seqNoMutex);
+        std::unique_lock<std::mutex> lock(m_seqNoMutex);
         _LOG_DEBUG("Telling that fetch failed");
         _LOG_DEBUG("Active pipeline size should be zero: " << m_inActivePipeline.size());
       }
 
       m_active = false;
-      if (!m_onFetchFailed.empty()) {
-        m_onFetchFailed(ref(*this));
+      if (m_onFetchFailed != nullptr) {
+        m_onFetchFailed(std::ref(*this));
       }
       // this is not valid anymore, but we still should be able finish work
     }
   }
   else {
     _LOG_DEBUG("Asking to reexpress seqno: " << seqno);
-    m_ccnx->sendInterest(name, closure, selectors);
+    m_face.expressInterest(interest,
+                           bind(&Fetcher::OnData, this, seqno, _1, _2), // TODO: correct?
+                           bind(&Fetcher::OnTimeout, this, seqno, _1)); // TODO: correct?
   }
 }
+
+} // namespace chronoshare
+} // namespace ndn