Jacek Caban : urlmon: Properly handle BINDSTATUS_BEGINDOWNLOADDATA.
Alexandre Julliard
julliard at winehq.org
Tue Feb 15 11:29:29 CST 2011
Module: wine
Branch: master
Commit: 8bee20d85f0ac1d33f0a53c8960b878bf7073155
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8bee20d85f0ac1d33f0a53c8960b878bf7073155
Author: Jacek Caban <jacek at codeweavers.com>
Date: Tue Feb 15 17:02:02 2011 +0100
urlmon: Properly handle BINDSTATUS_BEGINDOWNLOADDATA.
---
dlls/urlmon/bindprot.c | 10 +++++++++-
dlls/urlmon/tests/protocol.c | 32 ++++++++++++++++++++++++--------
dlls/urlmon/urlmon_main.h | 4 ++++
3 files changed, 37 insertions(+), 9 deletions(-)
diff --git a/dlls/urlmon/bindprot.c b/dlls/urlmon/bindprot.c
index 095194e..01a1b90 100644
--- a/dlls/urlmon/bindprot.c
+++ b/dlls/urlmon/bindprot.c
@@ -962,7 +962,6 @@ static void report_progress(BindProtocol *This, ULONG status_code, LPCWSTR statu
case BINDSTATUS_FINDINGRESOURCE:
case BINDSTATUS_CONNECTING:
case BINDSTATUS_REDIRECTING:
- case BINDSTATUS_BEGINDOWNLOADDATA:
case BINDSTATUS_SENDINGREQUEST:
case BINDSTATUS_CACHEFILENAMEAVAILABLE:
case BINDSTATUS_DIRECTBIND:
@@ -971,6 +970,11 @@ static void report_progress(BindProtocol *This, ULONG status_code, LPCWSTR statu
IInternetProtocolSink_ReportProgress(This->protocol_sink, status_code, status_text);
break;
+ case BINDSTATUS_BEGINDOWNLOADDATA:
+ if(This->protocol_sink)
+ IInternetProtocolSink_ReportData(This->protocol_sink, This->bscf, This->progress, This->progress_max);
+ break;
+
case BINDSTATUS_MIMETYPEAVAILABLE:
mime_available(This, status_text, FALSE);
break;
@@ -1026,6 +1030,10 @@ static HRESULT WINAPI BPInternetProtocolSink_ReportProgress(IInternetProtocolSin
static HRESULT report_data(BindProtocol *This, DWORD bscf, ULONG progress, ULONG progress_max)
{
+ This->bscf = bscf;
+ This->progress = progress;
+ This->progress_max = progress_max;
+
if(!This->protocol_sink)
return S_OK;
diff --git a/dlls/urlmon/tests/protocol.c b/dlls/urlmon/tests/protocol.c
index dcfe20c..cacad26 100644
--- a/dlls/urlmon/tests/protocol.c
+++ b/dlls/urlmon/tests/protocol.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2005-2009 Jacek Caban for CodeWeavers
+ * Copyright 2005-2011 Jacek Caban for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -166,6 +166,7 @@ static enum {
HTTPS_TEST,
FTP_TEST,
MK_TEST,
+ ITS_TEST,
BIND_TEST
} tested_protocol;
@@ -175,6 +176,7 @@ static const WCHAR protocol_names[][10] = {
{'h','t','t','p','s',0},
{'f','t','p',0},
{'m','k',0},
+ {'i','t','s',0},
{'t','e','s','t',0}
};
@@ -188,6 +190,7 @@ static const WCHAR binding_urls[][130] = {
'/','p','u','b','/','o','t','h','e','r',
'/','w','i','n','e','l','o','g','o','.','x','c','f','.','t','a','r','.','b','z','2',0},
{'m','k',':','t','e','s','t',0},
+ {'i','t','s',':','t','e','s','t','.','c','h','m',':',':','/','b','l','a','n','k','.','h','t','m','l',0},
{'t','e','s','t',':','/','/','f','i','l','e','.','h','t','m','l',0}
};
@@ -725,7 +728,7 @@ static HRESULT WINAPI ProtocolSink_ReportProgress(IInternetProtocolSink *iface,
switch(ulStatusCode) {
case BINDSTATUS_MIMETYPEAVAILABLE:
CHECK_EXPECT(ReportProgress_MIMETYPEAVAILABLE);
- if(tested_protocol != FILE_TEST && !mimefilter_test && (pi & PI_MIMEVERIFICATION)) {
+ if(tested_protocol != FILE_TEST && tested_protocol != ITS_TEST && !mimefilter_test && (pi & PI_MIMEVERIFICATION)) {
if(!short_read || !direct_read)
CHECK_CALLED(Read); /* set in Continue */
else if(short_read)
@@ -779,7 +782,7 @@ static HRESULT WINAPI ProtocolSink_ReportProgress(IInternetProtocolSink *iface,
break;
case BINDSTATUS_SENDINGREQUEST:
CHECK_EXPECT2(ReportProgress_SENDINGREQUEST);
- if(tested_protocol == FILE_TEST) {
+ if(tested_protocol == FILE_TEST || tested_protocol == ITS_TEST) {
ok(szStatusText != NULL, "szStatusText == NULL\n");
if(szStatusText)
ok(!*szStatusText, "wrong szStatusText\n");
@@ -843,16 +846,19 @@ static HRESULT WINAPI ProtocolSink_ReportData(IInternetProtocolSink *iface, DWOR
static int rec_depth;
rec_depth++;
- if(!mimefilter_test && tested_protocol == FILE_TEST) {
+ if(!mimefilter_test && (tested_protocol == FILE_TEST || tested_protocol == ITS_TEST)) {
CHECK_EXPECT2(ReportData);
ok(ulProgress == ulProgressMax, "ulProgress (%d) != ulProgressMax (%d)\n",
ulProgress, ulProgressMax);
ok(ulProgressMax == 13, "ulProgressMax=%d, expected 13\n", ulProgressMax);
/* BSCF_SKIPDRAINDATAFORFILEURLS added in IE8 */
- ok((grfBSCF == (BSCF_FIRSTDATANOTIFICATION | BSCF_LASTDATANOTIFICATION)) ||
- (grfBSCF == (BSCF_FIRSTDATANOTIFICATION | BSCF_LASTDATANOTIFICATION | BSCF_SKIPDRAINDATAFORFILEURLS)),
- "grcfBSCF = %08x\n", grfBSCF);
+ if(tested_protocol == FILE_TEST)
+ ok((grfBSCF == (BSCF_FIRSTDATANOTIFICATION | BSCF_LASTDATANOTIFICATION)) ||
+ (grfBSCF == (BSCF_FIRSTDATANOTIFICATION | BSCF_LASTDATANOTIFICATION | BSCF_SKIPDRAINDATAFORFILEURLS)),
+ "grcfBSCF = %08x\n", grfBSCF);
+ else
+ ok(grfBSCF == (BSCF_FIRSTDATANOTIFICATION | BSCF_DATAFULLYAVAILABLE), "grcfBSCF = %08x\n", grfBSCF);
}else if(direct_read) {
BYTE buf[14096];
ULONG read;
@@ -1634,13 +1640,21 @@ static void protocol_start(IInternetProtocolSink *pOIProtSink, IInternetBindInfo
else
SET_EXPECT(ReportData);
hres = IInternetProtocolSink_ReportData(pOIProtSink,
- BSCF_FIRSTDATANOTIFICATION | BSCF_LASTDATANOTIFICATION, 13, 13);
+ BSCF_FIRSTDATANOTIFICATION | (tested_protocol == ITS_TEST ? BSCF_DATAFULLYAVAILABLE : BSCF_LASTDATANOTIFICATION),
+ 13, 13);
ok(hres == S_OK, "ReportData failed: %08x\n", hres);
if(mimefilter_test)
CHECK_CALLED(MimeFilter_ReportData);
else
CHECK_CALLED(ReportData);
+ if(tested_protocol == ITS_TEST) {
+ SET_EXPECT(ReportData);
+ hres = IInternetProtocolSink_ReportProgress(pOIProtSink, BINDSTATUS_BEGINDOWNLOADDATA, NULL);
+ ok(hres == S_OK, "ReportProgress(BINDSTATUS_BEGINDOWNLOADDATA) failed: %08x\n", hres);
+ CHECK_CALLED(ReportData);
+ }
+
if(tested_protocol == BIND_TEST) {
hres = IInternetProtocol_Terminate(binding_protocol, 0);
ok(hres == E_FAIL, "Termiante failed: %08x\n", hres);
@@ -3503,6 +3517,8 @@ START_TEST(protocol)
test_binding(FILE_TEST, PI_MIMEVERIFICATION, TEST_EMULATEPROT);
trace("Testing http binding (mime verification, emulate prot)...\n");
test_binding(HTTP_TEST, PI_MIMEVERIFICATION, TEST_EMULATEPROT);
+ trace("Testing its binding (mime verification, emulate prot)...\n");
+ test_binding(ITS_TEST, PI_MIMEVERIFICATION, TEST_EMULATEPROT);
trace("Testing http binding (mime verification, emulate prot, short read, direct read)...\n");
test_binding(HTTP_TEST, PI_MIMEVERIFICATION, TEST_EMULATEPROT|TEST_SHORT_READ|TEST_DIRECT_READ);
trace("Testing file binding (mime verification, emulate prot, mime filter)...\n");
diff --git a/dlls/urlmon/urlmon_main.h b/dlls/urlmon/urlmon_main.h
index 8edb708..83b887e 100644
--- a/dlls/urlmon/urlmon_main.h
+++ b/dlls/urlmon/urlmon_main.h
@@ -191,6 +191,10 @@ typedef struct {
BOOL from_urlmon;
DWORD pi;
+ DWORD bscf;
+ ULONG progress;
+ ULONG progress_max;
+
DWORD apartment_thread;
HWND notif_hwnd;
DWORD continue_call;
More information about the wine-cvs
mailing list