X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FPacketParser.cci;h=510c2a61b2b0a6715be48c34c7f6086989e566d8;hb=c45c112ae88196ea8da9c5a9efb0e167196744d2;hp=173e54e80108ed8e1b1612729770ac3d18354a4b;hpb=f13c1275e48e97dceb7de7925793a4c69a5aeb61;p=senf.git diff --git a/Packets/PacketParser.cci b/Packets/PacketParser.cci index 173e54e..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///////////////////////////////////////