Commit 6ec9e0c7 authored by Rob Shearman's avatar Rob Shearman Committed by Alexandre Julliard

rpcrt4: Add an exception handler for stubless object proxies.

parent c975876c
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
#include "rpc.h" #include "rpc.h"
#include "rpcproxy.h" #include "rpcproxy.h"
#include "wine/exception.h"
#include "wine/debug.h" #include "wine/debug.h"
#include "wine/rpcfc.h" #include "wine/rpcfc.h"
...@@ -676,70 +677,123 @@ LONG_PTR WINAPIV NdrClientCall2(PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pForma ...@@ -676,70 +677,123 @@ LONG_PTR WINAPIV NdrClientCall2(PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pForma
* 4. PROXY_SENDRECEIVE - send/receive buffer * 4. PROXY_SENDRECEIVE - send/receive buffer
* 5. PROXY_UNMARHSAL - unmarshal [out] params from buffer * 5. PROXY_UNMARHSAL - unmarshal [out] params from buffer
*/ */
for (phase = PROXY_CALCSIZE; phase <= PROXY_UNMARSHAL; phase++) if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT)
{ {
TRACE("phase = %d\n", phase); __TRY
switch (phase)
{ {
case PROXY_GETBUFFER: for (phase = PROXY_CALCSIZE; phase <= PROXY_UNMARSHAL; phase++)
/* allocate the buffer */ {
if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT) TRACE("phase = %d\n", phase);
NdrProxyGetBuffer(This, &stubMsg); switch (phase)
else if (Oif_flags.HasPipes) {
/* NdrGetPipeBuffer(...) */ case PROXY_GETBUFFER:
FIXME("pipes not supported yet\n"); /* allocate the buffer */
else NdrProxyGetBuffer(This, &stubMsg);
break;
case PROXY_SENDRECEIVE:
/* send the [in] params and receive the [out] and [retval]
* params */
NdrProxySendReceive(This, &stubMsg);
/* convert strings, floating point values and endianess into our
* preferred format */
if ((rpcMsg.DataRepresentation & 0x0000FFFFUL) != NDR_LOCAL_DATA_REPRESENTATION)
NdrConvert(&stubMsg, pFormat);
break;
case PROXY_CALCSIZE:
case PROXY_MARSHAL:
case PROXY_UNMARSHAL:
if (bV2Format)
client_do_args(&stubMsg, pFormat, phase, number_of_params,
(unsigned char *)&RetVal);
else
client_do_args_old_format(&stubMsg, pFormat, phase, stack_size,
(unsigned char *)&RetVal,
(pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT));
break;
default:
ERR("shouldn't reach here. phase %d\n", phase);
break;
}
}
}
__EXCEPT(NULL)
{
RetVal = NdrProxyErrorHandler(GetExceptionCode());
}
__ENDTRY
}
else
{
/* order of phases:
* 1. PROXY_CALCSIZE - calculate the buffer size
* 2. PROXY_GETBUFFER - allocate the buffer
* 3. PROXY_MARHSAL - marshal [in] params into the buffer
* 4. PROXY_SENDRECEIVE - send/receive buffer
* 5. PROXY_UNMARHSAL - unmarshal [out] params from buffer
*/
for (phase = PROXY_CALCSIZE; phase <= PROXY_UNMARSHAL; phase++)
{
TRACE("phase = %d\n", phase);
switch (phase)
{ {
if (pProcHeader->handle_type == RPC_FC_AUTO_HANDLE) case PROXY_GETBUFFER:
/* allocate the buffer */
if (Oif_flags.HasPipes)
/* NdrGetPipeBuffer(...) */
FIXME("pipes not supported yet\n");
else
{
if (pProcHeader->handle_type == RPC_FC_AUTO_HANDLE)
#if 0 #if 0
NdrNsGetBuffer(&stubMsg, stubMsg.BufferLength, hBinding); NdrNsGetBuffer(&stubMsg, stubMsg.BufferLength, hBinding);
#else #else
FIXME("using auto handle - call NdrNsGetBuffer when it gets implemented\n"); FIXME("using auto handle - call NdrNsGetBuffer when it gets implemented\n");
#endif #endif
else
NdrGetBuffer(&stubMsg, stubMsg.BufferLength, hBinding);
}
break;
case PROXY_SENDRECEIVE:
/* send the [in] params and receive the [out] and [retval]
* params */
if (Oif_flags.HasPipes)
/* NdrPipesSendReceive(...) */
FIXME("pipes not supported yet\n");
else else
NdrGetBuffer(&stubMsg, stubMsg.BufferLength, hBinding); {
} if (pProcHeader->handle_type == RPC_FC_AUTO_HANDLE)
break;
case PROXY_SENDRECEIVE:
/* send the [in] params and receive the [out] and [retval]
* params */
if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT)
NdrProxySendReceive(This, &stubMsg);
else if (Oif_flags.HasPipes)
/* NdrPipesSendReceive(...) */
FIXME("pipes not supported yet\n");
else
{
if (pProcHeader->handle_type == RPC_FC_AUTO_HANDLE)
#if 0 #if 0
NdrNsSendReceive(&stubMsg, stubMsg.Buffer, pStubDesc->IMPLICIT_HANDLE_INFO.pAutoHandle); NdrNsSendReceive(&stubMsg, stubMsg.Buffer, pStubDesc->IMPLICIT_HANDLE_INFO.pAutoHandle);
#else #else
FIXME("using auto handle - call NdrNsSendReceive when it gets implemented\n"); FIXME("using auto handle - call NdrNsSendReceive when it gets implemented\n");
#endif #endif
else else
NdrSendReceive(&stubMsg, stubMsg.Buffer); NdrSendReceive(&stubMsg, stubMsg.Buffer);
} }
/* convert strings, floating point values and endianess into our /* convert strings, floating point values and endianess into our
* preferred format */ * preferred format */
if ((rpcMsg.DataRepresentation & 0x0000FFFFUL) != NDR_LOCAL_DATA_REPRESENTATION) if ((rpcMsg.DataRepresentation & 0x0000FFFFUL) != NDR_LOCAL_DATA_REPRESENTATION)
NdrConvert(&stubMsg, pFormat); NdrConvert(&stubMsg, pFormat);
break; break;
case PROXY_CALCSIZE: case PROXY_CALCSIZE:
case PROXY_MARSHAL: case PROXY_MARSHAL:
case PROXY_UNMARSHAL: case PROXY_UNMARSHAL:
if (bV2Format) if (bV2Format)
client_do_args(&stubMsg, pFormat, phase, number_of_params, client_do_args(&stubMsg, pFormat, phase, number_of_params,
(unsigned char *)&RetVal); (unsigned char *)&RetVal);
else else
client_do_args_old_format(&stubMsg, pFormat, phase, stack_size, client_do_args_old_format(&stubMsg, pFormat, phase, stack_size,
(unsigned char *)&RetVal, (unsigned char *)&RetVal,
(pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT)); (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT));
break; break;
default: default:
ERR("shouldn't reach here. phase %d\n", phase); ERR("shouldn't reach here. phase %d\n", phase);
break; break;
}
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment