Thomas Mullaly : urlmon: Implemented base case for CoInternetCombineIUri.
Alexandre Julliard
julliard at winehq.org
Tue Nov 2 11:10:55 CDT 2010
Module: wine
Branch: master
Commit: bced2e21dbc548ef9d41e3ff11384d7ad964c929
URL: http://source.winehq.org/git/wine.git/?a=commit;h=bced2e21dbc548ef9d41e3ff11384d7ad964c929
Author: Thomas Mullaly <thomas.mullaly at 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",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",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",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",0,
+ "http://test.com/test#%30test",0,
+ URL_DONT_UNESCAPE_EXTRA_INFO,S_OK,FALSE,
+ {
+ {"http://test.com/test#0test",S_OK},
+ {"test.com",S_OK},
+ {"http://test.com/test#0test",S_OK},
+ {"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",S_OK,FALSE,"http://test.com/test#0test"},
+ {"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;
}
More information about the wine-cvs
mailing list