Robert Shearman : rpcrt4: Implement NdrNonEncapsulatedUnionMemorySize.

Alexandre Julliard julliard at wine.codeweavers.com
Thu May 18 03:56:54 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: c1d00c547b9cb4908ccf0050801e38a35206210b
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=c1d00c547b9cb4908ccf0050801e38a35206210b

Author: Robert Shearman <rob at codeweavers.com>
Date:   Thu May 18 03:39:34 2006 +0100

rpcrt4: Implement NdrNonEncapsulatedUnionMemorySize.

---

 dlls/rpcrt4/ndr_marshall.c |   56 +++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 50 insertions(+), 6 deletions(-)

diff --git a/dlls/rpcrt4/ndr_marshall.c b/dlls/rpcrt4/ndr_marshall.c
index 231f7a5..9045902 100644
--- a/dlls/rpcrt4/ndr_marshall.c
+++ b/dlls/rpcrt4/ndr_marshall.c
@@ -3834,15 +3834,59 @@ void WINAPI NdrNonEncapsulatedUnionBuffe
 unsigned long WINAPI NdrNonEncapsulatedUnionMemorySize(PMIDL_STUB_MESSAGE pStubMsg,
                                 PFORMAT_STRING pFormat)
 {
+    unsigned long discriminant;
+    unsigned short type, size;
+
+    pFormat++;
+    /* Unmarshall discriminant */
+    discriminant = unmarshall_discriminant(pStubMsg, &pFormat);
+    TRACE("unmarshalled discriminant 0x%lx\n", discriminant);
+
+    pFormat += *(const SHORT*)pFormat;
+
+    size = *(const unsigned short*)pFormat;
     pFormat += 2;
-    if (pStubMsg->fHasNewCorrDesc)
-        pFormat += 6;
+
+    pFormat = get_arm_offset_from_union_arm_selector(pStubMsg, discriminant, pFormat);
+    if(!pFormat)
+        return 0;
+
+    pStubMsg->Memory += size;
+
+    type = *(const unsigned short*)pFormat;
+    if((type & 0xff00) == 0x8000)
+    {
+        return NdrBaseTypeMemorySize(pStubMsg, pFormat);
+    }
     else
-        pFormat += 4;
+    {
+        PFORMAT_STRING desc = pFormat + *(const SHORT*)pFormat;
+        NDR_MEMORYSIZE m = NdrMemorySizer[*desc & NDR_TABLE_MASK];
+        unsigned char *saved_buffer;
+        if (m)
+        {
+            switch(*desc)
+            {
+            case RPC_FC_RP:
+            case RPC_FC_UP:
+            case RPC_FC_OP:
+            case RPC_FC_FP:
+                ALIGN_POINTER(pStubMsg->Buffer, 4);
+                saved_buffer = pStubMsg->Buffer;
+                pStubMsg->Buffer += 4;
+                ALIGN_LENGTH(pStubMsg->MemorySize, 4);
+                pStubMsg->MemorySize += 4;
+                PointerMemorySize(pStubMsg, saved_buffer, pFormat);
+                break;
+            default:
+                return m(pStubMsg, desc);
+            }
+        }
+        else FIXME("no marshaller for embedded type %02x\n", *desc);
+    }
 
-    pFormat += *(const SHORT*)pFormat;
-    TRACE("size %d\n", *(const SHORT*)pFormat);
-    return *(const SHORT*)pFormat;
+    TRACE("size %d\n", size);
+    return size;
 }
 
 /***********************************************************************




More information about the wine-cvs mailing list