summaryrefslogtreecommitdiffstats
path: root/src/Common/RequestHandlers/SimpleRequestHandlerGroup.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Common/RequestHandlers/SimpleRequestHandlerGroup.cpp')
-rw-r--r--src/Common/RequestHandlers/SimpleRequestHandlerGroup.cpp41
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));
}
}