• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2011-2014, Intel Corporation
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without modification,
6  * are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice, this
9  * list of conditions and the following disclaimer.
10  *
11  * 2. Redistributions in binary form must reproduce the above copyright notice,
12  * this list of conditions and the following disclaimer in the documentation and/or
13  * other materials provided with the distribution.
14  *
15  * 3. Neither the name of the copyright holder nor the names of its contributors
16  * may be used to endorse or promote products derived from this software without
17  * specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
23  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30 #include "RequestMessage.h"
31 #include "Utility.h"
32 #include <assert.h>
33 #include <algorithm>
34 #include <ctype.h>
35 
36 #define base CMessage
37 
38 using std::string;
39 
40 const char *const CRequestMessage::gacDelimiters = " \t\n\v\f\r";
41 
CRequestMessage(const string & strCommand)42 CRequestMessage::CRequestMessage(const string &strCommand)
43     : base(MsgType::ECommandRequest), _strCommand(strCommand)
44 {
45 }
46 
CRequestMessage()47 CRequestMessage::CRequestMessage()
48 {
49 }
50 
51 // Command Name
setCommand(const string & strCommand)52 void CRequestMessage::setCommand(const string &strCommand)
53 {
54     _strCommand = trim(strCommand);
55 }
56 
getCommand() const57 const string &CRequestMessage::getCommand() const
58 {
59     return _strCommand;
60 }
61 
62 // Arguments
addArgument(const string & strArgument)63 void CRequestMessage::addArgument(const string &strArgument)
64 {
65     _argumentVector.push_back(trim(strArgument));
66 }
67 
getArgumentCount() const68 size_t CRequestMessage::getArgumentCount() const
69 {
70     return _argumentVector.size();
71 }
72 
getArguments() const73 const std::vector<string> &CRequestMessage::getArguments() const
74 {
75     return _argumentVector;
76 }
77 
getArgument(size_t argument) const78 const string &CRequestMessage::getArgument(size_t argument) const
79 {
80     assert(argument < _argumentVector.size());
81 
82     return _argumentVector[argument];
83 }
84 
packArguments(size_t uiStartArgument,size_t uiNbArguments) const85 string CRequestMessage::packArguments(size_t uiStartArgument, size_t uiNbArguments) const
86 {
87     assert(uiStartArgument + uiNbArguments <= _argumentVector.size());
88 
89     auto start = begin(_argumentVector) + uiStartArgument;
90     return utility::asString(std::vector<std::string>(start, start + uiNbArguments), " ");
91 }
92 
93 // Fill data to send
fillDataToSend()94 void CRequestMessage::fillDataToSend()
95 {
96     // Send command
97     writeString(getCommand());
98 
99     // Arguments
100     for (size_t argument = 0; argument < getArgumentCount(); argument++) {
101 
102         writeString(getArgument(argument));
103     }
104 }
105 
106 // Collect received data
collectReceivedData()107 void CRequestMessage::collectReceivedData()
108 {
109     // Receive command
110     string strCommand;
111 
112     readString(strCommand);
113 
114     setCommand(strCommand);
115 
116     // Arguments
117     while (getRemainingDataSize()) {
118 
119         string strArgument;
120 
121         readString(strArgument);
122 
123         addArgument(strArgument);
124     }
125 }
126 
127 // Size
getDataSize() const128 size_t CRequestMessage::getDataSize() const
129 {
130     // Command
131     size_t uiSize = getStringSize(getCommand());
132 
133     // Arguments
134     for (size_t uiArgument = 0; uiArgument < getArgumentCount(); uiArgument++) {
135 
136         uiSize += getStringSize(getArgument(uiArgument));
137     }
138     return uiSize;
139 }
140 
141 // Trim input string
trim(const string & strToTrim)142 string CRequestMessage::trim(const string &strToTrim)
143 {
144     // Trim string
145     string strTrimmed = strToTrim;
146 
147     strTrimmed.erase(strTrimmed.find_last_not_of(gacDelimiters) + 1);
148 
149     strTrimmed.erase(0, strTrimmed.find_first_not_of(gacDelimiters));
150 
151     return strTrimmed;
152 }
153