• 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 <assert.h>
32  #include <algorithm>
33  #include <ctype.h>
34  
35  #define base CMessage
36  
37  using std::string;
38  
39  const char *const CRequestMessage::gacDelimiters = " \t\n\v\f\r";
40  
CRequestMessage(const string & strCommand)41  CRequestMessage::CRequestMessage(const string &strCommand)
42      : base(MsgType::ECommandRequest), _strCommand(strCommand)
43  {
44  }
45  
CRequestMessage()46  CRequestMessage::CRequestMessage()
47  {
48  }
49  
50  // Command Name
setCommand(const string & strCommand)51  void CRequestMessage::setCommand(const string &strCommand)
52  {
53      _strCommand = trim(strCommand);
54  }
55  
getCommand() const56  const string &CRequestMessage::getCommand() const
57  {
58      return _strCommand;
59  }
60  
61  // Arguments
addArgument(const string & strArgument)62  void CRequestMessage::addArgument(const string &strArgument)
63  {
64      _argumentVector.push_back(trim(strArgument));
65  }
66  
getArgumentCount() const67  size_t CRequestMessage::getArgumentCount() const
68  {
69      return _argumentVector.size();
70  }
71  
getArguments() const72  const std::vector<string> &CRequestMessage::getArguments() const
73  {
74      return _argumentVector;
75  }
76  
getArgument(size_t argument) const77  const string &CRequestMessage::getArgument(size_t argument) const
78  {
79      assert(argument < _argumentVector.size());
80  
81      return _argumentVector[argument];
82  }
83  
packArguments(size_t uiStartArgument,size_t uiNbArguments) const84  const string CRequestMessage::packArguments(size_t uiStartArgument, size_t uiNbArguments) const
85  {
86      string strPackedArguments;
87  
88      assert(uiStartArgument + uiNbArguments <= _argumentVector.size());
89  
90      // Pack arguments, separating them with a space
91      bool bFirst = true;
92  
93      for (size_t argument = uiStartArgument; argument < uiStartArgument + uiNbArguments;
94           argument++) {
95  
96          if (!bFirst) {
97  
98              strPackedArguments += " ";
99          } else {
100  
101              bFirst = false;
102          }
103  
104          strPackedArguments += _argumentVector[argument];
105      }
106  
107      return strPackedArguments;
108  }
109  
110  // Fill data to send
fillDataToSend()111  void CRequestMessage::fillDataToSend()
112  {
113      // Send command
114      writeString(getCommand());
115  
116      // Arguments
117      for (size_t argument = 0; argument < getArgumentCount(); argument++) {
118  
119          writeString(getArgument(argument));
120      }
121  }
122  
123  // Collect received data
collectReceivedData()124  void CRequestMessage::collectReceivedData()
125  {
126      // Receive command
127      string strCommand;
128  
129      readString(strCommand);
130  
131      setCommand(strCommand);
132  
133      // Arguments
134      while (getRemainingDataSize()) {
135  
136          string strArgument;
137  
138          readString(strArgument);
139  
140          addArgument(strArgument);
141      }
142  }
143  
144  // Size
getDataSize() const145  size_t CRequestMessage::getDataSize() const
146  {
147      // Command
148      size_t uiSize = getStringSize(getCommand());
149  
150      // Arguments
151      for (size_t uiArgument = 0; uiArgument < getArgumentCount(); uiArgument++) {
152  
153          uiSize += getStringSize(getArgument(uiArgument));
154      }
155      return uiSize;
156  }
157  
158  // Trim input string
trim(const string & strToTrim)159  string CRequestMessage::trim(const string &strToTrim)
160  {
161      // Trim string
162      string strTrimmed = strToTrim;
163  
164      strTrimmed.erase(strTrimmed.find_last_not_of(gacDelimiters) + 1);
165  
166      strTrimmed.erase(0, strTrimmed.find_first_not_of(gacDelimiters));
167  
168      return strTrimmed;
169  }
170