diff options
author | Matthias Schiffer <matthias@gamezock.de> | 2008-07-09 01:27:56 +0200 |
---|---|---|
committer | Matthias Schiffer <matthias@gamezock.de> | 2008-07-09 01:27:56 +0200 |
commit | a0f9826c9f02909bc87e1a1d92eea1dca85f2ebc (patch) | |
tree | ca5b4728a755833f58c29ec2ce1306a6fdb4a750 /src/Common | |
parent | 1508969d508e41de824d1d1227be708136760cfa (diff) | |
download | mad-a0f9826c9f02909bc87e1a1d92eea1dca85f2ebc.tar mad-a0f9826c9f02909bc87e1a1d92eea1dca85f2ebc.zip |
Kern und D?monen/Clients benutzen jetzt unterscheidbare Request IDs; au?erdem ein paar Bugfixes am Request-Code
Diffstat (limited to 'src/Common')
-rw-r--r-- | src/Common/RequestManager.cpp | 20 | ||||
-rw-r--r-- | src/Common/RequestManager.h | 42 |
2 files changed, 45 insertions, 17 deletions
diff --git a/src/Common/RequestManager.cpp b/src/Common/RequestManager.cpp index 2d79b25..86d3529 100644 --- a/src/Common/RequestManager.cpp +++ b/src/Common/RequestManager.cpp @@ -25,23 +25,23 @@ namespace Mad { namespace Common { void RequestManager::receiveHandler(Net::Connection *connection, const Net::Packet &packet) { - std::map<Net::Connection*,RequestMap>::iterator it = requestMap.find(connection); + std::map<Net::Connection*,RequestMap*>::iterator it = requestMaps.find(connection); - if(it == requestMap.end()) { + if(it == requestMaps.end()) { // TODO: Error std::cerr << "Received a packet from a unregistered connection." << std::endl; return; } - RequestMap &requestInfo = it->second; - Request::Request *request = requestInfo.findRequest(packet.getRequestId()); + RequestMap *requestMap = it->second; + Request::Request *request = requestMap->findRequest(packet.getRequestId()); if(request) { request->handlePacket(connection, packet); if(request->isFinished()) - requestInfo.deleteRequest(packet.getRequestId()); + requestMap->deleteRequest(packet.getRequestId()); return; } @@ -63,22 +63,22 @@ void RequestManager::receiveHandler(Net::Connection *connection, const Net::Pack } bool RequestManager::sendRequest(Net::Connection *connection, Request::Request *request) { - std::map<Net::Connection*,RequestMap>::iterator it = requestMap.find(connection); + std::map<Net::Connection*,RequestMap*>::iterator it = requestMaps.find(connection); - if(it == requestMap.end()) + if(it == requestMaps.end()) return false; - RequestMap &requestInfo = it->second; + RequestMap *requestMap = it->second; unsigned short id; do { id = getRequestId(); - } while(requestInfo.findRequest(id)); + } while(requestMap->findRequest(id)); if(!request->sendRequest(connection, id)) return false; - requestInfo.addRequest(id, request); + requestMap->addRequest(id, request); return true; } 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<unsigned short,Request::Request*> { + 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<Net::Connection*,RequestMap> requestMap; + // Prevent shallow copy + RequestManager(const RequestManager &o); + RequestManager& operator=(const RequestManager &o); + + std::map<Net::Connection*,RequestMap*> 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<Net::Connection*,RequestMap*>::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<Net::Connection*,RequestMap*>::iterator it = requestMaps.begin(); it != requestMaps.end(); ++it) + delete it->second; + } }; } |