From 8f098fc3070f791302ec1f497588fab6ed409980 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Mon, 16 Mar 2009 19:13:42 +0100 Subject: Request- und RequestHandler-Interfaces vereinfacht --- src/Common/RequestManager.h | 117 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 105 insertions(+), 12 deletions(-) (limited to 'src/Common/RequestManager.h') diff --git a/src/Common/RequestManager.h b/src/Common/RequestManager.h index ee4f4d1..c38435b 100644 --- a/src/Common/RequestManager.h +++ b/src/Common/RequestManager.h @@ -20,16 +20,22 @@ #ifndef MAD_COMMON_REQUESTMANAGER_H_ #define MAD_COMMON_REQUESTMANAGER_H_ -#include +#include "Request.h" #include #include +#include + +#include namespace Mad { -namespace Common { -class Request; -class RequestHandler; +namespace Net { +class Connection; +class Packet; +} + +namespace Common { class RequestManager { private: @@ -53,14 +59,14 @@ class RequestManager { RequestHandlerFactory() {} public: - virtual RequestHandler* createRequestHandler() = 0; + virtual RequestHandler* createRequestHandler(Net::Connection *connection, int16_t requestId) = 0; virtual ~RequestHandlerFactory() {} }; template class SpecificRequestHandlerFactory : public RequestHandlerFactory { public: - virtual RequestHandler* createRequestHandler() { - return new T(); + virtual RequestHandler* createRequestHandler(Net::Connection *connection, int16_t requestId) { + return new T(connection, requestId); } }; @@ -68,12 +74,12 @@ class RequestManager { std::map requestMaps; bool core; - uint16_t requestId; + uint16_t lastRequestId; std::map requestHandlerFactories; uint16_t getRequestId() { - return requestId+=2; + return lastRequestId+=2; } // Prevent shallow copy @@ -82,6 +88,10 @@ class RequestManager { void receiveHandler(Net::Connection *connection, const Net::Packet &packet); + RequestMap* getUnusedRequestId(Net::Connection *connection, uint16_t *requestId); + + bool send(Request *request); + RequestManager(); public: @@ -94,9 +104,9 @@ class RequestManager { core = newCore; if(core) - requestId &= ~0x01; + lastRequestId &= ~0x01; else - requestId |= 0x01; + lastRequestId |= 0x01; } void registerConnection(Net::Connection *connection); @@ -108,7 +118,90 @@ class RequestManager { void unregisterPacketType(const std::string &type); - bool sendRequest(Net::Connection *connection, std::auto_ptr request); + template + bool sendRequest(Net::Connection *connection, Request::slot_type slot) { + RequestMap *requestMap; + uint16_t requestId; + + requestMap = getUnusedRequestId(connection, &requestId); + + if(!requestMap) + return false; + + Request *request = new T(connection, requestId, slot); + request->sendRequest(); + requestMap->addRequest(requestId, request); + + return true; + } + + template + bool sendRequest(Net::Connection *connection, Request::slot_type slot, T1 t1) { + RequestMap *requestMap; + uint16_t requestId; + + requestMap = getUnusedRequestId(connection, &requestId); + + if(!requestMap) + return false; + + Request *request = new T(connection, requestId, slot, t1); + request->sendRequest(); + requestMap->addRequest(requestId, request); + + return true; + } + + template + bool sendRequest(Net::Connection *connection, Request::slot_type slot, T1 t1, T2 t2) { + RequestMap *requestMap; + uint16_t requestId; + + requestMap = getUnusedRequestId(connection, &requestId); + + if(!requestMap) + return false; + + Request *request = new T(connection, requestId, slot, t1, t2); + request->sendRequest(); + requestMap->addRequest(requestId, request); + + return true; + } + + template + bool sendRequest(Net::Connection *connection, Request::slot_type slot, T1 t1, T2 t2, T3 t3) { + RequestMap *requestMap; + uint16_t requestId; + + requestMap = getUnusedRequestId(connection, &requestId); + + if(!requestMap) + return false; + + Request *request = new T(connection, requestId, slot, t1, t2, t3); + request->sendRequest(); + requestMap->addRequest(requestId, request); + + return true; + } + + template + bool sendRequest(Net::Connection *connection, Request::slot_type slot, T1 t1, T2 t2, T3 t3, T4 t4) { + RequestMap *requestMap; + uint16_t requestId; + + requestMap = getUnusedRequestId(connection, &requestId); + + if(!requestMap) + return false; + + Request *request = new T(connection, requestId, slot, t1, t2, t3, t4); + request->sendRequest(); + requestMap->addRequest(requestId, request); + + return true; + } virtual ~RequestManager(); }; -- cgit v1.2.3