X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FScripting%2FNasalSys.hxx;h=096a591bed35ce854f2212848456db161f15d4c9;hb=9c63b7713307eb4db9f6df7959fe83977f561c42;hp=b2c569e6a325d52e5b36fe487c1771782600701b;hpb=eba03b5e469824ee8f1494723fcddbbc56155a08;p=flightgear.git diff --git a/src/Scripting/NasalSys.hxx b/src/Scripting/NasalSys.hxx index b2c569e6a..096a591be 100644 --- a/src/Scripting/NasalSys.hxx +++ b/src/Scripting/NasalSys.hxx @@ -1,13 +1,15 @@ #ifndef __NASALSYS_HXX #define __NASALSYS_HXX -#include -#include +#include // keep before any cppbind include to enable + // SGVec2 conversion. #include +#include #include #include -#include #include +#include +#include // Required only for MSVC #ifdef _MSC_VER @@ -21,11 +23,12 @@ class FGNasalScript; class FGNasalListener; class SGCondition; class FGNasalModelData; +class NasalCommand; +class FGNasalModuleListener; namespace simgear { class BufferedLogCallback; } SGPropertyNode* ghostToPropNode(naRef ref); -SGCondition* conditionGhost(naRef r); class FGNasalSys : public SGSubsystem { @@ -33,6 +36,8 @@ public: FGNasalSys(); virtual ~FGNasalSys(); virtual void init(); + virtual void shutdown(); + virtual void update(double dt); // Loads a nasal script from an external file and inserts it as a @@ -84,6 +89,9 @@ public: void deleteModule(const char* moduleName); + void addCommand(naRef func, const std::string& name); + void removeCommand(const std::string& name); + /** * Set member of specified hash to given value */ @@ -95,8 +103,10 @@ public: void globalsSet(const char* key, naRef val); naRef call(naRef code, int argc, naRef* args, naRef locals); + naRef callWithContext(naContext ctx, naRef code, int argc, naRef* args, naRef locals); naRef callMethod(naRef code, naRef self, int argc, naRef* args, naRef locals); + naRef callMethodWithContext(naContext ctx, naRef code, naRef self, int argc, naRef* args, naRef locals); naRef propNodeGhost(SGPropertyNode* handle); @@ -106,9 +116,6 @@ public: // can't call this 'globals' due to naming clash naRef nasalGlobals() const { return _globals; } - - naContext context() const - { return _context; } nasal::Hash getGlobals() const { return nasal::Hash(_globals, _context); } @@ -121,7 +128,21 @@ public: // when done. int gcSave(naRef r); void gcRelease(int key); - + + /** + * Check if IOrules correctly work to limit access from Nasal scripts to the + * file system. + * + * @note Just a simple test is performed to check if access to a path is + * possible which should never be possible (The actual path refers to + * a file/folder named 'do-not-access' in the file system root). + * + * @see http://wiki.flightgear.org/IOrules + * + * @return Whether the check was successful. + */ + bool checkIOrules(); + /// retrive the associated log object, for displaying log /// output somewhere (a UI, presumably) simgear::BufferedLogCallback* log() const @@ -134,6 +155,11 @@ private: SGLockedQueue > _loadList; SGLockedQueue > _unloadList; + // Delay removing items of the _loadList to ensure the are already attached + // to the scene graph (eg. enables to retrieve world position in load + // callback). + bool _delay_load; + // // FGTimer subclass for handling Nasal timer callbacks. // See the implementation of the settimer() extension function for @@ -151,27 +177,31 @@ private: std::map _listener; std::vector _dead_listener; + std::vector _moduleListeners; + static int _listenerId; void loadPropertyScripts(); void loadPropertyScripts(SGPropertyNode* n); void loadScriptDirectory(simgear::Dir nasalDir); void addModule(std::string moduleName, simgear::PathList scripts); - void logError(naContext); - naRef parse(const char* filename, const char* buf, int len); + static void logError(naContext); + naRef parse(naContext ctx, const char* filename, const char* buf, int len); naRef genPropsModule(); + bool _inited; naContext _context; naRef _globals, _string; SGPropertyNode_ptr _cmdArg; - int _nextGCKey; - naRef _gcHash; - int _callCount; - simgear::BufferedLogCallback* _log; + + typedef std::map NasalCommandDict; + NasalCommandDict _commands; + + naRef _wrappedNodeFunc; public: void handleTimer(NasalTimer* t); };