Home | History | Annotate | Download | only in remote-processor
      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 
     41 CRequestMessage::CRequestMessage(const string &strCommand)
     42     : base(MsgType::ECommandRequest), _strCommand(strCommand)
     43 {
     44 }
     45 
     46 CRequestMessage::CRequestMessage()
     47 {
     48 }
     49 
     50 // Command Name
     51 void CRequestMessage::setCommand(const string &strCommand)
     52 {
     53     _strCommand = trim(strCommand);
     54 }
     55 
     56 const string &CRequestMessage::getCommand() const
     57 {
     58     return _strCommand;
     59 }
     60 
     61 // Arguments
     62 void CRequestMessage::addArgument(const string &strArgument)
     63 {
     64     _argumentVector.push_back(trim(strArgument));
     65 }
     66 
     67 size_t CRequestMessage::getArgumentCount() const
     68 {
     69     return _argumentVector.size();
     70 }
     71 
     72 const std::vector<string> &CRequestMessage::getArguments() const
     73 {
     74     return _argumentVector;
     75 }
     76 
     77 const string &CRequestMessage::getArgument(size_t argument) const
     78 {
     79     assert(argument < _argumentVector.size());
     80 
     81     return _argumentVector[argument];
     82 }
     83 
     84 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
    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
    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
    145 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
    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