diff options
Diffstat (limited to 'src/Common/RequestManager.cpp')
-rw-r--r-- | src/Common/RequestManager.cpp | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/src/Common/RequestManager.cpp b/src/Common/RequestManager.cpp index 8ebfce0..e2864b1 100644 --- a/src/Common/RequestManager.cpp +++ b/src/Common/RequestManager.cpp @@ -21,6 +21,8 @@ #include "Request.h" #include "RequestHandlers/DisconnectRequestHandler.h" +#include <sigc++/bind.h> +#include <sigc++/retype_return.h> #include <iostream> namespace Mad { @@ -29,6 +31,15 @@ namespace Common { std::auto_ptr<RequestManager> RequestManager::requestManager; +bool RequestManager::RequestMap::addRequest(uint16_t id, RequestHandler *info) { + if(!insert(std::make_pair(id, info)).second) + return false; + + info->signalFinished().connect(sigc::hide_return(sigc::bind(sigc::mem_fun(this, &RequestManager::RequestMap::deleteRequest), id))); + + return true; +} + RequestHandler* RequestManager::RequestMap::findRequest(uint16_t id) { iterator it = find(id); if(it == end()) @@ -65,22 +76,15 @@ void RequestManager::receiveHandler(Net::Connection *connection, const Net::Pack if(request) { request->handlePacket(connection, packet); - if(request->isFinished()) - requestMap->deleteRequest(packet.getRequestId()); - return; } std::map<Net::Packet::Type,RequestHandlerFactory*>::iterator factoryIt = requestHandlerFactories.find(packet.getType()); if(factoryIt != requestHandlerFactories.end()) { request = factoryIt->second->createRequestHandler(); + requestMap->addRequest(packet.getRequestId(), request); request->handlePacket(connection, packet); - if(!request->isFinished()) - requestMap->addRequest(packet.getRequestId(), request); - else - delete request; - return; } |