URLMON: Encode URL in file protocol

Jacek Caban jack at itma.pwr.wroc.pl
Sun Sep 11 13:00:38 CDT 2005


Changelog:
    Encode URL in file protocol
-------------- next part --------------
Index: dlls/urlmon/file.c
===================================================================
RCS file: /home/wine/wine/dlls/urlmon/file.c,v
retrieving revision 1.1
diff -u -p -r1.1 file.c
--- dlls/urlmon/file.c	6 Sep 2005 09:27:04 -0000	1.1
+++ dlls/urlmon/file.c	11 Sep 2005 17:55:56 -0000
@@ -102,6 +102,9 @@ static HRESULT WINAPI FileProtocol_Start
     BINDINFO bindinfo;
     DWORD grfBINDF = 0;
     LARGE_INTEGER size;
+    DWORD len;
+    LPWSTR url;
+    HRESULT hres;
 
     static const WCHAR wszFile[]  = {'f','i','l','e',':'};
 
@@ -116,24 +119,35 @@ static HRESULT WINAPI FileProtocol_Start
             || memcmp(szUrl, wszFile, sizeof(wszFile)))
         return MK_E_SYNTAX;
 
+    len = lstrlenW(szUrl)+16;
+    url = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR));
+    hres = CoInternetParseUrl(szUrl, PARSE_ENCODE, 0, url, len, &len, 0);
+    if(FAILED(hres)) {
+        HeapFree(GetProcessHeap(), 0, url);
+        return hres;
+    }
+
     /* FIXME:
      * Implement MIME type checking
      */
 
     if(!This->file) {
-        This->file = CreateFileW(szUrl+sizeof(wszFile)/sizeof(WCHAR), GENERIC_READ, FILE_SHARE_READ,
+        This->file = CreateFileW(url+sizeof(wszFile)/sizeof(WCHAR), 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);
             return INET_E_RESOURCE_NOT_FOUND;
         }
 
         IInternetProtocolSink_ReportProgress(pOIProtSink, BINDSTATUS_CACHEFILENAMEAVAILABLE,
-                szUrl+sizeof(wszFile)/sizeof(WCHAR));
+                url+sizeof(wszFile)/sizeof(WCHAR));
         IInternetProtocolSink_ReportResult(pOIProtSink, S_OK, 0, NULL);
+
+        HeapFree(GetProcessHeap(), 0, url);
     }
 
     if(GetFileSizeEx(This->file, &size))


More information about the wine-patches mailing list