From 59087d29cc992a439650616ddf68537cc3ded37d Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Mon, 5 Mar 2018 21:19:58 +0300 Subject: Moved same methods from messagein into one file. --- src/net/messagein.cpp | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) (limited to 'src/net/messagein.cpp') diff --git a/src/net/messagein.cpp b/src/net/messagein.cpp index 150111cc2..1e0ac22db 100644 --- a/src/net/messagein.cpp +++ b/src/net/messagein.cpp @@ -31,6 +31,13 @@ #include "debug.h" +PRAGMA48(GCC diagnostic push) +PRAGMA48(GCC diagnostic ignored "-Wshadow") +#ifndef SDL_BIG_ENDIAN +#include +#endif // SDL_BYTEORDER +PRAGMA48(GCC diagnostic pop) + #define MAKEWORD(low, high) \ (CAST_U16((CAST_U8(low)) | \ (CAST_U16(CAST_U8(high))) << 8)) @@ -71,6 +78,23 @@ MessageIn::~MessageIn() } } +uint16_t MessageIn::readId() const +{ + int16_t value = -1; + if (mPos + 2 <= mLength) + { +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + int16_t swap; + memcpy(&swap, mData + CAST_SIZE(mPos), sizeof(int16_t)); + value = SDL_Swap16(swap); +#else // SDL_BYTEORDER == SDL_BIG_ENDIAN + + memcpy(&value, mData + CAST_SIZE(mPos), sizeof(int16_t)); +#endif // SDL_BYTEORDER == SDL_BIG_ENDIAN + } + return value; +} + unsigned char MessageIn::readUInt8(const char *const str) { unsigned char value = CAST_U8(-1); @@ -98,6 +122,97 @@ signed char MessageIn::readInt8(const char *const str) return value; } +int16_t MessageIn::readInt16(const char *const str) +{ + int16_t value = -1; + if (mPos + 2 <= mLength) + { +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + int16_t swap; + memcpy(&swap, mData + CAST_SIZE(mPos), sizeof(int16_t)); + value = SDL_Swap16(swap); +#else // SDL_BYTEORDER == SDL_BIG_ENDIAN + + memcpy(&value, mData + CAST_SIZE(mPos), sizeof(int16_t)); +#endif // SDL_BYTEORDER == SDL_BIG_ENDIAN + } + DEBUGLOG2("readInt16: " + toStringPrint(CAST_U32( + CAST_U16(value))), + mPos, str); + mPos += 2; + PacketCounters::incInBytes(2); + return value; +} + +uint16_t MessageIn::readUInt16(const char *const str) +{ + uint16_t value = 0xffU; + if (mPos + 2 <= mLength) + { +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + uint16_t swap; + memcpy(&swap, mData + CAST_SIZE(mPos), sizeof(uint16_t)); + value = SDL_Swap16(swap); +#else // SDL_BYTEORDER == SDL_BIG_ENDIAN + + memcpy(&value, mData + CAST_SIZE(mPos), sizeof(uint16_t)); +#endif // SDL_BYTEORDER == SDL_BIG_ENDIAN + } + DEBUGLOG2("readUInt16: " + toStringPrint(CAST_U32( + CAST_U16(value))), + mPos, str); + mPos += 2; + PacketCounters::incInBytes(2); + return value; +} + +int32_t MessageIn::readInt32(const char *const str) +{ + int32_t value = -1; + if (mPos + 4 <= mLength) + { +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + int32_t swap; + memcpy(&swap, mData + CAST_SIZE(mPos), sizeof(int32_t)); + value = SDL_Swap32(swap); +#else // SDL_BYTEORDER == SDL_BIG_ENDIAN + + memcpy(&value, mData + CAST_SIZE(mPos), sizeof(int32_t)); +#endif // SDL_BYTEORDER == SDL_BIG_ENDIAN + } + DEBUGLOG2("readInt32: " + toStringPrint(CAST_U32(value)), + mPos, str); + mPos += 4; + PacketCounters::incInBytes(4); + return value; +} + +BeingId MessageIn::readBeingId(const char *const str) +{ + return fromInt(readInt32(str), BeingId); +} + +int64_t MessageIn::readInt64(const char *const str) +{ + int64_t value = -1; + if (mPos + 8 <= mLength) + { +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + int64_t swap; + memcpy(&swap, mData + CAST_SIZE(mPos), sizeof(int64_t)); + value = SDL_Swap64(swap); +#else // SDL_BYTEORDER == SDL_BIG_ENDIAN + + memcpy(&value, mData + CAST_SIZE(mPos), sizeof(int64_t)); +#endif // SDL_BYTEORDER == SDL_BIG_ENDIAN + } + DEBUGLOG2("readInt64: " + toStringPrint(CAST_U32(value)), + mPos, str); + mPos += 8; + PacketCounters::incInBytes(8); + return value; +} + uint8_t MessageIn::fromServerDirection(const uint8_t serverDir) { // Translate from eAthena format -- cgit v1.2.3-60-g2f50