winamp/Src/Wasabi/api/script/objecttable.h

145 lines
4.2 KiB
C++

#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