diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/messagein.cpp | 137 | ||||
-rw-r--r-- | src/messagein.h | 17 |
2 files changed, 151 insertions, 3 deletions
diff --git a/src/messagein.cpp b/src/messagein.cpp index 4c7dbddb..3fc72e5a 100644 --- a/src/messagein.cpp +++ b/src/messagein.cpp @@ -22,4 +22,141 @@ */ #include "messagein.h" +#include <SDL_net.h> +/** + * Constructor. + */ +MessageIn::MessageIn(Packet *p) +{ + pos = 0; + packet = p; +} + +/** + * Destructor. + */ +MessageIn::~MessageIn() +{ + delete packet; // To be removed if the packet is deleted elsewhere. +} + +/**< Reads a byte. */ +char MessageIn::readByte() +{ + if (packet) // if Packet exists + { + if ( pos < (packet->length - 1) ) // if there is enough to read + { + pos++; + return packet->data[pos - 1]; + } + else + { + pos = packet->length - 1; + return 0; + } + } + return -1; +} + +/**< Reads a short. */ +short MessageIn::readShort() +{ + if (packet) // if Packet exists + { + if ( (pos + sizeof(short)) <= (packet->length - 1) ) + { + pos += sizeof(short); + return (short) SDLNet_Read16(&(packet->data[pos - sizeof(short)])); + } + else + { + // We do nothing. And keep what's left to be read by a function + // that requires less length. + } + } + return -1; +} + +/**< Reads a long. */ +long MessageIn::readLong() +{ + if (packet) // if Packet exists + { + if ( (pos + sizeof(long)) <= (packet->length - 1) ) + { + pos += sizeof(long); + return (long) SDLNet_Read32(&(packet->data[pos - sizeof(long)])); + } + else + { + // We do nothing. And keep what's left to be read by a function + // that requires less length. + } + } + return -1; +} + +/** + * Reads a string. If a length is not given (-1), it is assumed + * that the length of the string is stored in a short at the + * start of the string. + */ +std::string MessageIn::readString(int length) +{ + if (packet) // If there a good packet + { + int stringLength = 0; + std::string readString = ""; + + if ( length != -1 ) // if the length isn't specified, read it in the packet + { + // If the length of the packet is sufficient for us to read the length of the string + if ( (pos + sizeof(short)) <= (packet->length - 1) ) + { + // We first read the length of the string given by the short before it. + stringLength = (short)SDLNet_Read16(&(packet->data[pos])); + pos += sizeof(short); + } + else + { + // Place us to the end as the size is a short + pos = packet->length - 1; + } + } + else // if the length is specified + { + stringLength = length; + } + + if ( stringLength > 0 ) + { + if ( (pos + stringLength) <= (packet->length - 1) ) // If there's enough length to copy + { + char tempChar[stringLength+1]; + memcpy(&tempChar, packet->data, stringLength); + readString = tempChar; // We first copy the entire char array + // And then, we copy from the pos + // to the stringLength. + readString = readString.substr(pos,stringLength); + pos += stringLength; + } + else // if there isn't, copy till the end + { + char tempChar[packet->length +1]; + memcpy(&tempChar, packet->data, packet->length - 1); + readString = tempChar; // We first copy the entire char array + // And then, we copy from the pos + // to the length - 1 of the string. + readString = readString.substr(pos,packet->length - 1 - pos); + pos = packet->length - 1; + } + } + else + { + // The length of the string is zero ? + } + } // End if there is a packet + return ""; +}
\ No newline at end of file diff --git a/src/messagein.h b/src/messagein.h index bb12ad05..e46392b4 100644 --- a/src/messagein.h +++ b/src/messagein.h @@ -38,9 +38,15 @@ class MessageIn */ MessageIn(Packet *p); + /** + * Destructor. + */ + ~MessageIn(); + + char readByte(); /**< Reads a byte. */ - int readShort(); /**< Reads a short. */ - int readLong(); /**< Reads a long. */ + short readShort(); /**< Reads a short. */ + long readLong(); /**< Reads a long. */ /** * Reads a string. If a length is not given (-1), it is assumed @@ -51,7 +57,12 @@ class MessageIn private: Packet *packet; - unsigned int pos; + + /** + * Actual Position in the packet + * From 0 to p->length - 1. + */ + unsigned int pos; }; #endif |