X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FPacketType.hh;h=06c2a515698d4c193a21ed06af890d7119d94c57;hb=10e64c7a79dcb1f1438dca8c1a949057cdcc7394;hp=863f96668b6137e24e2fcce141ee41b9e6689e8f;hpb=981204dbf160d3dd77e303b9bd133eb187e0384f;p=senf.git diff --git a/Packets/PacketType.hh b/Packets/PacketType.hh index 863f966..06c2a51 100644 --- a/Packets/PacketType.hh +++ b/Packets/PacketType.hh @@ -214,16 +214,16 @@ namespace senf { /** \brief Mixin to provide standard implementations for nextPacketRange and nextPacketType - This mixin class simplifies the definition of simple packets with fixed-size headers and/or - trailers. For this type of Packet, this mixin provides the nextPacketRange() member. If you - additionally provide the optional \a Registry argument, PacketTypeMixin provides a simple - implementation of nextPacketType. When using the PacketTypeMixin, the implementation of a - packet is simplified to: + This mixin class simplifies the definition of simple packets with fixed-size (!) headers + and/or trailers. For this type of Packet, this mixin provides the nextPacketRange() + member. If you additionally provide the optional \a Registry argument, PacketTypeMixin + provides a simple implementation of nextPacketType. When using the PacketTypeMixin, the + implementation of a packet is simplified to: \code // Here 'SomeRegistryTag' is optional struct SimplePacketType - : public senf::PacketTypeBase - public senf:PacketTypeMixin + : public senf::PacketTypeBase, + public senf::PacketTypeMixin { typedef senf::PacketTypeMixin mixin; typedef senf::ConcretePacket packet; @@ -271,6 +271,11 @@ namespace senf { static void finalize(packet p) { + // Set the type field by querying the type of the next packet. This is an + // optional assignment: If the key is not found, the value returned by 'key' + // is an empty optional and the assignment will be skipped. + p->typeField << key(p.next()); + // optionally complete the packet by generating auto-generated information // (like checksums) } @@ -287,8 +292,8 @@ namespace senf { \code struct SimplePacketType - : public senf::PacketTypeBase - public senf:PacketTypeMixin + : public senf::PacketTypeBase, + public senf::PacketTypeMixin { typedef senf::PacketTypeMixin mixin; typedef senf::ConcretePacket packet; @@ -300,7 +305,7 @@ namespace senf { using mixin::init; static registry_key_t nextPacketKey(packet p) - { return i.fields().typeField(); } + { return p->typeField(); } }; \endcode @@ -314,11 +319,30 @@ namespace senf { { public: typedef typename Registry::key_t registry_key_t; + typedef boost::optional optional_registry_key_t; + + static optional_registry_key_t key (Packet p); ///< Find key of packet from registry + /**< key() will query the registry to find the key of the + given packet. Whereas \c nextPacketKey() as implemented + by the mixin user will provide the registry key of the + next packet from information stored in the current + packets header, the key() member will look up the type + of packet \a p in the registry and return it's + key. + + If either \a p is an in - valid() packet or the packet + type is not found in the registry, the returned + optional value will be empty. */ + + ///\name PacketType interface implementation + ///@{ static PacketInterpreterBase::optional_range nextPacketRange (Packet p); static PacketInterpreterBase::factory_t nextPacketType (Packet p); static PacketInterpreterBase::size_type initSize (); static void init (Packet p); + + ///@} }; # ifndef DOXYGEN @@ -338,7 +362,7 @@ namespace senf { ///////////////////////////////hh.e//////////////////////////////////////// #endif -#if !defined(SENF_PACKETS_DECL_ONLY) && !defined(HH_PacketType_i_) +#if !defined(HH_Packets__decls_) && !defined(HH_PacketType_i_) #define HH_PacketType_i_ #include "PacketType.cci" //#include "PacketType.ct"