1
0
Fork 0
fgdata/Nasal/addons.nas
Florent Rougon a57aed195e Add-ons: pass the addons.Addon ghost to main() instead of the base path
The addons.Addon instance (ghost) is much more interesting than its base
path. The base path is immediately accessible from the addons.Addon
instance using its 'basePath' attribute. The addons.Addon instance
allows main() to easily access essentially all of the add-on metadata,
including the add-on identifier, which makes it possible to write
main.nas without hardcoding the add-on id at all.

This is an incompatible change of course, so better do it now than
later.
2018-01-08 09:55:55 +01:00

48 lines
2 KiB
Text

##
# Initialize addons configured with --addon=foobar command line switch:
# - get the list of registered add-ons
# - load the main.nas file of each add-on into namespace __addon[ADDON_ID]__
# - call function main() from every such 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/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/main.nas into namespace __addon[ADDON_ID]__
# - this script calls main(addonGhost) from /foo/bar/baz/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.
var id = _setlistener("/sim/signals/fdm-initialized", func {
removelistener(id);
foreach (var addon; addons.registeredAddons()) {
var main_nas = addon.basePath ~ "/main.nas";
var namespace = "__addon" ~ "[" ~ addon.id ~ "]__";
logprint(5, "Initializing addon '" ~ addon.name ~
"' version " ~ addon.version.str() ~ " from " ~ main_nas ~
" in " ~ namespace);
io.load_nasal( main_nas, namespace );
var addon_main = globals[namespace]["main"];
var addon_main_args = [ addon ];
call(addon_main, addon_main_args); #, object, namespace, error_vector);
# Tell the world that the add-on is now loaded.
addon.node.getChild("loaded", 0, 1).setBoolValue(1);
}
})