Hans Leidekker : winhttp: Implement IWinHttpRequest::WaitForResponse.
Alexandre Julliard
julliard at winehq.org
Thu Jul 21 10:50:49 CDT 2011
Module: wine
Branch: master
Commit: 5c79f82ae58e9ecbca833a83d484b467990e9737
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5c79f82ae58e9ecbca833a83d484b467990e9737
Author: Hans Leidekker <hans at codeweavers.com>
Date: Thu Jul 21 11:51:34 2011 +0200
winhttp: Implement IWinHttpRequest::WaitForResponse.
---
dlls/winhttp/request.c | 38 ++++++++++++++++++++++++++++++++++++--
1 files changed, 36 insertions(+), 2 deletions(-)
diff --git a/dlls/winhttp/request.c b/dlls/winhttp/request.c
index 4d8b489..69c004c 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(
More information about the wine-cvs
mailing list