00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef LUMIERA_INTERFACE_H
00022 #define LUMIERA_INTERFACE_H
00023
00024 #include "lib/luid.h"
00025 #include "lib/ppmpl.h"
00026 #include "lib/psplay.h"
00027
00028
00029
00089
00090
00091
00092
00098 #define LUMIERA_INTERFACE_INAME(name, version) name##_##version
00099
00107 #define LUMIERA_INTERFACE_DNAME(iname, version, dname) PPMPL_CAT (LUMIERA_INTERFACE_INAME (iname, version), _##dname)
00108
00116 #define LUMIERA_INTERFACE_DSTRING(iname, version, dname) PPMPL_STRINGIFY (LUMIERA_INTERFACE_DNAME (iname, version, dname))
00117
00124 #define LUMIERA_INTERFACE_REF(iname, version, dname) \
00125 (LumieraInterface)&LUMIERA_INTERFACE_DNAME(iname, version, dname)
00126
00127
00133 #define LUMIERA_INTERFACE_TYPE(name, version) struct LUMIERA_INTERFACE_INAME(name, version)
00134
00135
00142 #define LUMIERA_INTERFACE_CAST(name, version) (LUMIERA_INTERFACE_TYPE(name, version)*)
00143
00144
00159 #define LUMIERA_INTERFACE_DECLARE(name, version, ...) \
00160 LUMIERA_INTERFACE_TYPE(name, version) \
00161 { \
00162 lumiera_interface interface_header_; \
00163 PPMPL_FOREACH(_, __VA_ARGS__) \
00164 }
00165
00172 #define PPMPL_FOREACH_LUMIERA_INTERFACE_SLOT(ret, name, params) \
00173 ret (*name) params; \
00174 lumiera_uid name##_uid;
00175
00176
00177
00178
00179
00180
00191 #define LUMIERA_INTERFACE_INSTANCE(iname, version, name, descriptor, acquire, release, ...) \
00192 PPMPL_FOREACH(_P1_, __VA_ARGS__) \
00193 LUMIERA_INTERFACE_TYPE(iname, version) LUMIERA_INTERFACE_DNAME(iname, version, name) = \
00194 { \
00195 { \
00196 #iname, \
00197 version, \
00198 #name, \
00199 sizeof (LUMIERA_INTERFACE_TYPE(iname, version)), \
00200 descriptor, \
00201 acquire, \
00202 release \
00203 }, \
00204 PPMPL_FOREACH(_P2_, __VA_ARGS__) \
00205 }
00206
00207
00218 #define PPMPL_FOREACH_P1_LUMIERA_INTERFACE_MAP(slot, luid, function)
00219 #ifdef __cplusplus
00220 #define PPMPL_FOREACH_P2_LUMIERA_INTERFACE_MAP(slot, luid, function) \
00221 function, LUMIERA_UID_INITIALIZER (luid),
00222 #else
00223 #define PPMPL_FOREACH_P2_LUMIERA_INTERFACE_MAP(slot, luid, function) \
00224 .slot = function, .slot##_uid = LUMIERA_UID_INITIALIZER (luid),
00225 #endif
00226
00227
00240 #define PPMPL_FOREACH_P1_LUMIERA_INTERFACE_INLINE(slot, luid, ret, params, ...) \
00241 static ret \
00242 LUMIERA_INTERFACE_INLINE_NAME(slot) params \
00243 __VA_ARGS__
00244
00245 #ifdef __cplusplus
00246 #define PPMPL_FOREACH_P2_LUMIERA_INTERFACE_INLINE(slot, luid, ret, params, ...) \
00247 LUMIERA_INTERFACE_INLINE_NAME(slot), LUMIERA_UID_INITIALIZER (luid),
00248 #else
00249 #define PPMPL_FOREACH_P2_LUMIERA_INTERFACE_INLINE(slot, luid, ret, params, ...) \
00250 .slot = LUMIERA_INTERFACE_INLINE_NAME(slot), .slot##_uid = LUMIERA_UID_INITIALIZER (luid),
00251 #endif
00252
00253 #define LUMIERA_INTERFACE_INLINE_NAME(slot) PPMPL_CAT(lumiera_##slot##_l, __LINE__)
00254
00255
00256 #define PPMPL_FOREACH_L1_P1_LUMIERA_INTERFACE_DEFINE(iname, version, name, descriptor, acquire, release, ...) \
00257 LUMIERA_INTERFACE_INSTANCE (iname, version, \
00258 name, \
00259 descriptor, \
00260 acquire, \
00261 release, \
00262 __VA_ARGS__ \
00263 );
00264
00265
00266 #define PPMPL_FOREACH_L1_P2_LUMIERA_INTERFACE_DEFINE(iname, version, name, descriptor, acquire, release, ...) \
00267 &LUMIERA_INTERFACE_DNAME(iname, version, name).interface_header_,
00268
00269
00279 #define LUMIERA_EXPORT(...) \
00280 PPMPL_FOREACH_L1(_P1_, __VA_ARGS__) \
00281 static LumieraInterface* \
00282 lumiera_plugin_interfaces (void) \
00283 { \
00284 static LumieraInterface interfaces[] = \
00285 { \
00286 PPMPL_FOREACH_L1(_P2_, __VA_ARGS__) \
00287 NULL \
00288 }; \
00289 return interfaces; \
00290 } \
00291 LUMIERA_PLUGININTERFACE
00292
00293
00297 #ifdef LUMIERA_PLUGIN
00298 #define LUMIERA_PLUGIN_INTERFACEHANDLE static LUMIERA_INTERFACE_HANDLE(lumieraorg_interface, 0) lumiera_interface_handle
00299 #define LUMIERA_PLUGIN_STORE_INTERFACEHANDLE(name) lumiera_interface_handle = LUMIERA_INTERFACE_CAST (lumieraorg_interface, 0) name
00300
00301 #define LUMIERA_PLUGININTERFACE \
00302 LUMIERA_INTERFACE_INSTANCE (lumieraorg__plugin, 0, \
00303 lumieraorg_plugin, \
00304 NULL, \
00305 NULL, \
00306 NULL, \
00307 LUMIERA_INTERFACE_MAP (plugin_interfaces, \
00308 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", \
00309 lumiera_plugin_interfaces) \
00310 );
00311 #define LUMIERA_INTERFACE_REGISTEREXPORTED
00312 #define LUMIERA_INTERFACE_UNREGISTEREXPORTED
00313
00314 #define LUMIERA_INTERFACE_OPEN(interface, version, minminor, name) \
00315 LUMIERA_INTERFACE_CAST(interface, version) lumiera_interface_handle->open (#interface, version, minminor, #name)
00316
00317 #define LUMIERA_INTERFACE_CLOSE(handle) \
00318 lumiera_interface_handle->close (&(handle)->interface_header_)
00319
00320
00321 #else
00322
00323 #define LUMIERA_PLUGIN_INTERFACEHANDLE static LUMIERA_INTERFACE_HANDLE(lumieraorg_interface, 0) lumiera_interface_handle
00324 #define LUMIERA_PLUGIN_STORE_INTERFACEHANDLE(name) lumiera_interface_handle = LUMIERA_INTERFACE_CAST (lumieraorg_interface, 0) name
00325
00326 #define LUMIERA_PLUGININTERFACE
00327
00331 #define LUMIERA_INTERFACE_REGISTEREXPORTED \
00332 lumiera_interfaceregistry_bulkregister_interfaces (lumiera_plugin_interfaces(), NULL)
00333
00337 #define LUMIERA_INTERFACE_UNREGISTEREXPORTED \
00338 lumiera_interfaceregistry_bulkremove_interfaces (lumiera_plugin_interfaces())
00339
00340 #define LUMIERA_INTERFACE_OPEN(interface, version, minminor, name) \
00341 LUMIERA_INTERFACE_CAST(interface, version) lumiera_interface_open (#interface, version, minminor, #name)
00342
00343 #define LUMIERA_INTERFACE_CLOSE(handle) \
00344 lumiera_interface_close (&(handle)->interface_header_)
00345
00346 #endif
00347
00348
00349
00354 #define LUMIERA_INTERFACE_HANDLE(interface, version) \
00355 LUMIERA_INTERFACE_TYPE(interface, version)*
00356
00357
00358 typedef struct lumiera_interfaceslot_struct lumiera_interfaceslot;
00359 typedef lumiera_interfaceslot* LumieraInterfaceslot;
00360
00361 typedef struct lumiera_interface_struct lumiera_interface;
00362 typedef lumiera_interface* LumieraInterface;
00363
00369 struct lumiera_interfaceslot_struct
00370 {
00371 void (*func)(void);
00372 lumiera_uid uid;
00373 };
00374
00375
00379 struct lumiera_interface_struct
00380 {
00382 const char* interface;
00383
00385 unsigned version;
00386
00388 const char* name;
00389
00391 size_t size;
00392
00394 LumieraInterface descriptor;
00395
00405 LumieraInterface (*acquire)(LumieraInterface self, LumieraInterface interfaces);
00411 void (*release)(LumieraInterface self);
00412
00413 #ifndef __cplusplus
00414
00415 lumiera_interfaceslot functions[];
00416 #endif
00417 };
00418
00419
00420
00421
00422
00432 LumieraInterface
00433 lumiera_interface_open (const char* interface, unsigned version, size_t minminorversion, const char* name);
00434
00440 void
00441 lumiera_interface_close (LumieraInterface self);
00442
00449 unsigned
00450 lumiera_interface_version (LumieraInterface self, const char* iname);
00451
00455 LUMIERA_INTERFACE_DECLARE (lumieraorg_interface, 0,
00456 LUMIERA_INTERFACE_SLOT (LumieraInterface,
00457 open,
00458 (const char* interface, unsigned version, size_t minminorversion, const char* name)),
00459 LUMIERA_INTERFACE_SLOT (void, close, (LumieraInterface self)),
00460 LUMIERA_INTERFACE_SLOT (unsigned, version, (LumieraInterface self, const char* iname)),
00461 );
00462
00466 void
00467 lumiera_interface_init (void);
00468
00472 void
00473 lumiera_interface_destroy (void);
00474
00475
00476
00477
00478
00482 LUMIERA_INTERFACE_DECLARE (lumieraorg__plugin, 0,
00483 LUMIERA_INTERFACE_SLOT (LumieraInterface*, plugin_interfaces, (void)),
00484 );
00485
00486
00487
00488 #endif
00489
00490
00491
00492
00493
00494
00495