summaryrefslogtreecommitdiffstats
path: root/src/Common/RequestManager.cpp
diff options
context:
space:
mode:
authorMatthias Schiffer <matthias@gamezock.de>2009-02-23 22:20:10 +0100
committerMatthias Schiffer <matthias@gamezock.de>2009-02-23 22:20:10 +0100
commit8d629ca48e9b5530416127e2e52c945fe1f9ee52 (patch)
tree11fd1e27349343110dd041f177822cdf85af3710 /src/Common/RequestManager.cpp
parent0a8624a39a7d0a99963153533a7ca3092154d3bd (diff)
downloadmad-8d629ca48e9b5530416127e2e52c945fe1f9ee52.tar
mad-8d629ca48e9b5530416127e2e52c945fe1f9ee52.zip
Verarbeitung von XML-Paketen
Diffstat (limited to 'src/Common/RequestManager.cpp')
-rw-r--r--src/Common/RequestManager.cpp120
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;
}
}