summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/messagein.cpp137
-rw-r--r--src/messagein.h17
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