summaryrefslogtreecommitdiffstats
path: root/src/uscxml/plugins/datamodel/ecmascript/v8/V8DOM.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/uscxml/plugins/datamodel/ecmascript/v8/V8DOM.h')
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/v8/V8DOM.h83
1 files changed, 83 insertions, 0 deletions
diff --git a/src/uscxml/plugins/datamodel/ecmascript/v8/V8DOM.h b/src/uscxml/plugins/datamodel/ecmascript/v8/V8DOM.h
new file mode 100644
index 0000000..43b98ce
--- /dev/null
+++ b/src/uscxml/plugins/datamodel/ecmascript/v8/V8DOM.h
@@ -0,0 +1,83 @@
+#ifndef V8DOM_H_LKE1HKJK
+#define V8DOM_H_LKE1HKJK
+
+#include "uscxml/Interpreter.h"
+#include <v8.h>
+#include <XPath/XPath.hpp>
+#include "../Storage.h"
+
+#define V8_DESTRUCTOR(type) \
+static void jsDestructor(v8::Persistent<v8::Value> object, void* data) { \
+ v8::HandleScope handleScope; \
+ type* thing = static_cast<type*>(v8::Local<v8::External>::Cast(object->ToObject()->GetInternalField(0))->Value()); \
+ delete thing->nativeObj; \
+ delete thing; \
+ object.Dispose(); \
+ object.Clear(); \
+}
+
+#define V8_DESTRUCTOR_KEEP_WRAPPED(type) \
+static void jsDestructor(v8::Persistent<v8::Value> object, void* data) { \
+v8::HandleScope handleScope; \
+type* thing = static_cast<type*>(v8::Local<v8::External>::Cast(object->ToObject()->GetInternalField(0))->Value()); \
+delete thing; \
+object.Dispose(); \
+object.Clear(); \
+}
+
+namespace Arabica {
+namespace DOM {
+
+class V8DOM {
+public:
+ V8DOM();
+ virtual ~V8DOM();
+
+ template <typename T>
+ static T* toClassPtr(v8::Local<v8::Value> data) {
+ if(data.IsEmpty())
+ return NULL;
+ else if(!data->IsExternal())
+ return NULL;
+ else
+ return static_cast<T *>(v8::External::Unwrap(data));
+ return NULL;
+ }
+ static v8::Local<v8::External> toExternal(void* pointer) {
+ v8::HandleScope scope;
+ return scope.Close(v8::External::New(pointer));
+ }
+
+ Arabica::XPath::XPath<std::string>* xpath;
+ uscxml::Storage* storage;
+};
+
+class V8Exception : public std::runtime_error {
+public:
+
+ V8Exception(const std::string& reason) :
+ std::runtime_error("DOMException") {
+ } // V8Exception
+
+ V8Exception(const V8Exception& rhs) :
+ std::runtime_error(rhs),
+ reason_(rhs.reason_) {
+ } // DOMException
+
+ virtual ~V8Exception() throw() {
+ } // DOMBadCast
+
+ virtual const char* what() const throw() {
+ return reason_.c_str();
+ } // what
+
+private:
+ DOMBadCast& operator=(const DOMBadCast&);
+ bool operator==(const DOMBadCast&) const;
+
+ std::string reason_;
+}; // class DOMException
+
+}
+}
+#endif /* end of include guard: V8DOM_H_LKE1HKJK */