X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPackets%2F80221Bundle%2FMIHMessageRegistry.hh;h=4daabb7db94311ca4f1ef36b835cef09d1146d88;hb=57daeae6f2e924ce3f16f9677c3474f531cba9e5;hp=a22178e6e509cb6e9d847b6dc386e19e07df8b92;hpb=13d2e8af1e2516a2289949b8360f4e6a1c508720;p=senf.git diff --git a/senf/Packets/80221Bundle/MIHMessageRegistry.hh b/senf/Packets/80221Bundle/MIHMessageRegistry.hh index a22178e..4daabb7 100644 --- a/senf/Packets/80221Bundle/MIHMessageRegistry.hh +++ b/senf/Packets/80221Bundle/MIHMessageRegistry.hh @@ -1,6 +1,6 @@ // $Id$ // -// Copyright (C) 2009 +// Copyright (C) 2010 // Fraunhofer Institute for Open Communication Systems (FOKUS) // Competence Center NETwork research (NET), St. Augustin, GERMANY // Thorsten Horstmann @@ -27,27 +27,94 @@ #define HH_SENF_Packets_80221Bundle_MIHMessageRegistry_ 1 // Custom includes +#include +#include #include -//#include "MIHPacket.mpp" -///////////////////////////////hh.p//////////////////////////////////////// +//#include "MIHMessageRegistry.mpp" +//-///////////////////////////////////////////////////////////////////////////////////////////////// namespace senf { - struct MIHMessageRegistry { - // MIH messages registry + namespace detail { + + template + struct has_static_validate_member + { + template + struct helper; + + template + static char test(helper<&U::validate> *); + + template + static char (&test(...))[2]; + + static const bool value = sizeof(test(0))==1; + }; + + struct MIHMessageRegistry_EntryBase { + virtual ~MIHMessageRegistry_EntryBase() {} + virtual void validate(senf::Packet message) const = 0; + }; + + template ::value> + struct MIHMessageRegistryEntry : MIHMessageRegistry_EntryBase + { + virtual void validate(senf::Packet message) const {} + }; + + template + struct MIHMessageRegistryEntry : MIHMessageRegistry_EntryBase + { + virtual void validate(senf::Packet message) const { + MIHPacket::type::validate(message.as()); + } + }; + } + + + class MIHMessageRegistry + : public senf::singleton + { + public: typedef boost::uint16_t key_t; + + using senf::singleton::instance; + friend class senf::singleton; + + template + struct RegistrationProxy { + RegistrationProxy(); + }; + + template + void registerMessageType(); + + void validate(key_t messageId, senf::Packet message); + + private: + typedef boost::ptr_map Map; + Map map_; + + MIHMessageRegistry() {}; }; -# define SENF_MIH_PACKET_REGISTRY_REGISTER( packet ) \ - SENF_PACKET_REGISTRY_REGISTER( \ - senf::MIHMessageRegistry, packet::type::MESSAGE_ID, packet ) + +# define SENF_MIH_PACKET_REGISTRY_REGISTER( packet ) \ + SENF_PACKET_REGISTRY_REGISTER( \ + senf::MIHMessageRegistry, packet::type::MESSAGE_ID, packet ) \ + namespace { \ + senf::MIHMessageRegistry::RegistrationProxy< packet > \ + BOOST_PP_CAT(mihPacketRegistration_, __LINE__); \ + } } -///////////////////////////////hh.e//////////////////////////////////////// -//#include "MIHPacket.cci" -//#include "MIHPacket.ct" -//#include "MIHPacket.cti" +//-///////////////////////////////////////////////////////////////////////////////////////////////// +//#include "MIHMessageRegistry.cci" +#include "MIHMessageRegistry.ct" +//#include "MIHMessageRegistry.cti" #endif