namespace senf {
- /** \brief xxx
-
- \todo document me
- \todo add usefull exceptions strings
-
- */
- struct UnsuportedTLVPacketException : public senf::Exception
- { UnsuportedTLVPacketException()
- : senf::Exception("length of length can be max. 4 bytes. Sorry."){} };
-
- /** \brief xxx
- \todo document me
- */
+
+ struct TLVLengthException : public senf::Exception
+ { TLVLengthException()
+ : senf::Exception("TLVLengthException"){} };
+
+
class DynamicTLVLengthParser
: public detail::packet::IntParserOps<DynamicTLVLengthParser, boost::uint32_t>,
public PacketParserBase
size_type bytes() const;
void init() const;
- private:
- typedef FlagParser < 0 > ExtendedLengthFlagParser;
- typedef UIntFieldParser < 1, 8 > FixedLengthParser;
-
- ExtendedLengthFlagParser extended_length_flag() const {
- return parse<ExtendedLengthFlagParser>( 0 );
- }
+# include SENF_PARSER()
+ SENF_PARSER_PRIVATE_BITFIELD ( extended_length_flag, 1, bool );
+ SENF_PARSER_PRIVATE_BITFIELD ( fixed_length_field, 7, unsigned );
- FixedLengthParser fixed_length_field() const {
- return parse<FixedLengthParser>( 0 );
- }
-
+ void shrink();
+ void maxValue(DynamicTLVLengthParser::value_type v);
+ private:
void resize(size_type size);
};
- /** \brief parse TLVPacket Packet
-
- \todo document me
-
- \see TLVPacketType
- */
- template <class TypeParser, class LengthParser>
- struct TLVPacketParser : 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, TypeParser );
- SENF_PARSER_FIELD( length, LengthParser );
+ void maxLengthValue(DynamicTLVLengthParser::value_type v) const {
+ length_().maxValue(v);
+ }
+ void shrinkLength() {
+ length_().shrink();
+ };
- SENF_PARSER_FINALIZE(TLVPacketParser);
+ 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 );
- \ingroup protocolbundle_mpegdvb
- */
- template <class TypeParser, class LengthParser>
- struct TLVPacketType
- : public PacketTypeBase
+ SENF_PARSER_INIT() {
+ maxLengthValue( DynamicTLVLengthParser::max_value);
+ }
+
+ senf::PacketInterpreterBase::range value() const;
+
+ template <class ForwardReadableRange>
+ void value(ForwardReadableRange const &range);
+ };
+
+ struct GenericTLVPacketType
+ : public PacketTypeBase,
+ public PacketTypeMixin<GenericTLVPacketType>
{
- typedef ConcretePacket<TLVPacketType<TypeParser, LengthParser> > packet;
- typedef TLVPacketParser<TypeParser, LengthParser> parser;
+ typedef PacketTypeMixin<GenericTLVPacketType> mixin;
+ typedef ConcretePacket<GenericTLVPacketType> packet;
+ typedef GenericTLVPacketParser parser;
- static optional_range nextPacketRange(packet p);
- static size_type initSize();
+ using mixin::nextPacketRange;
+ using mixin::init;
+ using mixin::initSize;
static void finalize(packet p);
-
static void dump(packet p, std::ostream & os);
};
- typedef ConcretePacket<TLVPacketType<UInt32Parser, DynamicTLVLengthParser> > MIHInfoElement;
+ typedef ConcretePacket<GenericTLVPacketType> GenericTLVPacket;
}