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