Network/NetPacket: Add Resize method and fix buffer size

Former-commit-id: 465864559149ef62279038c24649d73c75f38037
This commit is contained in:
Lynix 2016-02-04 14:40:40 +01:00
parent f723d6a29c
commit 6c0215952d
3 changed files with 23 additions and 9 deletions

View File

@ -22,7 +22,7 @@ namespace Nz
public: public:
inline NetPacket(); inline NetPacket();
inline NetPacket(UInt16 netCode, std::size_t sizeHint = 0); inline NetPacket(UInt16 netCode, std::size_t minSize = 0);
inline NetPacket(UInt16 netCode, const void* ptr, std::size_t size); inline NetPacket(UInt16 netCode, const void* ptr, std::size_t size);
NetPacket(const NetPacket&) = delete; NetPacket(const NetPacket&) = delete;
NetPacket(NetPacket&&) = default; NetPacket(NetPacket&&) = default;
@ -36,9 +36,11 @@ namespace Nz
virtual const void* OnSend(std::size_t* newSize) const; virtual const void* OnSend(std::size_t* newSize) const;
inline void Reset(); inline void Reset();
inline void Reset(UInt16 netCode, std::size_t sizeHint = 0); inline void Reset(UInt16 netCode, std::size_t minSize = 0);
inline void Reset(UInt16 netCode, const void* ptr, std::size_t size); inline void Reset(UInt16 netCode, const void* ptr, std::size_t size);
inline void Resize(std::size_t newSize);
inline void SetNetCode(UInt16 netCode); inline void SetNetCode(UInt16 netCode);
NetPacket& operator=(const NetPacket&) = delete; NetPacket& operator=(const NetPacket&) = delete;
@ -53,7 +55,7 @@ namespace Nz
void OnEmptyStream() override; void OnEmptyStream() override;
void FreeStream(); void FreeStream();
void InitStream(std::size_t sizeHint, UInt64 cursorPos, UInt32 openMode); void InitStream(std::size_t minSize, UInt64 cursorPos, UInt32 openMode);
static bool Initialize(); static bool Initialize();
static void Uninitialize(); static void Uninitialize();

View File

@ -14,9 +14,9 @@ namespace Nz
{ {
} }
inline NetPacket::NetPacket(UInt16 netCode, std::size_t sizeHint) inline NetPacket::NetPacket(UInt16 netCode, std::size_t minSize)
{ {
Reset(netCode, sizeHint); Reset(netCode, minSize);
} }
inline NetPacket::NetPacket(UInt16 netCode, const void* ptr, std::size_t size) inline NetPacket::NetPacket(UInt16 netCode, const void* ptr, std::size_t size)
@ -26,6 +26,7 @@ namespace Nz
inline NetPacket::~NetPacket() inline NetPacket::~NetPacket()
{ {
FlushBits(); //< Needs to be done here as the stream will be freed before ByteStream calls it
FreeStream(); FreeStream();
} }
@ -53,9 +54,9 @@ namespace Nz
FreeStream(); FreeStream();
} }
inline void NetPacket::Reset(UInt16 netCode, std::size_t sizeHint) inline void NetPacket::Reset(UInt16 netCode, std::size_t minSize)
{ {
InitStream(HeaderSize + sizeHint, HeaderSize, OpenMode_ReadWrite); InitStream(HeaderSize + minSize, HeaderSize, OpenMode_ReadWrite);
m_netCode = netCode; m_netCode = netCode;
} }
@ -68,6 +69,13 @@ namespace Nz
m_netCode = netCode; m_netCode = netCode;
} }
inline void NetPacket::Resize(std::size_t newSize)
{
NazaraAssert(m_buffer, "Invalid buffer");
m_buffer->Resize(newSize);
}
inline void NetPacket::SetNetCode(UInt16 netCode) inline void NetPacket::SetNetCode(UInt16 netCode)
{ {
m_netCode = netCode; m_netCode = netCode;

View File

@ -66,8 +66,10 @@ namespace Nz
s_availableBuffers.emplace_back(std::make_pair(size, std::move(m_buffer))); s_availableBuffers.emplace_back(std::make_pair(size, std::move(m_buffer)));
} }
void NetPacket::InitStream(std::size_t sizeHint, UInt64 cursorPos, UInt32 openMode) void NetPacket::InitStream(std::size_t minSize, UInt64 cursorPos, UInt32 openMode)
{ {
NazaraAssert(minSize >= cursorPos, "Cannot init stream with a smaller size than wanted cursor pos");
{ {
Nz::LockGuard lock(*s_availableBuffersMutex); Nz::LockGuard lock(*s_availableBuffersMutex);
@ -83,7 +85,9 @@ namespace Nz
if (!m_buffer) if (!m_buffer)
m_buffer = std::make_unique<ByteArray>(); m_buffer = std::make_unique<ByteArray>();
m_buffer->Resize(static_cast<std::size_t>(cursorPos)); if (m_buffer->GetSize() < minSize)
m_buffer->Resize(minSize);
m_memoryStream.SetBuffer(m_buffer.get(), openMode); m_memoryStream.SetBuffer(m_buffer.get(), openMode);
m_memoryStream.SetCursorPos(cursorPos); m_memoryStream.SetCursorPos(cursorPos);
SetStream(&m_memoryStream); SetStream(&m_memoryStream);