>From e4b2908a497e2a6c67e029a5853156e219c62aaf Mon Sep 17 00:00:00 2001 From: Sergey Khodych Date: Sun, 15 May 2011 01:30:09 +0300 Subject: [PATCH 3/5] shlwapi: Implement URL_APPLY_GUESSFILE in UrlApplyScheme. --- dlls/shlwapi/tests/url.c | 8 ++++- dlls/shlwapi/url.c | 80 +++++++++++++++++++++++++++------------------ 2 files changed, 55 insertions(+), 33 deletions(-) diff --git a/dlls/shlwapi/tests/url.c b/dlls/shlwapi/tests/url.c index d116c16..1ef2aab 100644 --- a/dlls/shlwapi/tests/url.c +++ b/dlls/shlwapi/tests/url.c @@ -91,7 +91,12 @@ static const TEST_URL_APPLY TEST_APPLY[] = { {"http://www.winehq.org", URL_APPLY_GUESSSCHEME | URL_APPLY_DEFAULT, S_FALSE, TEST_APPLY_MAX_LENGTH, untouchedA}, {"", URL_APPLY_GUESSSCHEME | URL_APPLY_DEFAULT, S_OK, 7, "http://"}, {"", URL_APPLY_GUESSSCHEME, S_FALSE, TEST_APPLY_MAX_LENGTH, untouchedA}, - {"", URL_APPLY_DEFAULT, S_OK, 7, "http://"} + {"", URL_APPLY_DEFAULT, S_OK, 7, "http://"}, + {"u:\\windows", URL_APPLY_GUESSFILE | URL_APPLY_DEFAULT, S_OK, 18, "file:///u:/windows"}, + {"u:\\windows", URL_APPLY_GUESSFILE, S_OK, 18, "file:///u:/windows"}, + {"u:\\windows", URL_APPLY_DEFAULT, S_OK, 17, "http://u:\\windows"}, + {"file:///c:/windows", URL_APPLY_GUESSFILE , S_FALSE, TEST_APPLY_MAX_LENGTH, untouchedA}, + {"aa:\\windows", URL_APPLY_GUESSFILE , S_FALSE, TEST_APPLY_MAX_LENGTH, untouchedA}, }; /* ################ */ @@ -379,6 +384,7 @@ static const struct { {"c:foo\\bar", "file:///c:foo/bar", S_OK}, {"c:\\foo/b a%r", "file:///c:/foo/b%20a%25r", S_OK}, {"c:\\foo\\foo bar", "file:///c:/foo/foo%20bar", S_OK}, + {"file:///c:/foo/bar", "file:///c:/foo/bar", S_FALSE}, #if 0 /* The following test fails on native shlwapi as distributed with Win95/98. * Wine matches the behaviour of later versions. diff --git a/dlls/shlwapi/url.c b/dlls/shlwapi/url.c index 7fc37a9..0c68529 100644 --- a/dlls/shlwapi/url.c +++ b/dlls/shlwapi/url.c @@ -1700,6 +1700,39 @@ static HRESULT URL_GuessScheme(LPCWSTR pszIn, LPWSTR pszOut, LPDWORD pcchOut) return E_FAIL; } +static HRESULT URL_CreateFromPath(LPCWSTR pszPath, LPWSTR pszUrl, LPDWORD pcchUrl) +{ + DWORD needed; + HRESULT ret = S_OK; + WCHAR *pszNewUrl; + WCHAR file_colonW[] = {'f','i','l','e',':',0}; + WCHAR three_slashesW[] = {'/','/','/',0}; + PARSEDURLW parsed_url; + + parsed_url.cbSize = sizeof(parsed_url); + if(ParseURLW(pszPath, &parsed_url) == S_OK) { + if(parsed_url.nScheme != URL_SCHEME_INVALID && parsed_url.cchProtocol > 1) { + needed = strlenW(pszPath); + if (needed >= *pcchUrl) { + *pcchUrl = needed + 1; + return E_POINTER; + } else { + *pcchUrl = needed; + return S_FALSE; + } + } + } + + pszNewUrl = HeapAlloc(GetProcessHeap(), 0, (strlenW(pszPath) + 9) * sizeof(WCHAR)); /* "file:///" + pszPath_len + 1 */ + strcpyW(pszNewUrl, file_colonW); + if(isalphaW(pszPath[0]) && pszPath[1] == ':') + strcatW(pszNewUrl, three_slashesW); + strcatW(pszNewUrl, pszPath); + ret = UrlEscapeW(pszNewUrl, pszUrl, pcchUrl, URL_ESCAPE_PERCENT); + HeapFree(GetProcessHeap(), 0, pszNewUrl); + return ret; +} + static HRESULT URL_ApplyDefault(LPCWSTR pszIn, LPWSTR pszOut, LPDWORD pcchOut) { HKEY newkey; @@ -1747,11 +1780,18 @@ HRESULT WINAPI UrlApplySchemeW(LPCWSTR pszIn, LPWSTR pszOut, LPDWORD pcchOut, DW if (!pszIn || !pszOut || !pcchOut) return E_INVALIDARG; if (dwFlags & URL_APPLY_GUESSFILE) { - FIXME("(%s %p %p(%d) 0x%08x): stub URL_APPLY_GUESSFILE not implemented\n", - debugstr_w(pszIn), pszOut, pcchOut, *pcchOut, dwFlags); - strcpyW(pszOut, pszIn); - *pcchOut = strlenW(pszOut); - return S_FALSE; + if (*pcchOut > 1 && ':' == pszIn[1]) { + res1 = *pcchOut; + ret = URL_CreateFromPath(pszIn, pszOut, &res1); + if (ret == S_OK || ret == E_POINTER){ + *pcchOut = res1; + return ret; + } + else if (ret == S_FALSE) + { + return ret; + } + } } in_scheme.cbSize = sizeof(in_scheme); @@ -2408,12 +2448,7 @@ HRESULT WINAPI UrlCreateFromPathA(LPCSTR pszPath, LPSTR pszUrl, LPDWORD pcchUrl, */ HRESULT WINAPI UrlCreateFromPathW(LPCWSTR pszPath, LPWSTR pszUrl, LPDWORD pcchUrl, DWORD dwReserved) { - DWORD needed; HRESULT ret; - WCHAR *pszNewUrl; - WCHAR file_colonW[] = {'f','i','l','e',':',0}; - WCHAR three_slashesW[] = {'/','/','/',0}; - PARSEDURLW parsed_url; TRACE("(%s, %p, %p, 0x%08x)\n", debugstr_w(pszPath), pszUrl, pcchUrl, dwReserved); @@ -2423,30 +2458,11 @@ HRESULT WINAPI UrlCreateFromPathW(LPCWSTR pszPath, LPWSTR pszUrl, LPDWORD pcchUr if (!pszUrl || !pcchUrl) return E_INVALIDARG; + ret = URL_CreateFromPath(pszPath, pszUrl, pcchUrl); - parsed_url.cbSize = sizeof(parsed_url); - if(ParseURLW(pszPath, &parsed_url) == S_OK) { - if(parsed_url.nScheme != URL_SCHEME_INVALID && parsed_url.cchProtocol > 1) { - needed = strlenW(pszPath); - if (needed >= *pcchUrl) { - *pcchUrl = needed + 1; - return E_POINTER; - } else { - *pcchUrl = needed; - strcpyW(pszUrl, pszPath); - return S_FALSE; - } - } - } - - pszNewUrl = HeapAlloc(GetProcessHeap(), 0, (strlenW(pszPath) + 9) * sizeof(WCHAR)); /* "file:///" + pszPath_len + 1 */ - strcpyW(pszNewUrl, file_colonW); - if(isalphaW(pszPath[0]) && pszPath[1] == ':') - strcatW(pszNewUrl, three_slashesW); - strcatW(pszNewUrl, pszPath); - ret = UrlEscapeW(pszNewUrl, pszUrl, pcchUrl, URL_ESCAPE_PERCENT); + if (S_FALSE == ret) + strcpyW(pszUrl, pszPath); - HeapFree(GetProcessHeap(), 0, pszNewUrl); return ret; } -- 1.7.5.rc3