diff options
author | Matthias Schiffer <matthias@gamezock.de> | 2008-09-04 23:52:14 +0200 |
---|---|---|
committer | Matthias Schiffer <matthias@gamezock.de> | 2008-09-04 23:52:14 +0200 |
commit | a3a41c71c50f95f95965165eff28d24a1be24453 (patch) | |
tree | ce0c0bbfdf793b055a28ac722659cb629f39ac10 /src/Common/RequestManager.h | |
parent | 38ddaa7aa1f2093848ad760027096ee8d0b105e2 (diff) | |
download | mad-a3a41c71c50f95f95965165eff28d24a1be24453.tar mad-a3a41c71c50f95f95965165eff28d24a1be24453.zip |
RequestManager kann jetzt flexibler auf eingehende Anfragen reagieren
Diffstat (limited to 'src/Common/RequestManager.h')
-rw-r--r-- | src/Common/RequestManager.h | 48 |
1 files changed, 44 insertions, 4 deletions
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 <Net/Connection.h> #include <map> namespace Mad { namespace Common { +namespace Request { +class Request; +} + class RequestManager { private: - class RequestMap : private std::map<unsigned short,Request::Request*> { + class RequestMap : private std::map<unsigned short,RequestHandler*> { 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 T> 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<Net::Connection*,RequestMap*> requestMaps; unsigned short requestId; + std::map<Net::Packet::Type,RequestHandlerFactory*> requestHandlerFactories; + unsigned short getRequestId() { return requestId+=2; } @@ -98,6 +120,21 @@ class RequestManager { requestMaps.erase(it); } + template <class T> void registerPacketType(Net::Packet::Type type) { + requestHandlerFactories.insert(std::make_pair(type, new SpecificRequestHandlerFactory<T>())); + } + + void unregisterPacketType(Net::Packet::Type type) { + std::map<Net::Packet::Type,RequestHandlerFactory*>::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<Net::Connection*,RequestMap*>::iterator it = requestMaps.begin(); it != requestMaps.end(); ++it) delete it->second; + + for(std::map<Net::Packet::Type,RequestHandlerFactory*>::iterator it = requestHandlerFactories.begin(); it != requestHandlerFactories.end(); ++it) + delete it->second; } }; |