X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2F80221Bundle%2FTLVPacket.hh;h=f2fdc36895a5ef62cb55b7bd73fc029838978668;hb=4891cce7dda76b60f270edfdba16b63d6756c4b0;hp=1180839dc4f0d05b5a50fb558f64066818790d41;hpb=9c3803e6f6a6073a43524940307b7dd7de8b16d9;p=senf.git diff --git a/Packets/80221Bundle/TLVPacket.hh b/Packets/80221Bundle/TLVPacket.hh index 1180839..f2fdc36 100644 --- a/Packets/80221Bundle/TLVPacket.hh +++ b/Packets/80221Bundle/TLVPacket.hh @@ -35,22 +35,12 @@ namespace senf { - /** \brief xxx - - \todo document me - \todo add usefull exceptions strings - - \ingroup protocolbundle_80221 - */ - struct UnsuportedTLVPacketException : public senf::Exception - { UnsuportedTLVPacketException() - : senf::Exception("length of length can be max. 4 bytes. Sorry."){} }; - - /** \brief xxx - \todo document me - - \ingroup protocolbundle_80221 - */ + + struct TLVLengthException : public senf::Exception + { TLVLengthException() + : senf::Exception("TLVLengthException"){} }; + + class DynamicTLVLengthParser : public detail::packet::IntParserOps, public PacketParserBase @@ -71,51 +61,46 @@ namespace senf { void init() const; # include SENF_PARSER() - SENF_PARSER_PRIVATE_BITFIELD ( extended_length_flag, 1, bool ); SENF_PARSER_PRIVATE_BITFIELD ( fixed_length_field, 7, unsigned ); - - private: -// typedef FlagParser < 0 > ExtendedLengthFlagParser; -// typedef UIntFieldParser < 1, 8 > FixedLengthParser; -// -// ExtendedLengthFlagParser extended_length_flag() const { -// return parse( 0 ); -// } -// -// FixedLengthParser fixed_length_field() const { -// return parse( 0 ); -// } - - void resize(size_type size, SafePacketParserWrapper &safeThis); + void resize(size_type size); + void shrink(); }; - /** \brief parse TLVPacket Packet - - \todo document me - - \see TLVPacketType - - \ingroup protocolbundle_80221 - */ - struct GenericTLVPacketParser : public PacketParserBase + + class BaseTLVPacketParser : public PacketParserBase { # include SENF_PARSER() + SENF_PARSER_FIELD ( type, UInt8Parser ); + SENF_PARSER_FIELD_RO ( length, DynamicTLVLengthParser ); + SENF_PARSER_FINALIZE ( BaseTLVPacketParser ); - SENF_PARSER_FIELD ( type, UInt8Parser ); - SENF_PARSER_FIELD_RO ( length, DynamicTLVLengthParser ); - SENF_PARSER_VECTOR ( value, bytes(length), UInt8Parser ); + void maxLengthValue(DynamicTLVLengthParser::value_type v) const; + void shrinkLength() { length_().shrink(); }; - SENF_PARSER_FINALIZE( GenericTLVPacketParser ); + protected: + size_type length_bytes() const { return length_().bytes(); }; + void length(DynamicTLVLengthParser::value_type &v) { length_() = v; }; }; - - /** \brief generic TLV Packet type + - \todo document me + struct GenericTLVPacketParser : public BaseTLVPacketParser + { +# include SENF_PARSER() + SENF_PARSER_INHERIT( BaseTLVPacketParser ) + SENF_PARSER_FINALIZE( GenericTLVPacketParser ); + + SENF_PARSER_INIT() { + maxLengthValue( DynamicTLVLengthParser::max_value); + } + + senf::PacketInterpreterBase::range value() const; - \ingroup protocolbundle_80221 - */ + template + void value(ForwardReadableRange const &range); + }; + struct GenericTLVPacketType : public PacketTypeBase, public PacketTypeMixin @@ -124,12 +109,11 @@ namespace senf { typedef ConcretePacket packet; typedef GenericTLVPacketParser parser; -// static optional_range nextPacketRange(packet p); using mixin::nextPacketRange; using mixin::init; using mixin::initSize; -// static void finalize(packet p); + static void finalize(packet p); static void dump(packet p, std::ostream & os); }; @@ -139,7 +123,7 @@ namespace senf { ///////////////////////////////hh.e//////////////////////////////////////// //#include "TLVPacket.cci" -//#include "TLVPacket.ct" +#include "TLVPacket.ct" //#include "TLVPacket.cti" #endif