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.h42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/Common/RequestManager.h b/src/Common/RequestManager.h
index c2f58d2..00d940d 100644
--- a/src/Common/RequestManager.h
+++ b/src/Common/RequestManager.h
@@ -30,6 +30,8 @@ namespace Common {
class RequestBase;
class RequestHandler;
+class XmlRequestBase;
+class XmlRequestHandler;
class RequestManager {
private:
@@ -48,6 +50,21 @@ class RequestManager {
bool deleteRequest(uint16_t id);
};
+ class XmlRequestMap : private std::map<uint16_t,XmlRequestHandler*> {
+ private:
+ // Prevent shallow copy
+ XmlRequestMap(const XmlRequestMap &o);
+ XmlRequestMap& operator=(const XmlRequestMap &o);
+
+ public:
+ XmlRequestMap() {}
+ ~XmlRequestMap();
+
+ bool addRequest(uint16_t id, XmlRequestHandler *info);
+ XmlRequestHandler* findRequest(uint16_t id);
+ bool deleteRequest(uint16_t id);
+ };
+
class RequestHandlerFactory {
protected:
RequestHandlerFactory() {}
@@ -64,13 +81,31 @@ class RequestManager {
}
};
+ class XmlRequestHandlerFactory {
+ protected:
+ XmlRequestHandlerFactory() {}
+
+ public:
+ virtual XmlRequestHandler* createRequestHandler() = 0;
+ virtual ~XmlRequestHandlerFactory() {}
+ };
+
+ template<class T> class SpecificXmlRequestHandlerFactory : public XmlRequestHandlerFactory {
+ public:
+ virtual XmlRequestHandler* createRequestHandler() {
+ return new T();
+ }
+ };
+
static RequestManager requestManager;
std::map<Net::Connection*,RequestMap*> requestMaps;
+ std::map<Net::Connection*,XmlRequestMap*> xmlRequestMaps;
bool core;
uint16_t requestId;
std::map<Net::Packet::Type,RequestHandlerFactory*> requestHandlerFactories;
+ std::map<std::string,XmlRequestHandlerFactory*> xmlRequestHandlerFactories;
uint16_t getRequestId() {
return requestId+=2;
@@ -108,7 +143,14 @@ class RequestManager {
void unregisterPacketType(Net::Packet::Type type);
+ template <class T> void registerPacketType(const std::string &type) {
+ xmlRequestHandlerFactories.insert(std::make_pair(type, new SpecificXmlRequestHandlerFactory<T>()));
+ }
+
+ void unregisterPacketType(const std::string &type);
+
bool sendRequest(Net::Connection *connection, std::auto_ptr<RequestBase> request);
+ bool sendRequest(Net::Connection *connection, std::auto_ptr<XmlRequestBase> request);
virtual ~RequestManager();
};