00001 #ifndef __UPF_ABI_H__
00002 #define __UPF_ABI_H__
00003
00004 #include <stdlib.h>
00005 #include <string.h>
00006
00007 #include <upf/platform.h>
00008 #include <upf/version.h>
00009 #include <upf/context.h>
00010
00011 #if defined(__UPF_UNIX__)
00012
00013
00014 #include <stdint.h>
00015 typedef uint8_t upf_uint8_t;
00016 typedef uint16_t upf_uint16_t;
00017 typedef uint32_t upf_uint32_t;
00018 #elif defined(__UPF_WIN32__)
00019 typedef unsigned char upf_uint8_t;
00020 typedef unsigned short upf_uint16_t;
00021 typedef unsigned upf_uint32_t;
00022 #endif
00023
00024
00025
00026
00027
00028 #ifdef __cplusplus
00029 extern "C" {
00030 #endif
00031
00032 #if defined(_UPF_PRAGMA_PACK_GNU)
00033 #pragma pack(1)
00034 #elif defined(_UPF_PRAGMA_PACK_WIN32)
00035 #pragma pack(push,1)
00036 #else
00037 #error "Must specify packed structs pragma for your compiler!"
00038 #endif
00039
00040 struct _upf_Object;
00041
00042
00043
00044
00045 #define _UPF_ARGUMENTS_CHUNK_SIZE 512
00046
00047 typedef struct _upf_ArgumentsChunk
00048 {
00049 upf_uint8_t storage[_UPF_ARGUMENTS_CHUNK_SIZE];
00050 struct _upf_ArgumentsChunk *next;
00051 } upf_ArgumentsChunk;
00052
00053 typedef struct
00054 {
00055 size_t size;
00056 unsigned chunkPos;
00057 unsigned totalPos;
00058 upf_ArgumentsChunk *currChunk;
00059 upf_ArgumentsChunk data;
00060 } upf_Arguments;
00061
00062 typedef struct
00063 {
00064 upf_uint32_t data1, data2, data3, data4;
00065 upf_uint16_t version_major;
00066 upf_uint16_t version_minor;
00067 } upf_IID;
00068
00069 typedef upf_uint32_t upf_CID;
00070
00071 #define UPF_CHECK_IID(requested, available) \
00072 ((requested).data1 == (available).data1 && \
00073 (requested).data2 == (available).data2 && \
00074 (requested).data3 == (available).data3 && \
00075 (requested).data4 == (available).data4 && \
00076 (requested).version_major == (available).version_major && \
00077 (requested).version_minor <= (available).version_minor)
00078
00079
00080 typedef unsigned int upf_MethodID;
00081 typedef unsigned int upf_ContextID;
00082
00083 typedef void (_UPF_CALLING_CONVENTION *upf_DispatchFunction)(void*,
00084 upf_MethodID,
00085 upf_Arguments*);
00086
00087 typedef struct
00088 {
00089 void* data;
00090 upf_DispatchFunction function;
00091 } upf_InterfaceData;
00092
00093
00094
00095
00096
00097 typedef void (_UPF_CALLING_CONVENTION *upf_QueryInterfaceFunction)(
00098 struct _upf_Object *object,
00099 const upf_IID* iface,
00100 upf_InterfaceData *retval);
00101
00102 typedef struct _upf_Object
00103 {
00104 upf_QueryInterfaceFunction queryInterface;
00105 void *data;
00106 upf_ContextID nativeContext;
00107 unsigned long refCnt;
00108 } upf_Object;
00109
00110
00111 typedef struct
00112 {
00113 unsigned long ABI_version;
00114 upf_Object* manager;
00115 upf_Object* serviceManager;
00116
00117 struct
00118 {
00119 upf_Object* (_UPF_CALLING_CONVENTION *create_instance)(upf_CID classID);
00120 void (_UPF_CALLING_CONVENTION *marchaller_init)(upf_Arguments *args);
00121 void (_UPF_CALLING_CONVENTION *marchaller_seek0)(upf_Arguments *args);
00122 void (_UPF_CALLING_CONVENTION *marchaller_destroy)(upf_Arguments *args);
00123 void (_UPF_CALLING_CONVENTION *marchaller_write)(upf_Arguments *args, void *data, size_t len);
00124 void (_UPF_CALLING_CONVENTION *marchaller_read)(upf_Arguments *args, void *data, size_t len);
00125 upf_ContextID (_UPF_CALLING_CONVENTION *get_context)(const char *context_string);
00126 upf_CID (_UPF_CALLING_CONVENTION *alloc_new_cid)(void);
00127 upf_CID (_UPF_CALLING_CONVENTION *classname_to_cid)(const char *classname);
00128 int (_UPF_CALLING_CONVENTION *merge_typeinfo)(const upf_uint8_t *typeinfo);
00129 } funcs;
00130 } upf_middlewareLayer;
00131
00132 #if defined(_UPF_PRAGMA_PACK_GNU)
00133 #pragma pack()
00134 #elif defined(_UPF_PRAGMA_PACK_WIN32)
00135 #pragma pack(pop)
00136 #else
00137 #error "Must specify packed structs pragma for your compiler!"
00138 #endif
00139
00140
00141 #ifdef __cplusplus
00142 }
00143 #endif
00144
00145 #ifdef __cplusplus
00146 #define _UPF_EXTERN_C extern "C"
00147 #define _UPF_EXTERN extern "C"
00148 #else
00149 #define _UPF_EXTERN_C
00150 #define _UPF_EXTERN extern
00151 #endif
00152
00153
00154
00155
00156
00157
00158
00159
00160 #ifdef __cplusplus
00161 extern "C" {
00162 #endif
00163
00164 #ifdef UPF_BUILDING_MODULE
00165 _UPF_EXTERN upf_middlewareLayer *upf_middleware;
00166
00167
00168
00169
00170 _UPF_EXTERN upf_ContextID __upf_module_context;
00171 #define upf_context __upf_module_context
00172 #else
00173 _UPF_EXPORTED_SYMBOL upf_middlewareLayer *upf_middleware;
00174 #define upf_init() upf_init_(UPF_RUNTIME_CONTEXT)
00175 _UPF_EXPORTED_SYMBOL int _UPF_CALLING_CONVENTION upf_init_(const char *app_context);
00176 _UPF_EXPORTED_SYMBOL int _UPF_CALLING_CONVENTION upf_done(void);
00177 _UPF_EXPORTED_SYMBOL upf_ContextID upf_context;
00178
00179 #ifdef UPF_BUILDING_CORE
00180
00181
00182 _UPF_EXTERN upf_ContextID __upf_internal_context;
00183 #define upf_context __upf_internal_context
00184 #endif
00185 #endif
00186
00187
00188 #ifdef __cplusplus
00189 }
00190 #endif
00191
00192
00193
00194
00195
00196
00197
00198 #define _UPF_DLL_ACTION_INIT_CLASSES 0
00199 #define _UPF_DLL_ACTION_LOAD 1
00200 #define _UPF_DLL_ACTION_UNLOAD 2
00201
00202 #define _UPF_DLL_ENTRY_POINT __upf_DllEntryPoint
00203 #define _UPF_DLL_ENTRY_POINT_NAME _UPF_STRINGIZE(_UPF_DLL_ENTRY_POINT)
00204 typedef int (_UPF_CALLING_CONVENTION * _upf_dllEntryPointFunc)(
00205 upf_middlewareLayer *middleware,
00206 int action
00207 );
00208
00209
00210 #endif