diff options
Diffstat (limited to 'src/server/shared/Packets/ByteBuffer.h')
-rw-r--r-- | src/server/shared/Packets/ByteBuffer.h | 167 |
1 files changed, 11 insertions, 156 deletions
diff --git a/src/server/shared/Packets/ByteBuffer.h b/src/server/shared/Packets/ByteBuffer.h index 1dc5fee6a12..77f09455cc7 100644 --- a/src/server/shared/Packets/ByteBuffer.h +++ b/src/server/shared/Packets/ByteBuffer.h @@ -20,9 +20,9 @@ #define _BYTEBUFFER_H #include "Define.h" -#include "Errors.h" #include "ByteConverter.h" -#include "Util.h" +#include <string> +#include <vector> #include <cstring> class MessageBuffer; @@ -109,7 +109,8 @@ class TC_SHARED_API ByteBuffer append((uint8 *)&value, sizeof(value)); } - template <typename T> void put(size_t pos, T value) + template <typename T> + void put(std::size_t pos, T value) { static_assert(std::is_fundamental<T>::value, "append(compound)"); EndianConvert(value); @@ -249,21 +250,8 @@ class TC_SHARED_API ByteBuffer return *this; } - ByteBuffer &operator>>(float &value) - { - value = read<float>(); - if (!std::isfinite(value)) - throw ByteBufferException(); - return *this; - } - - ByteBuffer &operator>>(double &value) - { - value = read<double>(); - if (!std::isfinite(value)) - throw ByteBufferException(); - return *this; - } + ByteBuffer &operator>>(float &value); + ByteBuffer &operator>>(double &value); ByteBuffer &operator>>(std::string& value) { @@ -371,20 +359,7 @@ class TC_SHARED_API ByteBuffer } } - uint32 ReadPackedTime() - { - uint32 packedDate = read<uint32>(); - tm lt = tm(); - - lt.tm_min = packedDate & 0x3F; - lt.tm_hour = (packedDate >> 6) & 0x1F; - //lt.tm_wday = (packedDate >> 11) & 7; - lt.tm_mday = ((packedDate >> 14) & 0x3F) + 1; - lt.tm_mon = (packedDate >> 20) & 0xF; - lt.tm_year = ((packedDate >> 24) & 0x1F) + 100; - - return uint32(mktime(<)); - } + uint32 ReadPackedTime(); ByteBuffer& ReadPackedTime(uint32& time) { @@ -432,36 +407,9 @@ class TC_SHARED_API ByteBuffer return append((const uint8 *)src, cnt * sizeof(T)); } - void append(const uint8 *src, size_t cnt) - { - if (!cnt) - throw ByteBufferSourceException(_wpos, size(), cnt); - - if (!src) - throw ByteBufferSourceException(_wpos, size(), cnt); + void append(uint8 const* src, size_t cnt); - ASSERT(size() < 10000000); - - size_t const newSize = _wpos + cnt; - if (_storage.capacity() < newSize) // custom memory allocation rules - { - if (newSize < 100) - _storage.reserve(300); - else if (newSize < 750) - _storage.reserve(2500); - else if (newSize < 6000) - _storage.reserve(10000); - else - _storage.reserve(400000); - } - - if (_storage.size() < newSize) - _storage.resize(newSize); - std::memcpy(&_storage[_wpos], src, cnt); - _wpos = newSize; - } - - void append(const ByteBuffer& buffer) + void append(ByteBuffer const& buffer) { if (buffer.wpos()) append(buffer.contents(), buffer.wpos()); @@ -496,23 +444,9 @@ class TC_SHARED_API ByteBuffer append(packGUID, size); } - void AppendPackedTime(time_t time) - { - tm lt; - localtime_r(&time, <); - append<uint32>((lt.tm_year - 100) << 24 | lt.tm_mon << 20 | (lt.tm_mday - 1) << 14 | lt.tm_wday << 11 | lt.tm_hour << 6 | lt.tm_min); - } + void AppendPackedTime(time_t time); - void put(size_t pos, const uint8 *src, size_t cnt) - { - if (pos + cnt > size()) - throw ByteBufferPositionException(true, pos, cnt, size()); - - if (!src) - throw ByteBufferSourceException(_wpos, size(), cnt); - - std::memcpy(&_storage[pos], src, cnt); - } + void put(size_t pos, const uint8 *src, size_t cnt); void print_storage() const; @@ -525,85 +459,6 @@ class TC_SHARED_API ByteBuffer std::vector<uint8> _storage; }; -template <typename T> -inline ByteBuffer &operator<<(ByteBuffer &b, std::vector<T> v) -{ - b << (uint32)v.size(); - for (typename std::vector<T>::iterator i = v.begin(); i != v.end(); ++i) - { - b << *i; - } - return b; -} - -template <typename T> -inline ByteBuffer &operator>>(ByteBuffer &b, std::vector<T> &v) -{ - uint32 vsize; - b >> vsize; - v.clear(); - while (vsize--) - { - T t; - b >> t; - v.push_back(t); - } - return b; -} - -template <typename T> -inline ByteBuffer &operator<<(ByteBuffer &b, std::list<T> v) -{ - b << (uint32)v.size(); - for (typename std::list<T>::iterator i = v.begin(); i != v.end(); ++i) - { - b << *i; - } - return b; -} - -template <typename T> -inline ByteBuffer &operator>>(ByteBuffer &b, std::list<T> &v) -{ - uint32 vsize; - b >> vsize; - v.clear(); - while (vsize--) - { - T t; - b >> t; - v.push_back(t); - } - return b; -} - -template <typename K, typename V> -inline ByteBuffer &operator<<(ByteBuffer &b, std::map<K, V> &m) -{ - b << (uint32)m.size(); - for (typename std::map<K, V>::iterator i = m.begin(); i != m.end(); ++i) - { - b << i->first << i->second; - } - return b; -} - -template <typename K, typename V> -inline ByteBuffer &operator>>(ByteBuffer &b, std::map<K, V> &m) -{ - uint32 msize; - b >> msize; - m.clear(); - while (msize--) - { - K k; - V v; - b >> k >> v; - m.insert(make_pair(k, v)); - } - return b; -} - /// @todo Make a ByteBuffer.cpp and move all this inlining to it. template<> inline std::string ByteBuffer::read<std::string>() { |