Piotr Caban : shlwapi: Improved UrlEscapeW implementation.

Alexandre Julliard julliard at winehq.org
Tue Sep 7 11:22:55 CDT 2010


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

Author: Piotr Caban <piotr at 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;
 }
 




More information about the wine-cvs mailing list