add Name and Selector classes
diff --git a/include/ccnx-name.h b/include/ccnx-name.h
new file mode 100644
index 0000000..84c045f
--- /dev/null
+++ b/include/ccnx-name.h
@@ -0,0 +1,134 @@
+#ifndef CCNX_NAME_H
+#define CCNX_NAME_H
+#include <boost/shared_ptr.hpp>
+#include "ccnx-common.h"
+
+namespace Ccnx {
+
+//  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();
+
+  // expose internal data structure, use with caution!!
+  ccn_charbuf *
+  getBuf() { return m_buf; }
+
+protected:
+  ccn_charbuf *m_buf;
+};
+
+typedef boost::shared_ptr<CcnxCharbuf> CcnxCharbufPtr;
+
+struct NameException:
+  virtual boost::exception, virtual exception {};
+class Name
+{
+public:
+  Name();
+  Name(const string &name);
+  Name(const vector<Bytes> &comps);
+  Name(const Name &other);
+  Name(const unsigned char *data, const ccn_indexbuf *comps);
+  virtual ~Name() {}
+
+  CcnxCharbufPtr
+  toCcnxCharbuf() const;
+
+  Name &
+  appendComp(const Bytes &comp);
+
+  Name &
+  appendComp(const string &compStr);
+
+  int
+  size() const {return m_comps.size();}
+
+  Bytes
+  getComp(int index) const;
+
+  // return string format of the comp
+  // if all characters are printable, simply returns the string
+  // if not, print the bytes in hex string format
+  string
+  getCompAsString(int index) const;
+
+  Name
+  getPartialName(int start, int n) const;
+
+
+protected:
+  vector<Bytes> m_comps;
+};
+
+ostream&
+operator <<(ostream &os, const Name &name);
+
+struct InterestSelectorException:
+  virtual boost::exception, virtual exception {};
+
+class Selectors
+{
+public:
+  Selectors();
+  Selectors(const Selectors &other);
+  ~Selectors(){};
+
+  typedef enum
+  {
+    AOK_CS = 0x1,
+    AOK_NEW = 0x2,
+    AOK_DEFAULT = 0x3, // (AOK_CS | AOK_NEW)
+    AOK_STALE = 0x4,
+    AOK_EXPIRE = 0x10
+  } AOK;
+
+  typedef enum
+  {
+    LEFT = 0,
+    RIGHT = 1,
+    DEFAULT = 2
+  } CHILD_SELECTOR;
+
+  inline Selectors &
+  maxSuffixComps(int maxSCs) {m_maxSuffixComps = maxSCs; return *this;}
+
+  inline Selectors &
+  minSuffixComps(int minSCs) {m_minSuffixComps = minSCs; return *this;}
+
+  inline Selectors &
+  answerOriginKind(AOK kind) {m_answerOriginKind = kind; return *this;}
+
+  inline Selectors &
+  interestLifetime(int lifetime) {m_interestLifetime = lifetime; return *this;}
+
+  inline Selectors &
+  scope(int scope) {m_scope = scope; return *this;}
+
+  inline Selectors &
+  childSelector(CHILD_SELECTOR child) {m_childSelector = child; return *this;}
+
+  // this has no effect now
+  inline Selectors &
+  publisherPublicKeyDigest(const Bytes &digest) {m_publisherPublicKeyDigest = digest; return *this;}
+
+  CcnxCharbufPtr
+  toCcnxCharbuf();
+
+private:
+  int m_maxSuffixComps;
+  int m_minSuffixComps;
+  AOK m_answerOriginKind;
+  double m_interestLifetime;
+  int m_scope;
+  CHILD_SELECTOR m_childSelector;
+  // not used now
+  Bytes m_publisherPublicKeyDigest;
+};
+
+} // Ccnx
+#endif