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

Last change on this file since 14566 was 14560, checked in by tbretz, 12 years ago
Added the possibility to change the state of the state machine and define new states; renamed open to subscribe
File size: 7.9 KB
Line 
1#ifndef FACT_InterpreterV8
2#define FACT_InterpreterV8
3
4#include <map>
5#include <list>
6#include <string>
7
8#ifdef HAVE_V8
9#include <v8.h>
10#endif
11
12#include "State.h"
13#include "Description.h"
14#include "EventImp.h"
15
16class Database;
17
18class InterpreterV8
19{
20 static InterpreterV8 *This;
21
22 // The main thread id, needed to be able to terminate
23 // the thread forcefully from 'the outside'
24 int fThreadId;
25
26 // A loookup table which allows to indentify the
27 // the JavaScript object corrsponding to the
28 // service name (for checking of an .onchange
29 // subscription exists for that object)
30 std::map<std::string, v8::Persistent<v8::Object>> fReverseMap;
31
32 // Lookup table for the callbacks in cases of state changes
33 std::map<std::string, v8::Persistent<v8::Value>> fStateCallbacks;
34
35#ifdef HAVE_SQL
36 std::list<Database*> fDatabases;
37#endif
38
39#ifdef HAVE_V8
40 bool ReportException(v8::TryCatch* try_catch);
41 bool ExecuteStringNT(const v8::Handle<v8::String> &code, const v8::Handle<v8::Value> &file);
42 bool ExecuteCode(const v8::Handle<v8::String> &code, const v8::Handle<v8::Value> &file);
43 bool ExecuteCode(const std::string &code, const std::string &file="");
44 bool ExecuteFile(const std::string &name);
45
46 v8::Handle<v8::Value> FuncWait(const v8::Arguments& args);
47 v8::Handle<v8::Value> FuncSend(const v8::Arguments& args);
48 v8::Handle<v8::Value> FuncSleep(const v8::Arguments& args);
49 v8::Handle<v8::Value> FuncPrint(const v8::Arguments& args);
50 v8::Handle<v8::Value> FuncAlarm(const v8::Arguments& args);
51 v8::Handle<v8::Value> FuncOut(const v8::Arguments& args);
52 v8::Handle<v8::Value> FuncInclude(const v8::Arguments& args);
53 v8::Handle<v8::Value> FuncExit(const v8::Arguments& args);
54 v8::Handle<v8::Value> FuncState(const v8::Arguments& args);
55 v8::Handle<v8::Value> FuncSetState(const v8::Arguments& args);
56 v8::Handle<v8::Value> FuncNewState(const v8::Arguments& args);
57 //v8::Handle<v8::Value> FuncOpen(const v8::Arguments& args);
58 v8::Handle<v8::Value> FuncSubscribe(const v8::Arguments& args);
59 v8::Handle<v8::Value> FuncGetData(const v8::Arguments &args);
60 v8::Handle<v8::Value> FuncClose(const v8::Arguments &args);
61 v8::Handle<v8::Value> FuncQuery(const v8::Arguments &args);
62 v8::Handle<v8::Value> FuncDatabase(const v8::Arguments &args);
63 v8::Handle<v8::Value> FuncDbQuery(const v8::Arguments &args);
64 v8::Handle<v8::Value> FuncDbClose(const v8::Arguments &args);
65 v8::Handle<v8::Value> OnChangeSet(v8::Local<v8::String>, v8::Local<v8::Value>, const v8::AccessorInfo &);
66
67 static v8::Handle<v8::Value> FuncVersion(const v8::Arguments&);
68 static v8::Handle<v8::Value> WrapInclude(const v8::Arguments &args) { if (This) return This->FuncInclude(args); else return v8::Undefined(); }
69 static v8::Handle<v8::Value> WrapPrint(const v8::Arguments &args) { if (This) return This->FuncPrint(args); else return v8::Undefined(); }
70 static v8::Handle<v8::Value> WrapAlarm(const v8::Arguments &args) { if (This) return This->FuncAlarm(args); else return v8::Undefined(); }
71 static v8::Handle<v8::Value> WrapOut(const v8::Arguments &args) { if (This) return This->FuncOut(args); else return v8::Undefined(); }
72 static v8::Handle<v8::Value> WrapWait(const v8::Arguments &args) { if (This) return This->FuncWait(args); else return v8::Undefined(); }
73 static v8::Handle<v8::Value> WrapSend(const v8::Arguments &args) { if (This) return This->FuncSend(args); else return v8::Undefined(); }
74 static v8::Handle<v8::Value> WrapSleep(const v8::Arguments &args) { if (This) return This->FuncSleep(args); else return v8::Undefined(); }
75 static v8::Handle<v8::Value> WrapExit(const v8::Arguments &args) { if (This) return This->FuncExit(args); else return v8::Undefined(); }
76 static v8::Handle<v8::Value> WrapState(const v8::Arguments &args) { if (This) return This->FuncState(args); else return v8::Undefined(); }
77 static v8::Handle<v8::Value> WrapNewState(const v8::Arguments &args) { if (This) return This->FuncNewState(args); else return v8::Undefined(); }
78 static v8::Handle<v8::Value> WrapSetState(const v8::Arguments &args) { if (This) return This->FuncSetState(args); else return v8::Undefined(); }
79 //static v8::Handle<v8::Value> WrapOpen(const v8::Arguments &args) { if (This) return This->FuncOpen(args); else return v8::Undefined(); }
80 static v8::Handle<v8::Value> WrapSubscribe(const v8::Arguments &args){ if (This) return This->FuncSubscribe(args);else return v8::Undefined(); }
81 static v8::Handle<v8::Value> WrapGetData(const v8::Arguments &args) { if (This) return This->FuncGetData(args); else return v8::Undefined(); }
82 static v8::Handle<v8::Value> WrapClose(const v8::Arguments &args) { if (This) return This->FuncClose(args); else return v8::Undefined(); }
83 static v8::Handle<v8::Value> WrapQuery(const v8::Arguments &args) { if (This) return This->FuncQuery(args); else return v8::Undefined(); }
84 static v8::Handle<v8::Value> WrapDatabase(const v8::Arguments &args) { if (This) return This->FuncDatabase(args); else return v8::Undefined(); }
85 static v8::Handle<v8::Value> WrapDbQuery(const v8::Arguments &args) { if (This) return This->FuncDbQuery(args); else return v8::Undefined(); }
86 static v8::Handle<v8::Value> WrapDbClose(const v8::Arguments &args) { if (This) return This->FuncDbClose(args); else return v8::Undefined(); }
87 static v8::Handle<v8::Value> WrapOnChangeSet(v8::Local<v8::String> prop, v8::Local<v8::Value> value, const v8::AccessorInfo &info)
88 {
89 if (This) return This->OnChangeSet(prop, value, info); else return v8::Undefined();
90 }
91
92 static v8::Handle<v8::Value> OnChangeGet(v8::Local<v8::String>, const v8::AccessorInfo &)
93 {
94 return v8::Handle<v8::Value>();
95 }
96
97 static v8::Handle<v8::Value> Convert(char type, const char* &ptr);
98 v8::Handle<v8::Value> ConvertEvent(const EventImp *evt, uint64_t, const char *str);
99#endif
100
101public:
102 InterpreterV8() : fThreadId(-1)
103 {
104 This = this;
105 }
106 virtual ~InterpreterV8()
107 {
108 This = 0;
109
110#ifdef HAVE_V8
111 v8::Locker locker;
112 v8::V8::Dispose();
113#endif
114 }
115
116 virtual void JsLoad(const std::string &) { }
117 virtual void JsStart(const std::string &) { }
118 virtual void JsEnd(const std::string &) { }
119 virtual void JsPrint(const std::string &) { }
120 virtual void JsAlarm(const std::string & = "") { }
121 virtual void JsOut(const std::string &) { }
122 virtual void JsResult(const std::string &) { }
123 virtual void JsException(const std::string &) { }
124 virtual bool JsSend(const std::string &) { return true; }
125 //virtual void JsSleep(uint32_t) { }
126 //virtual int JsWait(const std::string &, int32_t, uint32_t) { return -1; };
127 virtual State JsState(const std::string &) { return State(); };
128 virtual void *JsSubscribe(const std::string &) { return 0; };
129 virtual bool JsUnsubscribe(const std::string &) { return false; };
130
131 virtual bool JsNewState(int, const std::string&, const std::string&) { return false; }
132 virtual bool JsSetState(int) { return false; }
133 virtual bool JsHasState(int) const { return false; }
134 virtual bool JsHasState(const std::string &) const { return false; }
135 virtual int JsGetState(const std::string &) const { return -2; }
136
137 virtual std::vector<Description> JsDescription(const std::string &) { return std::vector<Description>(); };
138 virtual std::pair<uint64_t, EventImp *> JsGetEvent(const std::string &) { return std::make_pair(0, (EventImp*)0); };
139
140 void JsHandleEvent(const EventImp &, uint64_t, const std::string &);
141 void JsHandleState(const std::string &, const State &);
142
143 bool JsRun(const std::string &, const std::map<std::string,std::string> & = std::map<std::string,std::string>());
144 static void JsStop();
145};
146
147#ifndef HAVE_V8
148inline bool InterpreterV8::JsRun(const std::string &, const std::map<std::string,std::string> &) { return false; }
149inline void InterpreterV8::JsStop() { }
150#endif
151
152#endif
Note: See TracBrowser for help on using the repository browser.