add Name and Selector classes
diff --git a/include/ccnx-common.h b/include/ccnx-common.h
index 0636a62..06e7700 100644
--- a/include/ccnx-common.h
+++ b/include/ccnx-common.h
@@ -1,6 +1,14 @@
#ifndef CCNX_COMMON_H
#define CCNX_COMMON_H
+extern "C" {
+#include <ccn/ccn.h>
+#include <ccn/charbuf.h>
+#include <ccn/keystore.h>
+#include <ccn/uri.h>
+#include <ccn/bloom.h>
+#include <ccn/signing.h>
+}
#include <vector>
#include <boost/shared_ptr.hpp>
#include <boost/exception/all.hpp>
@@ -24,10 +32,8 @@
// --- Bytes operations end ---
-// --- Name operation start ---
-void
-split(const string &name, Comps &comps);
-// --- Name operation end ---
+// Exceptions
+typedef boost::error_info<struct tag_errmsg, std::string> error_info_str;
} // Ccnx
#endif // CCNX_COMMON_H
diff --git a/include/ccnx-interest.h b/include/ccnx-interest.h
deleted file mode 100644
index fd1db18..0000000
--- a/include/ccnx-interest.h
+++ /dev/null
@@ -1,31 +0,0 @@
-#ifndef CCNX_INTEREST_H
-#define CCNX_INTEREST_H
-#include "ccnx-common.h"
-
-namespace Ccnx {
-
-// Currently, other classes use string when Interest is needed.
-// The constructor from string ensures that if we change other classes' APIs to use Interest object
-// instead of string, it is still backwards compatible
-// Using a separate Interest class instead of simple string allows us to add control fields
-// to the Interest, e.g. ChildSelector. Perhaps that's a separate Selectors class. Will do it after ChronoShare project finishes.
-
-// Since the selector is only useful when sending Interest (in callbacks, usually we only need to know the name of the Interest),
-// we currently only use Interest object in sendInterest of CcnxWrapper. In other places, Interest object is equivalent of
-// its string name.
-
-class Interest
-{
-public:
- Interest(const string &name) : m_name(name) {}
- virtual ~Interest() {}
-
- string
- name() const { return m_name; }
-
-protected:
- string m_name;
-};
-
-} // Ccnx
-#endif
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
diff --git a/include/ccnx-tunnel.h b/include/ccnx-tunnel.h
index dff2f50..15d5223 100644
--- a/include/ccnx-tunnel.h
+++ b/include/ccnx-tunnel.h
@@ -39,7 +39,7 @@
publishContentObject(const string &name, const Bytes &contentObject, int freshness);
virtual int
- sendInterest (const Interest &interest, Closure *closure);
+ sendInterest (const string &interest, Closure *closure);
// prefix is topology-independent
diff --git a/include/ccnx-wrapper.h b/include/ccnx-wrapper.h
index 9b50ae8..90089e7 100644
--- a/include/ccnx-wrapper.h
+++ b/include/ccnx-wrapper.h
@@ -1,21 +1,12 @@
#ifndef CCNX_WRAPPER_H
#define CCNX_WRAPPER_H
-extern "C" {
-#include <ccn/ccn.h>
-#include <ccn/charbuf.h>
-#include <ccn/keystore.h>
-#include <ccn/uri.h>
-#include <ccn/bloom.h>
-#include <ccn/signing.h>
-}
-
#include <boost/thread/locks.hpp>
#include <boost/thread/recursive_mutex.hpp>
#include <boost/thread/thread.hpp>
#include "ccnx-common.h"
-#include "ccnx-interest.h"
+#include "ccnx-name.h"
#include "ccnx-closure.h"
using namespace std;
@@ -46,7 +37,7 @@
clearInterestFilter (const string &prefix);
virtual int
- sendInterest (const Interest &interest, Closure *closure);
+ sendInterest (const string &interest, Closure *closure);
virtual int
publishData (const string &name, const unsigned char *buf, size_t len, int freshness);