From 5c79f82ae58e9ecbca833a83d484b467990e9737 Mon Sep 17 00:00:00 2001 From: Hans Leidekker Date: Thu, 21 Jul 2011 11:51:34 +0200 Subject: [PATCH] winhttp: Implement IWinHttpRequest::WaitForResponse. --- dlls/winhttp/request.c | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/dlls/winhttp/request.c b/dlls/winhttp/request.c index 4d8b489ff23..69c004c42fc 100644 --- a/dlls/winhttp/request.c +++ b/dlls/winhttp/request.c @@ -2517,6 +2517,36 @@ static HRESULT WINAPI winhttp_request_Send( return S_OK; } +static DWORD request_wait_for_response( struct winhttp_request *request, DWORD timeout, VARIANT_BOOL *succeeded ) +{ + DWORD err; + + if (request->state >= REQUEST_STATE_RESPONSE_RECEIVED) return ERROR_SUCCESS; + if (request->state < REQUEST_STATE_SENT) + { + if ((err = wait_for_completion( request, timeout ))) return err; + request->state = REQUEST_STATE_SENT; + } + wait_set_status_callback( request, WINHTTP_CALLBACK_STATUS_HEADERS_AVAILABLE ); + if (!WinHttpReceiveResponse( request->hrequest, NULL )) + { + return GetLastError(); + } + switch ((err = wait_for_completion( request, timeout ))) + { + case WAIT_OBJECT_0: + if (succeeded) *succeeded = VARIANT_TRUE; + break; + case WAIT_TIMEOUT: + if (succeeded) *succeeded = VARIANT_FALSE; + break; + default: + return err; + } + request->state = REQUEST_STATE_RESPONSE_RECEIVED; + return ERROR_SUCCESS; +} + static HRESULT WINAPI winhttp_request_get_Status( IWinHttpRequest *iface, LONG *status ) @@ -2580,8 +2610,12 @@ static HRESULT WINAPI winhttp_request_WaitForResponse( VARIANT timeout, VARIANT_BOOL *succeeded ) { - FIXME("\n"); - return E_NOTIMPL; + struct winhttp_request *request = impl_from_IWinHttpRequest( iface ); + DWORD msecs = (V_I4(&timeout) == -1) ? INFINITE : V_I4(&timeout) * 1000; + + TRACE("%p, %s, %p\n", request, debugstr_variant(&timeout), succeeded); + + return HRESULT_FROM_WIN32( request_wait_for_response( request, msecs, succeeded ) ); } static HRESULT WINAPI winhttp_request_Abort( -- 2.11.4.GIT