X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2F80221Bundle%2FTLVPacket.cc;h=42ccd703cb52845607cc455c279f72f55ebdbff6;hb=9c3803e6f6a6073a43524940307b7dd7de8b16d9;hp=de06d6181dc5066ffc4b2184415200fde1456154;hpb=32be66071113df31a085821e31414eeb776022fa;p=senf.git diff --git a/Packets/80221Bundle/TLVPacket.cc b/Packets/80221Bundle/TLVPacket.cc index de06d61..42ccd70 100644 --- a/Packets/80221Bundle/TLVPacket.cc +++ b/Packets/80221Bundle/TLVPacket.cc @@ -53,54 +53,38 @@ prefix_ senf::DynamicTLVLengthParser::value_type senf::DynamicTLVLengthParser::v prefix_ void senf::DynamicTLVLengthParser::value(value_type const & v) { - if (v > 4294967295u) - throw(UnsuportedTLVPacketException()); - SafePacketParserWrapper safeThis (*this); if (v < 128u) { - if (bytes() != 1) { - resize(1); - safeThis->extended_length_flag() = false; - } + if (bytes() != 1) + resize(1, safeThis); safeThis->fixed_length_field() = v; return; } - if (v < 256u) { - if (bytes() != 2) { - resize(2); - safeThis->extended_length_flag() = true; - safeThis->fixed_length_field() = 1; - } + if (v <= UInt8Parser::max_value) { + if (bytes() != 2) + resize(2, safeThis); safeThis->parse(1) = v; return; } - if (v < 65536u) { - if (bytes() != 3) { - resize(3); - safeThis->extended_length_flag() = true; - safeThis->fixed_length_field() = 2; - } + if (v <= UInt16Parser::max_value) { + if (bytes() != 3) + resize(3, safeThis); safeThis->parse(1) = v; return; } - if (v < 16777216u) { - if (bytes() != 4) { - resize(4); - safeThis->extended_length_flag() = true; - safeThis->fixed_length_field() = 3; - } + if (v <= UInt24Parser::max_value) { + if (bytes() != 4) + resize(4, safeThis); safeThis->parse(1) = v; return; } - if (v <= 4294967295u) { - if (bytes() != 5) { - resize(5); - safeThis->extended_length_flag() = true; - safeThis->fixed_length_field() = 4; - } + if (v <= UInt32Parser::max_value) { + if (bytes() != 5) + resize(5, safeThis); safeThis->parse(1) = v; return; } + throw(UnsuportedTLVPacketException()); } prefix_ senf::DynamicTLVLengthParser const & senf::DynamicTLVLengthParser::operator= (value_type other) @@ -123,8 +107,17 @@ prefix_ void senf::DynamicTLVLengthParser::init() const extended_length_flag() = 0; } -prefix_ void senf::DynamicTLVLengthParser::resize(size_type size) +prefix_ void senf::DynamicTLVLengthParser::resize( + size_type size, SafePacketParserWrapper &safeThis) { + std::cout << "DynamicTLVLengthParser::resize " << unsigned( size) << "\n"; + if (size > 1) { + safeThis->extended_length_flag() = true; + safeThis->fixed_length_field() = size - 1; + } else { + safeThis->extended_length_flag() = false; + } + size_type current_size (bytes()); safe_data_iterator si (data(), i()); @@ -134,6 +127,40 @@ prefix_ void senf::DynamicTLVLengthParser::resize(size_type size) data().insert( si, size-current_size, 0); } +prefix_ void senf::GenericTLVPacketType::dump(packet p, std::ostream & os) +{ + boost::io::ios_all_saver ias(os); + os << "GenericTLVPacket:\n" + << std::dec + << " type: " << unsigned( p->type()) << "\n" + << " length: " << unsigned( p->length()) << "\n"; +} + +//prefix_ void senf::GenericTLVPacketType::finalize(packet p) +//{ +// try { +// PacketData::size_type size = p.next().data().size(); +// if ( size > DynamicTLVLengthParser::max_value ) +// throw(UnsuportedTLVPacketException()); +// p->length() = size; +// } +// catch (InvalidPacketChainException & ex) { +// ; +// } +//} + + +//template +//prefix_ senf::PacketInterpreterBase::optional_range +//senf::TLVPacketType::nextPacketRange(packet p) +//{ +// if (p.data().size() < 5) +// return no_range(); +// return range( +// boost::next(p.data().begin(), 4 + senf::bytes(p->length()) ), +// p.data().end() ); +//} + ///////////////////////////////cc.e//////////////////////////////////////// #undef prefix_