Jacek Caban : urlmon: Reimplement CreateURLMonikerEx on top of IUri APIs.

Alexandre Julliard julliard at winehq.org
Fri Jun 24 13:53:59 CDT 2011


Module: wine
Branch: master
Commit: c9f821ef6f7bae3760436021589183a45b50f886
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=c9f821ef6f7bae3760436021589183a45b50f886

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Jun 23 13:43:11 2011 +0200

urlmon: Reimplement CreateURLMonikerEx on top of IUri APIs.

---

 dlls/urlmon/umon.c |  115 ++++++++++++++++++++++++++++------------------------
 1 files changed, 62 insertions(+), 53 deletions(-)

diff --git a/dlls/urlmon/umon.c b/dlls/urlmon/umon.c
index 8811718..fbb2287 100644
--- a/dlls/urlmon/umon.c
+++ b/dlls/urlmon/umon.c
@@ -37,6 +37,7 @@ typedef struct {
 
     LONG ref;
 
+    IUri *uri;
     BSTR URLName;
 } URLMoniker;
 
@@ -98,6 +99,8 @@ static ULONG WINAPI URLMoniker_Release(IMoniker *iface)
     TRACE("(%p) ref=%u\n",This, refCount);
 
     if (!refCount) {
+        if(This->uri)
+            IUri_Release(This->uri);
         SysFreeString(This->URLName);
         heap_free(This);
 
@@ -504,55 +507,52 @@ static const IUriContainerVtbl UriContainerVtbl = {
     UriContainer_GetIUri
 };
 
-static URLMoniker *alloc_moniker(void)
+static HRESULT create_moniker(IUri *uri, URLMoniker **ret)
 {
-    URLMoniker *ret;
-
-    ret = heap_alloc(sizeof(URLMoniker));
-    if(!ret)
-        return NULL;
-
-    ret->IMoniker_iface.lpVtbl = &URLMonikerVtbl;
-    ret->IUriContainer_iface.lpVtbl = &UriContainerVtbl;
-    ret->ref = 1;
-    ret->URLName = NULL;
-
-    return ret;
-}
-
-static HRESULT URLMoniker_Init(URLMoniker *This, LPCOLESTR lpszLeftURLName, LPCOLESTR lpszURLName)
-{
-    WCHAR url[INTERNET_MAX_URL_LENGTH];
+    URLMoniker *mon;
     HRESULT hres;
-    DWORD sizeStr = 0;
 
-    TRACE("(%p,%s,%s)\n",This,debugstr_w(lpszLeftURLName),debugstr_w(lpszURLName));
+    mon = heap_alloc(sizeof(*mon));
+    if(!mon)
+        return E_OUTOFMEMORY;
 
-    if(lpszLeftURLName)
-        hres = CoInternetCombineUrl(lpszLeftURLName, lpszURLName, URL_FILE_USE_PATHURL,
-                url, INTERNET_MAX_URL_LENGTH, &sizeStr, 0);
-    else
-        hres = CoInternetParseUrl(lpszURLName, PARSE_CANONICALIZE, URL_FILE_USE_PATHURL,
-                url, INTERNET_MAX_URL_LENGTH, &sizeStr, 0);
+    mon->IMoniker_iface.lpVtbl = &URLMonikerVtbl;
+    mon->IUriContainer_iface.lpVtbl = &UriContainerVtbl;
+    mon->ref = 1;
 
-    if(FAILED(hres))
-        return hres;
+    if(uri) {
+        /* FIXME: try to avoid it */
+        hres = IUri_GetDisplayUri(uri, &mon->URLName);
+        if(FAILED(hres)) {
+            heap_free(mon);
+            return hres;
+        }
 
-    This->URLName = SysAllocString(url);
+        IUri_AddRef(uri);
+        mon->uri = uri;
+    }else {
+        mon->URLName = NULL;
+        mon->uri = NULL;
+    }
 
     URLMON_LockModule();
-
-    TRACE("URLName = %s\n", debugstr_w(This->URLName));
-
+    *ret = mon;
     return S_OK;
 }
 
 HRESULT StdURLMoniker_Construct(IUnknown *outer, void **ppv)
 {
+    URLMoniker *mon;
+    HRESULT hres;
+
     TRACE("(%p %p)\n", outer, ppv);
 
-    *ppv = alloc_moniker();
-    return *ppv ? S_OK : E_OUTOFMEMORY;
+    hres = create_moniker(NULL, &mon);
+    if(FAILED(hres))
+        return hres;
+
+    *ppv = &mon->IMoniker_iface;
+    return S_OK;
 }
 
 /***********************************************************************
@@ -573,9 +573,9 @@ HRESULT StdURLMoniker_Construct(IUnknown *outer, void **ppv)
  */
 HRESULT WINAPI CreateURLMonikerEx(IMoniker *pmkContext, LPCWSTR szURL, IMoniker **ppmk, DWORD dwFlags)
 {
+    IUri *uri, *base_uri = NULL;
     URLMoniker *obj;
     HRESULT hres;
-    LPOLESTR lefturl = NULL;
 
     TRACE("(%p, %s, %p, %08x)\n", pmkContext, debugstr_w(szURL), ppmk, dwFlags);
 
@@ -585,28 +585,37 @@ HRESULT WINAPI CreateURLMonikerEx(IMoniker *pmkContext, LPCWSTR szURL, IMoniker
     if (!szURL || !ppmk)
         return E_INVALIDARG;
 
-    if (dwFlags & URL_MK_UNIFORM) FIXME("ignoring flag URL_MK_UNIFORM\n");
-
-    if(!(obj = alloc_moniker()))
-	return E_OUTOFMEMORY;
+    if(dwFlags != URL_MK_LEGACY)
+        FIXME("Unsupported flags %x\n", dwFlags);
 
     if(pmkContext) {
-        IBindCtx* bind;
-        DWORD dwMksys = 0;
-        IMoniker_IsSystemMoniker(pmkContext, &dwMksys);
-        if(dwMksys == MKSYS_URLMONIKER && SUCCEEDED(CreateBindCtx(0, &bind))) {
-            IMoniker_GetDisplayName(pmkContext, bind, NULL, &lefturl);
-            TRACE("lefturl = %s\n", debugstr_w(lefturl));
-            IBindCtx_Release(bind);
+        IUriContainer *uri_container;
+
+        hres = IMoniker_QueryInterface(pmkContext, &IID_IUriContainer, (void**)&uri_container);
+        if(SUCCEEDED(hres)) {
+            hres = IUriContainer_GetIUri(uri_container, &base_uri);
+            IUriContainer_Release(uri_container);
+            if(FAILED(hres))
+                return hres;
         }
     }
-        
-    hres = URLMoniker_Init(obj, lefturl, szURL);
-    CoTaskMemFree(lefturl);
-    if(SUCCEEDED(hres))
-        hres = URLMoniker_QueryInterface(&obj->IMoniker_iface, &IID_IMoniker, (void**)ppmk);
-    IMoniker_Release(&obj->IMoniker_iface);
-    return hres;
+
+    if(base_uri) {
+        hres = CoInternetCombineUrlEx(base_uri, szURL, URL_FILE_USE_PATHURL, &uri, 0);
+        IUri_Release(base_uri);
+    }else {
+        hres = CreateUri(szURL, Uri_CREATE_FILE_USE_DOS_PATH|Uri_CREATE_ALLOW_RELATIVE|Uri_CREATE_ALLOW_IMPLICIT_FILE_SCHEME, 0, &uri);
+    }
+    if(FAILED(hres))
+        return hres;
+
+    hres = create_moniker(uri, &obj);
+    IUri_Release(uri);
+    if(FAILED(hres))
+	return hres;
+
+    *ppmk = &obj->IMoniker_iface;
+    return S_OK;
 }
 
 /**********************************************************************




More information about the wine-cvs mailing list