summaryrefslogtreecommitdiffstats
path: root/src/Common/RequestManager.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/Common/RequestManager.h')
-rw-r--r--src/Common/RequestManager.h117
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();
};