1
0
mirror of https://github.com/solemnwarning/directplay-lite synced 2024-12-30 16:45:37 +01:00
directplay-lite/src/packet.hpp

92 lines
2.0 KiB
C++
Raw Normal View History

#ifndef DPLITE_PACKET_HPP
#define DPLITE_PACKET_HPP
#include <stdexcept>
#include <stdint.h>
#include <stdlib.h>
#include <string>
#include <utility>
#include <vector>
#include <windows.h>
struct TLVChunk
{
uint32_t type;
uint32_t value_length;
unsigned char value[0];
};
class PacketSerialiser
{
private:
std::vector<unsigned char> sbuf;
public:
PacketSerialiser(uint32_t type);
std::pair<const void*, size_t> raw_packet();
void append_null();
void append_dword(DWORD value);
void append_data(const void *data, size_t size);
void append_wstring(const std::wstring &string);
void append_guid(const GUID &guid);
};
class PacketDeserialiser
{
private:
const TLVChunk *header;
std::vector<const TLVChunk*> fields;
public:
class Error: public std::runtime_error
{
protected:
Error(const std::string &what): runtime_error(what) {}
public:
class Incomplete;
class Malformed;
class MissingField;
class TypeMismatch;
};
PacketDeserialiser(const void *serialised_packet, size_t packet_size);
uint32_t packet_type() const;
size_t num_fields() const;
bool is_null(size_t index) const;
DWORD get_dword(size_t index) const;
std::pair<const void*,size_t> get_data(size_t index) const;
std::wstring get_wstring(size_t index) const;
GUID get_guid(size_t index) const;
};
class PacketDeserialiser::Error::Incomplete: public Error
{
public:
Incomplete(const std::string &what = "Incomplete packet"): Error(what) {}
};
class PacketDeserialiser::Error::Malformed: public Error
{
public:
Malformed(const std::string &what = "Malformed packet"): Error(what) {}
};
class PacketDeserialiser::Error::MissingField: public Error
{
public:
MissingField(const std::string &what = "Missing field in packet"): Error(what) {}
};
class PacketDeserialiser::Error::TypeMismatch: public Error
{
public:
TypeMismatch(const std::string &what = "Incorrect field type in packet"): Error(what) {}
};
#endif /* !DPLITE_PACKET_HPP */