Jacek Caban : shdocvw: Guess URL scheme if not available.
Alexandre Julliard
julliard at winehq.org
Thu Feb 28 06:21:32 CST 2008
Module: wine
Branch: master
Commit: 81590db3a2b37fd9c025922ec97f75159412dd49
URL: http://source.winehq.org/git/wine.git/?a=commit;h=81590db3a2b37fd9c025922ec97f75159412dd49
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed Feb 27 18:56:53 2008 +0100
shdocvw: Guess URL scheme if not available.
---
dlls/shdocvw/navigate.c | 39 ++++++++++++++++++++++++++++++++++-----
1 files changed, 34 insertions(+), 5 deletions(-)
diff --git a/dlls/shdocvw/navigate.c b/dlls/shdocvw/navigate.c
index 2d46abe..7e8606f 100644
--- a/dlls/shdocvw/navigate.c
+++ b/dlls/shdocvw/navigate.c
@@ -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))) {
More information about the wine-cvs
mailing list