From: ThorstenB Date: Sat, 2 Apr 2011 13:13:29 +0000 (+0200) Subject: Support optional Nasal modules in fgdata/Nasal/MyModuleFoo X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=298f832d4313cdba882ca5a398efdbc7a3599789;p=flightgear.git Support optional Nasal modules in fgdata/Nasal/MyModuleFoo - Allow structuring generic Nasal sources into modules (i.e. support separate source folders for multiplayer/local weather/... sources) - Option to enable/disable loading of generic Nasal modules (i.e we only need to load stuff that is really needed/enabled). - Provide basic loading sequence: subfolders are strictly loaded _after_ the base directory. So submodules can rely on .nas-scripts like math.nas, io.nas, debug.nas, ... to be already loaded - dropping the need for awkward listeners/timers to delay module initialization (loading order within Nasal/*.nas is still random) --- diff --git a/src/Scripting/NasalSys.cxx b/src/Scripting/NasalSys.cxx index 1f952b325..72a99bc93 100644 --- a/src/Scripting/NasalSys.cxx +++ b/src/Scripting/NasalSys.cxx @@ -737,12 +737,15 @@ void FGNasalSys::init() // Now load the various source files in the Nasal directory simgear::Dir nasalDir(SGPath(globals->get_fg_root(), "Nasal")); - simgear::PathList scripts = nasalDir.children(simgear::Dir::TYPE_FILE, ".nas"); - - for (unsigned int i=0; i0) + { + SGPropertyNode* nasal = globals->get_props()->getNode("nasal"); + SGPropertyNode* module_node = nasal->getChild(moduleName,0,true); + for (unsigned int i=0; igetChild("file",i,true); + pFileNode->setStringValue(scripts[i].c_str()); + } + if (!module_node->hasChild("enabled",0)) + { + SGPropertyNode* node = module_node->getChild("enabled",0,true); + node->setBoolValue(true); + node->setAttribute(SGPropertyNode::USERARCHIVE,true); + } + } +} + // Loads the scripts found under /nasal in the global tree void FGNasalSys::loadPropertyScripts() { @@ -785,33 +819,51 @@ void FGNasalSys::loadPropertyScripts() for(int i=0; inChildren(); i++) { SGPropertyNode* n = nasal->getChild(i); + bool is_loaded = false; const char* module = n->getName(); if(n->hasChild("module")) module = n->getStringValue("module"); - - // allow multiple files to be specified within a single - // Nasal module tag - int j = 0; - SGPropertyNode *fn; - bool file_specified = false; - while((fn = n->getChild("file", j)) != NULL) { - file_specified = true; - const char* file = fn->getStringValue(); - SGPath p = globals->resolve_maybe_aircraft_path(file); - loadModule(p, module); - j++; + if (n->getBoolValue("enabled",true)) + { + // allow multiple files to be specified within a single + // Nasal module tag + int j = 0; + SGPropertyNode *fn; + bool file_specified = false; + while((fn = n->getChild("file", j)) != NULL) { + file_specified = true; + const char* file = fn->getStringValue(); + SGPath p(file); + if (!p.isAbsolute() || !p.exists()) + { + p = globals->resolve_maybe_aircraft_path(file); + } + loadModule(p, module); + j++; + } + + const char* src = n->getStringValue("script"); + if(!n->hasChild("script")) src = 0; // Hrm... + if(src) + createModule(module, n->getPath().c_str(), src, strlen(src)); + + if(!file_specified && !src) + { + // module no longer exists - clear the archived "enable" flag + n->setAttribute(SGPropertyNode::USERARCHIVE,false); + SGPropertyNode* node = n->getChild("enabled",0,false); + if (node) + node->setAttribute(SGPropertyNode::USERARCHIVE,false); + + SG_LOG(SG_NASAL, SG_ALERT, "Nasal error: " << + "no or