From: Zhiyi Zhang <zzhang@codeweavers.com> --- dlls/iertutil/iertutil.spec | 1 + dlls/iertutil/uri.c | 74 +++++++++++++++++++++++++++++++++++++ dlls/urlmon/uri.c | 74 ------------------------------------- dlls/urlmon/urlmon.spec | 2 +- 4 files changed, 76 insertions(+), 75 deletions(-) diff --git a/dlls/iertutil/iertutil.spec b/dlls/iertutil/iertutil.spec index 3e92b413099..ccfc966d117 100644 --- a/dlls/iertutil/iertutil.spec +++ b/dlls/iertutil/iertutil.spec @@ -1,5 +1,6 @@ @ stdcall CreateIUriBuilder(ptr long long ptr) @ stdcall CreateUri(wstr long long ptr) +@ stdcall CreateUriWithFragment(wstr wstr long long ptr) @ stdcall -private DllCanUnloadNow() @ stdcall -private DllGetActivationFactory(ptr ptr) @ stdcall -private DllGetClassObject(ptr ptr ptr) diff --git a/dlls/iertutil/uri.c b/dlls/iertutil/uri.c index 8a5af3537b9..b5d5cd01d10 100644 --- a/dlls/iertutil/uri.c +++ b/dlls/iertutil/uri.c @@ -5467,6 +5467,80 @@ HRESULT WINAPI CreateUri(LPCWSTR pwzURI, DWORD dwFlags, DWORD_PTR dwReserved, IU return S_OK; } +/*********************************************************************** + * CreateUriWithFragment (iertutil.@) + * + * Creates a new IUri object. This is almost the same as CreateUri, expect that + * it allows you to explicitly specify a fragment (pwzFragment) for pwzURI. + * + * PARAMS + * pwzURI [I] The URI to parse and perform canonicalization on. + * pwzFragment [I] The explicit fragment string which should be added to pwzURI. + * dwFlags [I] The flags which will be passed to CreateUri. + * dwReserved [I] Reserved (not used). + * ppURI [O] The resulting IUri after parsing/canonicalization. + * + * RETURNS + * Success: S_OK. ppURI contains the pointer to the newly allocated IUri. + * Failure: E_INVALIDARG if pwzURI already contains a fragment and pwzFragment + * isn't NULL. Will also return E_INVALIDARG for the same reasons as + * CreateUri will. E_OUTOFMEMORY if any allocation fails. + */ +HRESULT WINAPI CreateUriWithFragment(LPCWSTR pwzURI, LPCWSTR pwzFragment, DWORD dwFlags, + DWORD_PTR dwReserved, IUri **ppURI) +{ + HRESULT hres; + TRACE("(%s %s %lx %Ix %p)\n", debugstr_w(pwzURI), debugstr_w(pwzFragment), dwFlags, dwReserved, ppURI); + + if(!ppURI) + return E_INVALIDARG; + + if(!pwzURI) { + *ppURI = NULL; + return E_INVALIDARG; + } + + /* Check if a fragment should be appended to the URI string. */ + if(pwzFragment) { + WCHAR *uriW; + DWORD uri_len, frag_len; + BOOL add_pound; + + /* Check if the original URI already has a fragment component. */ + if(StrChrW(pwzURI, '#')) { + *ppURI = NULL; + return E_INVALIDARG; + } + + uri_len = lstrlenW(pwzURI); + frag_len = lstrlenW(pwzFragment); + + /* If the fragment doesn't start with a '#', one will be added. */ + add_pound = *pwzFragment != '#'; + + if(add_pound) + uriW = malloc((uri_len + frag_len + 2) * sizeof(WCHAR)); + else + uriW = malloc((uri_len + frag_len + 1) * sizeof(WCHAR)); + + if(!uriW) + return E_OUTOFMEMORY; + + memcpy(uriW, pwzURI, uri_len*sizeof(WCHAR)); + if(add_pound) + uriW[uri_len++] = '#'; + memcpy(uriW+uri_len, pwzFragment, (frag_len+1)*sizeof(WCHAR)); + + hres = CreateUri(uriW, dwFlags, 0, ppURI); + + free(uriW); + } else + /* A fragment string wasn't specified, so just forward the call. */ + hres = CreateUri(pwzURI, dwFlags, 0, ppURI); + + return hres; +} + static HRESULT build_uri(const UriBuilder *builder, IUri **uri, DWORD create_flags, DWORD use_orig_flags, DWORD encoding_mask) { diff --git a/dlls/urlmon/uri.c b/dlls/urlmon/uri.c index 62773d3183d..97721649565 100644 --- a/dlls/urlmon/uri.c +++ b/dlls/urlmon/uri.c @@ -4852,80 +4852,6 @@ HRESULT Uri_Construct(IUnknown *pUnkOuter, LPVOID *ppobj) return S_OK; } -/*********************************************************************** - * CreateUriWithFragment (urlmon.@) - * - * Creates a new IUri object. This is almost the same as CreateUri, expect that - * it allows you to explicitly specify a fragment (pwzFragment) for pwzURI. - * - * PARAMS - * pwzURI [I] The URI to parse and perform canonicalization on. - * pwzFragment [I] The explicit fragment string which should be added to pwzURI. - * dwFlags [I] The flags which will be passed to CreateUri. - * dwReserved [I] Reserved (not used). - * ppURI [O] The resulting IUri after parsing/canonicalization. - * - * RETURNS - * Success: S_OK. ppURI contains the pointer to the newly allocated IUri. - * Failure: E_INVALIDARG if pwzURI already contains a fragment and pwzFragment - * isn't NULL. Will also return E_INVALIDARG for the same reasons as - * CreateUri will. E_OUTOFMEMORY if any allocation fails. - */ -HRESULT WINAPI CreateUriWithFragment(LPCWSTR pwzURI, LPCWSTR pwzFragment, DWORD dwFlags, - DWORD_PTR dwReserved, IUri **ppURI) -{ - HRESULT hres; - TRACE("(%s %s %lx %Ix %p)\n", debugstr_w(pwzURI), debugstr_w(pwzFragment), dwFlags, dwReserved, ppURI); - - if(!ppURI) - return E_INVALIDARG; - - if(!pwzURI) { - *ppURI = NULL; - return E_INVALIDARG; - } - - /* Check if a fragment should be appended to the URI string. */ - if(pwzFragment) { - WCHAR *uriW; - DWORD uri_len, frag_len; - BOOL add_pound; - - /* Check if the original URI already has a fragment component. */ - if(StrChrW(pwzURI, '#')) { - *ppURI = NULL; - return E_INVALIDARG; - } - - uri_len = lstrlenW(pwzURI); - frag_len = lstrlenW(pwzFragment); - - /* If the fragment doesn't start with a '#', one will be added. */ - add_pound = *pwzFragment != '#'; - - if(add_pound) - uriW = malloc((uri_len + frag_len + 2) * sizeof(WCHAR)); - else - uriW = malloc((uri_len + frag_len + 1) * sizeof(WCHAR)); - - if(!uriW) - return E_OUTOFMEMORY; - - memcpy(uriW, pwzURI, uri_len*sizeof(WCHAR)); - if(add_pound) - uriW[uri_len++] = '#'; - memcpy(uriW+uri_len, pwzFragment, (frag_len+1)*sizeof(WCHAR)); - - hres = CreateUri(uriW, dwFlags, 0, ppURI); - - free(uriW); - } else - /* A fragment string wasn't specified, so just forward the call. */ - hres = CreateUri(pwzURI, dwFlags, 0, ppURI); - - return hres; -} - /* Merges the base path with the relative path and stores the resulting path * and path len in 'result' and 'result_len'. */ diff --git a/dlls/urlmon/urlmon.spec b/dlls/urlmon/urlmon.spec index d975cbb9746..4be72c59d09 100644 --- a/dlls/urlmon/urlmon.spec +++ b/dlls/urlmon/urlmon.spec @@ -35,7 +35,7 @@ @ stdcall CreateFormatEnumerator(long ptr ptr) @ stdcall CreateIUriBuilder(ptr long long ptr) iertutil.CreateIUriBuilder @ stdcall CreateUri(wstr long long ptr) iertutil.CreateUri -@ stdcall CreateUriWithFragment(wstr wstr long long ptr) +@ stdcall CreateUriWithFragment(wstr wstr long long ptr) iertutil.CreateUriWithFragment @ stdcall CreateURLMoniker(ptr wstr ptr) @ stdcall CreateURLMonikerEx(ptr wstr ptr long) @ stdcall CreateURLMonikerEx2(ptr ptr ptr long) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9131