Socket: BUGFIX: Explicitly copy image
[senf.git] / Packets / PacketParser.hh
index 6c40b2f..db7a32f 100644 (file)
 
     Every parser is derived from senf::PacketParserBase. This class provides the necessary
     housekeeping information and provides the parsers with access to the data.
+
+    \warning Parsers are like iterators: They are invalidated <em>whenever the size of the packet's
+    data is changed</em>. You should not store a parser anywhere. If you want to keep a parser
+    reference, use the senf::SafePacketParser wrapper. You still will need to take extra care to
+    ensure the parser is not invalidated.
  */
 
 #ifndef HH_PacketParser_
@@ -74,9 +79,7 @@
 #include <boost/optional.hpp>
 #include "Utils/SafeBool.hh"
 #include "PacketTypes.hh"
-#define HH_PacketData_DeclOnly
 #include "PacketData.hh"
-#undef HH_PacketData_DeclOnly
 
 #include "PacketParser.mpp"
 ///////////////////////////////hh.p////////////////////////////////////////
@@ -459,7 +462,7 @@ namespace senf {
         \code
            struct ExtendedParser : public BaseParser
            {
-               SENF_PACKET_PARSER_NO_INIT(ExtendedParser);
+               ExtendedParser(data_iterator i, state_type s) : BaseParser(i,s) {}
         
                SENF_PACKET_PARSER_DEFINE_FIELDS_OFFSET(senf::bytes(BaseParser(*this)),
                  ( ... fields ... ) );
@@ -499,7 +502,7 @@ namespace senf {
         \code
            struct ExtendedParser : public BaseParser
            {
-               SENF_PACKET_PARSER_NO_INIT(ExtendedParser);
+               ExtendedParser(data_iterator i, state_type s) : BaseParser(i,s) {}
 
                SENF_PACKET_PARSER_DEFINE_FIXED_FIELDS_OFFSET(BaseParser::fixed_bytes,
                  ( ... fields ... ) );
@@ -518,6 +521,8 @@ namespace senf {
 #   define SENF_PACKET_PARSER_DEFINE_FIXED_FIELDS_OFFSET(offset,fields)                           \
     SENF_PACKET_PARSER_I_DEFINE_FIXED_FIELDS(offset,fields)
 
+    /** \brief Default parser parsing nothing
+     */
     struct VoidPacketParser 
         : public PacketParserBase
     {
@@ -536,8 +541,10 @@ namespace senf {
             location will \e not be updated accordingly and therefore the parser will be
             invalid.
 
-        Additionally a SafePacketparser has an uninitialized state. The only allowed operations in
+        Additionally a SafePacketParser has an uninitialized state. The only allowed operations in
         this state are the boolean test for validity and assigning another parser.
+
+        \ingroup packetparser
       */
     template <class Parser>
     class SafePacketParser
@@ -582,6 +589,9 @@ namespace senf {
 }
 
 ///////////////////////////////hh.e////////////////////////////////////////
+#endif
+#if !defined(SENF_PACKETS_DECL_ONLY) && !defined(HH_PacketParser_i_)
+#define HH_PacketParser_i_
 #include "PacketParser.cci"
 #include "PacketParser.ct"
 #include "PacketParser.cti"
@@ -598,13 +608,3 @@ namespace senf {
 // comment-column: 40
 // End:
 
-//  LocalWords:  templated PacketParser defgroup packetparser PacketParsers li
-//  LocalWords:  EthernetParser ethertype UInt senf PacketParserBase tt
-//  LocalWords:  struct FooParser const init endcode ingroup param SomeParser
-//  LocalWords:  ethernet DefaultBundle EthernetPacket hh EthVLan UIntField CFI
-//  LocalWords:  VLanId OverlayField cfi vlanId accessor defaultInit bitfield
-//  LocalWords:  SomePacket SimpleVectorSizer packetparsermacros Fraunhofer std
-//  LocalWords:  hideinitializer Institut fuer offene Kommunikationssysteme STL
-//  LocalWords:  FOKUS Kompetenzzentrum Satelitenkommunikation SatCom Bund cerr
-//  LocalWords:  berlios dil Structors someField someVector someOtherField
-//  LocalWords:  TruncatedPacketException