Huw Davies : rpcrt4:
Add tests for NdrStubForwardingFunction and write a commented out
implementation .
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Aug 23 16:36:25 CDT 2006
Module: wine
Branch: master
Commit: 6a0fccd3a92e773b8d713b4a56785fe23f03e809
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=6a0fccd3a92e773b8d713b4a56785fe23f03e809
Author: Huw Davies <huw at codeweavers.com>
Date: Wed Aug 23 13:56:04 2006 +0100
rpcrt4: Add tests for NdrStubForwardingFunction and write a commented out implementation.
This shows that the IRpcStubBuffer for a delegated stub's base
interface is stored at (void**)This-1.
---
dlls/rpcrt4/cstub.c | 24 ++++++++++++++++++++
dlls/rpcrt4/ndr_midl.c | 10 --------
dlls/rpcrt4/tests/cstub.c | 53 ++++++++++++++++++++++++++++++++++++++++++---
3 files changed, 74 insertions(+), 13 deletions(-)
diff --git a/dlls/rpcrt4/cstub.c b/dlls/rpcrt4/cstub.c
index 0b35579..ddc0dca 100644
--- a/dlls/rpcrt4/cstub.c
+++ b/dlls/rpcrt4/cstub.c
@@ -224,3 +224,27 @@ const MIDL_SERVER_INFO *CStdStubBuffer_G
CStdStubBuffer *This = (CStdStubBuffer *)iface;
return STUB_HEADER(This).pServerInfo;
}
+
+/************************************************************************
+ * NdrStubForwardingFunction [RPCRT4.@]
+ */
+void __RPC_STUB NdrStubForwardingFunction( IRpcStubBuffer *This, IRpcChannelBuffer *pChannel,
+ PRPC_MESSAGE pMsg, DWORD *pdwStubPhase )
+{
+ /* Once stub delegation is implemented, this should call
+ IRpcStubBuffer_Invoke on the stub's base interface. The
+ IRpcStubBuffer for this interface is stored at (void**)This-1.
+ The pChannel and pMsg parameters are passed intact
+ (RPCOLEMESSAGE is basically a RPC_MESSAGE). If Invoke returns
+ with a failure then an exception is raised (to see this, change
+ the return value in the test).
+
+ IRpcStubBuffer *base_this = *(IRpcStubBuffer**)((void**)This - 1);
+ HRESULT r = IRpcStubBuffer_Invoke(base_this, (RPCOLEMESSAGE*)pMsg, pChannel);
+ if(FAILED(r)) RpcRaiseException(r);
+ return;
+ */
+
+ FIXME("Not implemented\n");
+ return;
+}
diff --git a/dlls/rpcrt4/ndr_midl.c b/dlls/rpcrt4/ndr_midl.c
index 90f8b5e..d0c6000 100644
--- a/dlls/rpcrt4/ndr_midl.c
+++ b/dlls/rpcrt4/ndr_midl.c
@@ -338,13 +338,3 @@ RPC_STATUS RPC_ENTRY NdrMapCommAndFaultS
return RPC_S_OK;
}
-
-/************************************************************************
- * NdrStubForwardingFunction [RPCRT4.@]
- */
-void __RPC_STUB NdrStubForwardingFunction( IRpcStubBuffer *This, IRpcChannelBuffer *pChannel,
- PRPC_MESSAGE pMsg, DWORD *pdwStubPhase )
-{
- FIXME("Not implemented\n");
- return;
-}
diff --git a/dlls/rpcrt4/tests/cstub.c b/dlls/rpcrt4/tests/cstub.c
index afaf14f..54aa180 100644
--- a/dlls/rpcrt4/tests/cstub.c
+++ b/dlls/rpcrt4/tests/cstub.c
@@ -87,7 +87,7 @@ static const MIDL_TYPE_FORMAT_STRING __M
}
};
-static const MIDL_STUB_DESC Object_StubDesc =
+static const MIDL_STUB_DESC Object_StubDesc =
{
NULL,
my_alloc,
@@ -443,8 +443,6 @@ static void test_NdrDllGetClassObject(vo
void *CStd_DebugServerQueryInterface = GetProcAddress(hmod, "CStdStubBuffer_DebugServerQueryInterface");
void *CStd_DebugServerRelease = GetProcAddress(hmod, "CStdStubBuffer_DebugServerRelease");
- OleInitialize(NULL);
-
r = NdrDllGetClassObject(&PSDispatch, &IID_IPSFactoryBuffer, (void**)&ppsf, proxy_file_list,
&PSDispatch, &PSFactoryBuffer);
@@ -528,7 +526,56 @@ #undef VTBL_TEST_ZERO
ok(PSFactoryBuffer.RefCount == 1, "ref count %ld\n", PSFactoryBuffer.RefCount);
}
+static int base_buffer_invoke_called;
+static HRESULT WINAPI base_buffer_Invoke(IRpcStubBuffer *This, RPCOLEMESSAGE *msg, IRpcChannelBuffer *channel)
+{
+ base_buffer_invoke_called++;
+ ok(msg == (RPCOLEMESSAGE*)0xcafebabe, "msg ptr changed\n");
+ ok(channel == (IRpcChannelBuffer*)0xdeadbeef, "channel ptr changed\n");
+ return S_OK; /* returning any failure here results in an exception */
+}
+
+static IRpcStubBufferVtbl base_buffer_vtbl = {
+ (void*)0xcafebab0,
+ (void*)0xcafebab1,
+ (void*)0xcafebab2,
+ (void*)0xcafebab3,
+ (void*)0xcafebab4,
+ base_buffer_Invoke,
+ (void*)0xcafebab6,
+ (void*)0xcafebab7,
+ (void*)0xcafebab8,
+ (void*)0xcafebab9
+};
+
+static void test_NdrStubForwardingFunction(void)
+{
+ void *This[5];
+ void *real_this;
+ IRpcChannelBuffer *channel = (IRpcChannelBuffer*)0xdeadbeef;
+ RPC_MESSAGE *msg = (RPC_MESSAGE*)0xcafebabe;
+ DWORD *phase = (DWORD*)0x12345678;
+ IRpcStubBufferVtbl *base_buffer_vtbl_ptr = &base_buffer_vtbl;
+ IRpcStubBuffer *base_stub_buffer = (IRpcStubBuffer*)&base_buffer_vtbl_ptr;
+
+ memset(This, 0xcc, sizeof(This));
+ This[0] = base_stub_buffer;
+ real_this = &This[1];
+
+ NdrStubForwardingFunction( real_this, channel, msg, phase );
+
+todo_wine {
+ ok(base_buffer_invoke_called == 1, "base_buffer_invoke called %d times\n", base_buffer_invoke_called);
+}
+
+}
+
START_TEST( cstub )
{
+ OleInitialize(NULL);
+
test_NdrDllGetClassObject();
+ test_NdrStubForwardingFunction();
+
+ OleUninitialize();
}
More information about the wine-cvs
mailing list