From 454cfccd51e2b9ad453fe79df04360fcd6eeb742 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 6 Jun 2009 15:01:07 +0200 Subject: User-RequestHandler zur UserRequestHandlerGroup zusammengefasst --- src/Common/RequestManager.h | 50 +++++++++++++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 13 deletions(-) (limited to 'src/Common/RequestManager.h') diff --git a/src/Common/RequestManager.h b/src/Common/RequestManager.h index 07a7c05..e66b0c1 100644 --- a/src/Common/RequestManager.h +++ b/src/Common/RequestManager.h @@ -21,6 +21,7 @@ #define MAD_COMMON_REQUESTMANAGER_H_ #include "Request.h" +#include "RequestHandlerGroup.h" #include #include @@ -69,18 +70,20 @@ class RequestManager : boost::noncopyable { - class RequestHandlerFactory { - protected: - RequestHandlerFactory() {} + template class RequestHandlerFactory : public RequestHandlerGroup { + private: + std::set types; public: - virtual boost::shared_ptr createRequestHandler() = 0; - virtual ~RequestHandlerFactory() {} - }; + RequestHandlerFactory(const std::string &type) { + types.insert(type); + } - template class SpecificRequestHandlerFactory : public RequestHandlerFactory { - public: - virtual boost::shared_ptr createRequestHandler() { + virtual const std::set& getPacketTypes() { + return types; + } + + virtual boost::shared_ptr createRequestHandler(const std::string &type _UNUSED_PARAMETER_) { return boost::shared_ptr(new T()); } }; @@ -94,7 +97,7 @@ class RequestManager : boost::noncopyable { bool server; boost::uint16_t lastRequestId; - std::map > requestHandlerFactories; + std::map > requestHandlerGroups; boost::uint16_t _getRequestId() { return lastRequestId+=2; @@ -141,14 +144,35 @@ class RequestManager : boost::noncopyable { requestMap.unregisterConnection(connection); } - template void registerPacketType(const std::string &type) { + void registerRequestHandlerGroup(boost::shared_ptr requestHandlerGroup) { boost::lock_guard lock(mutex); - requestHandlerFactories.insert(std::make_pair(type, boost::shared_ptr >(new SpecificRequestHandlerFactory()))); + + const std::set &types = requestHandlerGroup->getPacketTypes(); + for(std::set::const_iterator type = types.begin(); type != types.end(); ++type) + requestHandlerGroups.insert(std::make_pair(*type, requestHandlerGroup)); + } + + void unregisterRequestHandlerGroup(boost::shared_ptr requestHandlerGroup) { + boost::lock_guard lock(mutex); + + const std::set &types = requestHandlerGroup->getPacketTypes(); + for(std::set::const_iterator type = types.begin(); type != types.end(); ++type) { + std::map >::iterator it = requestHandlerGroups.find(*type); + + if(it == requestHandlerGroups.end() || it->second != requestHandlerGroup) + continue; + + requestHandlerGroups.erase(it); + } + } + + template void registerPacketType(const std::string &type) { + registerRequestHandlerGroup(boost::shared_ptr >(new RequestHandlerFactory(type))); } void unregisterPacketType(const std::string &type) { boost::lock_guard lock(mutex); - requestHandlerFactories.erase(type); + requestHandlerGroups.erase(type); } bool sendRequest(Connection *connection, boost::shared_ptr request); -- cgit v1.2.3