diff options
author | Andrei Karas <akaras@inbox.ru> | 2018-03-05 21:19:58 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2018-03-05 21:42:06 +0300 |
commit | 59087d29cc992a439650616ddf68537cc3ded37d (patch) | |
tree | 6ea3ac278a32bbe51aa76e3e2dc0f739835dbbad /src/net/messagein.cpp | |
parent | 8032eb0f2345ed6b9097277034d94066af66f4fd (diff) | |
download | mv-59087d29cc992a439650616ddf68537cc3ded37d.tar.gz mv-59087d29cc992a439650616ddf68537cc3ded37d.tar.bz2 mv-59087d29cc992a439650616ddf68537cc3ded37d.tar.xz mv-59087d29cc992a439650616ddf68537cc3ded37d.zip |
Moved same methods from messagein into one file.
Diffstat (limited to 'src/net/messagein.cpp')
-rw-r--r-- | src/net/messagein.cpp | 115 |
1 files changed, 115 insertions, 0 deletions
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 <SDL_endian.h> +#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 |