123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748 |
- #include <precomp.h>
- #include <api/script/objecttable.h>
- #ifndef _NOSTUDIO
- #include <api/service/svcs/svc_scriptobji.h>
- #include <api/script/scriptobj.h>
- #include <api/script/vcputypes.h>
- #include <api/script/objects/systemobj.h>
- #include <api/script/scriptmgr.h>
- #include <api/script/objects/rootobject.h>
- #include <api/script/objects/guiobj.h>
- #include <api/skin/widgets/group.h>
- #ifdef WASABI_WIDGETS_LAYER
- #include <api/skin/widgets/layer.h>
- #endif
- #ifdef WASABI_WIDGETS_ANIMLAYER
- #include <api/skin/widgets/animlayer.h>
- #endif
- #include <AlbumArt.h>
- #ifdef WASABI_WIDGETS_BUTTON
- #include <api/skin/widgets/button.h>
- #endif
- #ifdef WASABI_COMPILE_WNDMGR
- #ifdef WASABI_WIDGETS_WNDHOLDER
- #include <api/wndmgr/container.h>
- #endif
- #include <api/wndmgr/layout.h>
- #endif // wndmgr
- #ifdef WASABI_WIDGETS_EDIT
- #include <api/skin/widgets/edit.h>
- #endif
- #ifdef WASABI_WIDGETS_SLIDER
- #include <api/skin/widgets/pslider.h>
- #endif
- #ifdef WASABI_WIDGETS_MEDIAVIS
- #include <api/skin/widgets/sa.h>
- #endif
- #ifdef WASABI_COMPILE_MEDIACORE
- #ifdef WASABI_WIDGETS_MEDIAEQCURVE
- #include <api/skin/widgets/seqvis.h>
- #endif
- #ifdef WASABI_WIDGETS_MEDIASTATUS
- #include <api/skin/widgets/sstatus.h>
- #endif
- #endif // mediacore
- #ifdef WASABI_WIDGETS_TEXT
- #include <api/skin/widgets/text.h>
- #endif
- #ifdef WASABI_WIDGETS_TGBUTTON
- #include <api/skin/widgets/tgbutton.h>
- #endif
- #ifdef WASABI_WIDGETS_TITLEBAR
- #include <api/skin/widgets/title.h>
- #endif
- #ifdef WASABI_SCRIPTOBJECTS_POPUP
- #include <api/script/objects/spopup.h>
- #endif
- #ifdef WASABI_SCRIPTOBJECTS_MAP
- #include <api/script/objects/smap.h>
- #endif
- #ifdef WASABI_WIDGETS_GROUPLIST
- #include <api/skin/widgets/grouplist.h>
- #endif
- #ifdef WASABI_WIDGETS_COMPBUCK
- #include <api/skin/widgets/compbuck2.h>
- #endif
- #ifdef WASABI_SCRIPTOBJECTS_WAC
- #include <api/script/objects/wacobj.h>
- #endif
- #ifdef WASABI_SCRIPTOBJECTS_LIST
- #include <api/script/objects/slist.h>
- #endif
- #ifdef WASABI_SCRIPTOBJECTS_BITLIST
- #include <api/script/objects/sbitlist.h>
- #endif
- #ifdef WASABI_SCRIPTOBJECTS_REGION
- #include <api/script/objects/sregion.h>
- #endif
- #ifdef WASABI_WIDGETS_MOUSEREDIR
- #include <api/skin/widgets/mouseredir.h>
- #endif
- #ifdef WASABI_WIDGETS_BROWSER
- #include <api/skin/widgets/mb/xuibrowser.h>
- #endif
- #ifdef WASABI_WIDGETS_QUERYLIST
- #include <api/skin/widgets/db/xuiquerylist.h>
- #endif
- #ifdef WASABI_WIDGETS_FILTERLIST
- #include <api/skin/widgets/db/xuifilterlist.h>
- #endif
- #ifdef WASABI_WIDGETS_WNDHOLDER
- #include <api/skin/widgets/xuiwndholder.h>
- #endif
- #ifdef WASABI_WIDGETS_DROPDOWNLIST
- #include <api/skin/widgets/dropdownlist.h>
- #endif
- #ifdef WASABI_SCRIPTOBJECTS_EMBEDDEDXUI
- #include <api/wnd/wndclass/embeddedxui.h>
- #endif
- #ifdef WASABI_WIDGETS_LAYOUTSTATUS
- #include <api/skin/widgets/xuistatus.h>
- #endif
- #ifdef WASABI_WIDGETS_TABSHEET
- #include <api/skin/widgets/xuitabsheet.h>
- #endif
- #ifdef WASABI_WIDGETS_LIST
- #include <api/skin/widgets/xuilist.h>
- #endif
- #ifdef WASABI_WIDGETS_TREE
- #include <api/skin/widgets/xuitree.h>
- #endif
- #ifdef WASABI_WIDGETS_CHECKBOX
- #include <api/skin/widgets/xuicheckbox.h>
- #endif
- #include <api/skin/widgets/xuiframe.h>
- //Martin> This fixes Wa5 Menu Xml Object is not instanciable via maki - silly bug
- #include <api/skin/widgets/xuimenuso.h>
- //fileIO
- #include <api/script/objects/sfile.h>
- #include <api/script/objects/sxmldoc.h>
- //ColorMgr
- #include <api/script/objects/scolormgr.h>
- #include <api/script/objects/scolor.h>
- #include <api/script/objects/sgammaset.h>
- #include <api/script/objects/sgammagroup.h>
- #include <api/script/objects/sapplication.h>
- #include <api/script/objects/sprivate.h>
- #include <api/script/vcpu.h>
- #include <bfc/ptrlist.h>
- #include <api/service/svc_enum.h>
- #include <api/service/service.h>
- #include <api/service/services.h>
- void ObjectTable::start() {
- registerClass(rootScriptObjectController);
- registerClass(systemController);
- #ifdef WASABI_COMPILE_SKIN
- registerClass(guiController);
- registerClass(groupController);
- #ifdef WASABI_SCRIPTOBJECTS_EMBEDDEDXUI
- registerClass(embeddedXuiController);
- #endif
- #ifdef WASABI_WIDGETS_LAYER
- registerClass(layerController);
- #endif
- #ifdef WASABI_WIDGETS_ANIMLAYER
- registerClass(animlayerController);
- #endif
- registerClass(albumartController);
- #ifdef WASABI_WIDGETS_BUTTON
- registerClass(buttonController);
- #endif
- #ifdef WASABI_WIDGETS_TGBUTTON
- registerClass(tgbuttonController);
- #endif
- #ifdef WASABI_WIDGETS_COMPBUCK
- registerClass(cbucketController);
- #endif
- #ifdef WASABI_COMPILE_WNDMGR
- registerClass(containerController);
- registerClass(layoutController);
- #endif
- #ifdef WASABI_WIDGETS_EDIT
- registerClass(editController);
- #endif
- #ifdef WASABI_WIDGETS_SLIDER
- registerClass(sliderController);
- #endif
- #ifdef WASABI_WIDGETS_MEDIAVIS
- registerClass(visController);
- #endif
- #ifdef WASABI_COMPILE_MEDIACORE
- #ifdef WASABI_WIDGETS_MEDIAEQCURVE
- registerClass(eqvisController);
- #endif
- #ifdef WASABI_WIDGETS_MEDIASTATUS
- registerClass(statusController);
- #endif
- #endif // mediacore
- #ifdef WASABI_WIDGETS_TEXT
- registerClass(textController);
- #endif
- registerClass(frameController);
- #ifdef WASABI_WIDGETS_TITLEBAR
- registerClass(titleController);
- #endif
- #ifdef WASABI_SCRIPTOBJECTS_POPUP
- registerClass(popupController);
- #endif
- #ifdef WASABI_SCRIPTOBJECTS_WAC
- registerClass(wacController);
- #endif
- #endif
- #ifdef WASABI_SCRIPTOBJECTS_LIST
- registerClass(listController);
- #endif
- #ifdef WASABI_SCRIPTOBJECTS_BITLIST
- registerClass(bitlistController);
- #endif
- #ifdef WASABI_SCRIPTOBJECTS_REGION
- registerClass(regionController);
- #endif
- #ifdef WASABI_SCRIPTOBJECTS_MAP
- registerClass(mapController);
- #endif
- #ifdef WASABI_COMPILE_SKIN
- #ifdef WASABI_WIDGETS_GROUPLIST
- registerClass(grouplistController);
- #endif
- #ifdef WASABI_WIDGETS_MOUSEREDIR
- registerClass(mouseredirController);
- #endif
- #ifdef WASABI_COMPILE_CONFIG
- registerClass(cfgGroupController);
- #endif
- #ifdef WASABI_WIDGETS_BROWSER
- registerClass(browserController);
- #endif
- #ifdef WASABI_WIDGETS_QUERYLIST
- registerClass(queryListController);
- #endif
- #ifdef WASABI_WIDGETS_FILTERLIST
- registerClass(filterListController);
- #endif
- #ifdef WASABI_COMPILE_WNDMGR
- #ifdef WASABI_WIDGETS_WNDHOLDER
- registerClass(windowHolderController);
- #endif
- #endif // wndmgr
- #ifdef WASABI_WIDGETS_DROPDOWNLIST
- registerClass(dropDownListController);
- #endif
- #ifdef WASABI_WIDGETS_LAYOUTSTATUS
- registerClass(layoutStatusController);
- #endif
- #ifdef WASABI_WIDGETS_TABSHEET
- registerClass(tabsheetController);
- #endif
- #ifdef WASABI_WIDGETS_LIST
- registerClass(guiListController);
- #endif
- #ifdef WASABI_WIDGETS_TREE
- registerClass(guiTreeController);
- registerClass(treeItemController);
- #endif
- #ifdef WASABI_WIDGETS_CHECKBOX
- registerClass(checkBoxController);
- #endif
- #endif
- registerClass(fileController);
- registerClass(xmlDocController);
- registerClass(applicationController);
- registerClass(SPrivateController);
- registerClass(xuiMenuScriptController);
- registerClass(colorMgrController);
- registerClass(colorController);
- registerClass(gammasetController);
- registerClass(gammagroupController);
- }
- void ObjectTable::shutdown() {
- for (int i=0;i<classes.getNumItems();i++) {
- class_entry *e = classes[i];
- unlinkClass(e);
- FREE((char *)e->classname);
- }
- classes.deleteAll();
- VCPU::resetDlf();
- externalloaded = 0;
- }
- // unload external classes
- void ObjectTable::unloadExternalClasses() {
- for (int i=0;i<classes.getNumItems();i++) {
- if (classes.enumItem(i)->external) {
- class_entry *ce = classes.enumItem(i);
- unlinkClass(ce);
- classes.removeByPos(i);
- i--;
- }
- }
- classidx = classes.getNumItems();
- externalloaded = 0;
- }
- void ObjectTable::unlinkClass(class_entry *e) {
- if (e->sf != NULL && !WASABI_API_SVC->service_isvalid(WaSvc::SCRIPTOBJECT, e->sf)) return;
- ScriptObjectController *c = e->controller;
- const function_descriptor_struct *ds = c->getExportedFunctions();
- for (int j=0;j<c->getNumFunctions();j++) {
- VCPU::DLF_reset(ds[j].physical_ptr, ds[j].nparams);
- }
- }
- void ObjectTable::loadExternalClasses() {
- if (externalloaded) return;
- externalloaded = 1;
- ExternalScriptObjectEnum soe ;
- svc_scriptObject *obj = soe.getFirst();
- while (obj) {
- obj->onRegisterClasses(rootScriptObjectController);
- int g=0;
- while (1) {
- ScriptObjectController *o = obj->getController(g);
- if (!o) break;
- //DebugString(StringPrintf("Registering script class %s\n", o->getClassName()));
- ObjectTable::registerClass(o, soe.getLastFactory());
- g++;
- }
- WASABI_API_SVC->service_release(obj);
- obj = soe.getNext();
- }
- }
- // returns classid. ancestorclass = 0 = Object
- int ObjectTable::registerClass(ScriptObjectController *c, waServiceFactory *sf) {
- ASSERT(c != NULL);
- c->onRegisterClass(rootScriptObjectController);
- const wchar_t *classname = c->getClassName();
- const wchar_t *ancestorclassname = c->getAncestorClassName();
- GUID g = c->getClassGuid();
- if (getClassFromName(classname) > -1) {
- ASSERTPR(0, StringPrintf("duplicate script class name %S", classname));
- #ifdef _WIN32
- ExitProcess(0);
- #else
- exit(0);
- #endif
- }
- if (getClassFromGuid(g) > -1) {
- ASSERTPR(0, "duplicate script class guid");
- #ifdef _WIN32
- ExitProcess(0);
- #else
- exit(0);
- #endif
- }
-
- int ancestorclassid = -1;
- if (ancestorclassname != NULL)
- ancestorclassid = getClassFromName(ancestorclassname);
- class_entry * en = new class_entry;
- en->classid = CLASS_ID_BASE + classidx++;
- c->setClassId(en->classid);
- c->setAncestorClassId(ancestorclassid);
- en->classname = WCSDUP(classname);
- en->controller = c;
- en->classGuid = g;
- en->ancestorclassid = ancestorclassid;
- en->instantiable = c->getInstantiable();
- en->referenceable = c->getReferenceable();
- en->external = sf != NULL;
- en->sf = sf;
- classes.addItem(en);
- dlfAddClassRef(c, NULL); // FG> fucko
- return classes.getNumItems()-1;
- }
- int ObjectTable::addrefDLF(VCPUdlfEntry *dlf, int id) {
-
- int classid = dlf->basetype;
- while (classid) {
- class_entry *e = getClassEntry(classid);
- if (!e) return 0;
- function_descriptor_struct *s = (function_descriptor_struct *)e->controller->getExportedFunctions();
- for (int i=0;i<e->controller->getNumFunctions();i++, s++) {
- if (!WCSICMP(s->function_name, dlf->functionName)) {
- int xid = VCPU::getDLFFromPointer(s->physical_ptr, s->nparams);
- if (xid != -1) {
- dlf->DLFid = xid;
- dlf->ptr = s->physical_ptr;
- dlf->nparams = s->nparams;
- VCPU::DLF_addref(s->physical_ptr, s->nparams);
- return 0;
- }
- dlf->DLFid = id;
- dlf->ptr = s->physical_ptr;
- dlf->nparams = s->nparams;
- VCPU::setupDLFFunction(s->physical_ptr, s->nparams, id, dlf);
- VCPU::DLF_addref(s->physical_ptr, s->nparams);
- return 1;
- }
- }
- classid = e->controller->getAncestorClassId();
- }
- return 0;
- }
- void ObjectTable::delrefDLF(VCPUdlfEntry *dlf) {
- int classid = dlf->basetype;
- while (classid) {
- class_entry *e = getClassEntry(classid);
- if (!e) return;
- function_descriptor_struct *s = (function_descriptor_struct *)e->controller->getExportedFunctions();
- for (int i=0;i<e->controller->getNumFunctions();i++, s++) {
- if (!WCSICMP(s->function_name, dlf->functionName)) {
- VCPU::DLF_remref(s->physical_ptr, s->nparams);
- return;
- }
- }
- classid = e->controller->getAncestorClassId();
- }
- }
- void ObjectTable::resetDLF(VCPUdlfEntry *dlf) {
- int classid = dlf->basetype;
- while (classid) {
- class_entry *e = getClassEntry(classid);
- if (!e) return;
- function_descriptor_struct *s = (function_descriptor_struct *)e->controller->getExportedFunctions();
- for (int i=0;i<e->controller->getNumFunctions();i++, s++) {
- if (!WCSICMP(s->function_name, dlf->functionName)) {
- VCPU::DLF_reset(s->physical_ptr, s->nparams);
- return;
- }
- }
- classid = e->controller->getAncestorClassId();
- }
- }
- int ObjectTable::getClassFromName(const wchar_t *classname) {
- for (int i=0;i<classes.getNumItems();i++) {
- if (classes[i] && !WCSICMP(classname, classes[i]->classname)) {
- return classes.enumItem(i)->classid;
- }
- }
- return -1;
- }
- int ObjectTable::getClassFromGuid(GUID g) {
- GUID t;
- for (int i=0;i<classes.getNumItems();i++) {
- t = classes.enumItem(i)->classGuid;
- if (g == t)
- return classes.enumItem(i)->classid;
- }
- return -1;
- }
- const wchar_t *ObjectTable::getClassName(int classid) {
- class_entry *e =getClassEntry(classid);
- if (!e) return NULL;
- return e->classname;
- }
- int ObjectTable::isExternal(int classid) {
- for (int i=0;i<classes.getNumItems();i++)
- if (classes.enumItem(i)->classid == classid)
- return 1;
- return 0;
- }
- int ObjectTable::getNumGuids() {
- return classes.getNumItems();
- }
- GUID ObjectTable::enumGuid(int i) {
- return classes.enumItem(i)->classGuid;
- }
- const wchar_t *ObjectTable::enumClassName(int n) {
- return classes.enumItem(n)->classname;
- }
- int ObjectTable::getClassEntryIdx(int classid) {
- for (int i=0;i<classes.getNumItems();i++)
- if (classes[i]->classid == classid)
- return i;
- return -1;
- }
- int ObjectTable::isDescendant(int class1, int classid) {
- if (classid < CLASS_ID_BASE) return 0;
- if (class1 < CLASS_ID_BASE) return 0;
- class_entry *e = getClassEntry(classid);
- //CUT: class_entry *_e = getClassEntry(class1);
- while (e) {
- if (class1 == classid) return 1;
- e = getClassEntry(e->ancestorclassid);
- if (e) classid = e->classid;
- }
- return 0;
- }
- int ObjectTable::isClassInstantiable(int classid) {
- class_entry *e =getClassEntry(classid);
- if (!e) return 0;
- return e->instantiable;
- }
- int ObjectTable::isClassReferenceable(int classid) {
- class_entry *e =getClassEntry(classid);
- if (!e) return 0;
- return e->referenceable;
- }
- ScriptObject *ObjectTable::instantiate(int classid) {
- class_entry *e = getClassEntry(classid);
- if (!e) return NULL;
- ScriptObject *o = e->controller->instantiate();
- return o;
- }
- void *ObjectTable::encapsulate(int classid, ScriptObject *o) {
- class_entry *e = getClassEntry(classid);
- if (!e) return NULL;
- void *itf = e->controller->encapsulate(o);
- if (itf)
- o->vcpu_setInterface(e->classGuid, itf);
- return itf;
- }
- void ObjectTable::destroy(ScriptObject *o) {
- if (!o) return;
- class_entry *e = getClassEntry(getClassFromName(o->vcpu_getClassName()));
- if (!e) return;
- e->controller->destroy(o);
- }
- void ObjectTable::deencapsulate(int classid, void *o) {
- class_entry *e = getClassEntry(classid);
- if (!e) return;
- e->controller->deencapsulate(o);
- }
- const wchar_t *ObjectTable::getFunction(int dlfid, int *n, ScriptObjectController **p)
- {
- VCPUdlfEntry *e = VCPU::getGlobalDlfEntry(dlfid);
- if (p) *p = getClassEntry(e->basetype)->controller;
- if (n) *n = e->nparams;
- return e->functionName;
- }
- scriptVar ObjectTable::callFunction(ScriptObject *obj, int dlfid, scriptVar **params) {
- VCPUdlfEntry *e = VCPU::getGlobalDlfEntry(dlfid);
- VCPU::push(MAKE_SCRIPT_OBJECT(obj));
- for (int i=e->nparams-1;i>=0;i--)
- VCPU::push(*params[i]);
- return VCPU::callDLF(e, -1);
- }
- int ObjectTable::dlfAddRef(ScriptObjectController *o, const wchar_t *function_name, void *host)
- {
- ScriptObjectController *_o = o;
- while (_o) {
- const function_descriptor_struct *s = _o->getExportedFunctions();
- for (int i=0;i<_o->getNumFunctions();i++) {
- if (!WCSICMP(function_name, s[i].function_name)) {
- return dlfAddRef(_o, i, host);
- }
- }
- // function not found, see if ancestor has it
- _o = _o->getAncestorController();
- }
- ASSERTALWAYS(StringPrintf("Function %s not found in %s class object hierarchy", function_name, o->getClassName()));
- return -1;
- }
- int ObjectTable::dlfAddRef(ScriptObjectController *o, int i, void *host) {
- const function_descriptor_struct *s = o->getExportedFunctions();
- int id = VCPU::getDLFFromPointer(s[i].physical_ptr, s[i].nparams);
- if (id < 0) { // not yet set
- // allocate new vcpudlfentry and insert it in vcpu
- id = VCPU::newDlf();
- VCPUdlfEntry e;
- e.basetype = o->getClassId();
- e.DLFid = id;
- // DebugString(" s = %08X\n", s);
- // DebugString(" s[i] = %08X\n", s[i]);
- ASSERT(s != NULL);
- e.functionName = const_cast<wchar_t *>(s[i].function_name);
- // DebugString(" %s\n", e.functionName);
- e.nparams = s[i].nparams;
- e.ptr = s[i].physical_ptr;
- e.scriptId = -1;
- VCPU::setupDLFFunction(e.ptr, e.nparams, id, &e);
- }
- VCPU::DLF_addref(s[i].physical_ptr, s[i].nparams);
- if (host != NULL) {
- hostrefstruct *r = new hostrefstruct;
- r->host = host;
- r->nargs = s[i].nparams;
- r->ptr = s[i].physical_ptr;
- hostrefs.addItem(r);
- }
- return id;
- }
- void ObjectTable::dlfAddClassRef(ScriptObjectController *o, void *host) {
- // while (o) {
- //CUT: const function_descriptor_struct *s = o->getExportedFunctions();
- for (int i=0;i<o->getNumFunctions();i++) {
- dlfAddRef(o, i, host);
- }
- // o = o->getAncestorController();
- // }
- }
- void ObjectTable::dlfRemRef(void *host) {
- for (int i=0;i<hostrefs.getNumItems();i++) {
- hostrefstruct *r = hostrefs.enumItem(i);
- if (r->host == host) {
- //VCPU::DLF_remref(r->ptr, r->nargs); // TODO: re-enable after fixup
- delete r;
- hostrefs.removeByPos(i);
- i--;
- }
- }
- }
- int ObjectTable::checkScript(SystemObject *o) {
- TList<int> *l = o->getTypesList();
- if (!l) return 0;
- for (int i=0;i<l->getNumItems();i++) {
- if (l->enumItem(i) == -1) {
- //#ifdef WASABI_COMPILE_WNDMGR
- // WASABI_API_WNDMGR->messageBox("Error while loading a script, a component is missing", "Oops", 0, "", NULL);
- //#else
- // MessageBox(NULL, "Error while loading a script, a component is missing", "Oops", 0);
- //#endif
- // return 0;
- } else {
- }
- }
- return 1;
- }
- ScriptObjectController *ObjectTable::getController(GUID g) {
- int i = getClassFromGuid(g);
- if (i == -1) return NULL;
- class_entry *e = getClassEntry(i);
- if (e)
- return e->controller;
- return NULL;
- }
- class_entry *ObjectTable::getClassEntry(int classid) {
- for (int i=0;i<classes.getNumItems();i++)
- if (classes[i]->classid == classid)
- return classes[i];
- return NULL;
- }
- #ifdef _NOSTUDIO
- int ObjectTable::validateMember(int classid, char *member, ControlBlock *parms, int *ret) {
- ControlBlock *p = parms;
- int r=0;
- for (int i=0;i<classes.getNumItems();i++)
- if (classes.enumItem(i)->classid == classid) {
- const function_descriptor_struct *s = classes.enumItem(i)->controller->getExportedFunctions();
- for (int j=0;j<classes.enumItem(i)->controller->getNumFunctions();j++) {
- if (STRCASEEQL(s->function_name, member)) {
- if (s->nparams == 0 && parms)
- wrongParametersNumber(member, s->nparams);
- for (int k=0;k<s->nparams&&!r;k++) {
- int b = s->param[k];
- if (p == NULL) {
- wrongParametersNumber(member, s->nparams);
- }
- if (!::isDescendant(p, b)) {
- wrongParameterType(k, member, (char *)getClassName(p->getBaseClass()), (char *)getClassName(classid));
- }
- p = p->getNext();
- }
- *ret = tempExternalToInternal(s->return_type);
- return 1;
- }
- s++;
- }
- }
- return 0;
- }
- #endif
- //-----
- PtrList < class_entry > ObjectTable::classes;
- PtrList < hostrefstruct > ObjectTable::hostrefs;
- int ObjectTable::classidx = 0;
- int ObjectTable::externalloaded = 0;
- #endif
|