summaryrefslogtreecommitdiff
path: root/src/net/messagein.cpp
diff options
context:
space:
mode:
authorEugenio Favalli <elvenprogrammer@gmail.com>2006-07-25 18:04:38 +0000
committerEugenio Favalli <elvenprogrammer@gmail.com>2006-07-25 18:04:38 +0000
commitc7e7b62aa94bf295ca1dc556762ad6070221e0cd (patch)
tree04f827df0df64a80e04a4115986609486d715237 /src/net/messagein.cpp
parentc0c8775271679ac4904bc0bc02a74d28fc75efd0 (diff)
downloadmana-c7e7b62aa94bf295ca1dc556762ad6070221e0cd.tar.gz
mana-c7e7b62aa94bf295ca1dc556762ad6070221e0cd.tar.bz2
mana-c7e7b62aa94bf295ca1dc556762ad6070221e0cd.tar.xz
mana-c7e7b62aa94bf295ca1dc556762ad6070221e0cd.zip
Switched client to use enet and modified login sequence to work with the new protocol from tmwserv.
Diffstat (limited to 'src/net/messagein.cpp')
-rw-r--r--src/net/messagein.cpp171
1 files changed, 39 insertions, 132 deletions
diff --git a/src/net/messagein.cpp b/src/net/messagein.cpp
index bbc0a44c..7e85a813 100644
--- a/src/net/messagein.cpp
+++ b/src/net/messagein.cpp
@@ -1,5 +1,5 @@
/*
- * The Mana World
+ * The Mana World Server
* Copyright 2004 The Mana World Development Team
*
* This file is part of The Mana World.
@@ -23,14 +23,11 @@
#include "messagein.h"
-#include <cassert>
-#include <SDL.h>
-#include <SDL_endian.h>
+#include <string>
-#define MAKEWORD(low,high) \
- ((unsigned short)(((unsigned char)(low)) | \
- ((unsigned short)((unsigned char)(high))) << 8))
+#include <enet/enet.h>
+#include "packet.h"
MessageIn::MessageIn(const char *data, unsigned int length):
mData(data),
@@ -38,157 +35,67 @@ MessageIn::MessageIn(const char *data, unsigned int length):
mPos(0)
{
// Read the message ID
- mId = readInt16();
+ mId = readShort();
}
-Sint8
-MessageIn::readInt8()
+MessageIn::~MessageIn()
{
- assert(mPos < mLength);
- return mData[mPos++];
}
-Sint16
-MessageIn::readInt16()
+char MessageIn::readByte()
{
- assert(mPos + 2 <= mLength);
- mPos += 2;
-#if SDL_BYTEORDER == SDL_BIG_ENDIAN
- return SDL_Swap16(*(Sint16*)(mData + (mPos - 2)));
-#else
- return (*(Sint16*)(mData + (mPos - 2)));
-#endif
-}
-
-Sint32
-MessageIn::readInt32()
-{
- assert(mPos + 4 <= mLength);
- mPos += 4;
-#if SDL_BYTEORDER == SDL_BIG_ENDIAN
- return SDL_Swap32(*(Sint32*)(mData + (mPos - 4)));
-#else
- return (*(Sint32*)(mData + (mPos - 4)));
-#endif
-}
-
-void
-MessageIn::readCoordinates(Uint16 &x, Uint16 &y, Uint8 &direction)
-{
- assert(mPos + 3 <= mLength);
-
- const char *data = mData + mPos;
- Sint16 temp;
-
- temp = MAKEWORD(data[1] & 0x00c0, data[0] & 0x00ff);
- x = temp >> 6;
- temp = MAKEWORD(data[2] & 0x00f0, data[1] & 0x003f);
- y = temp >> 4;
-
- direction = data[2] & 0x000f;
-
- // Translate from eAthena format
- switch (direction)
+ char value = -1;
+ if (mPos < mLength)
{
- case 0:
- direction = 1;
- break;
- case 1:
- direction = 3;
- break;
- case 2:
- direction = 2;
- break;
- case 3:
- direction = 6;
- break;
- case 4:
- direction = 4;
- break;
- case 5:
- direction = 12;
- break;
- case 6:
- direction = 8;
- break;
- case 7:
- direction = 9;
- break;
- default:
- // OOPSIE! Impossible or unknown
- direction = 0;
+ value = mData[mPos];
}
-
- mPos += 3;
+ mPos += 1;
+ return value;
}
-void
-MessageIn::readCoordinatePair(Uint16 &srcX, Uint16 &srcY,
- Uint16 &dstX, Uint16 &dstY)
+short MessageIn::readShort()
{
- assert(mPos + 5 <= mLength);
-
- const char *data = mData + mPos;
- Sint16 temp;
-
- temp = MAKEWORD(data[3], data[2] & 0x000f);
- dstX = temp >> 2;
-
- dstY = MAKEWORD(data[4], data[3] & 0x0003);
-
- temp = MAKEWORD(data[1], data[0]);
- srcX = temp >> 6;
-
- temp = MAKEWORD(data[2], data[1] & 0x003f);
- srcY = temp >> 4;
-
- mPos += 5;
+ short value = -1;
+ if (mPos + 2 <= mLength)
+ {
+ uint16_t t;
+ memcpy(&t, mData + mPos, 2);
+ value = ENET_NET_TO_HOST_16(t);
+ }
+ mPos += 2;
+ return value;
}
-void
-MessageIn::skip(unsigned int length)
+long MessageIn::readLong()
{
- assert(mPos + length <= mLength);
- mPos += length;
+ long value = -1;
+ if (mPos + 4 <= mLength)
+ {
+ uint32_t t;
+ memcpy(&t, mData + mPos, 4);
+ value = ENET_NET_TO_HOST_32(t);
+ }
+ mPos += 4;
+ return value;
}
-std::string
-MessageIn::readString(int length)
+std::string MessageIn::readString(int length)
{
// Get string length
if (length < 0) {
- length = readInt16();
+ length = readShort();
}
- // Make sure the string isn't erroneous
+ // Make sure the string isn't erroneus
if (length < 0 || mPos + length > mLength) {
mPos = mLength + 1;
return "";
}
- // Read the string
- char const *stringBeg = mData + mPos;
- char const *stringEnd = (char const *)memchr(stringBeg, '\0', length);
- std::string readString(stringBeg,
- stringEnd ? stringEnd - stringBeg : length);
+ // Read the string
+ char const *stringBeg = mData + mPos,
+ *stringEnd = (char const *)memchr(stringBeg, '\0', length);
+ std::string readString(stringBeg, stringEnd ? stringEnd - stringBeg : length);
mPos += length;
return readString;
}
-
-Sint8& operator<<(Sint8 &lhs, MessageIn &msg)
-{
- lhs = msg.readInt8();
- return lhs;
-}
-
-Sint16& operator<<(Sint16 &lhs, MessageIn &msg)
-{
- lhs = msg.readInt16();
- return lhs;
-}
-
-Sint32& operator<<(Sint32 &lhs, MessageIn &msg)
-{
- lhs = msg.readInt32();
- return lhs;
-}