1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
#pragma once
#include <algorithm>
#include <string>
#include <stdexcept>
#include <vector>
#include <cstring>
#include <nlohmann/json.hpp>
#include <easylogging++.h>
#include "Socket.hpp"
#include "../utility/Vector.hpp"
class Stream {
protected:
template<class T>
void endswap(T &obj) {
unsigned char *raw = reinterpret_cast<unsigned char *>(&obj);
std::reverse(raw, raw + sizeof(T));
}
void endswap(unsigned char *arr, size_t arrLen) {
std::reverse(arr, arr + arrLen);
}
public:
virtual ~Stream() {};
};
class StreamInput : Stream {
virtual void ReadData(unsigned char *buffPtr, size_t buffLen) = 0;
public:
virtual ~StreamInput() = default;
bool ReadBool();
signed char ReadByte();
unsigned char ReadUByte();
short ReadShort();
unsigned short ReadUShort();
int ReadInt();
long long ReadLong();
float ReadFloat();
double ReadDouble();
std::string ReadString();
std::string ReadChat();
int ReadVarInt();
long long ReadVarLong();
std::vector<unsigned char> ReadEntityMetadata();
std::vector<unsigned char> ReadSlot();
std::vector<unsigned char> ReadNbtTag();
Vector ReadPosition();
unsigned char ReadAngle();
std::vector<unsigned char> ReadUuid();
std::vector<unsigned char> ReadByteArray(size_t arrLength);
};
class StreamOutput : Stream {
virtual void WriteData(unsigned char *buffPtr, size_t buffLen) = 0;
public:
virtual ~StreamOutput() = default;
void WriteBool(bool value);
void WriteByte(signed char value);
void WriteUByte(unsigned char value);
void WriteShort(short value);
void WriteUShort(unsigned short value);
void WriteInt(int value);
void WriteLong(long long value);
void WriteFloat(float value);
void WriteDouble(double value);
void WriteString(std::string value);
void WriteChat(std::string value);
void WriteVarInt(int value);
void WriteVarLong(long long value);
void WriteEntityMetadata(std::vector<unsigned char> value);
void WriteSlot(std::vector<unsigned char> value);
void WriteNbtTag(std::vector<unsigned char> value);
void WritePosition(Vector value);
void WriteAngle(unsigned char value);
void WriteUuid(std::vector<unsigned char> value);
void WriteByteArray(std::vector<unsigned char> value);
};
class StreamBuffer : public StreamInput, public StreamOutput {
unsigned char *buffer;
unsigned char *bufferPtr;
size_t bufferLength;
void ReadData(unsigned char *buffPtr, size_t buffLen) override;
void WriteData(unsigned char *buffPtr, size_t buffLen) override;
public:
StreamBuffer(unsigned char *data, size_t dataLen);
StreamBuffer(size_t bufferLen);
~StreamBuffer();
std::vector<unsigned char> GetBuffer();
};
class StreamCounter : public StreamOutput {
void WriteData(unsigned char *buffPtr, size_t buffLen) override;
size_t size;
public:
StreamCounter(size_t initialSize = 0);
~StreamCounter();
size_t GetCountedSize();
};
class StreamSocket : public StreamInput, public StreamOutput {
Socket *socket;
void ReadData(unsigned char *buffPtr, size_t buffLen) override;
void WriteData(unsigned char *buffPtr, size_t buffLen) override;
public:
StreamSocket(Socket *socketPtr);
~StreamSocket() = default;
};
|