Botcraft 1.21.4
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
44 {
45
46 }
47
48 Value::Value(const UnnamedValue& unnamed) : Tag(unnamed)
49 {
50
51 }
52
53 Value::Value(UnnamedValue&& unnamed) : Tag(std::move(unnamed))
54 {
55
56 }
57
59 {
60
61 }
62
63 bool Value::HasData() const
64 {
65 return !is<TagEnd>();
66 }
67
68 std::istream& operator>>(std::istream& is, Value& v)
69 {
70 std::vector<unsigned char> file_content = std::vector<unsigned char>(
71 std::istream_iterator<unsigned char>(is),
72 std::istream_iterator<unsigned char>()
73 );
74
75 ReadIterator iter = file_content.begin();
76 size_t length = file_content.size();
77
78 v = ReadData<Value>(iter, length);
79
80 return is;
81 }
82
83 void Value::ReadImpl(ReadIterator& iter, size_t& length)
84 {
85 // Check for GZIP minimal header size and magic number
86 if (length > 10 && *iter == 0x1F && *(iter + 1) == 0x8B)
87 {
88 const std::vector<unsigned char> decompressed = ExtractGZip(iter, length);
89 ReadIterator decomp_iter = decompressed.begin();
90 size_t decomp_length = decompressed.size();
91 Tag::ReadImpl(decomp_iter, decomp_length);
92 }
93 else
94 {
95 Tag::ReadImpl(iter, length);
96 }
97
98 if (is<TagEnd>())
99 {
100 return;
101 }
102
103 if (!is<TagCompound>())
104 {
105 throw std::runtime_error("Error reading NBT value, not starting with compound");
106 }
107 }
108 }
109}
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 ~Value() override
Definition NBT.cpp:58
bool HasData() const
Definition NBT.cpp:63
virtual void ReadImpl(ReadIterator &iter, size_t &length) override
Definition NBT.cpp:83
std::istream & operator>>(std::istream &is, Value &v)
Definition NBT.cpp:68
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
STL namespace.