shdocvw: Guess URL scheme if not available.

This commit is contained in:
Jacek Caban 2008-02-27 18:56:53 +01:00 committed by Alexandre Julliard
parent 7cb53e0232
commit 81590db3a2
1 changed files with 34 additions and 5 deletions

View File

@ -26,6 +26,8 @@
#include "exdispid.h"
#include "shellapi.h"
#include "winreg.h"
#include "shlwapi.h"
#include "wininet.h"
WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
@ -550,6 +552,35 @@ static HRESULT http_load_hack(DocHost *This, IMoniker *mon, IBindStatusCallback
return IBindStatusCallback_OnStopBinding(callback, hres, NULL);
}
static HRESULT create_moniker(LPCWSTR url, IMoniker **mon)
{
WCHAR new_url[INTERNET_MAX_URL_LENGTH];
DWORD size;
HRESULT hres;
if(PathIsURLW(url))
return CreateURLMoniker(NULL, url, mon);
if(url[1] == ':') {
size = sizeof(new_url);
hres = UrlCreateFromPathW(url, new_url, &size, 0);
if(FAILED(hres)) {
WARN("UrlCreateFromPathW failed: %08x\n", hres);
return hres;
}
}else {
size = sizeof(new_url);
hres = UrlApplySchemeW(url, new_url, &size, URL_APPLY_GUESSSCHEME);
TRACE("got %s\n", debugstr_w(new_url));
if(FAILED(hres)) {
WARN("UrlApplyScheme failed: %08x\n", hres);
return hres;
}
}
return CreateURLMoniker(NULL, new_url, mon);
}
static HRESULT bind_to_object(DocHost *This, IMoniker *mon, LPCWSTR url, IBindCtx *bindctx,
IBindStatusCallback *callback)
{
@ -564,11 +595,9 @@ static HRESULT bind_to_object(DocHost *This, IMoniker *mon, LPCWSTR url, IBindCt
if(mon) {
IMoniker_AddRef(mon);
}else {
hres = CreateURLMoniker(NULL, url, &mon);
if(FAILED(hres)) {
WARN("CreateURLMoniker failed: %08x\n", hres);
hres = create_moniker(url, &mon);
if(FAILED(hres))
return hres;
}
}
CoTaskMemFree(This->url);
@ -579,7 +608,7 @@ static HRESULT bind_to_object(DocHost *This, IMoniker *mon, LPCWSTR url, IBindCt
IBindCtx_RegisterObjectParam(bindctx, (LPOLESTR)SZ_HTML_CLIENTSITE_OBJECTPARAM,
(IUnknown*)CLIENTSITE(This));
hres = CoInternetParseUrl(url, PARSE_SCHEMA, 0, schema, sizeof(schema)/sizeof(schema[0]),
hres = CoInternetParseUrl(This->url, PARSE_SCHEMA, 0, schema, sizeof(schema)/sizeof(schema[0]),
&schema_len, 0);
if(SUCCEEDED(hres) &&
(!strcmpW(schema, httpW) || !strcmpW(schema, httpsW) || !strcmpW(schema, ftpW))) {