Jacek Caban : urlmon: Use StartEx in file protocol handler' s Start implementation.

Alexandre Julliard julliard at winehq.org
Thu Sep 2 12:01:24 CDT 2010


Module: wine
Branch: master
Commit: 6db2cf1bf5ec68eeffceac6a8e55f07e0e9b9e61
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=6db2cf1bf5ec68eeffceac6a8e55f07e0e9b9e61

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Sep  2 00:26:39 2010 +0200

urlmon: Use StartEx in file protocol handler's Start implementation.

---

 dlls/urlmon/file.c |  100 ++++------------------------------------------------
 1 files changed, 7 insertions(+), 93 deletions(-)

diff --git a/dlls/urlmon/file.c b/dlls/urlmon/file.c
index 62c20d3..a190156 100644
--- a/dlls/urlmon/file.c
+++ b/dlls/urlmon/file.c
@@ -102,107 +102,21 @@ static HRESULT WINAPI FileProtocol_Start(IInternetProtocolEx *iface, LPCWSTR szU
         DWORD grfPI, HANDLE_PTR dwReserved)
 {
     FileProtocol *This = PROTOCOL_THIS(iface);
-    BINDINFO bindinfo;
-    DWORD grfBINDF = 0;
-    LARGE_INTEGER size;
-    DWORD len;
-    LPWSTR url, mime = NULL, file_name;
-    WCHAR null_char = 0;
-    BOOL first_call = FALSE;
+    IUri *uri;
     HRESULT hres;
 
-    static const WCHAR wszFile[]  = {'f','i','l','e',':'};
-
     TRACE("(%p)->(%s %p %p %08x %lx)\n", This, debugstr_w(szUrl), pOIProtSink,
             pOIBindInfo, grfPI, dwReserved);
 
-    if(!szUrl || strlenW(szUrl) < sizeof(wszFile)/sizeof(WCHAR)
-            || memcmp(szUrl, wszFile, sizeof(wszFile)))
-        return E_INVALIDARG;
-
-    memset(&bindinfo, 0, sizeof(bindinfo));
-    bindinfo.cbSize = sizeof(BINDINFO);
-    hres = IInternetBindInfo_GetBindInfo(pOIBindInfo, &grfBINDF, &bindinfo);
-    if(FAILED(hres)) {
-        WARN("GetBindInfo failed: %08x\n", hres);
-        return hres;
-    }
-
-    ReleaseBindInfo(&bindinfo);
-
-    len = lstrlenW(szUrl)+16;
-    url = heap_alloc(len*sizeof(WCHAR));
-    hres = CoInternetParseUrl(szUrl, PARSE_ENCODE, 0, url, len, &len, 0);
-    if(FAILED(hres)) {
-        heap_free(url);
+    hres = CreateUri(szUrl, Uri_CREATE_FILE_USE_DOS_PATH, 0, &uri);
+    if(FAILED(hres))
         return hres;
-    }
-
-    if(!(grfBINDF & BINDF_FROMURLMON))
-        IInternetProtocolSink_ReportProgress(pOIProtSink, BINDSTATUS_DIRECTBIND, NULL);
-
-    if(This->file == INVALID_HANDLE_VALUE) {
-        WCHAR *ptr;
-
-        first_call = TRUE;
-
-        IInternetProtocolSink_ReportProgress(pOIProtSink, BINDSTATUS_SENDINGREQUEST, &null_char);
 
-        file_name = url+sizeof(wszFile)/sizeof(WCHAR);
+    hres = IInternetProtocolEx_StartEx(PROTOCOLEX(This), uri, pOIProtSink, pOIBindInfo,
+            grfPI, (HANDLE*)dwReserved);
 
-        /* Strip both forward and back slashes */
-        if( (file_name[0] == '/' && file_name[1] == '/') ||
-            (file_name[0] == '\\' && file_name[1] == '\\'))
-            file_name += 2;
-        if(*file_name == '/')
-            file_name++;
-
-        for(ptr = file_name; *ptr; ptr++) {
-            if(*ptr == '?' || *ptr == '#') {
-                *ptr = 0;
-                break;
-            }
-        }
-
-        if(file_name[1] == '|')
-            file_name[1] = ':';
-
-        This->file = CreateFileW(file_name, GENERIC_READ, FILE_SHARE_READ, NULL,
-                                 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
-
-        if(This->file == INVALID_HANDLE_VALUE) {
-            IInternetProtocolSink_ReportResult(pOIProtSink, INET_E_RESOURCE_NOT_FOUND,
-                    GetLastError(), NULL);
-            heap_free(url);
-            return INET_E_RESOURCE_NOT_FOUND;
-        }
-
-        IInternetProtocolSink_ReportProgress(pOIProtSink,
-                BINDSTATUS_CACHEFILENAMEAVAILABLE, file_name);
-
-        hres = FindMimeFromData(NULL, url, NULL, 0, NULL, 0, &mime, 0);
-        if(SUCCEEDED(hres)) {
-            IInternetProtocolSink_ReportProgress(pOIProtSink,
-                    (grfBINDF & BINDF_FROMURLMON) ?
-                    BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE : BINDSTATUS_MIMETYPEAVAILABLE,
-                    mime);
-            CoTaskMemFree(mime);
-        }
-    }
-
-    heap_free(url);
-
-    if(GetFileSizeEx(This->file, &size)) {
-        This->size = size.u.LowPart;
-        IInternetProtocolSink_ReportData(pOIProtSink,
-                BSCF_FIRSTDATANOTIFICATION|BSCF_LASTDATANOTIFICATION,
-                This->size, This->size);
-    }
-
-    if(first_call)
-        IInternetProtocolSink_ReportResult(pOIProtSink, S_OK, 0, NULL);
-
-    return S_OK;
+    IUri_Release(uri);
+    return hres;
 }
 
 static HRESULT WINAPI FileProtocol_Continue(IInternetProtocolEx *iface, PROTOCOLDATA *pProtocolData)




More information about the wine-cvs mailing list