1ef8d727ca0eb346af951d15d84ba6f2b9564adf5Kevin Rocard/*
29368eea42a1afb01dd44110582f997115b50e742François Gaffie * Copyright (c) 2011-2015, Intel Corporation
3b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * All rights reserved.
4b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner *
5b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * Redistribution and use in source and binary forms, with or without modification,
6b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * are permitted provided that the following conditions are met:
7b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner *
8b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 1. Redistributions of source code must retain the above copyright notice, this
9b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * list of conditions and the following disclaimer.
10b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner *
11b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 2. Redistributions in binary form must reproduce the above copyright notice,
12b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * this list of conditions and the following disclaimer in the documentation and/or
13b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * other materials provided with the distribution.
14b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner *
15b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 3. Neither the name of the copyright holder nor the names of its contributors
16b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * may be used to endorse or promote products derived from this software without
17b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * specific prior written permission.
18b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner *
19b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
23b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2968a912857707864bbaaff9808717813105072a6ePatrick Benavoli */
3068a912857707864bbaaff9808717813105072a6ePatrick Benavoli#pragma once
3168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
329368eea42a1afb01dd44110582f997115b50e742François Gaffie#include "NonCopyable.hpp"
339368eea42a1afb01dd44110582f997115b50e742François Gaffie#include <vector>
3468a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include <string>
359368eea42a1afb01dd44110582f997115b50e742François Gaffie#include <cstdint>
3668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
379368eea42a1afb01dd44110582f997115b50e742François Gaffie#include <remote_processor_export.h>
3868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
399368eea42a1afb01dd44110582f997115b50e742François Gaffieclass Socket;
409368eea42a1afb01dd44110582f997115b50e742François Gaffie
419368eea42a1afb01dd44110582f997115b50e742François Gaffieclass REMOTE_PROCESSOR_EXPORT CMessage : private utility::NonCopyable
4268a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
4368a912857707864bbaaff9808717813105072a6ePatrick Benavolipublic:
449368eea42a1afb01dd44110582f997115b50e742François Gaffie    enum class MsgType : std::uint8_t
459368eea42a1afb01dd44110582f997115b50e742François Gaffie    {
469368eea42a1afb01dd44110582f997115b50e742François Gaffie        ECommandRequest,
479368eea42a1afb01dd44110582f997115b50e742François Gaffie        ESuccessAnswer,
489368eea42a1afb01dd44110582f997115b50e742François Gaffie        EFailureAnswer,
499368eea42a1afb01dd44110582f997115b50e742François Gaffie        EInvalid = static_cast<uint8_t>(-1),
509368eea42a1afb01dd44110582f997115b50e742François Gaffie    };
519368eea42a1afb01dd44110582f997115b50e742François Gaffie    CMessage(MsgType ucMsgId);
5268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    CMessage();
539368eea42a1afb01dd44110582f997115b50e742François Gaffie    virtual ~CMessage() = default;
5468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
559368eea42a1afb01dd44110582f997115b50e742François Gaffie    enum Result
569368eea42a1afb01dd44110582f997115b50e742François Gaffie    {
57e874c2575c1203648e71426cd34f747cbd34b2b4Kevin Rocard        success,
58e874c2575c1203648e71426cd34f747cbd34b2b4Kevin Rocard        peerDisconnected,
59e874c2575c1203648e71426cd34f747cbd34b2b4Kevin Rocard        error
60e874c2575c1203648e71426cd34f747cbd34b2b4Kevin Rocard    };
61e874c2575c1203648e71426cd34f747cbd34b2b4Kevin Rocard
62ef8d727ca0eb346af951d15d84ba6f2b9564adf5Kevin Rocard    /** Write or read the message on pSocket.
63ef8d727ca0eb346af951d15d84ba6f2b9564adf5Kevin Rocard     *
649368eea42a1afb01dd44110582f997115b50e742François Gaffie     * @param[in,out] socket is the socket on wich IO operation will be made.
65ef8d727ca0eb346af951d15d84ba6f2b9564adf5Kevin Rocard     * @param[in] bOut if true message should be read,
66ef8d727ca0eb346af951d15d84ba6f2b9564adf5Kevin Rocard     *                 if false it should be written.
67ef8d727ca0eb346af951d15d84ba6f2b9564adf5Kevin Rocard     * @param[out] strError on failure, a string explaining the error,
68ef8d727ca0eb346af951d15d84ba6f2b9564adf5Kevin Rocard     *                      on success, undefined.
69ef8d727ca0eb346af951d15d84ba6f2b9564adf5Kevin Rocard     *
70e874c2575c1203648e71426cd34f747cbd34b2b4Kevin Rocard     * @return success if a correct message could be recv/send
71e874c2575c1203648e71426cd34f747cbd34b2b4Kevin Rocard     *         peerDisconnected if the peer disconnected before the first socket access.
72e874c2575c1203648e71426cd34f747cbd34b2b4Kevin Rocard     *         error if the message could not be read/write for any other reason
73ef8d727ca0eb346af951d15d84ba6f2b9564adf5Kevin Rocard     */
749368eea42a1afb01dd44110582f997115b50e742François Gaffie    Result serialize(Socket &&socket, bool bOut, std::string &strError);
7568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
7668a912857707864bbaaff9808717813105072a6ePatrick Benavoliprotected:
7768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Msg Id
789368eea42a1afb01dd44110582f997115b50e742François Gaffie    MsgType getMsgId() const;
79911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli
80911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    /** Write raw data to the message
81911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    *
82911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    * @param[in] pvData pointer to the data array
83911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    * @param[in] uiSize array size in bytes
84911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    */
859368eea42a1afb01dd44110582f997115b50e742François Gaffie    void writeData(const void *pvData, size_t uiSize);
86911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli
87911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    /** Read raw data from the message
88911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    *
89911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    * @param[out] pvData pointer to the data array
90911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    * @param[in] uiSize array size in bytes
91911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    */
929368eea42a1afb01dd44110582f997115b50e742François Gaffie    void readData(void *pvData, size_t uiSize);
93911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli
94911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    /** Write string to the message
95911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    *
96911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    * @param[in] strData the string to write
97911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    */
989368eea42a1afb01dd44110582f997115b50e742François Gaffie    void writeString(const std::string &strData);
99911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli
100911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    /** Write string to the message
101911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    *
102911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    * @param[out] strData the string to read to
103911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    */
1049368eea42a1afb01dd44110582f997115b50e742François Gaffie    void readString(std::string &strData);
105911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli
106911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    /** @return string length plus room to store its length
107911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    *
108911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    * @param[in] strData the string to get the size from
109911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    */
1109368eea42a1afb01dd44110582f997115b50e742François Gaffie    size_t getStringSize(const std::string &strData) const;
111911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli
112911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    /** @return remaining data size to read or to write depending on the context
113911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    * (request: write, answer: read)
114911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    */
115911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    size_t getRemainingDataSize() const;
1169368eea42a1afb01dd44110582f997115b50e742François Gaffie
11768a912857707864bbaaff9808717813105072a6ePatrick Benavoliprivate:
1189368eea42a1afb01dd44110582f997115b50e742François Gaffie    bool isValidAccess(size_t offset, size_t size) const;
119911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli
120911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    /** Allocate room to store the message
121911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    *
122911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    * @param[int] uiDataSize the szie to allocate in bytes
123911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    */
124911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    void allocateData(size_t uiDataSize);
12568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Fill data to send
12668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    virtual void fillDataToSend() = 0;
12768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Collect received data
12868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    virtual void collectReceivedData() = 0;
129911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli
130911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    /** @return size of the transaction data in bytes
131911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    */
132911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    virtual size_t getDataSize() const = 0;
133911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli
13468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Checksum
13568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    uint8_t computeChecksum() const;
13668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
13768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // MsgId
1389368eea42a1afb01dd44110582f997115b50e742François Gaffie    MsgType _ucMsgId;
1399368eea42a1afb01dd44110582f997115b50e742François Gaffie
1409368eea42a1afb01dd44110582f997115b50e742François Gaffie    size_t getMessageDataSize() const { return mData.size(); }
1419368eea42a1afb01dd44110582f997115b50e742François Gaffie
1429368eea42a1afb01dd44110582f997115b50e742François Gaffie    using Data = std::vector<uint8_t>;
1439368eea42a1afb01dd44110582f997115b50e742François Gaffie    Data mData;
144911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    /** Read/Write Index used to iterate across the message data */
145911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    size_t _uiIndex;
1469368eea42a1afb01dd44110582f997115b50e742François Gaffie
1479368eea42a1afb01dd44110582f997115b50e742François Gaffie    static const uint16_t SYNC_WORD = 0xBABE;
14868a912857707864bbaaff9808717813105072a6ePatrick Benavoli};
149