PacketHandler.hh
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef PACKETHANDLER_HH_
00018 # define PACKETHANDLER_HH_
00019
00021
00022 # include "tools.hh"
00023 # include "Packet.hh"
00024 # include "EventProcess.hh"
00025
00031 class BasePacketHandler
00032 {
00033 public:
00034 virtual ~BasePacketHandler() {}
00035 virtual void handle(const Packet* p) = 0;
00036 virtual int getCstValue() const = 0;
00037 virtual void dispatchUIEvent(const EventProcess* evp,
00038 const Packet& pkt) = 0;
00039 };
00040
00043 template <int N, typename T>
00044 class PacketHandler : public BasePacketHandler
00045 {
00046 };
00047
00067 # define DECLARE_PACKET(Cst, PClass) \
00068 struct PClass; \
00069 template <typename T> \
00070 class PacketHandler<Cst, T> : public BasePacketHandler \
00071 { \
00072 public: \
00073 typedef void (T::*fct_t)(const PClass*); \
00074 PacketHandler<Cst, T>(T* obj, fct_t f) \
00075 : obj_(obj), f_(f) {} \
00076 virtual void handle(const Packet* p) \
00077 { \
00078 LOG5("<- `" #Cst "' (id: %1)", \
00079 p->client_id); \
00080 (obj_->*f_)(reinterpret_cast<const PClass*>(p)); \
00081 } \
00082 virtual int getCstValue() const { return Cst; } \
00083 virtual void dispatchUIEvent(const EventProcess* evp, \
00084 const Packet& pkt) \
00085 { \
00086 evp->dispatch(reinterpret_cast<const PClass&>(pkt)); \
00087 } \
00088 private: \
00089 T* obj_; \
00090 fct_t f_; \
00091 }; \
00092 struct PClass : public Packet \
00093 { \
00094 PClass(int client_id = -1) \
00095 : Packet(Cst, client_id) { data_size = sizeof(*this); }
00096
00097
00098 # define END_PACKET };
00099
00101 # define DECLARE_EMPTY_PACKET(Cst, PClass) \
00102 DECLARE_PACKET(Cst, PClass) \
00103 END_PACKET
00104
00105 # define HANDLE_WITH(Token, Class, Object, Method, When) \
00106 handleWith(new PacketHandler<Token, Class>(Object, &Class::Method), When)
00107
00108
00109 #endif