Rob Shearman : rpcrt4: Implement NdrMapCommAndFaultStatus.
Alexandre Julliard
julliard at winehq.org
Wed Jan 9 07:01:48 CST 2008
Module: wine
Branch: master
Commit: e0c67a189b79725c6b588f297a8dd1a482414f67
URL: http://source.winehq.org/git/wine.git/?a=commit;h=e0c67a189b79725c6b588f297a8dd1a482414f67
Author: Rob Shearman <rob at 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();
}
More information about the wine-cvs
mailing list