Jacek Caban : urlmon: Fixed report_data for recursive calls.
Alexandre Julliard
julliard at winehq.org
Fri Aug 21 09:31:51 CDT 2009
Module: wine
Branch: master
Commit: 3d03ccf2530903a84eab4696f70e36cb51782a85
URL: http://source.winehq.org/git/wine.git/?a=commit;h=3d03ccf2530903a84eab4696f70e36cb51782a85
Author: Jacek Caban <jacek at codeweavers.com>
Date: Fri Aug 21 00:14:59 2009 +0200
urlmon: Fixed report_data for recursive calls.
---
dlls/urlmon/bindprot.c | 45 ++++++++++++++++++++++++++++++---------------
1 files changed, 30 insertions(+), 15 deletions(-)
diff --git a/dlls/urlmon/bindprot.c b/dlls/urlmon/bindprot.c
index 14573a8..63f2375 100644
--- a/dlls/urlmon/bindprot.c
+++ b/dlls/urlmon/bindprot.c
@@ -703,7 +703,7 @@ static HRESULT WINAPI ProtocolHandler_Read(IInternetProtocol *iface, void *pv,
TRACE("(%p)->(%p %u %p)\n", This, pv, cb, pcbRead);
- if(This->buf) {
+ if(This->buf_size) {
read = min(cb, This->buf_size);
memcpy(pv, This->buf, read);
@@ -1028,37 +1028,52 @@ static HRESULT report_data(BindProtocol *This, DWORD bscf, ULONG progress, ULONG
return S_OK;
if((This->pi & PI_MIMEVERIFICATION) && !This->reported_mime) {
+ BYTE buf[BUFFER_SIZE];
DWORD read = 0;
LPWSTR mime;
HRESULT hres;
- if(!This->buf) {
- This->buf = heap_alloc(BUFFER_SIZE);
- if(!This->buf)
- return E_OUTOFMEMORY;
- }
-
do {
read = 0;
- hres = IInternetProtocol_Read(This->protocol, This->buf+This->buf_size,
- BUFFER_SIZE-This->buf_size, &read);
+ hres = IInternetProtocol_Read(This->protocol, buf,
+ sizeof(buf)-This->buf_size, &read);
if(FAILED(hres) && hres != E_PENDING)
return hres;
+
+ if(!This->buf) {
+ This->buf = heap_alloc(BUFFER_SIZE);
+ if(!This->buf)
+ return E_OUTOFMEMORY;
+ }else if(read + This->buf_size > BUFFER_SIZE) {
+ BYTE *tmp;
+
+ tmp = heap_realloc(This->buf, read+This->buf_size);
+ if(!tmp)
+ return E_OUTOFMEMORY;
+ This->buf = tmp;
+ }
+
+ memcpy(This->buf+This->buf_size, buf, read);
This->buf_size += read;
}while(This->buf_size < MIME_TEST_SIZE && hres == S_OK);
if(This->buf_size < MIME_TEST_SIZE && hres != S_FALSE)
return S_OK;
- hres = FindMimeFromData(NULL, This->url, This->buf, min(This->buf_size, MIME_TEST_SIZE),
- This->mime, 0, &mime, 0);
- if(FAILED(hres))
- return hres;
+ if(!This->reported_mime) {
+ hres = FindMimeFromData(NULL, This->url, This->buf, min(This->buf_size, MIME_TEST_SIZE),
+ This->mime, 0, &mime, 0);
+ if(FAILED(hres))
+ return hres;
- mime_available(This, mime, TRUE);
- CoTaskMemFree(mime);
+ mime_available(This, mime, TRUE);
+ CoTaskMemFree(mime);
+ }
}
+ if(!This->protocol_sink)
+ return S_OK;
+
return IInternetProtocolSink_ReportData(This->protocol_sink, bscf, progress, progress_max);
}
More information about the wine-cvs
mailing list