Robert Shearman : rpcrt4:
Move the writing and sizing of variances and conformances to common
functions .
Alexandre Julliard
julliard at wine.codeweavers.com
Wed May 10 12:56:54 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: 265045d251c0966fff6170168dbf84003a33444b
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=265045d251c0966fff6170168dbf84003a33444b
Author: Robert Shearman <rob at codeweavers.com>
Date: Wed May 10 13:13:15 2006 +0100
rpcrt4: Move the writing and sizing of variances and conformances to common functions.
---
dlls/rpcrt4/ndr_marshall.c | 88 +++++++++++++++++++++++++++-----------------
1 files changed, 53 insertions(+), 35 deletions(-)
diff --git a/dlls/rpcrt4/ndr_marshall.c b/dlls/rpcrt4/ndr_marshall.c
index a4fa2d7..a3bdcf5 100644
--- a/dlls/rpcrt4/ndr_marshall.c
+++ b/dlls/rpcrt4/ndr_marshall.c
@@ -340,6 +340,34 @@ done:
return pFormat+4;
}
+/* writes the conformance value to the buffer */
+static inline void WriteConformance(MIDL_STUB_MESSAGE *pStubMsg)
+{
+ NDR_LOCAL_UINT32_WRITE(pStubMsg->Buffer, pStubMsg->MaxCount);
+ pStubMsg->Buffer += 4;
+}
+
+/* writes the variance values to the buffer */
+static inline void WriteVariance(MIDL_STUB_MESSAGE *pStubMsg)
+{
+ NDR_LOCAL_UINT32_WRITE(pStubMsg->Buffer, pStubMsg->Offset);
+ pStubMsg->Buffer += 4;
+ NDR_LOCAL_UINT32_WRITE(pStubMsg->Buffer, pStubMsg->ActualCount);
+ pStubMsg->Buffer += 4;
+}
+
+/* requests buffer space for the conformance value */
+static inline void SizeConformance(MIDL_STUB_MESSAGE *pStubMsg)
+{
+ pStubMsg->BufferLength += 4;
+}
+
+/* requests buffer space for the variance values */
+static inline void SizeVariance(MIDL_STUB_MESSAGE *pStubMsg)
+{
+ pStubMsg->BufferLength += 8;
+}
+
PFORMAT_STRING ComputeConformanceOrVariance(
MIDL_STUB_MESSAGE *pStubMsg, unsigned char *pMemory,
PFORMAT_STRING pFormat, ULONG_PTR def, ULONG *pCount)
@@ -483,7 +511,6 @@ unsigned char *WINAPI NdrConformantStrin
unsigned char *pszMessage, PFORMAT_STRING pFormat)
{
unsigned long len, esize;
- unsigned char *c;
TRACE("(pStubMsg == ^%p, pszMessage == ^%p, pFormat == ^%p)\n", pStubMsg, pszMessage, pFormat);
@@ -510,15 +537,13 @@ unsigned char *WINAPI NdrConformantStrin
assert( (pStubMsg->BufferLength >= (len*esize + 13)) && (pStubMsg->Buffer != NULL) );
- c = pStubMsg->Buffer;
- memset(c, 0, 12);
- NDR_LOCAL_UINT32_WRITE(c, len); /* max length: strlen + 1 (for '\0') */
- c += 8; /* offset: 0 */
- NDR_LOCAL_UINT32_WRITE(c, len); /* actual length: (same) */
- c += 4;
- memcpy(c, pszMessage, len*esize); /* the string itself */
- c += len*esize;
- pStubMsg->Buffer = c;
+ pStubMsg->MaxCount = pStubMsg->ActualCount = len;
+ pStubMsg->Offset = 0;
+ WriteConformance(pStubMsg);
+ WriteVariance(pStubMsg);
+
+ memcpy(pStubMsg->Buffer, pszMessage, len*esize); /* the string itself */
+ pStubMsg->Buffer += len*esize;
STD_OVERFLOW_CHECK(pStubMsg);
@@ -534,16 +559,19 @@ void WINAPI NdrConformantStringBufferSiz
{
TRACE("(pStubMsg == ^%p, pMemory == ^%p, pFormat == ^%p)\n", pStubMsg, pMemory, pFormat);
+ SizeConformance(pStubMsg);
+ SizeVariance(pStubMsg);
+
assert(pFormat);
if (*pFormat == RPC_FC_C_CSTRING) {
- /* we need 12 octets for the [maxlen, offset, len] DWORDS, + 1 octet for '\0' */
+ /* we need + 1 octet for '\0' */
TRACE("string=%s\n", debugstr_a((char*)pMemory));
- pStubMsg->BufferLength += strlen((char*)pMemory) + 13 + BUFFER_PARANOIA;
+ pStubMsg->BufferLength += strlen((char*)pMemory) + 1 + BUFFER_PARANOIA;
}
else if (*pFormat == RPC_FC_C_WSTRING) {
- /* we need 12 octets for the [maxlen, offset, len] DWORDS, + 2 octets for L'\0' */
+ /* we need + 2 octets for L'\0' */
TRACE("string=%s\n", debugstr_w((LPWSTR)pMemory));
- pStubMsg->BufferLength += strlenW((LPWSTR)pMemory)*2 + 14 + BUFFER_PARANOIA;
+ pStubMsg->BufferLength += strlenW((LPWSTR)pMemory)*2 + 2 + BUFFER_PARANOIA;
}
else {
ERR("Unhandled string type: %#x\n", *pFormat);
@@ -1914,8 +1942,7 @@ unsigned char * WINAPI NdrConformantArra
pFormat = ComputeConformance(pStubMsg, pMemory, pFormat+4, 0);
size = pStubMsg->MaxCount;
- NDR_LOCAL_UINT32_WRITE(pStubMsg->Buffer, size);
- pStubMsg->Buffer += 4;
+ WriteConformance(pStubMsg);
ALIGN_POINTER(pStubMsg->Buffer, alignment);
@@ -1977,7 +2004,8 @@ void WINAPI NdrConformantArrayBufferSize
pFormat = ComputeConformance(pStubMsg, pMemory, pFormat+4, 0);
size = pStubMsg->MaxCount;
- pStubMsg->BufferLength += 4;
+
+ SizeVariance(pStubMsg);
ALIGN_LENGTH(pStubMsg->BufferLength, alignment);
@@ -2043,12 +2071,8 @@ unsigned char* WINAPI NdrConformantVaryi
pFormat = ComputeConformance(pStubMsg, pMemory, pFormat+4, 0);
pFormat = ComputeVariance(pStubMsg, pMemory, pFormat, 0);
- NDR_LOCAL_UINT32_WRITE(pStubMsg->Buffer, pStubMsg->MaxCount);
- pStubMsg->Buffer += 4;
- NDR_LOCAL_UINT32_WRITE(pStubMsg->Buffer, pStubMsg->Offset);
- pStubMsg->Buffer += 4;
- NDR_LOCAL_UINT32_WRITE(pStubMsg->Buffer, pStubMsg->ActualCount);
- pStubMsg->Buffer += 4;
+ WriteConformance(pStubMsg);
+ WriteVariance(pStubMsg);
ALIGN_POINTER(pStubMsg->Buffer, alignment);
@@ -2146,8 +2170,8 @@ void WINAPI NdrConformantVaryingArrayBuf
/* compute length */
pFormat = ComputeVariance(pStubMsg, pMemory, pFormat, 0);
- /* conformance + offset + variance */
- pStubMsg->BufferLength += 3 * sizeof(DWORD);
+ SizeConformance(pStubMsg);
+ SizeVariance(pStubMsg);
ALIGN_LENGTH(pStubMsg->BufferLength, alignment);
@@ -2200,15 +2224,9 @@ unsigned char * WINAPI NdrComplexArrayMa
pFormat = ComputeVariance(pStubMsg, pMemory, pFormat, pStubMsg->MaxCount);
TRACE("variance = %ld\n", pStubMsg->ActualCount);
- NDR_LOCAL_UINT32_WRITE(pStubMsg->Buffer, pStubMsg->MaxCount);
- pStubMsg->Buffer += 4;
+ WriteConformance(pStubMsg);
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;
- }
+ WriteVariance(pStubMsg);
ALIGN_POINTER(pStubMsg->Buffer, alignment);
@@ -2292,14 +2310,14 @@ void WINAPI NdrComplexArrayBufferSize(PM
pFormat = ComputeConformance(pStubMsg, pMemory, pFormat, def);
TRACE("conformance = %ld\n", pStubMsg->MaxCount);
- pStubMsg->BufferLength += sizeof(ULONG);
+ SizeConformance(pStubMsg);
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);
+ SizeVariance(pStubMsg);
ALIGN_LENGTH(pStubMsg->BufferLength, alignment);
More information about the wine-cvs
mailing list