added initfunction for genericOptionTypeParser with return parser and unittest for...
[senf.git] / senf / Packets / DefaultBundle / IPv6ExtOptionType.ct
index 6c5a841..d816433 100644 (file)
 // Free Software Foundation, Inc.,
 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
-//#include "IPv6ExtOptionType.hh"
+/** \file
+    \brief IPv6Extension-Options non-inline template implementation  */
+
+//#include "IPv6ExtOptionType.ih"
 
 // Custom includes
 
@@ -44,10 +47,48 @@ prefix_ void senf::GenericOptTypeTLVPacketParser::value(ForwardReadableRange con
         resize(optionLength()+2, rangeSize);
 
     std::copy(boost::next(boost::begin(range), 2), boost::next(boost::end(range)), si);
-    optionType() = *(boost::begin(range));
+    unsigned int val = *(boost::begin(range));
+    unsigned int mask = 192u;
+    altAction() = (val & mask) >> 6;
+    mask = 32u;
+    changeFlag() = (val & mask) >> 5;
+    mask = 31u;
+    optionType() = (val & mask);
     optionLength() = *(boost::next( boost::begin(range), 1));
 }
 
+template <class ForwardReadableRange>
+prefix_ void senf::GenericOptTypeTLVPacketParser::setPayload(ForwardReadableRange const &range)
+{
+    unsigned int rangeSize = boost::size(range);
+    if ( rangeSize != optionLength() )
+        resize( (optionLength() + 2), (rangeSize + 2) );
+    safe_data_iterator si( data(), boost::next( i(), 2) );
+    std::copy( boost::begin(range), boost::end(range), si);
+    optionLength() = rangeSize;
+}
+
+
+template <class Parser>
+prefix_ Parser& senf::GenericOptTypeTLVPacketParser::init()
+{
+    size_type oldSize ( bytes() );
+    safe_data_iterator j( data(), i() );
+    resize( oldSize, senf::init_bytes<Parser>::value);
+    std::advance(j, senf::init_bytes<Parser>::value);
+    std::fill(safe_data_iterator(data(), i()) , j, 0u);
+    Parser::optionType() = typeCode;
+    return *(this);
+}
+
+// template <class Parser>
+// prefix_ Parser& senf::GenericOptTypeTLVPacketParser::get()
+// {
+//     SENF_ASSERT (optionType() == typeCode);
+//     return *(this);
+// }
+
+
 ///////////////////////////////ct.e////////////////////////////////////////
 #undef prefix_