Module: wine Branch: master Commit: f0bc60324aae58bad51007f2725286545790f9da URL: http://source.winehq.org/git/wine.git/?a=commit;h=f0bc60324aae58bad51007f272...
Author: Piotr Caban piotr@codeweavers.com Date: Sun Sep 5 22:13:47 2010 +0200
shlwapi: Improved UrlEscapeW implementation.
---
dlls/shlwapi/tests/url.c | 11 +++++++++++ dlls/shlwapi/url.c | 20 ++++++++++++++++---- 2 files changed, 27 insertions(+), 4 deletions(-)
diff --git a/dlls/shlwapi/tests/url.c b/dlls/shlwapi/tests/url.c index 532b947..d1da88b 100644 --- a/dlls/shlwapi/tests/url.c +++ b/dlls/shlwapi/tests/url.c @@ -762,10 +762,13 @@ static void test_url_canonicalize(int index, const char *szUrl, DWORD dwFlags, H
static void test_UrlEscape(void) { + static const WCHAR out[] = { 'f','o','o','%','2','0','b','a','r',0 }; + DWORD size = 0; HRESULT ret; unsigned int i; char empty_string[] = ""; + WCHAR overwrite[] = { 'f','o','o',' ','b','a','r',0,0,0 };
if (!pUrlEscapeA) { win_skip("UrlEscapeA noz found\n"); @@ -796,6 +799,14 @@ static void test_UrlEscape(void) ok(ret == E_POINTER, "got %x, expected %x\n", ret, E_POINTER); ok(size == 34, "got %d, expected %d\n", size, 34);
+ if(pUrlEscapeW) { + size = sizeof(overwrite)/sizeof(WCHAR); + ret = pUrlEscapeW(overwrite, overwrite, &size, URL_ESCAPE_SPACES_ONLY); + ok(ret == S_OK, "got %x, expected S_OK\n", ret); + ok(size == 9, "got %d, expected 9\n", size); + ok(!lstrcmpW(overwrite, out), "got %s, expected %s\n", wine_dbgstr_w(overwrite), wine_dbgstr_w(out)); + } + for(i=0; i<sizeof(TEST_ESCAPE)/sizeof(TEST_ESCAPE[0]); i++) { test_url_escape(TEST_ESCAPE[i].url, TEST_ESCAPE[i].flags, TEST_ESCAPE[i].expectret, TEST_ESCAPE[i].expecturl); diff --git a/dlls/shlwapi/url.c b/dlls/shlwapi/url.c index 4592b7e..c808a2f 100644 --- a/dlls/shlwapi/url.c +++ b/dlls/shlwapi/url.c @@ -1022,8 +1022,8 @@ HRESULT WINAPI UrlEscapeW( DWORD slashes = 0; static const WCHAR localhost[] = {'l','o','c','a','l','h','o','s','t',0};
- TRACE("(%s %p %p 0x%08x)\n", debugstr_w(pszUrl), pszEscaped, - pcchEscaped, dwFlags); + TRACE("(%p(%s) %p %p 0x%08x)\n", pszUrl, debugstr_w(pszUrl), + pszEscaped, pcchEscaped, dwFlags);
if(!pszUrl || !pcchEscaped) return E_INVALIDARG; @@ -1034,6 +1034,12 @@ HRESULT WINAPI UrlEscapeW( URL_ESCAPE_PERCENT)) FIXME("Unimplemented flags: %08x\n", dwFlags);
+ if(pszUrl == pszEscaped) { + dst = HeapAlloc(GetProcessHeap(), 0, *pcchEscaped*sizeof(WCHAR)); + if(!dst) + return E_OUTOFMEMORY; + } + /* fix up flags */ if (dwFlags & URL_ESCAPE_SPACES_ONLY) /* if SPACES_ONLY specified, reset the other controls */ @@ -1150,12 +1156,18 @@ HRESULT WINAPI UrlEscapeW(
if(needed < *pcchEscaped) { *dst = '\0'; - ret = S_OK; + if(pszUrl == pszEscaped) + memcpy(pszEscaped, dst-needed, (needed+1)*sizeof(WCHAR)); + + ret = S_OK; } else { needed++; /* add one for the '\0' */ - ret = E_POINTER; + ret = E_POINTER; } *pcchEscaped = needed; + + if(pszUrl == pszEscaped) + HeapFree(GetProcessHeap(), 0, dst); return ret; }