From: Shaun Ren sren@codeweavers.com
Signed-off-by: Shaun Ren sren@codeweavers.com --- dlls/webservices/msg.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-)
diff --git a/dlls/webservices/msg.c b/dlls/webservices/msg.c index f61fc337f0f..37d40c423d4 100644 --- a/dlls/webservices/msg.c +++ b/dlls/webservices/msg.c @@ -1044,6 +1044,8 @@ HRESULT WINAPI WsReadBody( WS_MESSAGE *handle, const WS_ELEMENT_DESCRIPTION *des WS_HEAP *heap, void *value, ULONG size, WS_ERROR *error ) { struct msg *msg = (struct msg *)handle; + WS_ELEMENT_DESCRIPTION tmp; + WS_FAULT_DESCRIPTION fault_desc; HRESULT hr;
TRACE( "%p %p %u %p %p %lu %p\n", handle, desc, option, heap, value, size, error ); @@ -1060,7 +1062,23 @@ HRESULT WINAPI WsReadBody( WS_MESSAGE *handle, const WS_ELEMENT_DESCRIPTION *des }
if (msg->state != WS_MESSAGE_STATE_READING) hr = WS_E_INVALID_OPERATION; - else hr = WsReadElement( msg->reader_body, desc, option, heap, value, size, NULL ); + else + { + if (!desc->typeDescription) + { + if (desc->type == WS_FAULT_TYPE) + { + memcpy( &tmp, desc, sizeof(*desc) ); + fault_desc.envelopeVersion = msg->version_env; + tmp.typeDescription = &fault_desc; + desc = &tmp; + } + else if (desc->type == WS_ENDPOINT_ADDRESS_TYPE) + FIXME( "!desc->typeDescription with WS_ENDPOINT_ADDRESS_TYPE\n" ); + } + + hr = WsReadElement( msg->reader_body, desc, option, heap, value, size, NULL ); + }
LeaveCriticalSection( &msg->cs ); TRACE( "returning %#lx\n", hr );