/* * MIDL proxy/stub stuff * * Copyright 2002 Ove Kåven, TransGaming Technologies * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * TODO: * - figure out whether we *really* got this right * - check for errors and throw exceptions */ #include #include #include "windef.h" #include "winbase.h" #include "winerror.h" #include "winreg.h" #include "wine/obj_base.h" #include "wine/obj_channel.h" #include "rpcproxy.h" #include "wine/debug.h" #include "cpsf.h" #include "ndr_misc.h" WINE_DEFAULT_DEBUG_CHANNEL(ole); /*********************************************************************** * NdrProxyInitialize [RPCRT4.@] */ void WINAPI NdrProxyInitialize(void *This, PRPC_MESSAGE pRpcMsg, PMIDL_STUB_MESSAGE pStubMsg, PMIDL_STUB_DESC pStubDescriptor, unsigned int ProcNum) { HRESULT hr; TRACE("(%p,%p,%p,%p,%d)\n", This, pRpcMsg, pStubMsg, pStubDescriptor, ProcNum); memset(pRpcMsg, 0, sizeof(RPC_MESSAGE)); memset(pStubMsg, 0, sizeof(MIDL_STUB_MESSAGE)); pRpcMsg->ProcNum = ProcNum; pRpcMsg->RpcInterfaceInformation = pStubDescriptor->RpcInterfaceInformation; pStubMsg->RpcMsg = pRpcMsg; pStubMsg->IsClient = 1; pStubMsg->ReuseBuffer = 1; pStubMsg->pfnAllocate = pStubDescriptor->pfnAllocate; pStubMsg->pfnFree = pStubDescriptor->pfnFree; pStubMsg->StubDesc = pStubDescriptor; if (This) StdProxy_GetChannel(This, &pStubMsg->pRpcChannelBuffer); if (pStubMsg->pRpcChannelBuffer) { hr = IRpcChannelBuffer_GetDestCtx(pStubMsg->pRpcChannelBuffer, &pStubMsg->dwDestContext, &pStubMsg->pvDestContext); } TRACE("channel=%p\n", pStubMsg->pRpcChannelBuffer); } /*********************************************************************** * NdrProxyGetBuffer [RPCRT4.@] */ void WINAPI NdrProxyGetBuffer(void *This, PMIDL_STUB_MESSAGE pStubMsg) { HRESULT hr; const IID *riid = NULL; TRACE("(%p,%p)\n", This, pStubMsg); pStubMsg->RpcMsg->BufferLength = pStubMsg->BufferLength; pStubMsg->dwStubPhase = PROXY_GETBUFFER; hr = StdProxy_GetIID(This, &riid); hr = IRpcChannelBuffer_GetBuffer(pStubMsg->pRpcChannelBuffer, (RPCOLEMESSAGE*)pStubMsg->RpcMsg, riid); pStubMsg->BufferStart = pStubMsg->RpcMsg->Buffer; pStubMsg->BufferEnd = pStubMsg->BufferStart + pStubMsg->BufferLength; pStubMsg->Buffer = pStubMsg->BufferStart; pStubMsg->dwStubPhase = PROXY_MARSHAL; } /*********************************************************************** * NdrProxySendReceive [RPCRT4.@] */ void WINAPI NdrProxySendReceive(void *This, PMIDL_STUB_MESSAGE pStubMsg) { ULONG Status = 0; HRESULT hr; TRACE("(%p,%p)\n", This, pStubMsg); pStubMsg->dwStubPhase = PROXY_SENDRECEIVE; hr = IRpcChannelBuffer_SendReceive(pStubMsg->pRpcChannelBuffer, (RPCOLEMESSAGE*)pStubMsg->RpcMsg, &Status); pStubMsg->dwStubPhase = PROXY_UNMARSHAL; pStubMsg->BufferLength = pStubMsg->RpcMsg->BufferLength; pStubMsg->BufferStart = pStubMsg->RpcMsg->Buffer; pStubMsg->BufferEnd = pStubMsg->BufferStart + pStubMsg->BufferLength; pStubMsg->Buffer = pStubMsg->BufferStart; } /*********************************************************************** * NdrProxyFreeBuffer [RPCRT4.@] */ void WINAPI NdrProxyFreeBuffer(void *This, PMIDL_STUB_MESSAGE pStubMsg) { HRESULT hr; TRACE("(%p,%p)\n", This, pStubMsg); hr = IRpcChannelBuffer_FreeBuffer(pStubMsg->pRpcChannelBuffer, (RPCOLEMESSAGE*)pStubMsg->RpcMsg); } /*********************************************************************** * NdrStubInitialize [RPCRT4.@] */ void WINAPI NdrStubInitialize(PRPC_MESSAGE pRpcMsg, PMIDL_STUB_MESSAGE pStubMsg, PMIDL_STUB_DESC pStubDescriptor, LPRPCCHANNELBUFFER pRpcChannelBuffer) { TRACE("(%p,%p,%p,%p)\n", pRpcMsg, pStubMsg, pStubDescriptor, pRpcChannelBuffer); memset(pStubMsg, 0, sizeof(MIDL_STUB_MESSAGE)); pStubMsg->RpcMsg = pRpcMsg; pStubMsg->IsClient = 0; pStubMsg->ReuseBuffer = 1; pStubMsg->pfnAllocate = pStubDescriptor->pfnAllocate; pStubMsg->pfnFree = pStubDescriptor->pfnFree; pStubMsg->StubDesc = pStubDescriptor; pStubMsg->pRpcChannelBuffer = pRpcChannelBuffer; pStubMsg->BufferLength = pStubMsg->RpcMsg->BufferLength; pStubMsg->BufferStart = pStubMsg->RpcMsg->Buffer; pStubMsg->BufferEnd = pStubMsg->BufferStart + pStubMsg->BufferLength; pStubMsg->Buffer = pStubMsg->BufferStart; } /*********************************************************************** * NdrStubGetBuffer [RPCRT4.@] */ void WINAPI NdrStubGetBuffer(LPRPCSTUBBUFFER This, LPRPCCHANNELBUFFER pRpcChannelBuffer, PMIDL_STUB_MESSAGE pStubMsg) { TRACE("(%p,%p)\n", This, pStubMsg); pStubMsg->pRpcChannelBuffer = pRpcChannelBuffer; pStubMsg->RpcMsg->BufferLength = pStubMsg->BufferLength; I_RpcGetBuffer(pStubMsg->RpcMsg); /* ? */ pStubMsg->BufferStart = pStubMsg->RpcMsg->Buffer; pStubMsg->BufferEnd = pStubMsg->BufferStart + pStubMsg->BufferLength; pStubMsg->Buffer = pStubMsg->BufferStart; }