// $Id$ // // Copyright (C) 2007 // Fraunhofer Institute for Open Communication Systems (FOKUS) // // The contents of this file are subject to the Fraunhofer FOKUS Public License // Version 1.0 (the "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // http://senf.berlios.de/license.html // // The Fraunhofer FOKUS Public License Version 1.0 is based on, // but modifies the Mozilla Public License Version 1.1. // See the full license text for the amendments. // // Software distributed under the License is distributed on an "AS IS" basis, // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License // for the specific language governing rights and limitations under the License. // // The Original Code is Fraunhofer FOKUS code. // // The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V. // (registered association), Hansastraße 27 c, 80686 Munich, Germany. // All Rights Reserved. // // Contributor(s): // Stefan Bund /** \file \brief PacketParser inline non-template implementation */ // Custom includes #include #include "PacketData.hh" #define prefix_ inline //-///////////////////////////////////////////////////////////////////////////////////////////////// //-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::PacketParserBase // public members prefix_ senf::PacketParserBase::data_iterator senf::PacketParserBase::i() const { return i_; } // private members prefix_ senf::PacketParserBase::data_iterator senf::PacketParserBase::end() const { return data_->end(); } prefix_ senf::PacketParserBase::ParserProtector::ParserProtector(PacketParserBase const * p) : safe_i_( *p), parser_(p) {} prefix_ senf::PacketParserBase::ParserProtector::ParserProtector(ParserProtector const & other_) : safe_i_( *other_.parser_), parser_(other_.parser_) { other_.parser_ = 0; } prefix_ senf::PacketParserBase::ParserProtector::~ParserProtector() { if (parser_) const_cast(parser_)->i_ = safe_i_; } // protected members prefix_ senf::PacketParserBase::ParserProtector senf::PacketParserBase::protect() const { return ParserProtector(this); } prefix_ bool senf::PacketParserBase::check(size_type size) const { return size <= size_type(std::distance(i(),end())); } 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) {} prefix_ senf::PacketParserBase::PacketParserBase(data_iterator i, state_type s, size_type size) : i_ (i), data_ (s) { validate(size); } // public members prefix_ senf::PacketParserBase::data_iterator senf::PacketParserBase::i(size_type offset) const { validate(offset); return boost::next(i_, offset); } prefix_ senf::PacketParserBase::state_type senf::PacketParserBase::state() const { return data_; } prefix_ senf::PacketData & senf::PacketParserBase::data() const { return * data_; } prefix_ void senf::PacketParserBase::init() const {} prefix_ void senf::PacketParserBase::defaultInit() const {} prefix_ senf::Packet senf::PacketParserBase::packet() const { // 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()))); } //-///////////////////////////////////////////////////////////////////////////////////////////////// #undef prefix_ // Local Variables: // mode: c++ // fill-column: 100 // c-file-style: "senf" // indent-tabs-mode: nil // ispell-local-dictionary: "american" // compile-command: "scons -u test" // comment-column: 40 // End: