From a0f9826c9f02909bc87e1a1d92eea1dca85f2ebc Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Wed, 9 Jul 2008 01:27:56 +0200 Subject: Kern und D?monen/Clients benutzen jetzt unterscheidbare Request IDs; au?erdem ein paar Bugfixes am Request-Code --- src/Common/RequestManager.h | 42 +++++++++++++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 7 deletions(-) (limited to 'src/Common/RequestManager.h') diff --git a/src/Common/RequestManager.h b/src/Common/RequestManager.h index fde8f3e..543fb83 100644 --- a/src/Common/RequestManager.h +++ b/src/Common/RequestManager.h @@ -30,7 +30,14 @@ namespace Common { class RequestManager { private: class RequestMap : private std::map { + private: + // Prevent shallow copy + RequestMap(const RequestMap &o); + RequestMap& operator=(const RequestMap &o); + public: + RequestMap() {} + ~RequestMap() { for(iterator it = begin(); it != end(); ++it) delete it->second; @@ -49,35 +56,56 @@ class RequestManager { } bool deleteRequest(unsigned short id) { - return erase(id); + iterator it = find(id); + if(it == end()) + return false; + + delete it->second; + + erase(it); + return true; } }; - std::map requestMap; + // Prevent shallow copy + RequestManager(const RequestManager &o); + RequestManager& operator=(const RequestManager &o); + + std::map requestMaps; unsigned short requestId; unsigned short getRequestId() { - return requestId++; + return requestId+=2; } void receiveHandler(Net::Connection *connection, const Net::Packet &packet); public: void registerConnection(Net::Connection *connection) { - requestMap.insert(std::make_pair(connection, RequestMap())); + requestMaps.insert(std::make_pair(connection, new RequestMap())); connection->signalReceive().connect(sigc::mem_fun(this, &RequestManager::receiveHandler)); } void unregisterConnection(Net::Connection *connection) { - requestMap.erase(connection); + std::map::iterator it = requestMaps.find(connection); + + if(it == requestMaps.end()) + return; + + delete it->second; + + requestMaps.erase(it); } bool sendRequest(Net::Connection *connection, Request::Request *request); - RequestManager() : requestId(0) {} + RequestManager(bool core) : requestId(core ? -2 : -1) {} - virtual ~RequestManager() {} + virtual ~RequestManager() { + for(std::map::iterator it = requestMaps.begin(); it != requestMaps.end(); ++it) + delete it->second; + } }; } -- cgit v1.2.3