/* ============================================================================== This file is part of the JUCETICE project - Copyright 2009 by Lucio Asnaghi. JUCETICE is based around the JUCE library - "Jules' Utility Class Extensions" Copyright 2007 by Julian Storer. ------------------------------------------------------------------------------ JUCE and JUCETICE can be redistributed and/or modified under the terms of the GNU General Public License, as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. JUCE and JUCETICE are distributed in the hope that they will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with JUCE and JUCETICE; if not, visit www.gnu.org/licenses or write to Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ============================================================================== */ #ifndef __JUCETICE_SCRIPTABLEENGINE_HEADER__ #define __JUCETICE_SCRIPTABLEENGINE_HEADER__ #if JUCE_SUPPORT_SCRIPTING //============================================================================== /** Manages a script to access functionality of juce @see angelscript */ class ScriptableEngine { public: //============================================================================== enum EngineStatus { Invalid = 0, Ready = 1, Compiled = 2, Running = 3, Paused = 4 }; //============================================================================== /** Creates a script engine. */ ScriptableEngine(); /** Destructor. */ virtual ~ScriptableEngine(); //============================================================================== /** Executes a current script */ virtual void executeScript (const String& script); /** */ virtual bool compileScript (const String& scriptCode); /** */ virtual void executeFunction (const String& functionName); /** Prints an error reported by the engine When the engine encounter an error compiling or at runtime, it will trigger this function. Obviously you can override this in order to allow your specific engine to explicitly ignore errors, or to redirect error reporting to a GUI component, a message box or whatever your application needs. */ virtual void printErrorMessage (const String& type, const String& message, const String& section, const int lineNumber); //============================================================================== /** Return the current engine */ void* getCurrentEngine () const { return engine; } protected: //============================================================================== /** Initialise the engine Must be called before trying to do anything to the engine itself, and if this returns false, then it will be impossible to use the engine itself. */ virtual void initialise (); /** Shutdown the engine Should be called automatically when the object goes out of scope, but can be called if you need to manually free any engine and scripts allocated. */ virtual void shutdown (); //============================================================================== void* engine; EngineStatus status; }; #if 0 #include "../juce_core/text/juce_XmlDocument.h" #include "../juce_core/threads/juce_Thread.h" #include "../juce_core/io/files/juce_DirectoryIterator.h" #include "../juce_appframework/events/juce_ChangeBroadcaster.h" #include "../juce_appframework/audio/midi/juce_MidiKeyboardState.h" #include "../juce_appframework/audio/processors/juce_AudioProcessor.h" #include "containers/jucetice_LockFreeFifo.h" class ScriptableEngine; class asIScriptEngine; class asIScriptContext; //============================================================================== /** Manages a script to access functionality of juce @see angelscript */ class ScriptableEngine { public: //============================================================================== /** Creates a script engine. */ ScriptableEngine(); /** Destructor. */ virtual ~ScriptableEngine(); //============================================================================== void setDefaultContextStackSize (const int initialSize, const int maxSize); //============================================================================== /** Registers a global property to be used in the script This function is actually used in the main application to publish app managed objects and variables to the script sections. @param declaration this is the declaration of the variable, usually something like "Object obj" @param object this is a void pointer to the object the application is publishing */ void registerGlobalProperty (const String& declaration, void* object); //============================================================================== /** Add a script section to the engine You can add any number of script sections you need, but u have to name them with different identifier. This also compile the script that u added @param strScript this is the script code as string @param strSection this is the name of the section you are compiling since more session are allowed, you have to make different names for different sections */ bool compileScript (const String& strScript, const String& strSection = "main" // ,const String& strModule = 0, ); //============================================================================== /** This check for a function defined in the script and execute it in the context we have created Actually this support only one context at time @param strFunction this is the declaration of the function you would like to execute */ bool executeFunction (const String& strFunction // ,const String& strModule = 0, ); /** This execute a string of code @param strScript this is the script you want to execute */ bool executeString (const String& strScript); //============================================================================== /** This abort the current running context Actually this is only useful in debug mode */ void abortExecution (); /** This let continue execution if in debug mode Actually this is only useful in debug mode */ void continueExecution (); //============================================================================== /** This lets you add directory to the resolve path when looking for files to include or a plugin library to load */ void addResolveFilePath (const File& directoryToLookInto); /** This lets you remove a previously added directory to the resolve path */ void removeResolveFilePath (const File& directoryToLookInto); /** This lets you try to locate a file in the resolve paths, useful for trying to locate add directory to the resolve path when looking for files to include or a plugin library to load */ File findResolveFilePaths (const String& fileName); //============================================================================== /** Passing a function identifier it returns the declaration */ String resolveFunctionDeclaration (const int functionID); //============================================================================== void setEngineModel (ScriptableEngineModel* modelToNotify) { engineModel = modelToNotify; } //============================================================================== /**@internal*/ asIScriptEngine* getEngine() const { return engine; } /**@internal*/ void resetEngine (); /**@internal*/ asIScriptContext* createContext(); /**@internal*/ bool executeContext (asIScriptContext* context); /**@internal*/ String serializeVariable (asIScriptContext* ctx, const int i); protected: //============================================================================== /** Use this to do some jobs before script sections compilation */ virtual void preCompileCallback () {} /** Used in debugging mode to do some jobs every line of the script */ virtual void debugLineCallback (asIScriptContext* context) {} //============================================================================== /** Use this to set your specific report when the compiler gets messed up. Here you could write to a Log file or use the AlertWindow to report errors to user. */ virtual void reportErrors (const String& errorType, const String& errorString, const String& fileName, const int lineNumber) {} //============================================================================== /** Use this to output lines from plugins in a IDE output section. This is useful when u want the user defined plugins to be able to interact with the ide directly, outputting strings in the text editor debugger. */ virtual void reportOutput (const String& message, const int appendMode) {} StringArray resolvePaths; int timeOut; bool debugMode; bool warningsOn; bool preprocessFailed; bool compileFailed; bool runningScript; bool abortScript; bool continueSilently; // @TODO - change this to step to next breakpoint asIScriptEngine *engine; void* outStream; }; #endif #endif // JUCE_SUPPORT_SCRIPTING #endif // __JUCETICE_SCRIPTABLEENGINE_HEADER__