Pyrogenesis  13997
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
ScriptingHost.h
Go to the documentation of this file.
1 /* Copyright (C) 2009 Wildfire Games.
2  * This file is part of 0 A.D.
3  *
4  * 0 A.D. is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * 0 A.D. is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with 0 A.D. If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 
19 #ifndef INCLUDED_SCRIPTINGHOST
20 #define INCLUDED_SCRIPTINGHOST
21 
22 #include "ps/Errors.h"
23 
24 ERROR_GROUP(Scripting);
25 ERROR_TYPE(Scripting, SetupFailed);
26 
27 ERROR_SUBGROUP(Scripting, LoadFile);
28 ERROR_TYPE(Scripting_LoadFile, OpenFailed);
29 ERROR_TYPE(Scripting_LoadFile, EvalErrors);
30 
31 ERROR_TYPE(Scripting, ConversionFailed);
32 ERROR_TYPE(Scripting, CallFunctionFailed);
33 ERROR_TYPE(Scripting, RegisterFunctionFailed);
34 ERROR_TYPE(Scripting, DefineConstantFailed);
35 ERROR_TYPE(Scripting, CreateObjectFailed);
36 ERROR_TYPE(Scripting, TypeDoesNotExist);
37 
38 ERROR_SUBGROUP(Scripting, DefineType);
39 ERROR_TYPE(Scripting_DefineType, AlreadyExists);
40 ERROR_TYPE(Scripting_DefineType, CreationFailed);
41 
42 #include "scripting/SpiderMonkey.h"
43 #include "lib/file/vfs/vfs_path.h"
44 
45 #include <string>
46 #include <vector>
47 #include <map>
48 
49 #include "ps/Singleton.h"
50 #include "ps/CStr.h"
51 
52 class ScriptInterface;
53 
55 {
56 };
57 
58 class ScriptingHost : public Singleton < ScriptingHost >
59 {
60 private:
61  class CustomType
62  {
63  public:
64  JSObject * m_Object;
65  JSClass * m_Class;
66  };
67 
68  JSContext * m_Context;
69  JSObject * m_GlobalObject;
70 
71  JSErrorReport m_ErrorReport;
72 
73  std::map < std::string, CustomType > m_CustomObjectTypes;
74 
75  // The long-term plan is to migrate from ScriptingHost to the newer shinier ScriptInterface.
76  // For now, just have a ScriptInterface that hooks onto the ScriptingHost's context so they
77  // can both be used.
79 public:
80 
81  ScriptingHost();
83 
85 
86  static void FinalShutdown();
87 
88  // Helpers:
89 
90  // TODO: Remove one of these
91  inline JSContext *getContext() { return m_Context; }
92  inline JSContext *GetContext() { return m_Context; }
93 
94  inline JSObject* GetGlobalObject() { return m_GlobalObject; }
95 
96  void RunMemScript(const char* script, size_t size, const char* filename = 0, int line = 0, JSObject* globalObject = 0);
97  void RunScript(const VfsPath& filename, JSObject* globalObject = 0);
98 
99 
100  jsval ExecuteScript(const CStrW& script, const CStrW& calledFrom = L"Console", JSObject* contextObject = NULL );
101 
102  void DefineCustomObjectType(JSClass *clasp, JSNative constructor, uintN nargs, JSPropertySpec *ps, JSFunctionSpec *fs, JSPropertySpec *static_ps, JSFunctionSpec *static_fs);
103 
104  JSObject * CreateCustomObject(const std::string & typeName);
105 
106  void SetObjectProperty(JSObject * object, const std::string & propertyName, jsval value);
107  jsval GetObjectProperty(JSObject * object, const std::string & propertyName);
108 
109  void SetObjectProperty_Double(JSObject* object, const char* propertyName, double value);
110  double GetObjectProperty_Double(JSObject* object, const char* propertyName);
111 
112  void SetGlobal(const std::string& globalName, jsval value);
113 
114  CStrW ValueToUCString(const jsval value);
115 };
116 
117 #define g_ScriptingHost ScriptingHost::GetSingleton()
118 
119 #endif
JSObject * CreateCustomObject(const std::string &typeName)
#define ERROR_SUBGROUP(a, b)
Definition: Errors.h:91
static void FinalShutdown()
void SetObjectProperty_Double(JSObject *object, const char *propertyName, double value)
JSContext * getContext()
Definition: ScriptingHost.h:91
void SetObjectProperty(JSObject *object, const std::string &propertyName, jsval value)
JSObject * GetGlobalObject()
Definition: ScriptingHost.h:94
#define ERROR_TYPE(a, b)
Definition: Errors.h:96
jsval GetObjectProperty(JSObject *object, const std::string &propertyName)
#define ERROR_GROUP(a)
Definition: Errors.h:87
void SetGlobal(const std::string &globalName, jsval value)
Definition: path.h:75
void RunScript(const VfsPath &filename, JSObject *globalObject=0)
std::map< std::string, CustomType > m_CustomObjectTypes
Definition: ScriptingHost.h:73
JSContext * m_Context
Definition: ScriptingHost.h:68
void RunMemScript(const char *script, size_t size, const char *filename=0, int line=0, JSObject *globalObject=0)
ScriptInterface & GetScriptInterface()
double GetObjectProperty_Double(JSObject *object, const char *propertyName)
JSContext * GetContext()
Definition: ScriptingHost.h:92
CStrW ValueToUCString(const jsval value)
ScriptInterface * m_ScriptInterface
Definition: ScriptingHost.h:78
JSErrorReport m_ErrorReport
Definition: ScriptingHost.h:71
Abstraction around a SpiderMonkey JSContext.
jsval ExecuteScript(const CStrW &script, const CStrW &calledFrom=L"Console", JSObject *contextObject=NULL)
void DefineCustomObjectType(JSClass *clasp, JSNative constructor, uintN nargs, JSPropertySpec *ps, JSFunctionSpec *fs, JSPropertySpec *static_ps, JSFunctionSpec *static_fs)
JSObject * m_GlobalObject
Definition: ScriptingHost.h:69