diff options
Diffstat (limited to 'src/Common/RequestManager.h')
-rw-r--r-- | src/Common/RequestManager.h | 158 |
1 files changed, 40 insertions, 118 deletions
diff --git a/src/Common/RequestManager.h b/src/Common/RequestManager.h index bd1c12d..07a7c05 100644 --- a/src/Common/RequestManager.h +++ b/src/Common/RequestManager.h @@ -21,7 +21,6 @@ #define MAD_COMMON_REQUESTMANAGER_H_ #include "Request.h" -#include <Net/ThreadManager.h> #include <map> #include <memory> @@ -40,29 +39,49 @@ namespace Common { class RequestManager : boost::noncopyable { private: - class RequestMap : private std::map<boost::uint16_t, boost::shared_ptr<RequestHandler> >, boost::noncopyable { - public: - bool addRequest(boost::uint16_t id, boost::shared_ptr<RequestHandler> info); - boost::shared_ptr<RequestHandler> findRequest(boost::uint16_t id); - void deleteRequest(boost::uint16_t id); + friend class RequestHandler; + class RequestMap : private boost::noncopyable { private: - void doDeleteRequest(boost::uint16_t id); + typedef std::map<boost::uint16_t, boost::shared_ptr<RequestHandler> > IdMap; + typedef std::map<const RequestHandler*, std::pair<Connection*, boost::uint16_t> > HandlerMap; + + std::map<Connection*, IdMap> connectionMap; + HandlerMap handlerMap; + + public: + void registerConnection(Connection *connection) { + connectionMap.insert(std::make_pair(connection, IdMap())); + } + + void unregisterConnection(Connection *connection); + + bool isConnectionRegistered(Connection *connection) const { + return connectionMap.count(connection); + } + + bool addRequest(Connection *con, boost::uint16_t id, boost::shared_ptr<RequestHandler> info); + boost::shared_ptr<RequestHandler> findRequest(Connection *con, boost::uint16_t id); + void deleteRequest(Connection *con, boost::uint16_t id); + + std::pair<Connection*, boost::uint16_t> getRequestInfo(const RequestHandler *requestHandler); }; + + class RequestHandlerFactory { protected: RequestHandlerFactory() {} public: - virtual boost::shared_ptr<RequestHandler> createRequestHandler(Connection *connection, boost::uint16_t requestId) = 0; + virtual boost::shared_ptr<RequestHandler> createRequestHandler() = 0; virtual ~RequestHandlerFactory() {} }; template<class T> class SpecificRequestHandlerFactory : public RequestHandlerFactory { public: - virtual boost::shared_ptr<RequestHandler> createRequestHandler(Connection *connection, boost::uint16_t requestId) { - return boost::shared_ptr<RequestHandler>(new T(connection, requestId)); + virtual boost::shared_ptr<RequestHandler> createRequestHandler() { + return boost::shared_ptr<RequestHandler>(new T()); } }; @@ -70,7 +89,8 @@ class RequestManager : boost::noncopyable { boost::shared_mutex mutex; - std::map<Connection*, boost::shared_ptr<RequestMap> > requestMaps; + RequestMap requestMap; + bool server; boost::uint16_t lastRequestId; @@ -80,9 +100,14 @@ class RequestManager : boost::noncopyable { return lastRequestId+=2; } - void receiveHandler(Connection *connection, const XmlPacket &packet, boost::uint16_t requestId); + void receiveHandler(Connection *connection, boost::shared_ptr<const XmlPacket> packet, boost::uint16_t requestId); + + void handleRequestFinished(Connection *con, boost::uint16_t requestId) { + boost::lock_guard<boost::shared_mutex> lock(mutex); + requestMap.deleteRequest(con, requestId); + } - boost::shared_ptr<RequestMap> _getUnusedRequestId(Connection *connection, boost::uint16_t *requestId); + boost::uint16_t _getUnusedRequestId(Connection *connection); bool send(Request *request); @@ -113,7 +138,7 @@ class RequestManager : boost::noncopyable { void unregisterConnection(Connection *connection) { boost::lock_guard<boost::shared_mutex> lock(mutex); - requestMaps.erase(connection); + requestMap.unregisterConnection(connection); } template <class T> void registerPacketType(const std::string &type) { @@ -126,110 +151,7 @@ class RequestManager : boost::noncopyable { requestHandlerFactories.erase(type); } - template <class T> - boost::shared_ptr<Request> sendRequest0(Connection *connection, Request::slot_type slot = Request::empty_slot) { - boost::unique_lock<boost::shared_mutex> lock(mutex); - - boost::shared_ptr<RequestMap> requestMap; - boost::uint16_t requestId; - - requestMap = _getUnusedRequestId(connection, &requestId); - - if(!requestMap) - return boost::shared_ptr<Request>(); - - boost::shared_ptr<Request> request(new T(connection, requestId, slot)); - requestMap->addRequest(requestId, request); - lock.unlock(); - - Net::ThreadManager::get()->pushWork(boost::bind(&Request::sendRequest, request)); - - return request; - } - - template <class T, typename T1> - boost::shared_ptr<Request> sendRequest1(Connection *connection, T1 t1, Request::slot_type slot = Request::empty_slot) { - boost::unique_lock<boost::shared_mutex> lock(mutex); - - boost::shared_ptr<RequestMap> requestMap; - boost::uint16_t requestId; - - requestMap = _getUnusedRequestId(connection, &requestId); - - if(!requestMap) - return boost::shared_ptr<Request>(); - - boost::shared_ptr<Request> request(new T(connection, requestId, slot, t1)); - requestMap->addRequest(requestId, request); - lock.unlock(); - - Net::ThreadManager::get()->pushWork(boost::bind(&Request::sendRequest, request)); - - return request; - } - - template <class T, typename T1, typename T2> - boost::shared_ptr<Request> sendRequest2(Connection *connection, T1 t1, T2 t2, Request::slot_type slot = Request::empty_slot) { - boost::unique_lock<boost::shared_mutex> lock(mutex); - - boost::shared_ptr<RequestMap> requestMap; - boost::uint16_t requestId; - - requestMap = _getUnusedRequestId(connection, &requestId); - - if(!requestMap) - return boost::shared_ptr<Request>(); - - boost::shared_ptr<Request> request(new T(connection, requestId, slot, t1, t2)); - requestMap->addRequest(requestId, request); - lock.unlock(); - - Net::ThreadManager::get()->pushWork(boost::bind(&Request::sendRequest, request)); - - return request; - } - - template <class T, typename T1, typename T2, typename T3> - boost::shared_ptr<Request> sendRequest3(Connection *connection, T1 t1, T2 t2, T3 t3, Request::slot_type slot = Request::empty_slot) { - boost::unique_lock<boost::shared_mutex> lock(mutex); - - boost::shared_ptr<RequestMap> requestMap; - boost::uint16_t requestId; - - requestMap = _getUnusedRequestId(connection, &requestId); - - if(!requestMap) - return boost::shared_ptr<Request>(); - - boost::shared_ptr<T> request(new T(connection, requestId, slot, t1, t2, t3)); - requestMap->addRequest(requestId, request); - lock.unlock(); - - Net::ThreadManager::get()->pushWork(boost::bind(&Request::sendRequest, request)); - - return request; - } - - template <class T, typename T1, typename T2, typename T3, typename T4> - boost::shared_ptr<Request> sendRequest4(Connection *connection, T1 t1, T2 t2, T3 t3, T4 t4, Request::slot_type slot = Request::empty_slot) { - boost::unique_lock<boost::shared_mutex> lock(mutex); - - boost::shared_ptr<RequestMap> requestMap; - boost::uint16_t requestId; - - requestMap = _getUnusedRequestId(connection, &requestId); - - if(!requestMap) - return boost::shared_ptr<Request>(); - - boost::shared_ptr<Request> request(new T(connection, requestId, slot, t1, t2, t3, t4)); - requestMap->addRequest(requestId, request); - lock.unlock(); - - Net::ThreadManager::get()->pushWork(boost::bind(&Request::sendRequest, request)); - - return request; - } + bool sendRequest(Connection *connection, boost::shared_ptr<Request> request); }; } |