1*c33452fbSAndroid Build Coastguard Worker /* 2*c33452fbSAndroid Build Coastguard Worker * Copyright (c) 2011-2015, Intel Corporation 3*c33452fbSAndroid Build Coastguard Worker * All rights reserved. 4*c33452fbSAndroid Build Coastguard Worker * 5*c33452fbSAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without modification, 6*c33452fbSAndroid Build Coastguard Worker * are permitted provided that the following conditions are met: 7*c33452fbSAndroid Build Coastguard Worker * 8*c33452fbSAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright notice, this 9*c33452fbSAndroid Build Coastguard Worker * list of conditions and the following disclaimer. 10*c33452fbSAndroid Build Coastguard Worker * 11*c33452fbSAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright notice, 12*c33452fbSAndroid Build Coastguard Worker * this list of conditions and the following disclaimer in the documentation and/or 13*c33452fbSAndroid Build Coastguard Worker * other materials provided with the distribution. 14*c33452fbSAndroid Build Coastguard Worker * 15*c33452fbSAndroid Build Coastguard Worker * 3. Neither the name of the copyright holder nor the names of its contributors 16*c33452fbSAndroid Build Coastguard Worker * may be used to endorse or promote products derived from this software without 17*c33452fbSAndroid Build Coastguard Worker * specific prior written permission. 18*c33452fbSAndroid Build Coastguard Worker * 19*c33452fbSAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 20*c33452fbSAndroid Build Coastguard Worker * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 21*c33452fbSAndroid Build Coastguard Worker * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 22*c33452fbSAndroid Build Coastguard Worker * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR 23*c33452fbSAndroid Build Coastguard Worker * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 24*c33452fbSAndroid Build Coastguard Worker * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 25*c33452fbSAndroid Build Coastguard Worker * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 26*c33452fbSAndroid Build Coastguard Worker * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27*c33452fbSAndroid Build Coastguard Worker * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 28*c33452fbSAndroid Build Coastguard Worker * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29*c33452fbSAndroid Build Coastguard Worker */ 30*c33452fbSAndroid Build Coastguard Worker #pragma once 31*c33452fbSAndroid Build Coastguard Worker 32*c33452fbSAndroid Build Coastguard Worker #include "NonCopyable.hpp" 33*c33452fbSAndroid Build Coastguard Worker #include <vector> 34*c33452fbSAndroid Build Coastguard Worker #include <string> 35*c33452fbSAndroid Build Coastguard Worker #include <cstdint> 36*c33452fbSAndroid Build Coastguard Worker 37*c33452fbSAndroid Build Coastguard Worker #include <remote_processor_export.h> 38*c33452fbSAndroid Build Coastguard Worker 39*c33452fbSAndroid Build Coastguard Worker class Socket; 40*c33452fbSAndroid Build Coastguard Worker 41*c33452fbSAndroid Build Coastguard Worker class REMOTE_PROCESSOR_EXPORT CMessage : private utility::NonCopyable 42*c33452fbSAndroid Build Coastguard Worker { 43*c33452fbSAndroid Build Coastguard Worker public: 44*c33452fbSAndroid Build Coastguard Worker enum class MsgType : std::uint8_t 45*c33452fbSAndroid Build Coastguard Worker { 46*c33452fbSAndroid Build Coastguard Worker ECommandRequest, 47*c33452fbSAndroid Build Coastguard Worker ESuccessAnswer, 48*c33452fbSAndroid Build Coastguard Worker EFailureAnswer, 49*c33452fbSAndroid Build Coastguard Worker EInvalid = static_cast<uint8_t>(-1), 50*c33452fbSAndroid Build Coastguard Worker }; 51*c33452fbSAndroid Build Coastguard Worker CMessage(MsgType ucMsgId); 52*c33452fbSAndroid Build Coastguard Worker CMessage(); 53*c33452fbSAndroid Build Coastguard Worker virtual ~CMessage() = default; 54*c33452fbSAndroid Build Coastguard Worker 55*c33452fbSAndroid Build Coastguard Worker enum Result 56*c33452fbSAndroid Build Coastguard Worker { 57*c33452fbSAndroid Build Coastguard Worker success, 58*c33452fbSAndroid Build Coastguard Worker peerDisconnected, 59*c33452fbSAndroid Build Coastguard Worker error 60*c33452fbSAndroid Build Coastguard Worker }; 61*c33452fbSAndroid Build Coastguard Worker 62*c33452fbSAndroid Build Coastguard Worker /** Write or read the message on pSocket. 63*c33452fbSAndroid Build Coastguard Worker * 64*c33452fbSAndroid Build Coastguard Worker * @param[in,out] socket is the socket on wich IO operation will be made. 65*c33452fbSAndroid Build Coastguard Worker * @param[in] bOut if true message should be read, 66*c33452fbSAndroid Build Coastguard Worker * if false it should be written. 67*c33452fbSAndroid Build Coastguard Worker * @param[out] strError on failure, a string explaining the error, 68*c33452fbSAndroid Build Coastguard Worker * on success, undefined. 69*c33452fbSAndroid Build Coastguard Worker * 70*c33452fbSAndroid Build Coastguard Worker * @return success if a correct message could be recv/send 71*c33452fbSAndroid Build Coastguard Worker * peerDisconnected if the peer disconnected before the first socket access. 72*c33452fbSAndroid Build Coastguard Worker * error if the message could not be read/write for any other reason 73*c33452fbSAndroid Build Coastguard Worker */ 74*c33452fbSAndroid Build Coastguard Worker Result serialize(Socket &&socket, bool bOut, std::string &strError); 75*c33452fbSAndroid Build Coastguard Worker 76*c33452fbSAndroid Build Coastguard Worker protected: 77*c33452fbSAndroid Build Coastguard Worker // Msg Id 78*c33452fbSAndroid Build Coastguard Worker MsgType getMsgId() const; 79*c33452fbSAndroid Build Coastguard Worker 80*c33452fbSAndroid Build Coastguard Worker /** Write raw data to the message 81*c33452fbSAndroid Build Coastguard Worker * 82*c33452fbSAndroid Build Coastguard Worker * @param[in] pvData pointer to the data array 83*c33452fbSAndroid Build Coastguard Worker * @param[in] uiSize array size in bytes 84*c33452fbSAndroid Build Coastguard Worker */ 85*c33452fbSAndroid Build Coastguard Worker void writeData(const void *pvData, size_t uiSize); 86*c33452fbSAndroid Build Coastguard Worker 87*c33452fbSAndroid Build Coastguard Worker /** Read raw data from the message 88*c33452fbSAndroid Build Coastguard Worker * 89*c33452fbSAndroid Build Coastguard Worker * @param[out] pvData pointer to the data array 90*c33452fbSAndroid Build Coastguard Worker * @param[in] uiSize array size in bytes 91*c33452fbSAndroid Build Coastguard Worker */ 92*c33452fbSAndroid Build Coastguard Worker void readData(void *pvData, size_t uiSize); 93*c33452fbSAndroid Build Coastguard Worker 94*c33452fbSAndroid Build Coastguard Worker /** Write string to the message 95*c33452fbSAndroid Build Coastguard Worker * 96*c33452fbSAndroid Build Coastguard Worker * @param[in] strData the string to write 97*c33452fbSAndroid Build Coastguard Worker */ 98*c33452fbSAndroid Build Coastguard Worker void writeString(const std::string &strData); 99*c33452fbSAndroid Build Coastguard Worker 100*c33452fbSAndroid Build Coastguard Worker /** Write string to the message 101*c33452fbSAndroid Build Coastguard Worker * 102*c33452fbSAndroid Build Coastguard Worker * @param[out] strData the string to read to 103*c33452fbSAndroid Build Coastguard Worker */ 104*c33452fbSAndroid Build Coastguard Worker void readString(std::string &strData); 105*c33452fbSAndroid Build Coastguard Worker 106*c33452fbSAndroid Build Coastguard Worker /** @return string length plus room to store its length 107*c33452fbSAndroid Build Coastguard Worker * 108*c33452fbSAndroid Build Coastguard Worker * @param[in] strData the string to get the size from 109*c33452fbSAndroid Build Coastguard Worker */ 110*c33452fbSAndroid Build Coastguard Worker size_t getStringSize(const std::string &strData) const; 111*c33452fbSAndroid Build Coastguard Worker 112*c33452fbSAndroid Build Coastguard Worker /** @return remaining data size to read or to write depending on the context 113*c33452fbSAndroid Build Coastguard Worker * (request: write, answer: read) 114*c33452fbSAndroid Build Coastguard Worker */ 115*c33452fbSAndroid Build Coastguard Worker size_t getRemainingDataSize() const; 116*c33452fbSAndroid Build Coastguard Worker 117*c33452fbSAndroid Build Coastguard Worker private: 118*c33452fbSAndroid Build Coastguard Worker bool isValidAccess(size_t offset, size_t size) const; 119*c33452fbSAndroid Build Coastguard Worker 120*c33452fbSAndroid Build Coastguard Worker /** Allocate room to store the message 121*c33452fbSAndroid Build Coastguard Worker * 122*c33452fbSAndroid Build Coastguard Worker * @param[int] uiDataSize the szie to allocate in bytes 123*c33452fbSAndroid Build Coastguard Worker */ 124*c33452fbSAndroid Build Coastguard Worker void allocateData(size_t uiDataSize); 125*c33452fbSAndroid Build Coastguard Worker // Fill data to send 126*c33452fbSAndroid Build Coastguard Worker virtual void fillDataToSend() = 0; 127*c33452fbSAndroid Build Coastguard Worker // Collect received data 128*c33452fbSAndroid Build Coastguard Worker virtual void collectReceivedData() = 0; 129*c33452fbSAndroid Build Coastguard Worker 130*c33452fbSAndroid Build Coastguard Worker /** @return size of the transaction data in bytes 131*c33452fbSAndroid Build Coastguard Worker */ 132*c33452fbSAndroid Build Coastguard Worker virtual size_t getDataSize() const = 0; 133*c33452fbSAndroid Build Coastguard Worker 134*c33452fbSAndroid Build Coastguard Worker // Checksum 135*c33452fbSAndroid Build Coastguard Worker uint8_t computeChecksum() const; 136*c33452fbSAndroid Build Coastguard Worker 137*c33452fbSAndroid Build Coastguard Worker // MsgId 138*c33452fbSAndroid Build Coastguard Worker MsgType _ucMsgId; 139*c33452fbSAndroid Build Coastguard Worker getMessageDataSize()140*c33452fbSAndroid Build Coastguard Worker size_t getMessageDataSize() const { return mData.size(); } 141*c33452fbSAndroid Build Coastguard Worker 142*c33452fbSAndroid Build Coastguard Worker using Data = std::vector<uint8_t>; 143*c33452fbSAndroid Build Coastguard Worker Data mData; 144*c33452fbSAndroid Build Coastguard Worker /** Read/Write Index used to iterate across the message data */ 145*c33452fbSAndroid Build Coastguard Worker size_t _uiIndex; 146*c33452fbSAndroid Build Coastguard Worker 147*c33452fbSAndroid Build Coastguard Worker static const uint16_t SYNC_WORD = 0xBABE; 148*c33452fbSAndroid Build Coastguard Worker }; 149