From a3a41c71c50f95f95965165eff28d24a1be24453 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Thu, 4 Sep 2008 23:52:14 +0200 Subject: RequestManager kann jetzt flexibler auf eingehende Anfragen reagieren --- src/Common/RequestManager.h | 48 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 4 deletions(-) (limited to 'src/Common/RequestManager.h') diff --git a/src/Common/RequestManager.h b/src/Common/RequestManager.h index 543fb83..77eca52 100644 --- a/src/Common/RequestManager.h +++ b/src/Common/RequestManager.h @@ -20,16 +20,20 @@ #ifndef MAD_COMMON_REQUESTMANAGER_H_ #define MAD_COMMON_REQUESTMANAGER_H_ -#include "Request/Request.h" +#include "RequestHandler.h" #include #include namespace Mad { namespace Common { +namespace Request { +class Request; +} + class RequestManager { private: - class RequestMap : private std::map { + class RequestMap : private std::map { private: // Prevent shallow copy RequestMap(const RequestMap &o); @@ -43,11 +47,11 @@ class RequestManager { delete it->second; } - bool addRequest(unsigned short id, Request::Request *info) { + bool addRequest(unsigned short id, RequestHandler *info) { return insert(std::make_pair(id, info)).second; } - Request::Request* findRequest(unsigned short id) { + RequestHandler* findRequest(unsigned short id) { iterator it = find(id); if(it == end()) return 0; @@ -67,6 +71,22 @@ class RequestManager { } }; + class RequestHandlerFactory { + protected: + RequestHandlerFactory() {} + + public: + virtual RequestHandler* createRequestHandler() = 0; + virtual ~RequestHandlerFactory() {} + }; + + template class SpecificRequestHandlerFactory : public RequestHandlerFactory { + public: + virtual RequestHandler* createRequestHandler() { + return new T(); + } + }; + // Prevent shallow copy RequestManager(const RequestManager &o); RequestManager& operator=(const RequestManager &o); @@ -74,6 +94,8 @@ class RequestManager { std::map requestMaps; unsigned short requestId; + std::map requestHandlerFactories; + unsigned short getRequestId() { return requestId+=2; } @@ -98,6 +120,21 @@ class RequestManager { requestMaps.erase(it); } + template void registerPacketType(Net::Packet::Type type) { + requestHandlerFactories.insert(std::make_pair(type, new SpecificRequestHandlerFactory())); + } + + void unregisterPacketType(Net::Packet::Type type) { + std::map::iterator it = requestHandlerFactories.find(type); + + if(it == requestHandlerFactories.end()) + return; + + delete it->second; + + requestHandlerFactories.erase(it); + } + bool sendRequest(Net::Connection *connection, Request::Request *request); RequestManager(bool core) : requestId(core ? -2 : -1) {} @@ -105,6 +142,9 @@ class RequestManager { virtual ~RequestManager() { for(std::map::iterator it = requestMaps.begin(); it != requestMaps.end(); ++it) delete it->second; + + for(std::map::iterator it = requestHandlerFactories.begin(); it != requestHandlerFactories.end(); ++it) + delete it->second; } }; -- cgit v1.2.3