diff options
author | Matthias Schiffer <matthias@gamezock.de> | 2009-03-16 19:13:42 +0100 |
---|---|---|
committer | Matthias Schiffer <matthias@gamezock.de> | 2009-03-16 19:13:42 +0100 |
commit | 8f098fc3070f791302ec1f497588fab6ed409980 (patch) | |
tree | 6cff9f7bb973342344a22636a5d9ef26c7a0d940 /src/Common/RequestManager.h | |
parent | aef0f2e7a5085b8da3aa2e97565215d182d3dd2d (diff) | |
download | mad-8f098fc3070f791302ec1f497588fab6ed409980.tar mad-8f098fc3070f791302ec1f497588fab6ed409980.zip |
Request- und RequestHandler-Interfaces vereinfacht
Diffstat (limited to 'src/Common/RequestManager.h')
-rw-r--r-- | src/Common/RequestManager.h | 117 |
1 files changed, 105 insertions, 12 deletions
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 <Net/Connection.h> +#include "Request.h" #include <map> #include <memory> +#include <string> + +#include <stdint.h> 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 T> 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<Net::Connection*,RequestMap*> requestMaps; bool core; - uint16_t requestId; + uint16_t lastRequestId; std::map<std::string,RequestHandlerFactory*> 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> request); + template <class T> + 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 <class T, typename T1> + 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 <class T, typename T1, typename T2> + 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 <class T, typename T1, typename T2, typename T3> + 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 <class T, typename T1, typename T2, typename T3, typename T4> + 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(); }; |