+// $Id$
+//
// Copyright (C) 2007
-// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
-// Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
+// Fraunhofer Institute for Open Communication Systems (FOKUS)
+// Competence Center NETwork research (NET), St. Augustin, GERMANY
// Stefan Bund <g0dil@berlios.de>
//
// This program is free software; you can redistribute it and/or modify
/** \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<SimplePacketType, SomeRegistryTag>
+ : public senf::PacketTypeBase,
+ public senf::PacketTypeMixin<SimplePacketType, SomeRegistryTag>
{
typedef senf::PacketTypeMixin<SimplePacketType, SomeRegistryTag> mixin;
typedef senf::ConcretePacket<SimplePacketType> packet;
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(senf::nothrow));
+
// optionally complete the packet by generating auto-generated information
// (like checksums)
}
\code
struct SimplePacketType
- : public senf::PacketTypeBase
- public senf:PacketTypeMixin<SimplePacketType, SomeRegistryTag>
+ : public senf::PacketTypeBase,
+ public senf::PacketTypeMixin<SimplePacketType, SomeRegistryTag>
{
typedef senf::PacketTypeMixin<SimplePacketType, SomeRegistryTag> mixin;
typedef senf::ConcretePacket<SimplePacketType> packet;
using mixin::init;
static registry_key_t nextPacketKey(packet p)
- { return i.fields().typeField(); }
+ { return p->typeField(); }
};
\endcode
{
public:
typedef typename Registry::key_t registry_key_t;
+ typedef boost::optional<registry_key_t> 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
///////////////////////////////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"