Added support for ContentObject
diff --git a/ndn-cpp/ContentObject.hpp b/ndn-cpp/ContentObject.hpp
new file mode 100644
index 0000000..9cf1c3d
--- /dev/null
+++ b/ndn-cpp/ContentObject.hpp
@@ -0,0 +1,142 @@
+/**
+ * @author: Jeff Thompson
+ * See COPYING for copyright and distribution information.
+ */
+
+#ifndef NDN_CONTENTOBJECT_HPP
+#define	NDN_CONTENTOBJECT_HPP
+
+#include "Name.hpp"
+#include "PublisherPublicKeyDigest.hpp"
+#include "Key.hpp"
+#include "c/ContentObject.h"
+
+namespace ndn {
+
+class Signature {
+public:
+  /**
+   * Set the signatureStruct to point to the values in this signature object, without copying any memory.
+   * WARNING: The resulting pointers in signatureStruct are invalid after a further use of this object which could reallocate memory.
+   * @param signatureStruct a C ndn_Signature struct where the name components array is already allocated.
+   */
+  void get(struct ndn_Signature &signatureStruct) const;
+
+  /**
+   * Clear this signature, and set the values by copying from the ndn_Signature struct.
+   * @param signatureStruct a C ndn_Signature struct
+   */
+  void set(const struct ndn_Signature &signatureStruct);
+
+  const std::vector<unsigned char> getDigestAlgorithm() const { return digestAlgorithm_; }
+
+  const std::vector<unsigned char> getWitness() const { return witness_; }
+
+  const std::vector<unsigned char> getSignature() const { return signature_; }
+  
+private:
+  std::vector<unsigned char> digestAlgorithm_; /**< if empty, the default is 2.16.840.1.101.3.4.2.1 (sha-256) */
+  std::vector<unsigned char> witness_;
+  std::vector<unsigned char> signature_;
+};
+
+class SignedInfo {
+public:
+  SignedInfo() 
+  {   
+    type_ = ndn_ContentType_DATA;
+    freshnessSeconds_ = -1;
+  }
+
+  /**
+   * Set the signedInfoStruct to point to the values in this signed info object, without copying any memory.
+   * WARNING: The resulting pointers in signedInfoStruct are invalid after a further use of this object which could reallocate memory.
+   * @param signedInfoStruct a C ndn_SignedInfo struct where the name components array is already allocated.
+   */
+  void get(struct ndn_SignedInfo &signedInfoStruct) const;
+
+  /**
+   * Clear this signed info, and set the values by copying from the ndn_SignedInfo struct.
+   * @param signedInfoStruct a C ndn_SignedInfo struct
+   */
+  void set(const struct ndn_SignedInfo &signedInfoStruct);
+
+  const PublisherPublicKeyDigest &getPublisherPublicKeyDigest() const { return publisherPublicKeyDigest_; }
+  
+  // TODO: Implement timestamp
+  
+  int getType() const { return type_; }
+  
+  int getFreshnessSeconds() const { return freshnessSeconds_; }
+  
+  const std::vector<unsigned char> getFinalBlockID() const { return finalBlockID_; }
+  
+  const KeyLocator &getKeyLocator() const { return keyLocator_; }
+  
+private:
+  PublisherPublicKeyDigest publisherPublicKeyDigest_;
+  // TODO: Implement timestamp
+  int type_;
+  int freshnessSeconds_;
+  std::vector<unsigned char> finalBlockID_;
+  KeyLocator keyLocator_;
+};
+  
+class ContentObject {
+public:
+  void encode(std::vector<unsigned char> &output, WireFormat &wireFormat) const 
+  {
+    wireFormat.encodeContentObject(*this, output);
+  }
+  void encode(std::vector<unsigned char> &output) const 
+  {
+    encode(output, BinaryXMLWireFormat::instance());
+  }
+  void decode(const unsigned char *input, unsigned int inputLength, WireFormat &wireFormat) 
+  {
+    wireFormat.decodeContentObject(*this, input, inputLength);
+  }
+  void decode(const unsigned char *input, unsigned int inputLength) 
+  {
+    decode(input, inputLength, BinaryXMLWireFormat::instance());
+  }
+  void decode(const std::vector<unsigned char> &input, WireFormat &wireFormat) 
+  {
+    decode(&input[0], input.size(), wireFormat);
+  }
+  void decode(const std::vector<unsigned char> &input) 
+  {
+    decode(&input[0], input.size());
+  }
+  
+  /**
+   * Set the contentObjectStruct to point to the values in this interest, without copying any memory.
+   * WARNING: The resulting pointers in contentObjectStruct are invalid after a further use of this object which could reallocate memory.
+   * @param contentObjectStruct a C ndn_ContentObject struct where the name components array is already allocated.
+   */
+  void get(struct ndn_ContentObject &contentObjectStruct) const;
+
+  /**
+   * Clear this content object, and set the values by copying from the ndn_ContentObject struct.
+   * @param contentObjectStruct a C ndn_ContentObject struct
+   */
+  void set(const struct ndn_ContentObject &contentObjectStruct);
+
+  const Signature &getSignature() const { return signature_; }
+  
+  const Name &getName() const { return name_; }
+  
+  const SignedInfo &getSignedInfo() const { return signedInfo_; }
+  
+  const std::vector<unsigned char> getContent() const { return content_; }
+  
+private:
+  Signature signature_;
+  Name name_;
+  SignedInfo signedInfo_;
+  std::vector<unsigned char> content_;
+};
+  
+}
+
+#endif