some more #include cleanups
[senf.git] / senf / Packets / 80221Bundle / TLVParser.hh
index 2df7440..f996881 100644 (file)
@@ -70,8 +70,8 @@ namespace senf {
         SENF_PARSER_PRIVATE_BITFIELD ( fixed_length_field,   6,  unsigned );
 
         void finalize();
-        void maxValue(value_type v);
-        value_type maxValue() const;
+        void capacity(value_type v);
+        value_type capacity() const;
         
     private:
         void resize_(size_type size);
@@ -96,10 +96,10 @@ namespace senf {
          };
          \endcode
          
-         You have to adjust the maximum length value with the \ref maxLengthValue function 
-         before the length value is set. The default maximum value is 127. So, in the above
+         You have to adjust the maximum length value with the \ref maxLength function 
+         before the length value is set. The default maximum value is 128. So, in the above
          example adding more than 21 MACAddresses to the vector will throw a TLVLengthException
-         if you don't call \c macAddressesTLVPacket->maxLengthValue( \e some_value) before.
+         if you don't call \c maxLength( \e some_value) before.
          
          \see MIHTLVLengthParser \n
            MIHGenericTLVParser \n
@@ -112,31 +112,25 @@ namespace senf {
         SENF_PARSER_FIELD_RO ( length, MIHTLVLengthParser );
         SENF_PARSER_FINALIZE ( MIHBaseTLVParser           );
         
-        /** \brief set maximum value of length field
-    
-            The size of the length field will be increased if necessary.
-            \param v maximum value of length field
-         */
-        void maxLengthValue(MIHTLVLengthParser::value_type v) const {
-            protect(), length_().maxValue(v);
-        }
-        
-        /** \brief shrink size of length field to minimum
+        /** \brief shrink size of the TLV length field to minimum
     
             The size of the length field will be decreased to minimum necessary to hold
             the current length value.
          */
-        void finalizeLength() { 
-            protect(), length_().finalize();
-        };
+        void finalize();
     
         typedef GenericTLVParserRegistry<MIHBaseTLVParser> Registry;
         
     protected:
-        /// resize the packet after the length field to given size
-        senf::safe_data_iterator resizeValueField(MIHTLVLengthParser::value_type size);
+        /** \brief set maximum value of TLV length field
+    
+            The size of the length field will be increased if necessary.
+            \param v maximum value of length field
+         */
+        void maxLength(MIHTLVLengthParser::value_type maxl) const;
     };
 
+    
         
     /** \brief Parser for a generic TLV packet
      */
@@ -148,30 +142,56 @@ namespace senf {
 
         void init() const {
             defaultInit();
-            maxLengthValue( MIHTLVLengthParser::max_value);
+            maxLength( MIHTLVLengthParser::max_value);
         }
         
         using base::init;
+        using base::maxLength;
+    };
+        
+        
+    /** \brief Base class for list TLV parser
+     */ 
+    struct MIHBaseListTLVParser 
+        : public MIHBaseTLVParser
+    {
+    #   include SENF_PARSER()
+        SENF_PARSER_INHERIT  ( MIHBaseTLVParser );
+        SENF_PARSER_FIELD_RO ( listSize, MIHTLVLengthParser );
+        SENF_PARSER_FINALIZE ( MIHBaseListTLVParser );
+
+        void maxListSize(MIHTLVLengthParser::value_type maxl) const;
+    };
+
+    template <class Self>
+    struct MIHListTLVParserMixin
+    {
+        void finalize();            
     };
         
     /** \brief Parse a MIHF_ID
 
-         the maximum length of a MIHF_ID is 253 octets (see F.3.11 in 802.21)
-         we could set maxLengthValue in init(), but for the most MIHF_IDs the default
-         maximum length of 127 should be enough.
+         Note that the maximum length of a MIHF_ID is 253 octets (see F.3.11 in 802.21)
+         We could set maxLength in init(), but for the most MIHF_IDs the default
+         maximum length of 128 should be enough.
          
-         \note you must call mihfIdPacket.maxLengthValue( 253) *before*
-         setting longer MIHF_IDs values.
+         \note you must call maxIdLength( 253) *before* setting MIHF_IDs values longer
+             than 128.
+                  
+         \see MIHFId
     */
     class MIHFIdTLVParser : public MIHBaseTLVParser
     {
     #   include SENF_PARSER()
         SENF_PARSER_INHERIT  ( MIHBaseTLVParser );
-        SENF_PARSER_SKIP     ( length(), 0      );
+        SENF_PARSER_FIELD_RO ( idLength, MIHTLVLengthParser );
+        SENF_PARSER_LABEL    ( idValue          );
+        SENF_PARSER_SKIP     ( idLength(), 0    );
         SENF_PARSER_FINALIZE ( MIHFIdTLVParser  );
         
     public:
-        ///\name value setters
+        ///\name Value setters
         ///@{
         void value( MIHFId const & id);
         
@@ -182,7 +202,7 @@ namespace senf {
         void value( senf::EUI64        const & addr);    
         ///@}
 
-        ///\name value getters
+        ///\name Value getters
         ///@{
         MIHFId valueAs( MIHFId::Type type) const;
         
@@ -193,7 +213,7 @@ namespace senf {
         senf::EUI64        valueAsEUI64()        const;
         ///@}
         
-        ///\name value comparisons
+        ///\name Value comparisons
         ///@{
         bool valueEquals( MIHFId const & id) const;
         
@@ -205,8 +225,16 @@ namespace senf {
         ///@}
         
         void dump(std::ostream & os) const;
+        void maxIdLength(boost::uint8_t maxl) const;
+        void finalize();
 
     private:
+        /// resize the packet after the length field to given size
+        senf::safe_data_iterator resizeValueField(MIHTLVLengthParser::value_type size);
+        
+        data_iterator valueBegin() const;
+        data_iterator valueEnd() const;
+
         template <class OutputIterator>
         struct binaryNAIEncoder {
             binaryNAIEncoder(OutputIterator & i);
@@ -244,7 +272,7 @@ namespace senf {
             MIHFIdTLVParser const & parser;
             ValueEqualsVisitor( MIHFIdTLVParser const & p) : parser(p) {}
             bool operator()( boost::blank ) const {
-                return parser.length() == 0;
+                return parser.idLength() == 0;
             }
             template <typename MIHFIdType>
             bool operator()( MIHFIdType const & id ) const {
@@ -253,6 +281,8 @@ namespace senf {
         };
     };
 
+    /** \brief Parser for 802.21 source MIHF_ID TLV
+     */
     struct MIHFSrcIdTLVParser : public MIHFIdTLVParser
     {
         MIHFSrcIdTLVParser(data_iterator i, state_type s) : MIHFIdTLVParser(i,s) {}
@@ -265,6 +295,8 @@ namespace senf {
         void dump(std::ostream & os) const;
     };
     
+    /** \brief Parser for 802.21 destination MIHF_ID TLV
+     */
     struct MIHFDstIdTLVParser : public MIHFIdTLVParser
     {
         MIHFDstIdTLVParser(data_iterator i, state_type s) : MIHFIdTLVParser(i,s) {}
@@ -337,7 +369,7 @@ namespace senf {
 
 ///////////////////////////////hh.e////////////////////////////////////////
 #include "TLVParser.cci"
-//#include "TLVParser.ct"
+#include "TLVParser.ct"
 #include "TLVParser.cti"
 #endif