Botcraft 26.2
Loading...
Searching...
No Matches
NBT.cpp
Go to the documentation of this file.
1#include <iterator>
2#include <fstream>
3#include <utility>
4
7
8namespace ProtocolCraft
9{
10 namespace NBT
11 {
16
17 UnnamedValue::UnnamedValue(const Value& named) : Tag(named)
18 {
19
20 }
21
22 UnnamedValue::UnnamedValue(Value&& named) : Tag(std::move(named))
23 {
24
25 }
26
31
32 void UnnamedValue::ReadImpl(ReadIterator& iter, size_t& length)
33 {
34 Tag::ReadUnnamedImpl(iter, length);
35 }
36
38 {
39 Tag::WriteUnnamedImpl(container);
40 }
41
42
43#if PROTOCOL_VERSION > 770 /* > 1.21.5 */
48
50 {
51
52 }
53
55 {
56
57 }
58
63
64 void UntrustedValue::ReadImpl(ReadIterator& iter, size_t& length)
65 {
66 // Untrusted == size prefixed
67 const int size = ReadData<VarInt>(iter, length);
68 Tag::ReadUnnamedImpl(iter, length);
69 }
70
72 {
73 // Untrusted == size prefixed
74 std::vector<unsigned char> temp_container;
75 Tag::WriteUnnamedImpl(temp_container);
76 WriteData<VarInt>(static_cast<int>(temp_container.size()), container);
77 WriteByteArray(temp_container, container);
78 }
79#endif
80
81
83 {
84
85 }
86
87 Value::Value(const UnnamedValue& unnamed) : Tag(unnamed)
88 {
89
90 }
91
92 Value::Value(UnnamedValue&& unnamed) : Tag(std::move(unnamed))
93 {
94
95 }
96
97#if PROTOCOL_VERSION > 770 /* > 1.21.5 */
98 Value::Value(const UntrustedValue& untrusted) : Tag(untrusted)
99 {
100
101 }
102
103 Value::Value(UntrustedValue&& untrusted) : Tag(std::move(untrusted))
104 {
105
106 }
107#endif
108
110 {
111
112 }
113
114 bool Value::HasData() const
115 {
116 return !is<TagEnd>();
117 }
118
119 std::istream& operator>>(std::istream& is, Value& v)
120 {
121 std::vector<unsigned char> file_content = std::vector<unsigned char>(
122 std::istream_iterator<unsigned char>(is),
123 std::istream_iterator<unsigned char>()
124 );
125
126 ReadIterator iter = file_content.begin();
127 size_t length = file_content.size();
128
129 v = ReadData<Value>(iter, length);
130
131 return is;
132 }
133
134 void Value::ReadImpl(ReadIterator& iter, size_t& length)
135 {
136 // Check for GZIP minimal header size and magic number
137 if (length > 10 && *iter == 0x1F && *(iter + 1) == 0x8B)
138 {
139 const std::vector<unsigned char> decompressed = ExtractGZip(iter, length);
140 ReadIterator decomp_iter = decompressed.begin();
141 size_t decomp_length = decompressed.size();
142 Tag::ReadImpl(decomp_iter, decomp_length);
143 }
144 else
145 {
146 Tag::ReadImpl(iter, length);
147 }
148
149 if (is<TagEnd>())
150 {
151 return;
152 }
153
154 if (!is<TagCompound>())
155 {
156 throw std::runtime_error("Error reading NBT value, not starting with compound");
157 }
158 }
159}
160}
size_t size() const
Definition Tag.cpp:374
void WriteUnnamedImpl(WriteContainer &container) const
Definition Tag.cpp:159
virtual void ReadImpl(ReadIterator &iter, size_t &length) override
Definition Tag.cpp:215
void ReadUnnamedImpl(ReadIterator &iter, size_t &length)
Definition Tag.cpp:94
virtual ~UnnamedValue() override
Definition NBT.cpp:27
virtual void WriteImpl(WriteContainer &container) const override
Definition NBT.cpp:37
virtual void ReadImpl(ReadIterator &iter, size_t &length) override
Definition NBT.cpp:32
virtual void ReadImpl(ReadIterator &iter, size_t &length) override
Definition NBT.cpp:64
virtual ~UntrustedValue() override
Definition NBT.cpp:59
virtual void WriteImpl(WriteContainer &container) const override
Definition NBT.cpp:71
virtual ~Value() override
Definition NBT.cpp:109
bool HasData() const
Definition NBT.cpp:114
virtual void ReadImpl(ReadIterator &iter, size_t &length) override
Definition NBT.cpp:134
std::istream & operator>>(std::istream &is, Value &v)
Definition NBT.cpp:119
std::vector< unsigned char > ExtractGZip(std::vector< unsigned char >::const_iterator &iter, std::size_t &length)
std::vector< unsigned char > WriteContainer
std::vector< unsigned char >::const_iterator ReadIterator
void WriteByteArray(const std::vector< unsigned char > &my_array, WriteContainer &container)
STL namespace.