-// $Id: SNDUPacket.hh 423 2007-08-31 22:05:37Z g0dil $
+// $Id$
//
// Copyright (C) 2007
// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
/** \file
- \brief SNDUPacket public header */
+ \brief TLVPacket public header */
#ifndef HH_TLVPacket_
#define HH_TLVPacket_ 1
// 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////////////////////////////////////////
namespace senf {
-
struct UnsuportedTLVPacketException : public std::exception
{
virtual char const * what() const throw() {
}
};
- struct Parse_TLVPacketLength
+ class Parse_TLVPacketLength
: public detail::packet::ParseIntOps<Parse_TLVPacketLength, boost::uint32_t>,
public PacketParserBase
{
-# ifndef DOXYGEN
+ 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);
- SENF_PACKET_PARSER_NO_INIT(Parse_TLVPacketLength);
+ 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;
- SENF_PACKET_PARSER_DEFINE_FIXED_FIELDS(
- ((OverlayField)( extended_length_flag, Parse_extended_length_flag ))
- ((Field )( fixed_length_field, Parse_fixed_length ))
- );
-
-# endif
-
- typedef boost::uint32_t value_type;
-
- 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());
- };
- }
-
- size_type bytes() const {
- if ( extended_length_flag() )
- return 1 + fixed_length_field();
- else
- return 1;
+ Parse_extended_length_flag extended_length_flag() const {
+ return parse<Parse_extended_length_flag>( 0 );
}
-
- void init() const {
- defaultInit();
- extended_length_flag() = 0;
+
+ Parse_fixed_length fixed_length_field() const {
+ return parse<Parse_fixed_length>( 0 );
}
+ void resize(size_type size);
};
/** \brief parse TLVPacket Packet
- XXX
+
\see TLVPacketType
*/
struct Parse_TLVPacket : public PacketParserBase
{
-# ifndef DOXYGEN
-
- SENF_PACKET_PARSER_INIT(Parse_TLVPacket);
-
- SENF_PACKET_PARSER_DEFINE_FIXED_FIELDS(
- ((Field)( type, Parse_UInt32 ))
- ((Field)( length, Parse_TLVPacketLength ))
- );
-
-# endif
+# include SENF_PARSER()
-// Parse_UInt32 type() const {
-// return parse<Parse_UInt32>( 0 );
-// }
+ SENF_PARSER_FIELD( type, Parse_UInt32 );
+ SENF_PARSER_FIELD( length, Parse_TLVPacketLength );
-// Parse_TLVPacketLength length() const {
-// return parse<Parse_TLVPacketLength>( 4 );
-// }
-
- PacketParserBase::size_type bytes() const;
-
- static const size_type init_bytes = 4+1; // 4 bytes type + 1 byte length
-
+ SENF_PARSER_FINALIZE(Parse_TLVPacket);
};
/** \brief TLV Packet
+ \image html TLV.png
\par Packet type (typedef):
\ref TLVPacket
\ingroup protocolbundle_mpegdvb
*/
struct TLVPacketType
- : public PacketTypeBase,
- public PacketTypeMixin<TLVPacketType>
+ : public PacketTypeBase
{
- typedef PacketTypeMixin<TLVPacketType> mixin;
typedef ConcretePacket<TLVPacketType> packet;
typedef Parse_TLVPacket parser;
- using mixin::nextPacketRange;
- using mixin::init;
-
-
+ 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);
-
- static PacketParserBase::size_type initSize();
- static PacketParserBase::size_type initHeadSize();
};
typedef TLVPacketType::packet TLVPacket;