home *** CD-ROM | disk | FTP | other *** search
/ Hackers Magazine 57 / CdHackersMagazineNr57.iso / Software / Multimedia / k3d-setup-0.7.11.0.exe / include / k3d / k3dsdk / iscript_engine.h < prev    next >
Encoding:
C/C++ Source or Header  |  2009-03-12  |  5.3 KB  |  114 lines

  1. #ifndef K3DSDK_ISCRIPT_ENGINE_H
  2. #define K3DSDK_ISCRIPT_ENGINE_H
  3.  
  4. // K-3D
  5. // Copyright (c) 1995-2008, Timothy M. Shead
  6. //
  7. // Contact: tshead@k-3d.com
  8. //
  9. // This program is free software; you can redistribute it and/or
  10. // modify it under the terms of the GNU General Public
  11. // License as published by the Free Software Foundation; either
  12. // version 2 of the License, or (at your option) any later version.
  13. //
  14. // This program is distributed in the hope that it will be useful,
  15. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  17. // General Public License for more details.
  18. //
  19. // You should have received a copy of the GNU General Public
  20. // License along with this program; if not, write to the Free Software
  21. // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  22.  
  23. /** \file
  24.     \author Tim Shead (tshead@k-3d.com)
  25. */
  26.  
  27. #include "iunknown.h"
  28. #include "signal_system.h"
  29. #include "types.h"
  30.  
  31. #include <boost/any.hpp>
  32. #include <iosfwd>
  33. #include <map>
  34. #include <string>
  35.  
  36. namespace k3d
  37. {
  38.  
  39. class icommand_node;
  40. class iplugin_factory;
  41.  
  42. /// Abstract interface implemented by objects that can execute scripts written in a specific scripting language
  43. /** \note: The Script arguments to execute() have bounced back-and-forth between
  44.  * string and stream representations several times.  The original rationale for making them streams was
  45.  * to avoid having to buffer the source code to a script in memory; the new rationale for making them strings
  46.  * is that in practice you always end-up having to buffer the source code anyway, for one of two reasons:
  47.  * first, very few script APIs are likely to support C++ streams
  48.  * C++ streams, so we will likely have to buffer the source before using it anyway; second, determining
  49.  * the MIME type of a script and calling execute() in sequence (the most common use-case) requires random access to the source stream,
  50.  * which isn't available for compressed streams or socket-based streams.
  51. */
  52.  
  53. class iscript_engine :
  54.     public virtual iunknown
  55. {
  56. public:
  57.     virtual ~iscript_engine() {}
  58.  
  59.     /// Returns a reference to the factory that created this object
  60.     virtual iplugin_factory& factory() = 0;
  61.     /**    \brief Returns the human-readable name of the scripting language this engine implements
  62.     */
  63.     virtual const string_t language() = 0;
  64.  
  65.     /// Defines a collection of named objects to pass to a script that define its context (its execution environment) - how they are used is implementation-dependent (note that the names are merely suggestions, and may be changed or ignored at the whim of the implementation)
  66.     typedef std::map<string_t, boost::any> context_t;
  67.     /// Defines a slot that can be called to redirect script output.
  68.     typedef sigc::slot<void, const string_t&> output_t;
  69.  
  70.     /**    \brief Executes a script
  71.         \param ScriptName A human readable identifier for the script, which should be used in error messages, etc.
  72.         \param Script The complete source code of the script to be executed
  73.         \param Context Collection of objects that define the context/execution environment of the script -  how they are used is implementation-dependent.  Note that the script engine may alter context objects before returning.
  74.         \param Stdout Optional slot that will be called with script output.
  75.         \param Stderr Optional slot that will be called with script output.
  76.         \return true, iff the script was successfully executed without errors (either syntax or runtime)
  77.     */
  78.     virtual bool_t execute(const string_t& ScriptName, const string_t& Script, context_t& Context, output_t* Stdout = 0, output_t* Stderr = 0) = 0;
  79.  
  80.     /**    \brief Requests a cancellation of all running scripts.
  81.         \return true, iff script cancellation is supported by this engine.
  82.         \note Cancellation may be asynchronous, i.e. scripts may still be running when the call returns, and may continue to run for an indefinite period before shutting down, if at all.
  83.     */
  84.     virtual bool_t halt() = 0;
  85.  
  86.     /**    \brief Writes a token to a script stream so that it can be recognized by this engine
  87.     */
  88.     virtual void bless_script(std::ostream& Script) = 0;
  89.  
  90.     /**    \brief Appends the given text to a script as a comment that will be ignored by this engine
  91.         \param Comment A string to be appended to the script as a comment
  92.         \note The comment may be single- or multi-line, and can contain any text.  The engine is responsible for ensuring that the comment text does not introduce syntactically-incorrect code.
  93.     */
  94.     virtual void append_comment(std::ostream& Script, const string_t& Comment) = 0;
  95.  
  96.     /** Converts a command-node command into source code appropriate to this language and adds it to the given script
  97.         \param CommandNode The command node executing the command to be appended
  98.         \param Command The name of the command to be appended
  99.         \param Arguments The command arguments to be appended
  100.         \note The engine is responsible for ensuring that the appended command does not introduce syntactically-incorrect code, e.g. quoting issues or escaped characters with special meanings.
  101.     */
  102.     virtual void append_command(std::ostream& Script, icommand_node& CommandNode, const string_t& Command, const string_t& Arguments) = 0;
  103.  
  104. protected:
  105.     iscript_engine() {}
  106.     iscript_engine(const iscript_engine& RHS) {}
  107.     iscript_engine& operator = (const iscript_engine& RHS) { return *this; }
  108. };
  109.  
  110. } // namespace k3d
  111.  
  112. #endif // !K3DSDK_ISCRIPT_ENGINE_H
  113.  
  114.