/**
 * @author: Jeff Thompson
 * See COPYING for copyright and distribution information.
 */

#ifndef NDN_BINARYXMLENCODER_HPP
#define	NDN_BINARYXMLENCODER_HPP

#include <cstdlib>
#include <vector>
#include "../c/encoding/BinaryXMLEncoder.h"

namespace ndn {
  
/**
 * A BinaryXMLEncoder extends a C ndn_BinaryXMLEncoder struct and wraps related functions.
 */
class BinaryXMLEncoder : public ndn_BinaryXMLEncoder {
public:
  /**
   * Initialize the base ndn_BinaryXMLEncoder struct with an initial array of 16 bytes.  Use simpleRealloc.
   */
  BinaryXMLEncoder() 
  {
    const unsigned int initialLength = 16;
    ndn_BinaryXMLEncoder_init(this, (unsigned char *)malloc(initialLength), initialLength, simpleRealloc);
  }
  
  /**
   * Wrap the C stdlib realloc to convert to/from void * to unsigned char *.
   * @param array the allocated array buffer to realloc
   * @param length the length for the new array buffer
   * @return the new allocated array buffer
   */
  static unsigned char *simpleRealloc(unsigned char *array, unsigned int length)
  {
    return (unsigned char *)realloc(array, length);
  }
  
  /**
   * Copy the encoded bytes to the end of the buffer.
   * @param buffer a vector to receive the copy
   */
  void appendTo(std::vector<unsigned char> &buffer) 
  {
    buffer.insert(buffer.end(), output.array, output.array + offset);
  }
};

}

#endif
