OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
Slic3r::PrusaFileParser Class Reference

#include </home/runner/work/OrcaSlicer/OrcaSlicer/src/libslic3r/Format/3mf.hpp>

Public Member Functions

 PrusaFileParser ()
 ~PrusaFileParser ()
bool check_3mf_from_prusa (const std::string filename)
void _start_element_handler (const char *name, const char **attributes)
void _characters_handler (const XML_Char *s, int len)

Private Member Functions

const char * get_attribute_value_charptr (const char **attributes, unsigned int attributes_size, const char *attribute_key)
std::string get_attribute_value_string (const char **attributes, unsigned int attributes_size, const char *attribute_key)

Static Private Member Functions

static void XMLCALL start_element_handler (void *userData, const char *name, const char **attributes)
static void XMLCALL characters_handler (void *userData, const XML_Char *s, int len)

Private Attributes

bool m_from_prusa = false
bool m_is_application_key = false
XML_Parser m_parser

Detailed Description

Constructor & Destructor Documentation

◆ PrusaFileParser()

Slic3r::PrusaFileParser::PrusaFileParser ( )
inline
11{}

Referenced by characters_handler(), and start_element_handler().

Here is the caller graph for this function:

◆ ~PrusaFileParser()

Slic3r::PrusaFileParser::~PrusaFileParser ( )
inline
12{}

Member Function Documentation

◆ _characters_handler()

void Slic3r::PrusaFileParser::_characters_handler ( const XML_Char * s,
int len )
362{
364 std::string str(s, len);
365 if (!str.empty() && str.find("PrusaSlicer") != std::string::npos) m_from_prusa = true;
366 }
367}
bool m_from_prusa
Definition 3mf.hpp:25
bool m_is_application_key
Definition 3mf.hpp:26

References m_from_prusa, and m_is_application_key.

Referenced by characters_handler().

Here is the caller graph for this function:

◆ _start_element_handler()

void Slic3r::PrusaFileParser::_start_element_handler ( const char * name,
const char ** attributes )
370{
371 if (::strcmp(name, "metadata") == 0) {
372 unsigned int num_attributes = (unsigned int) XML_GetSpecifiedAttributeCount(m_parser);
373
374 std::string str_name = get_attribute_value_string(attributes, num_attributes, "name");
375 if (!str_name.empty() && str_name.find("Application") != std::string::npos) { m_is_application_key = true; }
376 }
377}
std::string get_attribute_value_string(const char **attributes, unsigned int attributes_size, const char *attribute_key)
Definition 3mf.cpp:390
XML_Parser m_parser
Definition 3mf.hpp:27

References get_attribute_value_string(), m_is_application_key, and m_parser.

Referenced by start_element_handler().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ characters_handler()

void XMLCALL Slic3r::PrusaFileParser::characters_handler ( void * userData,
const XML_Char * s,
int len )
staticprivate
314{
315 PrusaFileParser *prusa_parser = (PrusaFileParser *) userData;
316 if (prusa_parser != nullptr) { prusa_parser->_characters_handler(s, len); }
317}
PrusaFileParser()
Definition 3mf.hpp:11

References PrusaFileParser(), and _characters_handler().

Referenced by check_3mf_from_prusa().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_3mf_from_prusa()

bool Slic3r::PrusaFileParser::check_3mf_from_prusa ( const std::string filename)
320{
321 mz_zip_archive archive;
322 mz_zip_zero_struct(&archive);
323 if (!open_zip_reader(&archive, filename)) {
324 // throw Slic3r::RuntimeError("Loading 3mf file failed.");
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);
337 XML_SetElementHandler(m_parser, start_element_handler, nullptr);
338 XML_SetCharacterDataHandler(m_parser, characters_handler);
339
340 mz_zip_archive_file_stat stat;
341 if (!mz_zip_reader_file_stat(&archive, model_file_index, &stat)) goto EXIT;
342 // expat sizes its buffer with an int, so a larger entry cannot be parsed in one piece.
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:
357 close_zip_reader(&archive);
358 return m_from_prusa;
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

References characters_handler(), Slic3r::close_zip_reader(), m_from_prusa, m_parser, Slic3r::open_zip_reader(), and start_element_handler().

Referenced by Slic3r::Model::read_from_archive().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_attribute_value_charptr()

const char * Slic3r::PrusaFileParser::get_attribute_value_charptr ( const char ** attributes,
unsigned int attributes_size,
const char * attribute_key )
private
380{
381 if ((attributes == nullptr) || (attributes_size == 0) || (attributes_size % 2 != 0) || (attribute_key == nullptr)) return nullptr;
382
383 for (unsigned int a = 0; a < attributes_size; a += 2) {
384 if (::strcmp(attributes[a], attribute_key) == 0) return attributes[a + 1];
385 }
386
387 return nullptr;
388}

Referenced by get_attribute_value_string().

Here is the caller graph for this function:

◆ get_attribute_value_string()

std::string Slic3r::PrusaFileParser::get_attribute_value_string ( const char ** attributes,
unsigned int attributes_size,
const char * attribute_key )
private
391{
392 const char *text = get_attribute_value_charptr(attributes, attributes_size, attribute_key);
393 return (text != nullptr) ? text : "";
394}
const char * get_attribute_value_charptr(const char **attributes, unsigned int attributes_size, const char *attribute_key)
Definition 3mf.cpp:379

References get_attribute_value_charptr().

Referenced by _start_element_handler().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ start_element_handler()

void XMLCALL Slic3r::PrusaFileParser::start_element_handler ( void * userData,
const char * name,
const char ** attributes )
staticprivate
308{
309 PrusaFileParser *prusa_parser = (PrusaFileParser *) userData;
310 if (prusa_parser != nullptr) { prusa_parser->_start_element_handler(name, attributes); }
311}

References PrusaFileParser(), and _start_element_handler().

Referenced by check_3mf_from_prusa().

Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ m_from_prusa

bool Slic3r::PrusaFileParser::m_from_prusa = false
private

◆ m_is_application_key

bool Slic3r::PrusaFileParser::m_is_application_key = false
private

◆ m_parser

XML_Parser Slic3r::PrusaFileParser::m_parser
private

The documentation for this class was generated from the following files:
  • /home/runner/work/OrcaSlicer/OrcaSlicer/src/libslic3r/Format/3mf.hpp
  • /home/runner/work/OrcaSlicer/OrcaSlicer/src/libslic3r/Format/3mf.cpp