Improved error reporting and error handling when loading
vendor config bundles into installation wizard.
This commit is contained in:
parent
93f2be7ac4
commit
76fecc91a5
@ -42,16 +42,27 @@ using Config::SnapshotDB;
|
|||||||
|
|
||||||
// Configuration data structures extensions needed for the wizard
|
// Configuration data structures extensions needed for the wizard
|
||||||
|
|
||||||
Bundle::Bundle(fs::path source_path, bool is_in_resources, bool is_prusa_bundle)
|
bool Bundle::load(fs::path source_path, bool ais_in_resources, bool ais_prusa_bundle)
|
||||||
: preset_bundle(new PresetBundle)
|
|
||||||
, vendor_profile(nullptr)
|
|
||||||
, is_in_resources(is_in_resources)
|
|
||||||
, is_prusa_bundle(is_prusa_bundle)
|
|
||||||
{
|
{
|
||||||
preset_bundle->load_configbundle(source_path.string(), PresetBundle::LOAD_CFGBNDLE_SYSTEM);
|
this->preset_bundle = std::make_unique<PresetBundle>();
|
||||||
|
this->is_in_resources = ais_in_resources;
|
||||||
|
this->is_prusa_bundle = ais_prusa_bundle;
|
||||||
|
|
||||||
|
std::string path_string = source_path.string();
|
||||||
|
size_t presets_loaded = preset_bundle->load_configbundle(path_string, PresetBundle::LOAD_CFGBNDLE_SYSTEM);
|
||||||
auto first_vendor = preset_bundle->vendors.begin();
|
auto first_vendor = preset_bundle->vendors.begin();
|
||||||
wxCHECK_RET(first_vendor != preset_bundle->vendors.end(), "Failed to load preset bundle");
|
if (first_vendor == preset_bundle->vendors.end()) {
|
||||||
vendor_profile = &first_vendor->second;
|
BOOST_LOG_TRIVIAL(error) << boost::format("Vendor bundle: `%1%`: No vendor information defined, cannot install.") % path_string;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (presets_loaded == 0) {
|
||||||
|
BOOST_LOG_TRIVIAL(error) << boost::format("Vendor bundle: `%1%`: No profile loaded.") % path_string;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_LOG_TRIVIAL(trace) << boost::format("Vendor bundle: `%1%`: %2% profiles loaded.") % path_string % presets_loaded;
|
||||||
|
this->vendor_profile = &first_vendor->second;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
Bundle::Bundle(Bundle &&other)
|
Bundle::Bundle(Bundle &&other)
|
||||||
@ -76,8 +87,11 @@ BundleMap BundleMap::load()
|
|||||||
prusa_bundle_path = (rsrc_vendor_dir / PresetBundle::PRUSA_BUNDLE).replace_extension(".ini");
|
prusa_bundle_path = (rsrc_vendor_dir / PresetBundle::PRUSA_BUNDLE).replace_extension(".ini");
|
||||||
prusa_bundle_rsrc = true;
|
prusa_bundle_rsrc = true;
|
||||||
}
|
}
|
||||||
Bundle prusa_bundle(std::move(prusa_bundle_path), prusa_bundle_rsrc, true);
|
{
|
||||||
res.emplace(PresetBundle::PRUSA_BUNDLE, std::move(prusa_bundle));
|
Bundle prusa_bundle;
|
||||||
|
if (prusa_bundle.load(std::move(prusa_bundle_path), prusa_bundle_rsrc, true))
|
||||||
|
res.emplace(PresetBundle::PRUSA_BUNDLE, std::move(prusa_bundle));
|
||||||
|
}
|
||||||
|
|
||||||
// Load the other bundles in the datadir/vendor directory
|
// Load the other bundles in the datadir/vendor directory
|
||||||
// and then additionally from resources/profiles.
|
// and then additionally from resources/profiles.
|
||||||
@ -90,8 +104,9 @@ BundleMap BundleMap::load()
|
|||||||
// Don't load this bundle if we've already loaded it.
|
// Don't load this bundle if we've already loaded it.
|
||||||
if (res.find(id) != res.end()) { continue; }
|
if (res.find(id) != res.end()) { continue; }
|
||||||
|
|
||||||
Bundle bundle(dir_entry.path(), is_in_resources);
|
Bundle bundle;
|
||||||
res.emplace(std::move(id), std::move(bundle));
|
if (bundle.load(dir_entry.path(), is_in_resources))
|
||||||
|
res.emplace(std::move(id), std::move(bundle));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,13 +100,16 @@ struct Materials
|
|||||||
struct Bundle
|
struct Bundle
|
||||||
{
|
{
|
||||||
std::unique_ptr<PresetBundle> preset_bundle;
|
std::unique_ptr<PresetBundle> preset_bundle;
|
||||||
VendorProfile *vendor_profile;
|
VendorProfile *vendor_profile { nullptr };
|
||||||
const bool is_in_resources;
|
bool is_in_resources { false };
|
||||||
const bool is_prusa_bundle;
|
bool is_prusa_bundle { false };
|
||||||
|
|
||||||
Bundle(fs::path source_path, bool is_in_resources, bool is_prusa_bundle = false);
|
Bundle() = default;
|
||||||
Bundle(Bundle &&other);
|
Bundle(Bundle &&other);
|
||||||
|
|
||||||
|
// Returns false if not loaded. Reason for that is logged as boost::log error.
|
||||||
|
bool load(fs::path source_path, bool is_in_resources, bool is_prusa_bundle = false);
|
||||||
|
|
||||||
const std::string& vendor_id() const { return vendor_profile->id; }
|
const std::string& vendor_id() const { return vendor_profile->id; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -703,7 +703,10 @@ void PresetBundle::load_config_file(const std::string &path)
|
|||||||
boost::nowide::ifstream ifs(path);
|
boost::nowide::ifstream ifs(path);
|
||||||
boost::property_tree::read_ini(ifs, tree);
|
boost::property_tree::read_ini(ifs, tree);
|
||||||
} catch (const std::ifstream::failure &err) {
|
} catch (const std::ifstream::failure &err) {
|
||||||
throw std::runtime_error(std::string("The config file cannot be loaded: ") + path + "\n\tReason: " + err.what());
|
throw std::runtime_error(std::string("The Config Bundle cannot be loaded: ") + path + "\n\tReason: " + err.what());
|
||||||
|
} catch (const boost::property_tree::file_parser_error &err) {
|
||||||
|
throw std::runtime_error((boost::format("Failed loading the Config Bundle \"%1%\": %2% at line %3%")
|
||||||
|
% err.filename() % err.message() % err.line()).str());
|
||||||
} catch (const std::runtime_error &err) {
|
} catch (const std::runtime_error &err) {
|
||||||
throw std::runtime_error(std::string("Failed loading the preset file: ") + path + "\n\tReason: " + err.what());
|
throw std::runtime_error(std::string("Failed loading the preset file: ") + path + "\n\tReason: " + err.what());
|
||||||
}
|
}
|
||||||
@ -1109,8 +1112,13 @@ size_t PresetBundle::load_configbundle(const std::string &path, unsigned int fla
|
|||||||
const VendorProfile *vendor_profile = nullptr;
|
const VendorProfile *vendor_profile = nullptr;
|
||||||
if (flags & (LOAD_CFGBNDLE_SYSTEM | LOAD_CFGBUNDLE_VENDOR_ONLY)) {
|
if (flags & (LOAD_CFGBNDLE_SYSTEM | LOAD_CFGBUNDLE_VENDOR_ONLY)) {
|
||||||
auto vp = VendorProfile::from_ini(tree, path);
|
auto vp = VendorProfile::from_ini(tree, path);
|
||||||
if (vp.num_variants() == 0)
|
if (vp.models.size() == 0) {
|
||||||
|
BOOST_LOG_TRIVIAL(error) << boost::format("Vendor bundle: `%1%`: No printer model defined.") % path;
|
||||||
return 0;
|
return 0;
|
||||||
|
} else if (vp.num_variants() == 0) {
|
||||||
|
BOOST_LOG_TRIVIAL(error) << boost::format("Vendor bundle: `%1%`: No printer variant defined") % path;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
vendor_profile = &this->vendors.insert({vp.id, vp}).first->second;
|
vendor_profile = &this->vendors.insert({vp.id, vp}).first->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user