diff options
Diffstat (limited to 'Src/Wasabi/api/script/objcontroller.cpp')
-rw-r--r-- | Src/Wasabi/api/script/objcontroller.cpp | 156 |
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); +} + |