diff --git a/Nasal/modules/repair_config.nas b/Nasal/modules/repair_config.nas new file mode 100644 index 000000000..16de1014b --- /dev/null +++ b/Nasal/modules/repair_config.nas @@ -0,0 +1,82 @@ +#------------------------------------------------------------------------------- +# repair_config.mod +# This code repairs the userarchive flags for core nasal modules listed in +# defaults.xml, they may be wrongly set in the users home directory by earlier +# versions of FlightGear +#------------------------------------------------------------------------------- +var defaults_path = getprop("/sim/fg-root")~"/defaults.xml"; + +var printNodeInfo = func(n) { + print(sprintf("%-20s enabled=%s, userarchive=%s", + n.getName(), + n.getNode("enabled").getValue(), + n.getNode("enabled").getAttribute("userarchive") + )); +} + +var printConfig = func(name, cfg) { + print("== "~name~" =="); + foreach (var mod; cfg.getChildren()) { + if (mod.getChild("enabled") != nil) + printNodeInfo(mod); + } +} + +var loadDefaultsNasal = func { + var defaults = io.readxml(defaults_path); + if (defaults != nil) { + defaults = defaults.getNode("PropertyList/nasal"); + foreach (var mod; defaults.getChildren()) { + var enabled = mod.getNode("enabled"); + if (string.lc(enabled.getValue()) == "true") enabled.setIntValue(1); + else enabled.setIntValue(0); + enabled.setAttribute("userarchive", + (mod.getNode("enabled/___userarchive").getValue() == "y") + ); + } + } + return defaults; +} + +var compareConfigs = func(ref_cfg, check_cfg) { + var mismatch = 0; + # printConfig("default", mod_default_cfg); + # printConfig("actual", mod_runtime_cfg); + foreach (var mod; ref_cfg.getChildren()) { + var name = mod.getName(); + var ref_ena = mod.getChild("enabled"); + var ref_ua = ref_ena.getAttribute("userarchive"); + var check_mod = check_cfg.getChild(name); + if (check_mod != nil) { + var check_ena = check_mod.getChild("enabled"); + var check_ua = check_ena.getAttribute("userarchive"); + # if (ref_ena.getValue() != check_ena.getValue()) + # printf("%-20s enable flag mismatch", name); + if (ref_ua != check_ua) { + printf("%-20s userarchive mismatch", name); + mismatch = 1; + } + } + } + return mismatch; +} + +var repairUserArchiveFlag = func(ref_cfg, check_cfg) { + foreach (var mod; ref_cfg.getChildren()) { + var name = mod.getName(); + var ref_ua = mod.getChild("enabled").getAttribute("userarchive"); + var check_mod = check_cfg.getChild(name); + if (check_mod != nil) { + check_mod.getChild("enabled").setAttribute("userarchive", ref_ua); + check_mod.setAttribute("userarchive", ref_ua); + } + } +} + +var mod_default_cfg = loadDefaultsNasal(); +var mod_runtime_cfg = props.getNode("/nasal"); + +if (compareConfigs(mod_default_cfg, mod_runtime_cfg)) { + print("-- Resetting userarchive flags to defaults --"); + repairUserArchiveFlag(mod_default_cfg, mod_runtime_cfg); +} diff --git a/defaults.xml b/defaults.xml index 92a4334aa..3223b4dcc 100644 --- a/defaults.xml +++ b/defaults.xml @@ -1361,6 +1361,9 @@ Started September 2000 by David Megginson, david@megginson.com true + + true + true