123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305 |
- #include "api.h"
- #include <api/script/scriptobji.h>
- #include <api/script/objcontroller.h>
- #include <api/script/scriptguid.h>
- ScriptObjectI::ScriptObjectI(const wchar_t *class_name, ScriptObjectController *object_controller)
- {
- classname = class_name;
- controller = object_controller;
- cache_count = -1;
- membercachegid = -1;
- membercachesid = -1;
- ingetinterface = 0;
- vcpu_init();
- }
- ScriptObjectI::~ScriptObjectI()
- {
- assignedVariables.deleteAll();
- memberVariables.deleteAll();
- interfaceslist.deleteAll();
- WASABI_API_MAKI->vcpu_removeScriptObject(this);
- }
- void *ScriptObjectI::vcpu_getInterface(GUID g, int *interfacetype)
- {
- if (g == scriptObjectGuid) return this;
- InterfaceEntry *entry = 0;
- int n=0;
- while (entry = interfaceslist.enumItem(n++))
- {
- if (entry->getGuid() == g)
- {
- if (interfacetype != NULL)
- *interfacetype = entry->getType();
- return entry->getInterface();
- }
- }
- if (ingetinterface) return NULL;
- ingetinterface = 1;
- void *i = NULL;
- ScriptObjectController *c = controller;
- //CUT: ScriptObject *no = NULL;
- while (i == NULL && c != NULL)
- {
- i = c->cast(this, g);
- if (i != NULL) break;
- c = c->getAncestorController();
- }
- if (interfacetype != NULL)
- *interfacetype = INTERFACE_SCRIPTOBJECT;
- ingetinterface = 0;
- return i;
- }
- void *ScriptObjectI::vcpu_getInterfaceObject(GUID g, ScriptObject **o)
- {
- if (g == scriptObjectGuid) return this;
- InterfaceEntry *entry = 0;
- int n=0;
- while (entry = interfaceslist.enumItem(n++))
- {
- if (entry && entry->getGuid() == g)
- {
- *o = NULL;
- return entry->getInterface();
- }
- }
- if (ingetinterface) return NULL;
- ingetinterface = 1;
- void *i = NULL;
- ScriptObjectController *c = controller;
- //CUT: ScriptObject *no = NULL;
- while (i == NULL && c != NULL)
- {
- i = c->cast(this, g);
- if (i != NULL)
- {
- if (o != NULL)
- *o = (ScriptObject *)i;
- break;
- }
- c = c->getAncestorController();
- }
- ingetinterface = 0;
- return i;
- }
- int ScriptObjectI::vcpu_getAssignedVariable(int start, int scriptid, int functionId, int *next, int *globalevententry, int *inheritedevent)
- {
- if (start < 0) start = 0;
- if (start >= assignedVariables.getNumItems()) return -1;
- for (int i = start;i < assignedVariables.getNumItems();i++)
- {
- assvar *v = assignedVariables.enumItem(i);
- if (WASABI_API_MAKI->vcpu_getCacheCount() != cache_count)
- {
- if (!WASABI_API_MAKI->vcpu_isValidScriptId(v->scriptid))
- {
- vcpu_removeAssignedVariable(v->varid, v->scriptid);
- i--;
- continue;
- }
- }
- if (scriptid == -1 || v->scriptid == scriptid)
- {
- int r = getEventForVar(v, functionId, inheritedevent);
- if (r == -1) continue;
- if (next) *next = i + 1;
- if (globalevententry) *globalevententry = r;
- return WASABI_API_MAKI->vcpu_mapVarId(v->varid, v->scriptid);
- }
- }
- return -1;
- }
- void ScriptObjectI::vcpu_removeAssignedVariable(int var, int id)
- {
- for (int i = 0;i < assignedVariables.getNumItems();i++)
- {
- assvar *v = assignedVariables.enumItem(i);
- if (v->varid == var && v->scriptid == id)
- {
- delete v;
- assignedVariables.removeItem(v);
- return ;
- }
- }
- }
- void ScriptObjectI::vcpu_addAssignedVariable(int var, int scriptid)
- {
- do
- {
- assvar *v = new assvar;
- v->scriptid = scriptid;
- v->varid = var;
- assignedVariables.addItem(v);
- computeEventList(v);
- var = WASABI_API_MAKI->vcpu_getUserAncestorId(var, scriptid);
- }
- while (var != -1);
- }
- const wchar_t *ScriptObjectI::vcpu_getClassName()
- {
- return classname;
- }
- ScriptObjectController *ScriptObjectI::vcpu_getController()
- {
- return controller;
- }
- int ScriptObjectI::vcpu_getScriptId()
- {
- return id;
- }
- void ScriptObjectI::vcpu_setScriptId(int i)
- {
- id = i;
- }
- int ScriptObjectI::vcpu_getMember(const wchar_t *id, int scriptid, int rettype)
- {
- if (membercachesid == scriptid && !WCSICMP(membercacheid, id))
- return membercachegid;
- membercacheid = id;
- membercachesid = scriptid;
- for (int i = 0;i < memberVariables.getNumItems();i++)
- {
- MemberVar *m = memberVariables.enumItem(i);
- if (m->getScriptId() == scriptid && !WCSICMP(m->getName(), id))
- {
- membercachegid = m->getGlobalId();
- return membercachegid;
- }
- }
- MemberVar *m = new MemberVar(id, scriptid, rettype);
- memberVariables.addItem(m);
- membercachegid = m->getGlobalId();
- return membercachegid;
- }
- void ScriptObjectI::vcpu_delMembers(int scriptid)
- {
- for (int i = 0;i < memberVariables.getNumItems();i++)
- if (memberVariables.enumItem(i)->getScriptId() == scriptid)
- {
- delete memberVariables.enumItem(i);
- memberVariables.removeByPos(i--);
- }
- }
- void ScriptObjectI::vcpu_setInterface(GUID g, void *v, int interfacetype)
- {
- for (int i = 0;i < interfaceslist.getNumItems();i++)
- if (interfaceslist.enumItem(i)->getGuid() == g)
- {
- InterfaceEntry *p = interfaceslist.enumItem(i);
- delete p;
- interfaceslist.removeByPos(i);
- i--;
- }
- interfaceslist.addItem(new InterfaceEntry(g, v, interfacetype));
- }
- void ScriptObjectI::vcpu_setClassName(const wchar_t *name)
- {
- classname = name;
- }
- void ScriptObjectI::vcpu_setController(ScriptObjectController *c)
- {
- controller = c;
- }
- void ScriptObjectI::vcpu_init()
- {
- WASABI_API_MAKI->vcpu_addScriptObject(this);
- }
- int ScriptObjectI::getEventForVar(assvar *var, int funcid, int *inheritedevent)
- {
- if (WASABI_API_MAKI->vcpu_getCacheCount() != cache_count)
- {
- for (int i = 0;i < assignedVariables.getNumItems();i++)
- {
- assvar* ass = assignedVariables.enumItem(i);
- // Martin> We need to ensure here that a valid script is called
- // There are a few circumstances where the script is already deleted from SOM but we want to call it.
- // Example: onMouseWheelDown() in a script embedded in a customobject and another script.
- // another script can hide the customobject and thus the custom object's embedded script gets unloaded.
- // the old scriptID is still cached and wants to be invoked! this will lead to an guru but the guru cannot be thrown
- // since the ScriptID isn't valid anymore. this leads to a nullpointer assert crash.
- if (!WASABI_API_MAKI->vcpu_isValidScriptId(ass->scriptid))
- {
- continue;
- }
- computeEventList(ass);
- }
- cache_count = WASABI_API_MAKI->vcpu_getCacheCount();
- }
- TList<int> *list = &var->dlfs;
- for (int i = 0;i < list->getNumItems();i += 4)
- if (list->enumItem(i) == funcid && list->enumItem(i + 1) == var->varid)
- {
- *inheritedevent = list->enumItem(i + 3);
- return list->enumItem(i + 2);
- }
- return -1;
- }
- void ScriptObjectI::computeEventList(assvar *a)
- {
- a->dlfs.removeAll();
- int dlfid;
- int scriptid;
- int varid;
- int var = a->varid;
- int inheritedevent = 0;
- do
- {
- for (int i = 0;i < WASABI_API_MAKI->vcpu_getNumEvents();i++)
- {
- WASABI_API_MAKI->vcpu_getEvent(i, &dlfid, &scriptid, &varid);
- if (scriptid == a->scriptid && varid == var)
- {
- a->dlfs.addItem(dlfid);
- a->dlfs.addItem(varid);
- a->dlfs.addItem(i);
- a->dlfs.addItem(inheritedevent);
- }
- }
- var = WASABI_API_MAKI->vcpu_getUserAncestorId(var, a->scriptid);
- inheritedevent = 1;
- }
- while (var != -1);
- }
- ScriptObjectI::MemberVar::MemberVar(const wchar_t *_name, int _scriptid, int _rettype)
- {
- name = _name;
- rettype = _rettype;
- scriptid = _scriptid;
- globalid = WASABI_API_MAKI->maki_createOrphan(rettype);
- }
- ScriptObjectI::MemberVar::~MemberVar()
- {
- WASABI_API_MAKI->maki_killOrphan(globalid); // heh :)
- }
|