diff options
Diffstat (limited to 'src/Common/RequestManager.cpp')
-rw-r--r-- | src/Common/RequestManager.cpp | 120 |
1 files changed, 116 insertions, 4 deletions
diff --git a/src/Common/RequestManager.cpp b/src/Common/RequestManager.cpp index d852f5d..94b3da9 100644 --- a/src/Common/RequestManager.cpp +++ b/src/Common/RequestManager.cpp @@ -19,6 +19,8 @@ #include "RequestManager.h" #include "Request.h" +#include "XmlRequest.h" +#include "XmlPacket.h" #include "RequestHandlers/DisconnectRequestHandler.h" #include "Logger.h" @@ -67,6 +69,40 @@ bool RequestManager::RequestMap::deleteRequest(uint16_t id) { } +RequestManager::XmlRequestMap::~XmlRequestMap() { + for(iterator it = begin(); it != end(); ++it) + delete it->second; +} + +bool RequestManager::XmlRequestMap::addRequest(uint16_t id, XmlRequestHandler *info) { + if(!insert(std::make_pair(id, info)).second) + return false; + + info->signalFinished().connect(sigc::hide_return(sigc::bind(sigc::mem_fun(this, &RequestManager::XmlRequestMap::deleteRequest), id))); + + return true; +} + +XmlRequestHandler* RequestManager::XmlRequestMap::findRequest(uint16_t id) { + iterator it = find(id); + if(it == end()) + return 0; + + return it->second; +} + +bool RequestManager::XmlRequestMap::deleteRequest(uint16_t id) { + iterator it = find(id); + if(it == end()) + return false; + + delete it->second; + + erase(it); + return true; +} + + void RequestManager::receiveHandler(Net::Connection *connection, const Net::Packet &packet) { std::map<Net::Connection*,RequestMap*>::iterator it = requestMaps.find(connection); @@ -86,6 +122,37 @@ void RequestManager::receiveHandler(Net::Connection *connection, const Net::Pack return; } + std::map<Net::Connection*,XmlRequestMap*>::iterator it2 = xmlRequestMaps.find(connection); + if(it2 == xmlRequestMaps.end()) { + // TODO: Error + Logger::log(Logger::ERROR, "Received a packet from an unregistered connection."); + + return; + } + + XmlRequestMap *xmlRequestMap = it2->second; + XmlRequestHandler *xmlRequest = xmlRequestMap->findRequest(packet.getRequestId()); + + if(xmlRequest) { + XmlPacket xmlPacket(packet); + xmlRequest->handlePacket(connection, xmlPacket); + + return; + } + + if(packet.getType() == Net::Packet::XML) { + XmlPacket xmlPacket(packet); + + std::map<std::string,XmlRequestHandlerFactory*>::iterator factoryIt = xmlRequestHandlerFactories.find(xmlPacket.getType()); + if(factoryIt != xmlRequestHandlerFactories.end()) { + xmlRequest = factoryIt->second->createRequestHandler(); + xmlRequestMap->addRequest(packet.getRequestId(), xmlRequest); + xmlRequest->handlePacket(connection, xmlPacket); + + return; + } + } + std::map<Net::Packet::Type,RequestHandlerFactory*>::iterator factoryIt = requestHandlerFactories.find(packet.getType()); if(factoryIt != requestHandlerFactories.end()) { request = factoryIt->second->createRequestHandler(); @@ -121,8 +188,31 @@ bool RequestManager::sendRequest(Net::Connection *connection, std::auto_ptr<Requ return true; } +bool RequestManager::sendRequest(Net::Connection *connection, std::auto_ptr<XmlRequestBase> request) { + std::map<Net::Connection*,XmlRequestMap*>::iterator it = xmlRequestMaps.find(connection); + + if(it == xmlRequestMaps.end()) { + Logger::log(Logger::CRITICAL, "Trying to send a request over an unregistered connecion."); + return false; + } + + XmlRequestMap *requestMap = it->second; + + uint16_t id; + do { + id = getRequestId(); + } while(requestMap->findRequest(id)); + + request->sendRequest(connection, id); + + requestMap->addRequest(id, request.release()); + + return true; +} + void RequestManager::registerConnection(Net::Connection *connection) { requestMaps.insert(std::make_pair(connection, new RequestMap())); + xmlRequestMaps.insert(std::make_pair(connection, new XmlRequestMap())); connection->signalReceive().connect(sigc::mem_fun(this, &RequestManager::receiveHandler)); } @@ -130,12 +220,17 @@ void RequestManager::registerConnection(Net::Connection *connection) { void RequestManager::unregisterConnection(Net::Connection *connection) { std::map<Net::Connection*,RequestMap*>::iterator it = requestMaps.find(connection); - if(it == requestMaps.end()) - return; + if(it != requestMaps.end()) { + delete it->second; + requestMaps.erase(it); + } - delete it->second; + std::map<Net::Connection*,XmlRequestMap*>::iterator it2 = xmlRequestMaps.find(connection); - requestMaps.erase(it); + if(it2 != xmlRequestMaps.end()) { + delete it2->second; + xmlRequestMaps.erase(it2); + } } void RequestManager::unregisterPacketType(Net::Packet::Type type) { @@ -149,6 +244,17 @@ void RequestManager::unregisterPacketType(Net::Packet::Type type) { requestHandlerFactories.erase(it); } +void RequestManager::unregisterPacketType(const std::string &type) { + std::map<std::string,XmlRequestHandlerFactory*>::iterator it = xmlRequestHandlerFactories.find(type); + + if(it == xmlRequestHandlerFactories.end()) + return; + + delete it->second; + + xmlRequestHandlerFactories.erase(it); +} + RequestManager::RequestManager() : core(false), requestId(-1) { registerPacketType<RequestHandlers::DisconnectRequestHandler>(Net::Packet::DISCONNECT); } @@ -159,8 +265,14 @@ RequestManager::~RequestManager() { for(std::map<Net::Connection*,RequestMap*>::iterator it = requestMaps.begin(); it != requestMaps.end(); ++it) delete it->second; + for(std::map<Net::Connection*,XmlRequestMap*>::iterator it = xmlRequestMaps.begin(); it != xmlRequestMaps.end(); ++it) + delete it->second; + for(std::map<Net::Packet::Type,RequestHandlerFactory*>::iterator it = requestHandlerFactories.begin(); it != requestHandlerFactories.end(); ++it) delete it->second; + + for(std::map<std::string,XmlRequestHandlerFactory*>::iterator it = xmlRequestHandlerFactories.begin(); it != xmlRequestHandlerFactories.end(); ++it) + delete it->second; } } |