X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FPacketParser.cci;h=510c2a61b2b0a6715be48c34c7f6086989e566d8;hb=bd9f9d3fd6fbcff0112a7bf48ab9284da9576b11;hp=d18cf3a93f9347bc11bc8fd400446ceb2dd7f030;hpb=47368f306a577d1e46df69a7f729bd3893cbe5e7;p=senf.git diff --git a/Packets/PacketParser.cci b/Packets/PacketParser.cci index d18cf3a..510c2a6 100644 --- a/Packets/PacketParser.cci +++ b/Packets/PacketParser.cci @@ -1,6 +1,8 @@ -// Copyright (C) 2007 -// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS) -// Kompetenzzentrum fuer Satelitenkommunikation (SatCom) +// $Id$ +// +// Copyright (C) 2007 +// Fraunhofer Institute for Open Communication Systems (FOKUS) +// Competence Center NETwork research (NET), St. Augustin, GERMANY // Stefan Bund // // This program is free software; you can redistribute it and/or modify @@ -31,30 +33,36 @@ /////////////////////////////////////////////////////////////////////////// // senf::PacketParserBase +// public members + prefix_ senf::PacketParserBase::data_iterator senf::PacketParserBase::i() const { return i_; } -prefix_ senf::PacketParserBase::state_type senf::PacketParserBase::state() +// private members + +prefix_ senf::PacketParserBase::data_iterator senf::PacketParserBase::end() const { - return data_; + return data_->end(); } -prefix_ senf::PacketData & senf::PacketParserBase::data() +// protected members + +prefix_ bool senf::PacketParserBase::check(size_type size) const { - return * data_; + return size <= size_type(std::distance(i(),end())); } -prefix_ void senf::PacketParserBase::init() - const -{} - -//////////////////////////////////////// -// protected members +prefix_ void senf::PacketParserBase::validate(size_type size) + const +{ + if (! check(size)) + throw TruncatedPacketException(); +} prefix_ senf::PacketParserBase::PacketParserBase(data_iterator i, state_type s) : i_ (i), data_ (s) @@ -67,23 +75,42 @@ prefix_ senf::PacketParserBase::PacketParserBase(data_iterator i, state_type s, validate(size); } -prefix_ bool senf::PacketParserBase::check(size_type size) +// public members + +prefix_ senf::PacketParserBase::data_iterator senf::PacketParserBase::i(size_type offset) + const { - return size <= size_type(std::distance(i(),end())); + validate(offset); + return boost::next(i_, offset); } -prefix_ void senf::PacketParserBase::validate(size_type size) +prefix_ senf::PacketParserBase::state_type senf::PacketParserBase::state() + const { - if (! check(size)) - throw TruncatedPacketException(); + return data_; } -//////////////////////////////////////// -// private members +prefix_ senf::PacketData & senf::PacketParserBase::data() + const +{ + return * data_; +} -prefix_ senf::PacketParserBase::data_iterator senf::PacketParserBase::end() +prefix_ void senf::PacketParserBase::init() + const +{} + +prefix_ void senf::PacketParserBase::defaultInit() + const +{} + +prefix_ senf::Packet senf::PacketParserBase::packet() + const { - return data_->end(); + // OUCH ... I hate this but for some awkward packet types, access to the packet + // from the parser is really needed (e.g. UDP when building the pseudo-header + // for calculating the checksum). + return Packet(PacketInterpreterBase::ptr(static_cast(&data()))); } ///////////////////////////////cci.e/////////////////////////////////////// @@ -96,4 +123,6 @@ prefix_ senf::PacketParserBase::data_iterator senf::PacketParserBase::end() // c-file-style: "senf" // indent-tabs-mode: nil // ispell-local-dictionary: "american" +// compile-command: "scons -u test" +// comment-column: 40 // End: