diff --git a/include/SFML/Network/Packet.hpp b/include/SFML/Network/Packet.hpp index eacae8a1b..84763a318 100644 --- a/include/SFML/Network/Packet.hpp +++ b/include/SFML/Network/Packet.hpp @@ -181,6 +181,8 @@ public: Packet& operator >>(Uint16& data); Packet& operator >>(Int32& data); Packet& operator >>(Uint32& data); + Packet& operator >>(Int64& data); + Packet& operator >>(Uint64& data); Packet& operator >>(float& data); Packet& operator >>(double& data); Packet& operator >>(char* data); @@ -200,6 +202,8 @@ public: Packet& operator <<(Uint16 data); Packet& operator <<(Int32 data); Packet& operator <<(Uint32 data); + Packet& operator <<(Int64 data); + Packet& operator <<(Uint64 data); Packet& operator <<(float data); Packet& operator <<(double data); Packet& operator <<(const char* data); diff --git a/src/SFML/Network/Packet.cpp b/src/SFML/Network/Packet.cpp index ab4615ab8..35328f745 100644 --- a/src/SFML/Network/Packet.cpp +++ b/src/SFML/Network/Packet.cpp @@ -188,6 +188,52 @@ Packet& Packet::operator >>(Uint32& data) } +//////////////////////////////////////////////////////////// +Packet& Packet::operator >>(Int64& data) +{ + if (checkSize(sizeof(data))) + { + // Since ntohll is not available everywhere, we have to convert + // to network byte order (big endian) manually + const Uint8* bytes = reinterpret_cast(&m_data[m_readPos]); + data = (static_cast(bytes[0]) << 56) | + (static_cast(bytes[1]) << 48) | + (static_cast(bytes[2]) << 40) | + (static_cast(bytes[3]) << 32) | + (static_cast(bytes[4]) << 24) | + (static_cast(bytes[5]) << 16) | + (static_cast(bytes[6]) << 8) | + (static_cast(bytes[7]) ); + m_readPos += sizeof(data); + } + + return *this; +} + + +//////////////////////////////////////////////////////////// +Packet& Packet::operator >>(Uint64& data) +{ + if (checkSize(sizeof(data))) + { + // Since ntohll is not available everywhere, we have to convert + // to network byte order (big endian) manually + const Uint8* bytes = reinterpret_cast(&m_data[m_readPos]); + data = (static_cast(bytes[0]) << 56) | + (static_cast(bytes[1]) << 48) | + (static_cast(bytes[2]) << 40) | + (static_cast(bytes[3]) << 32) | + (static_cast(bytes[4]) << 24) | + (static_cast(bytes[5]) << 16) | + (static_cast(bytes[6]) << 8) | + (static_cast(bytes[7]) ); + m_readPos += sizeof(data); + } + + return *this; +} + + //////////////////////////////////////////////////////////// Packet& Packet::operator >>(float& data) { @@ -385,6 +431,48 @@ Packet& Packet::operator <<(Uint32 data) } +//////////////////////////////////////////////////////////// +Packet& Packet::operator <<(Int64 data) +{ + // Since htonll is not available everywhere, we have to convert + // to network byte order (big endian) manually + Uint8 toWrite[] = + { + (data >> 56) & 0xFF, + (data >> 48) & 0xFF, + (data >> 40) & 0xFF, + (data >> 32) & 0xFF, + (data >> 24) & 0xFF, + (data >> 16) & 0xFF, + (data >> 8) & 0xFF, + (data ) & 0xFF + }; + append(&toWrite, sizeof(toWrite)); + return *this; +} + + +//////////////////////////////////////////////////////////// +Packet& Packet::operator <<(Uint64 data) +{ + // Since htonll is not available everywhere, we have to convert + // to network byte order (big endian) manually + Uint8 toWrite[] = + { + (data >> 56) & 0xFF, + (data >> 48) & 0xFF, + (data >> 40) & 0xFF, + (data >> 32) & 0xFF, + (data >> 24) & 0xFF, + (data >> 16) & 0xFF, + (data >> 8) & 0xFF, + (data ) & 0xFF + }; + append(&toWrite, sizeof(toWrite)); + return *this; +} + + //////////////////////////////////////////////////////////// Packet& Packet::operator <<(float data) {