// Custom includes
#include <algorithm>
-#include "../../Packets/PacketType.hh"
-#include "../../Packets/ParseInt.hh"
-#include "../../Packets/PacketParser.hh"
+#include "../../Packets/Packets.hh"
//#include "TLVPacket.mpp"
///////////////////////////////hh.p////////////////////////////////////////
}
};
- struct Parse_TLVPacketLength
+ class Parse_TLVPacketLength
: public detail::packet::ParseIntOps<Parse_TLVPacketLength, boost::uint32_t>,
public PacketParserBase
{
-# ifndef DOXYGEN
-
- SENF_PACKET_PARSER_NO_INIT(Parse_TLVPacketLength);
-
-# endif
+ public:
+ Parse_TLVPacketLength(data_iterator i, state_type s) : PacketParserBase(i,s) {}
typedef boost::uint32_t value_type;
+
+ value_type value() const;
+
+ void value(value_type const & v);
+ Parse_TLVPacketLength const & operator= (value_type other);
+
+ static const size_type init_bytes = 1;
+
+ size_type bytes() const;
+
+ void init() const;
+
+ private:
typedef Parse_Flag < 0 > Parse_extended_length_flag;
typedef Parse_UIntField < 1, 8 > Parse_fixed_length;
return parse<Parse_fixed_length>( 0 );
}
- value_type value() const {
- switch( bytes() ) {
- case 1:
- return fixed_length_field().value();
- case 2:
- return parse<Parse_UInt8>( 1 ).value();
- case 3:
- return parse<Parse_UInt16>( 1 ).value();
- case 4:
- return parse<Parse_UInt24>( 1 ).value();
- case 5:
- return parse<Parse_UInt32>( 1 ).value();
- default:
- throw(UnsuportedTLVPacketException());
- };
- }
-
- static const size_type init_bytes = 1;
-
- size_type bytes() const {
- if ( extended_length_flag() )
- return 1 + fixed_length_field();
- else
- return 1;
- }
-
- void init() const {
- defaultInit();
- extended_length_flag() = 0;
- }
-
+ void resize(size_type size);
};
/** \brief parse TLVPacket Packet
- XXX
+
\see TLVPacketType
*/
struct Parse_TLVPacket : public PacketParserBase
{
-# ifndef DOXYGEN
+# include SENF_PARSER()
- SENF_PACKET_PARSER_INIT(Parse_TLVPacket);
+ SENF_PARSER_FIELD( type, Parse_UInt32 );
+ SENF_PARSER_FIELD( length, Parse_TLVPacketLength );
- SENF_PACKET_PARSER_DEFINE_FIELDS(
- ((Field)( type, Parse_UInt32 ))
- ((Field)( length, Parse_TLVPacketLength ))
- );
-
-# endif
+ SENF_PARSER_FINALIZE(Parse_TLVPacket);
};
/** \brief TLV Packet
+ \image html TLV.png
\par Packet type (typedef):
\ref TLVPacket
typedef Parse_TLVPacket parser;
static optional_range nextPacketRange(packet p);
-
+ static void init(packet p);
+ static size_type initSize();
+ static void finalize(packet p);
static void dump(packet p, std::ostream & os);
};