Module: wine Branch: master Commit: bced2e21dbc548ef9d41e3ff11384d7ad964c929 URL: http://source.winehq.org/git/wine.git/?a=commit;h=bced2e21dbc548ef9d41e3ff11...
Author: Thomas Mullaly thomas.mullaly@gmail.com Date: Sat Oct 9 11:02:17 2010 -0400
urlmon: Implemented base case for CoInternetCombineIUri.
---
dlls/urlmon/tests/uri.c | 97 +++++++++++++++++++++++++++++++++++++++++++++- dlls/urlmon/uri.c | 66 +++++++++++++++++++++++++++++++- 2 files changed, 158 insertions(+), 5 deletions(-)
diff --git a/dlls/urlmon/tests/uri.c b/dlls/urlmon/tests/uri.c index 7958fed..eb5a3f7 100644 --- a/dlls/urlmon/tests/uri.c +++ b/dlls/urlmon/tests/uri.c @@ -5578,7 +5578,7 @@ static const uri_combine_test uri_combine_tests[] = { }, { "http://google.com/test%22,0, "zip://test.com/cool",0, - 0,S_OK,TRUE, + 0,S_OK,FALSE, { {"zip://test.com/cool",S_OK}, {"test.com",S_OK}, @@ -5899,6 +5899,95 @@ static const uri_combine_test uri_combine_tests[] = { {URL_SCHEME_FILE,S_OK}, {URLZONE_INVALID,E_NOTIMPL} } + }, + /* URL_DONT_SIMPLIFY has no effect. */ + { "http://google.com/test%22,0, + "zip://test.com/cool/../cool/test",0, + URL_DONT_SIMPLIFY,S_OK,FALSE, + { + {"zip://test.com/cool/test",S_OK}, + {"test.com",S_OK}, + {"zip://test.com/cool/test",S_OK}, + {"test.com",S_OK}, + {"",S_FALSE}, + {"",S_FALSE}, + {"test.com",S_OK}, + {"",S_FALSE}, + {"/cool/test",S_OK}, + {"/cool/test",S_OK}, + {"",S_FALSE}, + /* The resulting IUri has the same Raw URI as the relative URI (only IE 8). + * On IE 7 it reduces the path in the Raw URI. + */ + {"zip://test.com/cool/../cool/test",S_OK,FALSE,"zip://test.com/cool/test"}, + {"zip",S_OK}, + {"",S_FALSE}, + {"",S_FALSE} + }, + { + {Uri_HOST_DNS,S_OK}, + {0,S_FALSE}, + {URL_SCHEME_UNKNOWN,S_OK}, + {URLZONE_INVALID,E_NOTIMPL} + } + }, + /* FILE_USE_PATHURL has no effect in IE 8, in IE 7 the + * resulting URI is converted into a dos path. + */ + { "http://google.com/test%22,0, + "file:///c:/test/",0, + URL_FILE_USE_PATHURL,S_OK,FALSE, + { + {"file:///c:/test/",S_OK,FALSE,"file://c:\test\"}, + {"",S_FALSE}, + {"file:///c:/test/",S_OK,FALSE,"file://c:\test\"}, + {"",S_FALSE}, + {"",S_FALSE}, + {"",S_FALSE}, + {"",S_FALSE}, + {"",S_FALSE}, + {"/c:/test/",S_OK,FALSE,"c:\test\"}, + {"/c:/test/",S_OK,FALSE,"c:\test\"}, + {"",S_FALSE}, + {"file:///c:/test/",S_OK,FALSE,"file://c:\test\"}, + {"file",S_OK}, + {"",S_FALSE}, + {"",S_FALSE} + }, + { + {Uri_HOST_UNKNOWN,S_OK}, + {0,S_FALSE}, + {URL_SCHEME_FILE,S_OK}, + {URLZONE_INVALID,E_NOTIMPL} + } + }, + { "http://google.com/test%22,0, + "http://test.com/test#%30test%22,0, + URL_DONT_UNESCAPE_EXTRA_INFO,S_OK,FALSE, + { + {"http://test.com/test#0test%22,S_OK%7D, + {"test.com",S_OK}, + {"http://test.com/test#0test%22,S_OK%7D, + {"test.com",S_OK}, + {"",S_FALSE}, + {"#0test",S_OK}, + {"test.com",S_OK}, + {"",S_FALSE}, + {"/test",S_OK}, + {"/test",S_OK}, + {"",S_FALSE}, + /* IE 7 decodes the %30 to a 0 in the Raw URI. */ + {"http://test.com/test#%30test%22,S_OK,FALSE,%22http://test.com/test#0test%22%..., + {"http",S_OK}, + {"",S_FALSE}, + {"",S_FALSE} + }, + { + {Uri_HOST_DNS,S_OK}, + {80,S_OK}, + {URL_SCHEME_HTTP,S_OK}, + {URLZONE_INVALID,E_NOTIMPL} + } } };
@@ -9072,7 +9161,8 @@ static void test_CoInternetCombineIUri(void) { hr, prop.expected, i, j); } todo_wine { - ok(!strcmp_aw(prop.value, received), + ok(!strcmp_aw(prop.value, received) || + broken(prop.broken_value && !strcmp_aw(prop.broken_value, received)), "Error: Expected %s but got %s instead on uri_combine_tests[%d].str_props[%d].\n", prop.value, wine_dbgstr_w(received), i, j); } @@ -9080,7 +9170,8 @@ static void test_CoInternetCombineIUri(void) { ok(hr == prop.expected, "Error: IUri_GetPropertyBSTR returned 0x%08x, expected 0x%08x on uri_combine_tests[%d].str_props[%d].\n", hr, prop.expected, i, j); - ok(!strcmp_aw(prop.value, received), + ok(!strcmp_aw(prop.value, received) || + broken(prop.broken_value && !strcmp_aw(prop.broken_value, received)), "Error: Expected %s but got %s instead on uri_combine_tests[%d].str_props[%d].\n", prop.value, wine_dbgstr_w(received), i, j); } diff --git a/dlls/urlmon/uri.c b/dlls/urlmon/uri.c index e6304e8..3e29575 100644 --- a/dlls/urlmon/uri.c +++ b/dlls/urlmon/uri.c @@ -5589,12 +5589,63 @@ HRESULT WINAPI CreateIUriBuilder(IUri *pIUri, DWORD dwFlags, DWORD_PTR dwReserve return S_OK; }
+static HRESULT combine_uri(Uri *base, Uri *relative, DWORD flags, IUri **result) { + Uri *ret; + HRESULT hr; + parse_data data; + + /* Base case is when the relative Uri has a scheme name, + * if it does, then 'result' will contain the same data + * as the relative Uri. + */ + if(relative->scheme_start > -1) { + DWORD create_flags = 0; + + memset(&data, 0, sizeof(parse_data)); + + data.uri = SysAllocString(relative->raw_uri); + if(!data.uri) { + IUri_Release(URI(ret)); + *result = NULL; + return E_OUTOFMEMORY; + } + + parse_uri(&data, 0); + + ret = create_uri_obj(); + if(!ret) { + *result = NULL; + return E_OUTOFMEMORY; + } + + ret->raw_uri = data.uri; + hr = canonicalize_uri(&data, ret, 0); + if(FAILED(hr)) { + IUri_Release(URI(ret)); + *result = NULL; + return hr; + } + + apply_default_flags(&create_flags); + ret->create_flags = create_flags; + + *result = URI(ret); + } else { + *result = NULL; + return E_NOTIMPL; + } + + return S_OK; +} + /*********************************************************************** * CoInternetCombineIUri (urlmon.@) */ HRESULT WINAPI CoInternetCombineIUri(IUri *pBaseUri, IUri *pRelativeUri, DWORD dwCombineFlags, IUri **ppCombinedUri, DWORD_PTR dwReserved) { + HRESULT hr; + Uri *relative, *base; TRACE("(%p %p %x %p %x)\n", pBaseUri, pRelativeUri, dwCombineFlags, ppCombinedUri, (DWORD)dwReserved);
if(!ppCombinedUri) @@ -5605,6 +5656,17 @@ HRESULT WINAPI CoInternetCombineIUri(IUri *pBaseUri, IUri *pRelativeUri, DWORD d return E_INVALIDARG; }
- FIXME("(%p %p %x %p %x): stub\n", pBaseUri, pRelativeUri, dwCombineFlags, ppCombinedUri, (DWORD)dwReserved); - return E_NOTIMPL; + relative = get_uri_obj(pRelativeUri); + base = get_uri_obj(pBaseUri); + if(!relative || !base) { + *ppCombinedUri = NULL; + FIXME("(%p %p %x %p %x) Unknown IUri types not supported yet.\n", + pBaseUri, pRelativeUri, dwCombineFlags, ppCombinedUri, (DWORD)dwReserved); + return E_NOTIMPL; + } + + hr = combine_uri(base, relative, dwCombineFlags, ppCombinedUri); + if(hr == E_NOTIMPL) + FIXME("(%p %p %x %p %x): stub\n", pBaseUri, pRelativeUri, dwCombineFlags, ppCombinedUri, (DWORD)dwReserved); + return hr; }