Jacek Caban : urlmon: Added HlinkParseDisplayNameEx implementation.
Alexandre Julliard
julliard at winehq.org
Mon Feb 4 08:42:51 CST 2008
Module: wine
Branch: master
Commit: 60b0539c871c3b3c002e6e2e591fb912fb09d710
URL: http://source.winehq.org/git/wine.git/?a=commit;h=60b0539c871c3b3c002e6e2e591fb912fb09d710
Author: Jacek Caban <jacek at codeweavers.com>
Date: Tue Jan 29 00:18:33 2008 +0100
urlmon: Added HlinkParseDisplayNameEx implementation.
---
dlls/urlmon/session.c | 17 +++++++++++++++++
dlls/urlmon/umon.c | 21 +++++++++++++++++++++
dlls/urlmon/urlmon.spec | 2 +-
dlls/urlmon/urlmon_main.h | 1 +
4 files changed, 40 insertions(+), 1 deletions(-)
diff --git a/dlls/urlmon/session.c b/dlls/urlmon/session.c
index 3571b05..9ce7b66 100644
--- a/dlls/urlmon/session.c
+++ b/dlls/urlmon/session.c
@@ -95,9 +95,26 @@ static HRESULT get_protocol_cf(LPCWSTR schema, DWORD schema_len, CLSID *pclsid,
if(pclsid)
*pclsid = clsid;
+ if(!ret)
+ return S_OK;
+
return CoGetClassObject(&clsid, CLSCTX_INPROC_SERVER, NULL, &IID_IClassFactory, (void**)ret);
}
+BOOL is_registered_protocol(LPCWSTR url)
+{
+ DWORD schema_len;
+ WCHAR schema[64];
+ HRESULT hres;
+
+ hres = CoInternetParseUrl(url, PARSE_SCHEMA, 0, schema, sizeof(schema)/sizeof(schema[0]),
+ &schema_len, 0);
+ if(FAILED(hres))
+ return FALSE;
+
+ return get_protocol_cf(schema, schema_len, NULL, NULL) == S_OK;
+}
+
IInternetProtocolInfo *get_protocol_info(LPCWSTR url)
{
IInternetProtocolInfo *ret = NULL;
diff --git a/dlls/urlmon/umon.c b/dlls/urlmon/umon.c
index 5981a1c..640f382 100644
--- a/dlls/urlmon/umon.c
+++ b/dlls/urlmon/umon.c
@@ -1186,6 +1186,27 @@ HRESULT WINAPI BindAsyncMoniker(IMoniker *pmk, DWORD grfOpt, IBindStatusCallback
}
/***********************************************************************
+ * MkParseDisplayNameEx (URLMON.@)
+ */
+HRESULT WINAPI MkParseDisplayNameEx(IBindCtx *pbc, LPCWSTR szDisplayName, ULONG *pchEaten, LPMONIKER *ppmk)
+{
+ TRACE("(%p %s %p %p)\n", pbc, debugstr_w(szDisplayName), pchEaten, ppmk);
+
+ if(is_registered_protocol(szDisplayName)) {
+ HRESULT hres;
+
+ hres = CreateURLMoniker(NULL, szDisplayName, ppmk);
+ if(SUCCEEDED(hres)) {
+ *pchEaten = strlenW(szDisplayName);
+ return hres;
+ }
+ }
+
+ return MkParseDisplayName(pbc, szDisplayName, pchEaten, ppmk);
+}
+
+
+/***********************************************************************
* URLDownloadToFileA (URLMON.@)
*
* Downloads URL szURL to rile szFileName and call lpfnCB callback to
diff --git a/dlls/urlmon/urlmon.spec b/dlls/urlmon/urlmon.spec
index fdb94eb..06a56b0 100644
--- a/dlls/urlmon/urlmon.spec
+++ b/dlls/urlmon/urlmon.spec
@@ -53,7 +53,7 @@
@ stub IsLoggingEnabledA
@ stub IsLoggingEnabledW
@ stdcall IsValidURL(ptr wstr long)
-@ stdcall MkParseDisplayNameEx(ptr ptr ptr ptr) ole32.MkParseDisplayName
+@ stdcall MkParseDisplayNameEx(ptr wstr ptr ptr)
@ stdcall ObtainUserAgentString(long str ptr)
@ stub PrivateCoInstall
@ stdcall RegisterBindStatusCallback(ptr ptr ptr long)
diff --git a/dlls/urlmon/urlmon_main.h b/dlls/urlmon/urlmon_main.h
index d845e6e..87e74f9 100644
--- a/dlls/urlmon/urlmon_main.h
+++ b/dlls/urlmon/urlmon_main.h
@@ -67,6 +67,7 @@ void UMCloseCacheFileStream(IUMCacheStream *pstr);
IInternetProtocolInfo *get_protocol_info(LPCWSTR url);
HRESULT get_protocol_handler(LPCWSTR url, CLSID *clsid, IClassFactory **ret);
+BOOL is_registered_protocol(LPCWSTR);
HRESULT bind_to_storage(LPCWSTR url, IBindCtx *pbc, REFIID riid, void **ppv);
HRESULT bind_to_object(IMoniker *mon, LPCWSTR url, IBindCtx *pbc, REFIID riid, void **ppv);
More information about the wine-cvs
mailing list