wine/dlls/rpcrt4 ndr_marshall.c
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Nov 28 05:06:17 CST 2005
ChangeSet ID: 21489
CVSROOT: /opt/cvs-commit
Module name: wine
Changes by: julliard at winehq.org 2005/11/28 05:06:17
Modified files:
dlls/rpcrt4 : ndr_marshall.c
Log message:
Robert Shearman <rob at codeweavers.com>
Implement conformant varying array functions.
Patch: http://cvs.winehq.org/patch.py?id=21489
Old revision New revision Changes Path
1.36 1.37 +72 -3 wine/dlls/rpcrt4/ndr_marshall.c
Index: wine/dlls/rpcrt4/ndr_marshall.c
diff -u -p wine/dlls/rpcrt4/ndr_marshall.c:1.36 wine/dlls/rpcrt4/ndr_marshall.c:1.37
--- wine/dlls/rpcrt4/ndr_marshall.c:1.36 28 Nov 2005 11: 6:17 -0000
+++ wine/dlls/rpcrt4/ndr_marshall.c 28 Nov 2005 11: 6:17 -0000
@@ -1956,7 +1956,35 @@ unsigned char* WINAPI NdrConformantVaryi
unsigned char* pMemory,
PFORMAT_STRING pFormat )
{
- FIXME( "stub\n" );
+ DWORD esize = *(const WORD*)(pFormat+2);
+
+ TRACE("(%p, %p, %p)\n", pStubMsg, pMemory, pFormat);
+
+ if (pFormat[0] != RPC_FC_CVARRAY)
+ {
+ ERR("invalid format type %x\n", pFormat[0]);
+ RpcRaiseException(RPC_S_INTERNAL_ERROR);
+ return NULL;
+ }
+
+ 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;
+
+ memcpy(pStubMsg->Buffer, pMemory + pStubMsg->Offset, pStubMsg->ActualCount*esize);
+ pStubMsg->BufferMark = pStubMsg->Buffer;
+ pStubMsg->Buffer += pStubMsg->ActualCount*esize;
+
+ EmbeddedPointerMarshall(pStubMsg, pMemory, pFormat);
+
+ STD_OVERFLOW_CHECK(pStubMsg);
+
return NULL;
}
@@ -1969,7 +1997,29 @@ unsigned char* WINAPI NdrConformantVaryi
PFORMAT_STRING pFormat,
unsigned char fMustAlloc )
{
- FIXME( "stub\n" );
+ DWORD offset;
+ DWORD esize = *(const WORD*)(pFormat+2);
+
+ TRACE("(%p, %p, %p, %d)\n", pStubMsg, ppMemory, pFormat, fMustAlloc);
+
+ if (pFormat[0] != RPC_FC_CVARRAY)
+ {
+ ERR("invalid format type %x\n", pFormat[0]);
+ RpcRaiseException(RPC_S_INTERNAL_ERROR);
+ return NULL;
+ }
+ pFormat = ReadConformance(pStubMsg, pFormat);
+ offset = NDR_LOCAL_UINT32_READ(pStubMsg->Buffer);
+ pStubMsg->Buffer += 4;
+ pFormat = ReadVariance(pStubMsg, pFormat);
+
+ if (!*ppMemory || fMustAlloc)
+ *ppMemory = NdrAllocate(pStubMsg, pStubMsg->MaxCount * esize);
+ memcpy(*ppMemory + offset, pStubMsg->Buffer, pStubMsg->ActualCount * esize);
+ pStubMsg->Buffer += pStubMsg->ActualCount * esize;
+
+ EmbeddedPointerUnmarshall(pStubMsg, ppMemory, pFormat, fMustAlloc);
+
return NULL;
}
@@ -1991,7 +2041,26 @@ void WINAPI NdrConformantVaryingArrayFre
void WINAPI NdrConformantVaryingArrayBufferSize( PMIDL_STUB_MESSAGE pStubMsg,
unsigned char* pMemory, PFORMAT_STRING pFormat )
{
- FIXME( "stub\n" );
+ DWORD esize = *(const WORD*)(pFormat+2);
+
+ TRACE("(%p, %p, %p)\n", pStubMsg, pMemory, pFormat);
+
+ if (pFormat[0] != RPC_FC_CVARRAY)
+ {
+ ERR("invalid format type %x\n", pFormat[0]);
+ RpcRaiseException(RPC_S_INTERNAL_ERROR);
+ return;
+ }
+
+ /* compute size */
+ pFormat = ComputeConformance(pStubMsg, pMemory, pFormat+4, 0);
+ /* compute length */
+ pFormat = ComputeVariance(pStubMsg, pMemory, pFormat, 0);
+
+ /* conformance + offset + variance + array */
+ pStubMsg->BufferLength += 3*sizeof(DWORD) + pStubMsg->ActualCount*esize;
+
+ EmbeddedPointerBufferSize(pStubMsg, pMemory, pFormat);
}
More information about the wine-cvs
mailing list