wine/dlls/rpcrt4 ndr_marshall.c
ChangeSet ID: 21489 CVSROOT: /opt/cvs-commit Module name: wine Changes by: julliard(a)winehq.org 2005/11/28 05:06:17 Modified files: dlls/rpcrt4 : ndr_marshall.c Log message: Robert Shearman <rob(a)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); }
participants (1)
-
Alexandre Julliard