Jacek Caban : urlmon: Added some tests and fixes of file protocol.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Dec 19 03:22:37 CST 2005


Module: wine
Branch: refs/heads/master
Commit: 7458d7416986a8e0680c4e40866393ebdecd6a51
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=7458d7416986a8e0680c4e40866393ebdecd6a51

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Dec 19 09:52:30 2005 +0100

urlmon: Added some tests and fixes of file protocol.

---

 dlls/urlmon/file.c           |   35 +++++++++++++++++++++++------------
 dlls/urlmon/tests/protocol.c |   24 +++++++++++++++++++-----
 2 files changed, 42 insertions(+), 17 deletions(-)

diff --git a/dlls/urlmon/file.c b/dlls/urlmon/file.c
index 61c312c..b76bb4a 100644
--- a/dlls/urlmon/file.c
+++ b/dlls/urlmon/file.c
@@ -110,7 +110,9 @@ static HRESULT WINAPI FileProtocol_Start
     LARGE_INTEGER size;
     DWORD len;
     LPWSTR url, mime = NULL;
+    LPCWSTR file_name;
     WCHAR null_char = 0;
+    BOOL first_call = FALSE;
     HRESULT hres;
 
     static const WCHAR wszFile[]  = {'f','i','l','e',':'};
@@ -134,33 +136,39 @@ static HRESULT WINAPI FileProtocol_Start
         return hres;
     }
 
-    hres = FindMimeFromData(NULL, url, NULL, 0, NULL, 0, &mime, 0);
-    if(SUCCEEDED(hres))
-        IInternetProtocolSink_ReportProgress(pOIProtSink, BINDSTATUS_DIRECTBIND, mime);
+    IInternetProtocolSink_ReportProgress(pOIProtSink, BINDSTATUS_DIRECTBIND, NULL);
 
     if(!This->file) {
+        first_call = TRUE;
+
         IInternetProtocolSink_ReportProgress(pOIProtSink, BINDSTATUS_SENDINGREQUEST, &null_char);
 
-        This->file = CreateFileW(url+sizeof(wszFile)/sizeof(WCHAR), GENERIC_READ, FILE_SHARE_READ,
-                NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+        file_name = url+sizeof(wszFile)/sizeof(WCHAR);
+        if(file_name[0] == '/' && file_name[1] == '/' && file_name[2] == '/')
+            file_name += 3;
+
+        This->file = CreateFileW(file_name, GENERIC_READ, FILE_SHARE_READ, NULL,
+                                 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
 
         if(This->file == INVALID_HANDLE_VALUE) {
             This->file = NULL;
             IInternetProtocolSink_ReportResult(pOIProtSink, INET_E_RESOURCE_NOT_FOUND,
                     GetLastError(), NULL);
             HeapFree(GetProcessHeap(), 0, url);
-            CoTaskMemFree(mime);
             return INET_E_RESOURCE_NOT_FOUND;
         }
 
-        IInternetProtocolSink_ReportProgress(pOIProtSink, BINDSTATUS_CACHEFILENAMEAVAILABLE,
-                url+sizeof(wszFile)/sizeof(WCHAR));
-        if(mime)
-            IInternetProtocolSink_ReportProgress(pOIProtSink, BINDSTATUS_MIMETYPEAVAILABLE, mime);
-        IInternetProtocolSink_ReportResult(pOIProtSink, S_OK, 0, NULL);
+        IInternetProtocolSink_ReportProgress(pOIProtSink,
+                BINDSTATUS_CACHEFILENAMEAVAILABLE, file_name);
+
+        hres = FindMimeFromData(NULL, url, NULL, 0, NULL, 0, &mime, 0);
+        if(SUCCEEDED(hres)) {
+            IInternetProtocolSink_ReportProgress(pOIProtSink,
+                                                 BINDSTATUS_MIMETYPEAVAILABLE, mime);
+            CoTaskMemFree(mime);
+        }
     }
 
-    CoTaskMemFree(mime);
     HeapFree(GetProcessHeap(), 0, url);
 
     if(GetFileSizeEx(This->file, &size))
@@ -168,6 +176,9 @@ static HRESULT WINAPI FileProtocol_Start
                 BSCF_FIRSTDATANOTIFICATION|BSCF_LASTDATANOTIFICATION,
                 size.u.LowPart, size.u.LowPart);
 
+    if(first_call)
+        IInternetProtocolSink_ReportResult(pOIProtSink, S_OK, 0, NULL);
+
     return S_OK;
 }
 
diff --git a/dlls/urlmon/tests/protocol.c b/dlls/urlmon/tests/protocol.c
index 42b5e56..382e5f0 100644
--- a/dlls/urlmon/tests/protocol.c
+++ b/dlls/urlmon/tests/protocol.c
@@ -91,15 +91,17 @@ static HRESULT WINAPI ProtocolSink_Repor
     switch(ulStatusCode) {
         case BINDSTATUS_MIMETYPEAVAILABLE:
             CHECK_EXPECT(ReportProgress_MIMETYPEAVAILABLE);
+            ok(szStatusText != NULL, "szStatusText == NULL\n");
             if(szStatusText)
                 ok(!lstrcmpW(szStatusText, text_html), "szStatusText != text/html\n");
+            break;
         case BINDSTATUS_DIRECTBIND:
-            CHECK_EXPECT2(ReportProgress_DIRECTBIND);
-            if(szStatusText)
-                ok(!lstrcmpW(szStatusText, text_html), "szStatusText != text/html\n");
+            CHECK_EXPECT(ReportProgress_DIRECTBIND);
+            ok(szStatusText == NULL, "szStatucText != NULL\n");
             break;
         case BINDSTATUS_CACHEFILENAMEAVAILABLE:
             CHECK_EXPECT(ReportProgress_CACHEFILENAMEAVAILABLE);
+            ok(szStatusText != NULL, "szStatusText == NULL\n");
             if(szStatusText)
                 ok(!lstrcmpW(szStatusText, file_name), "szStatusText != file_name\n");
             break;
@@ -241,9 +243,10 @@ static void file_protocol_start(IInterne
         SET_EXPECT(ReportProgress_SENDINGREQUEST);
         SET_EXPECT(ReportProgress_CACHEFILENAMEAVAILABLE);
         SET_EXPECT(ReportProgress_MIMETYPEAVAILABLE);
-        SET_EXPECT(ReportResult);
     }
     SET_EXPECT(ReportData);
+    if(is_first)
+        SET_EXPECT(ReportResult);
  
     expect_hrResult = S_OK;
 
@@ -256,9 +259,10 @@ static void file_protocol_start(IInterne
         CHECK_CALLED(ReportProgress_SENDINGREQUEST);
         CHECK_CALLED(ReportProgress_CACHEFILENAMEAVAILABLE);
         CHECK_CALLED(ReportProgress_MIMETYPEAVAILABLE);
-        CHECK_CALLED(ReportResult);
     }
     CHECK_CALLED(ReportData);
+    if(is_first)
+        CHECK_CALLED(ReportResult);
 }
 
 static void test_file_protocol_url(LPCWSTR url)
@@ -365,6 +369,7 @@ static void test_file_protocol(void) {
     static const WCHAR index_url2[] =
         {'f','i','l','e',':','/','/','i','n','d','e','x','.','h','t','m','l',0};
     static const WCHAR wszFile[] = {'f','i','l','e',':',0};
+    static const WCHAR wszFile2[] = {'f','i','l','e',':','/','/','/',0};
     static const WCHAR wszIndexHtml[] = {'i','n','d','e','x','.','h','t','m','l',0};
     static const char html_doc[] = "<HTML></HTML>";
 
@@ -388,6 +393,15 @@ static void test_file_protocol(void) {
     file_name = buf + sizeof(wszFile)/sizeof(WCHAR)-1;
     test_file_protocol_url(buf);
 
+    memcpy(buf, wszFile2, sizeof(wszFile2));
+    len = sizeof(wszFile2)/sizeof(WCHAR)-1;
+    len += GetCurrentDirectoryW(sizeof(buf)/sizeof(WCHAR)-len, buf+len);
+    buf[len++] = '\\';
+    memcpy(buf+len, wszIndexHtml, sizeof(wszIndexHtml));
+
+    file_name = buf + sizeof(wszFile2)/sizeof(WCHAR)-1;
+    test_file_protocol_url(buf);
+
     DeleteFileW(wszIndexHtml);
 
     hres = CoCreateInstance(&CLSID_FileProtocol, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,




More information about the wine-cvs mailing list