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

Last change on this file since 15077 was 15073, checked in by tbretz, 12 years ago
Implemented v8::timeout and let dim.getDescription return an object of type Description; some improvements to the exception handling of the java console, which ensures that (hopefully) all exceptions are handled and printed and that all of them are catched before the next execution; make sure that all threads are stopped before the return to the command line prompt; made the bahaviour of dim.wait more intuitive; fixed a bug which caused the thread-ids to be not correctly removed from the list after a thread terminated
File size: 11.8 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 static v8::Handle<v8::FunctionTemplate> fTemplateLocal;
50 static v8::Handle<v8::FunctionTemplate> fTemplateSky;
51 static v8::Handle<v8::FunctionTemplate> fTemplateEvent;
52 static v8::Handle<v8::FunctionTemplate> fTemplateDescription;
53
54#ifdef HAVE_SQL
55 std::list<Database*> fDatabases;
56#endif
57
58#ifdef HAVE_V8
59 bool HandleException(v8::TryCatch &try_catch, const char *where);
60 bool ExecuteFile(const std::string &name, bool main=false);
61 bool ExecuteConsole();
62 v8::Handle<v8::Value> ExecuteCode(const std::string &code, const std::string &file="internal", bool main=false);
63 v8::Handle<v8::Value> ExecuteInternal(const std::string &code);
64
65 void Thread(int &id, v8::Persistent<v8::Function> func, uint32_t ms);
66
67 v8::Handle<v8::Value> FuncWait(const v8::Arguments& args);
68 v8::Handle<v8::Value> FuncSend(const v8::Arguments& args);
69 v8::Handle<v8::Value> FuncSleep(const v8::Arguments& args);
70 v8::Handle<v8::Value> FuncTimeout(const v8::Arguments& args);
71 v8::Handle<v8::Value> FuncThread(const v8::Arguments& args);
72 v8::Handle<v8::Value> FuncKill(const v8::Arguments& args);
73 v8::Handle<v8::Value> FuncLog(const v8::Arguments& args);
74 v8::Handle<v8::Value> FuncAlarm(const v8::Arguments& args);
75 v8::Handle<v8::Value> FuncOut(const v8::Arguments& args);
76 v8::Handle<v8::Value> FuncFile(const v8::Arguments& args);
77 v8::Handle<v8::Value> FuncInclude(const v8::Arguments& args);
78 v8::Handle<v8::Value> FuncExit(const v8::Arguments& args);
79 v8::Handle<v8::Value> FuncState(const v8::Arguments& args);
80 v8::Handle<v8::Value> FuncSetState(const v8::Arguments& args);
81 v8::Handle<v8::Value> FuncGetState(const v8::Arguments& args);
82 v8::Handle<v8::Value> FuncGetStates(const v8::Arguments& args);
83 v8::Handle<v8::Value> FuncGetDescription(const v8::Arguments& args);
84 v8::Handle<v8::Value> FuncGetServices(const v8::Arguments& args);
85 v8::Handle<v8::Value> FuncNewState(const v8::Arguments& args);
86 //v8::Handle<v8::Value> FuncOpen(const v8::Arguments& args);
87 v8::Handle<v8::Value> FuncSubscription(const v8::Arguments& args);
88 v8::Handle<v8::Value> FuncGetData(const v8::Arguments &args);
89 v8::Handle<v8::Value> FuncClose(const v8::Arguments &args);
90 v8::Handle<v8::Value> FuncQuery(const v8::Arguments &args);
91 v8::Handle<v8::Value> FuncDatabase(const v8::Arguments &args);
92 v8::Handle<v8::Value> FuncDbQuery(const v8::Arguments &args);
93 v8::Handle<v8::Value> FuncDbClose(const v8::Arguments &args);
94 v8::Handle<v8::Value> OnChangeSet(v8::Local<v8::String>, v8::Local<v8::Value>, const v8::AccessorInfo &);
95
96 static v8::Handle<v8::Value> Constructor(const v8::Arguments &args);
97
98#ifdef HAVE_NOVA
99 static double GetDataMember(const v8::Arguments &args, const char *name);
100
101 static v8::Handle<v8::Value> CalcDist(const v8::Arguments &args, const bool);
102
103 static v8::Handle<v8::Value> LocalToString(const v8::Arguments &args);
104 static v8::Handle<v8::Value> SkyToString(const v8::Arguments &args);
105 static v8::Handle<v8::Value> MoonToString(const v8::Arguments &args);
106 static v8::Handle<v8::Value> LocalDist(const v8::Arguments &args);
107 static v8::Handle<v8::Value> SkyDist(const v8::Arguments &args);
108 static v8::Handle<v8::Value> MoonDisk(const v8::Arguments &args);
109 static v8::Handle<v8::Value> LocalToSky(const v8::Arguments &args);
110 static v8::Handle<v8::Value> SkyToLocal(const v8::Arguments &args);
111 static v8::Handle<v8::Value> MoonToLocal(const v8::Arguments &args);
112 static v8::Handle<v8::Value> ConstructorMoon(const v8::Arguments &args);
113 static v8::Handle<v8::Value> ConstructorSky(const v8::Arguments &args);
114 static v8::Handle<v8::Value> ConstructorLocal(const v8::Arguments &args);
115 static v8::Handle<v8::Value> MoonHorizon(const v8::Arguments &args);
116 static v8::Handle<v8::Value> SunHorizon(const v8::Arguments &args);
117 static v8::Handle<v8::Object> ConstructRiseSet(const v8::Handle<v8::Value>, const ln_rst_time &, const bool &);
118#endif
119
120 static v8::Handle<v8::Value> WrapInclude(const v8::Arguments &args) { if (This) return This->FuncInclude(args); else return v8::Undefined(); }
121 static v8::Handle<v8::Value> WrapFile(const v8::Arguments &args) { if (This) return This->FuncFile(args); else return v8::Undefined(); }
122 static v8::Handle<v8::Value> WrapLog(const v8::Arguments &args) { if (This) return This->FuncLog(args); else return v8::Undefined(); }
123 static v8::Handle<v8::Value> WrapAlarm(const v8::Arguments &args) { if (This) return This->FuncAlarm(args); else return v8::Undefined(); }
124 static v8::Handle<v8::Value> WrapOut(const v8::Arguments &args) { if (This) return This->FuncOut(args); else return v8::Undefined(); }
125 static v8::Handle<v8::Value> WrapWait(const v8::Arguments &args) { if (This) return This->FuncWait(args); else return v8::Undefined(); }
126 static v8::Handle<v8::Value> WrapSend(const v8::Arguments &args) { if (This) return This->FuncSend(args); else return v8::Undefined(); }
127 static v8::Handle<v8::Value> WrapSleep(const v8::Arguments &args) { if (This) return This->FuncSleep(args); else return v8::Undefined(); }
128 static v8::Handle<v8::Value> WrapTimeout(const v8::Arguments &args) { if (This) return This->FuncTimeout(args); else return v8::Undefined(); }
129 static v8::Handle<v8::Value> WrapThread(const v8::Arguments &args) { if (This) return This->FuncThread(args); else return v8::Undefined(); }
130 static v8::Handle<v8::Value> WrapKill(const v8::Arguments &args) { if (This) return This->FuncKill(args); else return v8::Undefined(); }
131 static v8::Handle<v8::Value> WrapExit(const v8::Arguments &args) { if (This) return This->FuncExit(args); else return v8::Undefined(); }
132 static v8::Handle<v8::Value> WrapState(const v8::Arguments &args) { if (This) return This->FuncState(args); else return v8::Undefined(); }
133 static v8::Handle<v8::Value> WrapNewState(const v8::Arguments &args) { if (This) return This->FuncNewState(args); else return v8::Undefined(); }
134 static v8::Handle<v8::Value> WrapSetState(const v8::Arguments &args) { if (This) return This->FuncSetState(args); else return v8::Undefined(); }
135 static v8::Handle<v8::Value> WrapGetState(const v8::Arguments &args) { if (This) return This->FuncGetState(args); else return v8::Undefined(); }
136 static v8::Handle<v8::Value> WrapGetStates(const v8::Arguments &args){ if (This) return This->FuncGetStates(args);else return v8::Undefined(); }
137 static v8::Handle<v8::Value> WrapGetDescription(const v8::Arguments &args){ if (This) return This->FuncGetDescription(args);else return v8::Undefined(); }
138 static v8::Handle<v8::Value> WrapGetServices(const v8::Arguments &args){ if (This) return This->FuncGetServices(args);else return v8::Undefined(); }
139 //static v8::Handle<v8::Value> WrapOpen(const v8::Arguments &args) { if (This) return This->FuncOpen(args); else return v8::Undefined(); }
140 static v8::Handle<v8::Value> WrapSubscription(const v8::Arguments &args){ if (This) return This->FuncSubscription(args);else return v8::Undefined(); }
141 static v8::Handle<v8::Value> WrapGetData(const v8::Arguments &args) { if (This) return This->FuncGetData(args); else return v8::Undefined(); }
142 static v8::Handle<v8::Value> WrapClose(const v8::Arguments &args) { if (This) return This->FuncClose(args); else return v8::Undefined(); }
143 static v8::Handle<v8::Value> WrapQuery(const v8::Arguments &args) { if (This) return This->FuncQuery(args); else return v8::Undefined(); }
144 static v8::Handle<v8::Value> WrapDatabase(const v8::Arguments &args) { if (This) return This->FuncDatabase(args); else return v8::Undefined(); }
145 static v8::Handle<v8::Value> WrapDbQuery(const v8::Arguments &args) { if (This) return This->FuncDbQuery(args); else return v8::Undefined(); }
146 static v8::Handle<v8::Value> WrapDbClose(const v8::Arguments &args) { if (This) return This->FuncDbClose(args); else return v8::Undefined(); }
147 static v8::Handle<v8::Value> WrapOnChangeSet(v8::Local<v8::String> prop, v8::Local<v8::Value> value, const v8::AccessorInfo &info)
148 {
149 if (This) return This->OnChangeSet(prop, value, info); else return v8::Undefined();
150 }
151
152 static v8::Handle<v8::Value> OnChangeGet(v8::Local<v8::String>, const v8::AccessorInfo &)
153 {
154 return v8::Handle<v8::Value>();
155 }
156
157 static v8::Handle<v8::Value> Convert(char type, const char* &ptr);
158 v8::Handle<v8::Value> ConvertEvent(const EventImp *evt, uint64_t, const char *str);
159#endif
160
161public:
162 InterpreterV8();
163 virtual ~InterpreterV8()
164 {
165 This = 0;
166
167#ifdef HAVE_V8
168 v8::Locker locker;
169 v8::V8::Dispose();
170#endif
171 }
172
173 virtual void JsLoad(const std::string &) { }
174 virtual void JsStart(const std::string &) { }
175 virtual void JsEnd(const std::string &) { }
176 virtual void JsPrint(const std::string &) { }
177 virtual void JsAlarm(const std::string & = "") { }
178 virtual void JsOut(const std::string &) { }
179 virtual void JsResult(const std::string &) { }
180 virtual void JsException(const std::string &) { }
181 virtual bool JsSend(const std::string &) { return true; }
182 //virtual void JsSleep(uint32_t) { }
183 //virtual int JsWait(const std::string &, int32_t, uint32_t) { return -1; };
184 virtual State JsState(const std::string &) { return State(); };
185 virtual void *JsSubscribe(const std::string &) { return 0; };
186 virtual bool JsUnsubscribe(const std::string &) { return false; };
187
188 virtual bool JsNewState(int, const std::string&, const std::string&) { return false; }
189 virtual bool JsSetState(int) { return false; }
190 virtual bool JsHasState(int) const { return false; }
191 virtual bool JsHasState(const std::string &) const { return false; }
192 virtual int JsGetState(const std::string &) const { return -2; }
193 virtual State JsGetCurrentState() const { return State(); }
194 virtual std::vector<State> JsGetStates(const std::string &) { return std::vector<State>(); }
195 virtual std::set<Service> JsGetServices() { return std::set<Service>(); }
196 virtual std::vector<Description> JsGetDescription(const std::string &) { return std::vector<Description>(); }
197
198 virtual std::vector<Description> JsDescription(const std::string &) { return std::vector<Description>(); };
199 virtual std::pair<uint64_t, EventImp *> JsGetEvent(const std::string &) { return std::make_pair(0, (EventImp*)0); };
200
201 void JsHandleEvent(const EventImp &, uint64_t, const std::string &);
202 void JsHandleState(const std::string &, const State &);
203
204 void AddFormatToGlobal();
205
206 bool JsRun(const std::string &, const std::map<std::string,std::string> & = std::map<std::string,std::string>());
207 static void JsStop();
208};
209
210#ifndef HAVE_V8
211inline bool InterpreterV8::JsRun(const std::string &, const std::map<std::string,std::string> &) { return false; }
212inline void InterpreterV8::JsStop() { }
213#endif
214
215#endif
Note: See TracBrowser for help on using the repository browser.