diff options
author | Tiger Wang <ziwei.tiger@outlook.com> | 2021-01-11 17:39:43 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-01-11 17:39:43 +0100 |
commit | eeb63b8901a9c049f1bb594abb9ce9b4a9c47620 (patch) | |
tree | b07daae788f918b83eeb0bdbd51e49292f1c8d88 /src/WorldStorage/SchematicFileSerializer.cpp | |
parent | Fixed switch-ups regarding some slab and stair recipes (#5099) (diff) | |
download | cuberite-eeb63b8901a9c049f1bb594abb9ce9b4a9c47620.tar cuberite-eeb63b8901a9c049f1bb594abb9ce9b4a9c47620.tar.gz cuberite-eeb63b8901a9c049f1bb594abb9ce9b4a9c47620.tar.bz2 cuberite-eeb63b8901a9c049f1bb594abb9ce9b4a9c47620.tar.lz cuberite-eeb63b8901a9c049f1bb594abb9ce9b4a9c47620.tar.xz cuberite-eeb63b8901a9c049f1bb594abb9ce9b4a9c47620.tar.zst cuberite-eeb63b8901a9c049f1bb594abb9ce9b4a9c47620.zip |
Diffstat (limited to 'src/WorldStorage/SchematicFileSerializer.cpp')
-rw-r--r-- | src/WorldStorage/SchematicFileSerializer.cpp | 115 |
1 files changed, 23 insertions, 92 deletions
diff --git a/src/WorldStorage/SchematicFileSerializer.cpp b/src/WorldStorage/SchematicFileSerializer.cpp index 44ce7ca9b..656a98709 100644 --- a/src/WorldStorage/SchematicFileSerializer.cpp +++ b/src/WorldStorage/SchematicFileSerializer.cpp @@ -7,7 +7,6 @@ #include "FastNBT.h" #include "SchematicFileSerializer.h" -#include "../StringCompression.h" #include "../OSSupport/GZipFile.h" @@ -17,118 +16,59 @@ //////////////////////////////////////////////////////////////////////////////// // cSchematicFileSerializer: -bool cSchematicFileSerializer::LoadFromSchematicFile(cBlockArea & a_BlockArea, const AString & a_FileName) +void cSchematicFileSerializer::LoadFromSchematicFile(cBlockArea & a_BlockArea, const std::string & a_FileName) { - // Un-GZip the contents: - AString Contents; - cGZipFile File; - if (!File.Open(a_FileName, cGZipFile::fmRead)) - { - LOG("Cannot open the schematic file \"%s\".", a_FileName.c_str()); - return false; - } - int NumBytesRead = File.ReadRestOfFile(Contents); - if (NumBytesRead < 0) - { - LOG("Cannot read GZipped data in the schematic file \"%s\", error %d", a_FileName.c_str(), NumBytesRead); - return false; - } - File.Close(); + const auto Data = GZipFile::ReadRestOfFile(a_FileName); + const cParsedNBT NBT(Data.GetView()); - // Parse the NBT: - cParsedNBT NBT(Contents.data(), Contents.size()); if (!NBT.IsValid()) { - LOG("Cannot parse the NBT in the schematic file \"%s\".", a_FileName.c_str()); - return false; + throw std::runtime_error(fmt::format("Cannot parse the NBT in the schematic file \"{}\".", a_FileName)); } - return LoadFromSchematicNBT(a_BlockArea, NBT); + LoadFromSchematicNBT(a_BlockArea, NBT); } -bool cSchematicFileSerializer::LoadFromSchematicString(cBlockArea & a_BlockArea, const AString & a_SchematicData) +void cSchematicFileSerializer::LoadFromSchematicString(cBlockArea & a_BlockArea, const ContiguousByteBufferView a_SchematicData) { - // Uncompress the data: - AString UngzippedData; - if (UncompressStringGZIP(a_SchematicData.data(), a_SchematicData.size(), UngzippedData) != Z_OK) - { - LOG("%s: Cannot unGZip the schematic data.", __FUNCTION__); - return false; - } + const auto Extracted = Compression::Extractor().ExtractGZip(a_SchematicData); + const cParsedNBT NBT(Extracted.GetView()); - // Parse the NBT: - cParsedNBT NBT(UngzippedData.data(), UngzippedData.size()); if (!NBT.IsValid()) { - LOG("%s: Cannot parse the NBT in the schematic data.", __FUNCTION__); - return false; + throw std::runtime_error("Cannot parse the NBT in the schematic data."); } - return LoadFromSchematicNBT(a_BlockArea, NBT); + LoadFromSchematicNBT(a_BlockArea, NBT); } -bool cSchematicFileSerializer::SaveToSchematicFile(const cBlockArea & a_BlockArea, const AString & a_FileName) +void cSchematicFileSerializer::SaveToSchematicFile(const cBlockArea & a_BlockArea, const std::string & a_FileName) { - // Serialize into NBT data: - AString NBT = SaveToSchematicNBT(a_BlockArea); - if (NBT.empty()) - { - LOG("%s: Cannot serialize the area into an NBT representation for file \"%s\".", __FUNCTION__, a_FileName.c_str()); - return false; - } - - // Save to file - cGZipFile File; - if (!File.Open(a_FileName, cGZipFile::fmWrite)) - { - LOG("%s: Cannot open file \"%s\" for writing.", __FUNCTION__, a_FileName.c_str()); - return false; - } - if (!File.Write(NBT)) - { - LOG("%s: Cannot write data to file \"%s\".", __FUNCTION__, a_FileName.c_str()); - return false; - } - return true; + GZipFile::Write(a_FileName, SaveToSchematicNBT(a_BlockArea)); } -bool cSchematicFileSerializer::SaveToSchematicString(const cBlockArea & a_BlockArea, AString & a_Out) +Compression::Result cSchematicFileSerializer::SaveToSchematicString(const cBlockArea & a_BlockArea) { - // Serialize into NBT data: - AString NBT = SaveToSchematicNBT(a_BlockArea); - if (NBT.empty()) - { - LOG("%s: Cannot serialize the area into an NBT representation.", __FUNCTION__); - return false; - } - - // Gzip the data: - int res = CompressStringGZIP(NBT.data(), NBT.size(), a_Out); - if (res != Z_OK) - { - LOG("%s: Cannot Gzip the area data NBT representation: %d", __FUNCTION__, res); - return false; - } - return true; + return Compression::Compressor().CompressGZip(SaveToSchematicNBT(a_BlockArea)); } -bool cSchematicFileSerializer::LoadFromSchematicNBT(cBlockArea & a_BlockArea, cParsedNBT & a_NBT) +void cSchematicFileSerializer::LoadFromSchematicNBT(cBlockArea & a_BlockArea, const cParsedNBT & a_NBT) { int TMaterials = a_NBT.FindChildByName(a_NBT.GetRoot(), "Materials"); if ((TMaterials > 0) && (a_NBT.GetType(TMaterials) == TAG_String)) @@ -136,8 +76,7 @@ bool cSchematicFileSerializer::LoadFromSchematicNBT(cBlockArea & a_BlockArea, cP AString Materials = a_NBT.GetString(TMaterials); if (Materials.compare("Alpha") != 0) { - LOG("Materials tag is present and \"%s\" instead of \"Alpha\". Possibly a wrong-format schematic file.", Materials.c_str()); - return false; + throw std::runtime_error(fmt::format("Materials tag is present and \"{}\" instead of \"Alpha\". Possibly a wrong-format schematic file.", Materials)); } } int TSizeX = a_NBT.FindChildByName(a_NBT.GetRoot(), "Width"); @@ -150,13 +89,13 @@ bool cSchematicFileSerializer::LoadFromSchematicNBT(cBlockArea & a_BlockArea, cP (a_NBT.GetType(TSizeZ) != TAG_Short) ) { - LOG("Dimensions are missing from the schematic file (%d, %d, %d), (%d, %d, %d)", + throw std::runtime_error(fmt::format( + "Dimensions are missing from the schematic file ({}, {}, {}), ({}, {}, {})", TSizeX, TSizeY, TSizeZ, (TSizeX >= 0) ? a_NBT.GetType(TSizeX) : -1, (TSizeY >= 0) ? a_NBT.GetType(TSizeY) : -1, (TSizeZ >= 0) ? a_NBT.GetType(TSizeZ) : -1 - ); - return false; + )); } int SizeX = a_NBT.GetShort(TSizeX); @@ -164,16 +103,14 @@ bool cSchematicFileSerializer::LoadFromSchematicNBT(cBlockArea & a_BlockArea, cP int SizeZ = a_NBT.GetShort(TSizeZ); if ((SizeX < 1) || (SizeX > 65535) || (SizeY < 1) || (SizeY > 65535) || (SizeZ < 1) || (SizeZ > 65535)) { - LOG("Dimensions are invalid in the schematic file: %d, %d, %d", SizeX, SizeY, SizeZ); - return false; + throw std::runtime_error(fmt::format("Dimensions are invalid in the schematic file: {}, {}, {}", SizeX, SizeY, SizeZ)); } int TBlockTypes = a_NBT.FindChildByName(a_NBT.GetRoot(), "Blocks"); int TBlockMetas = a_NBT.FindChildByName(a_NBT.GetRoot(), "Data"); if ((TBlockTypes < 0) || (a_NBT.GetType(TBlockTypes) != TAG_ByteArray)) { - LOG("BlockTypes are invalid in the schematic file: %d", TBlockTypes); - return false; + throw std::runtime_error(fmt::format("BlockTypes are invalid in the schematic file: {}", TBlockTypes)); } bool AreMetasPresent = (TBlockMetas > 0) && (a_NBT.GetType(TBlockMetas) == TAG_ByteArray); @@ -222,15 +159,13 @@ bool cSchematicFileSerializer::LoadFromSchematicNBT(cBlockArea & a_BlockArea, cP } memcpy(a_BlockArea.GetBlockMetas(), a_NBT.GetData(TBlockMetas), NumMetaBytes); } - - return true; } -AString cSchematicFileSerializer::SaveToSchematicNBT(const cBlockArea & a_BlockArea) +ContiguousByteBuffer cSchematicFileSerializer::SaveToSchematicNBT(const cBlockArea & a_BlockArea) { cFastNBTWriter Writer("Schematic"); Writer.AddShort("Width", static_cast<Int16>(a_BlockArea.m_Size.x)); @@ -267,9 +202,5 @@ AString cSchematicFileSerializer::SaveToSchematicNBT(const cBlockArea & a_BlockA Writer.EndList(); Writer.Finish(); - return Writer.GetResult(); + return ContiguousByteBuffer(Writer.GetResult()); } - - - - |