20,741
edits
(→Patch) |
m (→Patch: untested for now ...) |
||
Line 18: | Line 18: | ||
}} | }} | ||
<syntaxhighlight lang="diff"> | <syntaxhighlight lang="diff">diff --git a/src/AIModel/AIManager.cxx b/src/AIModel/AIManager.cxx | ||
index 4faf23e..e09db60 100644 | |||
--- a/src/AIModel/AIManager.cxx | |||
+++ b/src/AIModel/AIManager.cxx | |||
@@ -72,6 +72,10 @@ public: | |||
std::string loadScript = nasalScripts->getStringValue("load"); | |||
if (!loadScript.empty()) { | |||
FGNasalSys* nasalSys = (FGNasalSys*) globals->get_subsystem("nasal"); | |||
+ if(!nasalSys) { | |||
+ NASAL_DISABLED("AI scenarios"); | |||
+ return; | |||
+ } | |||
std::string moduleName = "scenario_" + _internalName; | |||
nasalSys->createModule(moduleName.c_str(), moduleName.c_str(), | |||
loadScript.c_str(), loadScript.size(), | |||
@@ -86,8 +90,10 @@ public: | |||
} | |||
FGNasalSys* nasalSys = (FGNasalSys*) globals->get_subsystem("nasal"); | |||
- if (!nasalSys) | |||
- return; | |||
+ if(!nasalSys) { | |||
+ NASAL_DISABLED("AI scenarios"); | |||
+ return; | |||
+ } | |||
std::string moduleName = "scenario_" + _internalName; | |||
if (!_unloadScript.empty()) { | |||
diff --git a/src/GUI/CanvasWidget.cxx b/src/GUI/CanvasWidget.cxx | |||
index f68fe22..52ed2f4 100644 | |||
--- a/src/GUI/CanvasWidget.cxx | |||
+++ b/src/GUI/CanvasWidget.cxx | |||
@@ -72,10 +72,13 @@ CanvasWidget::CanvasWidget( int x, int y, | |||
return; | |||
FGNasalSys *nas = dynamic_cast<FGNasalSys*>(globals->get_subsystem("nasal")); | |||
- if( !nas ) | |||
+ if( !nas ) { | |||
SG_LOG( SG_GENERAL, | |||
SG_ALERT, | |||
"CanvasWidget: Failed to get nasal subsystem!" ); | |||
+ NASAL_DISABLED("PUI CanvasWidget"); | |||
+ return; | |||
+ } | |||
const std::string file = std::string("__canvas:") | |||
+ cprops->getStringValue("name"); | |||
diff --git a/src/GUI/FGPUIDialog.cxx b/src/GUI/FGPUIDialog.cxx | |||
index 30cbef7..f66f40e 100644 | |||
--- a/src/GUI/FGPUIDialog.cxx | |||
+++ b/src/GUI/FGPUIDialog.cxx | |||
@@ -672,7 +672,9 @@ FGPUIDialog::FGPUIDialog (SGPropertyNode *props) : | |||
FGNasalSys *nas = (FGNasalSys *)globals->get_subsystem("nasal"); | |||
if (nas) | |||
nas->createModule(_module.c_str(), _module.c_str(), s, strlen(s), props); | |||
+ else NASAL_DISABLED("Nasal embedded in PUI dialogs"); | |||
} | |||
+ | |||
} | |||
display(props); | |||
} | |||
@@ -1056,7 +1058,11 @@ FGPUIDialog::makeObject (SGPropertyNode *props, int parentWidth, int parentHeigh | |||
} | |||
} else { | |||
FGNasalSys* nasal = (FGNasalSys*) globals->get_subsystem("nasal"); | |||
+ if(nasal) | |||
obj->setBuffer(nasal->log()); | |||
+ else { | |||
+ NASAL_DISABLED("PUI"); | |||
+ } | |||
} | |||
setupObject(obj, props); | |||
diff --git a/src/GUI/FileDialog.cxx b/src/GUI/FileDialog.cxx | |||
index 2047898..d71d910 100644 | |||
--- a/src/GUI/FileDialog.cxx | |||
+++ b/src/GUI/FileDialog.cxx | |||
@@ -100,6 +100,10 @@ public: | |||
object(obj) | |||
{ | |||
FGNasalSys* sys = static_cast<FGNasalSys*>(globals->get_subsystem("nasal")); | |||
+ if(!sys) { | |||
+ NASAL_DISABLED("FileDialog"); | |||
+ return; | |||
+ } | |||
_gcKeys[0] = sys->gcSave(f); | |||
_gcKeys[1] = sys->gcSave(obj); | |||
} | |||
@@ -107,7 +111,10 @@ public: | |||
virtual void onFileDialogDone(FGFileDialog* instance, const SGPath& aPath) | |||
{ | |||
FGNasalSys* sys = static_cast<FGNasalSys*>(globals->get_subsystem("nasal")); | |||
- | |||
+ if(!sys) { | |||
+ NASAL_DISABLED("FileDialog (done)"); | |||
+ return; | |||
+ } | |||
naContext ctx = naNewContext(); | |||
naRef args[1]; | |||
args[0] = nasal::to_nasal(ctx, aPath); | |||
@@ -119,6 +126,10 @@ public: | |||
~NasalCallback() | |||
{ | |||
FGNasalSys* sys = static_cast<FGNasalSys*>(globals->get_subsystem("nasal")); | |||
+ if(!sys) { | |||
+ NASAL_DISABLED("FileDialog"); | |||
+ return; | |||
+ } | |||
sys->gcRelease(_gcKeys[0]); | |||
sys->gcRelease(_gcKeys[1]); | |||
} | |||
diff --git a/src/Input/FGEventInput.cxx b/src/Input/FGEventInput.cxx | |||
index 29bdc6e..7bbab09 100644 | |||
--- a/src/Input/FGEventInput.cxx | |||
+++ b/src/Input/FGEventInput.cxx | |||
@@ -236,6 +236,7 @@ FGInputDevice::~FGInputDevice() | |||
} | |||
nas->deleteModule(nasalModule.c_str()); | |||
} | |||
+ else NASAL_DISABLED("FGInputDevice"); | |||
} | |||
void FGInputDevice::Configure( SGPropertyNode_ptr aDeviceNode ) | |||
@@ -264,7 +265,7 @@ void FGInputDevice::Configure( SGPropertyNode_ptr aDeviceNode ) | |||
FGNasalSys *nas = (FGNasalSys *)globals->get_subsystem("nasal"); | |||
if (nas) | |||
nas->createModule(nasalModule.c_str(), nasalModule.c_str(), s.c_str(), s.length(), deviceNode ); | |||
- } | |||
+ } else NASAL_DISABLED("FGInputDevice::Configure"); | |||
} | |||
} | |||
diff --git a/src/Input/FGJoystickInput.cxx b/src/Input/FGJoystickInput.cxx | |||
index 069e9d8..d6d3fd8 100644 | |||
--- a/src/Input/FGJoystickInput.cxx | |||
+++ b/src/Input/FGJoystickInput.cxx | |||
@@ -208,14 +208,16 @@ void FGJoystickInput::postinit() | |||
std::ostringstream str; | |||
str << "__js" << i; | |||
std::string module = str.str(); | |||
+ unsigned int j; | |||
+ if (nasalsys) { | |||
nasalsys->createModule(module.c_str(), module.c_str(), "", 0); | |||
PropertyList nasal = js_node->getChildren("nasal"); | |||
- unsigned int j; | |||
for (j = 0; j < nasal.size(); j++) { | |||
nasal[j]->setStringValue("module", module.c_str()); | |||
nasalsys->handleCommand(nasal[j]); | |||
} | |||
+ } else NASAL_DISABLED("Joystick bindings"); | |||
// | |||
// Initialize the axes. | |||
diff --git a/src/Input/FGKeyboardInput.cxx b/src/Input/FGKeyboardInput.cxx | |||
index 8ff3d0a..004547e 100644 | |||
--- a/src/Input/FGKeyboardInput.cxx | |||
+++ b/src/Input/FGKeyboardInput.cxx | |||
@@ -109,11 +109,13 @@ void FGKeyboardInput::postinit() | |||
} | |||
FGNasalSys *nasalsys = (FGNasalSys *)globals->get_subsystem("nasal"); | |||
+ if(nasalsys) { | |||
PropertyList nasal = key_nodes->getChildren("nasal"); | |||
for (unsigned int j = 0; j < nasal.size(); j++) { | |||
nasal[j]->setStringValue("module", module.c_str()); | |||
nasalsys->handleCommand(nasal[j]); | |||
} | |||
+} else NASAL_DISABLED("Keyboard bindings"); | |||
PropertyList keys = key_nodes->getChildren("key"); | |||
for (unsigned int i = 0; i < keys.size(); i++) { | |||
diff --git a/src/Main/fg_commands.cxx b/src/Main/fg_commands.cxx | |||
index 1e93a0b..e07d4b9 100644 | |||
--- a/src/Main/fg_commands.cxx | |||
+++ b/src/Main/fg_commands.cxx | |||
@@ -185,7 +185,13 @@ do_null (const SGPropertyNode * arg) | |||
static bool | |||
do_nasal (const SGPropertyNode * arg) | |||
{ | |||
- return ((FGNasalSys*)globals->get_subsystem("nasal"))->handleCommand(arg); | |||
+ FGNasalSys* nasalSys = (FGNasalSys*) globals->get_subsystem("nasal"); | |||
+ if(!nasalSys) { | |||
+ NASAL_DISABLED("fgcomand nasal (bindings)"); | |||
+ return false; | |||
+ } | |||
+ return nasalSys->handleCommand(arg); | |||
+ | |||
} | |||
/** | |||
diff --git a/src/Main/fg_init.cxx b/src/Main/fg_init.cxx | |||
index 61d3425..d8bd11a 100644 | |||
--- a/src/Main/fg_init.cxx | |||
+++ b/src/Main/fg_init.cxx | |||
@@ -904,11 +904,12 @@ void fgPostInitSubsystems() | |||
// Initialize the Nasal interpreter. | |||
// Do this last, so that the loaded scripts see initialized state | |||
//////////////////////////////////////////////////////////////////////// | |||
+if(!fgGetBool("/sim/startup/disable-nasal",false)) { | |||
FGNasalSys* nasal = new FGNasalSys(); | |||
globals->add_subsystem("nasal", nasal, SGSubsystemMgr::INIT); | |||
nasal->init(); | |||
SG_LOG(SG_GENERAL, SG_INFO, "Nasal init took:" << st.elapsedMSec()); | |||
- | |||
+} else NASAL_DISABLED("Initialization"); | |||
// initialize methods that depend on other subsystems. | |||
st.stamp(); | |||
globals->get_subsystem_mgr()->postinit(); | |||
diff --git a/src/Network/ATC-Main.cxx b/src/Network/ATC-Main.cxx | |||
index 6c0da9b..00cd91a 100644 | |||
--- a/src/Network/ATC-Main.cxx | |||
+++ b/src/Network/ATC-Main.cxx | |||
@@ -223,10 +223,12 @@ bool FGATCMain::process() { | |||
// directly provide. | |||
FGNasalSys *n = (FGNasalSys*)globals->get_subsystem("nasal"); | |||
+ if(n) { | |||
bool result = n->parseAndRun( "atcsim.update()" ); | |||
if ( !result ) { | |||
SG_LOG( SG_NETWORK, SG_ALERT, "Nasal: atcsim.update() failed!" ); | |||
} | |||
+ } else NASAL_DISABLED("ATC-Main"); | |||
// process the ATC outputs | |||
if ( output0 != NULL && board0_locked ) { | |||
diff --git a/src/Network/HTTPClient.cxx b/src/Network/HTTPClient.cxx | |||
index e6d2b29..48376ab 100644 | |||
--- a/src/Network/HTTPClient.cxx | |||
+++ b/src/Network/HTTPClient.cxx | |||
@@ -327,6 +327,10 @@ void FGHTTPClient::postinit() | |||
pkg::Root* packageRoot = globals->packageRoot(); | |||
if (packageRoot) { | |||
FGNasalSys* nasalSys = (FGNasalSys*) globals->get_subsystem("nasal"); | |||
+ if(!nasalSys) { | |||
+ NASAL_DISABLED("package manager"); | |||
+ return; | |||
+ } | |||
nasal::Hash nasalGlobals = nasalSys->getGlobals(); | |||
nasal::Hash nasalPkg = nasalGlobals.createHash("pkg"); // module | |||
nasalPkg.set("root", packageRoot); | |||
diff --git a/src/Scripting/NasalSys.hxx b/src/Scripting/NasalSys.hxx | |||
index 096a591..af01ff2 100644 | |||
--- a/src/Scripting/NasalSys.hxx | |||
+++ b/src/Scripting/NasalSys.hxx | |||
@@ -30,11 +30,14 @@ namespace simgear { class BufferedLogCallback; } | |||
SGPropertyNode* ghostToPropNode(naRef ref); | |||
+#define NASAL_DISABLED(feature) SG_LOG(SG_NASAL, SG_ALERT, "Nasal support disabled:" << feature) | |||
+ | |||
class FGNasalSys : public SGSubsystem | |||
{ | |||
public: | |||
FGNasalSys(); | |||
virtual ~FGNasalSys(); | |||
+ | |||
virtual void init(); | |||
virtual void shutdown(); | |||
</syntaxhighlight> | </syntaxhighlight> |