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

Last change on this file since 14705 was 14690, checked in by tbretz, 12 years ago
Bettr support for circumpolar objects added 'isUp' proprty to th object returned by th horizon functions.
File size: 10.4 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 "Description.h"
16#include "EventImp.h"
17
18class Database;
19
20#ifdef HAVE_NOVA
21struct ln_rst_time;
22#endif
23
24class InterpreterV8
25{
26 static InterpreterV8 *This;
27
28 // The main thread id, needed to be able to terminate
29 // the thread forcefully from 'the outside'
30 int fThreadId;
31 std::set<int> fThreadIds;
32
33 // A loookup table which allows to indentify the
34 // the JavaScript object corrsponding to the
35 // service name (for checking of an .onchange
36 // subscription exists for that object)
37 std::map<std::string, v8::Persistent<v8::Object>> fReverseMap;
38
39 // Lookup table for the callbacks in cases of state changes
40 std::map<std::string, v8::Persistent<v8::Object>> fStateCallbacks;
41
42 // List of all threads
43 std::vector<std::thread> fThreads;
44
45 // List of all states already set
46 std::vector<std::pair<int, std::string>> fStates;
47
48 static v8::Handle<v8::FunctionTemplate> fTemplateLocal;
49 static v8::Handle<v8::FunctionTemplate> fTemplateSky;
50 static v8::Handle<v8::FunctionTemplate> fTemplateEvent;
51
52#ifdef HAVE_SQL
53 std::list<Database*> fDatabases;
54#endif
55
56#ifdef HAVE_V8
57 bool HandleException(v8::TryCatch &try_catch, const char *where);
58 bool ExecuteFile(const std::string &name, bool main=false);
59 v8::Handle<v8::Value> ExecuteCode(const std::string &code, const std::string &file="internal", bool main=false);
60 v8::Handle<v8::Value> ExecuteInternal(const std::string &code);
61
62 void Thread(int &id, v8::Persistent<v8::Function> func, uint32_t ms);
63
64 v8::Handle<v8::Value> FuncWait(const v8::Arguments& args);
65 v8::Handle<v8::Value> FuncSend(const v8::Arguments& args);
66 v8::Handle<v8::Value> FuncSleep(const v8::Arguments& args);
67 v8::Handle<v8::Value> FuncThread(const v8::Arguments& args);
68 v8::Handle<v8::Value> FuncKill(const v8::Arguments& args);
69 v8::Handle<v8::Value> FuncPrint(const v8::Arguments& args);
70 v8::Handle<v8::Value> FuncAlarm(const v8::Arguments& args);
71 v8::Handle<v8::Value> FuncOut(const v8::Arguments& args);
72 v8::Handle<v8::Value> FuncFile(const v8::Arguments& args);
73 v8::Handle<v8::Value> FuncInclude(const v8::Arguments& args);
74 v8::Handle<v8::Value> FuncExit(const v8::Arguments& args);
75 v8::Handle<v8::Value> FuncState(const v8::Arguments& args);
76 v8::Handle<v8::Value> FuncSetState(const v8::Arguments& args);
77 v8::Handle<v8::Value> FuncGetState(const v8::Arguments& args);
78 v8::Handle<v8::Value> FuncNewState(const v8::Arguments& args);
79 //v8::Handle<v8::Value> FuncOpen(const v8::Arguments& args);
80 v8::Handle<v8::Value> FuncSubscription(const v8::Arguments& args);
81 v8::Handle<v8::Value> FuncGetData(const v8::Arguments &args);
82 v8::Handle<v8::Value> FuncClose(const v8::Arguments &args);
83 v8::Handle<v8::Value> FuncQuery(const v8::Arguments &args);
84 v8::Handle<v8::Value> FuncDatabase(const v8::Arguments &args);
85 v8::Handle<v8::Value> FuncDbQuery(const v8::Arguments &args);
86 v8::Handle<v8::Value> FuncDbClose(const v8::Arguments &args);
87 v8::Handle<v8::Value> OnChangeSet(v8::Local<v8::String>, v8::Local<v8::Value>, const v8::AccessorInfo &);
88
89 static v8::Handle<v8::Value> Constructor(const v8::Arguments &args);
90
91#ifdef HAVE_NOVA
92 static double GetDataMember(const v8::Arguments &args, const char *name);
93
94 static v8::Handle<v8::Value> LocalToString(const v8::Arguments &args);
95 static v8::Handle<v8::Value> SkyToString(const v8::Arguments &args);
96 static v8::Handle<v8::Value> MoonToString(const v8::Arguments &args);
97 static v8::Handle<v8::Value> LocalDist(const v8::Arguments &args);
98 static v8::Handle<v8::Value> MoonDisk(const v8::Arguments &args);
99 static v8::Handle<v8::Value> LocalToSky(const v8::Arguments &args);
100 static v8::Handle<v8::Value> SkyToLocal(const v8::Arguments &args);
101 static v8::Handle<v8::Value> MoonToLocal(const v8::Arguments &args);
102 static v8::Handle<v8::Value> ConstructorMoon(const v8::Arguments &args);
103 static v8::Handle<v8::Value> ConstructorSky(const v8::Arguments &args);
104 static v8::Handle<v8::Value> ConstructorLocal(const v8::Arguments &args);
105 static v8::Handle<v8::Value> MoonHorizon(const v8::Arguments &args);
106 static v8::Handle<v8::Value> SunHorizon(const v8::Arguments &args);
107 static v8::Handle<v8::Object> ConstructRiseSet(const v8::Handle<v8::Value>, const ln_rst_time &, const bool &);
108#endif
109
110 static v8::Handle<v8::Value> WrapInclude(const v8::Arguments &args) { if (This) return This->FuncInclude(args); else return v8::Undefined(); }
111 static v8::Handle<v8::Value> WrapFile(const v8::Arguments &args) { if (This) return This->FuncFile(args); else return v8::Undefined(); }
112 static v8::Handle<v8::Value> WrapPrint(const v8::Arguments &args) { if (This) return This->FuncPrint(args); else return v8::Undefined(); }
113 static v8::Handle<v8::Value> WrapAlarm(const v8::Arguments &args) { if (This) return This->FuncAlarm(args); else return v8::Undefined(); }
114 static v8::Handle<v8::Value> WrapOut(const v8::Arguments &args) { if (This) return This->FuncOut(args); else return v8::Undefined(); }
115 static v8::Handle<v8::Value> WrapWait(const v8::Arguments &args) { if (This) return This->FuncWait(args); else return v8::Undefined(); }
116 static v8::Handle<v8::Value> WrapSend(const v8::Arguments &args) { if (This) return This->FuncSend(args); else return v8::Undefined(); }
117 static v8::Handle<v8::Value> WrapSleep(const v8::Arguments &args) { if (This) return This->FuncSleep(args); else return v8::Undefined(); }
118 static v8::Handle<v8::Value> WrapThread(const v8::Arguments &args) { if (This) return This->FuncThread(args); else return v8::Undefined(); }
119 static v8::Handle<v8::Value> WrapKill(const v8::Arguments &args) { if (This) return This->FuncKill(args); else return v8::Undefined(); }
120 static v8::Handle<v8::Value> WrapExit(const v8::Arguments &args) { if (This) return This->FuncExit(args); else return v8::Undefined(); }
121 static v8::Handle<v8::Value> WrapState(const v8::Arguments &args) { if (This) return This->FuncState(args); else return v8::Undefined(); }
122 static v8::Handle<v8::Value> WrapNewState(const v8::Arguments &args) { if (This) return This->FuncNewState(args); else return v8::Undefined(); }
123 static v8::Handle<v8::Value> WrapSetState(const v8::Arguments &args) { if (This) return This->FuncSetState(args); else return v8::Undefined(); }
124 static v8::Handle<v8::Value> WrapGetState(const v8::Arguments &args) { if (This) return This->FuncGetState(args); else return v8::Undefined(); }
125 //static v8::Handle<v8::Value> WrapOpen(const v8::Arguments &args) { if (This) return This->FuncOpen(args); else return v8::Undefined(); }
126 static v8::Handle<v8::Value> WrapSubscription(const v8::Arguments &args){ if (This) return This->FuncSubscription(args);else return v8::Undefined(); }
127 static v8::Handle<v8::Value> WrapGetData(const v8::Arguments &args) { if (This) return This->FuncGetData(args); else return v8::Undefined(); }
128 static v8::Handle<v8::Value> WrapClose(const v8::Arguments &args) { if (This) return This->FuncClose(args); else return v8::Undefined(); }
129 static v8::Handle<v8::Value> WrapQuery(const v8::Arguments &args) { if (This) return This->FuncQuery(args); else return v8::Undefined(); }
130 static v8::Handle<v8::Value> WrapDatabase(const v8::Arguments &args) { if (This) return This->FuncDatabase(args); else return v8::Undefined(); }
131 static v8::Handle<v8::Value> WrapDbQuery(const v8::Arguments &args) { if (This) return This->FuncDbQuery(args); else return v8::Undefined(); }
132 static v8::Handle<v8::Value> WrapDbClose(const v8::Arguments &args) { if (This) return This->FuncDbClose(args); else return v8::Undefined(); }
133 static v8::Handle<v8::Value> WrapOnChangeSet(v8::Local<v8::String> prop, v8::Local<v8::Value> value, const v8::AccessorInfo &info)
134 {
135 if (This) return This->OnChangeSet(prop, value, info); else return v8::Undefined();
136 }
137
138 static v8::Handle<v8::Value> OnChangeGet(v8::Local<v8::String>, const v8::AccessorInfo &)
139 {
140 return v8::Handle<v8::Value>();
141 }
142
143 static v8::Handle<v8::Value> Convert(char type, const char* &ptr);
144 v8::Handle<v8::Value> ConvertEvent(const EventImp *evt, uint64_t, const char *str);
145#endif
146
147public:
148 InterpreterV8();
149 virtual ~InterpreterV8()
150 {
151 This = 0;
152
153#ifdef HAVE_V8
154 v8::Locker locker;
155 v8::V8::Dispose();
156#endif
157 }
158
159 virtual void JsLoad(const std::string &) { }
160 virtual void JsStart(const std::string &) { }
161 virtual void JsEnd(const std::string &) { }
162 virtual void JsPrint(const std::string &) { }
163 virtual void JsAlarm(const std::string & = "") { }
164 virtual void JsOut(const std::string &) { }
165 virtual void JsResult(const std::string &) { }
166 virtual void JsException(const std::string &) { }
167 virtual bool JsSend(const std::string &) { return true; }
168 //virtual void JsSleep(uint32_t) { }
169 //virtual int JsWait(const std::string &, int32_t, uint32_t) { return -1; };
170 virtual State JsState(const std::string &) { return State(); };
171 virtual void *JsSubscribe(const std::string &) { return 0; };
172 virtual bool JsUnsubscribe(const std::string &) { return false; };
173
174 virtual bool JsNewState(int, const std::string&, const std::string&) { return false; }
175 virtual bool JsSetState(int) { return false; }
176 virtual bool JsHasState(int) const { return false; }
177 virtual bool JsHasState(const std::string &) const { return false; }
178 virtual int JsGetState(const std::string &) const { return -2; }
179 virtual State JsGetCurrentState() const { return State(); }
180
181 virtual std::vector<Description> JsDescription(const std::string &) { return std::vector<Description>(); };
182 virtual std::pair<uint64_t, EventImp *> JsGetEvent(const std::string &) { return std::make_pair(0, (EventImp*)0); };
183
184 void JsHandleEvent(const EventImp &, uint64_t, const std::string &);
185 void JsHandleState(const std::string &, const State &);
186
187 void AddFormatToGlobal();
188
189 bool JsRun(const std::string &, const std::map<std::string,std::string> & = std::map<std::string,std::string>());
190 static void JsStop();
191};
192
193#ifndef HAVE_V8
194inline bool InterpreterV8::JsRun(const std::string &, const std::map<std::string,std::string> &) { return false; }
195inline void InterpreterV8::JsStop() { }
196#endif
197
198#endif
Note: See TracBrowser for help on using the repository browser.