summaryrefslogtreecommitdiffstats
path: root/src/Common
diff options
context:
space:
mode:
authorMatthias Schiffer <matthias@gamezock.de>2008-07-09 01:27:56 +0200
committerMatthias Schiffer <matthias@gamezock.de>2008-07-09 01:27:56 +0200
commita0f9826c9f02909bc87e1a1d92eea1dca85f2ebc (patch)
treeca5b4728a755833f58c29ec2ce1306a6fdb4a750 /src/Common
parent1508969d508e41de824d1d1227be708136760cfa (diff)
downloadmad-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.cpp20
-rw-r--r--src/Common/RequestManager.h42
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;
+ }
};
}