HRESULT get_protocol_handler(IUri *uri, CLSID *clsid, BOOL *urlmon_protocol, IClassFactory **ret) { name_space *ns; BSTR scheme; HRESULT hres; *ret = NULL; /* FIXME: Avoid GetSchemeName call for known schemes */ hres = IUri_GetSchemeName(uri, &scheme); if(FAILED(hres)) return hres; EnterCriticalSection(&session_cs); ns = find_name_space(scheme); if(ns) { *ret = ns->cf; IClassFactory_AddRef(*ret); if(clsid) *clsid = ns->clsid; if(urlmon_protocol) *urlmon_protocol = ns->urlmon; } LeaveCriticalSection(&session_cs); if(*ret) { hres = S_OK; }else { if(urlmon_protocol) *urlmon_protocol = FALSE; hres = get_protocol_cf(scheme, SysStringLen(scheme), clsid, ret); } SysFreeString(scheme); return hres; }
static HRESULT WINAPI HTMLLocation_get_protocol(IHTMLLocation *iface, BSTR *p) { HTMLLocation *This = impl_from_IHTMLLocation(iface); BSTR protocol, ret; unsigned len; IUri *uri; HRESULT hres; TRACE("(%p)->(%p)\n", This, p); if(!p) return E_POINTER; if(!(uri = get_uri(This))) { FIXME("No current URI\n"); return E_NOTIMPL; } hres = IUri_GetSchemeName(uri, &protocol); if(FAILED(hres)) return hres; if(hres == S_FALSE) { SysFreeString(protocol); *p = NULL; return S_OK; } len = SysStringLen(protocol); ret = SysAllocStringLen(protocol, len+1); SysFreeString(protocol); if(!ret) return E_OUTOFMEMORY; ret[len] = ':'; *p = ret; return S_OK; }