[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