Module: wine Branch: master Commit: e0c67a189b79725c6b588f297a8dd1a482414f67 URL: http://source.winehq.org/git/wine.git/?a=commit;h=e0c67a189b79725c6b588f297a...
Author: Rob Shearman rob@codeweavers.com Date: Tue Jan 8 18:14:20 2008 +0000
rpcrt4: Implement NdrMapCommAndFaultStatus.
Add tests for this function.
---
dlls/rpcrt4/ndr_clientserver.c | 27 +++++++++++++++++++--- dlls/rpcrt4/tests/ndr_marshall.c | 44 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 4 deletions(-)
diff --git a/dlls/rpcrt4/ndr_clientserver.c b/dlls/rpcrt4/ndr_clientserver.c index 58d21c6..1afab2a 100644 --- a/dlls/rpcrt4/ndr_clientserver.c +++ b/dlls/rpcrt4/ndr_clientserver.c @@ -216,10 +216,29 @@ RPC_STATUS RPC_ENTRY NdrMapCommAndFaultStatus( PMIDL_STUB_MESSAGE pStubMsg, ULONG *pFaultStatus, RPC_STATUS Status ) { - FIXME("(%p, %p, %p, %ld): stub\n", pStubMsg, pCommStatus, pFaultStatus, Status); - - *pCommStatus = 0; - *pFaultStatus = 0; + TRACE("(%p, %p, %p, %ld)\n", pStubMsg, pCommStatus, pFaultStatus, Status); + + switch (Status) + { + case ERROR_INVALID_HANDLE: + case RPC_S_INVALID_BINDING: + case RPC_S_UNKNOWN_IF: + case RPC_S_SERVER_UNAVAILABLE: + case RPC_S_SERVER_TOO_BUSY: + case RPC_S_CALL_FAILED_DNE: + case RPC_S_PROTOCOL_ERROR: + case RPC_S_UNSUPPORTED_TRANS_SYN: + case RPC_S_UNSUPPORTED_TYPE: + case RPC_S_PROCNUM_OUT_OF_RANGE: + case EPT_S_NOT_REGISTERED: + case RPC_S_COMM_FAILURE: + *pCommStatus = Status; + *pFaultStatus = 0; + break; + default: + *pCommStatus = 0; + *pFaultStatus = Status; + }
return RPC_S_OK; } diff --git a/dlls/rpcrt4/tests/ndr_marshall.c b/dlls/rpcrt4/tests/ndr_marshall.c index c9b8fa9..04bb1d9 100644 --- a/dlls/rpcrt4/tests/ndr_marshall.c +++ b/dlls/rpcrt4/tests/ndr_marshall.c @@ -1605,6 +1605,49 @@ todo_wine ok(status == RPC_S_OK, "RpcServerUnregisterIf failed (%lu)\n", status); }
+static void test_NdrMapCommAndFaultStatus(void) +{ + RPC_STATUS rpc_status; + MIDL_STUB_MESSAGE StubMsg; + RPC_MESSAGE RpcMessage; + + NdrClientInitializeNew(&RpcMessage, &StubMsg, &Object_StubDesc, 5); + + for (rpc_status = 0; rpc_status < 10000; rpc_status++) + { + RPC_STATUS status; + ULONG comm_status = 0; + ULONG fault_status = 0; + ULONG expected_comm_status = 0; + ULONG expected_fault_status = 0; + status = NdrMapCommAndFaultStatus(&StubMsg, &comm_status, &fault_status, rpc_status); + ok(status == RPC_S_OK, "NdrMapCommAndFaultStatus failed with error %ld\n", status); + switch (rpc_status) + { + case ERROR_INVALID_HANDLE: + case RPC_S_INVALID_BINDING: + case RPC_S_UNKNOWN_IF: + case RPC_S_SERVER_UNAVAILABLE: + case RPC_S_SERVER_TOO_BUSY: + case RPC_S_CALL_FAILED_DNE: + case RPC_S_PROTOCOL_ERROR: + case RPC_S_UNSUPPORTED_TRANS_SYN: + case RPC_S_UNSUPPORTED_TYPE: + case RPC_S_PROCNUM_OUT_OF_RANGE: + case EPT_S_NOT_REGISTERED: + case RPC_S_COMM_FAILURE: + expected_comm_status = rpc_status; + break; + default: + expected_fault_status = rpc_status; + } + ok(comm_status == expected_comm_status, "NdrMapCommAndFaultStatus should have mapped %ld to comm status %d instead of %d\n", + rpc_status, expected_comm_status, comm_status); + ok(fault_status == expected_fault_status, "NdrMapCommAndFaultStatus should have mapped %ld to fault status %d instead of %d\n", + rpc_status, expected_fault_status, fault_status); + } +} + START_TEST( ndr_marshall ) { test_ndr_simple_type(); @@ -1618,4 +1661,5 @@ START_TEST( ndr_marshall ) test_conformant_string(); test_nonconformant_string(); test_ndr_buffer(); + test_NdrMapCommAndFaultStatus(); }