diff options
Diffstat (limited to 'src/Common/RequestHandlers/SimpleRequestHandlerGroup.cpp')
-rw-r--r-- | src/Common/RequestHandlers/SimpleRequestHandlerGroup.cpp | 41 |
1 files changed, 38 insertions, 3 deletions
diff --git a/src/Common/RequestHandlers/SimpleRequestHandlerGroup.cpp b/src/Common/RequestHandlers/SimpleRequestHandlerGroup.cpp index 9c80e23..845021d 100644 --- a/src/Common/RequestHandlers/SimpleRequestHandlerGroup.cpp +++ b/src/Common/RequestHandlers/SimpleRequestHandlerGroup.cpp @@ -20,17 +20,52 @@ #include "SimpleRequestHandlerGroup.h" #include "SimpleRequestHandler.h" +#include <Core/Exception.h> + namespace Mad { namespace Common { namespace RequestHandlers { -boost::shared_ptr<RequestHandler> SimpleRequestHandlerGroup::createRequestHandler(const std::string &type) { - std::map<std::string, boost::function2<void, boost::shared_ptr<const XmlPacket>, XmlPacket*> >::iterator handler = handlers.find(type); +void SimpleRequestHandlerGroup::GroupRequestHandler::handlePacket(boost::shared_ptr<const XmlPacket> packet) { + if(packet->getType() != type) { + getApplication()->log(Core::LoggerBase::ERROR, "Received an unexpected packet."); + + XmlPacket ret; + ret.setType("Error"); + ret.add("ErrorCode", Core::Exception::UNEXPECTED_PACKET); + + sendPacket(ret); + + signalFinished(); + return; + } + + // TODO Require authentication + + XmlPacket ret; + + try { + handler(packet, &ret, getConnection()); + } + catch(Core::Exception e) { + ret.setType("Error"); + ret.add("ErrorCode", e.getErrorCode()); + ret.add("SubCode", e.getSubCode()); + ret.add("SubSubCode", e.getSubSubCode()); + ret.add("Where", e.getWhere()); + } + + sendPacket(ret); + signalFinished(); +} + +boost::shared_ptr<RequestHandler> SimpleRequestHandlerGroup::createRequestHandler(Application *application, const std::string &type) { + std::map<std::string, boost::function3<void, boost::shared_ptr<const XmlPacket>, XmlPacket*, Connection*> >::iterator handler = handlers.find(type); if(handler == handlers.end()) return boost::shared_ptr<RequestHandler>(); else - return boost::shared_ptr<SimpleRequestHandler>(new SimpleRequestHandler(type, handler->second)); + return boost::shared_ptr<GroupRequestHandler>(new GroupRequestHandler(application, type, handler->second)); } } |