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