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.h48
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;
}
};