X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPackets%2FPacketInterpreter.hh;h=d7fb09b8ceae60f1e80558f59c4697c7cbe21183;hb=74febc7a9abc84c4939269b3443d15fc27f4e960;hp=0a546a6ebeed0c15f1b20cf50ef60f1854fb2b0d;hpb=3a3350157a52c268d5082a4aac4aba643417071f;p=senf.git diff --git a/senf/Packets/PacketInterpreter.hh b/senf/Packets/PacketInterpreter.hh index 0a546a6..d7fb09b 100644 --- a/senf/Packets/PacketInterpreter.hh +++ b/senf/Packets/PacketInterpreter.hh @@ -2,23 +2,28 @@ // // 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 -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. +// 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 // -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. +// 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. // -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the -// Free Software Foundation, Inc., -// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// 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 PacketInterpreter public header */ @@ -27,7 +32,7 @@ #define HH_SENF_Packets_PacketInterpreter_ 1 // Custom includes -#include +#include #include #include #include @@ -37,26 +42,30 @@ #include //#include "PacketInterpreter.mpp" -///////////////////////////////hh.p//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// namespace senf { template class PacketInterpreter; + + void intrusive_ptr_add_ref(PacketInterpreterBase const * p); + void intrusive_ptr_release(PacketInterpreterBase const * p); + /** \brief Internal: Base packet interpreter class - + \internal This is the base class for the persistent interpreter. This class encapsulates all the functionality accessible via the packet handle, most handle operations are just forwarded. */ class PacketInterpreterBase - : protected PacketData, + : protected PacketData, public detail::packet::interpreter_list_base, public intrusive_refcount_t { public: - /////////////////////////////////////////////////////////////////////////// + //-//////////////////////////////////////////////////////////////////////// // Types typedef senf::detail::packet::smart_pointer< @@ -69,7 +78,7 @@ namespace senf { typedef senf::detail::packet::byte byte; typedef boost::iterator_range range; - typedef boost::optional< boost::iterator_range > optional_range; + typedef boost::optional optional_range; typedef optional_range no_range; enum Append_t { Append }; @@ -83,7 +92,7 @@ namespace senf { almost any one of the create / createAfter / createBefore static PacketInterpreter without static information on the type of packet to create. */ - struct Factory { + struct Factory { virtual ~Factory(); // Create completely new packet @@ -94,36 +103,36 @@ namespace senf { virtual ptr create(size_type size, senf::NoInit_t) const = 0; template ptr create(ForwardReadableRange const & range) const; - + // Create packet as new packet after a given packet - virtual ptr createAfter(PacketInterpreterBase::ptr packet) const = 0; - virtual ptr createAfter(PacketInterpreterBase::ptr packet, senf::NoInit_t) const = 0; - virtual ptr createAfter(PacketInterpreterBase::ptr packet, size_type size) const = 0; - virtual ptr createAfter(PacketInterpreterBase::ptr packet, size_type size, + virtual ptr createAfter(PacketInterpreterBase::ptr const & packet) const = 0; + virtual ptr createAfter(PacketInterpreterBase::ptr const & packet, senf::NoInit_t) const = 0; + virtual ptr createAfter(PacketInterpreterBase::ptr const & packet, size_type size) const = 0; + virtual ptr createAfter(PacketInterpreterBase::ptr const & packet, size_type size, senf::NoInit_t) const = 0; template - ptr createAfter(PacketInterpreterBase::ptr packet, + ptr createAfter(PacketInterpreterBase::ptr const & packet, ForwardReadableRange const & range) const; - + // Create packet as new packet (header) const before a given packet - virtual ptr createBefore(PacketInterpreterBase::ptr packet) const = 0; - virtual ptr createBefore(PacketInterpreterBase::ptr packet, senf::NoInit_t) const = 0; + virtual ptr createBefore(PacketInterpreterBase::ptr const & packet) const = 0; + virtual ptr createBefore(PacketInterpreterBase::ptr const & packet, senf::NoInit_t) const = 0; - virtual ptr createInsertBefore(PacketInterpreterBase::ptr packet) const = 0; - virtual ptr createInsertBefore(PacketInterpreterBase::ptr packet, senf::NoInit_t) const = 0; + virtual ptr createInsertBefore(PacketInterpreterBase::ptr const & packet) const = 0; + virtual ptr createInsertBefore(PacketInterpreterBase::ptr const & packet, senf::NoInit_t) const = 0; // Parse next packet in chain - virtual ptr parseNext(ptr packet) const = 0; + virtual ptr parseNext(ptr const & packet, PacketInterpreterBase::optional_range const & range) const = 0; }; typedef Factory const * factory_t; - /////////////////////////////////////////////////////////////////////////// + //-//////////////////////////////////////////////////////////////////////// ///\name Structors and default members - ///@{ + //\{ // protected constructors // no copy @@ -131,15 +140,15 @@ namespace senf { virtual ~PacketInterpreterBase(); - static factory_t no_factory(); - + static factory_t no_factory(); + ptr clone(); - - ///@} - /////////////////////////////////////////////////////////////////////////// + + //\} + //-//////////////////////////////////////////////////////////////////////// ///\name Interpreter chain access - ///@{ + //\{ ptr next(); ptr prev(); @@ -147,32 +156,35 @@ namespace senf { ptr last(); template typename PacketInterpreter::ptr parseNextAs(); - ptr parseNextAs(factory_t factory); - template bool is(); + ptr parseNextAs(factory_t factory, PacketInterpreterBase::optional_range const & range); template typename PacketInterpreter::ptr as(); ptr append(ptr packet); - ///@} + void reparse(); + + //\} ///\name Data access - ///@{ + //\{ using PacketData::valid; PacketData & data(); - - ///@} + + //\} ///\name Annotations - ///@{ + //\{ template Annotation & annotation(); - ///@} + void clearAnnotations(); + + //\} ///\name Access to the abstract interface - ///@{ + //\{ optional_range nextPacketRange(); void finalizeThis(); @@ -182,7 +194,7 @@ namespace senf { factory_t factory(); factory_t nextPacketType(); - ///@} + //\} protected: // protected structors @@ -214,7 +226,7 @@ namespace senf { // reference/memory management. Only to be called by intrusive_refcount_t. void add_ref(); - bool release(); + void release(); // containment management. Only to be called by PacketImpl. @@ -224,8 +236,11 @@ namespace senf { friend class detail::PacketImpl; friend class intrusive_refcount_base; template friend class PacketInterpreter; - friend class detail::packet::test::TestDriver; + friend struct detail::packet::test::TestDriver; friend class PacketParserBase; + + friend void senf::intrusive_ptr_add_ref(PacketInterpreterBase const *); + friend void senf::intrusive_ptr_release(PacketInterpreterBase const *); }; /** \brief Internal: Concrete packet interpreter @@ -244,7 +259,7 @@ namespace senf { public pool_alloc_mixin< PacketInterpreter > { public: - /////////////////////////////////////////////////////////////////////////// + //-//////////////////////////////////////////////////////////////////////// // Types typedef typename senf::detail::packet::smart_pointer< @@ -252,9 +267,9 @@ namespace senf { typedef PacketType type; typedef typename type::parser parser; - /////////////////////////////////////////////////////////////////////////// + //-//////////////////////////////////////////////////////////////////////// ///\name Structors and default members - ///@{ + //\{ // private constructors // no copy @@ -273,28 +288,28 @@ namespace senf { // Create packet as new packet after a given packet - static ptr createAfter(PacketInterpreterBase::ptr packet); - static ptr createAfter(PacketInterpreterBase::ptr packet, senf::NoInit_t); - static ptr createAfter(PacketInterpreterBase::ptr packet, size_type size); - static ptr createAfter(PacketInterpreterBase::ptr packet, size_type size, senf::NoInit_t); + static ptr createAfter(PacketInterpreterBase::ptr const & packet); + static ptr createAfter(PacketInterpreterBase::ptr const & packet, senf::NoInit_t); + static ptr createAfter(PacketInterpreterBase::ptr const & packet, size_type size); + static ptr createAfter(PacketInterpreterBase::ptr const & packet, size_type size, senf::NoInit_t); template - static ptr createAfter(PacketInterpreterBase::ptr packet, + static ptr createAfter(PacketInterpreterBase::ptr const & packet, ForwardReadableRange const & range); // Create packet as new packet (header) before a given packet - static ptr createBefore(PacketInterpreterBase::ptr packet); - static ptr createBefore(PacketInterpreterBase::ptr packet, senf::NoInit_t); + static ptr createBefore(PacketInterpreterBase::ptr const & spacket); + static ptr createBefore(PacketInterpreterBase::ptr const & packet, senf::NoInit_t); - static ptr createInsertBefore(PacketInterpreterBase::ptr packet); - static ptr createInsertBefore(PacketInterpreterBase::ptr packet, senf::NoInit_t); + static ptr createInsertBefore(PacketInterpreterBase::ptr const & packet); + static ptr createInsertBefore(PacketInterpreterBase::ptr const & packet, senf::NoInit_t); // Create a clone of the current packet ptr clone(); - ///@} - /////////////////////////////////////////////////////////////////////////// + //\} + //-//////////////////////////////////////////////////////////////////////// // Packet field access @@ -313,12 +328,12 @@ namespace senf { PacketInterpreter(detail::PacketImpl * impl, iterator b, iterator e, Append_t); PacketInterpreter(detail::PacketImpl * impl, iterator b, iterator e, Prepend_t); PacketInterpreter(detail::PacketImpl * impl, iterator b, iterator e, - PacketInterpreterBase::ptr before); + PacketInterpreterBase::ptr const & before); static ptr create(detail::PacketImpl * impl, iterator b, iterator e, Append_t); static ptr create(detail::PacketImpl * impl, iterator b, iterator e, Prepend_t); static ptr create(detail::PacketImpl * impl, iterator b, iterator e, - PacketInterpreterBase::ptr before); + PacketInterpreterBase::ptr const & before); // PacketType access @@ -327,7 +342,7 @@ namespace senf { // virtual interface virtual optional_range v_nextPacketRange(); - virtual PacketInterpreterBase::ptr v_appendClone(detail::PacketImpl * impl, + virtual PacketInterpreterBase::ptr v_appendClone(detail::PacketImpl * impl, iterator base, iterator new_base); virtual PacketInterpreterBase::ptr v_appendClone(detail::PacketImpl * impl, range r); virtual void v_finalize(); @@ -339,68 +354,70 @@ namespace senf { // factory /** \brief Internal: Implementation of abstract factory interface - + \internal Implements the abstract factory interface for \a PacketType */ struct FactoryImpl : public Factory { + FactoryImpl() {} + // Create completely new packet virtual PacketInterpreterBase::ptr create() const; virtual PacketInterpreterBase::ptr create(senf::NoInit_t) const; virtual PacketInterpreterBase::ptr create(size_type size) const; virtual PacketInterpreterBase::ptr create(size_type size,senf::NoInit_t) const; - + // Create packet as new packet after a given packet - virtual PacketInterpreterBase::ptr createAfter(PacketInterpreterBase::ptr packet) + virtual PacketInterpreterBase::ptr createAfter(PacketInterpreterBase::ptr const & packet) const; - virtual PacketInterpreterBase::ptr createAfter(PacketInterpreterBase::ptr packet, + virtual PacketInterpreterBase::ptr createAfter(PacketInterpreterBase::ptr const & packet, senf::NoInit_t) const; - virtual PacketInterpreterBase::ptr createAfter(PacketInterpreterBase::ptr packet, + virtual PacketInterpreterBase::ptr createAfter(PacketInterpreterBase::ptr const & packet, size_type size) const; - virtual PacketInterpreterBase::ptr createAfter(PacketInterpreterBase::ptr packet, + virtual PacketInterpreterBase::ptr createAfter(PacketInterpreterBase::ptr const & packet, size_type size, senf::NoInit_t) const; - + // Create packet as new packet (header) before a given packet - virtual PacketInterpreterBase::ptr createBefore(PacketInterpreterBase::ptr packet) + virtual PacketInterpreterBase::ptr createBefore(PacketInterpreterBase::ptr const & packet) const; - virtual PacketInterpreterBase::ptr createBefore(PacketInterpreterBase::ptr packet, - senf::NoInit_t) + virtual PacketInterpreterBase::ptr createBefore(PacketInterpreterBase::ptr const & packet, + senf::NoInit_t) const; - virtual PacketInterpreterBase::ptr createInsertBefore(PacketInterpreterBase::ptr packet) + virtual PacketInterpreterBase::ptr createInsertBefore(PacketInterpreterBase::ptr const & packet) const; - virtual PacketInterpreterBase::ptr createInsertBefore(PacketInterpreterBase::ptr packet, + virtual PacketInterpreterBase::ptr createInsertBefore(PacketInterpreterBase::ptr const & packet, senf::NoInit_t) const; // Parse next packet in chain - virtual PacketInterpreterBase::ptr parseNext(PacketInterpreterBase::ptr packet) + virtual PacketInterpreterBase::ptr parseNext(PacketInterpreterBase::ptr const & packet, PacketInterpreterBase::optional_range const & range) const; }; static const FactoryImpl factory_; - friend class detail::packet::test::TestDriver; + friend struct detail::packet::test::TestDriver; friend class PacketInterpreterBase; - friend class FactoryImpl; + friend struct FactoryImpl; }; /** \brief Invalid packet chain operation This exception signals an invalid operation on the chain like trying to find a non-existent - chain member and other similar error conditions. + chain member and other similar error conditions. */ struct InvalidPacketChainException : public senf::Exception { InvalidPacketChainException() : senf::Exception("invalid packet chain") {} }; - + } -///////////////////////////////hh.e//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// #endif #if !defined(HH_SENF_Packets_Packets__decls_) && !defined(HH_SENF_Packets_PacketInterpreter_i_) #define HH_SENF_Packets_PacketInterpreter_i_