diff --git a/src/Mod/Mesh/App/Core/IO/Reader3MF.cpp b/src/Mod/Mesh/App/Core/IO/Reader3MF.cpp index 9dd5ae1a87..4c2436649c 100644 --- a/src/Mod/Mesh/App/Core/IO/Reader3MF.cpp +++ b/src/Mod/Mesh/App/Core/IO/Reader3MF.cpp @@ -53,19 +53,27 @@ #include "Core/MeshIO.h" #include #include +#include +#include using namespace MeshCore; XERCES_CPP_NAMESPACE_USE Reader3MF::Reader3MF(std::istream &str) - : zip(str) { + zipios::ZipHeader zipHeader(str); + if (zipHeader.isValid()) { + zip.reset(zipHeader.getInputStream("3D/3dmodel.model")); + } } Reader3MF::Reader3MF(const std::string &filename) - : zip(filename) { + zipios::ZipFile zipFile(filename); + if (zipFile.isValid()) { + zip.reset(zipFile.getInputStream("3D/3dmodel.model")); + } } std::vector Reader3MF::GetMeshIds() const @@ -81,23 +89,10 @@ std::vector Reader3MF::GetMeshIds() const bool Reader3MF::Load() { - zipios::ConstEntryPointer entry; try { - // The first file might already be 3dmodel.model but unfortunately the - // zipios++ API doesn't have a function to check it. So, try it blindly. - if (!LoadModel(zip)) { - entry = zip.getNextEntry(); - while (entry && entry->isValid()) { - if (entry->getName() == "3D/3dmodel.model") { - return LoadModel(zip); - } - - // Note: this throws an exception if there is no further file in the zip - entry = zip.getNextEntry(); - } + if (!zip) return false; - } - return true; + return LoadModel(*zip); } catch (const std::exception&) { return false; diff --git a/src/Mod/Mesh/App/Core/IO/Reader3MF.h b/src/Mod/Mesh/App/Core/IO/Reader3MF.h index 67da6d703d..439e70de10 100644 --- a/src/Mod/Mesh/App/Core/IO/Reader3MF.h +++ b/src/Mod/Mesh/App/Core/IO/Reader3MF.h @@ -25,8 +25,8 @@ #define MESH_IO_READER_3MF_H #include +#include #include -#include #include #include #include @@ -85,7 +85,7 @@ private: private: using MeshKernelAndTransform = std::pair; std::unordered_map meshes; - zipios::ZipInputStream zip; + std::unique_ptr zip; }; } // namespace MeshCore