102 lines
3.1 KiB
Text
102 lines
3.1 KiB
Text
##
|
|
# Initialize addons configured with --addon=foobar command line switch:
|
|
# - get the list of registered add-ons
|
|
# - load the addon-main.nas file of each add-on into namespace
|
|
# __addon[ADDON_ID]__
|
|
# - call function main() from every such addon-main.nas with the add-on ghost
|
|
# as argument (an addons.Addon instance).
|
|
|
|
# Example:
|
|
#
|
|
# fgfs --addon=/foo/bar/baz
|
|
#
|
|
# - AddonManager.cxx parses /foo/bar/baz/addon-metadata.xml
|
|
# - AddonManager.cxx creates prop nodes under /addons containing add-on metadata
|
|
# - AddonManager.cxx loads /foo/bar/baz/addon-config.xml into the Property Tree
|
|
# - AddonManager.cxx adds /foo/bar/baz to the list of aircraft paths (to get
|
|
# permissions to read files from there)
|
|
# - this script loads /foo/bar/baz/addon-main.nas into namespace
|
|
# __addon[ADDON_ID]__
|
|
# - this script calls main(addonGhost) from /foo/bar/baz/addon-main.nas.
|
|
# - the add-on ghost can be used to retrieve most of the add-on metadata, for
|
|
# instance:
|
|
# addonGhost.id the add-on identifier
|
|
# addonGhost.name the add-on name
|
|
# addonGhost.version.str() the add-on version as a string
|
|
# addonGhost.basePath the add-on base path (realpath() of
|
|
# "/foo/bar/baz" here)
|
|
# etc.
|
|
#
|
|
# For more details, see $FG_ROOT/Docs/README.add-ons.
|
|
|
|
# hashes to store listeners and timers per addon ID
|
|
var _modules = {};
|
|
|
|
var getNamespaceName = func(a) {
|
|
return "__addon[" ~ a.id ~ "]__";
|
|
}
|
|
|
|
var load = func(a) {
|
|
var namespace = getNamespaceName(a);
|
|
var loaded = a.node.getNode("loaded", 1);
|
|
loaded.setBoolValue(0);
|
|
|
|
var module = modules.Module.new(a.id, namespace, a.node);
|
|
module.setFilePath(a.basePath);
|
|
module.setMainFile("addon-main.nas");
|
|
|
|
if (module.load(a) != nil) {
|
|
logprint(LOG_INFO, "[OK] '" ~ a.name ~ "' (V. " ~ a.version.str() ~
|
|
") loaded.");
|
|
module.printTrackedResources();
|
|
} else {
|
|
logprint(DEV_ALERT, "Failed loading addon-main.nas for " ~ a.id);
|
|
}
|
|
_modules[a.id] = module;
|
|
}
|
|
|
|
|
|
var remove = func(a) {
|
|
logprint(LOG_INFO, "- Removing add-on ", a.id);
|
|
_modules[a.id].unload();
|
|
}
|
|
|
|
var _reloadFlags = {};
|
|
|
|
var reload = func(a) {
|
|
addons.remove(a);
|
|
addons.load(a);
|
|
}
|
|
|
|
var commandAddonReload = func(node)
|
|
{
|
|
var a = addons.getAddon(node.getChild("id").getValue());
|
|
if (_modules[a.id] == nil) {
|
|
logprint(DEV_ALERT, "Unknown add-on to reload: "~id);
|
|
return;
|
|
}
|
|
addons.reload(a)
|
|
};
|
|
|
|
var init = func {
|
|
addcommand("addon-reload", commandAddonReload);
|
|
foreach (var addon; addons.registeredAddons()) {
|
|
addons._reloadFlags[addon.id] = addon.node.getNode("reload", 1);
|
|
addons._reloadFlags[addon.id].setBoolValue(0);
|
|
var makeListener = func(a) {
|
|
return func(n) {
|
|
if (n.getValue()) {
|
|
n.setValue(0);
|
|
addons.reload(a);
|
|
}
|
|
};
|
|
}
|
|
setlistener(addons._reloadFlags[addon.id], makeListener(addon));
|
|
addons.load(addon);
|
|
}
|
|
}
|
|
|
|
var id = _setlistener("/sim/signals/fdm-initialized", func {
|
|
removelistener(id);
|
|
addons.init();
|
|
})
|