static HRESULT parse_domain(LPCWSTR url, DWORD flags, LPWSTR result, DWORD size, DWORD *rsize) { IInternetProtocolInfo *protocol_info; HRESULT hres; TRACE("(%s %08x %p %d %p)\n", debugstr_w(url), flags, result, size, rsize); protocol_info = get_protocol_info(url); if(protocol_info) { hres = IInternetProtocolInfo_ParseUrl(protocol_info, url, PARSE_DOMAIN, flags, result, size, rsize, 0); IInternetProtocolInfo_Release(protocol_info); if(SUCCEEDED(hres)) return hres; } hres = UrlGetPartW(url, result, &size, URL_PART_HOSTNAME, flags); if(rsize) *rsize = size; if(hres == E_POINTER) return S_FALSE; if(FAILED(hres)) return E_FAIL; return S_OK; }
/************************************************************************** * CoInternetCombineUrl (URLMON.@) */ HRESULT WINAPI CoInternetCombineUrl(LPCWSTR pwzBaseUrl, LPCWSTR pwzRelativeUrl, DWORD dwCombineFlags, LPWSTR pwzResult, DWORD cchResult, DWORD *pcchResult, DWORD dwReserved) { IInternetProtocolInfo *protocol_info; DWORD size = cchResult; HRESULT hres; TRACE("(%s,%s,0x%08x,%p,%d,%p,%d)\n", debugstr_w(pwzBaseUrl), debugstr_w(pwzRelativeUrl), dwCombineFlags, pwzResult, cchResult, pcchResult, dwReserved); protocol_info = get_protocol_info(pwzBaseUrl); if(protocol_info) { hres = IInternetProtocolInfo_CombineUrl(protocol_info, pwzBaseUrl, pwzRelativeUrl, dwCombineFlags, pwzResult, cchResult, pcchResult, dwReserved); IInternetProtocolInfo_Release(protocol_info); if(SUCCEEDED(hres)) return hres; } hres = UrlCombineW(pwzBaseUrl, pwzRelativeUrl, pwzResult, &size, dwCombineFlags); if(pcchResult) *pcchResult = size; return hres; }
static HRESULT parse_path_from_url(LPCWSTR url, DWORD flags, LPWSTR result, DWORD size, DWORD *rsize) { IInternetProtocolInfo *protocol_info; DWORD prsize; HRESULT hres; TRACE("(%s %08x %p %d %p)\n", debugstr_w(url), flags, result, size, rsize); protocol_info = get_protocol_info(url); if(protocol_info) { hres = IInternetProtocolInfo_ParseUrl(protocol_info, url, PARSE_PATH_FROM_URL, flags, result, size, rsize, 0); IInternetProtocolInfo_Release(protocol_info); if(SUCCEEDED(hres)) return hres; } prsize = size; hres = PathCreateFromUrlW(url, result, &prsize, 0); if(rsize) *rsize = prsize; return hres; }
static HRESULT parse_encode(LPCWSTR url, DWORD flags, LPWSTR result, DWORD size, DWORD *rsize) { IInternetProtocolInfo *protocol_info; DWORD prsize; HRESULT hres; TRACE("(%s %08x %p %d %p)\n", debugstr_w(url), flags, result, size, rsize); protocol_info = get_protocol_info(url); if(protocol_info) { hres = IInternetProtocolInfo_ParseUrl(protocol_info, url, PARSE_ENCODE, flags, result, size, rsize, 0); IInternetProtocolInfo_Release(protocol_info); if(SUCCEEDED(hres)) return hres; } prsize = size; hres = UrlUnescapeW((LPWSTR)url, result, &prsize, flags); if(rsize) *rsize = prsize; return hres; }
static HRESULT parse_canonicalize_url(LPCWSTR url, DWORD flags, LPWSTR result, DWORD size, DWORD *rsize) { IInternetProtocolInfo *protocol_info; DWORD prsize = size; HRESULT hres; TRACE("(%s %08x %p %d %p)\n", debugstr_w(url), flags, result, size, rsize); protocol_info = get_protocol_info(url); if(protocol_info) { hres = IInternetProtocolInfo_ParseUrl(protocol_info, url, PARSE_CANONICALIZE, flags, result, size, rsize, 0); IInternetProtocolInfo_Release(protocol_info); if(SUCCEEDED(hres)) return hres; } hres = UrlCanonicalizeW(url, result, &prsize, flags); if(rsize) *rsize = prsize; return hres; }
/************************************************************************** * CoInternetCompareUrl (URLMON.@) */ HRESULT WINAPI CoInternetCompareUrl(LPCWSTR pwzUrl1, LPCWSTR pwzUrl2, DWORD dwCompareFlags) { IInternetProtocolInfo *protocol_info; HRESULT hres; TRACE("(%s,%s,%08x)\n", debugstr_w(pwzUrl1), debugstr_w(pwzUrl2), dwCompareFlags); protocol_info = get_protocol_info(pwzUrl1); if(protocol_info) { hres = IInternetProtocolInfo_CompareUrl(protocol_info, pwzUrl1, pwzUrl2, dwCompareFlags); IInternetProtocolInfo_Release(protocol_info); if(SUCCEEDED(hres)) return hres; } return UrlCompareW(pwzUrl1, pwzUrl2, dwCompareFlags) ? S_FALSE : S_OK; }
static HRESULT parse_security_url(LPCWSTR url, DWORD flags, LPWSTR result, DWORD size, DWORD *rsize) { IInternetProtocolInfo *protocol_info; HRESULT hres; TRACE("(%s %08x %p %d %p)\n", debugstr_w(url), flags, result, size, rsize); protocol_info = get_protocol_info(url); if(protocol_info) { hres = IInternetProtocolInfo_ParseUrl(protocol_info, url, PARSE_SECURITY_URL, flags, result, size, rsize, 0); IInternetProtocolInfo_Release(protocol_info); return hres; } return E_FAIL; }
/*********************************************************************** * CoInternetQueryInfo (URLMON.@) * * Retrieves information relevant to a specified URL * */ HRESULT WINAPI CoInternetQueryInfo(LPCWSTR pwzUrl, QUERYOPTION QueryOption, DWORD dwQueryFlags, LPVOID pvBuffer, DWORD cbBuffer, DWORD *pcbBuffer, DWORD dwReserved) { IInternetProtocolInfo *protocol_info; HRESULT hres; TRACE("(%s, %x, %x, %p, %x, %p, %x): stub\n", debugstr_w(pwzUrl), QueryOption, dwQueryFlags, pvBuffer, cbBuffer, pcbBuffer, dwReserved); protocol_info = get_protocol_info(pwzUrl); if(protocol_info) { hres = IInternetProtocolInfo_QueryInfo(protocol_info, pwzUrl, QueryOption, dwQueryFlags, pvBuffer, cbBuffer, pcbBuffer, dwReserved); IInternetProtocolInfo_Release(protocol_info); return SUCCEEDED(hres) ? hres : E_FAIL; } switch(QueryOption) { case QUERY_USES_NETWORK: if(!pvBuffer || cbBuffer < sizeof(DWORD)) return E_FAIL; *(DWORD*)pvBuffer = 0; if(pcbBuffer) *pcbBuffer = sizeof(DWORD); break; default: FIXME("Not supported option %d\n", QueryOption); return E_NOTIMPL; } return S_OK; }
static HRESULT parse_security_url(const WCHAR *url, PSUACTION action, WCHAR **result) { IInternetProtocolInfo *protocol_info; WCHAR *tmp, *new_url = NULL, *alloc_url = NULL; DWORD size, new_size; HRESULT hres = S_OK, parse_hres; while(1) { TRACE("parsing %s\n", debugstr_w(url)); protocol_info = get_protocol_info(url); if(!protocol_info) break; size = strlenW(url)+1; new_url = CoTaskMemAlloc(size*sizeof(WCHAR)); if(!new_url) { hres = E_OUTOFMEMORY; break; } new_size = 0; parse_hres = IInternetProtocolInfo_ParseUrl(protocol_info, url, PARSE_SECURITY_URL, 0, new_url, size, &new_size, 0); if(parse_hres == S_FALSE) { if(!new_size) { hres = E_UNEXPECTED; break; } tmp = CoTaskMemRealloc(new_url, new_size*sizeof(WCHAR)); if(!tmp) { hres = E_OUTOFMEMORY; break; } new_url = tmp; parse_hres = IInternetProtocolInfo_ParseUrl(protocol_info, url, PARSE_SECURITY_URL, 0, new_url, new_size, &new_size, 0); if(parse_hres == S_FALSE) { hres = E_FAIL; break; } } if(parse_hres != S_OK || !strcmpW(url, new_url)) break; CoTaskMemFree(alloc_url); url = alloc_url = new_url; new_url = NULL; } CoTaskMemFree(new_url); if(hres != S_OK) { WARN("failed: %08x\n", hres); CoTaskMemFree(alloc_url); return hres; } if(action == PSU_DEFAULT && (protocol_info = get_protocol_info(url))) { size = strlenW(url)+1; new_url = CoTaskMemAlloc(size * sizeof(WCHAR)); if(new_url) { new_size = 0; parse_hres = IInternetProtocolInfo_ParseUrl(protocol_info, url, PARSE_SECURITY_DOMAIN, 0, new_url, size, &new_size, 0); if(parse_hres == S_FALSE) { if(new_size) { tmp = CoTaskMemRealloc(new_url, new_size*sizeof(WCHAR)); if(tmp) { new_url = tmp; parse_hres = IInternetProtocolInfo_ParseUrl(protocol_info, url, PARSE_SECURITY_DOMAIN, 0, new_url, new_size, &new_size, 0); if(parse_hres == S_FALSE) hres = E_FAIL; }else { hres = E_OUTOFMEMORY; } }else { hres = E_UNEXPECTED; } } if(hres == S_OK && parse_hres == S_OK) { CoTaskMemFree(alloc_url); url = alloc_url = new_url; new_url = NULL; } CoTaskMemFree(new_url); }else { hres = E_OUTOFMEMORY; } IInternetProtocolInfo_Release(protocol_info); } if(FAILED(hres)) { WARN("failed %08x\n", hres); CoTaskMemFree(alloc_url); return hres; } if(!alloc_url) { size = strlenW(url)+1; alloc_url = CoTaskMemAlloc(size * sizeof(WCHAR)); if(!alloc_url) return E_OUTOFMEMORY; memcpy(alloc_url, url, size * sizeof(WCHAR)); } *result = alloc_url; return S_OK; }
static HRESULT parse_rootdocument(LPCWSTR url, DWORD flags, LPWSTR result, DWORD size, DWORD *rsize) { IInternetProtocolInfo *protocol_info; PARSEDURLW url_info; HRESULT hres; TRACE("(%s %08x %p %d %p)\n", debugstr_w(url), flags, result, size, rsize); protocol_info = get_protocol_info(url); if(protocol_info) { hres = IInternetProtocolInfo_ParseUrl(protocol_info, url, PARSE_ROOTDOCUMENT, flags, result, size, rsize, 0); IInternetProtocolInfo_Release(protocol_info); if(SUCCEEDED(hres)) return hres; } url_info.cbSize = sizeof(url_info); if(FAILED(ParseURLW(url, &url_info))) return E_FAIL; switch(url_info.nScheme) { case URL_SCHEME_FTP: case URL_SCHEME_HTTP: case URL_SCHEME_HTTPS: if(url_info.cchSuffix<3 || *(url_info.pszSuffix)!='/' || *(url_info.pszSuffix+1)!='/') return E_FAIL; if(size < url_info.cchProtocol+3) { size = 0; hres = UrlGetPartW(url, result, &size, URL_PART_HOSTNAME, flags); if(rsize) *rsize = size+url_info.cchProtocol+3; if(hres == E_POINTER) return S_FALSE; return hres; } size -= url_info.cchProtocol+3; hres = UrlGetPartW(url, result+url_info.cchProtocol+3, &size, URL_PART_HOSTNAME, flags); if(hres == E_POINTER) return S_FALSE; if(FAILED(hres)) return E_FAIL; if(rsize) *rsize = size+url_info.cchProtocol+3; memcpy(result, url, (url_info.cchProtocol+3)*sizeof(WCHAR)); return hres; default: return E_FAIL; } }