From: Zhiyi Zhang <zzhang@codeweavers.com> This helps getting the canonicalized URI from an IUri. This is similar to get_uri_obj(). The Uri type definition will be moved to iertutil. --- dlls/iertutil/uri.c | 5 +++++ dlls/urlmon/uri.c | 45 ++++++++++++++++++++++++++++++--------------- 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/dlls/iertutil/uri.c b/dlls/iertutil/uri.c index 54e10a2dab2..96c79dc89c8 100644 --- a/dlls/iertutil/uri.c +++ b/dlls/iertutil/uri.c @@ -62,6 +62,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(iertutil); static const GUID CLSID_CUri = {0xDF2FCE13,0x25EC,0x45BB,{0x9D,0x4C,0xCE,0xCD,0x47,0xC2,0x43,0x0C}}; static const IID IID_IUriObj = {0x4b364760,0x9f51,0x11df,{0x98,0x1c,0x08,0x00,0x20,0x0c,0x9a,0x66}}; +static const IID IID_IUriCanonUri = {0x4b364760,0x9f51,0x11df,{0x98,0x1c,0x08,0x00,0x20,0x0c,0x9a,0x67}}; typedef struct { IUri IUri_iface; @@ -3853,6 +3854,10 @@ static HRESULT WINAPI Uri_QueryInterface(IUri *iface, REFIID riid, void **ppv) TRACE("(%p)->(IID_IUriObj %p)\n", This, ppv); *ppv = This; return S_OK; + }else if(IsEqualGUID(&IID_IUriCanonUri, riid)) { + TRACE("(%p)->(IID_IUriCanonUri %p)\n", This, ppv); + *ppv = This->canon_uri; + return S_OK; }else { TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); *ppv = NULL; diff --git a/dlls/urlmon/uri.c b/dlls/urlmon/uri.c index d46646debb7..e3d4d464e65 100644 --- a/dlls/urlmon/uri.c +++ b/dlls/urlmon/uri.c @@ -56,6 +56,7 @@ HRESULT WINAPI PrivateCoInternetParseIUri(IUri *pIUri, PARSEACTION ParseAction, DWORD_PTR dwReserved); static const IID IID_IUriObj = {0x4b364760,0x9f51,0x11df,{0x98,0x1c,0x08,0x00,0x20,0x0c,0x9a,0x66}}; +static const IID IID_IUriCanonUri = {0x4b364760,0x9f51,0x11df,{0x98,0x1c,0x08,0x00,0x20,0x0c,0x9a,0x67}}; typedef struct { IUri IUri_iface; @@ -239,6 +240,15 @@ static const struct { {L"org"} }; +static const WCHAR *get_canonicalized_uri(IUri *uri) +{ + const WCHAR *ret; + HRESULT hres; + + hres = IUri_QueryInterface(uri, &IID_IUriCanonUri, (void **)&ret); + return SUCCEEDED(hres) ? ret : NULL; +} + static Uri *get_uri_obj(IUri *uri) { Uri *ret; @@ -3170,6 +3180,10 @@ static HRESULT WINAPI Uri_QueryInterface(IUri *iface, REFIID riid, void **ppv) TRACE("(%p)->(IID_IUriObj %p)\n", This, ppv); *ppv = This; return S_OK; + }else if(IsEqualGUID(&IID_IUriCanonUri, riid)) { + TRACE("(%p)->(IID_IUriCanonUri %p)\n", This, ppv); + *ppv = This->canon_uri; + return S_OK; }else { TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); *ppv = NULL; @@ -4692,7 +4706,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) @@ -4703,21 +4718,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 = get_canonicalized_uri(pRelativeUri); + base_canon_uri = 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)) { @@ -4737,7 +4752,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; @@ -4757,20 +4772,20 @@ HRESULT WINAPI CoInternetCombineUrlEx(IUri *pBaseUri, LPCWSTR pwzRelativeUrl, DW return E_INVALIDARG; } - base = get_uri_obj(pBaseUri); - if(!base) { + base_canon_uri = 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)) { @@ -4800,7 +4815,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, @@ -4814,16 +4829,16 @@ HRESULT WINAPI CoInternetParseIUri(IUri *pIUri, PARSEACTION ParseAction, DWORD d return E_INVALIDARG; } - if(!(uri = get_uri_obj(pIUri))) { + if(!(canon_uri = 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