1 //////////////////////////////////////////////////////////////////////////////// 2 // Scorched3D (c) 2000-2011 3 // 4 // This file is part of Scorched3D. 5 // 6 // Scorched3D is free software; you can redistribute it and/or modify 7 // it under the terms of the GNU General Public License as published by 8 // the Free Software Foundation; either version 2 of the License, or 9 // (at your option) any later version. 10 // 11 // Scorched3D is distributed in the hope that it will be useful, 12 // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 // GNU General Public License for more details. 15 // 16 // You should have received a copy of the GNU General Public License along 17 // with this program; if not, write to the Free Software Foundation, Inc., 18 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 19 //////////////////////////////////////////////////////////////////////////////// 20 21 #if !defined(__INCLUDE_ComsMessageHandlerh_INCLUDE__) 22 #define __INCLUDE_ComsMessageHandlerh_INCLUDE__ 23 24 #include <net/NetMessageHandler.h> 25 #include <coms/ComsMessage.h> 26 #include <vector> 27 28 class ComsMessageConnectionHandlerI 29 { 30 public: 31 virtual ~ComsMessageConnectionHandlerI(); 32 33 virtual void clientConnected(NetMessage &message) = 0; 34 virtual void clientDisconnected(NetMessage &message) = 0; 35 virtual void clientError(NetMessage &message, 36 const std::string &errorString) = 0; 37 38 virtual void messageRecv(unsigned int destinationId) = 0; 39 virtual void messageSent(unsigned int destinationId) = 0; 40 }; 41 42 class ComsMessageHandlerI 43 { 44 public: 45 virtual ~ComsMessageHandlerI(); 46 47 virtual bool processMessage( 48 NetMessage &message, 49 const char *messageType, 50 NetBufferReader &reader) = 0; 51 }; 52 53 class ComsMessageHandler : public NetMessageHandlerI 54 { 55 public: 56 ComsMessageHandler(const char *instanceName = ""); 57 virtual ~ComsMessageHandler(); 58 59 // Used to add a handler for a specific message type 60 void setConnectionHandler( 61 ComsMessageConnectionHandlerI *handler); 62 void addHandler(ComsMessageType &comsMessageType, 63 ComsMessageHandlerI *handler); 64 void addSentHandler(ComsMessageType &comsMessageType, 65 ComsMessageHandlerI *handler); 66 67 // Inherited from NetMessageHandlerI 68 virtual void processMessage(NetMessage &message); 69 getMessageLogging()70 bool &getMessageLogging() { return comsMessageLogging_; } 71 72 protected: 73 std::string instanceName_; 74 std::vector<ComsMessageHandlerI *> recvHandlers_; 75 std::vector<ComsMessageHandlerI *> sentHandlers_; 76 ComsMessageConnectionHandlerI *connectionHandler_; 77 78 bool comsMessageLogging_; 79 void processReceiveMessage(NetMessage &message); 80 void processSentMessage(NetMessage &message); 81 void processMessage(NetMessage &message, 82 std::vector<ComsMessageHandlerI *> &handlers, 83 const char *sendRecv); 84 }; 85 86 // Same as above but passed userdata to method 87 template<class T> 88 class ComsMessageHandlerIAdapter : public ComsMessageHandlerI 89 { 90 public: ComsMessageHandlerIAdapter(T * inst,bool (T::* call)(NetMessage & message,NetBufferReader & reader),ComsMessageType & comsMessageType,ComsMessageHandler & handler)91 ComsMessageHandlerIAdapter(T *inst, 92 bool (T::*call)(NetMessage &message, NetBufferReader &reader), 93 ComsMessageType &comsMessageType, 94 ComsMessageHandler &handler) : 95 inst_(inst), call_(call) 96 { 97 handler.addHandler(comsMessageType, this); 98 }; ~ComsMessageHandlerIAdapter()99 virtual ~ComsMessageHandlerIAdapter() 100 { 101 }; 102 processMessage(NetMessage & message,const char * messageType,NetBufferReader & reader)103 virtual bool processMessage( 104 NetMessage &message, 105 const char *messageType, 106 NetBufferReader &reader) 107 { 108 return (inst_->*call_)(message, reader); 109 } 110 111 protected: 112 T *inst_; 113 bool (T::*call_)(NetMessage &message, NetBufferReader &reader); 114 }; 115 116 #endif 117