Add response deserialization
authorAdam Malinowski <a.malinowsk2@partner.samsung.com>
Thu, 3 Jul 2014 09:26:05 +0000 (11:26 +0200)
committerRafal Krypa <r.krypa@samsung.com>
Thu, 3 Jul 2014 12:19:11 +0000 (14:19 +0200)
Change-Id: Id3bb97e5cc590aa9ef3757b503d423e2c3c9a99f

src/common/protocol/ProtocolClient.cpp
src/common/protocol/ProtocolClient.h
src/common/response/CheckResponse.h
src/common/response/Response.h
src/service/logic/Logic.cpp

index 2671eb7..9369b54 100644 (file)
@@ -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<CheckRequest>(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<CheckResponse>(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) {
index 1cd608b..5f20547 100644 (file)
@@ -25,6 +25,7 @@
 
 #include <protocol/ProtocolFrameHeader.h>
 #include <request/pointers.h>
+#include <response/pointers.h>
 
 #include "Protocol.h"
 
@@ -44,6 +45,7 @@ public:
 
 private:
     RequestPtr deserializeCheckRequest(ProtocolFrameHeader &frame);
+    ResponsePtr deserializeCheckResponse(ProtocolFrameHeader &frame);
 };
 
 } // namespace Cynara
index 0cb1182..7d3ebc4 100644 (file)
@@ -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;
index 31d66bc..e85de48 100644 (file)
 
 #include <response/pointers.h>
 #include <response/ResponseTaker.h>
+#include <types/ProtocolFields.h>
 
 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
index 98d7d05..a4de76b 100644 (file)
@@ -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<CheckResponse>(result));
+        context->returnResponse(context, std::make_shared<CheckResponse>(result, request->sequenceNumber()));
     }
 }