implementing sync-ccnx-wrapper, not complete
diff --git a/model/sync-ccnx-wrapper.cc b/model/sync-ccnx-wrapper.cc
index 2680859..9a2e3bb 100644
--- a/model/sync-ccnx-wrapper.cc
+++ b/model/sync-ccnx-wrapper.cc
@@ -19,3 +19,198 @@
  *         卞超轶 Chaoyi Bian <bcy@pku.edu.cn>
  *	   Alexander Afanasyev <alexander.afanasyev@ucla.edu>
  */
+
+#include "sync-ccnx-wrapper.h"
+#include <poll.h>
+#include <ccn/signing.h>
+
+using namespace std;
+using namespace boost;
+
+namespace Sync {
+
+CcnxWrapper::CcnxWrapper()
+{
+  m_handle = ccn_create();
+  ccn_connect(m_handle, NULL);
+  initKeyStore();
+  createKeyLocator();
+  m_thread = thread(&CcnxWrapper::ccnLoop);
+}
+
+CcnxWrapper::~CcnxWrapper()
+{
+  running = false;
+  m_thread.join();
+  ccn_disconnect(m_handle);
+  ccn_destroy(&m_handle);
+  ccn_charbuf_destroy(&m_keyLoactor);
+  ccn_keystore_destroy(&m_keyStore);
+}
+
+void CcnxWrapper::createKeyLocator()
+{
+  int res;
+
+  m_keyLoactor = ccn_charbuf_create();
+  ccn_charbuf_append_tt(m_keyLoactor, CCN_DTAG_KeyLocator, CCN_DTAG);
+  ccn_charbuf_append_tt(m_keyLoactor, CCN_DTAG_Key, CCN_DTAG);
+  res = ccn_append_pubkey_blob(m_keyLoactor, ccn_keystore_public_key(m_keyStore));
+  if (res >= 0)
+  {
+    ccn_charbuf_append_closer(m_keyLoactor); /* </Key> */
+    ccn_charbuf_append_closer(m_keyLoactor); /* </KeyLocator> */
+  }
+}
+
+const ccn_pkey* CcnxWrapper::getPrivateKey()
+{
+  return ccn_keystore_private_key(m_keyStore);
+}
+
+const unsigned char* CcnxWrapper::getPublicKeyDigest()
+{
+  return ccn_keystore_public_key_digest(m_keyStore);
+}
+
+ssize_t CcnxWrapper::getPublicKeyDigestLength()
+{
+  return ccn_keystore_public_key_digest_length(m_keyStore);
+}
+
+void CcnxWrapper::initKeyStore()
+{
+  ccn_charbuf *temp = ccn_charbuf_create();
+  m_keyStore = ccn_keystore_create();
+  ccn_charbuf_putf(temp, "%s/.ccnx/.ccnx_keystore", getenv("HOME"));
+  ccn_keystore_init(m_keyStore, ccn_charbuf_as_string(temp), (char*)"Th1s1sn0t8g00dp8ssw0rd.");
+  ccn_charbuf_destroy(&temp);
+}
+
+void CcnxWrapper::ccnLoop()
+{
+  pollfd pfds[1];
+  int res = ccn_run(m_handle, 0);
+
+  pfds[0].fd = ccn_get_connection_fd(m_handle);
+  pfds[0].events = POLLIN;
+
+  while (running)
+  {
+    if (res >= 0)
+    {
+      int ret = poll(pfds, 1, 100);
+      if (ret >= 0)
+      {
+	boost::recursive_mutex::scoped_lock lock(m_mutex);
+	res = ccn_run(m_handle, 0);
+      }
+    }
+  }
+}
+
+int CcnxWrapper::publishData(string name, shared_ptr< DataBuffer > dataBuffer, int freshness)
+{
+  ccn_charbuf *pname = ccn_charbuf_create();
+  ccn_charbuf *signed_info = ccn_charbuf_create();
+  ccn_charbuf *content = ccn_charbuf_create();
+
+  ccn_name_from_uri(pname, name.c_str());
+  ccn_signed_info_create(signed_info,
+			 getPublicKeyDigest(),
+			 getPublicKeyDigestLength(),
+			 NULL,
+			 CCN_CONTENT_DATA,
+			 freshness,
+			 NULL,
+			 m_keyLoactor);
+  ccn_encode_ContentObject(content, pname, signed_info,
+			   dataBuffer->buffer(), dataBuffer->length(),
+			   NULL, getPrivateKey());
+  ccn_put(m_handle, content->buf, content->length);
+
+  ccn_charbuf_destroy(&pname);
+  ccn_charbuf_destroy(&signed_info);
+  ccn_charbuf_destroy(&content);
+}
+
+
+static ccn_upcall_res incomingInterest(
+  ccn_closure *selfp,
+  ccn_upcall_kind kind,
+  ccn_upcall_info *info)
+{
+  function< void (string) > callback = selfp->data;
+
+  switch (kind)
+  {
+    case CCN_UPCALL_FINAL:
+      free(selfp);
+      return CCN_UPCALL_RESULT_OK;
+
+    case CCN_UPCALL_INTEREST:
+      break;
+
+    default:
+      return CCN_UPCALL_RESULT_OK;
+  }
+
+  char *comp;
+  size_t size;
+  ccn_name_comp_get(info->content_ccnb, info->content_comps, info->content_comps->n - 3, (const unsigned char **)&comp, &size);
+  callback(string(comp));
+}
+
+static ccn_upcall_res incomingData(
+  ccn_closure *selfp,
+  ccn_upcall_kind kind,
+  ccn_upcall_info *info)
+{
+  function< void (string) > callback = selfp->data;
+
+  switch (kind)
+  {
+    case CCN_UPCALL_FINAL:
+      free(selfp);
+      return CCN_UPCALL_RESULT_OK;
+
+    case CCN_UPCALL_CONTENT:
+      break;
+
+    default:
+      return CCN_UPCALL_RESULT_OK;
+  }
+
+  char *pcontent;
+  size_t len;
+  ccn_content_get_value(info->content_ccnb, info->pco->offset[CCN_PCO_E], info->pco, (const unsigned char **)&pcontent, &len);
+  callback(string(pcontent));
+}
+
+int CcnxWrapper::sendInterest(string strInterest, boost::function< void (shared_ptr< DataBuffer >) > dataCallback)
+{
+  ccn_charbuf *pname = ccn_charbuf_create();
+  ccn_closure *dataClosure = new ccn_closure;
+
+  ccn_name_from_uri(pname, strInterest.c_str());
+  ccn_express_interest(m_handle, pname, dataClosure, NULL);
+  dataClosure->data = dataCallback.target<void (shared_ptr< DataBuffer >)>();
+  dataClosure->p = &incomingData;
+
+  ccn_charbuf_destroy(&pname);
+}
+
+int CcnxWrapper::setInterestFilter(string prefix, boost::function< void (string) > interestCallback)
+{
+  ccn_charbuf *pname = ccn_charbuf_create();
+  ccn_closure *interestClosure = new ccn_closure;
+
+  ccn_name_from_uri(pname, prefix.c_str());
+  interestClosure->data = interestCallback.target<void (string)>();
+  interestClosure->p = &incomingInterest;
+  ccn_set_interest_filter(m_handle, pname, interestClosure);
+
+  ccn_charbuf_destroy(&pname);
+}
+
+}
diff --git a/model/sync-ccnx-wrapper.h b/model/sync-ccnx-wrapper.h
index ad8ae9a..a12848d 100644
--- a/model/sync-ccnx-wrapper.h
+++ b/model/sync-ccnx-wrapper.h
@@ -33,7 +33,7 @@
 
 #include <boost/thread/recursive_mutex.hpp>
 #include <boost/thread/thread.hpp>
-#include <boost/shared_ptr.hpp>
+#include <boost/function.hpp>
 #include <string>
 #include "sync-data-buffer.h"
 /**
@@ -48,14 +48,14 @@
  * @brief A wrapper for ccnx library; clients of this code do not need to deal
  * with ccnx library
  */
-class CcnxWrapper { 
+class CcnxWrapper {
 private:
 	ccn* m_handle;
 	ccn_keystore *m_keyStore;
 	ccn_charbuf *m_keyLoactor;
 	// to lock, use "boost::recursive_mutex::scoped_lock scoped_lock(mutex);
 	boost::recursive_mutex m_mutex;
-	boost::shared_ptr<boos::thread> m_thread;
+	boost::thread m_thread;
 
 private:
 	void createKeyLocator();
@@ -64,12 +64,13 @@
 	const unsigned char *getPublicKeyDigest();
 	ssize_t getPublicKeyDigestLength();
 	void ccnLoop();
+	bool running;
 
 public:
-  
+
   /**
    * @brief initialize the wrapper; a lot of things needs to be done. 1) init
-   * keystore 2) init keylocator 3) start a thread to hold a loop of ccn_run 
+   * keystore 2) init keylocator 3) start a thread to hold a loop of ccn_run
    *
    */
    CcnxWrapper();
@@ -80,13 +81,13 @@
    *
    * @param strInterest the Interest name
    * @param dataCallback the callback function to deal with the returned data
-   * @return the return code of ccn_express_interest 
+   * @return the return code of ccn_express_interest
    */
    int sendInterest(std::string strInterest, boost::function<void
    (boost::shared_ptr<DataBuffer>)> dataCallback);
 
   /**
-   * @brief set Interest filter (specify what interest you want to receive 
+   * @brief set Interest filter (specify what interest you want to receive
    *
    * @param prefix the prefix of Interest
    * @param interestCallback the callback function to deal with the returned data
diff --git a/model/sync-data-buffer.h b/model/sync-data-buffer.h
index 2b2a1bf..4828a42 100644
--- a/model/sync-data-buffer.h
+++ b/model/sync-data-buffer.h
@@ -45,7 +45,7 @@
 class DataBuffer {
 public:
 	virtual ~DataBuffer() = 0;
-	virtual size_t length() = 0; 
+	virtual size_t length() = 0;
 	virtual const unsigned char *buffer() = 0;
 	virtual void setBufferAndLength(const unsigned char *buffer, size_t len) =
 	0;
@@ -88,8 +88,8 @@
 	 * @brief decorates some object that implements DataBuffer interface
 	 * primary usage here is to decorate AppDataBuffer
 	 */
-	SyncDataBuffer(DataBuffer *dataBuffer) { m_dataBuffer = dataBuffer;}
-	virtual ~SyncDataBuffer(){};	
+	SyncDataBuffer(DataBuffer *dataBuffer) { m_dataBuffer = boost::shared_ptr<DataBuffer>(dataBuffer);}
+	virtual ~SyncDataBuffer(){};
 	virtual size_t length() {m_dataBuffer->length();}
 	virtual const unsigned char *buffer() {m_dataBuffer->buffer();}
 	virtual void setBufferAndLength(const unsigned char *buffer, size_t len)