forked from Mirrorlandia_minetest/minetest
Change NetworkPacket to reserve instead of resize
also make the bool serialization clearer and move the constructor to the header file
This commit is contained in:
parent
397682a5b0
commit
c0f852e016
@ -23,27 +23,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
#include "util/serialize.h"
|
#include "util/serialize.h"
|
||||||
#include "networkprotocol.h"
|
#include "networkprotocol.h"
|
||||||
|
|
||||||
NetworkPacket::NetworkPacket(u16 command, u32 datasize, session_t peer_id):
|
void NetworkPacket::checkReadOffset(u32 from_offset, u32 field_size) const
|
||||||
m_datasize(datasize), m_command(command), m_peer_id(peer_id)
|
|
||||||
{
|
|
||||||
m_data.resize(m_datasize);
|
|
||||||
}
|
|
||||||
|
|
||||||
NetworkPacket::NetworkPacket(u16 command, u32 datasize):
|
|
||||||
m_datasize(datasize), m_command(command)
|
|
||||||
{
|
|
||||||
m_data.resize(m_datasize);
|
|
||||||
}
|
|
||||||
|
|
||||||
NetworkPacket::~NetworkPacket()
|
|
||||||
{
|
|
||||||
m_data.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
void NetworkPacket::checkReadOffset(u32 from_offset, u32 field_size)
|
|
||||||
{
|
{
|
||||||
if (from_offset + field_size > m_datasize) {
|
if (from_offset + field_size > m_datasize) {
|
||||||
std::stringstream ss;
|
std::ostringstream ss;
|
||||||
ss << "Reading outside packet (offset: " <<
|
ss << "Reading outside packet (offset: " <<
|
||||||
from_offset << ", packet size: " << getSize() << ")";
|
from_offset << ", packet size: " << getSize() << ")";
|
||||||
throw PacketError(ss.str());
|
throw PacketError(ss.str());
|
||||||
@ -56,6 +39,7 @@ void NetworkPacket::putRawPacket(const u8 *data, u32 datasize, session_t peer_id
|
|||||||
// This is not permitted
|
// This is not permitted
|
||||||
assert(m_command == 0);
|
assert(m_command == 0);
|
||||||
|
|
||||||
|
assert(datasize >= 2);
|
||||||
m_datasize = datasize - 2;
|
m_datasize = datasize - 2;
|
||||||
m_peer_id = peer_id;
|
m_peer_id = peer_id;
|
||||||
|
|
||||||
@ -76,7 +60,7 @@ void NetworkPacket::clear()
|
|||||||
m_peer_id = 0;
|
m_peer_id = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* NetworkPacket::getString(u32 from_offset)
|
const char* NetworkPacket::getString(u32 from_offset) const
|
||||||
{
|
{
|
||||||
checkReadOffset(from_offset, 0);
|
checkReadOffset(from_offset, 0);
|
||||||
|
|
||||||
@ -85,10 +69,7 @@ const char* NetworkPacket::getString(u32 from_offset)
|
|||||||
|
|
||||||
void NetworkPacket::putRawString(const char* src, u32 len)
|
void NetworkPacket::putRawString(const char* src, u32 len)
|
||||||
{
|
{
|
||||||
if (m_read_offset + len > m_datasize) {
|
checkDataSize(len);
|
||||||
m_datasize = m_read_offset + len;
|
|
||||||
m_data.resize(m_datasize);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (len == 0)
|
if (len == 0)
|
||||||
return;
|
return;
|
||||||
@ -279,7 +260,7 @@ NetworkPacket& NetworkPacket::operator<<(bool src)
|
|||||||
{
|
{
|
||||||
checkDataSize(1);
|
checkDataSize(1);
|
||||||
|
|
||||||
writeU8(&m_data[m_read_offset], src);
|
writeU8(&m_data[m_read_offset], src ? 1 : 0);
|
||||||
|
|
||||||
m_read_offset += 1;
|
m_read_offset += 1;
|
||||||
return *this;
|
return *this;
|
||||||
@ -329,7 +310,7 @@ NetworkPacket& NetworkPacket::operator>>(bool& dst)
|
|||||||
{
|
{
|
||||||
checkReadOffset(m_read_offset, 1);
|
checkReadOffset(m_read_offset, 1);
|
||||||
|
|
||||||
dst = readU8(&m_data[m_read_offset]);
|
dst = readU8(&m_data[m_read_offset]) != 0;
|
||||||
|
|
||||||
m_read_offset += 1;
|
m_read_offset += 1;
|
||||||
return *this;
|
return *this;
|
||||||
@ -360,7 +341,7 @@ u8* NetworkPacket::getU8Ptr(u32 from_offset)
|
|||||||
|
|
||||||
checkReadOffset(from_offset, 1);
|
checkReadOffset(from_offset, 1);
|
||||||
|
|
||||||
return (u8*)&m_data[from_offset];
|
return &m_data[from_offset];
|
||||||
}
|
}
|
||||||
|
|
||||||
NetworkPacket& NetworkPacket::operator>>(u16& dst)
|
NetworkPacket& NetworkPacket::operator>>(u16& dst)
|
||||||
|
@ -20,19 +20,25 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "util/pointer.h"
|
#include "util/pointer.h"
|
||||||
#include "util/numeric.h"
|
|
||||||
#include "networkprotocol.h"
|
#include "networkprotocol.h"
|
||||||
#include <SColor.h>
|
#include <SColor.h>
|
||||||
|
|
||||||
class NetworkPacket
|
class NetworkPacket
|
||||||
{
|
{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
NetworkPacket(u16 command, u32 datasize, session_t peer_id);
|
NetworkPacket(u16 command, u32 preallocate, session_t peer_id) :
|
||||||
NetworkPacket(u16 command, u32 datasize);
|
m_command(command), m_peer_id(peer_id)
|
||||||
|
{
|
||||||
|
m_data.reserve(preallocate);
|
||||||
|
}
|
||||||
|
NetworkPacket(u16 command, u32 preallocate) :
|
||||||
|
m_command(command)
|
||||||
|
{
|
||||||
|
m_data.reserve(preallocate);
|
||||||
|
}
|
||||||
NetworkPacket() = default;
|
NetworkPacket() = default;
|
||||||
|
|
||||||
~NetworkPacket();
|
~NetworkPacket() = default;
|
||||||
|
|
||||||
void putRawPacket(const u8 *data, u32 datasize, session_t peer_id);
|
void putRawPacket(const u8 *data, u32 datasize, session_t peer_id);
|
||||||
void clear();
|
void clear();
|
||||||
@ -40,13 +46,13 @@ public:
|
|||||||
// Getters
|
// Getters
|
||||||
u32 getSize() const { return m_datasize; }
|
u32 getSize() const { return m_datasize; }
|
||||||
session_t getPeerId() const { return m_peer_id; }
|
session_t getPeerId() const { return m_peer_id; }
|
||||||
u16 getCommand() { return m_command; }
|
u16 getCommand() const { return m_command; }
|
||||||
u32 getRemainingBytes() const { return m_datasize - m_read_offset; }
|
u32 getRemainingBytes() const { return m_datasize - m_read_offset; }
|
||||||
const char *getRemainingString() { return getString(m_read_offset); }
|
const char *getRemainingString() { return getString(m_read_offset); }
|
||||||
|
|
||||||
// Returns a c-string without copying.
|
// Returns a c-string without copying.
|
||||||
// A better name for this would be getRawString()
|
// A better name for this would be getRawString()
|
||||||
const char *getString(u32 from_offset);
|
const char *getString(u32 from_offset) const;
|
||||||
// major difference to putCString(): doesn't write len into the buffer
|
// major difference to putCString(): doesn't write len into the buffer
|
||||||
void putRawString(const char *src, u32 len);
|
void putRawString(const char *src, u32 len);
|
||||||
void putRawString(const std::string &src)
|
void putRawString(const std::string &src)
|
||||||
@ -115,11 +121,11 @@ public:
|
|||||||
NetworkPacket &operator<<(video::SColor src);
|
NetworkPacket &operator<<(video::SColor src);
|
||||||
|
|
||||||
// Temp, we remove SharedBuffer when migration finished
|
// Temp, we remove SharedBuffer when migration finished
|
||||||
// ^ this comment has been here for 4 years
|
// ^ this comment has been here for 7 years
|
||||||
Buffer<u8> oldForgePacket();
|
Buffer<u8> oldForgePacket();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void checkReadOffset(u32 from_offset, u32 field_size);
|
void checkReadOffset(u32 from_offset, u32 field_size) const;
|
||||||
|
|
||||||
inline void checkDataSize(u32 field_size)
|
inline void checkDataSize(u32 field_size)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user