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