diff options
Diffstat (limited to 'src/libs/cdp/cdpapi.h')
-rw-r--r-- | src/libs/cdp/cdpapi.h | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/src/libs/cdp/cdpapi.h b/src/libs/cdp/cdpapi.h new file mode 100644 index 0000000..e1a0e0b --- /dev/null +++ b/src/libs/cdp/cdpapi.h @@ -0,0 +1,154 @@ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * Nota bene: later versions of the GNU General Public License do not apply + * to this program. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +/* + * CDP API declarations + * the API is used by both the engine and modules + */ + +#ifndef LIBS_CDP_CDPAPI_H_ +#define LIBS_CDP_CDPAPI_H_ + +#include "types.h" + +typedef enum +{ + CDPAPI_VERSION_1 = 0x00000001, // version 0.1 + + CDPAPI_VERSION = CDPAPI_VERSION_1, + CDPAPI_VERSION_MIN = CDPAPI_VERSION_1, + +} cdp_ApiVersion; + +typedef enum +{ + CDPERR_NONE = 0, + CDPERR_UKNOWN = 1, + CDPERR_NOT_FOUND = 2, + CDPERR_BAD_MODULE = 3, + CDPERR_OLD_VER = 4, + CDPERR_UNKNOWN_VER = 5, + CDPERR_TOO_MANY = 6, + CDPERR_INIT_FAILED = 7, + CDPERR_NO_ITF = 8, + CDPERR_DUPE_ITF = 9, + CDPERR_NO_EVENT = 10, + CDPERR_DUPE_EVENT = 11, + CDPERR_OTHER = 1000, + +} cdp_Error; + +typedef struct cdp_Module cdp_Module; +typedef void cdp_Itf; +typedef struct cdp_ItfReg cdp_ItfReg; + +// Interface KINDs - for convinience and uniformity +#define CDPITF_KIND_INVALID NULL +#define CDPITF_KIND_HOST "UQM.Host" +#define CDPITF_KIND_MEMORY "UQM.Memory" +#define CDPITF_KIND_IO "UQM.IO" +#define CDPITF_KIND_THREADS "UQM.Threads" +#define CDPITF_KIND_TIME "UQM.Time" +#define CDPITF_KIND_INPUT "UQM.Input" +#define CDPITF_KIND_TASK "UQM.Task" +#define CDPITF_KIND_RESOURCE "UQM.Resource" +#define CDPITF_KIND_SOUND "UQM.Sound" +#define CDPITF_KIND_VIDEO "UQM.Video" +#define CDPITF_KIND_GFX "UQM.Gfx" +#define CDPITF_KIND_MIXER "UQM.Mixer" + +// Interface definition structure +// pass an array of these to Host->GetItfs() for batch lookup +// pass an array of these to Host->RegisterItfs() for batch registration +typedef struct +{ + // fill in the first 4 members for batch registration + // fill in the 1st member for batch lookup + // terminate an array of these defs with name == NULL + const char* name; // interface ID + cdp_Itf* itf; // interface pointer + cdp_ApiVersion ver_from; // lowest supported version + cdp_ApiVersion ver_to; // highest supported version + + cdp_Module* module; // owner module + // the following member is only set during registration + cdp_ItfReg* reg; // registration handle (not set on lookup) + +} cdp_ItfDef; + +typedef unsigned int cdp_Event; +typedef struct cdp_EventReg cdp_EventReg; +typedef intptr_t cdp_EventResult; + +#define CDP_EVENT_INVALID (-1) + // used with cdp_Event + +typedef cdp_EventResult (* cdp_EventProc) + (cdp_Event, uint32, void*, bool* pbHandled); + +// Event definition structure +// pass an array of these to Host->GetItfs() for batch lookup +typedef struct +{ + // fill in the 1st member for batch lookup or registration + // also fill in the 2nd member for batch subscription + // terminate an array of these defs with name == NULL + const char* name; // event ID + cdp_EventProc proc; // event proc, set to NULL for no bind + + cdp_Event event; // subscribable event handle + cdp_Module* module; // owner module + // the following member is only set during registration + cdp_EventReg* reg; // registration handle (not set on lookup) + +} cdp_EventDef; + +// Host Interface +// the main itf of the API, it is passed to a loaded module +// module does everything else through this itf and itfs +// acquired through this itf +typedef struct +{ + uint32 (* GetApiVersion) (void); + uint32 (* GetVersion) (void); + cdp_Error (* GetApiError) (void); + cdp_Itf* (* GetItf) (const char* name); + bool (* GetItfs) (cdp_ItfDef* defs); + cdp_ItfReg* (* RegisterItf) (const char* name, + cdp_ApiVersion ver_from, cdp_ApiVersion ver_to, + cdp_Itf*, cdp_Module*); + void (* UnregisterItf) (cdp_ItfReg*); + bool (* RegisterItfs) (cdp_ItfDef* defs, cdp_Module*); + void (* UnregisterItfs) (cdp_ItfDef* defs); + cdp_Event (* GetEvent) (const char* name); + bool (* GetEvents) (cdp_EventDef* defs); + cdp_EventReg* (* RegisterEvent) (const char* name, cdp_Module*); + void (* UnregisterEvent) (cdp_EventReg*); + bool (* RegisterEvents) (cdp_EventDef* defs, cdp_Module*); + void (* UnregisterEvents) (cdp_EventDef* defs); + bool (* SubscribeEvent) (cdp_Event, cdp_EventProc, cdp_Module*); + void (* UnsubscribeEvent) (cdp_Event, cdp_EventProc); + bool (* SubscribeEvents) (cdp_EventDef* defs, cdp_Module*); + void (* UnsubscribeEvents) (cdp_EventDef* defs); + cdp_EventResult (* FireEvent) (cdp_EventReg*, uint32, void*); + +} cdp_Itf_HostVtbl_v1; + +typedef cdp_Itf_HostVtbl_v1 cdp_Itf_HostVtbl; +typedef cdp_Itf_HostVtbl cdp_Itf_Host; + +#endif /* LIBS_CDP_CDPAPI_H_ */ |