4 // Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
5 // Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
6 // Thorsten Horstmann <thorsten.horstmann@fokus.fraunhofer.de>
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 2 of the License, or
11 // (at your option) any later version.
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 // GNU General Public License for more details.
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the
20 // Free Software Foundation, Inc.,
21 // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24 \brief TLVPacket public header */
27 #define HH_TLVPacket_ 1
31 #include "../../Packets/PacketType.hh"
32 #include "../../Packets/ParseInt.hh"
33 #include "../../Packets/PacketParser.hh"
35 //#include "TLVPacket.mpp"
36 ///////////////////////////////hh.p////////////////////////////////////////
40 struct UnsuportedTLVPacketException : public std::exception
42 virtual char const * what() const throw() {
43 return "length of length can be max. 4 bytes. Sorry.";
47 struct Parse_TLVPacketLength
48 : public detail::packet::ParseIntOps<Parse_TLVPacketLength, boost::uint32_t>,
49 public PacketParserBase
53 SENF_PACKET_PARSER_NO_INIT(Parse_TLVPacketLength);
57 typedef boost::uint32_t value_type;
59 typedef Parse_Flag < 0 > Parse_extended_length_flag;
60 typedef Parse_UIntField < 1, 8 > Parse_fixed_length;
62 Parse_extended_length_flag extended_length_flag() const {
63 return parse<Parse_extended_length_flag>( 0 );
66 Parse_fixed_length fixed_length_field() const {
67 return parse<Parse_fixed_length>( 0 );
70 value_type value() const {
73 return fixed_length_field().value();
75 return parse<Parse_UInt8>( 1 ).value();
77 return parse<Parse_UInt16>( 1 ).value();
79 return parse<Parse_UInt24>( 1 ).value();
81 return parse<Parse_UInt32>( 1 ).value();
83 throw(UnsuportedTLVPacketException());
87 static const size_type init_bytes = 1;
89 size_type bytes() const {
90 if ( extended_length_flag() )
91 return 1 + fixed_length_field();
98 extended_length_flag() = 0;
103 /** \brief parse TLVPacket Packet
109 struct Parse_TLVPacket : public PacketParserBase
113 SENF_PACKET_PARSER_INIT(Parse_TLVPacket);
115 SENF_PACKET_PARSER_DEFINE_FIELDS(
116 ((Field)( type, Parse_UInt32 ))
117 ((Field)( length, Parse_TLVPacketLength ))
123 /** \brief TLV Packet
125 \par Packet type (typedef):
131 \ingroup protocolbundle_mpegdvb
134 : public PacketTypeBase
136 typedef ConcretePacket<TLVPacketType> packet;
137 typedef Parse_TLVPacket parser;
139 static optional_range nextPacketRange(packet p);
141 static void dump(packet p, std::ostream & os);
144 typedef TLVPacketType::packet TLVPacket;
149 ///////////////////////////////hh.e////////////////////////////////////////
150 //#include "TLVPacket.cci"
151 //#include "TLVPacket.ct"
152 //#include "TLVPacket.cti"
159 // c-file-style: "senf"
160 // indent-tabs-mode: nil
161 // ispell-local-dictionary: "american"
162 // compile-command: "scons -u test"
163 // comment-column: 40