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