X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;ds=sidebyside;f=src%2FScripting%2FNasalSys.hxx;h=0b10ad0c7f20e191dd5bdeb90587ee0a33c3d5a0;hb=4c5e96f730ebc5c98ae247e7c3e94ebc9efaf136;hp=bf6a0abf6d7f57fd6b32de4ace1dfa034c53172c;hpb=3a6bc316edef6366d442912c6ba086b762e2966f;p=flightgear.git diff --git a/src/Scripting/NasalSys.hxx b/src/Scripting/NasalSys.hxx index bf6a0abf6..0b10ad0c7 100644 --- a/src/Scripting/NasalSys.hxx +++ b/src/Scripting/NasalSys.hxx @@ -4,8 +4,14 @@ #include #include #include +#include + +#include +SG_USING_STD(map); + class FGNasalScript; +class FGNasalListener; class FGNasalSys : public SGSubsystem { @@ -15,6 +21,10 @@ public: virtual void init(); virtual void update(double dt) { /* noop */ } + // Loads a nasal script from an external file and inserts it as a + // global module of the specified name. + void loadModule(SGPath file, const char* moduleName); + // Simple hook to run arbitrary source code. Returns a bool to // indicate successful execution. Does *not* return any Nasal // values, because handling garbage-collected objects from C space @@ -32,14 +42,24 @@ public: // Implementation of the settimer extension function void setTimer(int argc, naRef* args); + // Implementation of the setlistener extension function + naRef setListener(int argc, naRef* args); + naRef removeListener(int argc, naRef* args); + // Returns a ghost wrapper for the current _cmdArg naRef cmdArgGhost(); - + // Callbacks for command and timer bindings virtual bool handleCommand(const SGPropertyNode* arg); + void createModule(const char* moduleName, const char* fileName, + const char* src, int len); + + void deleteModule(const char* moduleName); + private: friend class FGNasalScript; + friend class FGNasalListener; // // FGTimer subclass for handling Nasal timer callbacks. @@ -53,12 +73,13 @@ private: FGNasalSys* nasal; }; + // Listener + map _listener; + static int _listenerId; + void loadPropertyScripts(); - void initModule(const char* moduleName, const char* fileName, - const char* src, int len); - void readScriptFile(SGPath file, const char* lib); void hashset(naRef hash, const char* key, naRef val); - void logError(); + void logError(naContext); naRef parse(const char* filename, const char* buf, int len); naRef genPropsModule(); naRef propNodeGhost(SGPropertyNode* handle); @@ -83,12 +104,14 @@ private: public: void handleTimer(NasalTimer* t); }; + class FGNasalScript { public: ~FGNasalScript() { _nas->gcRelease(_gcKey); } bool call() { - naCall(_nas->_context, _code, naNil(), naNil(), naNil()); + naRef n = naNil(); + naCall(_nas->_context, _code, 0, &n, naNil(), naNil()); return naGetError(_nas->_context) == 0; } @@ -99,4 +122,34 @@ private: FGNasalSys* _nas; }; + +class FGNasalListener : public SGPropertyChangeListener { +public: + FGNasalListener(SGPropertyNode_ptr node, naRef handler, + FGNasalSys* nasal, int key); + + ~FGNasalListener(); + void valueChanged(SGPropertyNode* node); + +private: + friend class FGNasalSys; + SGPropertyNode_ptr _node; + naRef _handler; + int _gcKey; + FGNasalSys* _nas; + bool _active; +}; + + +class FGNasalModelData : public SGModelData { +public: + FGNasalModelData() : _unload(0) {} + ~FGNasalModelData(); + void modelLoaded(const string& path, SGPropertyNode *prop, ssgBranch *); + +private: + string _module; + SGConstPropertyNode_ptr _unload; +}; + #endif // __NASALSYS_HXX