73{
75
76 auto throw_on_parse_error = [&path](const std::string &msg) {
77 throw file_parser_error(std::string("Failed loading the snapshot file. Reason: ") + msg, path);
78 };
79
80
81 boost::property_tree::ptree tree;
82 try {
83 boost::nowide::ifstream ifs(path);
84 boost::property_tree::read_ini(ifs, tree);
85 } catch (const std::ifstream::failure &err) {
86 throw file_parser_error(std::string("The snapshot file cannot be loaded. Reason: ") + err.what(), path);
87 } catch (const std::runtime_error &err) {
88 throw_on_parse_error(err.what());
89 }
90
91
92 std::string group_name_vendor = "Vendor:";
93 std::string key_filament = "filament";
94 std::string key_prefix_model = "model_";
95 for (auto §ion : tree) {
96 if (section.first == "snapshot") {
97
98 for (auto &kvp : section.second) {
99 if (kvp.first == "id")
100 this->id = kvp.second.data();
101 else if (kvp.first == "time_captured") {
104 throw_on_parse_error("invalid timestamp");
105 } else if (kvp.first == "slic3r_version_captured") {
107 if (! semver)
108 throw_on_parse_error("invalid slic3r_version_captured semver");
110 } else if (kvp.first == "comment") {
111 this->
comment = kvp.second.data();
112 } else if (kvp.first == "reason") {
113 std::string rsn = kvp.second.data();
114 if (rsn == "upgrade")
116 else if (rsn == "downgrade")
118 else if (rsn == "before_rollback")
120 else if (rsn == "user")
122 else
124 }
125 }
126 } else if (section.first == "presets") {
127
128 for (auto &kvp : section.second) {
130 this->
print = kvp.second.data();
131 } else if (kvp.first == "sla_print") {
134 int idx = 0;
135 if (kvp.first == "filament" || sscanf(kvp.first.c_str(), "filament_%d", &idx) == 1) {
137 this->
filaments.resize(idx + 1, std::string());
138 this->
filaments[idx] = kvp.second.data();
139 }
140 } else if (kvp.first == "sla_material") {
143 this->
printer = kvp.second.data();
144 } else if (kvp.first == "physical_printer") {
146 }
147 }
148 } else if (boost::starts_with(section.first, group_name_vendor) && section.first.size() > group_name_vendor.size()) {
149
151 vc.
name = section.first.substr(group_name_vendor.size());
152 for (auto &kvp : section.second) {
153 if (kvp.first == "version" || kvp.first == "min_slic3r_version" || kvp.first == "max_slic3r_version") {
154
156 if (! semver)
157 throw_on_parse_error("invalid " + kvp.first + " format for " + section.first);
158 if (kvp.first == "version")
159 vc.version.config_version = *semver;
160 else if (kvp.first == "min_slic3r_version")
161 vc.version.min_slic3r_version = *semver;
162 else
163 vc.version.max_slic3r_version = *semver;
164 } else if (boost::starts_with(kvp.first, key_prefix_model) && kvp.first.size() > key_prefix_model.size()) {
165
166 auto &set_variants = vc.models_variants_installed[kvp.first.substr(key_prefix_model.size())];
167 std::vector<std::string> variants;
169 for (auto &variant : variants)
170 set_variants.insert(std::move(variant));
171 }
172 }
174 }
175 }
176
177 std::sort(this->
vendor_configs.begin(), this->vendor_configs.begin(),
179}
std::string name
Definition Snapshot.hpp:84
static boost::optional< Semver > parse(const std::string &str)
Definition Semver.hpp:63
time_t parse_iso_utc_timestamp(const std::string &str)
Definition Time.hpp:61
bool unescape_strings_cstyle(const std::string &str, std::vector< std::string > &out)
Definition Config.cpp:173