source: trunk/FACT++/src/InterpreterV8.h@ 16879

Last change on this file since 16879 was 16802, checked in by tbretz, 11 years ago
Allow arguments to be given to the interrupt handler and added a possibility to trigger an interrupt also from within the script; some modification to the way code is executed so that return values are only printed really when some code is finished from the command line, but not for include or when the main program is run.
File size: 13.1 KB
Line 
1#ifndef FACT_InterpreterV8
2#define FACT_InterpreterV8
3
4#include <map>
5#include <set>
6#include <list>
7#include <string>
8#include <thread>
9
10#ifdef HAVE_V8
11#include <v8.h>
12#endif
13
14#include "State.h"
15#include "Service.h"
16#include "Description.h"
17#include "EventImp.h"
18
19class Database;
20
21#ifdef HAVE_NOVA
22struct ln_rst_time;
23#endif
24
25class InterpreterV8
26{
27 static InterpreterV8 *This;
28
29 // The main thread id, needed to be able to terminate
30 // the thread forcefully from 'the outside'
31 int fThreadId;
32 std::set<int> fThreadIds;
33
34 // A loookup table which allows to indentify the
35 // the JavaScript object corrsponding to the
36 // service name (for checking of an .onchange
37 // subscription exists for that object)
38 std::map<std::string, v8::Persistent<v8::Object>> fReverseMap;
39
40 // Lookup table for the callbacks in cases of state changes
41 std::map<std::string, v8::Persistent<v8::Object>> fStateCallbacks;
42
43 // List of all threads
44 std::vector<std::thread> fThreads;
45
46 // List of all states already set
47 std::vector<std::pair<int, std::string>> fStates;
48
49 // Interrupt handler
50 v8::Persistent<v8::Object> fInterruptCallback;
51
52 static v8::Handle<v8::FunctionTemplate> fTemplateLocal;
53 static v8::Handle<v8::FunctionTemplate> fTemplateSky;
54 static v8::Handle<v8::FunctionTemplate> fTemplateEvent;
55 static v8::Handle<v8::FunctionTemplate> fTemplateDescription;
56
57#ifdef HAVE_SQL
58 std::list<Database*> fDatabases;
59#endif
60
61#ifdef HAVE_V8
62 bool HandleException(v8::TryCatch &try_catch, const char *where);
63 void ExecuteConsole();
64 v8::Handle<v8::Value> ExecuteCode(const std::string &code, const std::string &file="internal");
65 v8::Handle<v8::Value> ExecuteInternal(const std::string &code);
66
67 void Thread(int &id, v8::Persistent<v8::Object> _this, v8::Persistent<v8::Function> func, uint32_t ms);
68
69 std::vector<std::string> ValueToArray(const v8::Handle<v8::Value> &val, bool only=true);
70
71 v8::Handle<v8::Value> FuncWait(const v8::Arguments& args);
72 v8::Handle<v8::Value> FuncSend(const v8::Arguments& args);
73 v8::Handle<v8::Value> FuncSleep(const v8::Arguments& args);
74 v8::Handle<v8::Value> FuncTimeout(const v8::Arguments& args);
75 v8::Handle<v8::Value> FuncThread(const v8::Arguments& args);
76 v8::Handle<v8::Value> FuncKill(const v8::Arguments& args);
77 v8::Handle<v8::Value> FuncLog(const v8::Arguments& args);
78 v8::Handle<v8::Value> FuncAlarm(const v8::Arguments& args);
79 v8::Handle<v8::Value> FuncOut(const v8::Arguments& args);
80 v8::Handle<v8::Value> FuncWarn(const v8::Arguments& args);
81 v8::Handle<v8::Value> FuncFile(const v8::Arguments& args);
82 v8::Handle<v8::Value> FuncSendMail(const v8::Arguments& args);
83 v8::Handle<v8::Value> FuncInclude(const v8::Arguments& args);
84 v8::Handle<v8::Value> FuncExit(const v8::Arguments& args);
85 v8::Handle<v8::Value> FuncState(const v8::Arguments& args);
86 v8::Handle<v8::Value> FuncSetState(const v8::Arguments& args);
87 v8::Handle<v8::Value> FuncGetState(const v8::Arguments& args);
88 v8::Handle<v8::Value> FuncGetStates(const v8::Arguments& args);
89 v8::Handle<v8::Value> FuncGetDescription(const v8::Arguments& args);
90 v8::Handle<v8::Value> FuncGetServices(const v8::Arguments& args);
91 v8::Handle<v8::Value> FuncNewState(const v8::Arguments& args);
92 v8::Handle<v8::Value> FuncSetInterrupt(const v8::Arguments& args);
93 v8::Handle<v8::Value> FuncTriggerInterrupt(const v8::Arguments& args);
94 //v8::Handle<v8::Value> FuncOpen(const v8::Arguments& args);
95 v8::Handle<v8::Value> FuncSubscription(const v8::Arguments& args);
96 v8::Handle<v8::Value> FuncGetData(const v8::Arguments &args);
97 v8::Handle<v8::Value> FuncClose(const v8::Arguments &args);
98 v8::Handle<v8::Value> FuncQuery(const v8::Arguments &args);
99 v8::Handle<v8::Value> FuncDatabase(const v8::Arguments &args);
100 v8::Handle<v8::Value> FuncDbQuery(const v8::Arguments &args);
101 v8::Handle<v8::Value> FuncDbClose(const v8::Arguments &args);
102 v8::Handle<v8::Value> OnChangeSet(v8::Local<v8::String>, v8::Local<v8::Value>, const v8::AccessorInfo &);
103
104 static v8::Handle<v8::Value> Constructor(const v8::Arguments &args);
105
106 static v8::Handle<v8::Value> ConstructorMail(const v8::Arguments &args);
107
108#ifdef HAVE_NOVA
109 static double GetDataMember(const v8::Arguments &args, const char *name);
110
111 static v8::Handle<v8::Value> CalcDist(const v8::Arguments &args, const bool);
112
113 static v8::Handle<v8::Value> LocalToString(const v8::Arguments &args);
114 static v8::Handle<v8::Value> SkyToString(const v8::Arguments &args);
115 static v8::Handle<v8::Value> MoonToString(const v8::Arguments &args);
116 static v8::Handle<v8::Value> LocalDist(const v8::Arguments &args);
117 static v8::Handle<v8::Value> SkyDist(const v8::Arguments &args);
118 static v8::Handle<v8::Value> MoonDisk(const v8::Arguments &args);
119 static v8::Handle<v8::Value> LocalToSky(const v8::Arguments &args);
120 static v8::Handle<v8::Value> SkyToLocal(const v8::Arguments &args);
121 static v8::Handle<v8::Value> MoonToLocal(const v8::Arguments &args);
122 static v8::Handle<v8::Value> ConstructorMoon(const v8::Arguments &args);
123 static v8::Handle<v8::Value> ConstructorSky(const v8::Arguments &args);
124 static v8::Handle<v8::Value> ConstructorLocal(const v8::Arguments &args);
125 static v8::Handle<v8::Value> MoonHorizon(const v8::Arguments &args);
126 static v8::Handle<v8::Value> SunHorizon(const v8::Arguments &args);
127 static v8::Handle<v8::Object> ConstructRiseSet(const v8::Handle<v8::Value>, const ln_rst_time &, const bool &);
128#endif
129
130 static v8::Handle<v8::Value> WrapInclude(const v8::Arguments &args) { if (This) return This->FuncInclude(args); else return v8::Undefined(); }
131 static v8::Handle<v8::Value> WrapFile(const v8::Arguments &args) { if (This) return This->FuncFile(args); else return v8::Undefined(); }
132 static v8::Handle<v8::Value> WrapSendMail(const v8::Arguments &args) { if (This) return This->FuncSendMail(args); else return v8::Undefined(); }
133 static v8::Handle<v8::Value> WrapLog(const v8::Arguments &args) { if (This) return This->FuncLog(args); else return v8::Undefined(); }
134 static v8::Handle<v8::Value> WrapAlarm(const v8::Arguments &args) { if (This) return This->FuncAlarm(args); else return v8::Undefined(); }
135 static v8::Handle<v8::Value> WrapOut(const v8::Arguments &args) { if (This) return This->FuncOut(args); else return v8::Undefined(); }
136 static v8::Handle<v8::Value> WrapWarn(const v8::Arguments &args) { if (This) return This->FuncWarn(args); else return v8::Undefined(); }
137 static v8::Handle<v8::Value> WrapWait(const v8::Arguments &args) { if (This) return This->FuncWait(args); else return v8::Undefined(); }
138 static v8::Handle<v8::Value> WrapSend(const v8::Arguments &args) { if (This) return This->FuncSend(args); else return v8::Undefined(); }
139 static v8::Handle<v8::Value> WrapSleep(const v8::Arguments &args) { if (This) return This->FuncSleep(args); else return v8::Undefined(); }
140 static v8::Handle<v8::Value> WrapTimeout(const v8::Arguments &args) { if (This) return This->FuncTimeout(args); else return v8::Undefined(); }
141 static v8::Handle<v8::Value> WrapThread(const v8::Arguments &args) { if (This) return This->FuncThread(args); else return v8::Undefined(); }
142 static v8::Handle<v8::Value> WrapKill(const v8::Arguments &args) { if (This) return This->FuncKill(args); else return v8::Undefined(); }
143 static v8::Handle<v8::Value> WrapExit(const v8::Arguments &args) { if (This) return This->FuncExit(args); else return v8::Undefined(); }
144 static v8::Handle<v8::Value> WrapState(const v8::Arguments &args) { if (This) return This->FuncState(args); else return v8::Undefined(); }
145 static v8::Handle<v8::Value> WrapNewState(const v8::Arguments &args) { if (This) return This->FuncNewState(args); else return v8::Undefined(); }
146 static v8::Handle<v8::Value> WrapSetState(const v8::Arguments &args) { if (This) return This->FuncSetState(args); else return v8::Undefined(); }
147 static v8::Handle<v8::Value> WrapGetState(const v8::Arguments &args) { if (This) return This->FuncGetState(args); else return v8::Undefined(); }
148 static v8::Handle<v8::Value> WrapGetStates(const v8::Arguments &args){ if (This) return This->FuncGetStates(args);else return v8::Undefined(); }
149 static v8::Handle<v8::Value> WrapGetDescription(const v8::Arguments &args){ if (This) return This->FuncGetDescription(args);else return v8::Undefined(); }
150 static v8::Handle<v8::Value> WrapGetServices(const v8::Arguments &args){ if (This) return This->FuncGetServices(args);else return v8::Undefined(); }
151 static v8::Handle<v8::Value> WrapSetInterrupt(const v8::Arguments &args){ if (This) return This->FuncSetInterrupt(args);else return v8::Undefined(); }
152 static v8::Handle<v8::Value> WrapTriggerInterrupt(const v8::Arguments &args){ if (This) return This->FuncTriggerInterrupt(args);else return v8::Undefined(); }
153 //static v8::Handle<v8::Value> WrapOpen(const v8::Arguments &args) { if (This) return This->FuncOpen(args); else return v8::Undefined(); }
154 static v8::Handle<v8::Value> WrapSubscription(const v8::Arguments &args){ if (This) return This->FuncSubscription(args);else return v8::Undefined(); }
155 static v8::Handle<v8::Value> WrapGetData(const v8::Arguments &args) { if (This) return This->FuncGetData(args); else return v8::Undefined(); }
156 static v8::Handle<v8::Value> WrapClose(const v8::Arguments &args) { if (This) return This->FuncClose(args); else return v8::Undefined(); }
157 static v8::Handle<v8::Value> WrapQuery(const v8::Arguments &args) { if (This) return This->FuncQuery(args); else return v8::Undefined(); }
158 static v8::Handle<v8::Value> WrapDatabase(const v8::Arguments &args) { if (This) return This->FuncDatabase(args); else return v8::Undefined(); }
159 static v8::Handle<v8::Value> WrapDbQuery(const v8::Arguments &args) { if (This) return This->FuncDbQuery(args); else return v8::Undefined(); }
160 static v8::Handle<v8::Value> WrapDbClose(const v8::Arguments &args) { if (This) return This->FuncDbClose(args); else return v8::Undefined(); }
161 static v8::Handle<v8::Value> WrapOnChangeSet(v8::Local<v8::String> prop, v8::Local<v8::Value> value, const v8::AccessorInfo &info)
162 {
163 if (This) return This->OnChangeSet(prop, value, info); else return v8::Undefined();
164 }
165
166 static v8::Handle<v8::Value> OnChangeGet(v8::Local<v8::String>, const v8::AccessorInfo &)
167 {
168 return v8::Handle<v8::Value>();
169 }
170
171 static v8::Handle<v8::Value> Convert(char type, const char* &ptr);
172 v8::Handle<v8::Value> ConvertEvent(const EventImp *evt, uint64_t, const char *str);
173#endif
174
175 v8::Handle<v8::Value> HandleInterruptImp(std::string, uint64_t);
176
177public:
178 InterpreterV8();
179 virtual ~InterpreterV8()
180 {
181 This = 0;
182
183#ifdef HAVE_V8
184 v8::Locker locker;
185 v8::V8::Dispose();
186#endif
187 }
188
189 virtual void JsLoad(const std::string & = "");
190 virtual void JsStart(const std::string &) { }
191 virtual void JsEnd(const std::string & = "");
192 virtual void JsPrint(const std::string & = "") { }
193 virtual void JsAlarm(const std::string & = "") { }
194 virtual void JsOut(const std::string &) { }
195 virtual void JsWarn(const std::string &) { }
196 virtual void JsResult(const std::string &) { }
197 virtual void JsException(const std::string &) { }
198 virtual bool JsSend(const std::string &) { return true; }
199 //virtual void JsSleep(uint32_t) { }
200 //virtual int JsWait(const std::string &, int32_t, uint32_t) { return -1; };
201 virtual State JsState(const std::string &) { return State(); };
202 virtual void *JsSubscribe(const std::string &) { return 0; };
203 virtual bool JsUnsubscribe(const std::string &) { return false; };
204
205 virtual bool JsNewState(int, const std::string&, const std::string&) { return false; }
206 virtual bool JsSetState(int) { return false; }
207 virtual bool JsHasState(int) const { return false; }
208 virtual bool JsHasState(const std::string &) const { return false; }
209 virtual int JsGetState(const std::string &) const { return -2; }
210 virtual State JsGetCurrentState() const { return State(); }
211 virtual std::vector<State> JsGetStates(const std::string &) { return std::vector<State>(); }
212 virtual std::set<Service> JsGetServices() { return std::set<Service>(); }
213 virtual std::vector<Description> JsGetDescription(const std::string &) { return std::vector<Description>(); }
214
215 virtual std::vector<Description> JsDescription(const std::string &) { return std::vector<Description>(); };
216 virtual std::pair<uint64_t, EventImp *> JsGetEvent(const std::string &) { return std::make_pair(0, (EventImp*)0); };
217
218 int JsHandleInterrupt(const EventImp &);
219 void JsHandleEvent(const EventImp &, uint64_t, const std::string &);
220 void JsHandleState(const std::string &, const State &);
221
222 void AddFormatToGlobal();
223
224 bool JsRun(const std::string &, const std::map<std::string,std::string> & = std::map<std::string,std::string>());
225 static void JsStop();
226};
227
228#ifndef HAVE_V8
229inline bool InterpreterV8::JsRun(const std::string &, const std::map<std::string,std::string> &) { return false; }
230inline void InterpreterV8::JsStop() { }
231#endif
232
233#endif
Note: See TracBrowser for help on using the repository browser.