Robert Shearman : rpcrt4: Compute variance for complex arrays
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Jan 6 14:49:28 CST 2006
Module: wine
Branch: refs/heads/master
Commit: c96e102fff2313571ecc9bc303a35fe059e8ac11
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=c96e102fff2313571ecc9bc303a35fe059e8ac11
Author: Robert Shearman <rob at codeweavers.com>
Date: Fri Jan 6 21:07:27 2006 +0100
rpcrt4: Compute variance for complex arrays
---
dlls/rpcrt4/ndr_marshall.c | 88 +++++++++++++++++++++++++++++---------------
1 files changed, 57 insertions(+), 31 deletions(-)
diff --git a/dlls/rpcrt4/ndr_marshall.c b/dlls/rpcrt4/ndr_marshall.c
index af90ff3..0df9bed 100644
--- a/dlls/rpcrt4/ndr_marshall.c
+++ b/dlls/rpcrt4/ndr_marshall.c
@@ -300,6 +300,11 @@ static void WINAPI NdrFree(MIDL_STUB_MES
pStubMsg->pfnFree(Pointer);
}
+static inline BOOL IsConformanceOrVariancePresent(PFORMAT_STRING pFormat)
+{
+ return (*(const ULONG *)pFormat != -1);
+}
+
PFORMAT_STRING ReadConformance(MIDL_STUB_MESSAGE *pStubMsg, PFORMAT_STRING pFormat)
{
pStubMsg->MaxCount = NDR_LOCAL_UINT32_READ(pStubMsg->Buffer);
@@ -325,8 +330,7 @@ PFORMAT_STRING ComputeConformanceOrVaria
LPVOID ptr = NULL;
DWORD data = 0;
- /* FIXME: is this correct? */
- if (pFormat[0] == 0xff) {
+ if (!IsConformanceOrVariancePresent(pFormat)) {
/* null descriptor */
*pCount = def;
goto finish_conf;
@@ -2089,24 +2093,32 @@ unsigned char * WINAPI NdrComplexArrayMa
unsigned char *pMemory,
PFORMAT_STRING pFormat)
{
- DWORD size = 0, count, def;
+ ULONG count, def;
+ BOOL variance_present;
+
TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat);
def = *(const WORD*)&pFormat[2];
pFormat += 4;
pFormat = ComputeConformance(pStubMsg, pMemory, pFormat, def);
- size = pStubMsg->MaxCount;
- TRACE("conformance=%ld\n", size);
+ TRACE("conformance = %ld\n", pStubMsg->MaxCount);
- if (*(const DWORD*)pFormat != 0xffffffff)
- FIXME("compute variance\n");
- pFormat += 4;
+ variance_present = IsConformanceOrVariancePresent(pFormat);
+ pFormat = ComputeVariance(pStubMsg, pMemory, pFormat, pStubMsg->MaxCount);
+ TRACE("variance = %ld\n", pStubMsg->ActualCount);
- NDR_LOCAL_UINT32_WRITE(pStubMsg->Buffer, size);
+ NDR_LOCAL_UINT32_WRITE(pStubMsg->Buffer, pStubMsg->MaxCount);
pStubMsg->Buffer += 4;
+ if (variance_present)
+ {
+ NDR_LOCAL_UINT32_WRITE(pStubMsg->Buffer, pStubMsg->Offset);
+ pStubMsg->Buffer += 4;
+ NDR_LOCAL_UINT32_WRITE(pStubMsg->Buffer, pStubMsg->ActualCount);
+ pStubMsg->Buffer += 4;
+ }
- for (count=0; count<size; count++)
+ for (count = 0; count < pStubMsg->ActualCount; count++)
pMemory = ComplexMarshall(pStubMsg, pMemory, pFormat, NULL);
STD_OVERFLOW_CHECK(pStubMsg);
@@ -2122,25 +2134,35 @@ unsigned char * WINAPI NdrComplexArrayUn
PFORMAT_STRING pFormat,
unsigned char fMustAlloc)
{
- DWORD size = 0, count, esize;
+ ULONG offset, count, esize;
unsigned char *pMemory;
+
TRACE("(%p,%p,%p,%d)\n", pStubMsg, ppMemory, pFormat, fMustAlloc);
pFormat += 4;
pFormat = ReadConformance(pStubMsg, pFormat);
- size = pStubMsg->MaxCount;
- TRACE("conformance=%ld\n", size);
-
- pFormat += 4;
+ TRACE("conformance = %ld\n", pStubMsg->MaxCount);
+ if (IsConformanceOrVariancePresent(pFormat))
+ {
+ offset = NDR_LOCAL_UINT32_READ(pStubMsg->Buffer);
+ pStubMsg->Buffer += 4;
+ pFormat = ReadVariance(pStubMsg, pFormat);
+ TRACE("variance = %ld\n", pStubMsg->ActualCount);
+ }
+ else
+ {
+ offset = 0;
+ pStubMsg->ActualCount = pStubMsg->MaxCount;
+ }
esize = ComplexStructSize(pStubMsg, pFormat);
if (fMustAlloc || !*ppMemory)
- *ppMemory = NdrAllocate(pStubMsg, size*esize);
+ *ppMemory = NdrAllocate(pStubMsg, pStubMsg->MaxCount * esize);
pMemory = *ppMemory;
- for (count=0; count<size; count++)
+ for (count = 0; count < pStubMsg->ActualCount; count++)
pMemory = ComplexUnmarshall(pStubMsg, pMemory, pFormat, NULL, fMustAlloc);
return NULL;
@@ -2153,21 +2175,26 @@ void WINAPI NdrComplexArrayBufferSize(PM
unsigned char *pMemory,
PFORMAT_STRING pFormat)
{
- DWORD size = 0, count, def;
+ ULONG count, def;
+ BOOL variance_present;
+
TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat);
def = *(const WORD*)&pFormat[2];
pFormat += 4;
pFormat = ComputeConformance(pStubMsg, pMemory, pFormat, def);
- size = pStubMsg->MaxCount;
- TRACE("conformance=%ld\n", size);
+ TRACE("conformance = %ld\n", pStubMsg->MaxCount);
+ pStubMsg->BufferLength += sizeof(ULONG);
- if (*(const DWORD*)pFormat != 0xffffffff)
- FIXME("compute variance\n");
- pFormat += 4;
+ variance_present = IsConformanceOrVariancePresent(pFormat);
+ pFormat = ComputeVariance(pStubMsg, pMemory, pFormat, pStubMsg->MaxCount);
+ TRACE("variance = %ld\n", pStubMsg->ActualCount);
+
+ if (variance_present)
+ pStubMsg->BufferLength += 2*sizeof(ULONG);
- for (count=0; count<size; count++)
+ for (count=0; count < pStubMsg->ActualCount; count++)
pMemory = ComplexBufferSize(pStubMsg, pMemory, pFormat, NULL);
}
@@ -2198,21 +2225,20 @@ void WINAPI NdrComplexArrayFree(PMIDL_ST
unsigned char *pMemory,
PFORMAT_STRING pFormat)
{
- DWORD size = 0, count, def;
+ ULONG count, def;
+
TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat);
def = *(const WORD*)&pFormat[2];
pFormat += 4;
pFormat = ComputeConformance(pStubMsg, pMemory, pFormat, def);
- size = pStubMsg->MaxCount;
- TRACE("conformance=%ld\n", size);
+ TRACE("conformance = %ld\n", pStubMsg->MaxCount);
- if (*(const DWORD*)pFormat != 0xffffffff)
- FIXME("compute variance\n");
- pFormat += 4;
+ pFormat = ComputeVariance(pStubMsg, pMemory, pFormat, pStubMsg->MaxCount);
+ TRACE("variance = %ld\n", pStubMsg->ActualCount);
- for (count=0; count<size; count++)
+ for (count=0; count < pStubMsg->ActualCount; count++)
pMemory = ComplexFree(pStubMsg, pMemory, pFormat, NULL);
}
More information about the wine-cvs
mailing list