From: Zhiyi Zhang <zzhang@codeweavers.com> This helps urlmon.dll getting the canonicalized URI from an IUri as the Uri type definition will be moved to iertutil. --- dlls/iertutil/iertutil.spec | 1 + dlls/iertutil/uri.c | 7 +++++++ dlls/urlmon/uri.c | 32 +++++++++++++++++--------------- 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/dlls/iertutil/iertutil.spec b/dlls/iertutil/iertutil.spec index 9d3502937a3..b156844ade0 100644 --- a/dlls/iertutil/iertutil.spec +++ b/dlls/iertutil/iertutil.spec @@ -6,3 +6,4 @@ @ stdcall -private DllGetClassObject(ptr ptr ptr) @ stdcall PrivateCoInternetCombineIUri(ptr ptr long ptr long) @ stdcall PrivateCoInternetParseIUri(ptr long long ptr long ptr long) +@ stdcall wine_get_canonicalized_uri(ptr) diff --git a/dlls/iertutil/uri.c b/dlls/iertutil/uri.c index 54e10a2dab2..71b3a713db0 100644 --- a/dlls/iertutil/uri.c +++ b/dlls/iertutil/uri.c @@ -254,6 +254,13 @@ static Uri *get_uri_obj(IUri *uri) return SUCCEEDED(hres) ? ret : NULL; } +/* Wine internal export for urlmon.dll for getting the canonicalized URI from an IUri */ +const WCHAR * WINAPI wine_get_canonicalized_uri(IUri *uri) +{ + const Uri *obj = get_uri_obj(uri); + return obj ? obj->canon_uri : NULL; +} + static inline BOOL is_alpha(WCHAR val) { return ((val >= 'a' && val <= 'z') || (val >= 'A' && val <= 'Z')); } diff --git a/dlls/urlmon/uri.c b/dlls/urlmon/uri.c index 9acf4e0826b..5a914d080be 100644 --- a/dlls/urlmon/uri.c +++ b/dlls/urlmon/uri.c @@ -49,6 +49,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(urlmon); +const WCHAR * WINAPI wine_get_canonicalized_uri(IUri *uri); HRESULT WINAPI PrivateCoInternetCombineIUri(IUri *pBaseUri, IUri *pRelativeUri, DWORD dwCombineFlags, IUri **ppCombinedUri, DWORD_PTR dwReserved); HRESULT WINAPI PrivateCoInternetParseIUri(IUri *pIUri, PARSEACTION ParseAction, DWORD dwFlags, @@ -4683,7 +4684,8 @@ HRESULT WINAPI CoInternetCombineIUri(IUri *pBaseUri, IUri *pRelativeUri, DWORD d { HRESULT hr; IInternetProtocolInfo *info; - Uri *relative, *base; + const WCHAR *relative_canon_uri, *base_canon_uri; + TRACE("(%p %p %lx %p %Ix)\n", pBaseUri, pRelativeUri, dwCombineFlags, ppCombinedUri, dwReserved); if(!ppCombinedUri) @@ -4694,21 +4696,21 @@ HRESULT WINAPI CoInternetCombineIUri(IUri *pBaseUri, IUri *pRelativeUri, DWORD d return E_INVALIDARG; } - relative = get_uri_obj(pRelativeUri); - base = get_uri_obj(pBaseUri); - if(!relative || !base) { + relative_canon_uri = wine_get_canonicalized_uri(pRelativeUri); + base_canon_uri = wine_get_canonicalized_uri(pBaseUri); + if(!relative_canon_uri || !base_canon_uri) { *ppCombinedUri = NULL; FIXME("(%p %p %lx %p %Ix) Unknown IUri types not supported yet.\n", pBaseUri, pRelativeUri, dwCombineFlags, ppCombinedUri, dwReserved); return E_NOTIMPL; } - info = get_protocol_info(base->canon_uri); + info = get_protocol_info(base_canon_uri); if(info) { WCHAR result[INTERNET_MAX_URL_LENGTH+1]; DWORD result_len = 0; - hr = IInternetProtocolInfo_CombineUrl(info, base->canon_uri, relative->canon_uri, dwCombineFlags, + hr = IInternetProtocolInfo_CombineUrl(info, base_canon_uri, relative_canon_uri, dwCombineFlags, result, INTERNET_MAX_URL_LENGTH+1, &result_len, 0); IInternetProtocolInfo_Release(info); if(SUCCEEDED(hr)) { @@ -4728,7 +4730,7 @@ HRESULT WINAPI CoInternetCombineUrlEx(IUri *pBaseUri, LPCWSTR pwzRelativeUrl, DW IUri **ppCombinedUri, DWORD_PTR dwReserved) { IUri *relative; - Uri *base; + const WCHAR *base_canon_uri; HRESULT hr; IInternetProtocolInfo *info; @@ -4748,20 +4750,20 @@ HRESULT WINAPI CoInternetCombineUrlEx(IUri *pBaseUri, LPCWSTR pwzRelativeUrl, DW return E_INVALIDARG; } - base = get_uri_obj(pBaseUri); - if(!base) { + base_canon_uri = wine_get_canonicalized_uri(pBaseUri); + if(!base_canon_uri) { *ppCombinedUri = NULL; FIXME("(%p %s %lx %p %Ix) Unknown IUri's not supported yet.\n", pBaseUri, debugstr_w(pwzRelativeUrl), dwCombineFlags, ppCombinedUri, dwReserved); return E_NOTIMPL; } - info = get_protocol_info(base->canon_uri); + info = get_protocol_info(base_canon_uri); if(info) { WCHAR result[INTERNET_MAX_URL_LENGTH+1]; DWORD result_len = 0; - hr = IInternetProtocolInfo_CombineUrl(info, base->canon_uri, pwzRelativeUrl, dwCombineFlags, + hr = IInternetProtocolInfo_CombineUrl(info, base_canon_uri, pwzRelativeUrl, dwCombineFlags, result, INTERNET_MAX_URL_LENGTH+1, &result_len, 0); IInternetProtocolInfo_Release(info); if(SUCCEEDED(hr)) { @@ -4791,7 +4793,7 @@ HRESULT WINAPI CoInternetParseIUri(IUri *pIUri, PARSEACTION ParseAction, DWORD d DWORD_PTR dwReserved) { HRESULT hr; - Uri *uri; + const WCHAR *canon_uri; IInternetProtocolInfo *info; TRACE("(%p %d %lx %p %ld %p %Ix)\n", pIUri, ParseAction, dwFlags, pwzResult, @@ -4805,16 +4807,16 @@ HRESULT WINAPI CoInternetParseIUri(IUri *pIUri, PARSEACTION ParseAction, DWORD d return E_INVALIDARG; } - if(!(uri = get_uri_obj(pIUri))) { + if(!(canon_uri = wine_get_canonicalized_uri(pIUri))) { *pcchResult = 0; FIXME("(%p %d %lx %p %ld %p %Ix) Unknown IUri's not supported for this action.\n", pIUri, ParseAction, dwFlags, pwzResult, cchResult, pcchResult, dwReserved); return E_NOTIMPL; } - info = get_protocol_info(uri->canon_uri); + info = get_protocol_info(canon_uri); if(info) { - hr = IInternetProtocolInfo_ParseUrl(info, uri->canon_uri, ParseAction, dwFlags, + hr = IInternetProtocolInfo_ParseUrl(info, canon_uri, ParseAction, dwFlags, pwzResult, cchResult, pcchResult, 0); IInternetProtocolInfo_Release(info); if(SUCCEEDED(hr)) return hr; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9131