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