5 Copyright © 1995-2011, The AROS Development Team. All rights reserved.
13 # include <exec/lists.h>
16 #ifndef EXEC_LIBRARIES_H
17 # include <exec/libraries.h>
20 #ifndef EXEC_SEMAPHORES_H
21 # include <exec/semaphores.h>
25 # include <dos/bptr.h>
28 #ifndef UTILITY_TAGITEM_H
29 # include <utility/tagitem.h>
47 #define NUM_METHOD_BITS 10
48 #define METHOD_MASK ((1 << NUM_METHOD_BITS) - 1)
51 /* These are used to index an array in the library base
52 from which we get the IDs for the used interfaces.
67 /* Used by the internal GetIDs() functions, to get several
79 /* defines used to access the interface IDs stored in the library base */
81 #define __IRoot (GetOBase(OOPBase)->ob_InternIDs[IDX_IRoot])
82 #define __IMeta (GetOBase(OOPBase)->ob_InternIDs[IDX_IMeta])
83 #define __IMethod (GetOBase(OOPBase)->ob_InternIDs[IDX_IMethod])
84 #define __IServer (GetOBase(OOPBase)->ob_InternIDs[IDX_IServer])
85 #define __IProxy (GetOBase(OOPBase)->ob_InternIDs[IDX_IProxy])
86 #define __IInterface (GetOBase(OOPBase)->ob_InternIDs[IDX_IInterface])
88 #define GetOBase(lib) ((struct IntOOPBase *)(lib))
94 BOOL
GetIDs(struct IDDescr
*idDesr
, struct IntOOPBase
*OOPBase
);
98 BOOL
init_rootclass(struct IntOOPBase
*OOPBase
);
101 BOOL
init_basemeta(struct IntOOPBase
*OOPBase
);
102 BOOL
init_ifmetaclass(struct IntOOPBase
*OOPBase
);
105 OOP_Class
*init_methodclass(struct IntOOPBase
*OOPBase
);
108 OOP_Class
*init_serverclass(struct Library
*OOPBase
);
111 OOP_Class
*init_proxyclass(struct Library
*OOPBase
);
113 /* interfaceclass.c */
114 OOP_Class
*init_interfaceclass(struct Library
*OOPBase
);
117 OOP_Class
*init_hiddmetaclass(struct IntOOPBase
*OOPBase
);
120 BOOL
hasinterface(OOP_Class
*cl
, CONST_STRPTR interface_id
);
121 struct IFMethod
*findinterface(OOP_Class
*cl
, CONST_STRPTR interface_id
);
122 struct IFMethod
*findmethod(OOP_Class
*cl
, CONST_STRPTR interface_id
, ULONG method_offset
);
123 BOOL
init_methodbase(CONST_STRPTR interface_id
, ULONG methodbase
, ULONG
*methodbase_ptr
, struct IntOOPBase
*OOPBase
);
124 BOOL
init_mi_methodbase(CONST_STRPTR interface_id
, ULONG
*methodbase_ptr
, struct IntOOPBase
*OOPBase
);
125 VOID
release_idbucket(CONST_STRPTR interface_id
, struct IntOOPBase
*OOPBase
);
126 VOID
obtain_idbucket(CONST_STRPTR interface_id
, struct IntOOPBase
*OOPBase
);
131 /* Bucket for hashtable used to map string interface IDs to
132 ** numeric interface IDs and attrbases.
137 struct iid_bucket
*next
;
138 STRPTR interface_id
; /* Not CONST, since it is expected to be freed */
147 * Definition of bucket for hashtable used to store
148 * the interfaces (method tables).
149 * InterfaceID must be an IPTR, because it's IPTR in generic struct Bucket
155 struct IFBucket
*Next
;
157 CONST_STRPTR GlobalInterfaceID
;
158 struct IFMethod
*MethodTable
;
163 /* Definition of an entry in a method table.
164 ** Ie. the method tables are arrays of these.
165 ** One has to store the class for each method
166 ** because we skip unimplemented class calls, and
167 ** therefore a method can go directly to a parent
168 ** class of OCLASS(o)
173 IPTR (*MethodFunc
)();
178 /* Message struct used for sending object message structs across
183 struct Message pm_Message
;
186 OOP_Object
*pm_Object
;
189 /* Listnode that helps keeping track of servers. */
193 OOP_Object
*sn_Server
;
197 /* Instance data of base metaclass and rootclass */
201 OOP_Class
public; /* public part of class objects */
205 BOOL disptabs_inited
;
210 #define MD(x) ((struct metadata *)x)
212 #define NUM_BASEMETA_IFS 2
213 struct basemetaobject
/* Real instance data of the base meta class */
215 OOP_Class
*oclass
; /* The meta object's class */
218 struct metadata data
;
219 struct IFMethod
*iftable
[NUM_BASEMETA_IFS
]; /* has two interfaces: root and meta */
221 /* The interface tables */
222 struct IFMethod rootif
[num_Root_Methods
];
223 struct IFMethod metaif
[NUMTOTAL_M_Meta
];
227 struct rootclassobject
229 OOP_Class
*oclass
; /* The rootclass object's class */
232 struct metadata data
;
233 struct IFMethod rootif
[num_Root_Methods
];
243 /* The hashtable containing the interfaces (method tables) */
244 struct HashTable
*iftable
;
246 /* A direct pointer into the hashtable, for faster lookup */
247 struct IFBucket
**iftab_directptr
;
249 /* Used by the hash function. As the above field, it is put
254 /* Number of interfaces in the hashtable */
262 OOP_Class
*oclass
; /* The interface metaclass' class (itself) */
265 struct metadata base
;
266 struct ifmeta_data data
;
273 /*************************
274 ** Library Base struct **
275 *************************/
278 struct Library ob_LibNode
;
280 struct SignalSemaphore ob_ClassListLock
;
281 struct MinList ob_ClassList
;
283 struct SignalSemaphore ob_ServerListLock
;
284 struct MinList ob_ServerList
;
286 /* rootclass object */
287 struct rootclassobject ob_RootClassObject
;
289 /* base metaclass object */
290 struct basemetaobject ob_BaseMetaObject
;
292 /* interface metaclass object */
293 struct ifmetaobject ob_IFMetaObject
;
296 OOP_Class
*ob_HIDDMetaClass
;
298 /* Store pointers to some usefull classes here */
299 OOP_Class
*ob_MethodClass
;
300 OOP_Class
*ob_ServerClass
;
301 OOP_Class
*ob_ProxyClass
;
302 OOP_Class
*ob_InterfaceClass
;
304 /* Hashtable containing string interface ID => Numeric interface
305 ** ID mappings. Used by GetMethodID() and GetAttrBase()
307 struct HashTable
* ob_IIDTable
;
308 struct SignalSemaphore ob_IIDTableLock
;
310 /* The currently lowest available numeric interfaceID that
311 ** we can map a new interface string ID onto.
315 ULONG ob_CurrentMethodBase
;
316 ULONG ob_CurrentAttrBase
;
318 /* An array of the interface IDs used internally. */
319 ULONG ob_InternIDs
[NUM_Indexes
];
321 /* We use UtilityBase frequently */
322 struct Library
*ob_UtilityBase
;
324 /* Commonly used method IDs */
325 OOP_MethodID ob_mRoot_Set
;
326 OOP_MethodID ob_mRoot_Get
;
327 OOP_MethodID ob_M_meta_allocdisptabs
;
328 OOP_MethodID ob_M_meta_freedisptabs
;
329 OOP_MethodID ob_M_meta_iterateifs
;
330 OOP_MethodID ob_M_meta_getifinfo
;
331 OOP_MethodID ob_M_meta_findmethod
;
334 #define ROOTCLASSPTR (& (OOPBase)->ob_RootClassObject.inst.data.public)
335 #define BASEMETAPTR (& (OOPBase)->ob_BaseMetaObject.inst.data.public)
337 #endif /* INTERN_H */