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