Adding nsync for NLSR
diff --git a/nsync/src/sync-logic.h b/nsync/src/sync-logic.h
new file mode 100644
index 0000000..fc63fca
--- /dev/null
+++ b/nsync/src/sync-logic.h
@@ -0,0 +1,218 @@
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2012 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Zhenkai Zhu <zhenkai@cs.ucla.edu>
+ *         Chaoyi Bian <bcy@pku.edu.cn>
+ *         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ *         Yingdi Yu <yingdi@cs.ucla.edu>
+ */
+
+#ifndef SYNC_LOGIC_H
+#define SYNC_LOGIC_H
+
+#include <boost/random.hpp>
+#include <memory>
+#include <map>
+
+#include <ndn-cpp-dev/face.hpp>
+#include <ndn-cpp-dev/security/validator.hpp>
+#include <ndn-cpp-dev/security/key-chain.hpp>
+#include <ndn-cpp-dev/util/scheduler.hpp>
+
+#include "sync-interest-table.h"
+#include "sync-diff-state.h"
+#include "sync-full-state.h"
+#include "sync-std-name-info.h"
+
+#include "sync-diff-state-container.h"
+
+#ifdef _DEBUG
+#ifdef HAVE_LOG4CXX
+#include <log4cxx/logger.h>
+#endif
+#endif
+
+namespace Sync {
+
+struct MissingDataInfo {
+  std::string prefix;
+  SeqNo low;
+  SeqNo high;
+};
+
+/**
+ * \ingroup sync
+ * @brief A wrapper for SyncApp, which handles ccnx related things (process
+ * interests and data)
+ */
+
+class SyncLogic
+{
+public:
+  //typedef boost::function< void ( const std::string &/*prefix*/, const SeqNo &/*newSeq*/, const SeqNo &/*oldSeq*/ ) > LogicUpdateCallback;
+  typedef boost::function< void (const std::vector<MissingDataInfo> & ) > LogicUpdateCallback;
+  typedef boost::function< void (const std::string &/*prefix*/ ) > LogicRemoveCallback;
+  typedef boost::function< void (const std::string &)> LogicPerBranchCallback;
+
+  /**
+   * @brief Constructor
+   * @param syncPrefix the name prefix to use for the Sync Interest
+   * @param onUpdate function that will be called when new state is detected
+   * @param onRemove function that will be called when state is removed
+   * @param ccnxHandle ccnx handle
+   * the app data when new remote names are learned
+   */
+  SyncLogic (const ndn::Name& syncPrefix,
+             ndn::shared_ptr<ndn::Validator> validator,
+             ndn::shared_ptr<ndn::Face> face,
+             LogicUpdateCallback onUpdate,
+             LogicRemoveCallback onRemove);
+
+  SyncLogic (const ndn::Name& syncPrefix,
+             ndn::shared_ptr<ndn::Validator> validator,
+             ndn::shared_ptr<ndn::Face> face,
+             LogicPerBranchCallback onUpdateBranch);
+
+  ~SyncLogic ();
+
+  /**
+   * a wrapper for the same func in SyncApp
+   */
+  void addLocalNames (const ndn::Name &prefix, uint64_t session, uint64_t seq);
+
+  /**
+   * @brief remove a participant's subtree from the sync tree
+   * @param prefix the name prefix for the participant
+   */
+  void remove (const ndn::Name &prefix);
+
+  std::string
+  getRootDigest();
+
+#ifdef _DEBUG
+  ndn::Scheduler &
+  getScheduler () { return m_scheduler; }
+#endif
+
+  void
+  printState () const;
+
+  std::map<std::string, bool>
+  getBranchPrefixes() const;
+
+private: 
+  void
+  delayedChecksLoop ();
+
+  void
+  onSyncInterest (const ndn::Name& prefix, const ndn::Interest& interest);
+
+  void
+  onSyncRegisterFailed(const ndn::Name& prefix, const std::string& msg);
+
+  void
+  onSyncData(const ndn::Interest& interest, ndn::Data& data);
+
+  void
+  onSyncTimeout(const ndn::Interest& interest);
+
+  void
+  onSyncDataValidationFailed(const ndn::shared_ptr<const ndn::Data>& data);
+
+  void
+  onSyncDataValidated(const ndn::shared_ptr<const ndn::Data>& data);
+
+  void
+  processSyncInterest (const ndn::Name &name,
+                       DigestConstPtr digest, bool timedProcessing=false);
+
+  void
+  processSyncData (const ndn::Name &name,
+                   DigestConstPtr digest, const char *wireData, size_t len);
+  
+  void
+  processSyncRecoveryInterest (const ndn::Name &name,
+                               DigestConstPtr digest);
+  
+  void 
+  insertToDiffLog (DiffStatePtr diff);
+
+  void
+  satisfyPendingSyncInterests (DiffStateConstPtr diff);
+
+  boost::tuple<DigestConstPtr, std::string>
+  convertNameToDigestAndType (const ndn::Name &name);
+
+  void
+  sendSyncInterest ();
+
+  void
+  sendSyncRecoveryInterests (DigestConstPtr digest);
+
+  void
+  sendSyncData (const ndn::Name &name,
+                DigestConstPtr digest, StateConstPtr state);
+
+  void
+  sendSyncData (const ndn::Name &name,
+                DigestConstPtr digest, SyncStateMsg &msg);
+
+  size_t
+  getNumberOfBranches () const;
+  
+private:
+  FullStatePtr m_state;
+  DiffStateContainer m_log;
+
+  ndn::Name m_outstandingInterestName;
+  SyncInterestTable m_syncInterestTable;
+
+  ndn::Name m_syncPrefix;
+  LogicUpdateCallback m_onUpdate;
+  LogicRemoveCallback m_onRemove;
+  LogicPerBranchCallback m_onUpdateBranch;
+  bool m_perBranch;
+  ndn::ptr_lib::shared_ptr<ndn::Validator> m_validator;
+  ndn::ptr_lib::shared_ptr<ndn::KeyChain> m_keyChain;
+  ndn::ptr_lib::shared_ptr<ndn::Face> m_face;
+  const ndn::RegisteredPrefixId* m_syncRegisteredPrefixId;
+
+  ndn::Scheduler m_scheduler;
+
+  boost::mt19937 m_randomGenerator;
+  boost::variate_generator<boost::mt19937&, boost::uniform_int<> > m_rangeUniformRandom;
+  boost::variate_generator<boost::mt19937&, boost::uniform_int<> > m_reexpressionJitter;
+
+  static const int m_unknownDigestStoreTime = 10; // seconds
+  static const int m_syncResponseFreshness = 1000; // MUST BE dividable by 1000!!!
+  static const int m_syncInterestReexpress = 4; // seconds
+
+  static const int m_defaultRecoveryRetransmitInterval = 200; // milliseconds
+  uint32_t m_recoveryRetransmissionInterval; // milliseconds
+  
+  ndn::EventId m_delayedInterestProcessingId;
+  ndn::EventId m_reexpressingInterestId;
+  ndn::EventId m_reexpressingRecoveryInterestId;
+  
+  std::string m_instanceId;
+  static int m_instanceCounter;
+};
+
+
+} // Sync
+
+#endif // SYNC_APP_WRAPPER_H