data: Converting Data packet and related fields to TLV

Change-Id: Ie7a6db7352384f14a830046e65a953a2d9bbb71c
diff --git a/include/ndn-cpp/data.hpp b/include/ndn-cpp/data.hpp
index a227c7f..1fb098f 100644
--- a/include/ndn-cpp/data.hpp
+++ b/include/ndn-cpp/data.hpp
@@ -10,51 +10,94 @@
 
 #include "common.hpp"
 #include "name.hpp"
-#include "util/signed-blob.hpp"
-#include "c/data-types.h"
-#include "encoding/wire-format.hpp"
+#include "encoding/block.hpp"
 
-struct ndn_MetaInfo;
-struct ndn_Signature;
-struct ndn_Data;
 
 namespace ndn {
 
 /**
- * A Signature is an abstract base class providing methods to work with the signature information in a Data packet.
- * You must create an object of a subclass, for example Sha256WithRsaSignature.
+ * A Signature is storage for the signature-related information (info and value) in a Data packet.
  */
 class Signature {
 public:
-  /**
-   * Return a pointer to a new Signature which is a copy of this signature.
-   * This is pure virtual, the subclass must implement it.
-   */
-  virtual ptr_lib::shared_ptr<Signature> 
-  clone() const = 0;
+  enum {
+    DigestSha256 = 0,
+    SignatureSha256WithRsa = 1
+  };
   
-  /**
-   * The virtual destructor.
-   */
-  virtual 
-  ~Signature();
+  Signature()
+    : type_(-1)
+  {
+  }
   
-    /**
-   * 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.
-   * This is pure virtual, the subclass must implement it.
-   * @param signatureStruct a C ndn_Signature struct where the name components array is already allocated.
-   */
-  virtual void 
-  get(struct ndn_Signature& signatureStruct) const = 0;
+  Signature(const Block &info, const Block &value)
+    : info_(info)
+    , value_(value)
+  {
+    Buffer::const_iterator i = info_.value_begin();
+    type_ = Tlv::readVarNumber(i, info_.value_end());
+  }
 
-  /**
-   * Clear this signature, and set the values by copying from the ndn_Signature struct.
-   * This is pure virtual, the subclass must implement it.
-   * @param signatureStruct a C ndn_Signature struct
-   */
-  virtual void 
-  set(const struct ndn_Signature& signatureStruct) = 0;
+  operator bool() const
+  {
+    return type_ != -1;
+  }
+
+  uint32_t
+  getType() const
+  {
+    return type_;
+  }
+  
+  const Block&
+  getInfo() const
+  {
+    return info_;
+  }
+
+  void
+  setInfo(const Block &info)
+  {
+    info_ = info;
+    if (info_.hasWire() || info_.hasValue())
+      {
+        info_.parse();
+        const Block &signatureType = info_.get(Tlv::SignatureType);
+        
+        Buffer::const_iterator i = signatureType.value_begin();
+        type_ = Tlv::readVarNumber(i, signatureType.value_end());
+      }
+    else
+      {
+        type_ = -1;
+      }
+  }  
+
+  const Block&
+  getValue() const
+  {
+    return value_;
+  }
+
+  void
+  setValue(const Block &value)
+  {
+    value_ = value;
+  }
+
+  void
+  reset()
+  {
+    type_ = -1;
+    info_.reset();
+    value_.reset();
+  }
+
+private:
+  int32_t type_;
+  
+  Block info_;
+  Block value_;
 };
 
 /**
@@ -62,56 +105,39 @@
  */
 class MetaInfo {
 public:
-  MetaInfo() 
+  enum {
+    TYPE_DEFAULT = 0,
+    TYPE_LINK = 1,
+    TYPE_KEY = 2
+  };
+  
+  MetaInfo()
+    : type_(TYPE_DEFAULT)
+    , freshnessPeriod_(-1)
   {   
-    type_ = ndn_ContentType_DATA;
-    freshnessSeconds_ = -1;
   }
+  
+  uint32_t 
+  getType() const
+  { return type_; }
+  
+  void 
+  setType(uint32_t type)
+  { type_ = type; }
+  
+  Milliseconds 
+  getFreshnessPeriod() const
+  { return freshnessPeriod_; }
+  
+  void 
+  setFreshnessPeriod(Milliseconds freshnessPeriod)
+  { freshnessPeriod_ = freshnessPeriod; }
 
-  /**
-   * Set the metaInfoStruct to point to the values in this meta info object, without copying any memory.
-   * WARNING: The resulting pointers in metaInfoStruct are invalid after a further use of this object which could reallocate memory.
-   * @param metaInfoStruct a C ndn_MetaInfo struct where the name components array is already allocated.
-   */
-  void 
-  get(struct ndn_MetaInfo& metaInfoStruct) const;
-
-  /**
-   * Clear this meta info, and set the values by copying from the ndn_MetaInfo struct.
-   * @param metaInfoStruct a C ndn_MetaInfo struct
-   */
-  void 
-  set(const struct ndn_MetaInfo& metaInfoStruct);
-
-  MillisecondsSince1970 
-  getTimestampMilliseconds() const { return timestampMilliseconds_; }
-  
-  ndn_ContentType 
-  getType() const { return type_; }
-  
-  int 
-  getFreshnessSeconds() const { return freshnessSeconds_; }
-  
-  const Name::Component& 
-  getFinalBlockID() const { return finalBlockID_; }
-  
-  void 
-  setTimestampMilliseconds(MillisecondsSince1970 timestampMilliseconds) { timestampMilliseconds_ = timestampMilliseconds; }
-  
-  void 
-  setType(ndn_ContentType type) { type_ = type; }
-  
-  void 
-  setFreshnessSeconds(int freshnessSeconds) { freshnessSeconds_ = freshnessSeconds; }
-
-  void 
-  setFinalBlockID(const Name::Component& finalBlockID) { finalBlockID_ = finalBlockID; }
-    
 private:
-  MillisecondsSince1970 timestampMilliseconds_; /**< milliseconds since 1/1/1970. -1 for none */
-  ndn_ContentType type_;         /**< default is ndn_ContentType_DATA. -1 for none */
-  int freshnessSeconds_;         /**< -1 for none */
-  Name::Component finalBlockID_; /** size 0 for none */
+  uint32_t type_;
+  Milliseconds freshnessPeriod_;
+
+  Block wire_;
 };
   
 class Data {
@@ -119,31 +145,25 @@
   /**
    * Create a new Data object with default values and where the signature is a blank Sha256WithRsaSignature.
    */
-  Data();
+  Data()
+  {
+  }
 
   /**
    * Create a new Data object with the given name and default values and where the signature is a blank Sha256WithRsaSignature.
    * @param name A reference to the name which is copied.
    */
-  Data(const Name& name);
-  
-  /**
-   * The copy constructor: Create a deep copy of the given data object, including a clone of the signature object.
-   * @param data The data object to copy.
-   */
-  Data(const Data& data);
+  Data(const Name& name)
+    : name_(name)
+  {
+  }
   
   /**
    * The virtual destructor.
    */
-  virtual ~Data();
-  
-  /**
-   * The assignment operator: Copy fields and make a clone of the signature.
-   * @param data The other object to copy from.
-   * @return A reference to this object.
-   */
-  Data& operator=(const Data& data);
+  virtual ~Data()
+  {
+  }
   
   /**
    * Encode this Data for a particular wire format. If wireFormat is the default wire format, also set the defaultWireEncoding 
@@ -152,8 +172,11 @@
    * @param wireFormat A WireFormat object used to encode the input. If omitted, use WireFormat getDefaultWireFormat().
    * @return The encoded byte array.
    */
-  SignedBlob 
-  wireEncode(WireFormat& wireFormat = *WireFormat::getDefaultWireFormat()) const;
+  const Block& 
+  wireEncode() const;
+  
+  void
+  wireDecode(const Block &wire);
   
   /**
    * Decode the input using a particular wire format and update this Data. If wireFormat is the default wire format, also 
@@ -162,155 +185,127 @@
    * @param inputLength The length of input.
    * @param wireFormat A WireFormat object used to decode the input. If omitted, use WireFormat getDefaultWireFormat().
    */
-  void 
-  wireDecode(const uint8_t* input, size_t inputLength, WireFormat& wireFormat = *WireFormat::getDefaultWireFormat());
-  
-  /**
-   * Decode the input using a particular wire format and update this Data. If wireFormat is the default wire format, also 
-   * set the defaultWireEncoding field to the input.
-   * @param input The input byte array to be decoded.
-   * @param wireFormat A WireFormat object used to decode the input. If omitted, use WireFormat getDefaultWireFormat().
-   */
-  void 
-  wireDecode(const std::vector<uint8_t>& input, WireFormat& wireFormat = *WireFormat::getDefaultWireFormat()) 
+  void
+  wireDecode(const uint8_t* input, size_t inputLength);
+
+  const Signature&
+  getSignature() const
   {
-    wireDecode(&input[0], input.size(), wireFormat);
+    return signature_;
   }
   
   /**
-   * Set the dataStruct to point to the values in this interest, without copying any memory.
-   * WARNING: The resulting pointers in dataStruct are invalid after a further use of this object which could reallocate memory.
-   * @param dataStruct a C ndn_Data struct where the name components array is already allocated.
-   */
-  void 
-  get(struct ndn_Data& dataStruct) const;
-
-  /**
-   * Clear this data object, and set the values by copying from the ndn_Data struct.
-   * @param dataStruct a C ndn_Data struct
-   */
-  void 
-  set(const struct ndn_Data& dataStruct);
-
-  const Signature* 
-  getSignature() const { return signature_.get(); }
-  
-  Signature* 
-  getSignature() 
-  { 
-    // TODO: Should add an OnChanged listener instead of always calling onChanged.
-    onChanged();
-    return signature_.get(); 
-  }
-  
-  const Name& 
-  getName() const { return name_; }
-  
-  Name& 
-  getName() 
-  { 
-    // TODO: Should add an OnChanged listener instead of always calling onChanged.
-    onChanged();
-    return name_; 
-  }
-  
-  const MetaInfo& 
-  getMetaInfo() const { return metaInfo_; }
-  
-  MetaInfo& 
-  getMetaInfo() 
-  { 
-    // TODO: Should add an OnChanged listener instead of always calling onChanged.
-    onChanged();
-    return metaInfo_; 
-  }
-  
-  const Blob& 
-  getContent() const { return content_; }
-
-  /**
-   * Return a pointer to the defaultWireEncoding.  It may be null.
-   */
-  const SignedBlob&
-  getDefaultWireEncoding() const { return defaultWireEncoding_; }
-  
-  /**
    * Set the signature to a copy of the given signature.
    * @param signature The signature object which is cloned.
    * @return This Data so that you can chain calls to update values.
    */
   Data& 
   setSignature(const Signature& signature) 
-  { 
-    signature_ = signature.clone(); 
+  {
+    signature_ = signature;
     onChanged();
     return *this;
   }
   
+  const Name& 
+  getName() const
+  {
+    return name_;
+  }
+  
   /**
    * Set name to a copy of the given Name.  This is virtual so that a subclass can override to validate the name.
    * @param name The Name which is copied.
    * @return This Data so that you can chain calls to update values.
    */
-  virtual Data& 
-  setName(const Name& name);
+  void
+  setName(const Name& name)
+  { 
+    name_ = name; 
+    onChanged();
+  }
+  
+  const MetaInfo& 
+  getMetaInfo() const { return metaInfo_; }
   
   /**
    * Set metaInfo to a copy of the given MetaInfo.
    * @param metaInfo The MetaInfo which is copied.
    * @return This Data so that you can chain calls to update values.
    */
-  Data& 
+  void
   setMetaInfo(const MetaInfo& metaInfo) 
   { 
     metaInfo_ = metaInfo; 
     onChanged();
-    return *this;
   }
 
+  const Block& 
+  getContent() const { return content_; }
+
   /**
    * Set the content to a copy of the data in the vector.
    * @param content A vector whose contents are copied.
    * @return This Data so that you can chain calls to update values.
    */
-  Data& 
+  void
   setContent(const std::vector<uint8_t>& content) 
-  { 
-    content_ = content; 
+  {
+    setContent(&content[0], content.size());
     onChanged();
-    return *this;
   }
   
-  Data& 
+  void
   setContent(const uint8_t* content, size_t contentLength) 
-  { 
-    content_ = Blob(content, contentLength); 
+  {
+    OBufferStream os;
+    Tlv::writeVarNumber(os, Tlv::Content);
+    Tlv::writeVarNumber(os, contentLength);
+    os.write(reinterpret_cast<const char *>(content), contentLength);
+    
+    content_ = Block(os.buf());
     onChanged();
-    return *this;
   }
-      
-  Data& 
-  setContent(const Blob& content) 
+
+  void
+  setContent(const ConstBufferPtr &contentValue)
+  {
+    content_ = Block(Tlv::Content, contentValue); // not real a wire encoding yet
+    onChanged();
+  }
+  
+  void
+  setContent(const Block& content) 
   { 
     content_ = content;
     onChanged();
-    return *this;
   }
 
 private:
   /**
    * Clear the wire encoding.
    */
-  void 
+  inline void 
   onChanged();
-  
-  ptr_lib::shared_ptr<Signature> signature_;
+
+private:
   Name name_;
   MetaInfo metaInfo_;
-  Blob content_;
-  SignedBlob defaultWireEncoding_;
+  Block content_;
+  Signature signature_;
+
+  Block wire_;
 };
-  
+
+
+inline void 
+Data::onChanged()
+{
+  // The values have changed, so the signature and wire format is invalidated
+  signature_.reset();
+  wire_.reset();
 }
 
+} // namespace ndn
+
 #endif
diff --git a/include/ndn-cpp/key-locator.hpp b/include/ndn-cpp/key-locator.hpp
index 5c1f6c1..f6c6f9d 100644
--- a/include/ndn-cpp/key-locator.hpp
+++ b/include/ndn-cpp/key-locator.hpp
@@ -8,88 +8,71 @@
 #ifndef NDN_KEY_LOCATOR_HPP
 #define NDN_KEY_LOCATOR_HPP
 
-#include <vector>
-#include "c/key-types.h"
+#include "encoding/tlv-element.hpp"
 #include "name.hpp"
 
-struct ndn_KeyLocator;
-
 namespace ndn {
-  
+
+namespace error {
+struct KeyLocator : public std::runtime_error { KeyLocator(const std::string &what) : std::runtime_error(what) {} };
+} // error
+
 class KeyLocator {
 public:
+  enum {
+    KeyLocator_None = -1,
+    KeyLocator_Name = 0
+  };
+  
   KeyLocator()
-  : type_((ndn_KeyLocatorType)-1), keyNameType_((ndn_KeyNameType)-1)
+    : type_(KeyLocator_None)
   {
   }
-  
-  /**
-   * Clear the keyData and set the type to none.
-   */
-  void 
-  clear()
-  {
-    type_ = (ndn_KeyLocatorType)-1;
-    keyNameType_ = (ndn_KeyNameType)-1;
-    keyData_.reset();
-  }
-  
-  /**
-   * Set the keyLocatorStruct to point to the values in this key locator, without copying any memory.
-   * WARNING: The resulting pointers in keyLocatorStruct are invalid after a further use of this object which could reallocate memory.
-   * @param keyLocatorStruct a C ndn_KeyLocator struct where the name components array is already allocated.
-   */
-  void 
-  get(struct ndn_KeyLocator& keyLocatorStruct) const;
-  
-  /**
-   * Clear this key locator, and set the values by copying from the ndn_KeyLocator struct.
-   * @param keyLocatorStruct a C ndn_KeyLocator struct
-   */
-  void 
-  set(const struct ndn_KeyLocator& keyLocatorStruct);
 
-  ndn_KeyLocatorType 
+  inline bool
+  empty() const
+  {
+    return type_ == KeyLocator_None;
+  }
+  
+  uint32_t 
   getType() const { return type_; }
   
-  const Blob& 
-  getKeyData() const { return keyData_; }
-
-  const Name& 
-  getKeyName() const { return keyName_; }
-  
-  Name& 
-  getKeyName() { return keyName_; }
-
-  ndn_KeyNameType 
-  getKeyNameType() const { return keyNameType_; }
-
   void 
-  setType(ndn_KeyLocatorType type) { type_ = type; }
+  setType(uint32_t type) { type_ = type; }
     
+  const Block& 
+  getValue() const { return value_; }
+
   void 
-  setKeyData(const Blob& keyData) { keyData_ = keyData; }
+  setValue(const Block &value) { value_ = value; }
+
+  ////////////////////////////////////////////////////////
+  // Helper methods for different types of key locators
+  //
+  // For now only Name type is actually supported
+  
+  Name
+  getName() const
+  {
+    if (type_ != KeyLocator_Name)
+      throw error::KeyLocator("Requested Name, but KeyLocator is not of the Name type");
+
+    return Name(getValue());
+  }
 
   void
-  setKeyName(const Name &keyName) { keyName_ = keyName; }
+  setName(const Name &name)
+  {
+    type_ = KeyLocator_Name;
+    value_ = name.wireEncode();
+  }
   
-  void 
-  setKeyNameType(ndn_KeyNameType keyNameType) { keyNameType_ = keyNameType; }
-
 private:
-  ndn_KeyLocatorType type_; /**< -1 for none */
-  Blob keyData_; /**< An array for the key data as follows:
-    *   If type_ is ndn_KeyLocatorType_KEY, the key data.
-    *   If type_ is ndn_KeyLocatorType_CERTIFICATE, the certificate data. 
-    *   If type_ is ndn_KeyLocatorType_KEYNAME and keyNameType_ is ndn_KeyNameType_PUBLISHER_PUBLIC_KEY_DIGEST, the publisher public key digest. 
-    *   If type_ is ndn_KeyLocatorType_KEYNAME and keyNameType_ is ndn_KeyNameType_PUBLISHER_CERTIFICATE_DIGEST, the publisher certificate digest. 
-    *   If type_ is ndn_KeyLocatorType_KEYNAME and keyNameType_ is ndn_KeyNameType_PUBLISHER_ISSUER_KEY_DIGEST, the publisher issuer key digest. 
-    *   If type_ is ndn_KeyLocatorType_KEYNAME and keyNameType_ is ndn_KeyNameType_PUBLISHER_ISSUER_CERTIFICATE_DIGEST, the publisher issuer certificate digest. 
-                                */
-  Name keyName_;                /**< The key name (only used if type_ is ndn_KeyLocatorType_KEYNAME.) */
-  ndn_KeyNameType keyNameType_; /**< The type of data for keyName_, -1 for none. (only used if type_ is ndn_KeyLocatorType_KEYNAME.) */
+  uint32_t type_;
+  Block value_;
 };
-  
+
 }
 
 #endif
diff --git a/include/ndn-cpp/publisher-public-key-digest.hpp b/include/ndn-cpp/publisher-public-key-digest.hpp
deleted file mode 100644
index 289e682..0000000
--- a/include/ndn-cpp/publisher-public-key-digest.hpp
+++ /dev/null
@@ -1,64 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/**
- * Copyright (C) 2013 Regents of the University of California.
- * @author: Jeff Thompson <jefft0@remap.ucla.edu>
- * See COPYING for copyright and distribution information.
- */
-
-#ifndef NDN_PUBLISHERPUBLICKEYDIGEST_HPP
-#define NDN_PUBLISHERPUBLICKEYDIGEST_HPP
-
-#include <vector>
-#include "common.hpp"
-#include "util/blob.hpp"
-
-struct ndn_PublisherPublicKeyDigest;
-
-namespace ndn {
-  
-/**
- * A PublisherPublicKeyDigest holds the publisher public key digest value, if any.
- * We make a separate class since this is used by multiple other classes.
- */
-class PublisherPublicKeyDigest {
-public:    
-  PublisherPublicKeyDigest() {
-  }
-  
-  /**
-   * Set the publisherPublicKeyDigestStruct to point to the entries in this PublisherPublicKeyDigest, without copying any memory.
-   * WARNING: The resulting pointers in publisherPublicKeyDigestStruct are invalid after a further use of this object which could reallocate memory.
-   * @param publisherPublicKeyDigestStruct a C ndn_PublisherPublicKeyDigest struct to receive the pointer
-   */
-  void 
-  get(struct ndn_PublisherPublicKeyDigest& publisherPublicKeyDigestStruct) const;
-  
-  /**
-   * Clear this PublisherPublicKeyDigest, and copy from the ndn_PublisherPublicKeyDigest struct.
-   * @param excludeStruct a C ndn_Exclude struct
-   */
-  void 
-  set(const struct ndn_PublisherPublicKeyDigest& publisherPublicKeyDigestStruct);
-
-  const Blob& 
-  getPublisherPublicKeyDigest() const { return publisherPublicKeyDigest_; }
-
-  void 
-  setPublisherPublicKeyDigest(const Blob& publisherPublicKeyDigest) { publisherPublicKeyDigest_ = publisherPublicKeyDigest; }
-  
-  /**
-   * Clear the publisherPublicKeyDigest.
-   */
-  void 
-  clear()
-  {
-    publisherPublicKeyDigest_.reset();
-  }
-
-private:
-  Blob publisherPublicKeyDigest_;
-};
-  
-}
-
-#endif
diff --git a/include/ndn-cpp/sha256-with-rsa-signature.hpp b/include/ndn-cpp/sha256-with-rsa-signature.hpp
deleted file mode 100644
index d2e5374..0000000
--- a/include/ndn-cpp/sha256-with-rsa-signature.hpp
+++ /dev/null
@@ -1,103 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/**
- * Copyright (C) 2013 Regents of the University of California.
- * @author: Jeff Thompson <jefft0@remap.ucla.edu>
- * See COPYING for copyright and distribution information.
- */
-
-#ifndef NDN_SHA256_WITH_RSA_SIGNATURE_HPP
-#define NDN_SHA256_WITH_RSA_SIGNATURE_HPP
-
-#include "data.hpp"
-#include "key-locator.hpp"
-#include "publisher-public-key-digest.hpp"
-
-namespace ndn {
-
-/**
- * A Sha256WithRsaSignature extends Signature and holds the signature bits and other info representing a
- * SHA256-with-RSA signature in a data packet.
- */
-class Sha256WithRsaSignature : public Signature {
-public:
-  /**
-   * Return a pointer to a new Sha256WithRsaSignature which is a copy of this signature.
-   */
-  virtual ptr_lib::shared_ptr<Signature> 
-  clone() const;
-
-  /**
-   * 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.
-   */
-  virtual 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
-   */
-  virtual void 
-  set(const struct ndn_Signature& signatureStruct);
-
-  const Blob& 
-  getDigestAlgorithm() const { return digestAlgorithm_; }
-
-  const Blob& 
-  getWitness() const { return witness_; }
-
-  const Blob& 
-  getSignature() const { return signature_; }
-  
-  const PublisherPublicKeyDigest& 
-  getPublisherPublicKeyDigest() const { return publisherPublicKeyDigest_; }
-  
-  PublisherPublicKeyDigest& 
-  getPublisherPublicKeyDigest() { return publisherPublicKeyDigest_; }
-  
-  const KeyLocator& 
-  getKeyLocator() const { return keyLocator_; }
-  
-  KeyLocator& 
-  getKeyLocator() { return keyLocator_; }
-
-  void 
-  setDigestAlgorithm(const Blob& digestAlgorithm) { digestAlgorithm_ = digestAlgorithm; }
-
-  void 
-  setWitness(const Blob& witness) { witness_ = witness; }
-
-  void 
-  setSignature(const Blob& signature) { signature_ = signature; }
-
-  void 
-  setPublisherPublicKeyDigest(const PublisherPublicKeyDigest& publisherPublicKeyDigest) { publisherPublicKeyDigest_ = publisherPublicKeyDigest; }
-  
-  void 
-  setKeyLocator(const KeyLocator& keyLocator) { keyLocator_ = keyLocator; }
-  
-  /**
-   * Clear all the fields.
-   */
-  void 
-  clear()
-  {
-    digestAlgorithm_.reset();
-    witness_.reset();
-    signature_.reset();
-    publisherPublicKeyDigest_.clear();
-    keyLocator_.clear();
-  }
-
-private:
-  Blob digestAlgorithm_; /**< if empty, the default is 2.16.840.1.101.3.4.2.1 (sha-256) */
-  Blob witness_;
-  Blob signature_;
-  PublisherPublicKeyDigest publisherPublicKeyDigest_;
-  KeyLocator keyLocator_;
-};
-
-}
-
-#endif
diff --git a/src/data.cpp b/src/data.cpp
index db60f80..fa1afe9 100644
--- a/src/data.cpp
+++ b/src/data.cpp
@@ -7,131 +7,42 @@
 
 #include <ndn-cpp/common.hpp>
 #include <ndn-cpp/data.hpp>
-#include <ndn-cpp/sha256-with-rsa-signature.hpp>
-#include "c/data.h"
 
 using namespace std;
 
 namespace ndn {
 
-Signature::~Signature()
+const Block &
+Data::wireEncode() const
 {
-}
+  // size_t signedPortionBeginOffset, signedPortionEndOffset;
+  // Blob encoding = wireFormat.encodeData(*this, &signedPortionBeginOffset, &signedPortionEndOffset);
+  // SignedBlob wireEncoding = SignedBlob(encoding, signedPortionBeginOffset, signedPortionEndOffset);
   
-void 
-MetaInfo::get(struct ndn_MetaInfo& metaInfoStruct) const 
+  // if (&wireFormat == WireFormat::getDefaultWireFormat())
+  //   // This is the default wire encoding.
+  //   const_cast<Data*>(this)->defaultWireEncoding_ = wireEncoding;
+  
+  // return wireEncoding;
+  return wire_;
+}
+
+void
+Data::wireDecode(const Block &wire)
 {
-  metaInfoStruct.timestampMilliseconds = timestampMilliseconds_;
-  metaInfoStruct.type = type_;
-  metaInfoStruct.freshnessSeconds = freshnessSeconds_;
-  finalBlockID_.get(metaInfoStruct.finalBlockID);
 }
 
 void 
-MetaInfo::set(const struct ndn_MetaInfo& metaInfoStruct)
+Data::wireDecode(const uint8_t* input, size_t inputLength) 
 {
-  timestampMilliseconds_ = metaInfoStruct.timestampMilliseconds;
-  type_ = metaInfoStruct.type;
-  freshnessSeconds_ = metaInfoStruct.freshnessSeconds;
-  finalBlockID_ = Name::Component(Blob(metaInfoStruct.finalBlockID.value));
-}
-
-Data::Data()
-: signature_(new Sha256WithRsaSignature())
-{
-}
+  // size_t signedPortionBeginOffset, signedPortionEndOffset;
+  // wireFormat.decodeData(*this, input, inputLength, &signedPortionBeginOffset, &signedPortionEndOffset);
   
-Data::Data(const Name& name)
-: name_(name), signature_(new Sha256WithRsaSignature())
-{
-}
-
-Data::Data(const Data& data)
-: name_(data.name_), metaInfo_(data.metaInfo_), content_(data.content_), defaultWireEncoding_(data.defaultWireEncoding_)
-{
-  if (data.signature_)
-    signature_ = data.signature_->clone();
-}
-
-Data::~Data()
-{
-}
-
-Data& Data::operator=(const Data& data)
-{
-  if (data.signature_)
-    signature_ = data.signature_->clone();
-  else
-    signature_ = ptr_lib::shared_ptr<Signature>();
-  
-  name_ = data.name_;
-  metaInfo_ = data.metaInfo_;
-  content_ = data.content_;
-  defaultWireEncoding_ = data.defaultWireEncoding_;
-
-  return *this;
-}
-
-void 
-Data::get(struct ndn_Data& dataStruct) const 
-{
-  signature_->get(dataStruct.signature);
-  name_.get(dataStruct.name);
-  metaInfo_.get(dataStruct.metaInfo);
-  content_.get(dataStruct.content);
-}
-
-void 
-Data::set(const struct ndn_Data& dataStruct)
-{
-  signature_->set(dataStruct.signature);
-  name_.set(dataStruct.name);
-  metaInfo_.set(dataStruct.metaInfo);
-  content_ = Blob(dataStruct.content);
-
-  onChanged();
-}
-
-Data& 
-Data::setName(const Name& name) 
-{ 
-  name_ = name; 
-  onChanged();
-  return *this;
-}
-
-SignedBlob 
-Data::wireEncode(WireFormat& wireFormat) const
-{
-  size_t signedPortionBeginOffset, signedPortionEndOffset;
-  Blob encoding = wireFormat.encodeData(*this, &signedPortionBeginOffset, &signedPortionEndOffset);
-  SignedBlob wireEncoding = SignedBlob(encoding, signedPortionBeginOffset, signedPortionEndOffset);
-  
-  if (&wireFormat == WireFormat::getDefaultWireFormat())
-    // This is the default wire encoding.
-    const_cast<Data*>(this)->defaultWireEncoding_ = wireEncoding;
-  
-  return wireEncoding;
-}
-
-void 
-Data::wireDecode(const uint8_t* input, size_t inputLength, WireFormat& wireFormat) 
-{
-  size_t signedPortionBeginOffset, signedPortionEndOffset;
-  wireFormat.decodeData(*this, input, inputLength, &signedPortionBeginOffset, &signedPortionEndOffset);
-  
-  if (&wireFormat == WireFormat::getDefaultWireFormat())
-    // This is the default wire encoding.
-    defaultWireEncoding_ = SignedBlob(input, inputLength, signedPortionBeginOffset, signedPortionEndOffset);
-  else
-    defaultWireEncoding_ = SignedBlob();
-}
-
-void 
-Data::onChanged()
-{
-  // The values have changed, so the default wire encoding is invalidated.
-  defaultWireEncoding_ = SignedBlob();
+  // if (&wireFormat == WireFormat::getDefaultWireFormat())
+  //   // This is the default wire encoding.
+  //   defaultWireEncoding_ = SignedBlob(input, inputLength, signedPortionBeginOffset, signedPortionEndOffset);
+  // else
+  //   defaultWireEncoding_ = SignedBlob();
 }
 
 }
diff --git a/src/key-locator.cpp b/src/key-locator.cpp
deleted file mode 100644
index fbd7729..0000000
--- a/src/key-locator.cpp
+++ /dev/null
@@ -1,41 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/**
- * Copyright (C) 2013 Regents of the University of California.
- * @author: Jeff Thompson <jefft0@remap.ucla.edu>
- * See COPYING for copyright and distribution information.
- */
-
-#include <ndn-cpp/common.hpp>
-#include <ndn-cpp/key-locator.hpp>
-#include "c/key-locator.h"
-
-using namespace std;
-
-namespace ndn {
-  
-void 
-KeyLocator::get(struct ndn_KeyLocator& keyLocatorStruct) const 
-{
-  keyLocatorStruct.type = type_;
-  keyData_.get(keyLocatorStruct.keyData);
-  keyName_.get(keyLocatorStruct.keyName);
-  keyLocatorStruct.keyNameType = keyNameType_;
-}
-
-void 
-KeyLocator::set(const struct ndn_KeyLocator& keyLocatorStruct)
-{
-  type_ = keyLocatorStruct.type;
-  keyData_ = Blob(keyLocatorStruct.keyData);
-  if (keyLocatorStruct.type == ndn_KeyLocatorType_KEYNAME) {
-    keyName_.set(keyLocatorStruct.keyName);
-    keyNameType_ = keyLocatorStruct.keyNameType;
-  }
-  else {
-    keyName_.clear();
-    keyNameType_ = (ndn_KeyNameType)-1;
-  }
-}
-
-}
-
diff --git a/src/publisher-public-key-digest.cpp b/src/publisher-public-key-digest.cpp
deleted file mode 100644
index a0667fa..0000000
--- a/src/publisher-public-key-digest.cpp
+++ /dev/null
@@ -1,27 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/**
- * Copyright (C) 2013 Regents of the University of California.
- * @author: Jeff Thompson <jefft0@remap.ucla.edu>
- * See COPYING for copyright and distribution information.
- */
-
-#include "c/publisher-public-key-digest.h"
-#include <ndn-cpp/publisher-public-key-digest.hpp>
-
-using namespace std;
-
-namespace ndn {
-
-void 
-PublisherPublicKeyDigest::get(struct ndn_PublisherPublicKeyDigest& publisherPublicKeyDigestStruct) const 
-{
-  publisherPublicKeyDigest_.get(publisherPublicKeyDigestStruct.publisherPublicKeyDigest);
-}
-
-void 
-PublisherPublicKeyDigest::set(const struct ndn_PublisherPublicKeyDigest& publisherPublicKeyDigestStruct) 
-{
-  publisherPublicKeyDigest_ = Blob(publisherPublicKeyDigestStruct.publisherPublicKeyDigest);
-}
-
-}
diff --git a/src/sha256-with-rsa-signature.cpp b/src/sha256-with-rsa-signature.cpp
deleted file mode 100644
index ccf0230..0000000
--- a/src/sha256-with-rsa-signature.cpp
+++ /dev/null
@@ -1,41 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/**
- * Copyright (C) 2013 Regents of the University of California.
- * @author: Jeff Thompson <jefft0@remap.ucla.edu>
- * See COPYING for copyright and distribution information.
- */
-
-#include "c/data.h"
-#include <ndn-cpp/sha256-with-rsa-signature.hpp>
-
-using namespace std;
-
-namespace ndn {
-
-ptr_lib::shared_ptr<Signature> 
-Sha256WithRsaSignature::clone() const
-{
-  return ptr_lib::shared_ptr<Signature>(new Sha256WithRsaSignature(*this));
-}
-
-void 
-Sha256WithRsaSignature::get(struct ndn_Signature& signatureStruct) const 
-{
-  digestAlgorithm_.get(signatureStruct.digestAlgorithm);
-  witness_.get(signatureStruct.witness);
-  signature_.get(signatureStruct.signature);  
-  publisherPublicKeyDigest_.get(signatureStruct.publisherPublicKeyDigest);
-  keyLocator_.get(signatureStruct.keyLocator);
-}
-
-void 
-Sha256WithRsaSignature::set(const struct ndn_Signature& signatureStruct)
-{
-  digestAlgorithm_ = Blob(signatureStruct.digestAlgorithm);
-  witness_ = Blob(signatureStruct.witness);
-  signature_ = Blob(signatureStruct.signature);
-  publisherPublicKeyDigest_.set(signatureStruct.publisherPublicKeyDigest);
-  keyLocator_.set(signatureStruct.keyLocator);
-}
-
-}