Add a script to make it easier to initialize /.git
[msysgit/historical-msysgit.git] / mingw / include / rpcproxy.h
blobd4fcce533e0785300e39463a687b09416b7a0f10
1 /*
2 -DREGISTER_PROXY_DLL Generates DllMain, DllRegisterServer, and DllUnregisterServer
3 -DPROXY_CLSID=clsid Specifies a class ID to be used by the proxy DLL.
4 -DPROXY_CLSID_IS={..} Specifies the class ID to be used by the proxy DLL.
5 -DNT35_STRICT No new features
6 */
7 #ifndef _RPCPROXY_H
8 #define _RPCPROXY_H
9 #if __GNUC__ >=3
10 #pragma GCC system_header
11 #endif
13 #if defined __cplusplus && !defined CINTERFACE
14 #warning "rpcproxy type definitions require CINTERFACE"
15 #else
16 #ifdef __cplusplus
17 extern "C" {
18 #endif
19 #include <rpc.h>
20 #include <rpcndr.h>
21 #include <string.h>
23 #define CStdStubBuffer_METHODS CStdStubBuffer_QueryInterface,CStdStubBuffer_AddRef,\
24 CStdStubBuffer_Release,CStdStubBuffer_Connect,CStdStubBuffer_Disconnect,CStdStubBuffer_Invoke,\
25 CStdStubBuffer_IsIIDSupported,CStdStubBuffer_CountRefs,CStdStubBuffer_DebugServerQueryInterface,\
26 CStdStubBuffer_DebugServerRelease
27 #define IID_GENERIC_CHECK_IID(name,pIID,index) memcmp(pIID,name##_ProxyVtblList[index]->header.piid,16)
28 #define IID_BS_LOOKUP_SETUP int result, low=-1;
29 #define IID_BS_LOOKUP_INITIAL_TEST(name,sz,split) if ((result = name##_CHECK_IID(split))>0) { low=sz-split;} else if (!result) { low = split; goto found_label; }
30 #define IID_BS_LOOKUP_NEXT_TEST(name,split) if ((result = name##_CHECK_IID(low+split))>=0) { low=low+split; if (!result) goto found_label; }
31 #define IID_BS_LOOKUP_RETURN_RESULT(name,sz,index) low+=1; if ((low>=sz )||(result=name##_CHECK_IID(low))) goto not_found_label; found_label: (index)=low; return 1; not_found_label: return 0;
32 #define REGISTER_PROXY_DLL_ROUTINES(pProxyFileList, pClsID) \
33 HINSTANCE hProxyDll = 0; \
34 BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved) \
35 { \
36 if(fdwReason == DLL_PROCESS_ATTACH) hProxyDll = hinstDLL; \
37 return TRUE; \
38 } \
39 HRESULT STDAPICALLTYPE DllRegisterServer(void) \
41 return NdrDllRegisterProxy(hProxyDll, pProxyFileList, pClsID); \
43 HRESULT STDAPICALLTYPE DllUnregisterServer(void)\
45 return NdrDllUnregisterProxy(hProxyDll, pProxyFileList, pClsID);\
47 #ifdef PROXY_CLSID
48 #define CLSID_PSFACTORYBUFFER extern CLSID PROXY_CLSID;
49 #else
50 #ifdef PROXY_CLSID_IS
51 #define CLSID_PSFACTORYBUFFER const CLSID CLSID_PSFactoryBuffer = PROXY_CLSID_IS;
52 #define PROXY_CLSID CLSID_PSFactoryBuffer
53 #else
54 #define CLSID_PSFACTORYBUFFER
55 #endif
56 #endif
57 #ifndef PROXY_CLSID
58 #define GET_DLL_CLSID (aProxyFileList[0]->pStubVtblList[0] != 0 ? aProxyFileList[0]->pStubVtblList[0]->header.piid : 0)
59 #else
60 #define GET_DLL_CLSID &PROXY_CLSID
61 #endif
62 #define EXTERN_PROXY_FILE(name) EXTERN_C const ProxyFileInfo name##_ProxyFileInfo;
63 #define PROXYFILE_LIST_START const ProxyFileInfo * aProxyFileList[] = {
64 #define REFERENCE_PROXY_FILE(name) & name##_ProxyFileInfo
65 #define PROXYFILE_LIST_END 0 };
66 #define DLLDATA_GETPROXYDLLINFO(pPFList,pClsid) \
67 void RPC_ENTRY GetProxyDllInfo( const ProxyFileInfo*** pInfo, const CLSID ** pId ) \
68 { *pInfo = pPFList; *pId = pClsid; };
69 #define DLLGETCLASSOBJECTROUTINE(pPFlist, pClsid,pFactory) HRESULT STDAPICALLTYPE DllGetClassObject(REFCLSID rclsid,REFIID riid,void **ppv) \
70 { return NdrDllGetClassObject(rclsid,riid,ppv,pPFlist,pClsid,pFactory ); }
71 #define DLLCANUNLOADNOW(pFactory) HRESULT STDAPICALLTYPE DllCanUnloadNow(void) \
72 { return NdrDllCanUnloadNow( pFactory ); }
73 #define DLLDUMMYPURECALL void __cdecl _purecall(void) { }
74 #define CSTDSTUBBUFFERRELEASE(pFactory) ULONG STDMETHODCALLTYPE CStdStubBuffer_Release(IRpcStubBuffer *This) \
75 { return NdrCStdStubBuffer_Release(This,(IPSFactoryBuffer *)pFactory); }
76 #ifdef PROXY_DELEGATION
77 #define CSTDSTUBBUFFER2RELEASE(pFactory) ULONG STDMETHODCALLTYPE CStdStubBuffer2_Release(IRpcStubBuffer *This) \
78 { return NdrCStdStubBuffer2_Release(This,(IPSFactoryBuffer *)pFactory); }
79 #else
80 #define CSTDSTUBBUFFER2RELEASE(pFactory)
81 #endif
83 #ifdef REGISTER_PROXY_DLL
84 #define DLLREGISTRY_ROUTINES(pProxyFileList,pClsID ) REGISTER_PROXY_DLL_ROUTINES(pProxyFileList,pClsID)
85 #else
86 #define DLLREGISTRY_ROUTINES(pProxyFileList,pClsID)
87 #endif
88 #define DLLDATA_ROUTINES(pProxyFileList,pClsID) \
89 CLSID_PSFACTORYBUFFER \
90 CStdPSFactoryBuffer gPFactory = {0,0,0,0}; \
91 DLLDATA_GETPROXYDLLINFO(pProxyFileList,pClsID) \
92 DLLGETCLASSOBJECTROUTINE(pProxyFileList,pClsID,&gPFactory) \
93 DLLCANUNLOADNOW(&gPFactory) \
94 CSTDSTUBBUFFERRELEASE(&gPFactory) \
95 CSTDSTUBBUFFER2RELEASE(&gPFactory) \
96 DLLDUMMYPURECALL \
97 DLLREGISTRY_ROUTINES(pProxyFileList, pClsID)
99 #define DLLDATA_STANDARD_ROUTINES DLLDATA_ROUTINES( (const ProxyFileInfo**) pProxyFileList, &CLSID_PSFactoryBuffer)
101 struct tagCInterfaceStubVtbl;
102 struct tagCInterfaceProxyVtbl;
103 typedef struct tagCInterfaceStubVtbl *PCInterfaceStubVtblList;
104 typedef struct tagCInterfaceProxyVtbl *PCInterfaceProxyVtblList;
105 typedef const char *PCInterfaceName;
106 typedef int __stdcall IIDLookupRtn(const IID*,int*);
107 typedef IIDLookupRtn *PIIDLookup;
108 typedef struct tagProxyFileInfo {
109 const PCInterfaceProxyVtblList *pProxyVtblList;
110 const PCInterfaceStubVtblList *pStubVtblList;
111 const PCInterfaceName * pNamesArray;
112 const IID ** pDelegatedIIDs;
113 const PIIDLookup pIIDLookupRtn;
114 unsigned short TableSize;
115 unsigned short TableVersion;
116 unsigned long Filler1;
117 unsigned long Filler2;
118 unsigned long Filler3;
119 unsigned long Filler4;
120 }ProxyFileInfo;
121 typedef ProxyFileInfo ExtendedProxyFileInfo;
123 typedef struct tagCInterfaceProxyHeader {
124 #ifdef USE_STUBLESS_PROXY
125 const void *pStublessProxyInfo;
126 #endif
127 const IID *piid;
128 } CInterfaceProxyHeader;
129 typedef struct tagCInterfaceProxyVtbl {
130 CInterfaceProxyHeader header;
131 #if defined(__WATCOMC__)
132 void *Vtbl[1];
133 #else
134 #ifdef __GNUC__
135 __extension__
136 #endif
137 void *Vtbl[0];
138 #endif
139 } CInterfaceProxyVtbl;
140 typedef void (__RPC_STUB *PRPC_STUB_FUNCTION)(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,DWORD*);
141 typedef struct tagCInterfaceStubHeader {
142 const IID *piid;
143 const MIDL_SERVER_INFO *pServerInfo;
144 unsigned long DispatchTableCount;
145 const PRPC_STUB_FUNCTION *pDispatchTable;
146 } CInterfaceStubHeader;
147 typedef struct tagCInterfaceStubVtbl {
148 CInterfaceStubHeader header;
149 IRpcStubBufferVtbl Vtbl;
150 } CInterfaceStubVtbl;
151 typedef struct tagCStdStubBuffer {
152 const struct IRpcStubBufferVtbl * lpVtbl;
153 long RefCount;
154 struct IUnknown *pvServerObject;
155 const struct ICallFactoryVtbl * pCallFactoryVtbl;
156 const IID * pAsyncIID;
157 struct IPSFactoryBuffer * pPSFactory;
158 const struct IReleaseMarshalBuffersVtbl * pRMBVtbl;
159 } CStdStubBuffer;
160 typedef struct tagCStdPSFactoryBuffer {
161 const IPSFactoryBufferVtbl *lpVtbl;
162 long RefCount;
163 const ProxyFileInfo ** pProxyFileList;
164 long Filler1;
165 } CStdPSFactoryBuffer;
166 void RPC_ENTRY NdrProxyInitialize(void*,PRPC_MESSAGE,PMIDL_STUB_MESSAGE,PMIDL_STUB_DESC,unsigned int);
167 void RPC_ENTRY NdrProxyGetBuffer(void*,PMIDL_STUB_MESSAGE);
168 void RPC_ENTRY NdrProxySendReceive(void*,MIDL_STUB_MESSAGE*);
169 void RPC_ENTRY NdrProxyFreeBuffer(void*,MIDL_STUB_MESSAGE*);
170 HRESULT RPC_ENTRY NdrProxyErrorHandler(DWORD);
171 void RPC_ENTRY NdrStubInitialize(PRPC_MESSAGE,PMIDL_STUB_MESSAGE,PMIDL_STUB_DESC,IRpcChannelBuffer*);
172 void __RPC_STUB NdrStubForwardingFunction(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,DWORD*);
173 void RPC_ENTRY NdrStubGetBuffer(IRpcStubBuffer*,IRpcChannelBuffer*,PMIDL_STUB_MESSAGE);
174 HRESULT RPC_ENTRY NdrStubErrorHandler(DWORD);
175 HRESULT STDMETHODCALLTYPE CStdStubBuffer_QueryInterface(IRpcStubBuffer*,REFIID,void**);
176 ULONG STDMETHODCALLTYPE CStdStubBuffer_AddRef(IRpcStubBuffer*);
177 ULONG STDMETHODCALLTYPE CStdStubBuffer_Release(IRpcStubBuffer*);
178 ULONG STDMETHODCALLTYPE NdrCStdStubBuffer_Release(IRpcStubBuffer*,IPSFactoryBuffer*);
179 HRESULT STDMETHODCALLTYPE CStdStubBuffer_Connect(IRpcStubBuffer*,IUnknown*);
180 void STDMETHODCALLTYPE CStdStubBuffer_Disconnect(IRpcStubBuffer*);
181 HRESULT STDMETHODCALLTYPE CStdStubBuffer_Invoke(IRpcStubBuffer*,RPCOLEMESSAGE*,IRpcChannelBuffer*);
182 IRpcStubBuffer* STDMETHODCALLTYPE CStdStubBuffer_IsIIDSupported(IRpcStubBuffer*,REFIID);
183 ULONG STDMETHODCALLTYPE CStdStubBuffer_CountRefs(IRpcStubBuffer*);
184 HRESULT STDMETHODCALLTYPE CStdStubBuffer_DebugServerQueryInterface(IRpcStubBuffer*,void**);
185 void STDMETHODCALLTYPE CStdStubBuffer_DebugServerRelease(IRpcStubBuffer*,void*);
186 HRESULT RPC_ENTRY NdrDllGetClassObject(REFCLSID,REFIID,void**,const ProxyFileInfo**,const CLSID*,CStdPSFactoryBuffer*);
187 HRESULT RPC_ENTRY NdrDllCanUnloadNow(CStdPSFactoryBuffer*);
188 #ifndef NT35_STRICT
189 HRESULT RPC_ENTRY NdrDllRegisterProxy(HMODULE,const ProxyFileInfo**,const CLSID*);
190 HRESULT RPC_ENTRY NdrDllUnregisterProxy(HMODULE,const ProxyFileInfo**,const CLSID*);
191 #define STUB_FORWARDING_FUNCTION NdrStubForwardingFunction
192 ULONG STDMETHODCALLTYPE
193 CStdStubBuffer2_Release(IRpcStubBuffer*);
194 ULONG STDMETHODCALLTYPE
195 NdrCStdStubBuffer2_Release(IRpcStubBuffer*,IPSFactoryBuffer*);
196 #define CStdStubBuffer_DELEGATING_METHODS 0, 0, CStdStubBuffer2_Release, 0, 0, 0, 0, 0, 0, 0
197 #endif
199 #ifdef __cplusplus
201 #endif
202 #endif /* defined __cplusplus && !defined CINTERFACE */
203 #endif /* ndef _RPCPROXY_H */