Module: wine Branch: refs/heads/master Commit: c1d00c547b9cb4908ccf0050801e38a35206210b URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=c1d00c547b9cb4908ccf0050...
Author: Robert Shearman rob@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; }
/***********************************************************************