Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

abi.h

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     /* FIXME:
00013      * use something like HAVE_STDINT_H (but independent of config.h!) */
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                               ABI data structures
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 /* This should be defined to some reasonable value because it is allocated
00044    on the *stack* every time a method is called: */
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; /* used only for safety checks */
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 /* NB: queryInterface function returns its return value via 'retval' parameter
00094        on purpose! We can't return structures in binary compatible way (Borland
00095        is known to use different mechanism from MSVC and Mingw even when __cdecl
00096        or __stdcall is specified). */
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                               UPF public API
00158    ---------------------------------------------------------------------- */
00159 
00160 #ifdef __cplusplus
00161 extern "C" {
00162 #endif
00163 
00164 #ifdef UPF_BUILDING_MODULE
00165     _UPF_EXTERN upf_middlewareLayer *upf_middleware;
00166     /* NB: we can't use same symbol name for upf_context because 
00167            ELF linker would merge all the symbols from .so plugins
00168            into the symbol defined in libupf.so
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         /* NB: for the same reason, we want to use distinct upf_context
00181                for libupf itself. */
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                           DLL modules loading
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 /* __UPF_ABI_H__ */

Generated on Wed Jan 15 23:10:55 2003 for Universal Plugins Framework by doxygen1.2.18