X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2F80221Bundle%2FTLVPacket.cc;h=12d9bfdb4d00a4007bdfedd071f54f2c70bf5962;hb=c45c112ae88196ea8da9c5a9efb0e167196744d2;hp=177a2e1ca051b3e9af62d6b2c9c3d64cb7cab2bf;hpb=bd67664cb4ea1b36c9bb52a622e02341e4f0131f;p=senf.git diff --git a/Packets/80221Bundle/TLVPacket.cc b/Packets/80221Bundle/TLVPacket.cc index 177a2e1..12d9bfd 100644 --- a/Packets/80221Bundle/TLVPacket.cc +++ b/Packets/80221Bundle/TLVPacket.cc @@ -28,11 +28,26 @@ // Custom includes #include -#include +#include "../../Utils/hexdump.hh" #define prefix_ ///////////////////////////////cc.p//////////////////////////////////////// +prefix_ senf::safe_data_iterator senf::BaseTLVPacketParser::resizeValue( + DynamicTLVLengthParser::value_type size) +{ + DynamicTLVLengthParser::value_type current_length ( length()); + length( size); + + safe_data_iterator si (data(), boost::next(i(), 1 + length_bytes() )); + if (current_length > size) + data().erase( si, boost::next(si, current_length-size)); + else + data().insert( si, size-current_length, 0); + return si; +} + + prefix_ senf::DynamicTLVLengthParser::value_type senf::DynamicTLVLengthParser::value() const { switch (bytes() ) { @@ -127,34 +142,24 @@ prefix_ void senf::DynamicTLVLengthParser::shrink() } -prefix_ void senf::BaseTLVPacketParser:: maxLengthValue(DynamicTLVLengthParser::value_type v) - const +prefix_ void senf::DynamicTLVLengthParser:: maxValue(DynamicTLVLengthParser::value_type v) { if (v <= 127) return; - size_type b = senf::bytes( length_()); + size_type b = bytes(); if (v <= UInt8Parser::max_value) { - if (b < 2) length_().resize(2); + if (b < 2) resize(2); return; } if (v <= UInt16Parser::max_value) { - if (b < 3) length_().resize(3); + if (b < 3) resize(3); return; } if (v <= UInt24Parser::max_value) { - if (b < 4) length_().resize(4); + if (b < 4) resize(4); return; } - if (b < 5) length_().resize(5); -} - - -prefix_ senf::PacketInterpreterBase::range senf::GenericTLVPacketParser::value() - const -{ - senf::PacketData::iterator begin (boost::next(data().begin(), 1 + length_bytes() )); - return PacketInterpreterBase::range( - begin, boost::next( begin, length()) ); + if (b < 5) resize(5); } @@ -164,11 +169,10 @@ prefix_ void senf::DynamicTLVLengthParser::resize(size_type size) size_type current_size (bytes()); SafePacketParserWrapper safeThis (*this); - safe_data_iterator si (data(), i()); if (current_size > size) - data().erase( si, boost::next(si, current_size-size)); + data().erase( i(), boost::next(i(), current_size-size)); else - data().insert( si, size-current_size, 0); + data().insert( i(), size-current_size, 0); if (size > 1) { safeThis->extended_length_flag() = true; @@ -176,7 +180,16 @@ prefix_ void senf::DynamicTLVLengthParser::resize(size_type size) } else { safeThis->extended_length_flag() = false; } - value(v); + safeThis->value(v); +} + + +prefix_ senf::PacketInterpreterBase::range senf::GenericTLVPacketParser::value() + const +{ + senf::PacketData::iterator begin (boost::next(data().begin(), 1 + length_bytes() )); + return PacketInterpreterBase::range( + begin, boost::next( begin, length()) ); } @@ -186,7 +199,9 @@ prefix_ void senf::GenericTLVPacketType::dump(packet p, std::ostream & os) os << "GenericTLVPacket:\n" << std::dec << " type: " << unsigned( p->type()) << "\n" - << " length: " << unsigned( p->length()) << "\n"; + << " length: " << unsigned( p->length()) << "\n" + << " value\n:"; + senf::hexdump( p->value().begin(), p->value().end(), os); }