xref: /aosp_15_r20/external/parameter-framework/upstream/remote-processor/Message.h (revision c33452fb792a5495ec310a9626f2638b053af5dd)
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