123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319 |
- #ifndef OPAQUE_DATA_TUPLE_H
- #define OPAQUE_DATA_TUPLE_H
- #include <util/buffer.h>
- #include <util/io_utilities.h>
- #include <iostream>
- #include <iterator>
- #include <string>
- #include <vector>
- namespace isc {
- namespace dhcp {
- class OpaqueDataTupleError : public Exception {
- public:
- OpaqueDataTupleError(const char* file, size_t line, const char* what) :
- isc::Exception(file, line, what) { };
- };
- class OpaqueDataTuple {
- public:
-
-
-
-
-
-
-
- enum LengthFieldType {
- LENGTH_1_BYTE,
- LENGTH_2_BYTES
- };
-
- typedef std::vector<uint8_t> Buffer;
-
-
-
-
- OpaqueDataTuple(LengthFieldType length_field_type);
-
-
-
-
-
-
-
-
-
-
-
-
- template<typename InputIterator>
- OpaqueDataTuple(LengthFieldType length_field_type, InputIterator begin,
- InputIterator end)
- : length_field_type_(length_field_type) {
- unpack(begin, end);
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
- template<typename InputIterator>
- void append(InputIterator data, const size_t len) {
- data_.insert(data_.end(), data, data + len);
- }
-
-
-
-
-
-
- void append(const std::string& text);
-
-
-
-
-
-
-
-
-
-
-
-
- template<typename InputIterator>
- void assign(InputIterator data, const size_t len) {
- data_.assign(data, data + len);
- }
-
-
-
-
-
-
- void assign(const std::string& text);
-
- void clear();
-
-
-
- bool equals(const std::string& other) const;
-
- LengthFieldType getLengthFieldType() const {
- return (length_field_type_);
- }
-
- size_t getLength() const {
- return (data_.size());
- }
-
- size_t getTotalLength() const {
- return (getDataFieldSize() + getLength());
- }
-
-
-
-
-
- const Buffer& getData() const {
- return (data_);
- }
-
- std::string getText() const;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- void pack(isc::util::OutputBuffer& buf) const;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- template<typename InputIterator>
- void unpack(InputIterator begin, InputIterator end) {
- Buffer buf(begin, end);
-
- if (std::distance(begin, end) < getDataFieldSize()) {
- isc_throw(OpaqueDataTupleError,
- "unable to parse the opaque data tuple, the buffer"
- " length is " << std::distance(begin, end)
- << ", expected at least " << getDataFieldSize());
- }
-
-
- size_t len = getDataFieldSize() == 1 ? *begin :
- isc::util::readUint16(&(*begin), std::distance(begin, end));
-
-
- begin += getDataFieldSize();
- if (std::distance(begin, end) < len) {
- isc_throw(OpaqueDataTupleError,
- "unable to parse the opaque data tuple, the buffer"
- " length is " << std::distance(begin, end)
- << ", but the length of the tuple in the length field"
- " is " << len);
- }
-
- assign(begin, len);
- }
-
-
-
-
-
-
-
-
- OpaqueDataTuple& operator=(const std::string& other);
-
-
-
-
-
-
-
- bool operator==(const std::string& other) const;
-
-
-
-
-
-
-
-
- bool operator!=(const std::string& other);
-
-
-
-
- int getDataFieldSize() const;
- private:
-
- Buffer data_;
-
- LengthFieldType length_field_type_;
- };
- typedef boost::shared_ptr<OpaqueDataTuple> OpaqueDataTuplePtr;
- std::ostream& operator<<(std::ostream& os, const OpaqueDataTuple& tuple);
- std::istream& operator>>(std::istream& is, OpaqueDataTuple& tuple);
- }
- }
- #endif
|