diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Server/Packets/PacketUtilities.h | 47 |
1 files changed, 30 insertions, 17 deletions
diff --git a/src/server/game/Server/Packets/PacketUtilities.h b/src/server/game/Server/Packets/PacketUtilities.h index 932b3491344..f5c4febcd49 100644 --- a/src/server/game/Server/Packets/PacketUtilities.h +++ b/src/server/game/Server/Packets/PacketUtilities.h @@ -60,6 +60,12 @@ namespace WorldPackets namespace Strings { + enum Utf8Mode : uint8 + { + DontValidateUtf8, + ValidUtf8 + }; + struct RawBytes { static bool Validate(std::string_view /*value*/) { return true; } }; template<std::size_t MaxBytesWithoutNullTerminator> struct ByteSize { static bool Validate(std::string_view value) { return value.size() <= MaxBytesWithoutNullTerminator; } }; @@ -513,32 +519,34 @@ namespace WorldPackets inline BitsSizeReaderWriter<BitCount, Container> BitsSize(Container& value) { return { value }; } template<typename Container> - struct SizedStringWriter + struct DataWriter { Container const& Value; - friend inline ByteBuffer& operator<<(ByteBuffer& data, SizedStringWriter const& string) + friend inline ByteBuffer& operator<<(ByteBuffer& data, DataWriter const& string) { data.WriteString(string.Value); return data; } }; - template<typename Container> - struct SizedStringReaderWriter : SizedStringWriter<Container> + template<typename Container, Strings::Utf8Mode Mode> + struct DataReaderWriter : DataWriter<Container> { - friend inline ByteBuffer& operator>>(ByteBuffer& data, SizedStringReaderWriter const& string) + static constexpr bool IsUtf8() { return Mode == Strings::ValidUtf8; } + + friend inline ByteBuffer& operator>>(ByteBuffer& data, DataReaderWriter const& string) { - const_cast<Container&>(string.Value) = data.ReadString(string.Value.length()); + const_cast<Container&>(string.Value) = data.ReadString(string.Value.length(), IsUtf8()); return data; } }; - template<typename Container> - inline SizedStringWriter<Container> Data(Container const& value) { return { value }; } + template<Strings::Utf8Mode = Strings::ValidUtf8, typename Container> + inline DataWriter<Container> Data(Container const& value) { return { value }; } - template<typename Container> - inline SizedStringReaderWriter<Container> Data(Container& value) { return { value }; } + template<Strings::Utf8Mode Mode = Strings::ValidUtf8, typename Container> + inline DataReaderWriter<Container, Mode> Data(Container& value) { return { value }; } } // SizedCString (sends size + string + null terminator but only if not empty) @@ -581,31 +589,36 @@ namespace WorldPackets friend inline ByteBuffer& operator<<(ByteBuffer& data, DataWriter const& string) { if (!string.Value.empty()) - data << string.Value; + { + data.WriteString(string.Value); + data << char('\0'); + } return data; } }; - template<typename Container> + template<typename Container, Strings::Utf8Mode Mode> struct DataReaderWriter : DataWriter<Container> { + static constexpr bool IsUtf8() { return Mode == Strings::ValidUtf8; } + friend inline ByteBuffer& operator>>(ByteBuffer& data, DataReaderWriter const& string) { if (!string.Value.empty()) { - const_cast<Container&>(string.Value) = data.ReadString(string.Value.length()); + const_cast<Container&>(string.Value) = data.ReadString(string.Value.length(), IsUtf8()); (void)data.read<char>(); // null terminator } return data; } }; - template<typename Container> + template<Strings::Utf8Mode = Strings::ValidUtf8, typename Container> inline DataWriter<Container> Data(Container const& value) { return { value }; } - template<typename Container> - inline DataReaderWriter<Container> Data(Container& value) { return { value }; } - }; + template<Strings::Utf8Mode Mode = Strings::ValidUtf8, typename Container> + inline DataReaderWriter<Container, Mode> Data(Container& value) { return { value }; } + } } #endif // PacketUtilities_h__ |