Module: wine Branch: master Commit: 60b0539c871c3b3c002e6e2e591fb912fb09d710 URL: http://source.winehq.org/git/wine.git/?a=commit;h=60b0539c871c3b3c002e6e2e59...
Author: Jacek Caban jacek@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);