From 4e1ff0b8cd8c973dab1bb739a09a212102573712 Mon Sep 17 00:00:00 2001 From: Thomas Mullaly Date: Wed, 8 Dec 2010 21:28:46 -0500 Subject: [PATCH] urlmon: Added pluggable protocol support to CoInternetParseIUri. --- dlls/urlmon/tests/uri.c | 53 +++++++++++++++++++++++++++++++++++++++-- dlls/urlmon/uri.c | 41 +++++++++++++------------------ 2 files changed, 68 insertions(+), 26 deletions(-) diff --git a/dlls/urlmon/tests/uri.c b/dlls/urlmon/tests/uri.c index c069d84cf5e..fd9099ce83e 100644 --- a/dlls/urlmon/tests/uri.c +++ b/dlls/urlmon/tests/uri.c @@ -62,6 +62,7 @@ }while(0) DEFINE_EXPECT(CombineUrl); +DEFINE_EXPECT(ParseUrl); static HRESULT (WINAPI *pCreateUri)(LPCWSTR, DWORD, DWORD_PTR, IUri**); static HRESULT (WINAPI *pCreateUriWithFragment)(LPCWSTR, LPCWSTR, DWORD, DWORD_PTR, IUri**); @@ -83,6 +84,12 @@ static const WCHAR combine_resultW[] = {'z','i','p',':','t','e','s','t',0}; static const WCHAR winetestW[] = {'w','i','n','e','t','e','s','t',0}; +static const WCHAR parse_urlW[] = {'w','i','n','e','t','e','s','t',':','t','e','s','t',0}; +static const WCHAR parse_resultW[] = {'z','i','p',':','t','e','s','t',0}; + +static PARSEACTION parse_action; +static DWORD parse_flags; + typedef struct _uri_create_flag_test { DWORD flags; HRESULT expected; @@ -9300,8 +9307,17 @@ static HRESULT WINAPI InternetProtocolInfo_ParseUrl(IInternetProtocolInfo *iface PARSEACTION ParseAction, DWORD dwParseFlags, LPWSTR pwzResult, DWORD cchResult, DWORD *pcchResult, DWORD dwReserved) { - ok(0, "unexpected call %d\n", ParseAction); - return E_NOTIMPL; + CHECK_EXPECT(ParseUrl); + ok(!lstrcmpW(pwzUrl, parse_urlW), "Error: Expected %s, but got %s instead.\n", + wine_dbgstr_w(parse_urlW), wine_dbgstr_w(pwzUrl)); + ok(ParseAction == parse_action, "Error: Expected %d, but got %d.\n", parse_action, ParseAction); + ok(dwParseFlags == parse_flags, "Error: Expected 0x%08x, but got 0x%08x.\n", parse_flags, dwParseFlags); + ok(cchResult == 200, "Error: Got %d.\n", cchResult); + + memcpy(pwzResult, parse_resultW, sizeof(parse_resultW)); + *pcchResult = lstrlenW(parse_resultW); + + return S_OK; } static HRESULT WINAPI InternetProtocolInfo_CombineUrl(IInternetProtocolInfo *iface, @@ -9725,6 +9741,36 @@ static void test_CoInternetParseIUri(void) { } } +static void test_CoInternetParseIUri_Pluggable(void) { + HRESULT hr; + IUri *uri = NULL; + + hr = pCreateUri(parse_urlW, 0, 0, &uri); + ok(SUCCEEDED(hr), "Error: Expected CreateUri to succeed, but got 0x%08x.\n", hr); + if(SUCCEEDED(hr)) { + WCHAR result[200]; + DWORD result_len; + + SET_EXPECT(ParseUrl); + + parse_action = PARSE_CANONICALIZE; + parse_flags = URL_UNESCAPE|URL_ESCAPE_UNSAFE; + + hr = pCoInternetParseIUri(uri, parse_action, parse_flags, result, 200, &result_len, 0); + ok(hr == S_OK, "Error: CoInternetParseIUri returned 0x%08x, expected 0x%08x.\n", hr, S_OK); + + CHECK_CALLED(ParseUrl); + + if(SUCCEEDED(hr)) { + ok(result_len == lstrlenW(parse_resultW), "Error: Expected %d, but got %d.\n", + lstrlenW(parse_resultW), result_len); + ok(!lstrcmpW(result, parse_resultW), "Error: Expected %s, but got %s.\n", + wine_dbgstr_w(parse_resultW), wine_dbgstr_w(result)); + } + } + if(uri) IUri_Release(uri); +} + START_TEST(uri) { HMODULE hurlmon; @@ -9831,5 +9877,8 @@ START_TEST(uri) { trace("test CoInternetCombineUrlEx Pluggable...\n"); test_CoInternetCombineUrlEx_Pluggable(); + trace("test CoInternetParseIUri pluggable...\n"); + test_CoInternetParseIUri_Pluggable(); + unregister_protocols(); } diff --git a/dlls/urlmon/uri.c b/dlls/urlmon/uri.c index 1cccfe3273e..681327f6cb8 100644 --- a/dlls/urlmon/uri.c +++ b/dlls/urlmon/uri.c @@ -6203,6 +6203,7 @@ static HRESULT parse_canonicalize(const Uri *uri, DWORD flags, LPWSTR output, !(flags & URL_ESCAPE_SPACES_ONLY) && !(flags & URL_ESCAPE_PERCENT); + /* Check if the dot segments need to be removed from the * path component. */ @@ -6612,6 +6613,7 @@ HRESULT WINAPI CoInternetParseIUri(IUri *pIUri, PARSEACTION ParseAction, DWORD d { HRESULT hr; Uri *uri; + IInternetProtocolInfo *info; TRACE("(%p %d %x %p %d %p %x)\n", pIUri, ParseAction, dwFlags, pwzResult, cchResult, pcchResult, (DWORD)dwReserved); @@ -6624,44 +6626,35 @@ HRESULT WINAPI CoInternetParseIUri(IUri *pIUri, PARSEACTION ParseAction, DWORD d return E_INVALIDARG; } + if(!(uri = get_uri_obj(pIUri))) { + *pcchResult = 0; + FIXME("(%p %d %x %p %d %p %x) Unknown IUri's not supported for this action.\n", + pIUri, ParseAction, dwFlags, pwzResult, cchResult, pcchResult, (DWORD)dwReserved); + return E_NOTIMPL; + } + + info = get_protocol_info(uri->canon_uri); + if(info) { + hr = IInternetProtocolInfo_ParseUrl(info, uri->canon_uri, ParseAction, dwFlags, + pwzResult, cchResult, pcchResult, 0); + IInternetProtocolInfo_Release(info); + if(SUCCEEDED(hr)) return hr; + } + switch(ParseAction) { case PARSE_CANONICALIZE: - if(!(uri = get_uri_obj(pIUri))) { - *pcchResult = 0; - FIXME("(%p %d %x %p %d %p %x) Unknown IUri's not supported for this action.\n", - pIUri, ParseAction, dwFlags, pwzResult, cchResult, pcchResult, (DWORD)dwReserved); - return E_NOTIMPL; - } hr = parse_canonicalize(uri, dwFlags, pwzResult, cchResult, pcchResult); break; case PARSE_FRIENDLY: hr = parse_friendly(pIUri, pwzResult, cchResult, pcchResult); break; case PARSE_ROOTDOCUMENT: - if(!(uri = get_uri_obj(pIUri))) { - *pcchResult = 0; - FIXME("(%p %d %x %p %d %p %x) Unknown IUri's not supported for this action.\n", - pIUri, ParseAction, dwFlags, pwzResult, cchResult, pcchResult, (DWORD)dwReserved); - return E_NOTIMPL; - } hr = parse_rootdocument(uri, pwzResult, cchResult, pcchResult); break; case PARSE_DOCUMENT: - if(!(uri = get_uri_obj(pIUri))) { - *pcchResult = 0; - FIXME("(%p %d %x %p %d %p %x) Unknown IUri's not supported for this action.\n", - pIUri, ParseAction, dwFlags, pwzResult, cchResult, pcchResult, (DWORD)dwReserved); - return E_NOTIMPL; - } hr = parse_document(uri, pwzResult, cchResult, pcchResult); break; case PARSE_PATH_FROM_URL: - if(!(uri = get_uri_obj(pIUri))) { - *pcchResult = 0; - FIXME("(%p %d %x %p %d %p %x) Unknown IUri's not supported for this action.\n", - pIUri, ParseAction, dwFlags, pwzResult, cchResult, pcchResult, (DWORD)dwReserved); - return E_NOTIMPL; - } hr = parse_path_from_url(uri, pwzResult, cchResult, pcchResult); break; case PARSE_URL_FROM_PATH: