X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPackets%2FPacketInterpreter.hh;h=d7fb09b8ceae60f1e80558f59c4697c7cbe21183;hb=74febc7a9abc84c4939269b3443d15fc27f4e960;hp=2760b9d1f483403d3c8db4d9054e7e6547acb2f5;hpb=7661548b20e6c7627f54bff87e0758396fd523ef;p=senf.git diff --git a/senf/Packets/PacketInterpreter.hh b/senf/Packets/PacketInterpreter.hh index 2760b9d..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 */ @@ -42,7 +47,11 @@ 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 @@ -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 }; @@ -97,26 +106,26 @@ namespace senf { // 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; @@ -131,7 +140,7 @@ namespace senf { virtual ~PacketInterpreterBase(); - static factory_t no_factory(); + static factory_t no_factory(); ptr clone(); @@ -147,8 +156,7 @@ 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); @@ -228,16 +236,13 @@ 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 *); }; - void intrusive_ptr_add_ref(PacketInterpreterBase const * p); - void intrusive_ptr_release(PacketInterpreterBase const * p); - /** \brief Internal: Concrete packet interpreter \internal @@ -283,21 +288,21 @@ 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 @@ -323,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 @@ -355,6 +360,8 @@ namespace senf { Implements the abstract factory interface for \a PacketType */ struct FactoryImpl : public Factory { + FactoryImpl() {} + // Create completely new packet virtual PacketInterpreterBase::ptr create() const; @@ -364,40 +371,40 @@ namespace senf { // 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, + 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