ccnx: small reorganization and extension

Change-Id: I231e1e7e390d19b8e951b9ca4cf52480e10916bc
diff --git a/ccnx/ccnx-charbuf.cc b/ccnx/ccnx-charbuf.cc
new file mode 100644
index 0000000..0ba328f
--- /dev/null
+++ b/ccnx/ccnx-charbuf.cc
@@ -0,0 +1,71 @@
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2013 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>
+ *         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include "ccnx-charbuf.h"
+
+using namespace std;
+
+namespace Ccnx {
+
+void
+CcnxCharbuf::init(ccn_charbuf *buf)
+{
+  if (buf != NULL)
+  {
+    m_buf = ccn_charbuf_create();
+    ccn_charbuf_reserve(m_buf, buf->length);
+    memcpy(m_buf->buf, buf->buf, buf->length);
+    m_buf->length = buf->length;
+  }
+}
+
+CcnxCharbuf::CcnxCharbuf()
+            : m_buf(NULL)
+{
+  m_buf = ccn_charbuf_create();
+}
+
+CcnxCharbuf::CcnxCharbuf(ccn_charbuf *buf)
+            : m_buf(NULL)
+{
+  init(buf);
+}
+
+CcnxCharbuf::CcnxCharbuf(const CcnxCharbuf &other)
+            : m_buf (NULL)
+{
+  init(other.m_buf);
+}
+
+CcnxCharbuf::CcnxCharbuf(const void *buf, size_t length)
+{
+  m_buf = ccn_charbuf_create ();
+  ccn_charbuf_reserve (m_buf, length);
+  memcpy (m_buf->buf, buf, length);
+  m_buf->length = length;
+}
+
+CcnxCharbuf::~CcnxCharbuf()
+{
+  ccn_charbuf_destroy(&m_buf);
+}
+
+}
diff --git a/ccnx/ccnx-charbuf.h b/ccnx/ccnx-charbuf.h
new file mode 100644
index 0000000..fbb9588
--- /dev/null
+++ b/ccnx/ccnx-charbuf.h
@@ -0,0 +1,68 @@
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2012-2013 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>
+ *	   Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef CCNX_CCNX_CHARBUF_H
+#define CCNX_CCNX_CHARBUF_H
+
+#include "ccnx-common.h"
+#include <boost/shared_ptr.hpp>
+
+namespace Ccnx {
+
+class CcnxCharbuf;
+typedef boost::shared_ptr<CcnxCharbuf> CcnxCharbufPtr;
+
+//  This class is mostly used in CcnxWrapper; users should not be directly using this class
+// The main purpose of this class to is avoid manually create and destroy charbuf everytime
+class CcnxCharbuf
+{
+public:
+  CcnxCharbuf();
+  CcnxCharbuf(ccn_charbuf *buf);
+  CcnxCharbuf(const CcnxCharbuf &other);
+  CcnxCharbuf(const void *buf, size_t length);
+  ~CcnxCharbuf();
+
+  // expose internal data structure, use with caution!!
+  ccn_charbuf *
+  getBuf() { return m_buf; }
+
+  const ccn_charbuf *
+  getBuf() const { return m_buf; }
+
+  const unsigned char *
+  buf () const
+  { return m_buf->buf; }
+
+  size_t
+  length () const
+  { return m_buf->length; }
+
+private:
+  void init(ccn_charbuf *buf);
+
+protected:
+  ccn_charbuf *m_buf;
+};
+
+}
+
+#endif // CCNX_CCNX_CHARBUF_H
diff --git a/ccnx/ccnx-name.cpp b/ccnx/ccnx-name.cpp
index 55d434b..00fbe11 100644
--- a/ccnx/ccnx-name.cpp
+++ b/ccnx/ccnx-name.cpp
@@ -23,54 +23,12 @@
 #include <boost/lexical_cast.hpp>
 #include <ctype.h>
 #include <boost/algorithm/string/join.hpp>
+#include <boost/make_shared.hpp>
 
 using namespace std;
 
 namespace Ccnx{
 
-void
-CcnxCharbuf::init(ccn_charbuf *buf)
-{
-  if (buf != NULL)
-  {
-    m_buf = ccn_charbuf_create();
-    ccn_charbuf_reserve(m_buf, buf->length);
-    memcpy(m_buf->buf, buf->buf, buf->length);
-    m_buf->length = buf->length;
-  }
-}
-
-CcnxCharbuf::CcnxCharbuf()
-            : m_buf(NULL)
-{
-  m_buf = ccn_charbuf_create();
-}
-
-CcnxCharbuf::CcnxCharbuf(ccn_charbuf *buf)
-            : m_buf(NULL)
-{
-  init(buf);
-}
-
-CcnxCharbuf::CcnxCharbuf(const CcnxCharbuf &other)
-            : m_buf (NULL)
-{
-  init(other.m_buf);
-}
-
-CcnxCharbuf::CcnxCharbuf(const void *buf, size_t length)
-{
-  m_buf = ccn_charbuf_create ();
-  ccn_charbuf_reserve (m_buf, length);
-  memcpy (m_buf->buf, buf, length);
-  m_buf->length = length;
-}
-
-CcnxCharbuf::~CcnxCharbuf()
-{
-  ccn_charbuf_destroy(&m_buf);
-}
-
 Name::Name()
 {
 }
@@ -205,10 +163,11 @@
   return ss.str();
 }
 
-CcnxCharbufPtr
-Name::toCcnxCharbuf() const
+CcnxCharbuf*
+Name::toCcnxCharbufRaw () const
 {
-  CcnxCharbufPtr ptr(new CcnxCharbuf());
+  CcnxCharbuf *ptr = new CcnxCharbuf ();
+
   ccn_charbuf *cbuf = ptr->getBuf();
   ccn_name_init(cbuf);
   int size = m_comps.size();
@@ -219,6 +178,13 @@
   return ptr;
 }
 
+
+CcnxCharbufPtr
+Name::toCcnxCharbuf () const
+{
+  return CcnxCharbufPtr (toCcnxCharbufRaw ());
+}
+
 Name &
 Name::appendComp(const Name &comp)
 {
diff --git a/ccnx/ccnx-name.h b/ccnx/ccnx-name.h
index c11e52f..8e3ca6e 100644
--- a/ccnx/ccnx-name.h
+++ b/ccnx/ccnx-name.h
@@ -23,46 +23,10 @@
 #define CCNX_NAME_H
 #include <boost/shared_ptr.hpp>
 #include "ccnx-common.h"
+#include "ccnx-charbuf.h"
 
 namespace Ccnx {
 
-class CcnxCharbuf;
-typedef boost::shared_ptr<CcnxCharbuf> CcnxCharbufPtr;
-
-//  This class is mostly used in CcnxWrapper; users should not be directly using this class
-// The main purpose of this class to is avoid manually create and destroy charbuf everytime
-class CcnxCharbuf
-{
-public:
-  CcnxCharbuf();
-  CcnxCharbuf(ccn_charbuf *buf);
-  CcnxCharbuf(const CcnxCharbuf &other);
-  CcnxCharbuf(const void *buf, size_t length);
-  ~CcnxCharbuf();
-
-  // expose internal data structure, use with caution!!
-  ccn_charbuf *
-  getBuf() { return m_buf; }
-
-  const ccn_charbuf *
-  getBuf() const { return m_buf; }
-
-  const unsigned char *
-  buf () const
-  { return m_buf->buf; }
-
-  size_t
-  length () const
-  { return m_buf->length; }
-
-private:
-  void init(ccn_charbuf *buf);
-
-protected:
-  ccn_charbuf *m_buf;
-};
-
-
 struct NameException:
     virtual boost::exception, virtual std::exception {};
 
@@ -82,6 +46,9 @@
   CcnxCharbufPtr
   toCcnxCharbuf() const;
 
+  CcnxCharbuf*
+  toCcnxCharbufRaw () const;
+
   operator CcnxCharbufPtr () const { return toCcnxCharbuf (); }
 
   Name &