if(ptr)
len = ptr-url;
+ if(rsize)
+ *rsize = len;
+
if(len >= size)
return E_POINTER;
memcpy(result, url, len*sizeof(WCHAR));
result[len] = 0;
- if(rsize)
- *rsize = len;
-
return S_OK;
}
return E_FAIL;
}
+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;
+}
+
+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;
+ }
+}
+
/**************************************************************************
* CoInternetParseUrl (URLMON.@)
*/
return parse_schema(pwzUrl, dwFlags, pszResult, cchResult, pcchResult);
case PARSE_SECURITY_DOMAIN:
return parse_security_domain(pwzUrl, dwFlags, pszResult, cchResult, pcchResult);
+ case PARSE_DOMAIN:
+ return parse_domain(pwzUrl, dwFlags, pszResult, cchResult, pcchResult);
+ case PARSE_ROOTDOCUMENT:
+ return parse_rootdocument(pwzUrl, dwFlags, pszResult, cchResult, pcchResult);
default:
FIXME("not supported action %d\n", ParseAction);
}
FIXME("%d, 0x%08x, %x, stub\n", feature, flags, enable);
return E_NOTIMPL;
}
+
+/***********************************************************************
+ * CoInternetIsFeatureEnabled (URLMON.@)
+ */
+HRESULT WINAPI CoInternetIsFeatureEnabled(INTERNETFEATURELIST feature, DWORD flags)
+{
+ FIXME("%d, 0x%08x, stub\n", feature, flags);
+ return E_NOTIMPL;
+}