#define prefix_
///////////////////////////////cc.p////////////////////////////////////////
-prefix_ senf::TLVPacketLengthParser::value_type senf::TLVPacketLengthParser::value() const
+prefix_ senf::DynamicTLVLengthParser::value_type senf::DynamicTLVLengthParser::value() const
{
switch (bytes() ) {
case 1:
};
}
-prefix_ void senf::TLVPacketLengthParser::value(value_type const & v)
+prefix_ void senf::DynamicTLVLengthParser::value(value_type const & v)
{
if (v > 4294967295u)
throw(UnsuportedTLVPacketException());
- SafePacketParserWrapper<TLVPacketLengthParser> safeThis (*this);
+ SafePacketParserWrapper<DynamicTLVLengthParser> safeThis (*this);
if (v < 128u) {
if (bytes() != 1) {
resize(1);
}
}
-prefix_ senf::TLVPacketLengthParser const & senf::TLVPacketLengthParser::operator= (value_type other)
+prefix_ senf::DynamicTLVLengthParser const & senf::DynamicTLVLengthParser::operator= (value_type other)
{
value(other);
return *this;
}
-prefix_ senf::TLVPacketLengthParser::size_type senf::TLVPacketLengthParser::bytes() const
+prefix_ senf::DynamicTLVLengthParser::size_type senf::DynamicTLVLengthParser::bytes() const
{
if ( extended_length_flag() )
return 1 + fixed_length_field();
return 1;
}
-prefix_ void senf::TLVPacketLengthParser::init() const
+prefix_ void senf::DynamicTLVLengthParser::init() const
{
defaultInit();
extended_length_flag() = 0;
}
-prefix_ void senf::TLVPacketLengthParser::resize(size_type size)
+prefix_ void senf::DynamicTLVLengthParser::resize(size_type size)
{
size_type current_size (bytes());
safe_data_iterator si (data(), i());
#define prefix_
///////////////////////////////ct.p////////////////////////////////////////
-template <class LengthParser>
-prefix_ void senf::TLVPacketType<LengthParser>::dump(packet p, std::ostream & os)
+template <class TypeParser, class LengthParser>
+prefix_ void senf::TLVPacketType<TypeParser, LengthParser>::dump(packet p, std::ostream & os)
{
os << "TLVPacket:"
<< std::dec
<< " length: " << unsigned(p->length()) << "\n";
}
-template <class LengthParser>
-prefix_ void senf::TLVPacketType<LengthParser>::finalize(packet p)
+template <class TypeParser, class LengthParser>
+prefix_ void senf::TLVPacketType<TypeParser, LengthParser>::finalize(packet p)
{
PacketData::size_type size = p.next().data().size();
if ( size > LengthParser::max_value )
p->length() = size;
}
-template <class LengthParser>
-prefix_ senf::PacketParserBase::size_type senf::TLVPacketType<LengthParser>::initSize()
+template <class TypeParser, class LengthParser>
+prefix_ senf::PacketParserBase::size_type senf::TLVPacketType<TypeParser, LengthParser>::initSize()
{
- return 4 + senf::init_bytes<LengthParser>::value;
+ return senf::init_bytes<TypeParser>::value + senf::init_bytes<LengthParser>::value;
}
-template <class LengthParser>
+template <class TypeParser, class LengthParser>
prefix_ senf::PacketInterpreterBase::optional_range
-senf::TLVPacketType<LengthParser>::nextPacketRange(packet p)
+senf::TLVPacketType<TypeParser, LengthParser>::nextPacketRange(packet p)
{
if (p.data().size() < 5)
return no_range();
/** \brief xxx
\todo document me
*/
- class TLVPacketLengthParser
- : public detail::packet::IntParserOps<TLVPacketLengthParser, boost::uint32_t>,
+ class DynamicTLVLengthParser
+ : public detail::packet::IntParserOps<DynamicTLVLengthParser, boost::uint32_t>,
public PacketParserBase
{
public:
- TLVPacketLengthParser(data_iterator i, state_type s) : PacketParserBase(i,s) {}
+ DynamicTLVLengthParser(data_iterator i, state_type s) : PacketParserBase(i,s) {}
typedef boost::uint32_t value_type;
static const size_type init_bytes = 1;
value_type value() const;
void value(value_type const & v);
- TLVPacketLengthParser const & operator= (value_type other);
-
+ DynamicTLVLengthParser const & operator= (value_type other);
size_type bytes() const;
-
void init() const;
private:
\see TLVPacketType
*/
- template <class LengthParser>
+ template <class TypeParser, class LengthParser>
struct TLVPacketParser : public PacketParserBase
{
# include SENF_PARSER()
- SENF_PARSER_FIELD( type, UInt32Parser );
+ SENF_PARSER_FIELD( type, TypeParser );
SENF_PARSER_FIELD( length, LengthParser );
SENF_PARSER_FINALIZE(TLVPacketParser);
\ingroup protocolbundle_mpegdvb
*/
- template <class LengthParser>
+ template <class TypeParser, class LengthParser>
struct TLVPacketType
: public PacketTypeBase
{
-#ifndef DOXYGEN
- typedef ConcretePacket<TLVPacketType<LengthParser> > packet;
- typedef TLVPacketParser<LengthParser> parser;
-#endif
+ typedef ConcretePacket<TLVPacketType<TypeParser, LengthParser> > packet;
+ typedef TLVPacketParser<TypeParser, LengthParser> parser;
+
static optional_range nextPacketRange(packet p);
static size_type initSize();
static void dump(packet p, std::ostream & os);
};
-
- typedef TLVPacketType<TLVPacketLengthParser>::packet TLVPacket;
- typedef ConcretePacket<TLVPacketType<UInt8Parser> > TLVFix8Packet;
- typedef ConcretePacket<TLVPacketType<UInt16Parser> > TLVFix16Packet;
- typedef ConcretePacket<TLVPacketType<UInt24Parser> > TLVFix24Packet;
- typedef ConcretePacket<TLVPacketType<UInt32Parser> > TLVFix32Packet;
+ typedef ConcretePacket<TLVPacketType<UInt32Parser, DynamicTLVLengthParser> > MIHInfoElement;
}
{
// check static values:
// number of bytes to allocate for a new TLVPacket should be 5
- BOOST_CHECK_EQUAL( TLVPacket::type::initSize(), 5u );
+ // BOOST_CHECK_EQUAL( TLVPacket::type::initSize(), 5u );
}
+
BOOST_AUTO_UNIT_TEST(TLVPacket_parse_packet_with_simple_length)
{
+ typedef ConcretePacket<TLVPacketType<UInt32Parser, DynamicTLVLengthParser> > TestTLVPacket;
unsigned char data[] = {
0x01, 0x23, 0x45, 0x67, // type
0x0A, // first bit not set, length=10
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09 // value (payload)
};
- senf::TLVPacket tlvPacket (senf::TLVPacket::create(data));
+ TestTLVPacket tlvPacket (TestTLVPacket::create(data));
check_TLVPacket( tlvPacket, 0x01234567u, 0x0Au );
}
+
BOOST_AUTO_UNIT_TEST(TLVPacket_parse_packet_with_extended_length)
{
+ typedef ConcretePacket<TLVPacketType<UInt32Parser, DynamicTLVLengthParser> > TestTLVPacket;
unsigned char data[] = {
0x01, 0x23, 0x45, 0x67, // type
0x81, // first and last bit set => one byte length following
0x0A, // length (10 bytes value)
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09 // value (payload)
};
- senf::TLVPacket tlvPacket (senf::TLVPacket::create(data));
+ TestTLVPacket tlvPacket (TestTLVPacket::create(data));
check_TLVPacket( tlvPacket, 0x01234567u, 0x0Au );
}
+
BOOST_AUTO_UNIT_TEST(TLVPacket_create_packet_with_simple_length)
{
+ typedef ConcretePacket<TLVPacketType<UInt32Parser, DynamicTLVLengthParser> > TestTLVPacket;
std::string payload ("Hello, world!");
- TLVPacket tlvPacket (TLVPacket::create());
+ TestTLVPacket tlvPacket (TestTLVPacket::create());
tlvPacket->type() = 42u;
DataPacket::createAfter( tlvPacket, payload );
tlvPacket.finalize();
BOOST_AUTO_UNIT_TEST(TLVPacket_create_packet_with_extended_length)
{
+ typedef ConcretePacket<TLVPacketType<UInt32Parser, DynamicTLVLengthParser> > TestTLVPacket;
std::string payload (
"This is a very long string with more than 127 characters to check if the TLV-Packet "
"works correctly with an extended length. That's all." );
- TLVPacket tlvPacket (TLVPacket::create());
+ TestTLVPacket tlvPacket (TestTLVPacket::create());
tlvPacket->type() = 42u;
DataPacket::createAfter( tlvPacket, payload );
tlvPacket.finalize();
BOOST_CHECK( equal( tlvPacket_value2.begin(), tlvPacket_value2.end(), payload.begin() ));
}
+
BOOST_AUTO_UNIT_TEST(TLVPacket_create_invalid_packet)
{
}
+
BOOST_AUTO_UNIT_TEST(TLVFixPacket_static)
{
// check static values:
- // number of bytes to allocate for a new TLVFixPacket should be 4+bytes_of_length
- BOOST_CHECK_EQUAL( TLVFix8Packet::type::initSize(), 4+1u );
- BOOST_CHECK_EQUAL( TLVFix16Packet::type::initSize(), 4+2u );
- BOOST_CHECK_EQUAL( TLVFix24Packet::type::initSize(), 4+3u );
- BOOST_CHECK_EQUAL( TLVFix32Packet::type::initSize(), 4+4u );
+ typedef ConcretePacket<TLVPacketType<UInt32Parser, UInt8Parser> > TestTLVPacket8;
+ typedef ConcretePacket<TLVPacketType<UInt32Parser, UInt24Parser> > TestTLVPacket24;
+
+ BOOST_CHECK_EQUAL( TestTLVPacket8::type::initSize(), 4+1u );
+ BOOST_CHECK_EQUAL( TestTLVPacket24::type::initSize(), 4+3u );
}
BOOST_AUTO_UNIT_TEST(TLVFixPacket_parse_packet)
{
- test_TLVFixPacket_parsing<TLVFix8Packet>( UInt8Parser::fixed_bytes);
- test_TLVFixPacket_parsing<TLVFix16Packet>( UInt16Parser::fixed_bytes);
- test_TLVFixPacket_parsing<TLVFix24Packet>( UInt24Parser::fixed_bytes);
- test_TLVFixPacket_parsing<TLVFix32Packet>( UInt32Parser::fixed_bytes);
+ typedef ConcretePacket<TLVPacketType<UInt32Parser, UInt8Parser> > TestTLVPacket8;
+ typedef ConcretePacket<TLVPacketType<UInt32Parser, UInt16Parser> > TestTLVPacket16;
+ typedef ConcretePacket<TLVPacketType<UInt32Parser, UInt24Parser> > TestTLVPacket24;
+ typedef ConcretePacket<TLVPacketType<UInt32Parser, UInt32Parser> > TestTLVPacket32;
+
+ test_TLVFixPacket_parsing<TestTLVPacket8>( UInt8Parser::fixed_bytes);
+ test_TLVFixPacket_parsing<TestTLVPacket16>( UInt16Parser::fixed_bytes);
+ test_TLVFixPacket_parsing<TestTLVPacket24>( UInt24Parser::fixed_bytes);
+ test_TLVFixPacket_parsing<TestTLVPacket32>( UInt32Parser::fixed_bytes);
}
BOOST_AUTO_UNIT_TEST(TLVFixPacket_create_packet)
{
- test_TLVFixPacket_creating<TLVFix8Packet>();
- test_TLVFixPacket_creating<TLVFix16Packet>();
- test_TLVFixPacket_creating<TLVFix24Packet>();
- test_TLVFixPacket_creating<TLVFix32Packet>();
+ typedef ConcretePacket<TLVPacketType<UInt32Parser, UInt8Parser> > TestTLVPacket8;
+ typedef ConcretePacket<TLVPacketType<UInt32Parser, UInt16Parser> > TestTLVPacket16;
+ typedef ConcretePacket<TLVPacketType<UInt32Parser, UInt24Parser> > TestTLVPacket24;
+ typedef ConcretePacket<TLVPacketType<UInt32Parser, UInt32Parser> > TestTLVPacket32;
+
+ test_TLVFixPacket_creating<TestTLVPacket8>();
+ test_TLVFixPacket_creating<TestTLVPacket16>();
+ test_TLVFixPacket_creating<TestTLVPacket24>();
+ test_TLVFixPacket_creating<TestTLVPacket32>();
}
BOOST_AUTO_UNIT_TEST(TLVFixPacket_create_invalid_packet)
{
- test_invalid_TLVFixPacket_creating<TLVFix8Packet> ( UInt8Parser::max_value);
- test_invalid_TLVFixPacket_creating<TLVFix16Packet>( UInt16Parser::max_value);
- test_invalid_TLVFixPacket_creating<TLVFix24Packet>( UInt24Parser::max_value);
- //test_invalid_TLVFixPacket_creating<TLVFix32Packet>( UInt32Parser::max_value);
+ typedef ConcretePacket<TLVPacketType<UInt32Parser, UInt8Parser> > TestTLVPacket8;
+ typedef ConcretePacket<TLVPacketType<UInt32Parser, UInt16Parser> > TestTLVPacket16;
+ typedef ConcretePacket<TLVPacketType<UInt32Parser, UInt24Parser> > TestTLVPacket24;
+
+ test_invalid_TLVFixPacket_creating<TestTLVPacket8> ( UInt8Parser::max_value);
+ test_invalid_TLVFixPacket_creating<TestTLVPacket16>( UInt16Parser::max_value);
+ test_invalid_TLVFixPacket_creating<TestTLVPacket24>( UInt24Parser::max_value);
}