2 * MIDL proxy/stub stuff
4 * Copyright 2002 Ove Kåven, TransGaming Technologies
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 * - figure out whether we *really* got this right
22 * - check for errors and throw exceptions
41 #include "wine/debug.h"
47 WINE_DEFAULT_DEBUG_CHANNEL(rpc
);
49 /***********************************************************************
50 * NdrProxyInitialize [RPCRT4.@]
52 void WINAPI
NdrProxyInitialize(void *This
,
54 PMIDL_STUB_MESSAGE pStubMsg
,
55 PMIDL_STUB_DESC pStubDescriptor
,
60 TRACE("(%p,%p,%p,%p,%d)\n", This
, pRpcMsg
, pStubMsg
, pStubDescriptor
, ProcNum
);
61 NdrClientInitializeNew(pRpcMsg
, pStubMsg
, pStubDescriptor
, ProcNum
);
62 if (This
) StdProxy_GetChannel(This
, &pStubMsg
->pRpcChannelBuffer
);
63 if (pStubMsg
->pRpcChannelBuffer
) {
64 hr
= IRpcChannelBuffer_GetDestCtx(pStubMsg
->pRpcChannelBuffer
,
65 &pStubMsg
->dwDestContext
,
66 &pStubMsg
->pvDestContext
);
68 TRACE("channel=%p\n", pStubMsg
->pRpcChannelBuffer
);
71 /***********************************************************************
72 * NdrProxyGetBuffer [RPCRT4.@]
74 void WINAPI
NdrProxyGetBuffer(void *This
,
75 PMIDL_STUB_MESSAGE pStubMsg
)
78 const IID
*riid
= NULL
;
80 TRACE("(%p,%p)\n", This
, pStubMsg
);
81 pStubMsg
->RpcMsg
->BufferLength
= pStubMsg
->BufferLength
;
82 pStubMsg
->dwStubPhase
= PROXY_GETBUFFER
;
83 hr
= StdProxy_GetIID(This
, &riid
);
84 hr
= IRpcChannelBuffer_GetBuffer(pStubMsg
->pRpcChannelBuffer
,
85 (RPCOLEMESSAGE
*)pStubMsg
->RpcMsg
,
87 pStubMsg
->BufferStart
= pStubMsg
->RpcMsg
->Buffer
;
88 pStubMsg
->BufferEnd
= pStubMsg
->BufferStart
+ pStubMsg
->BufferLength
;
89 pStubMsg
->Buffer
= pStubMsg
->BufferStart
;
90 pStubMsg
->dwStubPhase
= PROXY_MARSHAL
;
93 /***********************************************************************
94 * NdrProxySendReceive [RPCRT4.@]
96 void WINAPI
NdrProxySendReceive(void *This
,
97 PMIDL_STUB_MESSAGE pStubMsg
)
102 TRACE("(%p,%p)\n", This
, pStubMsg
);
104 if (!pStubMsg
->pRpcChannelBuffer
)
106 WARN("Trying to use disconnected proxy %p\n", This
);
107 RpcRaiseException(RPC_E_DISCONNECTED
);
110 pStubMsg
->dwStubPhase
= PROXY_SENDRECEIVE
;
111 hr
= IRpcChannelBuffer_SendReceive(pStubMsg
->pRpcChannelBuffer
,
112 (RPCOLEMESSAGE
*)pStubMsg
->RpcMsg
,
114 pStubMsg
->dwStubPhase
= PROXY_UNMARSHAL
;
115 pStubMsg
->BufferLength
= pStubMsg
->RpcMsg
->BufferLength
;
116 pStubMsg
->BufferStart
= pStubMsg
->RpcMsg
->Buffer
;
117 pStubMsg
->BufferEnd
= pStubMsg
->BufferStart
+ pStubMsg
->BufferLength
;
118 pStubMsg
->Buffer
= pStubMsg
->BufferStart
;
120 /* raise exception if call failed */
121 if (hr
== RPC_S_CALL_FAILED
) RpcRaiseException(*(DWORD
*)pStubMsg
->Buffer
);
122 else if (FAILED(hr
)) RpcRaiseException(hr
);
125 /***********************************************************************
126 * NdrProxyFreeBuffer [RPCRT4.@]
128 void WINAPI
NdrProxyFreeBuffer(void *This
,
129 PMIDL_STUB_MESSAGE pStubMsg
)
133 TRACE("(%p,%p)\n", This
, pStubMsg
);
134 hr
= IRpcChannelBuffer_FreeBuffer(pStubMsg
->pRpcChannelBuffer
,
135 (RPCOLEMESSAGE
*)pStubMsg
->RpcMsg
);
138 /***********************************************************************
139 * NdrProxyErrorHandler [RPCRT4.@]
141 HRESULT WINAPI
NdrProxyErrorHandler(DWORD dwExceptionCode
)
143 WARN("(0x%08lx): a proxy call failed\n", dwExceptionCode
);
145 if (FAILED(dwExceptionCode
))
146 return dwExceptionCode
;
148 return HRESULT_FROM_WIN32(dwExceptionCode
);
151 /***********************************************************************
152 * NdrStubInitialize [RPCRT4.@]
154 void WINAPI
NdrStubInitialize(PRPC_MESSAGE pRpcMsg
,
155 PMIDL_STUB_MESSAGE pStubMsg
,
156 PMIDL_STUB_DESC pStubDescriptor
,
157 LPRPCCHANNELBUFFER pRpcChannelBuffer
)
159 TRACE("(%p,%p,%p,%p)\n", pRpcMsg
, pStubMsg
, pStubDescriptor
, pRpcChannelBuffer
);
160 NdrServerInitializeNew(pRpcMsg
, pStubMsg
, pStubDescriptor
);
161 pStubMsg
->pRpcChannelBuffer
= pRpcChannelBuffer
;
164 /***********************************************************************
165 * NdrStubGetBuffer [RPCRT4.@]
167 void WINAPI
NdrStubGetBuffer(LPRPCSTUBBUFFER This
,
168 LPRPCCHANNELBUFFER pRpcChannelBuffer
,
169 PMIDL_STUB_MESSAGE pStubMsg
)
171 TRACE("(%p,%p)\n", This
, pStubMsg
);
172 pStubMsg
->pRpcChannelBuffer
= pRpcChannelBuffer
;
173 pStubMsg
->RpcMsg
->BufferLength
= pStubMsg
->BufferLength
;
174 I_RpcGetBuffer(pStubMsg
->RpcMsg
); /* ? */
175 pStubMsg
->BufferStart
= pStubMsg
->RpcMsg
->Buffer
;
176 pStubMsg
->BufferEnd
= pStubMsg
->BufferStart
+ pStubMsg
->BufferLength
;
177 pStubMsg
->Buffer
= pStubMsg
->BufferStart
;
180 /************************************************************************
181 * NdrClientInitializeNew [RPCRT4.@]
183 void WINAPI
NdrClientInitializeNew( PRPC_MESSAGE pRpcMessage
, PMIDL_STUB_MESSAGE pStubMsg
,
184 PMIDL_STUB_DESC pStubDesc
, unsigned int ProcNum
)
186 TRACE("(pRpcMessage == ^%p, pStubMsg == ^%p, pStubDesc == ^%p, ProcNum == %d)\n",
187 pRpcMessage
, pStubMsg
, pStubDesc
, ProcNum
);
189 assert( pRpcMessage
&& pStubMsg
&& pStubDesc
);
191 memset(pRpcMessage
, 0, sizeof(RPC_MESSAGE
));
192 pRpcMessage
->DataRepresentation
= NDR_LOCAL_DATA_REPRESENTATION
;
194 /* not everyone allocates stack space for w2kReserved */
195 memset(pStubMsg
, 0, FIELD_OFFSET(MIDL_STUB_MESSAGE
,pCSInfo
));
197 pStubMsg
->ReuseBuffer
= FALSE
;
198 pStubMsg
->IsClient
= TRUE
;
199 pStubMsg
->StubDesc
= pStubDesc
;
200 pStubMsg
->pfnAllocate
= pStubDesc
->pfnAllocate
;
201 pStubMsg
->pfnFree
= pStubDesc
->pfnFree
;
202 pStubMsg
->RpcMsg
= pRpcMessage
;
204 pRpcMessage
->ProcNum
= ProcNum
;
205 pRpcMessage
->RpcInterfaceInformation
= pStubDesc
->RpcInterfaceInformation
;
208 /***********************************************************************
209 * NdrServerInitializeNew [RPCRT4.@]
211 unsigned char* WINAPI
NdrServerInitializeNew( PRPC_MESSAGE pRpcMsg
, PMIDL_STUB_MESSAGE pStubMsg
,
212 PMIDL_STUB_DESC pStubDesc
)
214 TRACE("(pRpcMsg == ^%p, pStubMsg == ^%p, pStubDesc == ^%p)\n", pRpcMsg
, pStubMsg
, pStubDesc
);
216 assert( pRpcMsg
&& pStubMsg
&& pStubDesc
);
218 /* not everyone allocates stack space for w2kReserved */
219 memset(pStubMsg
, 0, FIELD_OFFSET(MIDL_STUB_MESSAGE
,pCSInfo
));
221 pStubMsg
->ReuseBuffer
= TRUE
;
222 pStubMsg
->IsClient
= FALSE
;
223 pStubMsg
->StubDesc
= pStubDesc
;
224 pStubMsg
->pfnAllocate
= pStubDesc
->pfnAllocate
;
225 pStubMsg
->pfnFree
= pStubDesc
->pfnFree
;
226 pStubMsg
->RpcMsg
= pRpcMsg
;
227 pStubMsg
->Buffer
= pStubMsg
->BufferStart
= pRpcMsg
->Buffer
;
228 pStubMsg
->BufferLength
= pRpcMsg
->BufferLength
;
229 pStubMsg
->BufferEnd
= pStubMsg
->Buffer
+ pStubMsg
->BufferLength
;
231 /* FIXME: determine the proper return value */
235 /***********************************************************************
236 * NdrGetBuffer [RPCRT4.@]
238 unsigned char *WINAPI
NdrGetBuffer(MIDL_STUB_MESSAGE
*stubmsg
, unsigned long buflen
, RPC_BINDING_HANDLE handle
)
240 TRACE("(stubmsg == ^%p, buflen == %lu, handle == %p): wild guess.\n", stubmsg
, buflen
, handle
);
242 assert( stubmsg
&& stubmsg
->RpcMsg
);
244 /* I guess this is our chance to put the binding handle into the RPC_MESSAGE */
245 stubmsg
->RpcMsg
->Handle
= handle
;
247 stubmsg
->RpcMsg
->BufferLength
= buflen
;
248 if (I_RpcGetBuffer(stubmsg
->RpcMsg
) != S_OK
)
251 stubmsg
->Buffer
= stubmsg
->BufferStart
= stubmsg
->RpcMsg
->Buffer
;
252 stubmsg
->BufferLength
= stubmsg
->RpcMsg
->BufferLength
;
253 stubmsg
->BufferEnd
= stubmsg
->Buffer
+ stubmsg
->BufferLength
;
254 return (stubmsg
->Buffer
= (unsigned char *)stubmsg
->RpcMsg
->Buffer
);
256 /***********************************************************************
257 * NdrFreeBuffer [RPCRT4.@]
259 void WINAPI
NdrFreeBuffer(MIDL_STUB_MESSAGE
*pStubMsg
)
261 TRACE("(pStubMsg == ^%p): wild guess.\n", pStubMsg
);
262 I_RpcFreeBuffer(pStubMsg
->RpcMsg
);
263 pStubMsg
->BufferLength
= 0;
264 pStubMsg
->Buffer
= pStubMsg
->BufferEnd
= (unsigned char *)(pStubMsg
->RpcMsg
->Buffer
= NULL
);
267 /************************************************************************
268 * NdrSendReceive [RPCRT4.@]
270 unsigned char *WINAPI
NdrSendReceive( MIDL_STUB_MESSAGE
*stubmsg
, unsigned char *buffer
)
274 TRACE("(stubmsg == ^%p, buffer == ^%p)\n", stubmsg
, buffer
);
276 /* FIXME: how to handle errors? (raise exception?) */
278 ERR("NULL stub message. No action taken.\n");
281 if (!stubmsg
->RpcMsg
) {
282 ERR("RPC Message not present in stub message. No action taken.\n");
286 status
= I_RpcSendReceive(stubmsg
->RpcMsg
);
287 if (status
!= RPC_S_OK
)
288 RpcRaiseException(status
);
290 stubmsg
->BufferLength
= stubmsg
->RpcMsg
->BufferLength
;
291 stubmsg
->BufferStart
= stubmsg
->RpcMsg
->Buffer
;
292 stubmsg
->BufferEnd
= stubmsg
->BufferStart
+ stubmsg
->BufferLength
;
293 stubmsg
->Buffer
= stubmsg
->BufferStart
;
295 /* FIXME: is this the right return value? */
299 /************************************************************************
300 * NdrMapCommAndFaultStatus [RPCRT4.@]
302 RPC_STATUS RPC_ENTRY
NdrMapCommAndFaultStatus( PMIDL_STUB_MESSAGE pStubMsg
,
303 unsigned long *pCommStatus
,
304 unsigned long *pFaultStatus
,
307 FIXME("(%p, %p, %p, %ld): stub\n", pStubMsg
, pCommStatus
, pFaultStatus
, Status
);
315 /************************************************************************
316 * NdrStubForwardingFunction [RPCRT4.@]
318 void __RPC_STUB
NdrStubForwardingFunction( IRpcStubBuffer
*This
, IRpcChannelBuffer
*pChannel
,
319 PRPC_MESSAGE pMsg
, DWORD
*pdwStubPhase
)
321 FIXME("Not implemented\n");