xref: /aosp_15_r20/external/parameter-framework/upstream/remote-processor/RequestMessage.cpp (revision c33452fb792a5495ec310a9626f2638b053af5dd)
1*c33452fbSAndroid Build Coastguard Worker /*
2*c33452fbSAndroid Build Coastguard Worker  * Copyright (c) 2011-2014, 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 #include "RequestMessage.h"
31*c33452fbSAndroid Build Coastguard Worker #include "Utility.h"
32*c33452fbSAndroid Build Coastguard Worker #include <assert.h>
33*c33452fbSAndroid Build Coastguard Worker #include <algorithm>
34*c33452fbSAndroid Build Coastguard Worker #include <ctype.h>
35*c33452fbSAndroid Build Coastguard Worker 
36*c33452fbSAndroid Build Coastguard Worker #define base CMessage
37*c33452fbSAndroid Build Coastguard Worker 
38*c33452fbSAndroid Build Coastguard Worker using std::string;
39*c33452fbSAndroid Build Coastguard Worker 
40*c33452fbSAndroid Build Coastguard Worker const char *const CRequestMessage::gacDelimiters = " \t\n\v\f\r";
41*c33452fbSAndroid Build Coastguard Worker 
CRequestMessage(const string & strCommand)42*c33452fbSAndroid Build Coastguard Worker CRequestMessage::CRequestMessage(const string &strCommand)
43*c33452fbSAndroid Build Coastguard Worker     : base(MsgType::ECommandRequest), _strCommand(strCommand)
44*c33452fbSAndroid Build Coastguard Worker {
45*c33452fbSAndroid Build Coastguard Worker }
46*c33452fbSAndroid Build Coastguard Worker 
CRequestMessage()47*c33452fbSAndroid Build Coastguard Worker CRequestMessage::CRequestMessage()
48*c33452fbSAndroid Build Coastguard Worker {
49*c33452fbSAndroid Build Coastguard Worker }
50*c33452fbSAndroid Build Coastguard Worker 
51*c33452fbSAndroid Build Coastguard Worker // Command Name
setCommand(const string & strCommand)52*c33452fbSAndroid Build Coastguard Worker void CRequestMessage::setCommand(const string &strCommand)
53*c33452fbSAndroid Build Coastguard Worker {
54*c33452fbSAndroid Build Coastguard Worker     _strCommand = trim(strCommand);
55*c33452fbSAndroid Build Coastguard Worker }
56*c33452fbSAndroid Build Coastguard Worker 
getCommand() const57*c33452fbSAndroid Build Coastguard Worker const string &CRequestMessage::getCommand() const
58*c33452fbSAndroid Build Coastguard Worker {
59*c33452fbSAndroid Build Coastguard Worker     return _strCommand;
60*c33452fbSAndroid Build Coastguard Worker }
61*c33452fbSAndroid Build Coastguard Worker 
62*c33452fbSAndroid Build Coastguard Worker // Arguments
addArgument(const string & strArgument)63*c33452fbSAndroid Build Coastguard Worker void CRequestMessage::addArgument(const string &strArgument)
64*c33452fbSAndroid Build Coastguard Worker {
65*c33452fbSAndroid Build Coastguard Worker     _argumentVector.push_back(trim(strArgument));
66*c33452fbSAndroid Build Coastguard Worker }
67*c33452fbSAndroid Build Coastguard Worker 
getArgumentCount() const68*c33452fbSAndroid Build Coastguard Worker size_t CRequestMessage::getArgumentCount() const
69*c33452fbSAndroid Build Coastguard Worker {
70*c33452fbSAndroid Build Coastguard Worker     return _argumentVector.size();
71*c33452fbSAndroid Build Coastguard Worker }
72*c33452fbSAndroid Build Coastguard Worker 
getArguments() const73*c33452fbSAndroid Build Coastguard Worker const std::vector<string> &CRequestMessage::getArguments() const
74*c33452fbSAndroid Build Coastguard Worker {
75*c33452fbSAndroid Build Coastguard Worker     return _argumentVector;
76*c33452fbSAndroid Build Coastguard Worker }
77*c33452fbSAndroid Build Coastguard Worker 
getArgument(size_t argument) const78*c33452fbSAndroid Build Coastguard Worker const string &CRequestMessage::getArgument(size_t argument) const
79*c33452fbSAndroid Build Coastguard Worker {
80*c33452fbSAndroid Build Coastguard Worker     assert(argument < _argumentVector.size());
81*c33452fbSAndroid Build Coastguard Worker 
82*c33452fbSAndroid Build Coastguard Worker     return _argumentVector[argument];
83*c33452fbSAndroid Build Coastguard Worker }
84*c33452fbSAndroid Build Coastguard Worker 
packArguments(size_t uiStartArgument,size_t uiNbArguments) const85*c33452fbSAndroid Build Coastguard Worker string CRequestMessage::packArguments(size_t uiStartArgument, size_t uiNbArguments) const
86*c33452fbSAndroid Build Coastguard Worker {
87*c33452fbSAndroid Build Coastguard Worker     assert(uiStartArgument + uiNbArguments <= _argumentVector.size());
88*c33452fbSAndroid Build Coastguard Worker 
89*c33452fbSAndroid Build Coastguard Worker     auto start = begin(_argumentVector) + uiStartArgument;
90*c33452fbSAndroid Build Coastguard Worker     return utility::asString(std::vector<std::string>(start, start + uiNbArguments), " ");
91*c33452fbSAndroid Build Coastguard Worker }
92*c33452fbSAndroid Build Coastguard Worker 
93*c33452fbSAndroid Build Coastguard Worker // Fill data to send
fillDataToSend()94*c33452fbSAndroid Build Coastguard Worker void CRequestMessage::fillDataToSend()
95*c33452fbSAndroid Build Coastguard Worker {
96*c33452fbSAndroid Build Coastguard Worker     // Send command
97*c33452fbSAndroid Build Coastguard Worker     writeString(getCommand());
98*c33452fbSAndroid Build Coastguard Worker 
99*c33452fbSAndroid Build Coastguard Worker     // Arguments
100*c33452fbSAndroid Build Coastguard Worker     for (size_t argument = 0; argument < getArgumentCount(); argument++) {
101*c33452fbSAndroid Build Coastguard Worker 
102*c33452fbSAndroid Build Coastguard Worker         writeString(getArgument(argument));
103*c33452fbSAndroid Build Coastguard Worker     }
104*c33452fbSAndroid Build Coastguard Worker }
105*c33452fbSAndroid Build Coastguard Worker 
106*c33452fbSAndroid Build Coastguard Worker // Collect received data
collectReceivedData()107*c33452fbSAndroid Build Coastguard Worker void CRequestMessage::collectReceivedData()
108*c33452fbSAndroid Build Coastguard Worker {
109*c33452fbSAndroid Build Coastguard Worker     // Receive command
110*c33452fbSAndroid Build Coastguard Worker     string strCommand;
111*c33452fbSAndroid Build Coastguard Worker 
112*c33452fbSAndroid Build Coastguard Worker     readString(strCommand);
113*c33452fbSAndroid Build Coastguard Worker 
114*c33452fbSAndroid Build Coastguard Worker     setCommand(strCommand);
115*c33452fbSAndroid Build Coastguard Worker 
116*c33452fbSAndroid Build Coastguard Worker     // Arguments
117*c33452fbSAndroid Build Coastguard Worker     while (getRemainingDataSize()) {
118*c33452fbSAndroid Build Coastguard Worker 
119*c33452fbSAndroid Build Coastguard Worker         string strArgument;
120*c33452fbSAndroid Build Coastguard Worker 
121*c33452fbSAndroid Build Coastguard Worker         readString(strArgument);
122*c33452fbSAndroid Build Coastguard Worker 
123*c33452fbSAndroid Build Coastguard Worker         addArgument(strArgument);
124*c33452fbSAndroid Build Coastguard Worker     }
125*c33452fbSAndroid Build Coastguard Worker }
126*c33452fbSAndroid Build Coastguard Worker 
127*c33452fbSAndroid Build Coastguard Worker // Size
getDataSize() const128*c33452fbSAndroid Build Coastguard Worker size_t CRequestMessage::getDataSize() const
129*c33452fbSAndroid Build Coastguard Worker {
130*c33452fbSAndroid Build Coastguard Worker     // Command
131*c33452fbSAndroid Build Coastguard Worker     size_t uiSize = getStringSize(getCommand());
132*c33452fbSAndroid Build Coastguard Worker 
133*c33452fbSAndroid Build Coastguard Worker     // Arguments
134*c33452fbSAndroid Build Coastguard Worker     for (size_t uiArgument = 0; uiArgument < getArgumentCount(); uiArgument++) {
135*c33452fbSAndroid Build Coastguard Worker 
136*c33452fbSAndroid Build Coastguard Worker         uiSize += getStringSize(getArgument(uiArgument));
137*c33452fbSAndroid Build Coastguard Worker     }
138*c33452fbSAndroid Build Coastguard Worker     return uiSize;
139*c33452fbSAndroid Build Coastguard Worker }
140*c33452fbSAndroid Build Coastguard Worker 
141*c33452fbSAndroid Build Coastguard Worker // Trim input string
trim(const string & strToTrim)142*c33452fbSAndroid Build Coastguard Worker string CRequestMessage::trim(const string &strToTrim)
143*c33452fbSAndroid Build Coastguard Worker {
144*c33452fbSAndroid Build Coastguard Worker     // Trim string
145*c33452fbSAndroid Build Coastguard Worker     string strTrimmed = strToTrim;
146*c33452fbSAndroid Build Coastguard Worker 
147*c33452fbSAndroid Build Coastguard Worker     strTrimmed.erase(strTrimmed.find_last_not_of(gacDelimiters) + 1);
148*c33452fbSAndroid Build Coastguard Worker 
149*c33452fbSAndroid Build Coastguard Worker     strTrimmed.erase(0, strTrimmed.find_first_not_of(gacDelimiters));
150*c33452fbSAndroid Build Coastguard Worker 
151*c33452fbSAndroid Build Coastguard Worker     return strTrimmed;
152*c33452fbSAndroid Build Coastguard Worker }
153