Module: wine Branch: master Commit: 8de69a174aaf1b6337d5a854f3859d8425b9ea33 URL: http://source.winehq.org/git/wine.git/?a=commit;h=8de69a174aaf1b6337d5a854f3...
Author: Piotr Caban piotr@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; }