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

Last change on this file since 19456 was 19456, checked in by tbretz, 15 months ago
Use the script location as the root path for relative file locations.
File size: 13.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 "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    std::string fIncludePath;
62
63#ifdef HAVE_V8
64    bool HandleException(v8::TryCatch &try_catch, const char *where);
65    void ExecuteConsole();
66    v8::Handle<v8::Value> ExecuteCode(const std::string &code, const std::string &file="internal");
67    v8::Handle<v8::Value> ExecuteInternal(const std::string &code);
68
69    void Thread(int &id, v8::Persistent<v8::Object> _this, v8::Persistent<v8::Function> func, uint32_t ms);
70
71    std::vector<std::string> ValueToArray(const v8::Handle<v8::Value> &val, bool only=true);
72
73    v8::Handle<v8::Value> FuncWait(const v8::Arguments& args);
74    v8::Handle<v8::Value> FuncSend(const v8::Arguments& args);
75    v8::Handle<v8::Value> FuncSleep(const v8::Arguments& args);
76    v8::Handle<v8::Value> FuncTimeout(const v8::Arguments& args);
77    v8::Handle<v8::Value> FuncThread(const v8::Arguments& args);
78    v8::Handle<v8::Value> FuncKill(const v8::Arguments& args);
79    v8::Handle<v8::Value> FuncLog(const v8::Arguments& args);
80    v8::Handle<v8::Value> FuncAlarm(const v8::Arguments& args);
81    v8::Handle<v8::Value> FuncOut(const v8::Arguments& args);
82    v8::Handle<v8::Value> FuncWarn(const v8::Arguments& args);
83    v8::Handle<v8::Value> FuncFile(const v8::Arguments& args);
84    v8::Handle<v8::Value> FuncSendMail(const v8::Arguments& args);
85    v8::Handle<v8::Value> FuncSendCurl(const v8::Arguments& args);
86    v8::Handle<v8::Value> FuncInclude(const v8::Arguments& args);
87    v8::Handle<v8::Value> FuncExit(const v8::Arguments& args);
88    v8::Handle<v8::Value> FuncState(const v8::Arguments& args);
89    v8::Handle<v8::Value> FuncSetState(const v8::Arguments& args);
90    v8::Handle<v8::Value> FuncGetState(const v8::Arguments& args);
91    v8::Handle<v8::Value> FuncGetStates(const v8::Arguments& args);
92    v8::Handle<v8::Value> FuncGetDescription(const v8::Arguments& args);
93    v8::Handle<v8::Value> FuncGetServices(const v8::Arguments& args);
94    v8::Handle<v8::Value> FuncNewState(const v8::Arguments& args);
95    v8::Handle<v8::Value> FuncSetInterrupt(const v8::Arguments& args);
96    v8::Handle<v8::Value> FuncTriggerInterrupt(const v8::Arguments& args);
97    //v8::Handle<v8::Value> FuncOpen(const v8::Arguments& args);
98    v8::Handle<v8::Value> FuncSubscription(const v8::Arguments& args);
99    v8::Handle<v8::Value> FuncGetData(const v8::Arguments &args);
100    v8::Handle<v8::Value> FuncClose(const v8::Arguments &args);
101    v8::Handle<v8::Value> FuncQuery(const v8::Arguments &args);
102    v8::Handle<v8::Value> FuncDatabase(const v8::Arguments &args);
103    v8::Handle<v8::Value> FuncDbQuery(const v8::Arguments &args);
104    v8::Handle<v8::Value> FuncDbClose(const v8::Arguments &args);
105    v8::Handle<v8::Value> OnChangeSet(v8::Local<v8::String>, v8::Local<v8::Value>, const v8::AccessorInfo &);
106
107    static v8::Handle<v8::Value> Constructor(const v8::Arguments &args);
108
109    static v8::Handle<v8::Value> ConstructorMail(const v8::Arguments &args);
110    static v8::Handle<v8::Value> ConstructorCurl(const v8::Arguments &args);
111
112#ifdef HAVE_NOVA
113    static double GetDataMember(const v8::Arguments &args, const char *name);
114
115    static v8::Handle<v8::Value> CalcDist(const v8::Arguments &args, const bool);
116
117    static v8::Handle<v8::Value> LocalToString(const v8::Arguments &args);
118    static v8::Handle<v8::Value> SkyToString(const v8::Arguments &args);
119    static v8::Handle<v8::Value> MoonToString(const v8::Arguments &args);
120    static v8::Handle<v8::Value> LocalDist(const v8::Arguments &args);
121    static v8::Handle<v8::Value> SkyDist(const v8::Arguments &args);
122    static v8::Handle<v8::Value> MoonDisk(const v8::Arguments &args);
123    static v8::Handle<v8::Value> LocalToSky(const v8::Arguments &args);
124    static v8::Handle<v8::Value> SkyToLocal(const v8::Arguments &args);
125    static v8::Handle<v8::Value> MoonToLocal(const v8::Arguments &args);
126    static v8::Handle<v8::Value> ConstructorMoon(const v8::Arguments &args);
127    static v8::Handle<v8::Value> ConstructorSky(const v8::Arguments &args);
128    static v8::Handle<v8::Value> ConstructorLocal(const v8::Arguments &args);
129    static v8::Handle<v8::Value> MoonHorizon(const v8::Arguments &args);
130    static v8::Handle<v8::Value> SunHorizon(const v8::Arguments &args);
131#endif
132
133    static v8::Handle<v8::Value> WrapInclude(const v8::Arguments &args)  { if (This) return This->FuncInclude(args);  else return v8::Undefined(); }
134    static v8::Handle<v8::Value> WrapFile(const v8::Arguments &args)     { if (This) return This->FuncFile(args);     else return v8::Undefined(); }
135    static v8::Handle<v8::Value> WrapSendMail(const v8::Arguments &args) { if (This) return This->FuncSendMail(args); else return v8::Undefined(); }
136    static v8::Handle<v8::Value> WrapSendCurl(const v8::Arguments &args) { if (This) return This->FuncSendCurl(args); else return v8::Undefined(); }
137    static v8::Handle<v8::Value> WrapLog(const v8::Arguments &args)      { if (This) return This->FuncLog(args);      else return v8::Undefined(); }
138    static v8::Handle<v8::Value> WrapAlarm(const v8::Arguments &args)    { if (This) return This->FuncAlarm(args);    else return v8::Undefined(); }
139    static v8::Handle<v8::Value> WrapOut(const v8::Arguments &args)      { if (This) return This->FuncOut(args);      else return v8::Undefined(); }
140    static v8::Handle<v8::Value> WrapWarn(const v8::Arguments &args)     { if (This) return This->FuncWarn(args);     else return v8::Undefined(); }
141    static v8::Handle<v8::Value> WrapWait(const v8::Arguments &args)     { if (This) return This->FuncWait(args);     else return v8::Undefined(); }
142    static v8::Handle<v8::Value> WrapSend(const v8::Arguments &args)     { if (This) return This->FuncSend(args);     else return v8::Undefined(); }
143    static v8::Handle<v8::Value> WrapSleep(const v8::Arguments &args)    { if (This) return This->FuncSleep(args);    else return v8::Undefined(); }
144    static v8::Handle<v8::Value> WrapTimeout(const v8::Arguments &args)  { if (This) return This->FuncTimeout(args);  else return v8::Undefined(); }
145    static v8::Handle<v8::Value> WrapThread(const v8::Arguments &args)   { if (This) return This->FuncThread(args);   else return v8::Undefined(); }
146    static v8::Handle<v8::Value> WrapKill(const v8::Arguments &args)     { if (This) return This->FuncKill(args);     else return v8::Undefined(); }
147    static v8::Handle<v8::Value> WrapExit(const v8::Arguments &args)     { if (This) return This->FuncExit(args);     else return v8::Undefined(); }
148    static v8::Handle<v8::Value> WrapState(const v8::Arguments &args)    { if (This) return This->FuncState(args);    else return v8::Undefined(); }
149    static v8::Handle<v8::Value> WrapNewState(const v8::Arguments &args) { if (This) return This->FuncNewState(args); else return v8::Undefined(); }
150    static v8::Handle<v8::Value> WrapSetState(const v8::Arguments &args) { if (This) return This->FuncSetState(args); else return v8::Undefined(); }
151    static v8::Handle<v8::Value> WrapGetState(const v8::Arguments &args) { if (This) return This->FuncGetState(args); else return v8::Undefined(); }
152    static v8::Handle<v8::Value> WrapGetStates(const v8::Arguments &args){ if (This) return This->FuncGetStates(args);else return v8::Undefined(); }
153    static v8::Handle<v8::Value> WrapGetDescription(const v8::Arguments &args){ if (This) return This->FuncGetDescription(args);else return v8::Undefined(); }
154    static v8::Handle<v8::Value> WrapGetServices(const v8::Arguments &args){ if (This) return This->FuncGetServices(args);else return v8::Undefined(); }
155    static v8::Handle<v8::Value> WrapSetInterrupt(const v8::Arguments &args){ if (This) return This->FuncSetInterrupt(args);else return v8::Undefined(); }
156    static v8::Handle<v8::Value> WrapTriggerInterrupt(const v8::Arguments &args){ if (This) return This->FuncTriggerInterrupt(args);else return v8::Undefined(); }
157    //static v8::Handle<v8::Value> WrapOpen(const v8::Arguments &args)     { if (This) return This->FuncOpen(args);     else return v8::Undefined(); }
158    static v8::Handle<v8::Value> WrapSubscription(const v8::Arguments &args){ if (This) return This->FuncSubscription(args);else return v8::Undefined(); }
159    static v8::Handle<v8::Value> WrapGetData(const v8::Arguments &args)  { if (This) return This->FuncGetData(args);  else return v8::Undefined(); }
160    static v8::Handle<v8::Value> WrapClose(const v8::Arguments &args)    { if (This) return This->FuncClose(args);    else return v8::Undefined(); }
161    static v8::Handle<v8::Value> WrapQuery(const v8::Arguments &args)    { if (This) return This->FuncQuery(args);    else return v8::Undefined(); }
162    static v8::Handle<v8::Value> WrapDatabase(const v8::Arguments &args) { if (This) return This->FuncDatabase(args); else return v8::Undefined(); }
163    static v8::Handle<v8::Value> WrapDbQuery(const v8::Arguments &args)  { if (This) return This->FuncDbQuery(args);  else return v8::Undefined(); }
164    static v8::Handle<v8::Value> WrapDbClose(const v8::Arguments &args)  { if (This) return This->FuncDbClose(args);  else return v8::Undefined(); }
165    static v8::Handle<v8::Value> WrapOnChangeSet(v8::Local<v8::String> prop, v8::Local<v8::Value> value, const v8::AccessorInfo &info)
166    {
167        if (This) return This->OnChangeSet(prop, value, info);  else return v8::Undefined();
168    }
169
170    static v8::Handle<v8::Value> OnChangeGet(v8::Local<v8::String>, const v8::AccessorInfo &)
171    {
172        return v8::Handle<v8::Value>();
173    }
174
175    static v8::Handle<v8::Value> Convert(char type, const char* &ptr);
176    v8::Handle<v8::Value> ConvertEvent(const EventImp *evt, uint64_t, const char *str);
177#endif
178
179    v8::Handle<v8::Value> HandleInterruptImp(std::string, uint64_t);
180
181public:
182    InterpreterV8();
183    virtual ~InterpreterV8()
184    {
185        This = 0;
186
187#ifdef HAVE_V8
188        //v8::Locker locker;
189        v8::V8::Dispose();
190#endif
191    }
192
193    std::vector<std::string> JsGetCommandList(const char *, int) const;
194
195    virtual void  JsLoad(const std::string & = "");
196    virtual void  JsStart(const std::string &) { }
197    virtual void  JsEnd(const std::string & = "");
198    virtual void  JsPrint(const std::string & = "") { }
199    virtual void  JsAlarm(const std::string & = "") { }
200    virtual void  JsOut(const std::string &) { }
201    virtual void  JsWarn(const std::string &) { }
202    virtual void  JsResult(const std::string &) { }
203    virtual void  JsException(const std::string &) { }
204    virtual bool  JsSend(const std::string &) { return true; }
205    //virtual void  JsSleep(uint32_t) { }
206    //virtual int   JsWait(const std::string &, int32_t, uint32_t) { return -1; };
207    virtual State JsState(const std::string &) { return State(); };
208    virtual void *JsSubscribe(const std::string &) { return 0; };
209    virtual bool  JsUnsubscribe(const std::string &) { return false; };
210
211    virtual bool  JsNewState(int, const std::string&, const std::string&) { return false; }
212    virtual bool  JsSetState(int) { return false; }
213    virtual bool  JsHasState(int) const { return false; }
214    virtual bool  JsHasState(const std::string &) const { return false; }
215    virtual int   JsGetState(const std::string &) const { return -2; }
216    virtual State JsGetCurrentState() const { return State(); }
217    virtual std::vector<State> JsGetStates(const std::string &) { return std::vector<State>(); }
218    virtual std::set<Service> JsGetServices() { return std::set<Service>(); }
219    virtual std::vector<Description> JsGetDescription(const std::string &) { return std::vector<Description>(); }
220
221    virtual std::vector<Description> JsDescription(const std::string &) { return std::vector<Description>(); };
222    virtual std::pair<uint64_t, EventImp *> JsGetEvent(const std::string &) { return std::make_pair(0, (EventImp*)0); };
223
224    int JsHandleInterrupt(const EventImp &);
225    void JsHandleEvent(const EventImp &, uint64_t, const std::string &);
226    void JsHandleState(const std::string &, const State &);
227
228    void AddFormatToGlobal();
229
230    bool JsRun(const std::string &, const std::map<std::string,std::string> & = std::map<std::string,std::string>());
231    static void JsStop();
232};
233
234#ifndef HAVE_V8
235inline bool InterpreterV8::JsRun(const std::string &, const std::map<std::string,std::string> &) { return false; }
236inline void InterpreterV8::JsStop() { }
237#endif
238
239#endif
Note: See TracBrowser for help on using the repository browser.