// $Id$
//
// Copyright (C) 2007
-// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
-// Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
-// Thorsten Horstmann <thorsten.horstmann@fokus.fraunhofer.de>
+// Fraunhofer Institute for Open Communication Systems (FOKUS)
+// Competence Center NETwork research (NET), St. Augustin, GERMANY
+// Thorsten Horstmann <tho@berlios.de>
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
/** \file
\brief SNDUPacket public header */
-#ifndef HH_SNDUPacket_
-#define HH_SNDUPacket_ 1
+#ifndef HH_SENF_Packets_MPEGDVBBundle_SNDUPacket_
+#define HH_SENF_Packets_MPEGDVBBundle_SNDUPacket_ 1
// Custom includes
#include <algorithm>
#include <boost/crc.hpp>
-#include "Packets/PacketType.hh"
-#include "Packets/ParseInt.hh"
-#include "Packets/PacketRegistry.hh"
-#include "Packets/PacketParser.hh"
-#include "Packets/DefaultBundle/EthernetPacket.hh"
+#include "../../Packets/Packets.hh"
+#include "../DefaultBundle/EthernetPacket.hh"
//#include "SNDUPacket.mpp"
///////////////////////////////hh.p////////////////////////////////////////
\see SNDUPacketType
*/
- struct Parse_SNDUPacket : public PacketParserBase
+ struct SNDUPacketParser : public PacketParserBase
{
-# ifndef DOXYGEN
-
- SENF_PACKET_PARSER_NO_INIT(Parse_SNDUPacket);
+# include SENF_PARSER()
-# endif
-
- typedef Parse_Flag < 0 > Parse_daaf; // Destination Address Absent Field
- typedef Parse_UIntField < 1, 16 > Parse_length;
-
- Parse_daaf d_bit() const {
- return parse<Parse_daaf>( 0 );
- }
- Parse_length length() const {
- return parse<Parse_length>( 0 );
- }
- Parse_UInt16 type() const {
- return parse<Parse_UInt16>( 2 );
- }
- Parse_MAC destination() const {
- BOOST_ASSERT( ! d_bit() );
- return parse<Parse_MAC>( 4 );
- }
- Parse_UInt32 crc() const {
- return parse<Parse_UInt32>( data().size()-4 );
- }
+ /* We first define the fields as they appear in the field. Some of the fields are declared
+ private. We provide custom accessors for those fields further down. */
+
+ SENF_PARSER_PRIVATE_BITFIELD ( d_bit_ , 1 , unsigned );
+ SENF_PARSER_BITFIELD ( length , 15 , unsigned );
+ SENF_PARSER_FIELD ( type , UInt16Parser );
+ SENF_PARSER_PRIVATE_VARIANT ( destination_ , d_bit_ ,
+ (MACAddressParser) (VoidPacketParser) );
- void init() const {
- defaultInit();
- d_bit() = false;
- }
+ SENF_PARSER_FINALIZE( SNDUPacketParser );
- PacketParserBase::size_type bytes() const;
+ MACAddressParser destination() /// Only defined if d_bit() == \c false
+ { return destination_().get<0>(); }
+
+ bool d_bit() /// Destination absent bit
+ { return d_bit_(); }
+
+ void withDestination() /// Clear destination absent bit
+ { destination_().init<0>(); }
- static const size_type init_bytes = 2+2+4; // D-Bit + 15 bits length + 16 bits type field + 32 bits crc
+ void withoutDestination() /// Set destination absent bit
+ { destination_().init<1>(); }
+
+ UInt32Parser crc()
+ { return parse<UInt32Parser>( data().size() - 4 ); }
boost::uint32_t calcCrc() const;
};
\ref SNDUPacket
\par Fields:
- \ref Parse_SNDUPacket
+ \ref SNDUPacketParser
+ \image html SNDUPacket.png
\ingroup protocolbundle_mpegdvb
*/
{
// typedef PacketTypeMixin<SNDUPacketType, ULEExtHeaderType> mixin;
typedef ConcretePacket<SNDUPacketType> packet;
- typedef Parse_SNDUPacket parser;
+ typedef SNDUPacketParser parser;
// using mixin::nextPacketRange;
// using mixin::nextPacketType;
// using mixin::init;
-// static registry_key_t nextPacketKey(packet p);
+// static key_t nextPacketKey(packet p);
static void init(packet p);