Handle ListResponse by ProtocolAdmin 47/31047/4
authorLukasz Wojciechowski <l.wojciechow@partner.samsung.com>
Sat, 29 Nov 2014 16:22:29 +0000 (17:22 +0100)
committerLukasz Wojciechowski <l.wojciechow@partner.samsung.com>
Wed, 10 Dec 2014 19:05:11 +0000 (20:05 +0100)
Add serialization and deserialization of ListResponse.

Change-Id: I7df388bf105183732d76cc1c37122919ca6d23df

src/common/protocol/ProtocolAdmin.cpp
src/common/protocol/ProtocolAdmin.h
src/common/protocol/ProtocolOpCode.h

index 60341bc..0d646a4 100644 (file)
@@ -36,6 +36,7 @@
 #include <request/SetPoliciesRequest.h>
 #include <response/CheckResponse.h>
 #include <response/CodeResponse.h>
+#include <response/ListResponse.h>
 #include <types/PolicyKey.h>
 
 #include "ProtocolAdmin.h"
@@ -221,6 +222,38 @@ ResponsePtr ProtocolAdmin::deserializeCodeResponse(void) {
                                           m_frameHeader.sequenceNumber());
 }
 
+ResponsePtr ProtocolAdmin::deserializeListResponse(void) {
+    ProtocolFrameFieldsCount policiesCount;
+    PolicyKeyFeature::ValueType client, user, privilege;
+    PolicyType policyType;
+    PolicyResult::PolicyMetadata metadata;
+    std::vector<Policy> policies;
+
+    ProtocolDeserialization::deserialize(m_frameHeader, policiesCount);
+    policies.reserve(policiesCount);
+
+    for (ProtocolFrameFieldsCount p = 0; p < policiesCount; ++p) {
+        // PolicyKey
+        ProtocolDeserialization::deserialize(m_frameHeader, client);
+        ProtocolDeserialization::deserialize(m_frameHeader, user);
+        ProtocolDeserialization::deserialize(m_frameHeader, privilege);
+        // PolicyResult
+        ProtocolDeserialization::deserialize(m_frameHeader, policyType);
+        ProtocolDeserialization::deserialize(m_frameHeader, metadata);
+
+        policies.push_back(Policy(PolicyKey(client, user, privilege),
+                                        PolicyResult(policyType, metadata)));
+    }
+
+    bool isBucketValid;
+    ProtocolDeserialization::deserialize(m_frameHeader, isBucketValid);
+
+    LOGD("Deserialized ListResponse: number of policies [%" PRIu16 "], isBucketValid [%d]",
+         policiesCount, isBucketValid);
+
+    return std::make_shared<ListResponse>(policies, isBucketValid, m_frameHeader.sequenceNumber());
+}
+
 ResponsePtr ProtocolAdmin::extractResponseFromBuffer(BinaryQueuePtr bufferQueue) {
     ProtocolFrameSerializer::deserializeHeader(m_frameHeader, bufferQueue);
 
@@ -235,6 +268,8 @@ ResponsePtr ProtocolAdmin::extractResponseFromBuffer(BinaryQueuePtr bufferQueue)
             return deserializeCheckResponse();
         case OpCodeResponse:
             return deserializeCodeResponse();
+        case OpListResponse:
+            return deserializeListResponse();
         default:
             throw InvalidProtocolException(InvalidProtocolException::WrongOpCode);
             break;
@@ -380,4 +415,30 @@ void ProtocolAdmin::execute(RequestContextPtr context, CodeResponsePtr response)
     ProtocolFrameSerializer::finishSerialization(frame, *(context->responseQueue()));
 }
 
+void ProtocolAdmin::execute(RequestContextPtr context, ListResponsePtr response) {
+    ProtocolFrameFieldsCount policiesSize
+        = static_cast<ProtocolFrameFieldsCount>(response->policies().size());
+
+    LOGD("Serializing ListResponse: op [%" PRIu8 "], sequenceNumber [%" PRIu16 "], "
+         "number of policies [%" PRIu16 "], isBucketValid [%d]", OpListResponse,
+         response->sequenceNumber(), policiesSize, response->isBucketValid());
+
+    ProtocolFrame frame = ProtocolFrameSerializer::startSerialization(response->sequenceNumber());
+
+    ProtocolSerialization::serialize(frame, OpListResponse);
+    ProtocolSerialization::serialize(frame, policiesSize);
+    for (auto &policy : response->policies()) {
+        // PolicyKey
+        ProtocolSerialization::serialize(frame, policy.key().client().value());
+        ProtocolSerialization::serialize(frame, policy.key().user().value());
+        ProtocolSerialization::serialize(frame, policy.key().privilege().value());
+        // PolicyResult
+        ProtocolSerialization::serialize(frame, policy.result().policyType());
+        ProtocolSerialization::serialize(frame, policy.result().metadata());
+    }
+    ProtocolSerialization::serialize(frame, response->isBucketValid());
+
+    ProtocolFrameSerializer::finishSerialization(frame, *(context->responseQueue()));
+}
+
 } // namespace Cynara
index f5b2c96..48421be 100644 (file)
@@ -46,6 +46,7 @@ public:
 
     virtual void execute(RequestContextPtr context, CheckResponsePtr response);
     virtual void execute(RequestContextPtr context, CodeResponsePtr response);
+    virtual void execute(RequestContextPtr context, ListResponsePtr response);
 
 private:
     RequestPtr deserializeAdminCheckRequest(void);
@@ -56,6 +57,7 @@ private:
 
     ResponsePtr deserializeCheckResponse(void);
     ResponsePtr deserializeCodeResponse(void);
+    ResponsePtr deserializeListResponse(void);
 };
 
 } // namespace Cynara
index 36670c9..69be21c 100644 (file)
@@ -20,7 +20,7 @@
  * @author      Adam Malinowski <a.malinowsk2@partner.samsung.com>
  * @author      Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
  * @version     1.0
- * @brief       Decalaration of protocol frame operation codes.
+ * @brief       Declaration of protocol frame operation codes.
  */
 
 #ifndef SRC_COMMON_TYPES_PROTOCOLOPCODE_H_
@@ -46,8 +46,9 @@ enum ProtocolOpCode : uint8_t {
     OpCodeResponse,
     OpAdminCheckRequest,
     OpListRequest,
+    OpListResponse,
 
-    /** Opcodes 26 - 39 are reserved for future use */
+    /** Opcodes 27 - 39 are reserved for future use */
 
     /** Agent operations */
     OpAgentRegisterRequest = 40,