From 3b6abed6ecf40cdf4c0f7e28074286a8d6fed527 Mon Sep 17 00:00:00 2001 From: Lukasz Wojciechowski Date: Fri, 20 Jun 2014 23:45:37 +0200 Subject: [PATCH] Rearrange classes for request and response processing RequestContext object is the only one passed from SocketManager to Request execute() method. Response object is passed to Protocol through RequestContext::returnResponse(). Response queue is managed automaticaly in RequestContext class. Request derivatives don't need to handle queues. ResponseTaker::appendResponseToBuffer() methods need to take additional queue object as parameter as it is no longer part of response object. Change-Id: I15af84c315a55284d4dccff670537e47c60c6b70 --- src/service/logic/Logic.cpp | 2 +- src/service/logic/Logic.h | 4 +++- src/service/protocol/ResponseTaker.cpp | 3 ++- src/service/protocol/ResponseTaker.h | 4 +++- src/service/request/CheckRequest.cpp | 10 +++++----- src/service/request/CheckRequest.h | 5 +++-- src/service/request/Request.h | 4 ++-- src/service/request/RequestContext.cpp | 12 ++++++++---- src/service/request/RequestContext.h | 15 ++++++++++++--- src/service/response/CheckResponse.h | 5 ++--- src/service/sockets/SocketManager.cpp | 2 +- 11 files changed, 42 insertions(+), 24 deletions(-) diff --git a/src/service/logic/Logic.cpp b/src/service/logic/Logic.cpp index 3b7f54d..df52e9f 100644 --- a/src/service/logic/Logic.cpp +++ b/src/service/logic/Logic.cpp @@ -31,7 +31,7 @@ Logic::Logic() { Logic::~Logic() { } -PolicyResult Logic::check(int sourceDesc UNUSED, const PolicyKey &key UNUSED) { +PolicyResult Logic::check(const RequestContext &context UNUSED, const PolicyKey &key UNUSED) { //todo this is only a stub return PolicyResult(PredefinedPolicyType::ALLOW); } diff --git a/src/service/logic/Logic.h b/src/service/logic/Logic.h index a487ac7..3f8626f 100644 --- a/src/service/logic/Logic.h +++ b/src/service/logic/Logic.h @@ -26,6 +26,8 @@ #include #include +#include + namespace Cynara { class Logic { @@ -33,7 +35,7 @@ public: Logic(); ~Logic(); - PolicyResult check(int sourceDesc, const PolicyKey &key); + PolicyResult check(const RequestContext &context, const PolicyKey &key); }; } // namespace Cynara diff --git a/src/service/protocol/ResponseTaker.cpp b/src/service/protocol/ResponseTaker.cpp index b5fb6ac..9ce248a 100644 --- a/src/service/protocol/ResponseTaker.cpp +++ b/src/service/protocol/ResponseTaker.cpp @@ -28,7 +28,8 @@ namespace Cynara { -void ResponseTaker::appendResponseToBuffer(CheckResponse &&response UNUSED) { +void ResponseTaker::appendResponseToBuffer(BinaryQueue &queue UNUSED, + CheckResponse &&response UNUSED) { throw NotImplementedException(); } diff --git a/src/service/protocol/ResponseTaker.h b/src/service/protocol/ResponseTaker.h index d8a39c5..a4305d9 100644 --- a/src/service/protocol/ResponseTaker.h +++ b/src/service/protocol/ResponseTaker.h @@ -23,6 +23,8 @@ #ifndef SRC_SERVICE_PROTOCOL_RESPONSETAKER_H_ #define SRC_SERVICE_PROTOCOL_RESPONSETAKER_H_ +#include + #include namespace Cynara { @@ -32,7 +34,7 @@ public: ResponseTaker() = default; virtual ~ResponseTaker() = default; - virtual void appendResponseToBuffer(CheckResponse &&response); + virtual void appendResponseToBuffer(BinaryQueue &queue, CheckResponse &&response); }; } // namespace Cynara diff --git a/src/service/request/CheckRequest.cpp b/src/service/request/CheckRequest.cpp index e5d2295..a7edfef 100644 --- a/src/service/request/CheckRequest.cpp +++ b/src/service/request/CheckRequest.cpp @@ -23,7 +23,8 @@ #include #include -#include +#include +#include
#include #include "CheckRequest.h" @@ -33,10 +34,9 @@ namespace Cynara { CheckRequest::CheckRequest(const PolicyKey &key) : m_key(key) { } -void CheckRequest::execute(Logic *logic, int sourceDesc) { - PolicyResult result = logic->check(sourceDesc, m_key); - BinaryQueue &queue = RequestContext::resultQueue(sourceDesc); - RequestContext::protocol(sourceDesc)->appendResponseToBuffer(CheckResponse(queue, result)); +void CheckRequest::execute(const RequestContext &context) { + PolicyResult result = Cynara::getLogic()->check(context, m_key); + context.returnResponse(CheckResponse(result)); } } // namespace Cynara diff --git a/src/service/request/CheckRequest.h b/src/service/request/CheckRequest.h index d7b28ab..4e1b62c 100644 --- a/src/service/request/CheckRequest.h +++ b/src/service/request/CheckRequest.h @@ -25,7 +25,8 @@ #include -#include "Request.h" +#include +#include namespace Cynara { @@ -37,7 +38,7 @@ public: CheckRequest(const PolicyKey &key); virtual ~CheckRequest() = default; - virtual void execute(Logic *logic, int sourceDesc); + virtual void execute(const RequestContext &context); }; } // namespace Cynara diff --git a/src/service/request/Request.h b/src/service/request/Request.h index 7ab5112..9671510 100644 --- a/src/service/request/Request.h +++ b/src/service/request/Request.h @@ -25,7 +25,7 @@ #include -#include +#include "RequestContext.h" namespace Cynara { @@ -34,7 +34,7 @@ public: Request(); virtual ~Request(); - virtual void execute(Logic *logic, int sourceDesc) = 0; + virtual void execute(const RequestContext &context) = 0; }; typedef std::shared_ptr RequestPtr; diff --git a/src/service/request/RequestContext.cpp b/src/service/request/RequestContext.cpp index fdadea4..9318227 100644 --- a/src/service/request/RequestContext.cpp +++ b/src/service/request/RequestContext.cpp @@ -21,18 +21,22 @@ */ #include
+#include #include #include "RequestContext.h" namespace Cynara { -BinaryQueue &RequestContext::resultQueue(int fd) { - return Cynara::getSocketManager()->descriptor(fd).writeQueue(); +RequestContext::RequestContext(int desc) : m_desc(desc) { } -ProtocolPtr RequestContext::protocol(int fd) { - return Cynara::getSocketManager()->descriptor(fd).protocol(); +ResponseTaker &RequestContext::responseTaker(void) const { + return Cynara::getSocketManager()->descriptor(m_desc).responseTaker(); +} + +BinaryQueue &RequestContext::responseQueue(void) const { + return Cynara::getSocketManager()->descriptor(m_desc).writeQueue(); } } // namespace Cynara diff --git a/src/service/request/RequestContext.h b/src/service/request/RequestContext.h index d026e48..441bf7c 100644 --- a/src/service/request/RequestContext.h +++ b/src/service/request/RequestContext.h @@ -25,15 +25,24 @@ #include -#include +#include namespace Cynara { class RequestContext { +private: + int m_desc; + + ResponseTaker &responseTaker(void) const; + BinaryQueue &responseQueue(void) const; public: - static BinaryQueue &resultQueue(int fd); - static ProtocolPtr protocol(int fd); + RequestContext(int desc); + + template + void returnResponse(T &&response) const { + responseTaker().appendResponseToBuffer(responseQueue(), std::move(response)); + } }; } // namespace Cynara diff --git a/src/service/response/CheckResponse.h b/src/service/response/CheckResponse.h index fdef1a7..69ae983 100644 --- a/src/service/response/CheckResponse.h +++ b/src/service/response/CheckResponse.h @@ -29,11 +29,10 @@ namespace Cynara { struct CheckResponse { - BinaryQueue &m_queueRef; const PolicyResult &m_resultRef; - CheckResponse(BinaryQueue &queue, const PolicyResult &result) - : m_queueRef(queue), m_resultRef(result) {} + CheckResponse(const PolicyResult &result) : m_resultRef(result) { + } }; } // namespace Cynara diff --git a/src/service/sockets/SocketManager.cpp b/src/service/sockets/SocketManager.cpp index 7ce4f08..4d9e425 100644 --- a/src/service/sockets/SocketManager.cpp +++ b/src/service/sockets/SocketManager.cpp @@ -224,7 +224,7 @@ bool SocketManager::handleRead(int fd, const RawBuffer &readbuffer) { LOGD("request extracted"); try { - req->execute(Cynara::getLogic(), fd); + req->execute(fd); if (desc.hasDataToWrite()) addWriteSocket(fd); -- 2.7.4