320{
321 mz_zip_archive archive;
322 mz_zip_zero_struct(&archive);
324
325 return false;
326 }
327
328 const std::string sub_relationship_file = "3D/_rels/3dmodel.model.rels";
329 int sub_index = mz_zip_reader_locate_file(&archive, sub_relationship_file.c_str(), nullptr, 0);
330 if (sub_index == -1) {
331 const std::string model_file = "3D/3dmodel.model";
332 int model_file_index = mz_zip_reader_locate_file(&archive, model_file.c_str(), nullptr, 0);
333 if (model_file_index != -1) {
334 int depth = 0;
335 m_parser = XML_ParserCreate(
nullptr);
336 XML_SetUserData(
m_parser, (
void *)
this);
339
340 mz_zip_archive_file_stat stat;
341 if (!mz_zip_reader_file_stat(&archive, model_file_index, &stat)) goto EXIT;
342
343 if (stat.m_uncomp_size > static_cast<mz_uint64>(std::numeric_limits<int>::max())) goto EXIT;
344
345 const int xml_size = static_cast<int>(stat.m_uncomp_size);
346 void *parser_buffer = XML_GetBuffer(
m_parser, xml_size);
347 if (parser_buffer == nullptr) goto EXIT;
348
349 mz_bool res = mz_zip_reader_extract_file_to_mem(&archive, stat.m_filename, parser_buffer, static_cast<size_t>(xml_size), 0);
350 if (res == 0) goto EXIT;
351
352 XML_ParseBuffer(
m_parser, xml_size, 1);
353 }
354 }
355
356EXIT:
359}
static void XMLCALL characters_handler(void *userData, const XML_Char *s, int len)
Definition 3mf.cpp:313
static void XMLCALL start_element_handler(void *userData, const char *name, const char **attributes)
Definition 3mf.cpp:307
bool open_zip_reader(mz_zip_archive *zip, const std::string &fname)
Definition miniz_extension.cpp:119
bool close_zip_reader(mz_zip_archive *zip)
Definition miniz_extension.cpp:129