From f5df6f9a745eaf01f8a545855eee602423711c7f Mon Sep 17 00:00:00 2001 From: Adam Malinowski Date: Thu, 3 Jul 2014 11:26:05 +0200 Subject: [PATCH] Add response deserialization Change-Id: Id3bb97e5cc590aa9ef3757b503d423e2c3c9a99f --- src/common/protocol/ProtocolClient.cpp | 31 +++++++++++++++++++++++++++++-- src/common/protocol/ProtocolClient.h | 2 ++ src/common/response/CheckResponse.h | 3 ++- src/common/response/Response.h | 11 ++++++++++- src/service/logic/Logic.cpp | 2 +- 5 files changed, 44 insertions(+), 5 deletions(-) diff --git a/src/common/protocol/ProtocolClient.cpp b/src/common/protocol/ProtocolClient.cpp index 2671eb7..9369b54 100644 --- a/src/common/protocol/ProtocolClient.cpp +++ b/src/common/protocol/ProtocolClient.cpp @@ -49,9 +49,11 @@ ProtocolPtr ProtocolClient::clone(void) { RequestPtr ProtocolClient::deserializeCheckRequest(ProtocolFrameHeader &frame) { std::string clientId, userId, privilegeId; + ProtocolDeserialization::deserialize(frame, clientId); ProtocolDeserialization::deserialize(frame, userId); ProtocolDeserialization::deserialize(frame, privilegeId); + return std::make_shared(PolicyKey(clientId, userId, privilegeId), frame.sequenceNumber()); } @@ -76,9 +78,34 @@ RequestPtr ProtocolClient::extractRequestFromBuffer(BinaryQueue &bufferQueue) { return nullptr; } +ResponsePtr ProtocolClient::deserializeCheckResponse(ProtocolFrameHeader &frame) { + PolicyType result; + PolicyResult::PolicyMetadata additionalInfo; + + ProtocolDeserialization::deserialize(frame, result); + ProtocolDeserialization::deserialize(frame, additionalInfo); + + return std::make_shared(PolicyResult(result, additionalInfo), frame.sequenceNumber()); +} + ResponsePtr ProtocolClient::extractResponseFromBuffer(BinaryQueue &bufferQueue) { - TODO_USE_ME(bufferQueue); - return ResponsePtr(nullptr); + ProtocolFrameSerializer::deserializeHeader(m_frameHeader, bufferQueue); + + if (m_frameHeader.isFrameComplete()) { + ProtocolOpCode requestId; + + m_frameHeader.resetState(); + ProtocolDeserialization::deserialize(m_frameHeader, requestId); + switch (requestId) { + case OpCheckPolicy: + return deserializeCheckResponse(m_frameHeader); + default: + throw InvalidProtocolException(InvalidProtocolException::WrongOpCode); + break; + } + } + + return nullptr; } void ProtocolClient::execute(RequestContextPtr context, CheckRequestPtr request) { diff --git a/src/common/protocol/ProtocolClient.h b/src/common/protocol/ProtocolClient.h index 1cd608b..5f20547 100644 --- a/src/common/protocol/ProtocolClient.h +++ b/src/common/protocol/ProtocolClient.h @@ -25,6 +25,7 @@ #include #include +#include #include "Protocol.h" @@ -44,6 +45,7 @@ public: private: RequestPtr deserializeCheckRequest(ProtocolFrameHeader &frame); + ResponsePtr deserializeCheckResponse(ProtocolFrameHeader &frame); }; } // namespace Cynara diff --git a/src/common/response/CheckResponse.h b/src/common/response/CheckResponse.h index 0cb1182..7d3ebc4 100644 --- a/src/common/response/CheckResponse.h +++ b/src/common/response/CheckResponse.h @@ -35,7 +35,8 @@ class CheckResponse : public Response { public: const PolicyResult &m_resultRef; - CheckResponse(const PolicyResult &result) : m_resultRef(result) { + CheckResponse(const PolicyResult &result, ProtocolFrameSequenceNumber sequenceNumber) : + Response(sequenceNumber), m_resultRef(result) { } virtual ~CheckResponse() = default; diff --git a/src/common/response/Response.h b/src/common/response/Response.h index 31d66bc..e85de48 100644 --- a/src/common/response/Response.h +++ b/src/common/response/Response.h @@ -25,16 +25,25 @@ #include #include +#include namespace Cynara { class Response { public: - Response() = default; + Response(ProtocolFrameSequenceNumber sequenceNumber) : m_sequenceNumber(sequenceNumber) { + }; virtual ~Response() = default; virtual void execute(ResponsePtr self, ResponseTakerPtr taker, RequestContextPtr context) const = 0; + + ProtocolFrameSequenceNumber sequenceNumber(void) const { + return m_sequenceNumber; + } + +private: + ProtocolFrameSequenceNumber m_sequenceNumber; }; } // namespace Cynara diff --git a/src/service/logic/Logic.cpp b/src/service/logic/Logic.cpp index 98d7d05..a4de76b 100644 --- a/src/service/logic/Logic.cpp +++ b/src/service/logic/Logic.cpp @@ -42,7 +42,7 @@ Logic::~Logic() { void Logic::execute(RequestContextPtr context, CheckRequestPtr request) { PolicyResult result(PredefinedPolicyType::DENY); if (check(context, request->key(), result)) { - context->returnResponse(context, std::make_shared(result)); + context->returnResponse(context, std::make_shared(result, request->sequenceNumber())); } } -- 2.7.4