diff options
Diffstat (limited to 'src/net/messagein.cpp')
-rw-r--r-- | src/net/messagein.cpp | 174 |
1 files changed, 45 insertions, 129 deletions
diff --git a/src/net/messagein.cpp b/src/net/messagein.cpp index bbc0a44c..a1707e06 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,9 @@ #include "messagein.h" -#include <cassert> -#include <SDL.h> -#include <SDL_endian.h> - -#define MAKEWORD(low,high) \ - ((unsigned short)(((unsigned char)(low)) | \ - ((unsigned short)((unsigned char)(high))) << 8)) +#include <string> +#include <enet/enet.h> MessageIn::MessageIn(const char *data, unsigned int length): mData(data), @@ -38,157 +33,78 @@ 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() -{ - 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() +char MessageIn::readByte() { - 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 + char value = -1; + if (mPos < mLength) + { + value = mData[mPos]; + } + mPos += 1; + return value; } -void -MessageIn::readCoordinates(Uint16 &x, Uint16 &y, Uint8 &direction) +short MessageIn::readShort() { - 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) + short value = -1; + if (mPos + 2 <= 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; + uint16_t t; + memcpy(&t, mData + mPos, 2); + value = ENET_NET_TO_HOST_16(t); } - - mPos += 3; + mPos += 2; + return value; } -void -MessageIn::readCoordinatePair(Uint16 &srcX, Uint16 &srcY, - Uint16 &dstX, Uint16 &dstY) +long MessageIn::readLong() { - 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; + 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; } -void -MessageIn::skip(unsigned int length) +void MessageIn::readCoordinates(Uint16 &x, Uint16 &y) { - assert(mPos + length <= mLength); - mPos += length; + if (mPos + 3 <= mLength) + { + unsigned char const *p = reinterpret_cast< unsigned char const * >(mData + mPos); + x = p[0] | ((p[1] & 0x07) << 8); + y = (p[1] >> 3) | ((p[2] & 0x3F) << 5); + } + mPos += 3; } -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); + 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; -} |