diff options
author | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
---|---|---|
committer | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
commit | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Wasabi/api/script/objecttable.h | |
parent | 537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff) | |
download | winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz |
Initial community commit
Diffstat (limited to 'Src/Wasabi/api/script/objecttable.h')
-rw-r--r-- | Src/Wasabi/api/script/objecttable.h | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/Src/Wasabi/api/script/objecttable.h b/Src/Wasabi/api/script/objecttable.h new file mode 100644 index 00000000..d0ab4c38 --- /dev/null +++ b/Src/Wasabi/api/script/objecttable.h @@ -0,0 +1,144 @@ +#ifndef __OBJECTTABLE +#define __OBJECTTABLE + +#ifdef __cplusplus + +#include <wasabicfg.h> + +#include <bfc/ptrlist.h> +class ScriptObjectController; + +#ifdef _NOSTUDIO +//CUT #include "../../scriptcompiler/compiler.h" +//CUT #include "../../scriptcompiler/ctrlblock.h" +#endif + +#endif + +#include <api/script/vcputypes.h> + +#define CLASS_ID_BASE 0x100 + + +#define MAKE_NEW_OBJECT(class, objclass) \ + case class: \ + s = new objclass; \ + objclass::instantiate((objclass *)s); \ + break; + +// For type names table +typedef struct { + wchar_t *name; + int type; + int instantiable; + int referenceable; +} typenames; + +// This is the table that link type names as they are +// recognized in scripts to actual basic types. + +// Non instantiable means you can't do v = new <type> +// Non referenceable means you can't do <type> v; +// Not a ref means content is not a reference to an object but rather the actual +// content itself +// * special case for strings which is a ref to a char *, but not an object +#define DEFINE_TYPES \ +typenames types[] = { \ + {L"", SCRIPT_VOID, 0, 0}, /* Non instantiable, non referenceable */ \ + {L"Event", SCRIPT_EVENT, 0, 0}, /* Non instantiable, non referenceable */ \ + {L"Int", SCRIPT_INT, 0, 1}, /* Not a ref */ \ + {L"Float", SCRIPT_FLOAT, 0, 1}, /* Not a ref */ \ + {L"Double", SCRIPT_DOUBLE, 0, 1}, /* Not a ref */ \ + {L"Boolean", SCRIPT_BOOLEAN, 0, 1}, /* Not a ref */ \ + {L"String", SCRIPT_STRING, 0, 1}, /* Not a ref (* special case) */ \ + {L"Any", SCRIPT_ANY, 0, 1}, /* Non instantiable, non referenceable */ \ +}; \ +int ntypes = sizeof(types)/sizeof(typenames); + +extern typenames types[]; +extern int ntypes; + +#define SVC_CLASS_BASE 1024 + +#ifdef __cplusplus + +class class_entry { +public: + const wchar_t *classname; + int classid; + int ancestorclassid; + ScriptObjectController *controller; + GUID classGuid; + int instantiable; + int referenceable; + int external; + waServiceFactory *sf; +}; + +typedef struct { + void *ptr; + int nargs; + void *host; +} hostrefstruct; + +class SystemObject; + +class ObjectTable { + + public : + + static void start(); // initialize tables, internal objects... + static void shutdown(); // free tables + static void unloadExternalClasses(); // unload external classes + static void loadExternalClasses(); // reload external classes + + static int registerClass(ScriptObjectController *c, waServiceFactory *sf = NULL); // returns classid. ancestorclass = 0 = Object + +// static void instantiate(ScriptObject *o, int classid); + static int addrefDLF(VCPUdlfEntry *dlf, int id); + static void delrefDLF(VCPUdlfEntry *dlf); + static void resetDLF(VCPUdlfEntry *dlf); + + static int getClassFromName(const wchar_t *classname); + static int getClassFromGuid(GUID g); + static const wchar_t *getClassName(int classid); + static int isExternal(int classid); + static int getNumGuids(); + static GUID enumGuid(int i); + static const wchar_t *enumClassName(int n); + static int getClassEntryIdx(int classid); + static int isDescendant(int class1, int classid); + static int isClassInstantiable(int classid); + static int isClassReferenceable(int classid); + static ScriptObject *instantiate(int classid); + static void *encapsulate(int classid, ScriptObject *o); + static void destroy(ScriptObject *o); + static void deencapsulate(int classid, void *o); + static const wchar_t *getFunction(int dlfid, int *n, ScriptObjectController **p); + static scriptVar callFunction(ScriptObject *obj, int dlfid, scriptVar **params); + static int dlfAddRef(ScriptObjectController *o, const wchar_t *function_name, void *host); + static int dlfAddRef(ScriptObjectController *o, int i, void *host); + static void dlfAddClassRef(ScriptObjectController *o, void *host); + static void dlfRemRef(void *host); + static int checkScript(SystemObject *o); + static ScriptObjectController *getController(GUID g); + static class_entry *getClassEntry(int classid); + static void unlinkClass(class_entry *e); + +#ifdef _NOSTUDIO + static int validateMember(int classid, wchar_t *member, ControlBlock *parms, int *ret); +#endif + + private: + + static PtrList < class_entry > classes; + static PtrList < hostrefstruct > hostrefs; + static int classidx; + static int externalloaded; +}; + +#endif + +#endif + + |