[1/3] winhttp: Convert the request buffer to a SAFEARRAY.

Hans Leidekker hans at codeweavers.com
Fri Jul 22 09:00:12 CDT 2011


---
 dlls/winhttp/request.c |   63 ++++++++++++++++++++++++++++++++---------------
 1 files changed, 43 insertions(+), 20 deletions(-)

diff --git a/dlls/winhttp/request.c b/dlls/winhttp/request.c
index 5d10410..0c4c726 100644
--- a/dlls/winhttp/request.c
+++ b/dlls/winhttp/request.c
@@ -2156,8 +2156,8 @@ struct winhttp_request
     HINTERNET hrequest;
     HANDLE wait;
     HANDLE cancel;
-    char *buffer;
-    char *ptr;
+    SAFEARRAY *buffer;
+    DWORD offset;
     DWORD bytes_available;
     DWORD bytes_read;
     LONG resolve_timeout;
@@ -2191,7 +2191,7 @@ static ULONG WINAPI winhttp_request_Release(
         WinHttpCloseHandle( request->hsession );
         CloseHandle( request->wait );
         CloseHandle( request->cancel );
-        heap_free( request->buffer );
+        SafeArrayDestroy( request->buffer );
         heap_free( request );
     }
     return refs;
@@ -2618,13 +2618,21 @@ static HRESULT WINAPI winhttp_request_get_StatusText(
 static DWORD request_read_body( struct winhttp_request *request, DWORD timeout )
 {
     DWORD err, size, total_bytes_read, buflen = 4096;
+    HRESULT hr;
+    char *ptr;
 
     if (request->state >= REQUEST_STATE_BODY_RECEIVED) return ERROR_SUCCESS;
     if ((err = request_wait_for_response( request, timeout, NULL ))) return err;
 
-    if (!(request->buffer = heap_alloc( buflen ))) return E_OUTOFMEMORY;
+    if (!(request->buffer = SafeArrayCreateVector( VT_UI1, 0, buflen ))) return E_OUTOFMEMORY;
+    if ((hr = SafeArrayAccessData( request->buffer, (void **)&ptr )) != S_OK)
+    {
+        SafeArrayDestroy( request->buffer );
+        request->buffer = NULL;
+        return hr;
+    }
     size = total_bytes_read = 0;
-    request->ptr = request->buffer;
+    request->offset = 0;
     do
     {
         wait_set_status_callback( request, WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE );
@@ -2638,33 +2646,41 @@ static DWORD request_read_body( struct winhttp_request *request, DWORD timeout )
         size += request->bytes_available;
         if (buflen < size)
         {
-            char *tmp;
+            SAFEARRAYBOUND bound;
+
             while (buflen < size) buflen *= 2;
-            if (!(tmp = heap_realloc( request->buffer, buflen )))
+            bound.lLbound = 0;
+            bound.cElements = buflen;
+            SafeArrayUnaccessData( request->buffer );
+            if ((hr = SafeArrayRedim( request->buffer, &bound )) != S_OK ||
+                (hr = SafeArrayAccessData( request->buffer, (void **)&ptr )) != S_OK)
             {
-                err = ERROR_OUTOFMEMORY;
-                goto error;
+                SafeArrayDestroy( request->buffer );
+                request->buffer = NULL;
+                WARN("error %08x\n", hr);
+                return hr;
             }
-            request->buffer = tmp;
         }
         wait_set_status_callback( request, WINHTTP_CALLBACK_STATUS_READ_COMPLETE );
-        if (!WinHttpReadData( request->hrequest, request->ptr, request->bytes_available, &request->bytes_read ))
+        if (!WinHttpReadData( request->hrequest, ptr + request->offset, request->bytes_available, &request->bytes_read ))
         {
             err = GetLastError();
             goto error;
         }
         wait_for_completion( request, timeout );
         total_bytes_read += request->bytes_read;
-        request->ptr += request->bytes_read;
+        request->offset += request->bytes_read;
     } while (request->bytes_read);
 
     request->state = REQUEST_STATE_BODY_RECEIVED;
+    SafeArrayUnaccessData( request->buffer );
     return ERROR_SUCCESS;
 
 error:
-    heap_free( request->buffer );
+    SafeArrayUnaccessData( request->buffer );
+    SafeArrayDestroy( request->buffer );
     request->buffer = NULL;
-    TRACE("error %u\n", err);
+    WARN("error %u\n", err);
     return err;
 }
 
@@ -2706,6 +2722,8 @@ static HRESULT WINAPI winhttp_request_get_ResponseText(
     struct winhttp_request *request = impl_from_IWinHttpRequest( iface );
     UINT codepage;
     DWORD err;
+    HRESULT hr;
+    char *ptr;
     int len;
 
     TRACE("%p, %p\n", request, body);
@@ -2713,11 +2731,16 @@ static HRESULT WINAPI winhttp_request_get_ResponseText(
     if ((err = request_read_body( request, INFINITE ))) return HRESULT_FROM_WIN32( err );
     if ((err = request_get_codepage( request, &codepage ))) return HRESULT_FROM_WIN32( err );
 
-    len = MultiByteToWideChar( codepage, 0, request->buffer, request->ptr - request->buffer, NULL, 0 );
-    if (!(*body = SysAllocStringLen( NULL, len ))) return E_OUTOFMEMORY;
-    MultiByteToWideChar( codepage, 0, request->buffer, request->ptr - request->buffer, *body, len );
+    if ((hr = SafeArrayAccessData( request->buffer, (void **)&ptr )) != S_OK) return hr;
+    len = MultiByteToWideChar( codepage, 0, ptr, request->offset, NULL, 0 );
+    if (!(*body = SysAllocStringLen( NULL, len )))
+    {
+        SafeArrayUnaccessData( request->buffer );
+        return E_OUTOFMEMORY;
+    }
+    MultiByteToWideChar( codepage, 0, ptr, request->offset, *body, len );
     (*body)[len] = 0;
-    return S_OK;
+    return SafeArrayUnaccessData( request->buffer );
 }
 
 static HRESULT WINAPI winhttp_request_get_ResponseBody(
@@ -2780,7 +2803,7 @@ static HRESULT WINAPI winhttp_request_Abort(
     WinHttpCloseHandle( request->hsession );
     CloseHandle( request->wait );
     CloseHandle( request->cancel );
-    heap_free( request->buffer );
+    SafeArrayDestroy( request->buffer );
     request->state = REQUEST_STATE_INVALID;
     request->hrequest = NULL;
     request->hconnect = NULL;
@@ -2788,7 +2811,7 @@ static HRESULT WINAPI winhttp_request_Abort(
     request->wait     = NULL;
     request->cancel   = NULL;
     request->buffer   = NULL;
-    request->ptr      = NULL;
+    request->offset = 0;
     request->bytes_available = 0;
     request->bytes_read = 0;
     return S_OK;
-- 
1.7.4.1







More information about the wine-patches mailing list