Piotr Caban : shlwapi: Added special case for URL_PART_HOSTNAME in UrlGetPart.

Alexandre Julliard julliard at winehq.org
Wed Dec 16 09:41:37 CST 2009


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Tue Dec 15 23:47:36 2009 +0100

shlwapi: Added special case for URL_PART_HOSTNAME in UrlGetPart.

---

 dlls/shlwapi/tests/url.c |   11 +++++++++++
 dlls/shlwapi/url.c       |   42 +++++++++++++++++++++++++++++++++++++-----
 2 files changed, 48 insertions(+), 5 deletions(-)

diff --git a/dlls/shlwapi/tests/url.c b/dlls/shlwapi/tests/url.c
index da051a1..ab3d0b6 100644
--- a/dlls/shlwapi/tests/url.c
+++ b/dlls/shlwapi/tests/url.c
@@ -552,6 +552,17 @@ static void test_UrlGetPart(void)
 
   test_url_part(http_url, URL_PART_HOSTNAME, 0, "www.wine hq.org");
   test_url_part(http_url, URL_PART_PASSWORD, 0, "pass 123");
+
+  dwSize = sizeof(szPart);
+  res = UrlGetPartA("file://c:\\index.htm", szPart, &dwSize, URL_PART_HOSTNAME, 0);
+  ok(res==S_FALSE, "returned %08x\n", res);
+
+  dwSize = sizeof(szPart);
+  szPart[0] = 'x'; szPart[1] = '\0';
+  res = UrlGetPartA("file:some text", szPart, &dwSize, URL_PART_HOSTNAME, 0);
+  ok(res==S_FALSE, "returned %08x\n", res);
+  ok(szPart[0] == '\0', "szPart[0] = %c\n", szPart[0]);
+  ok(dwSize == 0, "dwSize = %d\n", dwSize);
 }
 
 /* ########################### */
diff --git a/dlls/shlwapi/url.c b/dlls/shlwapi/url.c
index 198f17f..f8a5162 100644
--- a/dlls/shlwapi/url.c
+++ b/dlls/shlwapi/url.c
@@ -2004,7 +2004,7 @@ HRESULT WINAPI UrlGetPartA(LPCSTR pszIn, LPSTR pszOut, LPDWORD pcchOut,
     len = INTERNET_MAX_URL_LENGTH;
     ret = UrlGetPartW(in, out, &len, dwPart, dwFlags);
 
-    if (ret != S_OK) {
+    if (FAILED(ret)) {
 	HeapFree(GetProcessHeap(), 0, in);
 	return ret;
     }
@@ -2015,10 +2015,10 @@ HRESULT WINAPI UrlGetPartA(LPCSTR pszIn, LPSTR pszOut, LPDWORD pcchOut,
 	HeapFree(GetProcessHeap(), 0, in);
 	return E_POINTER;
     }
-    WideCharToMultiByte(0, 0, out, len+1, pszOut, *pcchOut, 0, 0);
-    *pcchOut = len2;
+    len2 = WideCharToMultiByte(0, 0, out, len+1, pszOut, *pcchOut, 0, 0);
+    *pcchOut = len2-1;
     HeapFree(GetProcessHeap(), 0, in);
-    return S_OK;
+    return ret;
 }
 
 /*************************************************************************
@@ -2031,12 +2031,18 @@ HRESULT WINAPI UrlGetPartW(LPCWSTR pszIn, LPWSTR pszOut, LPDWORD pcchOut,
 {
     WINE_PARSE_URL pl;
     HRESULT ret;
-    DWORD size, schsize;
+    DWORD scheme, size, schsize;
     LPCWSTR addr, schaddr;
 
     TRACE("(%s %p %p(%d) %08x %08x)\n",
 	  debugstr_w(pszIn), pszOut, pcchOut, *pcchOut, dwPart, dwFlags);
 
+    addr = strchrW(pszIn, ':');
+    if(!addr)
+        return E_FAIL;
+
+    scheme = get_scheme_code(pszIn, addr-pszIn);
+
     ret = URL_ParseUrl(pszIn, &pl);
     if (ret == S_OK) {
 	schaddr = pl.pScheme;
@@ -2050,6 +2056,26 @@ HRESULT WINAPI UrlGetPartW(LPCWSTR pszIn, LPWSTR pszOut, LPDWORD pcchOut,
 	    break;
 
 	case URL_PART_HOSTNAME:
+            switch(scheme) {
+            case URL_SCHEME_FTP:
+            case URL_SCHEME_HTTP:
+            case URL_SCHEME_GOPHER:
+            case URL_SCHEME_TELNET:
+            case URL_SCHEME_FILE:
+            case URL_SCHEME_HTTPS:
+                break;
+            default:
+                return E_FAIL;
+            }
+
+            if(scheme==URL_SCHEME_FILE && (!pl.szHostName ||
+                        (pl.szHostName==1 && *(pl.pHostName+1)==':'))) {
+                if(pcchOut)
+                    *pszOut = '\0';
+                *pcchOut = 0;
+                return S_FALSE;
+            }
+
 	    if (!pl.szHostName) return E_INVALIDARG;
 	    addr = pl.pHostName;
 	    size = pl.szHostName;
@@ -2101,7 +2127,13 @@ HRESULT WINAPI UrlGetPartW(LPCWSTR pszIn, LPWSTR pszOut, LPDWORD pcchOut,
 	    *pcchOut = size;
 	}
 	TRACE("len=%d %s\n", *pcchOut, debugstr_w(pszOut));
+    }else if(dwPart==URL_PART_HOSTNAME && scheme==URL_SCHEME_FILE) {
+        if(*pcchOut)
+            *pszOut = '\0';
+        *pcchOut = 0;
+        return S_FALSE;
     }
+
     return ret;
 }
 




More information about the wine-cvs mailing list