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