51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#ifndef NETWORKPACKET_HEADER
-#define NETWORKPACKET_HEADER
+#pragma once
+#include <ctime>
#include "util/pointer.h"
#include "util/numeric.h"
-#include "networkprotocol.h"
+#include <SColor.h>
class NetworkPacket
{
public:
NetworkPacket(u16 command, u32 datasize, u16 peer_id);
NetworkPacket(u16 command, u32 datasize);
- NetworkPacket(): m_datasize(0), m_read_offset(0), m_command(0),
- m_peer_id(0) {}
+ NetworkPacket() = default;
+
~NetworkPacket();
void putRawPacket(u8 *data, u32 datasize, u16 peer_id);
u32 getSize() { return m_datasize; }
u16 getPeerId() { return m_peer_id; }
u16 getCommand() { return m_command; }
+ const u32 getRemainingBytes() const { return m_datasize - m_read_offset; }
+ const char* getRemainingString() { return getString(m_read_offset); }
- // Data extractors
- char* getString(u32 from_offset);
+ // Returns a c-string without copying.
+ // A better name for this would be getRawString()
+ const char* getString(u32 from_offset);
+ // major difference to putCString(): doesn't write len into the buffer
void putRawString(const char* src, u32 len);
+ void putRawString(const std::string &src)
+ { putRawString(src.c_str(), src.size()); }
NetworkPacket& operator>>(std::string& dst);
- NetworkPacket& operator<<(std::string src);
+ NetworkPacket& operator<<(const std::string &src);
- void putLongString(std::string src);
+ void putLongString(const std::string &src);
NetworkPacket& operator>>(std::wstring& dst);
- NetworkPacket& operator<<(std::wstring src);
+ NetworkPacket& operator<<(const std::wstring &src);
std::string readLongString();
NetworkPacket& operator>>(u64& dst);
NetworkPacket& operator<<(u64 src);
+ NetworkPacket& operator>>(std::time_t& dst);
+ NetworkPacket& operator<<(std::time_t src);
+
NetworkPacket& operator>>(float& dst);
NetworkPacket& operator<<(float src);
// Temp, we remove SharedBuffer when migration finished
Buffer<u8> oldForgePacket();
private:
- void checkReadOffset(u32 from_offset);
+ void checkReadOffset(u32 from_offset, u32 field_size);
- template<typename T> void checkDataSize()
+ inline void checkDataSize(u32 field_size)
{
- if (m_read_offset + sizeof(T) > m_datasize) {
- m_datasize = m_read_offset + sizeof(T);
+ if (m_read_offset + field_size > m_datasize) {
+ m_datasize = m_read_offset + field_size;
m_data.resize(m_datasize);
}
}
- template<typename T> void incrOffset()
- {
- m_read_offset += sizeof(T);
- }
-
std::vector<u8> m_data;
- u32 m_datasize;
- u32 m_read_offset;
- u16 m_command;
- u16 m_peer_id;
+ u32 m_datasize = 0;
+ u32 m_read_offset = 0;
+ u16 m_command = 0;
+ u16 m_peer_id = 0;
};
-
-#endif