aboutsummaryrefslogtreecommitdiff
path: root/Src/Wasabi/api/script/objcontroller.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Wasabi/api/script/objcontroller.cpp')
-rw-r--r--Src/Wasabi/api/script/objcontroller.cpp156
1 files changed, 156 insertions, 0 deletions
diff --git a/Src/Wasabi/api/script/objcontroller.cpp b/Src/Wasabi/api/script/objcontroller.cpp
new file mode 100644
index 00000000..0cae1ccc
--- /dev/null
+++ b/Src/Wasabi/api/script/objcontroller.cpp
@@ -0,0 +1,156 @@
+#include <bfc/wasabi_std.h>
+#include <api/script/objcontroller.h>
+#include <api/script/objects/c_script/scripthook.h>
+#include "api.h"
+
+#define CBCLASS ScriptObjectControllerI
+START_DISPATCH;
+ CB(GETCLASSGUID, getClassGuid);
+ CB(GETCLASSNAME, getClassName);
+ CB(GETANCESTORCLASSNAME, getAncestorClassName);
+ CB(GETNUMFUNCTIONS, getNumFunctions);
+ CB(GETEXPORTEDFUNCTIONS, getExportedFunctions);
+ CB(INSTANTIATE, instantiate);
+ VCB(DESTROY, destroy);
+ CB(ENCAPSULATE, encapsulate);
+ VCB(DEENCAPSULATE, deencapsulate);
+ VCB(SETCLASSID, setClassId);
+ CB(GETCLASSID, getClassId);
+ VCB(SETANCESTORCLASSID, setAncestorClassId);
+ CB(GETANCESTORCLASSID, getAncestorClassId);
+ CB(GETINSTANTIABLE, getInstantiable);
+ CB(GETREFERENCEABLE, getReferenceable);
+ CB(GETANCESTORCONTROLLER, getAncestorController);
+ VCB(ADDCLASSHOOK, addClassHook);
+ VCB(ADDOBJHOOK, addObjectHook);
+ VCB(REMHOOKS, removeHooks);
+ VCB(ONREGISTERCLASS, onRegisterClass);
+ CB(CAST, cast);
+END_DISPATCH;
+
+ScriptObjectControllerI::ScriptObjectControllerI() {
+ my_class_id = -1;
+ my_ancestor_class_id = -1;
+ rootController = NULL;
+ incast = 0;
+}
+
+ScriptObjectControllerI::~ScriptObjectControllerI() {
+}
+
+int ScriptObjectControllerI::processHooks(ScriptObject *o, int dlfid, scriptVar **table, int nparams) {
+ //CUT: int n=-1;
+ for (int j=0;j<classhooks.getNumItems();j++) {
+ classhooks.enumItem(j)->eventCallback(o, dlfid, table, nparams);
+ }
+ for (int i=0;i<objhooks.getNumItems();i++) {
+ object_hook_struct *s = objhooks.enumItem(i);
+ if (s->object == o) {
+ s->hook->eventCallback(o, dlfid, table, nparams);
+ }
+ }
+ return 0;
+}
+
+ScriptObject *ScriptObjectControllerI::cast(ScriptObject *o, GUID g) {
+ if (incast) return NULL;
+ incast = 1;
+ ASSERT(o != NULL);
+ ScriptObject *obj = NULL;
+ void *i = o->vcpu_getInterfaceObject(g, &obj);
+ incast = 0;
+ if (i != NULL) {
+ if (obj != NULL) return obj;
+ return o;
+ }
+ return NULL;
+}
+
+void ScriptObjectControllerI::addClassHook(ScriptHook *h) {
+ classhooks.addItem(h);
+}
+
+void ScriptObjectControllerI::addObjectHook(ScriptHook *h, ScriptObject *o) {
+ object_hook_struct *s = new object_hook_struct;
+ s->hook = h;
+ s->object = o;
+ objhooks.addItem(s);
+/* if (getAncestorController())
+ getAncestorController()->addObjectHook(h, o);
+ else
+ if (rootController && this != rootController) rootController->addObjectHook(h, o);*/
+}
+
+void ScriptObjectControllerI::removeHooks(ScriptHook *h) {
+ classhooks.removeItem(h);
+ for (int i=0;i<objhooks.getNumItems();i++) {
+ object_hook_struct *o = objhooks.enumItem(i);
+ if (o->hook == h) {
+ delete o;
+ objhooks.removeByPos(i);
+ i--;
+ }
+ }
+/* if (getAncestorController())
+ getAncestorController()->removeHooks(h);
+ else
+ if (rootController && this != rootController) rootController->removeHooks(h);*/
+}
+
+void ScriptObjectControllerI::onRegisterClass(ScriptObjectController *root) {
+ rootController = root;
+}
+
+
+scriptVar MAKE_SCRIPT_INT(int i) {
+ scriptVar r;
+ r.type = SCRIPT_INT;
+ r.data.idata = i;
+ return r;
+}
+
+scriptVar MAKE_SCRIPT_VOID() {
+ scriptVar r; r.type = SCRIPT_VOID;
+ r.data.idata = 0;
+ return r;
+}
+
+scriptVar MAKE_SCRIPT_FLOAT(float f) {
+ scriptVar r; r.type = SCRIPT_FLOAT;
+ r.data.fdata = f;
+ return r;
+}
+
+scriptVar MAKE_SCRIPT_DOUBLE(double d) {
+ scriptVar r; r.type = SCRIPT_DOUBLE;
+ r.data.ddata = d;
+ return r;
+}
+
+scriptVar MAKE_SCRIPT_BOOLEAN(int b) {
+ scriptVar r; r.type = SCRIPT_BOOLEAN;
+ r.data.idata = b;
+ return r;
+}
+
+scriptVar MAKE_SCRIPT_OBJECT(ScriptObject *o) {
+ scriptVar r;
+ r.type = SCRIPT_OBJECT;
+ r.data.odata = o;
+ return r;
+}
+
+scriptVar MAKE_SCRIPT_STRING(const wchar_t *s)
+{
+ scriptVar r;
+ r.type = SCRIPT_STRING;
+ r.data.sdata = s;
+ return r;
+}
+
+void *GET_SCRIPT_OBJECT_AS(scriptVar v, GUID g) {
+ ScriptObject *o = GET_SCRIPT_OBJECT(v);
+ if (!o) return NULL;
+ return o->vcpu_getInterface(g);
+}
+