Home | Info | Community | Development | myReactOS | Contact Us
Definition at line 1678 of file ndr_stubless.c.
Referenced by RpcAsyncCompleteCall().
{ /* pointer to start of stack where arguments start */ PMIDL_STUB_MESSAGE pStubMsg; struct async_call_data *async_call_data; /* header for procedure string */ const NDR_PROC_HEADER * pProcHeader; RPC_STATUS status = RPC_S_OK; if (!pAsync->StubInfo) return RPC_S_INVALID_ASYNC_HANDLE; async_call_data = pAsync->StubInfo; pStubMsg = async_call_data->pStubMsg; pProcHeader = async_call_data->pProcHeader; /* order of phases: * 1. CALCSIZE - calculate the buffer size * 2. GETBUFFER - allocate the buffer * 3. MARSHAL - marshal [in] params into the buffer * 4. SENDRECEIVE - send buffer * Then in NdrpCompleteAsyncClientCall: * 1. SENDRECEIVE - receive buffer * 2. UNMARSHAL - unmarshal [out] params from buffer */ /* 1. SENDRECEIVE */ TRACE( "RECEIVE\n" ); pStubMsg->RpcMsg->RpcFlags |= RPC_BUFFER_ASYNC; /* receive the [out] params */ if (pProcHeader->handle_type == RPC_FC_AUTO_HANDLE) #if 0 NdrNsReceive(&stubMsg, stubMsg.Buffer, pStubDesc->IMPLICIT_HANDLE_INFO.pAutoHandle); #else FIXME("using auto handle - call NdrNsReceive when it gets implemented\n"); #endif else { status = I_RpcReceive(pStubMsg->RpcMsg); if (status != RPC_S_OK) goto cleanup; pStubMsg->BufferLength = pStubMsg->RpcMsg->BufferLength; pStubMsg->BufferStart = pStubMsg->RpcMsg->Buffer; pStubMsg->BufferEnd = pStubMsg->BufferStart + pStubMsg->BufferLength; pStubMsg->Buffer = pStubMsg->BufferStart; } /* convert strings, floating point values and endianness into our * preferred format */ #if 0 if ((pStubMsg->RpcMsg.DataRepresentation & 0x0000FFFFUL) != NDR_LOCAL_DATA_REPRESENTATION) NdrConvert(pStubMsg, pFormat); #endif /* 2. UNMARSHAL */ TRACE( "UNMARSHAL\n" ); client_do_args(pStubMsg, async_call_data->pParamFormat, STUBLESS_UNMARSHAL, NULL, async_call_data->number_of_params, Reply); cleanup: if (pStubMsg->fHasNewCorrDesc) { /* free extra correlation package */ NdrCorrelationFree(pStubMsg); } /* free the full pointer translation tables */ if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_FULLPTR) NdrFullPointerXlatFree(pStubMsg->FullPtrXlatTables); /* free marshalling buffer */ NdrFreeBuffer(pStubMsg); client_free_handle(pStubMsg, pProcHeader, async_call_data->pHandleFormat, async_call_data->hBinding); I_RpcFree(pStubMsg->StackTop); I_RpcFree(async_call_data); TRACE("-- 0x%x\n", status); return status; }