Add protocol deserialialization mechanism
authorAdam Malinowski <a.malinowsk2@partner.samsung.com>
Thu, 26 Jun 2014 08:04:17 +0000 (10:04 +0200)
committerRafal Krypa <r.krypa@samsung.com>
Thu, 3 Jul 2014 12:19:11 +0000 (14:19 +0200)
Change-Id: Id3b24f67a639f22cfd2995880ad3b21593318822

19 files changed:
src/client/logic/Logic.cpp
src/common/CMakeLists.txt
src/common/containers/BinaryQueue.h
src/common/exceptions/InvalidProtocolException.h [new file with mode: 0644]
src/common/protocol/Protocol.h
src/common/protocol/ProtocolClient.cpp
src/common/protocol/ProtocolClient.h
src/common/protocol/ProtocolFrame.cpp [new file with mode: 0644]
src/common/protocol/ProtocolFrame.h [new file with mode: 0644]
src/common/protocol/ProtocolFrameHeader.cpp [new file with mode: 0644]
src/common/protocol/ProtocolFrameHeader.h [new file with mode: 0644]
src/common/protocol/ProtocolFrameSerializer.cpp [new file with mode: 0644]
src/common/protocol/ProtocolFrameSerializer.h [new file with mode: 0644]
src/common/protocol/ProtocolOpCode.h [new file with mode: 0644]
src/common/protocol/ProtocolSerialization.h
src/common/request/CheckRequest.h
src/common/request/Request.h
src/common/request/RequestTaker.cpp
src/common/types/ProtocolFields.h [new file with mode: 0644]

index aa62511..597c8e4 100644 (file)
@@ -56,7 +56,9 @@ cynara_api_result Logic::check(const std::string &client, const std::string &ses
     //Ask cynara service
     PolicyResult result(PredefinedPolicyType::DENY);
     try {
-        RequestPtr request = std::make_shared<CheckRequest>(PolicyKey(client, user, privilege));
+        // todo handle sequence number correctly
+        ProtocolFrameSequenceNumber sequenceNumber = 0;
+        RequestPtr request = std::make_shared<CheckRequest>(PolicyKey(client, user, privilege), sequenceNumber);
         ResponsePtr response = m_socketClient->askCynaraServer(request);
         if (!response) {
             LOGW("Disconnected by cynara server.");
index a689435..5e6308a 100644 (file)
@@ -26,6 +26,9 @@ SET(COMMON_SOURCES
     ${COMMON_PATH}/log/log.cpp
     ${COMMON_PATH}/protocol/ProtocolAdmin.cpp
     ${COMMON_PATH}/protocol/ProtocolClient.cpp
+    ${COMMON_PATH}/protocol/ProtocolFrame.cpp
+    ${COMMON_PATH}/protocol/ProtocolFrameHeader.cpp
+    ${COMMON_PATH}/protocol/ProtocolFrameSerializer.cpp
     ${COMMON_PATH}/protocol/ProtocolSerialization.cpp
     ${COMMON_PATH}/protocol/ProtocolSignal.cpp
     ${COMMON_PATH}/request/CheckRequest.cpp
index ada9a3e..ccfbffe 100644 (file)
@@ -32,7 +32,7 @@ namespace Cynara {
  * Binary queue auto pointer
  */
 class BinaryQueue;
-typedef std::auto_ptr<BinaryQueue> BinaryQueueAutoPtr;
+typedef std::shared_ptr<BinaryQueue> BinaryQueuePtr;
 
 /**
  * Binary stream implemented as constant size bucket list
diff --git a/src/common/exceptions/InvalidProtocolException.h b/src/common/exceptions/InvalidProtocolException.h
new file mode 100644 (file)
index 0000000..8b1317b
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+/*
+ * @file        InvalidProtocolException.h
+ * @author      Adam Malinowski <a.malinowsk2@partner.samsung.com>
+ * @version     1.0
+ * @brief       Implementation of InvalidProtocolException
+ */
+
+#ifndef SRC_COMMON_EXCEPTIONS_INVALIDPROTOCOLEXCEPTION_H_
+#define SRC_COMMON_EXCEPTIONS_INVALIDPROTOCOLEXCEPTION_H_
+
+#include <exception>
+#include <sstream>
+
+#include "Exception.h"
+
+namespace Cynara {
+
+class InvalidProtocolException : public Exception {
+public:
+    enum ExceptionType {
+        InvalidSignature,
+        WrongOpCode,
+        Other
+    };
+
+private:
+    std::string m_whatMessage;
+    ExceptionType m_exceptionType;
+
+public:
+    InvalidProtocolException(ExceptionType exceptionType) :
+        m_exceptionType(exceptionType) {
+        switch(m_exceptionType) {
+            case InvalidSignature:
+                m_whatMessage = "No valid signature found";
+                break;
+            case WrongOpCode:
+                m_whatMessage = "Wrong request code";
+                break;
+            case Other:
+                m_whatMessage = "Unknown problem";
+                break;
+        }
+
+    }
+
+    virtual ~InvalidProtocolException() = default;
+
+    virtual const char *what(void) const noexcept {
+        return m_whatMessage.c_str();
+    }
+
+    ExceptionType exceptionTyp(void) const {
+        return m_exceptionType;
+    }
+};
+
+} // namespace Cynara
+
+#endif /* SRC_COMMON_EXCEPTIONS_INVALIDPROTOCOLEXCEPTION_H_ */
index 56ee51e..daf001c 100644 (file)
@@ -26,6 +26,7 @@
 #include <memory>
 
 #include <containers/BinaryQueue.h>
+#include <protocol/ProtocolFrameHeader.h>
 #include <request/pointers.h>
 #include <request/RequestTaker.h>
 #include <response/pointers.h>
@@ -45,6 +46,13 @@ public:
 
     virtual RequestPtr extractRequestFromBuffer(BinaryQueue &bufferQueue) = 0;
     virtual ResponsePtr extractResponseFromBuffer(BinaryQueue &bufferQueue) = 0;
+
+    ProtocolFrameHeader &frameHeader(void) {
+        return m_frameHeader;
+    }
+
+protected:
+    ProtocolFrameHeader m_frameHeader;
 };
 
 } // namespace Cynara
index 4e98d53..2671eb7 100644 (file)
 /*
  * @file        ProtocolClient.cpp
  * @author      Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
+ * @author      Adam Malinowski <a.malinowsk2@partner.samsung.com>
  * @version     1.0
  * @brief       This file implements protocol class for communication with client
  */
 
 #include <common.h>
 #include <memory>
+
+#include <exceptions/InvalidProtocolException.h>
+#include <exceptions/OutOfDataException.h>
+#include <protocol/ProtocolFrameSerializer.h>
+#include <protocol/ProtocolOpCode.h>
+#include <protocol/ProtocolSerialization.h>
+#include <request/CheckRequest.h>
+#include <request/RequestContext.h>
+#include <types/PolicyKey.h>
+
 #include "ProtocolClient.h"
 
 namespace Cynara {
@@ -36,9 +47,33 @@ ProtocolPtr ProtocolClient::clone(void) {
     return std::make_shared<ProtocolClient>();
 }
 
+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());
+}
+
 RequestPtr ProtocolClient::extractRequestFromBuffer(BinaryQueue &bufferQueue) {
-    TODO_USE_ME(bufferQueue);
-    return RequestPtr(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 deserializeCheckRequest(m_frameHeader);
+        default:
+            throw InvalidProtocolException(InvalidProtocolException::WrongOpCode);
+            break;
+        }
+    }
+
+    return nullptr;
 }
 
 ResponsePtr ProtocolClient::extractResponseFromBuffer(BinaryQueue &bufferQueue) {
@@ -46,4 +81,15 @@ ResponsePtr ProtocolClient::extractResponseFromBuffer(BinaryQueue &bufferQueue)
     return ResponsePtr(nullptr);
 }
 
+void ProtocolClient::execute(RequestContextPtr context, CheckRequestPtr request) {
+    ProtocolFramePtr frame = ProtocolFrameSerializer::startSerialization(request->sequenceNumber());
+
+    ProtocolSerialization::serialize(*frame, OpCheckPolicy);
+    ProtocolSerialization::serialize(*frame, request->key().client().value());
+    ProtocolSerialization::serialize(*frame, request->key().user().value());
+    ProtocolSerialization::serialize(*frame, request->key().privilege().value());
+
+    ProtocolFrameSerializer::finishSerialization(frame, context->responseQueue());
+}
+
 } // namespace Cynara
index 0b5cdb9..1cd608b 100644 (file)
@@ -23,6 +23,9 @@
 #ifndef SRC_COMMON_PROTOCOL_PROTOCOLCLIENT_H_
 #define SRC_COMMON_PROTOCOL_PROTOCOLCLIENT_H_
 
+#include <protocol/ProtocolFrameHeader.h>
+#include <request/pointers.h>
+
 #include "Protocol.h"
 
 namespace Cynara {
@@ -36,6 +39,11 @@ public:
 
     virtual RequestPtr extractRequestFromBuffer(BinaryQueue &bufferQueue);
     virtual ResponsePtr extractResponseFromBuffer(BinaryQueue &bufferQueue);
+
+    virtual void execute(RequestContextPtr context, CheckRequestPtr request);
+
+private:
+    RequestPtr deserializeCheckRequest(ProtocolFrameHeader &frame);
 };
 
 } // namespace Cynara
diff --git a/src/common/protocol/ProtocolFrame.cpp b/src/common/protocol/ProtocolFrame.cpp
new file mode 100644 (file)
index 0000000..0ca0be6
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Contact: Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+/*
+ * @file        ProtocolFrame.cpp
+ * @author      Adam Malinowski <a.malinowsk2@partner.samsung.com>
+ * @version     1.0
+ * @brief       Implementation of ProtocolFrame class.
+ */
+
+#include <string.h>
+
+#include "ProtocolFrame.h"
+
+namespace Cynara {
+
+ProtocolFrame::ProtocolFrame(ProtocolFrameHeaderPtr frameHeader, BinaryQueuePtr data) :
+        m_frameHeader(frameHeader), m_frameBodyContent(data) {
+}
+
+void ProtocolFrame::read(size_t num, void *bytes) {
+    m_frameBodyContent->flattenConsume(bytes, num);
+}
+
+void ProtocolFrame::write(size_t num, const void *bytes) {
+    m_frameBodyContent->appendCopy(bytes, num);
+    m_frameHeader->increaseFrameLength(num);
+}
+
+} /* namespace Cynara */
diff --git a/src/common/protocol/ProtocolFrame.h b/src/common/protocol/ProtocolFrame.h
new file mode 100644 (file)
index 0000000..709196e
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Contact: Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+/*
+ * @file        ProtocolFrame.h
+ * @author      Adam Malinowski <a.malinowsk2@partner.samsung.com>
+ * @version     1.0
+ * @brief       Header for ProtocolFrame class.
+ */
+
+#ifndef SRC_COMMON_PROTOCOL_PROTOCOLFRAME_H_
+#define SRC_COMMON_PROTOCOL_PROTOCOLFRAME_H_
+
+#include <cstddef>
+#include <memory>
+
+#include <containers/BinaryQueue.h>
+#include <protocol/ProtocolFrameHeader.h>
+#include <protocol/ProtocolSerialization.h>
+
+namespace Cynara {
+
+class ProtocolFrameSerializer;
+
+class ProtocolFrame: public IStream {
+
+public:
+    ProtocolFrame(ProtocolFrameHeaderPtr frameHeader, BinaryQueuePtr headerContent);
+    virtual ~ProtocolFrame() = default;
+
+    ProtocolFrameHeaderPtr frameHeader(void) {
+        return m_frameHeader;
+    }
+
+    virtual void read(size_t num, void *bytes);
+    virtual void write(size_t num, const void *bytes);
+
+private:
+    ProtocolFrameHeaderPtr m_frameHeader;
+    BinaryQueuePtr m_frameBodyContent;
+
+    BinaryQueue &bodyContent(void) {
+        return *m_frameBodyContent;
+    }
+
+    friend class ProtocolFrameSerializer;
+};
+
+typedef std::shared_ptr<ProtocolFrame> ProtocolFramePtr;
+
+} /* namespace Cynara */
+
+#endif /* SRC_COMMON_PROTOCOL_PROTOCOLFRAME_H_ */
diff --git a/src/common/protocol/ProtocolFrameHeader.cpp b/src/common/protocol/ProtocolFrameHeader.cpp
new file mode 100644 (file)
index 0000000..b8d5a37
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Contact: Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+/*
+ * @file        ProtocolFrameHeader.cpp
+ * @author      Adam Malinowski <a.malinowsk2@partner.samsung.com>
+ * @version     1.0
+ * @brief       Implementation of protocol frame header (de)serializer class.
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include "ProtocolFrameHeader.h"
+
+namespace Cynara {
+
+const ProtocolFrameSignature ProtocolFrameHeader::m_signature = "CPv1";
+
+ProtocolFrameHeader::ProtocolFrameHeader(BinaryQueuePtr headerContent) :
+        m_frameHeaderContent(headerContent), m_frameLength(0), m_sequenceNumber(0),
+        m_headerComplete(false), m_bodyComplete(false) {
+}
+
+void ProtocolFrameHeader::read(size_t num, void *bytes) {
+    m_frameHeaderContent->flattenConsume(bytes, num);
+}
+
+void ProtocolFrameHeader::write(size_t num, const void *bytes) {
+    m_frameHeaderContent->appendCopy(bytes, num);
+}
+
+} /* namespace Cynara */
diff --git a/src/common/protocol/ProtocolFrameHeader.h b/src/common/protocol/ProtocolFrameHeader.h
new file mode 100644 (file)
index 0000000..0db0d6b
--- /dev/null
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Contact: Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+/*
+ * @file        ProtocolFrameHeader.h
+ * @author      Adam Malinowski <a.malinowsk2@partner.samsung.com>
+ * @version     1.0
+ * @brief       Header file for protocol frame header (de)serializer class.
+ */
+
+#ifndef SRC_COMMON_PROTOCOL_PROTOCOLFRAMEHEADER_H_
+#define SRC_COMMON_PROTOCOL_PROTOCOLFRAMEHEADER_H_
+
+#include <cstddef>
+
+#include <containers/BinaryQueue.h>
+#include <protocol/ProtocolSerialization.h>
+#include <types/ProtocolFields.h>
+
+namespace Cynara {
+
+class ProtocolFrameSerializer;
+
+class ProtocolFrameHeader: public IStream {
+private:
+    static const ProtocolFrameSignature m_signature;
+    static size_t frameHeaderLength(void) {
+            return m_signature.size() +
+            sizeof(ProtocolFrameLength) +
+            sizeof(ProtocolFrameSequenceNumber);
+    }
+
+public:
+    ProtocolFrameHeader(BinaryQueuePtr headerContent = nullptr);
+    virtual ~ProtocolFrameHeader() = default;
+
+    virtual void read(size_t num, void *bytes);
+    virtual void write(size_t num, const void *bytes);
+
+    ProtocolFrameSequenceNumber sequenceNumber(void) {
+        return m_sequenceNumber;
+    }
+
+    bool isHeaderComplete(void) {
+        return m_headerComplete;
+    }
+
+    bool isFrameComplete(void) {
+        return m_headerComplete && m_bodyComplete;
+    }
+
+    void resetState(void) {
+        m_headerComplete = false;
+        m_bodyComplete = false;
+    }
+
+    ProtocolFrameLength frameLength(void) {
+        return m_frameLength;
+    }
+
+private:
+    BinaryQueuePtr m_frameHeaderContent;
+    ProtocolFrameLength m_frameLength;
+    ProtocolFrameSequenceNumber m_sequenceNumber;
+    bool m_headerComplete;
+    bool m_bodyComplete;
+
+    void setSequenceNumber(ProtocolFrameSequenceNumber sequenceNumber) {
+        m_sequenceNumber = sequenceNumber;
+    }
+
+    void increaseFrameLength(ProtocolFrameLength size) {
+        m_frameLength += size;
+    }
+
+    BinaryQueue &headerContent(void) {
+        return *m_frameHeaderContent;
+    }
+
+    void setHeaderContent(BinaryQueuePtr headerContent) {
+        m_frameHeaderContent = headerContent;
+    }
+
+    void setHeaderComplete(void) {
+        m_headerComplete = true;
+    }
+
+    void setBodyComplete(void) {
+        m_bodyComplete = true;
+    }
+
+    friend class ProtocolFrame;
+    friend class ProtocolFrameSerializer;
+};
+
+typedef std::shared_ptr<ProtocolFrameHeader> ProtocolFrameHeaderPtr;
+
+} /* namespace Cynara */
+
+#endif /* SRC_COMMON_PROTOCOL_PROTOCOLFRAMEHEADER_H_ */
diff --git a/src/common/protocol/ProtocolFrameSerializer.cpp b/src/common/protocol/ProtocolFrameSerializer.cpp
new file mode 100644 (file)
index 0000000..25a5649
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Contact: Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+/*
+ * @file        ProtocolSerializer.cpp
+ * @author      Adam Malinowski <a.malinowsk2@partner.samsung.com>
+ * @version     1.0
+ * @brief       Implementation of protocol frame (de)serializer class.
+ */
+
+#include <exceptions/InvalidProtocolException.h>
+#include <exceptions/OutOfDataException.h>
+
+#include "ProtocolFrameSerializer.h"
+
+namespace Cynara {
+
+void ProtocolFrameSerializer::deserializeHeader(ProtocolFrameHeader &frameHeader,
+                                                BinaryQueue &data) {
+    if (!frameHeader.isHeaderComplete()) {
+        if ((data.size() < ProtocolFrameHeader::frameHeaderLength())) {
+            return;
+        }
+
+        frameHeader.setHeaderContent(BinaryQueuePtr(&data, [=] (BinaryQueue *) {}));
+
+        ProtocolFrameSignature signature;
+        ProtocolDeserialization::deserialize(frameHeader, frameHeader.m_signature.length(),
+                signature);
+        if (ProtocolFrameHeader::m_signature != signature) {
+            throw InvalidProtocolException(InvalidProtocolException::InvalidSignature);
+        }
+
+        ProtocolDeserialization::deserialize(frameHeader, frameHeader.m_frameLength);
+        ProtocolDeserialization::deserialize(frameHeader, frameHeader.m_sequenceNumber);
+
+        frameHeader.setHeaderComplete();
+    }
+
+    if (data.size() >= (frameHeader.frameLength() - ProtocolFrameHeader::frameHeaderLength())) {
+        frameHeader.setBodyComplete();
+    }
+}
+
+ProtocolFramePtr ProtocolFrameSerializer::startSerialization(ProtocolFrameSequenceNumber sequenceNumber) {
+    BinaryQueuePtr headerQueue = std::make_shared<BinaryQueue>();
+    BinaryQueuePtr bodyQueue = std::make_shared<BinaryQueue>();
+    ProtocolFrameHeaderPtr header = std::make_shared<ProtocolFrameHeader>(headerQueue);
+    header->setSequenceNumber(sequenceNumber);
+    header->increaseFrameLength(ProtocolFrameHeader::frameHeaderLength());
+    return std::make_shared<ProtocolFrame>(header, bodyQueue);
+}
+
+void ProtocolFrameSerializer::finishSerialization(ProtocolFramePtr frame, BinaryQueue &data) {
+    ProtocolFrameHeader &frameHeader = *frame->frameHeader();
+    ProtocolSerialization::serializeNoSize(frameHeader, ProtocolFrameHeader::m_signature);
+    ProtocolSerialization::serialize(frameHeader, frameHeader.m_frameLength);
+    ProtocolSerialization::serialize(frameHeader, frameHeader.m_sequenceNumber);
+
+    data.appendMoveFrom(frameHeader.headerContent());
+    data.appendMoveFrom(frame->bodyContent());
+}
+
+} /* namespace Cynara */
diff --git a/src/common/protocol/ProtocolFrameSerializer.h b/src/common/protocol/ProtocolFrameSerializer.h
new file mode 100644 (file)
index 0000000..8af23ba
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Contact: Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+/*
+ * @file        ProtocolFrameSerializer.h
+ * @author      Adam Malinowski <a.malinowsk2@partner.samsung.com>
+ * @version     1.0
+ * @brief       Header file for protocol frame (de)serialization.
+ */
+
+#ifndef SRC_COMMON_PROTOCOL_PROTOCOLFRAMESERIALIZER_H_
+#define SRC_COMMON_PROTOCOL_PROTOCOLFRAMESERIALIZER_H_
+
+#include <containers/BinaryQueue.h>
+#include <protocol/ProtocolFrame.h>
+
+namespace Cynara {
+
+class ProtocolFrameSerializer {
+
+public:
+    static void deserializeHeader(ProtocolFrameHeader &frameHeader, BinaryQueue &data);
+    static ProtocolFramePtr startSerialization(ProtocolFrameSequenceNumber sequenceNumber);
+    static void finishSerialization(ProtocolFramePtr frame, BinaryQueue &data);
+};
+
+} /* namespace Cynara */
+
+#endif /* SRC_COMMON_PROTOCOL_PROTOCOLFRAMESERIALIZER_H_ */
diff --git a/src/common/protocol/ProtocolOpCode.h b/src/common/protocol/ProtocolOpCode.h
new file mode 100644 (file)
index 0000000..d797fee
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Contact: Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+/*
+ * @file        ProtocolOpCode.h
+ * @author      Adam Malinowski <a.malinowsk2@partner.samsung.com>
+ * @version     1.0
+ * @brief       Decalaration of protocol frame operation codes.
+ */
+
+#ifndef SRC_COMMON_TYPES_PROTOCOLOPCODE_H_
+#define SRC_COMMON_TYPES_PROTOCOLOPCODE_H_
+
+#include <cstddef>
+
+namespace Cynara {
+
+enum ProtocolOpCode : uint8_t {
+    /** Client operations */
+    OpCheckPolicy = 0,
+
+    /** Opcodes 1 - 19 are reserved for future use */
+
+    /** Admin operations */
+    OpInsertPolicy = 20,
+    OpDeletePolicy,
+    OpListPolicies,
+    OpBeginTransaction,
+    OpEndTransaction
+};
+
+} /* namespace Cynara */
+
+#endif /* SRC_COMMON_TYPES_PROTOCOLOPCODE_H_ */
index ffa22a0..532f78b 100644 (file)
 /**
  * @file    ProtocolSerialization.h
  * @author  Tomasz Swierczek (t.swierczek@samsung.com)
+ * @author  Adam Malinowski (a.malinowsk2@samsung.com)
  * @version 1.0
  * @brief   Interfaces and templates used for data serialization.
  */
 #ifndef SRC_COMMON_PROTOCOL_PROTOCOLSERIALIZATION_H_
 #define SRC_COMMON_PROTOCOL_PROTOCOLSERIALIZATION_H_
 
-#include <string>
-#include <vector>
+#include <endian.h>
 #include <list>
 #include <map>
 #include <memory>
+#include <string>
+#include <vector>
+
+#include <protocol/ProtocolOpCode.h>
 
 namespace Cynara {
 // Abstract data stream buffer
@@ -72,20 +76,44 @@ struct ProtocolSerialization {
         stream.write(sizeof(*value), value);
     }
 
-    // unsigned int
-    static void serialize(IStream &stream, const unsigned value) {
-        stream.write(sizeof(value), &value);
+    // unsigned 16-bit int
+    static void serialize(IStream &stream, const uint16_t value) {
+        uint16_t _value = htole16(value);
+        stream.write(sizeof(value), &_value);
     }
-    static void serialize(IStream &stream, const unsigned* const value) {
-        stream.write(sizeof(*value), value);
+    static void serialize(IStream &stream, const uint16_t * const value) {
+        uint16_t _value = htole16(*value);
+        stream.write(sizeof(*value), &_value);
     }
 
-    // int
-    static void serialize(IStream &stream, const int value) {
-        stream.write(sizeof(value), &value);
+    // 16-bit int
+    static void serialize(IStream &stream, const int16_t value) {
+        int16_t _value = htole16(value);
+        stream.write(sizeof(value), &_value);
     }
-    static void serialize(IStream &stream, const int * const value) {
-        stream.write(sizeof(*value), value);
+    static void serialize(IStream &stream, const int16_t * const value) {
+        int16_t _value = htole16(*value);
+        stream.write(sizeof(*value), &_value);
+    }
+
+    // unsigned 32-bit int
+    static void serialize(IStream &stream, const uint32_t value) {
+        uint32_t _value = htole32(value);
+        stream.write(sizeof(value), &_value);
+    }
+    static void serialize(IStream &stream, const uint32_t * const value) {
+        uint32_t _value = htole32(*value);
+        stream.write(sizeof(*value), &_value);
+    }
+
+    // 32-bit int
+    static void serialize(IStream &stream, const int32_t value) {
+        int32_t _value = htole32(value);
+        stream.write(sizeof(value), &_value);
+    }
+    static void serialize(IStream &stream, const int32_t * const value) {
+        int32_t _value = htole32(*value);
+        stream.write(sizeof(*value), &_value);
     }
 
     // bool
@@ -104,6 +132,14 @@ struct ProtocolSerialization {
         stream.write(sizeof(*value), value);
     }
 
+    // ProtocolOpCode
+    static void serialize(IStream &stream, const ProtocolOpCode value) {
+        stream.write(sizeof(value), &value);
+    }
+    static void serialize(IStream &stream, const ProtocolOpCode * const value) {
+        stream.write(sizeof(*value), value);
+    }
+
     // std::string
     static void serialize(IStream &stream, const std::string &str) {
         int length = str.size();
@@ -115,6 +151,14 @@ struct ProtocolSerialization {
         stream.write(sizeof(length), &length);
         stream.write(length, str->c_str());
     }
+    static void serializeNoSize(IStream &stream, const std::string &str) {
+        int length = str.size();
+        stream.write(length, str.c_str());
+    }
+    static void serializeNoSize(IStream &stream, const std::string * const str) {
+        int length = str->size();
+        stream.write(length, str->c_str());
+    }
 
     // STL templates
 
@@ -213,22 +257,48 @@ struct ProtocolDeserialization {
         stream.read(sizeof(*value), value);
     }
 
-    // unsigned int
-    static void deserialize(IStream &stream, unsigned &value) {
+    // 16-bit int
+    static void deserialize(IStream &stream, int16_t &value) {
         stream.read(sizeof(value), &value);
+        value = le16toh(value);
     }
-    static void deserialize(IStream &stream, unsigned *&value) {
-        value = new unsigned;
+    static void deserialize(IStream &stream, int16_t *&value) {
+        value = new int16_t;
         stream.read(sizeof(*value), value);
+        value = le16toh(value);
     }
 
-    // int
-    static void deserialize(IStream &stream, int &value) {
+    // unsigned 16-bit int
+    static void deserialize(IStream &stream, uint16_t &value) {
         stream.read(sizeof(value), &value);
+        value = le16toh(value);
     }
-    static void deserialize(IStream &stream, int *&value) {
-        value = new int;
+    static void deserialize(IStream &stream, uint16_t *&value) {
+        value = new uint16_t;
         stream.read(sizeof(*value), value);
+        value = le16toh(value);
+    }
+
+    // 32-bit int
+    static void deserialize(IStream &stream, int32_t &value) {
+        stream.read(sizeof(value), &value);
+        value = le32toh(value);
+    }
+    static void deserialize(IStream &stream, int32_t *&value) {
+        value = new int32_t;
+        stream.read(sizeof(*value), value);
+        value = le32toh(value);
+    }
+
+    // unsigned 32-bit int
+    static void deserialize(IStream &stream, uint32_t &value) {
+        stream.read(sizeof(value), &value);
+        value = le32toh(value);
+    }
+    static void deserialize(IStream &stream, uint32_t *&value) {
+        value = new uint32_t;
+        stream.read(sizeof(*value), value);
+        value = le32toh(value);
     }
 
     // bool
@@ -249,24 +319,35 @@ struct ProtocolDeserialization {
         stream.read(sizeof(*value), value);
     }
 
+    // PrtocolOpCode
+    static void deserialize(IStream &stream, ProtocolOpCode &value) {
+        stream.read(sizeof(value), &value);
+    }
+    static void deserialize(IStream &stream, ProtocolOpCode *&value) {
+        value = new ProtocolOpCode;
+        stream.read(sizeof(*value), value);
+    }
+
     // std::string
     static void deserialize(IStream &stream, std::string &str) {
         int length;
         stream.read(sizeof(length), &length);
-        char *buf = new char[length + 1];
-        stream.read(length, buf);
-        buf[length] = 0;
-        str = std::string(buf);
-        delete[] buf;
+        str.resize(length);
+        stream.read(length, &str[0]);
     }
     static void deserialize(IStream &stream, std::string *&str) {
         int length;
         stream.read(sizeof(length), &length);
-        char *buf = new char[length + 1];
-        stream.read(length, buf);
-        buf[length] = 0;
-        str = new std::string(buf);
-        delete[] buf;
+        str = new std::string(length, '\0');
+        stream.read(length, &str[0]);
+    }
+    static void deserialize(IStream &stream, int length, std::string &str) {
+        str.resize(length);
+        stream.read(length, &str[0]);
+    }
+    static void deserialize(IStream &stream, int length, std::string *&str) {
+        str = new std::string(length, '\0');
+        stream.read(length, &str[0]);
     }
 
     // STL templates
index cc4e4f2..03135c7 100644 (file)
@@ -36,7 +36,8 @@ private:
     PolicyKey m_key;
 
 public:
-    CheckRequest(const PolicyKey &key) : m_key(key) {
+    CheckRequest(const PolicyKey &key, ProtocolFrameSequenceNumber sequenceNumber) :
+        Request(sequenceNumber), m_key(key) {
     }
 
     virtual ~CheckRequest() = default;
index 5dc0ac9..ac92398 100644 (file)
 
 #include <request/pointers.h>
 #include <request/RequestTaker.h>
+#include <types/ProtocolFields.h>
 
 namespace Cynara {
 
 class Request {
 public:
-    Request() = default;
+    Request(ProtocolFrameSequenceNumber sequenceNumber) : m_sequenceNumber(sequenceNumber) {
+    }
     virtual ~Request() = default;
 
     virtual void execute(RequestPtr self, RequestTakerPtr taker,
-                         RequestContextPtr context) const = 0;
+            RequestContextPtr context) const = 0;
+
+    ProtocolFrameSequenceNumber sequenceNumber(void) const {
+        return m_sequenceNumber;
+    }
+
+private:
+    ProtocolFrameSequenceNumber m_sequenceNumber;
 };
 
 } // namespace Cynara
index 13d2ee9..1725049 100644 (file)
 /*
  * @file        RequestTaker.cpp
  * @author      Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
+ * @author      Adam Malinowski <a.malinowsk2@partner.samsung.com>
  * @version     1.0
  * @brief       This file implements RequestTaker class
  */
 
 #include <attributes/attributes.h>
 #include <exceptions/NotImplementedException.h>
+#include <request/CheckRequest.h>
+#include <request/RequestContext.h>
 
 #include "RequestTaker.h"
 
diff --git a/src/common/types/ProtocolFields.h b/src/common/types/ProtocolFields.h
new file mode 100644 (file)
index 0000000..e370ba4
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Contact: Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+/*
+ * @file        ProtocolFields.h
+ * @author      Adam Malinowski <a.malinowsk2@partner.samsung.com>
+ * @version     1.0
+ * @brief       Types definition for protocol frame fields.
+ */
+
+#ifndef SRC_COMMON_TYPES_PROTOCOLFIELDS_H_
+#define SRC_COMMON_TYPES_PROTOCOLFIELDS_H_
+
+#include <string>
+#include <cstddef>
+
+namespace Cynara {
+
+typedef std::string ProtocolFrameSignature;
+typedef uint32_t ProtocolFrameLength;
+typedef uint16_t ProtocolFrameSequenceNumber;
+
+} /* namespace Cynara */
+
+#endif /* SRC_COMMON_TYPES_PROTOCOLFIELDS_H_ */