Thomas Mullaly : urlmon: Added pluggable protocol support to CoInternetParseIUri.
Alexandre Julliard
julliard at winehq.org
Thu Dec 9 12:26:24 CST 2010
Module: wine
Branch: master
Commit: 4e1ff0b8cd8c973dab1bb739a09a212102573712
URL: http://source.winehq.org/git/wine.git/?a=commit;h=4e1ff0b8cd8c973dab1bb739a09a212102573712
Author: Thomas Mullaly <thomas.mullaly at gmail.com>
Date: Wed Dec 8 21:28:46 2010 -0500
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 c069d84..fd9099c 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 1cccfe3..681327f 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:
More information about the wine-cvs
mailing list